diff --git a/.cirrus.tasks.yml b/.cirrus.tasks.yml index 8cbadc5849bb2..e9e1d3a10b2b4 100644 --- a/.cirrus.tasks.yml +++ b/.cirrus.tasks.yml @@ -126,13 +126,13 @@ task: task: - name: FreeBSD - 13 - Meson + name: FreeBSD - Meson env: CPUS: 4 BUILD_JOBS: 4 TEST_JOBS: 8 - IMAGE_FAMILY: pg-ci-freebsd-13 + IMAGE_FAMILY: pg-ci-freebsd DISK_SIZE: 50 CCACHE_DIR: /tmp/ccache_dir @@ -777,14 +777,11 @@ task: # - 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 diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs index 3538e0cdc757c..7e1c817416c9c 100644 --- a/.git-blame-ignore-revs +++ b/.git-blame-ignore-revs @@ -14,6 +14,9 @@ # # $ git log --pretty=format:"%H # %cd%n# %s" $PGINDENTGITHASH -1 --date=iso +71da1f03f2f0ff18ed11e4ba6b07b6bd56705a5d # 2025-04-22 11:40:24 +0200 +# Run pgperltidy + c739ae9e288c095cfe1b91ce27a2f2c075ed5da4 # 2024-08-26 16:16:09 -0700 # Fix identation. diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index faa87493bf62c..63a3ca4eeb531 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,6 +1,5 @@ # https://docs.github.com/en/github/creating-cloning-and-archiving-repositories/about-code-owners # Order is important; the last matching pattern takes the most precedence. -* @dutow @dAdAbird -/contrib/pg_tde/documentation/ @nastena1606 +/contrib/pg_tde/documentation/ @nastena1606 @Andriciuc /.github/ @artemgavrilov diff --git a/.github/codecov.yml b/.github/codecov.yml new file mode 100644 index 0000000000000..e124140442877 --- /dev/null +++ b/.github/codecov.yml @@ -0,0 +1,45 @@ +codecov: + strict_yaml_branch: TDE_REL_17_STABLE +fixes: + - "src/::contrib/pg_tde/src/" # move path for codecov file mappings e.g., "src/" => "contrib/pg_tde/src/" +coverage: + status: + project: + default: + target: 90% + threshold: 1% + base: auto +comment: + layout: "header, diff, components" +component_management: + default_rules: + statuses: + - type: project + target: auto + branches: + - "TDE_REL_17_STABLE" + individual_components: + - component_id: access + paths: + - contrib/pg_tde/src/access/** + - component_id: catalog + paths: + - contrib/pg_tde/src/catalog/** + - component_id: common + paths: + - contrib/pg_tde/src/common/** + - component_id: encryption + paths: + - contrib/pg_tde/src/encryption/** + - component_id: keyring + paths: + - contrib/pg_tde/src/keyring/** + - component_id: src + paths: + - contrib/pg_tde/src/*.c + - component_id: smgr + paths: + - contrib/pg_tde/src/smgr/** + - component_id: transam + paths: + - contrib/pg_tde/src/transam/** diff --git a/.github/workflows/psp-reusable.yml b/.github/workflows/build-and-test.yml similarity index 52% rename from .github/workflows/psp-reusable.yml rename to .github/workflows/build-and-test.yml index 48293fbe21324..0d64496bb05e8 100644 --- a/.github/workflows/psp-reusable.yml +++ b/.github/workflows/build-and-test.yml @@ -1,10 +1,13 @@ -name: PSP-Reusable +name: Reusable build and test on: workflow_call: inputs: os: type: string required: true + compiler: + type: string + required: true build_type: type: string required: true @@ -13,11 +16,12 @@ on: required: true env: - artifact_name: build-${{ inputs.os }}-${{ inputs.build_script }}-${{ inputs.build_type }} + artifact_name: build-${{ inputs.os }}-${{ inputs.compiler }}-${{ inputs.build_script }}-${{ inputs.build_type }} + CC: ${{ inputs.compiler }} jobs: build: - name: Build PSP + name: Build runs-on: ${{ inputs.os }} steps: - name: Clone repository @@ -27,13 +31,19 @@ jobs: submodules: recursive ref: ${{ github.ref }} + # KMIP server don't support Python 3.12 for now: https://github.com/OpenKMIP/PyKMIP/pull/707 + - name: Downgrade python to 3.11 + uses: actions/setup-python@v5 + with: + python-version: 3.11 + - name: Install dependencies run: src/ci_scripts/ubuntu-deps.sh - name: Build postgres run: src/ci_scripts/${{ inputs.build_script }}-build.sh ${{ inputs.build_type }} - - name: 'Tar files' + - name: Archive pginst to artifact tar file run: tar -czf artifacts.tar src pginst - name: Upload build artifacts @@ -46,7 +56,7 @@ jobs: retention-days: 1 test: - name: Test PSP + name: Test runs-on: ${{ inputs.os }} needs: build @@ -57,33 +67,45 @@ jobs: name: ${{ env.artifact_name }} path: . - - name: 'Untar files' + - name: Extract artifact file run: tar -xzf artifacts.tar + - name: Downgrade python to 3.11 + uses: actions/setup-python@v5 + with: + python-version: 3.11 + - name: Install dependencies run: src/ci_scripts/ubuntu-deps.sh - + - name: Setup kmip and vault run: src/ci_scripts/setup-keyring-servers.sh - name: Test postgres - run: src/ci_scripts/${{ inputs.build_script }}-test.sh + run: src/ci_scripts/${{ inputs.build_script }}-test.sh all - name: Report on test fail uses: actions/upload-artifact@v4 if: ${{ failure() }} with: - name: testlog-ubuntu-${{ inputs.ubuntu_version }}.04-meson-${{ inputs.build_type }} + name: log-test-${{ inputs.os }}-${{ inputs.compiler }}-${{ inputs.build_script }}-${{ inputs.build_type }} path: | - src/build/testrun/ - src/contrib/*/t/ - src/contrib/*/results + src/build/testrun + src/contrib/*/log src/contrib/*/regression.diffs src/contrib/*/regression.out + src/contrib/*/results + src/contrib/*/tmp_check + src/contrib/*/t/results + src/src/test/*/log + src/src/test/*/regression.diffs + src/src/test/*/regression.out + src/src/test/*/results + src/src/test/*/tmp_check retention-days: 3 - test_tde: - name: Test PSP with TDE + test-default-tde: + name: Test with TDE as default access method runs-on: ${{ inputs.os }} if: inputs.build_script == 'make' needs: build @@ -95,27 +117,40 @@ jobs: name: ${{ env.artifact_name }} path: . - - name: 'Untar files' + - name: Extract artifact file run: tar -xzf artifacts.tar + # KMIP server don't support Python 3.12 for now: https://github.com/OpenKMIP/PyKMIP/pull/707 + - name: Downgrade python to 3.11 + uses: actions/setup-python@v5 + with: + python-version: 3.11 + - name: Install dependencies - run: src/ci_scripts/ubuntu-deps.sh - + run: src/ci_scripts/ubuntu-deps.sh + - name: Setup kmip and vault run: src/ci_scripts/setup-keyring-servers.sh - - - name: Test postgres with TDE - run: src/ci_scripts/${{ inputs.build_script }}-test-tde.sh --continue + + - name: Test postgres with TDE as default access method + run: src/ci_scripts/${{ inputs.build_script }}-test-global-tde.sh --continue - name: Report on test fail uses: actions/upload-artifact@v4 if: ${{ failure() }} with: - name: testlog-tde-${{ inputs.os }}-${{ inputs.build_script }}-${{ inputs.build_type }} + name: log-test-global-tde-${{ inputs.os }}-${{ inputs.compiler }}-${{ inputs.build_script }}-${{ inputs.build_type }} path: | - src/build/testrun/ - src/contrib/*/t/ - src/contrib/*/results + src/build/testrun + src/contrib/*/log src/contrib/*/regression.diffs src/contrib/*/regression.out + src/contrib/*/results + src/contrib/*/tmp_check + src/contrib/*/t/results + src/src/test/*/log + src/src/test/*/regression.diffs + src/src/test/*/regression.out + src/src/test/*/results + src/src/test/*/tmp_check retention-days: 3 diff --git a/.github/workflows/codechecker.yml b/.github/workflows/codechecker.yml new file mode 100644 index 0000000000000..7d1ca069614f8 --- /dev/null +++ b/.github/workflows/codechecker.yml @@ -0,0 +1,57 @@ +name: CodeChecker +on: + push: + branches: + - TDE_REL_17_STABLE + paths-ignore: + - contrib/pg_tde/documentation/** + +env: + CC: clang + LD: clang + +jobs: + run: + name: Run + runs-on: ubuntu-24.04 + steps: + - name: Clone repository + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install dependencies + run: ci_scripts/ubuntu-deps.sh + + - name: Install CodeChecker + run: | + ## CodeChecker version should match version installed on server side. + pip3 install codechecker==6.26.1 + + - name: Configure CodeChecker + run: | + echo "::add-mask::${{ secrets.CODECHECKER_ENDPOINT }}" + echo "::add-mask::${{ secrets.CODECHECKER_ENGINEERING_CREDENTIALS }}" + cat > ~/.codechecker.passwords.json << EOL + { + "client_autologin": true, + "credentials": { + "${{secrets.CODECHECKER_ENDPOINT}}": "${{secrets.CODECHECKER_ENGINEERING_CREDENTIALS}}" + } + } + EOL + + - name: Set cc alternative + run: | + sudo update-alternatives --install /usr/bin/cc cc /usr/bin/clang 100 + sudo update-alternatives --set cc /usr/bin/clang + + - name: Build postgres + run: ci_scripts/meson-build.sh debug + + - name: Run CodeChecker + run: CodeChecker analyze build/compile_commands.json --enable sensitive --output ./reports --file ${{ github.workspace }}/contrib/pg_tde + + - name: Upload CodeChecker reports + run: | + CodeChecker store ./reports --url=https://codechecker.percona.com/pg_tde --name=${GITHUB_REF_NAME} --tag=${GITHUB_SHA} --force diff --git a/.github/workflows/coverage.yml b/.github/workflows/coverage.yml new file mode 100644 index 0000000000000..f22e97afc0b8a --- /dev/null +++ b/.github/workflows/coverage.yml @@ -0,0 +1,75 @@ +name: Code coverage +on: + pull_request: + paths-ignore: + - contrib/pg_tde/documentation/** + push: + branches: + - TDE_REL_17_STABLE + paths-ignore: + - contrib/pg_tde/documentation/** + +env: + # Avoid failures on slow recovery + PGCTLTIMEOUT: 120 + PG_TEST_TIMEOUT_DEFAULT: 300 + +jobs: + collect: + name: Collect and upload + runs-on: ubuntu-24.04 + steps: + - name: Clone repository + uses: actions/checkout@v4 + with: + submodules: recursive + + # KMIP server doesn't support Python 3.12 for now: https://github.com/OpenKMIP/PyKMIP/pull/707 + - name: Downgrade python to 3.11 + uses: actions/setup-python@v5 + with: + python-version: 3.11 + + - name: Install dependencies + run: ci_scripts/ubuntu-deps.sh + + - name: Build postgres + run: ci_scripts/make-build.sh debug --enable-coverage + + - name: Setup kmip and vault + run: ci_scripts/setup-keyring-servers.sh + + - name: Test postgres with TDE to generate coverage + run: ci_scripts/make-test.sh tde + + - name: Collect coverage data + run: find . -type f -name "*.c" ! -path '*libkmip*' | xargs -t gcov -abcfu + working-directory: contrib/pg_tde + + - name: Upload coverage data to codecov.io + uses: codecov/codecov-action@v5 + with: + verbose: true + token: ${{ secrets.CODECOV_TOKEN }} + working-directory: contrib/pg_tde + files: "*.c.gcov" + + - name: Report on test fail + uses: actions/upload-artifact@v4 + if: ${{ failure() }} + with: + name: coverage-testlog-tde + path: | + build/testrun + contrib/*/log + contrib/*/regression.diffs + contrib/*/regression.out + contrib/*/results + contrib/*/tmp_check + contrib/*/t/results + src/test/*/log + src/test/*/regression.diffs + src/test/*/regression.out + src/test/*/results + src/test/*/tmp_check + retention-days: 3 diff --git a/.github/workflows/matrix.yml b/.github/workflows/matrix.yml new file mode 100644 index 0000000000000..913ef6eb7453c --- /dev/null +++ b/.github/workflows/matrix.yml @@ -0,0 +1,67 @@ +name: Build and Test +on: + pull_request: + paths-ignore: + - contrib/pg_tde/documentation/** + push: + branches: + - TDE_REL_17_STABLE + - release-[0-9]+.[0-9]+* + paths-ignore: + - contrib/pg_tde/documentation/** + workflow_dispatch: + +jobs: + main: + name: Main matrix + strategy: + matrix: + os: [ubuntu-24.04] + compiler: [gcc, clang] + build_type: [debugoptimized] + build_script: [make, meson] + uses: ./.github/workflows/build-and-test.yml + with: + os: ${{ matrix.os }} + compiler: ${{ matrix.compiler }} + build_type: ${{ matrix.build_type }} + build_script: ${{ matrix.build_script }} + secrets: inherit + + arm: + name: ARM matrix + if: github.event_name != 'pull_request' + strategy: + matrix: + os: [ubuntu-24.04-arm] + compiler: [gcc, clang] + build_type: [debugoptimized] + build_script: [make, meson] + uses: ./.github/workflows/build-and-test.yml + with: + os: ${{ matrix.os }} + compiler: ${{ matrix.compiler }} + build_type: ${{ matrix.build_type }} + build_script: ${{ matrix.build_script }} + secrets: inherit + + slack-notification: + if: failure() && github.event_name == 'push' + needs: [ main, arm ] + name: Slack Notification + runs-on: ubuntu-24.04 + steps: + - name: Notify + uses: slackapi/slack-github-action@v2.1.0 + with: + webhook: ${{ secrets.SLACK_WEBHOOK_URL }} + webhook-type: incoming-webhook + payload: | + blocks: + - type: "section" + text: + type: "mrkdwn" + text: "Workflow *${{ github.workflow }}* failed on branch *${{ github.ref_name }}*\n + Commit: <${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}|${{ github.sha }}>\n + \n + <${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}|View logs>" diff --git a/.github/workflows/pgindent.yml b/.github/workflows/pgindent.yml index 211d255f07042..73f6bee116324 100644 --- a/.github/workflows/pgindent.yml +++ b/.github/workflows/pgindent.yml @@ -1,21 +1,18 @@ -name: PgIndent +name: Format on: pull_request: + paths-ignore: + - contrib/pg_tde/documentation/** workflow_dispatch: -defaults: - run: - working-directory: ./src - jobs: check: name: Check - runs-on: ubuntu-22.04 + runs-on: ubuntu-24.04 steps: - name: Clone repository uses: actions/checkout@v4 with: - path: 'src' submodules: recursive - name: Install dependencies @@ -26,6 +23,9 @@ jobs: - name: Update typedefs run: ci_scripts/dump-typedefs.sh - + - name: Run pgindent run: ci_scripts/run-pgindent.sh --check --diff + + - name: Run pgperltidy + run: ci_scripts/run-pgperltidy.sh --assert-tidy --standard-error-output diff --git a/.github/workflows/psp-matrix.yml b/.github/workflows/psp-matrix.yml deleted file mode 100644 index 64a6c6babd5d1..0000000000000 --- a/.github/workflows/psp-matrix.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: PSP -on: - pull_request: - workflow_dispatch: - -jobs: - build: - name: PSP - strategy: - matrix: - os: ['ubuntu-22.04'] - build_type: [debug,debugoptimized] - build_script: [make, meson] - uses: ./.github/workflows/psp-reusable.yml - with: - os: ${{ matrix.os }} - build_type: ${{ matrix.build_type }} - build_script: ${{ matrix.build_script }} - secrets: inherit diff --git a/.github/workflows/sanitizers.yml b/.github/workflows/sanitizers.yml new file mode 100644 index 0000000000000..462de6fa0fb67 --- /dev/null +++ b/.github/workflows/sanitizers.yml @@ -0,0 +1,75 @@ +name: Sanitizers +on: + pull_request: + paths-ignore: + - contrib/pg_tde/documentation/** + push: + branches: + - TDE_REL_17_STABLE + paths-ignore: + - contrib/pg_tde/documentation/** + +env: + CC: clang + LD: clang + UBSAN_OPTIONS: log_path=${{ github.workspace }}/sanitize.log print_suppressions=0 print_stacktrace=1 print_summary=1 halt_on_error=1 + ASAN_OPTIONS: log_path=${{ github.workspace }}/sanitize.log print_suppressions=0 abort_on_error=1 + LSAN_OPTIONS: log_path=${{ github.workspace }}/sanitize.log print_suppressions=0 suppressions=${{ github.workspace }}/ci_scripts/suppressions/lsan.supp + ASAN_SYMBOLIZER_PATH: /usr/bin/llvm-symbolizer-14 + EXTRA_REGRESS_OPTS: "--temp-config=${{ github.workspace }}/test_postgresql.conf" + # Avoid failures on slow recovery + PGCTLTIMEOUT: 120 + PG_TEST_TIMEOUT_DEFAULT: 300 + +jobs: + run: + name: Run + runs-on: ubuntu-22.04 + steps: + - name: Clone repository + uses: actions/checkout@v4 + with: + submodules: recursive + + - name: Install dependencies + run: ci_scripts/ubuntu-deps.sh + + - name: Build postgres + run: ci_scripts/make-build.sh sanitize + + - name: Setup kmip and vault + run: ci_scripts/setup-keyring-servers.sh + + - name: Configure test postgres + run: echo 'max_stack_depth=8MB' > test_postgresql.conf + + - name: Run tests pg_tde tests + run: ci_scripts/make-test.sh tde + + - name: Run PG regression tests + run: ci_scripts/make-test.sh server + + - name: Print sanitize logs + if: ${{ !cancelled() }} + run: cat sanitize.log.* + + - name: Report on test fail + uses: actions/upload-artifact@v4 + if: ${{ failure() }} + with: + name: sanitizers-testlog + path: | + build/testrun + contrib/**/log + contrib/**/regression.diffs + contrib/**/regression.out + contrib/**/results + contrib/**/tmp_check + contrib/**/t/results + src/test/**/log + src/test/**/regression.diffs + src/test/**/regression.out + src/test/**/results + src/test/**/tmp_check + sanitize.log.* + retention-days: 3 diff --git a/.github/workflows/stormweaver.yml b/.github/workflows/stormweaver.yml new file mode 100644 index 0000000000000..f66ca0b3a6c39 --- /dev/null +++ b/.github/workflows/stormweaver.yml @@ -0,0 +1,72 @@ +name: Stormweaver +on: + pull_request: + paths-ignore: + - contrib/pg_tde/documentation/** + push: + branches: + - TDE_REL_17_STABLE + - release-[0-9]+.[0-9]+* + paths-ignore: + - contrib/pg_tde/documentation/** + workflow_dispatch: + +jobs: + run: + name: Run + runs-on: self-hosted + steps: + + - name: Clone stormweaver + uses: actions/checkout@master + with: + repository: 'percona-lab/stormweaver' + path: 'stormweaver' + submodules: recursive + + - name: Update path + run: | + echo "/home/ghrunner/.local/bin" >> "$GITHUB_PATH" + + - name: Install/build dependencies + run: | + conan install . --build=missing --settings=build_type=Release + working-directory: stormweaver + + - name: Build stormweaver + run: | + conan build . --settings=build_type=Release + working-directory: stormweaver + + - name: Clone repository + uses: actions/checkout@v4 + with: + submodules: recursive + path: 'postgres' + + - name: Build postgres + run: | + ci_scripts/meson-build.sh debugoptimized + working-directory: postgres + + - name: Run Stormweaver + run: bin/stormweaver scenarios/basic.lua -i ../pginst + working-directory: stormweaver + + - name: Upload logs on test fail + uses: actions/upload-artifact@v4 + if: ${{ failure() }} + with: + name: stormweaver-logs + path: | + stormweaver/logs/* + retention-days: 3 + + - name: Upload datadir on test fail + uses: actions/upload-artifact@v4 + if: ${{ failure() }} + with: + name: stormweaver-datadirs + path: | + stormweaver/datadirs/* + retention-days: 3 diff --git a/COPYRIGHT b/COPYRIGHT index 0d34b73f00ad5..4ce1725ec2cdd 100644 --- a/COPYRIGHT +++ b/COPYRIGHT @@ -1,9 +1,16 @@ -Percona server for PostgreSQL -(formerly known as Postgres, then as Postgres95) +Percona Server for PostgreSQL - License +(also known as Postgres, formerly known as Postgres95) -Portions Copyright (c) 2024-2025, Percona LLC and/or its affiliates +This software includes portions copyrighted or made available by: +• Percona, LLC and/or its affiliates (collectively, "Percona") +• PostgreSQL Global Development Group ("PostgreSQL") +• The Regents of the University of California -Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group +A. PostgreSQL and University of California Portions. Those portions of this Software +copyrighted or made available by PostgreSQL or The Regents of the University of +California are subject to the following: + +Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group Portions Copyright (c) 1994, The Regents of the University of California @@ -12,14 +19,34 @@ documentation for any purpose, without fee, and without a written agreement is hereby granted, provided that the above copyright notice and this paragraph and the following two paragraphs appear in all copies. -IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR -DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING -LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS -DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES, -INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY -AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS -ON AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO -PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. +IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR +DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING +LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, +EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGE. + +THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, +AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO PROVIDE MAINTENANCE, +SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + +B. Percona Portions. Those portions of this Software copyrighted or made available +by Percona are subject both to the disclaimers in part A of this license and the following: + +Copyright (c) 2024-2025, Percona LLC and/or its affiliates + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose, without fee, and without a written agreement +is hereby granted, provided that the above copyright notice and this +paragraph and the following two paragraphs appear in all copies. + +IN NO EVENT SHALL PERCONA BE LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL, +INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING LOST PROFITS, ARISING OUT OF THE +USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF PERCONA HAS BEEN ADVISED +OF THE POSSIBILITY OF SUCH DAMAGE. + +PERCONA SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND PERCONA HAS NO +OBLIGATIONS TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. diff --git a/README.md b/README.md index 835ece8089a18..afb02c0f108b2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,5 @@ +### Code coverage for [pg_tde](https://github.com/percona/postgres/tree/TDE_REL_17_STABLE/contrib/pg_tde): [![codecov](https://codecov.io/github/percona/postgres/graph/badge.svg?token=Wow78BMYdP)](https://codecov.io/github/percona/postgres) + Percona Server for PostgreSQL ============================= @@ -33,4 +35,3 @@ Specific - include as much detail as possible, such as which version, which envi Unique - do not duplicate existing tickets Scoped to a single issue - only one issue per report - diff --git a/ci_scripts/backup/pg_basebackup_test.sh b/ci_scripts/backup/pg_basebackup_test.sh index d9424be77c24a..23b2ca28231dc 100755 --- a/ci_scripts/backup/pg_basebackup_test.sh +++ b/ci_scripts/backup/pg_basebackup_test.sh @@ -1,4 +1,5 @@ #!/bin/bash + set -e # Exit on errors set -u # Treat unset variables as errors set -o pipefail # Stop on pipeline errors @@ -104,8 +105,8 @@ setup_tde_heap(){ sudo -u "$PG_USER" psql -p $PG_PORT -c "DROP DATABASE IF EXISTS $DB_NAME;" sudo -u "$PG_USER" psql -p $PG_PORT -c "CREATE DATABASE $DB_NAME;" sudo -u "$PG_USER" psql -d "$DB_NAME" -p "$PG_PORT" -c "CREATE EXTENSION IF NOT EXISTS pg_tde;" - sudo -u "$PG_USER" psql -d "$DB_NAME" -p "$PG_PORT" -c "SELECT pg_tde_add_key_provider_file('file-vault','$KEYLOCATION');" - sudo -u "$PG_USER" psql -d "$DB_NAME" -p "$PG_PORT" -c "SELECT pg_tde_set_principal_key('test-db-master-key','file-vault');" + sudo -u "$PG_USER" psql -d "$DB_NAME" -p "$PG_PORT" -c "SELECT pg_tde_add_database_key_provider_file('file-vault','$KEYLOCATION');" + sudo -u "$PG_USER" psql -d "$DB_NAME" -p "$PG_PORT" -c "SELECT pg_tde_set_key_using_database_key_provider('test-db-master-key','file-vault');" sudo -u "$PG_USER" psql -p $PG_PORT -c "ALTER DATABASE $DB_NAME SET default_table_access_method='tde_heap';" sudo -u "$PG_USER" psql -p $PG_PORT -c "SELECT pg_reload_conf();" } diff --git a/ci_scripts/configure-tde-server.sh b/ci_scripts/configure-global-tde.sh similarity index 90% rename from ci_scripts/configure-tde-server.sh rename to ci_scripts/configure-global-tde.sh index a5dfedd4c42bc..4d4b0648903c1 100644 --- a/ci_scripts/configure-tde-server.sh +++ b/ci_scripts/configure-global-tde.sh @@ -1,14 +1,15 @@ #!/bin/bash -set -e -# This script is used to configure a TDE server for testing purposes. -export TDE_MODE=1 +set -e SCRIPT_DIR="$(cd -- "$(dirname "$0")" >/dev/null 2>&1; pwd -P)" INSTALL_DIR="$SCRIPT_DIR/../../pginst" +source $SCRIPT_DIR/env.sh cd "$SCRIPT_DIR/.." +source "$SCRIPT_DIR/env.sh" +export TDE_MODE=1 export PATH=$INSTALL_DIR/bin:$PATH export DATA_DIR=$INSTALL_DIR/data export PGDATA="${1:-$DATA_DIR}" diff --git a/ci_scripts/dump-typedefs.sh b/ci_scripts/dump-typedefs.sh index 181beac31c07c..eabe70815d9c8 100755 --- a/ci_scripts/dump-typedefs.sh +++ b/ci_scripts/dump-typedefs.sh @@ -1,33 +1,16 @@ #!/bin/bash -SCRIPT_DIR="$(cd -- "$(dirname "$0")" >/dev/null 2>&1; pwd -P)" -cd "$SCRIPT_DIR/../" +set -e -if ! test -f src/backend/postgres; then - echo "src/backend/postgres doesn't exists, run make-build.sh first in debug mode" - exit 1 -fi +SCRIPT_DIR="$(cd -- "$(dirname "$0")" >/dev/null 2>&1; pwd -P)" +cd "$SCRIPT_DIR/.." if ! test -f contrib/pg_tde/pg_tde.so; then echo "contrib/pg_tde/pg_tde.so doesn't exists, run make-build.sh first in debug mode" exit 1 fi -objdump -W src/backend/postgres |\ - egrep -A3 DW_TAG_typedef |\ - perl -e ' while (<>) { chomp; @flds = split;next unless (1 < @flds);\ - next if $flds[0] ne "DW_AT_name" && $flds[1] ne "DW_AT_name";\ - next if $flds[-1] =~ /^DW_FORM_str/;\ - print $flds[-1],"\n"; }' |\ - sort | uniq > percona.typedefs - -objdump -W contrib/pg_tde/pg_tde.so |\ - egrep -A3 DW_TAG_typedef |\ - perl -e ' while (<>) { chomp; @flds = split;next unless (1 < @flds);\ - next if $flds[0] ne "DW_AT_name" && $flds[1] ne "DW_AT_name";\ - next if $flds[-1] =~ /^DW_FORM_str/;\ - print $flds[-1],"\n"; }' |\ - sort | uniq > tde.typedefs +src/tools/find_typedef contrib/pg_tde > pg_tde.typedefs # Combine with original typedefs -cat percona.typedefs tde.typedefs src/tools/pgindent/typedefs.list | sort | uniq > combined.typedefs +cat pg_tde.typedefs src/tools/pgindent/typedefs.list | sort -u > combined.typedefs diff --git a/ci_scripts/env.sh b/ci_scripts/env.sh new file mode 100644 index 0000000000000..364c3e77a3e3b --- /dev/null +++ b/ci_scripts/env.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +export PERCONA_SERVER_VERSION=17.6.1 diff --git a/ci_scripts/make-build.sh b/ci_scripts/make-build.sh index 48e015f85af8b..64f3d6dafac8a 100755 --- a/ci_scripts/make-build.sh +++ b/ci_scripts/make-build.sh @@ -1,16 +1,47 @@ #!/bin/bash -export TDE_MODE=1 +set -e + +ARGS= + +for arg in "$@" +do + case "$arg" in + --enable-coverage) + ARGS+=" --enable-coverage" + ;; + esac +done SCRIPT_DIR="$(cd -- "$(dirname "$0")" >/dev/null 2>&1; pwd -P)" INSTALL_DIR="$SCRIPT_DIR/../../pginst" +source "$SCRIPT_DIR/env.sh" cd "$SCRIPT_DIR/.." -if [ "$1" = "debugoptimized" ]; then - export CFLAGS="-O2" - export CXXFLAGS="-O2" -fi +case "$1" in + debug) + echo "Building with debug option" + ARGS+=" --enable-cassert" + ;; + + debugoptimized) + echo "Building with debugoptimized option" + export CFLAGS="-O2" + ARGS+=" --enable-cassert" + ;; + + sanitize) + echo "Building with sanitize option" + export CFLAGS="-fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer -fno-inline-functions" + ;; + + *) + echo "Unknown build type: $1" + echo "Please use one of the following: debug, debugoptimized, sanitize" + exit 1 + ;; +esac -./configure --enable-debug --enable-cassert --enable-tap-tests --prefix=$INSTALL_DIR -make install-world -j +./configure --prefix="$INSTALL_DIR" --enable-debug --enable-tap-tests $ARGS +make install-world -j -s diff --git a/ci_scripts/make-test-tde.sh b/ci_scripts/make-test-global-tde.sh similarity index 54% rename from ci_scripts/make-test-tde.sh rename to ci_scripts/make-test-global-tde.sh index 161feff01b99a..ef090a7ba7481 100755 --- a/ci_scripts/make-test-tde.sh +++ b/ci_scripts/make-test-global-tde.sh @@ -2,15 +2,18 @@ set -e -export TDE_MODE=1 - -SCRIPT_DIR="$(cd -- "$(dirname "$0")" >/dev/null 2>&1; pwd -P)" -source $SCRIPT_DIR/configure-tde-server.sh - ADD_FLAGS= -if [ "$1" = "--continue" ]; then - ADD_FLAGS="-k" -fi +for arg in "$@" +do + case "$arg" in + --continue) + ADD_FLAGS="-k" + shift;; + esac +done + +SCRIPT_DIR="$(cd -- "$(dirname "$0")" >/dev/null 2>&1; pwd -P)" +source "$SCRIPT_DIR/configure-global-tde.sh" EXTRA_REGRESS_OPTS="--extra-setup=$SCRIPT_DIR/tde_setup.sql" make -s installcheck-world $ADD_FLAGS diff --git a/ci_scripts/make-test.sh b/ci_scripts/make-test.sh index e16ef4a986948..2cf269fccaa64 100755 --- a/ci_scripts/make-test.sh +++ b/ci_scripts/make-test.sh @@ -1,10 +1,33 @@ #!/bin/bash -export TDE_MODE=1 +set -e -SCRIPT_DIR="$(cd -- "$(dirname "$0")" >/dev/null 2>&1 ; pwd -P)" -INSTALL_DIR="$SCRIPT_DIR/../../pginst" +SCRIPT_DIR="$(cd -- "$(dirname "$0")" >/dev/null 2>&1; pwd -P)" +source "$SCRIPT_DIR/env.sh" -cd "$SCRIPT_DIR/.." -make -s check-world +case "$1" in + server) + echo "Run server regression tests" + cd "$SCRIPT_DIR/.." + make -s check + ;; + + tde) + echo "Run tde tests" + cd "$SCRIPT_DIR/../contrib/pg_tde" + make -s check + ;; + + all) + echo "Run all tests" + cd "$SCRIPT_DIR/.." + make -s check-world + ;; + + *) + echo "Unknown test suite: $1" + echo "Please use one of the following: server, tde, all" + exit 1 + ;; +esac diff --git a/ci_scripts/meson-build.sh b/ci_scripts/meson-build.sh index c94b12421ab61..6cce676fabf32 100755 --- a/ci_scripts/meson-build.sh +++ b/ci_scripts/meson-build.sh @@ -1,8 +1,49 @@ #!/bin/bash +set -e + +ENABLE_COVERAGE= + +for arg in "$@" +do + case "$arg" in + --enable-coverage) + ENABLE_COVERAGE="-Db_coverage=true" + shift;; + esac +done + SCRIPT_DIR="$(cd -- "$(dirname "$0")" >/dev/null 2>&1; pwd -P)" +INSTALL_DIR="$SCRIPT_DIR/../../pginst" +source "$SCRIPT_DIR/env.sh" cd "$SCRIPT_DIR/.." -meson setup build --prefix `pwd`/../pginst --buildtype=$1 -Dcassert=true -Dtap_tests=enabled +BUILD_TYPE= + +case "$1" in + debug) + echo "Building with debug option" + BUILD_TYPE=$1 + ;; + + debugoptimized) + echo "Building with debugoptimized option" + BUILD_TYPE=$1 + ;; + + sanitize) + echo "Building with sanitize option" + export CFLAGS="-fsanitize=address -fsanitize=undefined -fno-omit-frame-pointer -fno-inline-functions" + BUILD_TYPE=debug + ;; + + *) + echo "Unknown build type: $1" + echo "Please use one of the following: debug, debugoptimized, sanitize" + exit 1 + ;; +esac + +meson setup build --prefix "$INSTALL_DIR" --buildtype="$BUILD_TYPE" -Dcassert=true -Dtap_tests=enabled $ENABLE_COVERAGE cd build && ninja && ninja install diff --git a/ci_scripts/meson-test-tde.sh b/ci_scripts/meson-test-global-tde.sh similarity index 100% rename from ci_scripts/meson-test-tde.sh rename to ci_scripts/meson-test-global-tde.sh diff --git a/ci_scripts/meson-test.sh b/ci_scripts/meson-test.sh index 5d0ad07e4ce48..c9de99dca05f4 100755 --- a/ci_scripts/meson-test.sh +++ b/ci_scripts/meson-test.sh @@ -1,7 +1,32 @@ #!/bin/bash +set -e + SCRIPT_DIR="$(cd -- "$(dirname "$0")" >/dev/null 2>&1; pwd -P)" +source "$SCRIPT_DIR/env.sh" cd "$SCRIPT_DIR/../build" -meson test + +case "$1" in + server) + echo "Run server regression tests" + meson test --suite setup --suite regress + ;; + + tde) + echo "Run tde tests" + meson test --suite setup --suite pg_tde + ;; + + all) + echo "Run all tests" + meson test + ;; + + *) + echo "Unknown test suite: $1" + echo "Please use one of the following: server, tde, all" + exit 1 + ;; +esac diff --git a/ci_scripts/run-pgindent.sh b/ci_scripts/run-pgindent.sh index 13964ffe35c5c..77617e558cb0c 100755 --- a/ci_scripts/run-pgindent.sh +++ b/ci_scripts/run-pgindent.sh @@ -1,5 +1,7 @@ #!/bin/bash +set -e + SCRIPT_DIR="$(cd -- "$(dirname "$0")" >/dev/null 2>&1; pwd -P)" INSTALL_DIR="$SCRIPT_DIR/../../pginst" cd "$SCRIPT_DIR/../" @@ -16,4 +18,9 @@ cd "$SCRIPT_DIR/.." export PATH=$SCRIPT_DIR/../src/tools/pgindent/:$INSTALL_DIR/bin/:$PATH -pgindent --typedefs=combined.typedefs "$@" . +# Check everything except pg_tde with the list in the repo +# TODO: Disabled due to incorrectly indented upsrteam as of 17.4 +#pgindent --typedefs=src/tools/pgindent/typedefs.list --excludes=<(echo "contrib/pg_tde") "$@" . + +# Check pg_tde with the fresh list extraxted from the object file +pgindent --typedefs=combined.typedefs "$@" contrib/pg_tde diff --git a/ci_scripts/run-pgperltidy.sh b/ci_scripts/run-pgperltidy.sh new file mode 100755 index 0000000000000..e7a84018129db --- /dev/null +++ b/ci_scripts/run-pgperltidy.sh @@ -0,0 +1,10 @@ +#!/bin/bash + +set -e + +SCRIPT_DIR="$(cd -- "$(dirname "$0")" >/dev/null 2>&1; pwd -P)" +cd "$SCRIPT_DIR/../" + +source src/tools/perlcheck/find_perl_files + +find_perl_files contrib/pg_tde/ | xargs perltidy "$@" --profile=src/tools/pgindent/perltidyrc diff --git a/ci_scripts/setup-keyring-servers.sh b/ci_scripts/setup-keyring-servers.sh index c59ee21970c0b..1906422e43912 100755 --- a/ci_scripts/setup-keyring-servers.sh +++ b/ci_scripts/setup-keyring-servers.sh @@ -1,12 +1,13 @@ #!/bin/bash +set -e + SCRIPT_DIR="$(cd -- "$(dirname "$0")" >/dev/null 2>&1; pwd -P)" cd /tmp wget https://raw.githubusercontent.com/OpenKMIP/PyKMIP/refs/heads/master/bin/create_certificates.py python3 create_certificates.py -cat client_certificate_jane_doe.pem >> client_key_jane_doe.pem mkdir policies cd policies @@ -14,13 +15,21 @@ wget https://raw.githubusercontent.com/OpenKMIP/PyKMIP/refs/heads/master/example cd .. echo $SCRIPT_DIR +rm -f /tmp/pykmip.db pykmip-server -f "$SCRIPT_DIR/../contrib/pg_tde/pykmip-server.conf" -l /tmp/kmip-server.log & -TV=$(mktemp) -{ exec >$TV; vault server -dev; } & +CLUSTER_INFO=$(mktemp) +vault server -dev -dev-tls -dev-cluster-json="$CLUSTER_INFO" > /dev/null & sleep 10 -export ROOT_TOKEN=$(cat $TV | grep "Root Token" | cut -d ":" -f 2 | xargs echo -n) -echo "export ROOT_TOKEN=$ROOT_TOKEN" +export VAULT_ROOT_TOKEN_FILE=$(mktemp) +jq -r .root_token "$CLUSTER_INFO" > "$VAULT_ROOT_TOKEN_FILE" +export VAULT_CACERT_FILE=$(jq -r .ca_cert_path "$CLUSTER_INFO") +rm "$CLUSTER_INFO" + +## We need to enable key/value version 1 engine for just for tests +vault secrets enable -ca-cert="$VAULT_CACERT_FILE" -path=kv-v1 -version=1 kv + if [ -v GITHUB_ACTIONS ]; then - echo "ROOT_TOKEN=$ROOT_TOKEN" >> $GITHUB_ENV + echo "VAULT_ROOT_TOKEN_FILE=$VAULT_ROOT_TOKEN_FILE" >> $GITHUB_ENV + echo "VAULT_CACERT_FILE=$VAULT_CACERT_FILE" >> $GITHUB_ENV fi diff --git a/ci_scripts/suppressions/lsan.supp b/ci_scripts/suppressions/lsan.supp new file mode 100644 index 0000000000000..0ec6d73cbca46 --- /dev/null +++ b/ci_scripts/suppressions/lsan.supp @@ -0,0 +1,66 @@ +# external submodule +leak:kmip.c + +# the parser of command line arguments of the backend +leak:save_ps_display_args + +# a bunch of not freed addrinfo sctructs, escaped values etc. +leak:initdb.c + +# shlibs loaded with dlsym() never gets dlclose'd +# TODO: needs an investigation as it is down the call stack +# of exec_simple_query->PortalRun +leak:internal_load_library + +# pg_config utility does not free configdata +leak:pg_config/pg_config.c + +# A psprintf() result assigned to the global var pgdata_opt +leak:bin/pg_ctl/pg_ctl.c + +# TODO: A couple of not freed char *. Whilst wit's trivially to fix +# meson complains with "maybe-uninitialized" on free() +leak:bin/psql/describe.c + +# options parsing during the regressions start +leak:regression_main + +# Static funcs in /bin/psql/startup.c are used +# during the start to parse options +leak:simple_action_list_append +leak:parse_psql_options + +# A bunch of parameters, options and identifiers are not being freed. +# +# TODO?: ReceiveArchiveStreamChunk->CreateBackupStreamer down in the +# callstak creates a streamer that is never freed. It's being called in a loop +# but it looks like it is not a repetitive action and rather happens once per +# receiving CopyData message from server. +# +# bin/pg_basebackup/pg_basebackup.c +leak:BaseBackup + +# `varname` doesn't get freed in the case of warning and `continue` in the loop +# +# bin/psql/common.c +leak:StoreQueryTuple + +# does not free a bunch of parsed flags +leak:bin/pg_waldump/pg_waldump.c + +#pg_dump +leak:getSchemaData +leak:dumpDumpableObject + +#pg_rewind +leak:decide_file_actions +leak:GenerateRecoveryConfig + +# Returns strdup'd string which never gets freed in frontend tools. Trying to +# free it leads to comiler complains that it discards 'const' qualifier. +leak:get_progname + +# A buch of not freed allocations in putVariableInt right before exit(1). And +# malloced `threads` ("Thread state") never gets released (allocated in main(), +# once, and not in loop). +leak:bin/pgbench/pgbench.c diff --git a/ci_scripts/tde_setup.sql b/ci_scripts/tde_setup.sql index 057119f86a5db..dd83fba37144d 100644 --- a/ci_scripts/tde_setup.sql +++ b/ci_scripts/tde_setup.sql @@ -1,4 +1,6 @@ -CREATE SCHEMA IF NOT EXISTS tde; -CREATE EXTENSION IF NOT EXISTS pg_tde SCHEMA tde; -SELECT tde.pg_tde_add_key_provider_file('reg_file-vault', '/tmp/pg_tde_test_keyring.per'); -SELECT tde.pg_tde_set_principal_key('test-db-principal-key', 'reg_file-vault'); +CREATE SCHEMA IF NOT EXISTS _pg_tde; +CREATE EXTENSION IF NOT EXISTS pg_tde SCHEMA _pg_tde; +\! rm -f '/tmp/pg_tde_test_keyring.per' +SELECT _pg_tde.pg_tde_add_database_key_provider_file('reg_file-vault', '/tmp/pg_tde_test_keyring.per'); +SELECT _pg_tde.pg_tde_create_key_using_database_key_provider('test-db-key', 'reg_file-vault'); +SELECT _pg_tde.pg_tde_set_key_using_database_key_provider('test-db-key', 'reg_file-vault'); diff --git a/ci_scripts/tde_setup_global.sql b/ci_scripts/tde_setup_global.sql index 5b4a9629a63e5..11b440f3e7c55 100644 --- a/ci_scripts/tde_setup_global.sql +++ b/ci_scripts/tde_setup_global.sql @@ -1,9 +1,10 @@ -CREATE SCHEMA tde; -CREATE EXTENSION IF NOT EXISTS pg_tde SCHEMA tde; +CREATE SCHEMA IF NOT EXISTS _pg_tde; +CREATE EXTENSION IF NOT EXISTS pg_tde SCHEMA _pg_tde; -SELECT tde.pg_tde_add_global_key_provider_file('reg_file-global', '/tmp/pg_tde_test_keyring.per'); -SELECT tde.pg_tde_set_server_principal_key('global-principal-key', 'reg_file-global'); +\! rm -f '/tmp/pg_tde_test_keyring.per' +SELECT _pg_tde.pg_tde_add_global_key_provider_file('reg_file-global', '/tmp/pg_tde_test_keyring.per'); +SELECT _pg_tde.pg_tde_create_key_using_global_key_provider('server-key', 'reg_file-global'); +SELECT _pg_tde.pg_tde_set_server_key_using_global_key_provider('server-key', 'reg_file-global'); ALTER SYSTEM SET pg_tde.wal_encrypt = on; ALTER SYSTEM SET default_table_access_method = 'tde_heap'; -ALTER SYSTEM SET search_path = "$user",public,tde; -- restart required diff --git a/ci_scripts/ubuntu-deps.sh b/ci_scripts/ubuntu-deps.sh index 5cb62fb993212..19696459d6c27 100755 --- a/ci_scripts/ubuntu-deps.sh +++ b/ci_scripts/ubuntu-deps.sh @@ -1,5 +1,7 @@ #!/bin/bash +set -e + DEPS=( # Setup wget @@ -25,10 +27,8 @@ DEPS=( libzstd-dev lz4 mawk - meson perl pkgconf - python3-dev systemtap-sdt-dev tcl-dev uuid-dev @@ -40,14 +40,17 @@ DEPS=( # Test libipc-run-perl # Test pg_tde - python3-pykmip libhttp-server-simple-perl + lcov + # Run pgperltidy + perltidy ) sudo apt-get update sudo apt-get install -y ${DEPS[@]} -bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" +sudo bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)" +pip3 install meson pykmip cryptography setuptools wheel # Vault wget -O - https://apt.releases.hashicorp.com/gpg | sudo tee /etc/apt/keyrings/hashicorp-archive-keyring.asc diff --git a/config/llvm.m4 b/config/llvm.m4 index f25efa25ed6a6..6ee9e55eefe38 100644 --- a/config/llvm.m4 +++ b/config/llvm.m4 @@ -4,7 +4,7 @@ # ----------------- # # Look for the LLVM installation, check that it's new enough, set the -# corresponding LLVM_{CFLAGS,CXXFLAGS,BINPATH} and LDFLAGS +# corresponding LLVM_{CFLAGS,CXXFLAGS,BINPATH,LIBS} # variables. Also verify that CLANG is available, to transform C # into bitcode. # @@ -55,7 +55,7 @@ AC_DEFUN([PGAC_LLVM_SUPPORT], for pgac_option in `$LLVM_CONFIG --link-static --ldflags`; do case $pgac_option in - -L*) LDFLAGS="$LDFLAGS $pgac_option";; + -L*) LLVM_LIBS="$LLVM_LIBS $pgac_option";; esac done diff --git a/configure b/configure index 2fd0f0c0f4457..88bbd1e727e00 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 17.4. +# Generated by GNU Autoconf 2.69 for PostgreSQL 17.6. # # Report bugs to . # @@ -582,8 +582,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='PostgreSQL' PACKAGE_TARNAME='postgresql' -PACKAGE_VERSION='17.4' -PACKAGE_STRING='PostgreSQL 17.4' +PACKAGE_VERSION='17.6' +PACKAGE_STRING='PostgreSQL 17.6' PACKAGE_BUGREPORT='pgsql-bugs@lists.postgresql.org' PACKAGE_URL='https://www.postgresql.org/' @@ -1453,7 +1453,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 17.4 to adapt to many kinds of systems. +\`configure' configures PostgreSQL 17.6 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1518,7 +1518,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of PostgreSQL 17.4:";; + short | recursive ) echo "Configuration of PostgreSQL 17.6:";; esac cat <<\_ACEOF @@ -1695,7 +1695,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -PostgreSQL configure 17.4 +PostgreSQL configure 17.6 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2448,7 +2448,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 17.4, which was +It was created by PostgreSQL $as_me 17.6, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -5225,7 +5225,7 @@ fi for pgac_option in `$LLVM_CONFIG --link-static --ldflags`; do case $pgac_option in - -L*) LDFLAGS="$LDFLAGS $pgac_option";; + -L*) LLVM_LIBS="$LLVM_LIBS $pgac_option";; esac done @@ -9067,12 +9067,12 @@ fi # Note the user could also set XML2_CFLAGS/XML2_LIBS directly for pgac_option in $XML2_CFLAGS; do case $pgac_option in - -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";; + -I*|-D*) INCLUDES="$INCLUDES $pgac_option";; esac done for pgac_option in $XML2_LIBS; do case $pgac_option in - -L*) LDFLAGS="$LDFLAGS $pgac_option";; + -L*) LIBDIRS="$LIBDIRS $pgac_option";; esac done fi @@ -9297,12 +9297,12 @@ fi # note that -llz4 will be added by AC_CHECK_LIB below. for pgac_option in $LZ4_CFLAGS; do case $pgac_option in - -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";; + -I*|-D*) INCLUDES="$INCLUDES $pgac_option";; esac done for pgac_option in $LZ4_LIBS; do case $pgac_option in - -L*) LDFLAGS="$LDFLAGS $pgac_option";; + -L*) LIBDIRS="$LIBDIRS $pgac_option";; esac done fi @@ -9438,12 +9438,12 @@ fi # note that -lzstd will be added by AC_CHECK_LIB below. for pgac_option in $ZSTD_CFLAGS; do case $pgac_option in - -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";; + -I*|-D*) INCLUDES="$INCLUDES $pgac_option";; esac done for pgac_option in $ZSTD_LIBS; do case $pgac_option in - -L*) LDFLAGS="$LDFLAGS $pgac_option";; + -L*) LIBDIRS="$LIBDIRS $pgac_option";; esac done fi @@ -15419,7 +15419,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 copy_file_range 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 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" @@ -15963,6 +15963,31 @@ cat >>confdefs.h <<_ACEOF #define HAVE_DECL_PWRITEV $ac_have_decl _ACEOF +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 + +ac_fn_c_check_decl "$LINENO" "memset_s" "ac_cv_have_decl_memset_s" "#define __STDC_WANT_LIB_EXT1__ 1 +#include +" +if test "x$ac_cv_have_decl_memset_s" = xyes; then : + ac_have_decl=1 +else + ac_have_decl=0 +fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_MEMSET_S $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 @@ -16378,7 +16403,7 @@ fi if test "$with_icu" = yes; then ac_save_CPPFLAGS=$CPPFLAGS - CPPFLAGS="$ICU_CFLAGS $CPPFLAGS" + CPPFLAGS="$CPPFLAGS $ICU_CFLAGS" # Verify we have ICU's header files ac_fn_c_check_header_mongrel "$LINENO" "unicode/ucol.h" "ac_cv_header_unicode_ucol_h" "$ac_includes_default" @@ -17529,7 +17554,7 @@ $as_echo "#define HAVE_GCC__ATOMIC_INT64_CAS 1" >>confdefs.h fi -# Check for x86 cpuid instruction +# Check for __get_cpuid() and __cpuid() { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __get_cpuid" >&5 $as_echo_n "checking for __get_cpuid... " >&6; } if ${pgac_cv__get_cpuid+:} false; then : @@ -17562,77 +17587,79 @@ if test x"$pgac_cv__get_cpuid" = x"yes"; then $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 : +else + # __cpuid() + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for __cpuid" >&5 +$as_echo_n "checking for __cpuid... " >&6; } +if ${pgac_cv__cpuid+:} false; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ -#include +#include int main () { unsigned int exx[4] = {0, 0, 0, 0}; - __get_cpuid_count(7, 0, &exx[0], &exx[1], &exx[2], &exx[3]); + __cpuid(exx, 1); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : - pgac_cv__get_cpuid_count="yes" + pgac_cv__cpuid="yes" else - pgac_cv__get_cpuid_count="no" + pgac_cv__cpuid="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 "$as_me:${as_lineno-$LINENO}: result: $pgac_cv__cpuid" >&5 +$as_echo "$pgac_cv__cpuid" >&6; } + if test x"$pgac_cv__cpuid" = x"yes"; then -$as_echo "#define HAVE__GET_CPUID_COUNT 1" >>confdefs.h +$as_echo "#define HAVE__CPUID 1" >>confdefs.h + fi 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 : +# Check for __get_cpuid_count() and __cpuidex() in a similar fashion. +{ $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 +#include int main () { unsigned int exx[4] = {0, 0, 0, 0}; - __get_cpuid(exx[0], 1); + __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__cpuid="yes" + pgac_cv__get_cpuid_count="yes" else - pgac_cv__cpuid="no" + 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__cpuid" >&5 -$as_echo "$pgac_cv__cpuid" >&6; } -if test x"$pgac_cv__cpuid" = x"yes"; then - -$as_echo "#define HAVE__CPUID 1" >>confdefs.h +{ $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 -fi +$as_echo "#define HAVE__GET_CPUID_COUNT 1" >>confdefs.h -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for __cpuidex" >&5 +else + # __cpuidex() + { $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 @@ -17644,7 +17671,7 @@ int main () { unsigned int exx[4] = {0, 0, 0, 0}; - __get_cpuidex(exx[0], 7, 0); + __cpuidex(exx, 7, 0); ; return 0; @@ -17660,10 +17687,11 @@ rm -f core conftest.err conftest.$ac_objext \ 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 + if test x"$pgac_cv__cpuidex" = x"yes"; then $as_echo "#define HAVE__CPUIDEX 1" >>confdefs.h + fi fi # Check for XSAVE intrinsics @@ -18815,7 +18843,7 @@ Use --without-tcl to disable building PL/Tcl." "$LINENO" 5 fi # now that we have TCL_INCLUDE_SPEC, we can check for ac_save_CPPFLAGS=$CPPFLAGS - CPPFLAGS="$TCL_INCLUDE_SPEC $CPPFLAGS" + CPPFLAGS="$CPPFLAGS $TCL_INCLUDE_SPEC" ac_fn_c_check_header_mongrel "$LINENO" "tcl.h" "ac_cv_header_tcl_h" "$ac_includes_default" if test "x$ac_cv_header_tcl_h" = xyes; then : @@ -18884,7 +18912,7 @@ fi # check for if test "$with_python" = yes; then ac_save_CPPFLAGS=$CPPFLAGS - CPPFLAGS="$python_includespec $CPPFLAGS" + CPPFLAGS="$CPPFLAGS $python_includespec" ac_fn_c_check_header_mongrel "$LINENO" "Python.h" "ac_cv_header_Python_h" "$ac_includes_default" if test "x$ac_cv_header_Python_h" = xyes; then : @@ -19985,7 +20013,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 17.4, which was +This file was extended by PostgreSQL $as_me 17.6, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -20056,7 +20084,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 17.4 +PostgreSQL config.status 17.6 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index 83cfa523ad01c..73db1ac301df7 100644 --- a/configure.ac +++ b/configure.ac @@ -17,7 +17,7 @@ dnl Read the Autoconf manual for details. dnl m4_pattern_forbid(^PGAC_)dnl to catch undefined macros -AC_INIT([PostgreSQL], [17.4], [pgsql-bugs@lists.postgresql.org], [], [https://www.postgresql.org/]) +AC_INIT([PostgreSQL], [17.6], [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 @@ -1057,12 +1057,12 @@ if test "$with_libxml" = yes ; then # Note the user could also set XML2_CFLAGS/XML2_LIBS directly for pgac_option in $XML2_CFLAGS; do case $pgac_option in - -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";; + -I*|-D*) INCLUDES="$INCLUDES $pgac_option";; esac done for pgac_option in $XML2_LIBS; do case $pgac_option in - -L*) LDFLAGS="$LDFLAGS $pgac_option";; + -L*) LIBDIRS="$LIBDIRS $pgac_option";; esac done fi @@ -1106,12 +1106,12 @@ if test "$with_lz4" = yes; then # note that -llz4 will be added by AC_CHECK_LIB below. for pgac_option in $LZ4_CFLAGS; do case $pgac_option in - -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";; + -I*|-D*) INCLUDES="$INCLUDES $pgac_option";; esac done for pgac_option in $LZ4_LIBS; do case $pgac_option in - -L*) LDFLAGS="$LDFLAGS $pgac_option";; + -L*) LIBDIRS="$LIBDIRS $pgac_option";; esac done fi @@ -1131,12 +1131,12 @@ if test "$with_zstd" = yes; then # note that -lzstd will be added by AC_CHECK_LIB below. for pgac_option in $ZSTD_CFLAGS; do case $pgac_option in - -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";; + -I*|-D*) INCLUDES="$INCLUDES $pgac_option";; esac done for pgac_option in $ZSTD_LIBS; do case $pgac_option in - -L*) LDFLAGS="$LDFLAGS $pgac_option";; + -L*) LIBDIRS="$LIBDIRS $pgac_option";; esac done fi @@ -1793,13 +1793,11 @@ AC_CHECK_FUNCS(m4_normalize([ inet_pton kqueue mbstowcs_l - memset_s posix_fallocate ppoll pthread_is_threaded_np setproctitle setproctitle_fast - strchrnul strsignal syncfs sync_file_range @@ -1839,6 +1837,9 @@ AC_CHECK_DECLS([strlcat, strlcpy, strnlen]) # won't handle deployment target restrictions on macOS AC_CHECK_DECLS([preadv], [], [], [#include ]) AC_CHECK_DECLS([pwritev], [], [], [#include ]) +AC_CHECK_DECLS([strchrnul], [], [], [#include ]) +AC_CHECK_DECLS([memset_s], [], [], [#define __STDC_WANT_LIB_EXT1__ 1 +#include ]) # This is probably only present on macOS, but may as well check always AC_CHECK_DECLS(F_FULLFSYNC, [], [], [#include ]) @@ -1936,7 +1937,7 @@ fi if test "$with_icu" = yes; then ac_save_CPPFLAGS=$CPPFLAGS - CPPFLAGS="$ICU_CFLAGS $CPPFLAGS" + CPPFLAGS="$CPPFLAGS $ICU_CFLAGS" # Verify we have ICU's header files AC_CHECK_HEADER(unicode/ucol.h, [], @@ -2078,7 +2079,7 @@ PGAC_HAVE_GCC__ATOMIC_INT32_CAS PGAC_HAVE_GCC__ATOMIC_INT64_CAS -# Check for x86 cpuid instruction +# Check for __get_cpuid() and __cpuid() AC_CACHE_CHECK([for __get_cpuid], [pgac_cv__get_cpuid], [AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], [[unsigned int exx[4] = {0, 0, 0, 0}; @@ -2088,8 +2089,21 @@ AC_CACHE_CHECK([for __get_cpuid], [pgac_cv__get_cpuid], [pgac_cv__get_cpuid="no"])]) if test x"$pgac_cv__get_cpuid" = x"yes"; then AC_DEFINE(HAVE__GET_CPUID, 1, [Define to 1 if you have __get_cpuid.]) +else + # __cpuid() + AC_CACHE_CHECK([for __cpuid], [pgac_cv__cpuid], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [[unsigned int exx[4] = {0, 0, 0, 0}; + __cpuid(exx, 1); + ]])], + [pgac_cv__cpuid="yes"], + [pgac_cv__cpuid="no"])]) + if test x"$pgac_cv__cpuid" = x"yes"; then + AC_DEFINE(HAVE__CPUID, 1, [Define to 1 if you have __cpuid.]) + fi fi +# Check for __get_cpuid_count() and __cpuidex() in a similar fashion. 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}; @@ -2099,28 +2113,18 @@ AC_CACHE_CHECK([for __get_cpuid_count], [pgac_cv__get_cpuid_count], [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}; - __get_cpuid(exx[0], 1); - ]])], - [pgac_cv__cpuid="yes"], - [pgac_cv__cpuid="no"])]) -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.]) +else + # __cpuidex() + AC_CACHE_CHECK([for __cpuidex], [pgac_cv__cpuidex], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [[unsigned int exx[4] = {0, 0, 0, 0}; + __cpuidex(exx, 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 fi # Check for XSAVE intrinsics @@ -2366,7 +2370,7 @@ Use --without-tcl to disable building PL/Tcl.]) fi # now that we have TCL_INCLUDE_SPEC, we can check for ac_save_CPPFLAGS=$CPPFLAGS - CPPFLAGS="$TCL_INCLUDE_SPEC $CPPFLAGS" + CPPFLAGS="$CPPFLAGS $TCL_INCLUDE_SPEC" AC_CHECK_HEADER(tcl.h, [], [AC_MSG_ERROR([header file is required for Tcl])]) CPPFLAGS=$ac_save_CPPFLAGS fi @@ -2403,7 +2407,7 @@ fi # check for if test "$with_python" = yes; then ac_save_CPPFLAGS=$CPPFLAGS - CPPFLAGS="$python_includespec $CPPFLAGS" + CPPFLAGS="$CPPFLAGS $python_includespec" AC_CHECK_HEADER(Python.h, [], [AC_MSG_ERROR([header file is required for Python])]) CPPFLAGS=$ac_save_CPPFLAGS fi diff --git a/contrib/amcheck/t/001_verify_heapam.pl b/contrib/amcheck/t/001_verify_heapam.pl index 9de3148277f1d..a66d4f88eed0f 100644 --- a/contrib/amcheck/t/001_verify_heapam.pl +++ b/contrib/amcheck/t/001_verify_heapam.pl @@ -9,6 +9,9 @@ use Test::More; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_smgr + 'hacks relation files directly for scaffolding'; + my ($node, $result); # diff --git a/contrib/auto_explain/Makefile b/contrib/auto_explain/Makefile index efd127d3cae64..94ab28e7c06b9 100644 --- a/contrib/auto_explain/Makefile +++ b/contrib/auto_explain/Makefile @@ -6,6 +6,8 @@ OBJS = \ auto_explain.o PGFILEDESC = "auto_explain - logging facility for execution plans" +REGRESS = alter_reset + TAP_TESTS = 1 ifdef USE_PGXS diff --git a/contrib/auto_explain/expected/alter_reset.out b/contrib/auto_explain/expected/alter_reset.out new file mode 100644 index 0000000000000..ec355189806ae --- /dev/null +++ b/contrib/auto_explain/expected/alter_reset.out @@ -0,0 +1,19 @@ +-- +-- This tests resetting unknown custom GUCs with reserved prefixes. There's +-- nothing specific to auto_explain; this is just a convenient place to put +-- this test. +-- +SELECT current_database() AS datname \gset +CREATE ROLE regress_ae_role; +ALTER DATABASE :"datname" SET auto_explain.bogus = 1; +ALTER ROLE regress_ae_role SET auto_explain.bogus = 1; +ALTER ROLE regress_ae_role IN DATABASE :"datname" SET auto_explain.bogus = 1; +ALTER SYSTEM SET auto_explain.bogus = 1; +LOAD 'auto_explain'; +WARNING: invalid configuration parameter name "auto_explain.bogus", removing it +DETAIL: "auto_explain" is now a reserved prefix. +ALTER DATABASE :"datname" RESET auto_explain.bogus; +ALTER ROLE regress_ae_role RESET auto_explain.bogus; +ALTER ROLE regress_ae_role IN DATABASE :"datname" RESET auto_explain.bogus; +ALTER SYSTEM RESET auto_explain.bogus; +DROP ROLE regress_ae_role; diff --git a/contrib/auto_explain/meson.build b/contrib/auto_explain/meson.build index af1a3b8e3250e..4bf2fedf1dd54 100644 --- a/contrib/auto_explain/meson.build +++ b/contrib/auto_explain/meson.build @@ -20,6 +20,11 @@ tests += { 'name': 'auto_explain', 'sd': meson.current_source_dir(), 'bd': meson.current_build_dir(), + 'regress': { + 'sql': [ + 'alter_reset', + ], + }, 'tap': { 'tests': [ 't/001_auto_explain.pl', diff --git a/contrib/auto_explain/sql/alter_reset.sql b/contrib/auto_explain/sql/alter_reset.sql new file mode 100644 index 0000000000000..bf621454ec24a --- /dev/null +++ b/contrib/auto_explain/sql/alter_reset.sql @@ -0,0 +1,22 @@ +-- +-- This tests resetting unknown custom GUCs with reserved prefixes. There's +-- nothing specific to auto_explain; this is just a convenient place to put +-- this test. +-- + +SELECT current_database() AS datname \gset +CREATE ROLE regress_ae_role; + +ALTER DATABASE :"datname" SET auto_explain.bogus = 1; +ALTER ROLE regress_ae_role SET auto_explain.bogus = 1; +ALTER ROLE regress_ae_role IN DATABASE :"datname" SET auto_explain.bogus = 1; +ALTER SYSTEM SET auto_explain.bogus = 1; + +LOAD 'auto_explain'; + +ALTER DATABASE :"datname" RESET auto_explain.bogus; +ALTER ROLE regress_ae_role RESET auto_explain.bogus; +ALTER ROLE regress_ae_role IN DATABASE :"datname" RESET auto_explain.bogus; +ALTER SYSTEM RESET auto_explain.bogus; + +DROP ROLE regress_ae_role; diff --git a/contrib/dblink/dblink.c b/contrib/dblink/dblink.c index 755293456fff6..bf5fe7a71da40 100644 --- a/contrib/dblink/dblink.c +++ b/contrib/dblink/dblink.c @@ -100,7 +100,7 @@ static PGresult *storeQueryResult(volatile storeInfo *sinfo, PGconn *conn, const static void storeRow(volatile storeInfo *sinfo, PGresult *res, bool first); static remoteConn *getConnectionByName(const char *name); static HTAB *createConnHash(void); -static void createNewConnection(const char *name, remoteConn *rconn); +static remoteConn *createNewConnection(const char *name); static void deleteConnection(const char *name); static char **get_pkey_attnames(Relation rel, int16 *indnkeyatts); static char **get_text_array_contents(ArrayType *array, int *numitems); @@ -114,7 +114,8 @@ static Relation get_rel_from_relname(text *relname_text, LOCKMODE lockmode, AclM static char *generate_relation_name(Relation rel); static void dblink_connstr_check(const char *connstr); static bool dblink_connstr_has_pw(const char *connstr); -static void dblink_security_check(PGconn *conn, remoteConn *rconn, const char *connstr); +static void dblink_security_check(PGconn *conn, const char *connname, + const char *connstr); static void dblink_res_error(PGconn *conn, const char *conname, PGresult *res, bool fail, const char *fmt,...) pg_attribute_printf(5, 6); static char *get_connect_string(const char *servername); @@ -137,16 +138,22 @@ static uint32 dblink_we_get_conn = 0; static uint32 dblink_we_get_result = 0; /* - * Following is list that holds multiple remote connections. + * Following is hash that holds multiple remote connections. * Calling convention of each dblink function changes to accept - * connection name as the first parameter. The connection list is + * connection name as the first parameter. The connection hash is * much like ecpg e.g. a mapping between a name and a PGconn object. + * + * To avoid potentially leaking a PGconn object in case of out-of-memory + * errors, we first create the hash entry, then open the PGconn. + * Hence, a hash entry whose rconn.conn pointer is NULL must be + * understood as a leftover from a failed create; it should be ignored + * by lookup operations, and silently replaced by create operations. */ typedef struct remoteConnHashEnt { char name[NAMEDATALEN]; - remoteConn *rconn; + remoteConn rconn; } remoteConnHashEnt; /* initial number of connection hashes */ @@ -225,7 +232,7 @@ dblink_get_conn(char *conname_or_str, errmsg("could not establish connection"), errdetail_internal("%s", msg))); } - dblink_security_check(conn, rconn, connstr); + dblink_security_check(conn, NULL, connstr); if (PQclientEncoding(conn) != GetDatabaseEncoding()) PQsetClientEncoding(conn, GetDatabaseEncodingName()); freeconn = true; @@ -288,15 +295,6 @@ dblink_connect(PG_FUNCTION_ARGS) else if (PG_NARGS() == 1) conname_or_str = text_to_cstring(PG_GETARG_TEXT_PP(0)); - if (connname) - { - rconn = (remoteConn *) MemoryContextAlloc(TopMemoryContext, - sizeof(remoteConn)); - rconn->conn = NULL; - rconn->openCursorCount = 0; - rconn->newXactForCursor = false; - } - /* first check for valid foreign data server */ connstr = get_connect_string(conname_or_str); if (connstr == NULL) @@ -309,6 +307,13 @@ dblink_connect(PG_FUNCTION_ARGS) if (dblink_we_connect == 0) dblink_we_connect = WaitEventExtensionNew("DblinkConnect"); + /* if we need a hashtable entry, make that first, since it might fail */ + if (connname) + { + rconn = createNewConnection(connname); + Assert(rconn->conn == NULL); + } + /* OK to make connection */ conn = libpqsrv_connect(connstr, dblink_we_connect); @@ -316,8 +321,8 @@ dblink_connect(PG_FUNCTION_ARGS) { msg = pchomp(PQerrorMessage(conn)); libpqsrv_disconnect(conn); - if (rconn) - pfree(rconn); + if (connname) + deleteConnection(connname); ereport(ERROR, (errcode(ERRCODE_SQLCLIENT_UNABLE_TO_ESTABLISH_SQLCONNECTION), @@ -326,16 +331,16 @@ dblink_connect(PG_FUNCTION_ARGS) } /* check password actually used if not superuser */ - dblink_security_check(conn, rconn, connstr); + dblink_security_check(conn, connname, connstr); /* attempt to set client encoding to match server encoding, if needed */ if (PQclientEncoding(conn) != GetDatabaseEncoding()) PQsetClientEncoding(conn, GetDatabaseEncodingName()); + /* all OK, save away the conn */ if (connname) { rconn->conn = conn; - createNewConnection(connname, rconn); } else { @@ -375,10 +380,7 @@ dblink_disconnect(PG_FUNCTION_ARGS) libpqsrv_disconnect(conn); if (rconn) - { deleteConnection(conname); - pfree(rconn); - } else pconn->conn = NULL; @@ -1296,6 +1298,9 @@ dblink_get_connections(PG_FUNCTION_ARGS) hash_seq_init(&status, remoteConnHash); while ((hentry = (remoteConnHashEnt *) hash_seq_search(&status)) != NULL) { + /* ignore it if it's not an open connection */ + if (hentry->rconn.conn == NULL) + continue; /* stash away current value */ astate = accumArrayResult(astate, CStringGetTextDatum(hentry->name), @@ -2533,8 +2538,8 @@ getConnectionByName(const char *name) hentry = (remoteConnHashEnt *) hash_search(remoteConnHash, key, HASH_FIND, NULL); - if (hentry) - return hentry->rconn; + if (hentry && hentry->rconn.conn != NULL) + return &hentry->rconn; return NULL; } @@ -2551,8 +2556,8 @@ createConnHash(void) HASH_ELEM | HASH_STRINGS); } -static void -createNewConnection(const char *name, remoteConn *rconn) +static remoteConn * +createNewConnection(const char *name) { remoteConnHashEnt *hentry; bool found; @@ -2566,17 +2571,15 @@ createNewConnection(const char *name, remoteConn *rconn) hentry = (remoteConnHashEnt *) hash_search(remoteConnHash, key, HASH_ENTER, &found); - if (found) - { - libpqsrv_disconnect(rconn->conn); - pfree(rconn); - + if (found && hentry->rconn.conn != NULL) ereport(ERROR, (errcode(ERRCODE_DUPLICATE_OBJECT), errmsg("duplicate connection name"))); - } - hentry->rconn = rconn; + /* New, or reusable, so initialize the rconn struct to zeroes */ + memset(&hentry->rconn, 0, sizeof(remoteConn)); + + return &hentry->rconn; } static void @@ -2604,9 +2607,12 @@ deleteConnection(const char *name) * We need to make sure that the connection made used credentials * which were provided by the user, so check what credentials were * used to connect and then make sure that they came from the user. + * + * On failure, we close "conn" and also delete the hashtable entry + * identified by "connname" (if that's not NULL). */ static void -dblink_security_check(PGconn *conn, remoteConn *rconn, const char *connstr) +dblink_security_check(PGconn *conn, const char *connname, const char *connstr) { /* Superuser bypasses security check */ if (superuser()) @@ -2624,8 +2630,8 @@ dblink_security_check(PGconn *conn, remoteConn *rconn, const char *connstr) /* Otherwise, fail out */ libpqsrv_disconnect(conn); - if (rconn) - pfree(rconn); + if (connname) + deleteConnection(connname); ereport(ERROR, (errcode(ERRCODE_S_R_E_PROHIBITED_SQL_STATEMENT_ATTEMPTED), diff --git a/contrib/file_fdw/expected/file_fdw.out b/contrib/file_fdw/expected/file_fdw.out index 86c148a86ba3a..4a31613fa2910 100644 --- a/contrib/file_fdw/expected/file_fdw.out +++ b/contrib/file_fdw/expected/file_fdw.out @@ -48,6 +48,10 @@ SET ROLE regress_file_fdw_superuser; CREATE USER MAPPING FOR regress_file_fdw_superuser SERVER file_server; CREATE USER MAPPING FOR regress_no_priv_user SERVER file_server; -- validator tests +CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (foo 'bar'); -- ERROR +ERROR: invalid option "foo" +CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS ("a=b" 'true'); -- ERROR +ERROR: invalid option name "a=b": must not contain "=" 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 diff --git a/contrib/file_fdw/sql/file_fdw.sql b/contrib/file_fdw/sql/file_fdw.sql index f0548e14e1845..e91b9799c4293 100644 --- a/contrib/file_fdw/sql/file_fdw.sql +++ b/contrib/file_fdw/sql/file_fdw.sql @@ -55,6 +55,8 @@ CREATE USER MAPPING FOR regress_file_fdw_superuser SERVER file_server; CREATE USER MAPPING FOR regress_no_priv_user SERVER file_server; -- validator tests +CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (foo 'bar'); -- ERROR +CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS ("a=b" 'true'); -- ERROR CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'xml'); -- ERROR CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'text', quote ':'); -- ERROR CREATE FOREIGN TABLE tbl () SERVER file_server OPTIONS (format 'text', escape ':'); -- ERROR diff --git a/contrib/intarray/_int_selfuncs.c b/contrib/intarray/_int_selfuncs.c index bc1ad3a80487f..f9f1c7bb13800 100644 --- a/contrib/intarray/_int_selfuncs.c +++ b/contrib/intarray/_int_selfuncs.c @@ -178,7 +178,7 @@ _int_matchsel(PG_FUNCTION_ARGS) if (query->size == 0) { ReleaseVariableStats(vardata); - return (Selectivity) 0.0; + PG_RETURN_FLOAT8(0.0); } /* diff --git a/contrib/intarray/expected/_int.out b/contrib/intarray/expected/_int.out index b39ab82d43d50..d0e68d0447fb7 100644 --- a/contrib/intarray/expected/_int.out +++ b/contrib/intarray/expected/_int.out @@ -492,6 +492,12 @@ SELECT count(*) from test__int WHERE a @@ '!20 & !21'; 6344 (1 row) +SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)'; + count +------- + 12 +(1 row) + SET enable_seqscan = off; -- not all of these would use index by default CREATE INDEX text_idx on test__int using gist ( a gist__int_ops ); SELECT count(*) from test__int WHERE a && '{23,50}'; @@ -566,6 +572,12 @@ SELECT count(*) from test__int WHERE a @@ '!20 & !21'; 6344 (1 row) +SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)'; + count +------- + 12 +(1 row) + INSERT INTO test__int SELECT array(SELECT x FROM generate_series(1, 1001) x); -- should fail ERROR: input array is too big (199 maximum allowed, 1001 current), use gist__intbig_ops opclass instead DROP INDEX text_idx; @@ -648,6 +660,12 @@ SELECT count(*) from test__int WHERE a @@ '!20 & !21'; 6344 (1 row) +SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)'; + count +------- + 12 +(1 row) + DROP INDEX text_idx; CREATE INDEX text_idx on test__int using gist (a gist__intbig_ops(siglen = 0)); ERROR: value 0 out of bounds for option "siglen" @@ -728,6 +746,12 @@ SELECT count(*) from test__int WHERE a @@ '!20 & !21'; 6344 (1 row) +SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)'; + count +------- + 12 +(1 row) + DROP INDEX text_idx; CREATE INDEX text_idx on test__int using gist ( a gist__intbig_ops ); SELECT count(*) from test__int WHERE a && '{23,50}'; @@ -802,6 +826,12 @@ SELECT count(*) from test__int WHERE a @@ '!20 & !21'; 6344 (1 row) +SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)'; + count +------- + 12 +(1 row) + DROP INDEX text_idx; CREATE INDEX text_idx on test__int using gin ( a gin__int_ops ); SELECT count(*) from test__int WHERE a && '{23,50}'; @@ -876,6 +906,12 @@ SELECT count(*) from test__int WHERE a @@ '!20 & !21'; 6344 (1 row) +SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)'; + count +------- + 12 +(1 row) + 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 @@ -968,4 +1004,10 @@ SELECT count(*) from more__int WHERE a @@ '!20 & !21'; 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/sql/_int.sql b/contrib/intarray/sql/_int.sql index 2d4ed1c9ae24f..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,6 +199,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; @@ -229,6 +235,7 @@ 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/pageinspect/heapfuncs.c b/contrib/pageinspect/heapfuncs.c index 27225150a5a16..ff4ea66ef746c 100644 --- a/contrib/pageinspect/heapfuncs.c +++ b/contrib/pageinspect/heapfuncs.c @@ -213,11 +213,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)); @@ -229,31 +226,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; @@ -262,11 +260,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 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/Makefile b/contrib/pg_prewarm/Makefile index 9cfde8c4e4fad..617ac8e09b2d8 100644 --- a/contrib/pg_prewarm/Makefile +++ b/contrib/pg_prewarm/Makefile @@ -10,6 +10,8 @@ EXTENSION = pg_prewarm DATA = pg_prewarm--1.1--1.2.sql pg_prewarm--1.1.sql pg_prewarm--1.0--1.1.sql PGFILEDESC = "pg_prewarm - preload relation data into system buffer cache" +REGRESS = pg_prewarm + TAP_TESTS = 1 ifdef USE_PGXS diff --git a/contrib/pg_prewarm/autoprewarm.c b/contrib/pg_prewarm/autoprewarm.c index d061731706ac0..bc540e734b52b 100644 --- a/contrib/pg_prewarm/autoprewarm.c +++ b/contrib/pg_prewarm/autoprewarm.c @@ -597,8 +597,15 @@ apw_dump_now(bool is_bgworker, bool dump_unlogged) return 0; } - block_info_array = - (BlockInfoRecord *) palloc(sizeof(BlockInfoRecord) * NBuffers); + /* + * With sufficiently large shared_buffers, allocation will exceed 1GB, so + * allow for a huge allocation to prevent outright failure. + * + * (In the future, it might be a good idea to redesign this to use a more + * memory-efficient data structure.) + */ + block_info_array = (BlockInfoRecord *) + palloc_extended((sizeof(BlockInfoRecord) * NBuffers), MCXT_ALLOC_HUGE); for (num_blocks = 0, i = 0; i < NBuffers; i++) { diff --git a/contrib/pg_prewarm/expected/pg_prewarm.out b/contrib/pg_prewarm/expected/pg_prewarm.out new file mode 100644 index 0000000000000..94e4fa1a9d237 --- /dev/null +++ b/contrib/pg_prewarm/expected/pg_prewarm.out @@ -0,0 +1,10 @@ +-- Test pg_prewarm extension +CREATE EXTENSION pg_prewarm; +-- pg_prewarm() should fail if the target relation has no storage. +CREATE TABLE test (c1 int) PARTITION BY RANGE (c1); +SELECT pg_prewarm('test', 'buffer'); +ERROR: relation "test" does not have storage +DETAIL: This operation is not supported for partitioned tables. +-- Cleanup +DROP TABLE test; +DROP EXTENSION pg_prewarm; diff --git a/contrib/pg_prewarm/meson.build b/contrib/pg_prewarm/meson.build index da58f70a9f82c..6880d6d0a219f 100644 --- a/contrib/pg_prewarm/meson.build +++ b/contrib/pg_prewarm/meson.build @@ -29,6 +29,11 @@ tests += { 'name': 'pg_prewarm', 'sd': meson.current_source_dir(), 'bd': meson.current_build_dir(), + 'regress': { + 'sql': [ + 'pg_prewarm', + ], + }, 'tap': { 'tests': [ 't/001_basic.pl', diff --git a/contrib/pg_prewarm/pg_prewarm.c b/contrib/pg_prewarm/pg_prewarm.c index 5c859e983c5ca..259ad83b77860 100644 --- a/contrib/pg_prewarm/pg_prewarm.c +++ b/contrib/pg_prewarm/pg_prewarm.c @@ -128,6 +128,14 @@ pg_prewarm(PG_FUNCTION_ARGS) if (aclresult != ACLCHECK_OK) aclcheck_error(aclresult, get_relkind_objtype(rel->rd_rel->relkind), get_rel_name(relOid)); + /* Check that the relation has storage. */ + 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))); + /* Check that the fork exists. */ if (!smgrexists(RelationGetSmgr(rel), forkNumber)) ereport(ERROR, diff --git a/contrib/pg_prewarm/sql/pg_prewarm.sql b/contrib/pg_prewarm/sql/pg_prewarm.sql new file mode 100644 index 0000000000000..c76f2c7916436 --- /dev/null +++ b/contrib/pg_prewarm/sql/pg_prewarm.sql @@ -0,0 +1,10 @@ +-- Test pg_prewarm extension +CREATE EXTENSION pg_prewarm; + +-- pg_prewarm() should fail if the target relation has no storage. +CREATE TABLE test (c1 int) PARTITION BY RANGE (c1); +SELECT pg_prewarm('test', 'buffer'); + +-- Cleanup +DROP TABLE test; +DROP EXTENSION pg_prewarm; diff --git a/contrib/pg_stat_statements/expected/extended.out b/contrib/pg_stat_statements/expected/extended.out index dbc7868022662..f60cbc7bb2eb6 100644 --- a/contrib/pg_stat_statements/expected/extended.out +++ b/contrib/pg_stat_statements/expected/extended.out @@ -8,3 +8,61 @@ SELECT query_id IS NOT NULL AS query_id_set t (1 row) +-- Various parameter numbering patterns +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +-- Unique query IDs with parameter numbers switched. +SELECT WHERE ($1::int, 7) IN ((8, $2::int), ($3::int, 9)) \bind '1' '2' '3' \g +-- +(0 rows) + +SELECT WHERE ($2::int, 10) IN ((11, $3::int), ($1::int, 12)) \bind '1' '2' '3' \g +-- +(0 rows) + +SELECT WHERE $1::int IN ($2::int, $3::int) \bind '1' '2' '3' \g +-- +(0 rows) + +SELECT WHERE $2::int IN ($3::int, $1::int) \bind '1' '2' '3' \g +-- +(0 rows) + +SELECT WHERE $3::int IN ($1::int, $2::int) \bind '1' '2' '3' \g +-- +(0 rows) + +-- Two groups of two queries with the same query ID. +SELECT WHERE '1'::int IN ($1::int, '2'::int) \bind '1' \g +-- +(1 row) + +SELECT WHERE '4'::int IN ($1::int, '5'::int) \bind '2' \g +-- +(0 rows) + +SELECT WHERE $2::int IN ($1::int, '1'::int) \bind '1' '2' \g +-- +(0 rows) + +SELECT WHERE $2::int IN ($1::int, '2'::int) \bind '3' '4' \g +-- +(0 rows) + +SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; + query | calls +--------------------------------------------------------------+------- + SELECT WHERE $1::int IN ($2::int, $3::int) | 1 + SELECT WHERE $2::int IN ($1::int, $3::int) | 2 + SELECT WHERE $2::int IN ($1::int, $3::int) | 2 + SELECT WHERE $2::int IN ($3::int, $1::int) | 1 + SELECT WHERE $3::int IN ($1::int, $2::int) | 1 + SELECT WHERE ($1::int, $4) IN (($5, $2::int), ($3::int, $6)) | 1 + SELECT WHERE ($2::int, $4) IN (($5, $3::int), ($1::int, $6)) | 1 + SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 +(8 rows) + diff --git a/contrib/pg_stat_statements/expected/select.out b/contrib/pg_stat_statements/expected/select.out index dd6c756f67d5b..c031003e62419 100644 --- a/contrib/pg_stat_statements/expected/select.out +++ b/contrib/pg_stat_statements/expected/select.out @@ -152,6 +152,35 @@ SELECT pg_stat_statements_reset() IS NOT NULL AS t; t (1 row) +-- normalization of constants and parameters, with constant locations +-- recorded one or more times. +SELECT pg_stat_statements_reset() IS NOT NULL AS t; + t +--- + t +(1 row) + +SELECT WHERE '1' IN ('1'::int, '3'::int::text); +-- +(1 row) + +SELECT WHERE (1, 2) IN ((1, 2), (2, 3)); +-- +(1 row) + +SELECT WHERE (3, 4) IN ((5, 6), (8, 7)); +-- +(0 rows) + +SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; + query | calls +------------------------------------------------------------------------+------- + SELECT WHERE $1 IN ($2::int, $3::int::text) | 1 + SELECT WHERE ($1, $2) IN (($3, $4), ($5, $6)) | 2 + SELECT pg_stat_statements_reset() IS NOT NULL AS t | 1 + SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C" | 0 +(4 rows) + -- -- queries with locking clauses -- diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c index 12718dfe45c2d..c5c4edce42362 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -2801,6 +2801,7 @@ generate_normalized_query(JumbleState *jstate, const char *query, n_quer_loc = 0, /* Normalized query byte location */ last_off = 0, /* Offset from start for previous tok */ last_tok_len = 0; /* Length (in bytes) of that tok */ + int num_constants_replaced = 0; /* * Get constants' lengths (core system only gives us locations). Note @@ -2844,7 +2845,8 @@ generate_normalized_query(JumbleState *jstate, const char *query, /* And insert a param symbol in place of the constant token */ n_quer_loc += sprintf(norm_query + n_quer_loc, "$%d", - i + 1 + jstate->highest_extern_param_id); + num_constants_replaced + 1 + jstate->highest_extern_param_id); + num_constants_replaced++; quer_loc = off + tok_len; last_off = off; diff --git a/contrib/pg_stat_statements/sql/extended.sql b/contrib/pg_stat_statements/sql/extended.sql index 07b6c5a93d673..1dd49cf202503 100644 --- a/contrib/pg_stat_statements/sql/extended.sql +++ b/contrib/pg_stat_statements/sql/extended.sql @@ -5,3 +5,19 @@ 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 + +-- Various parameter numbering patterns +SELECT pg_stat_statements_reset() IS NOT NULL AS t; +-- Unique query IDs with parameter numbers switched. +SELECT WHERE ($1::int, 7) IN ((8, $2::int), ($3::int, 9)) \bind '1' '2' '3' \g +SELECT WHERE ($2::int, 10) IN ((11, $3::int), ($1::int, 12)) \bind '1' '2' '3' \g +SELECT WHERE $1::int IN ($2::int, $3::int) \bind '1' '2' '3' \g +SELECT WHERE $2::int IN ($3::int, $1::int) \bind '1' '2' '3' \g +SELECT WHERE $3::int IN ($1::int, $2::int) \bind '1' '2' '3' \g +-- Two groups of two queries with the same query ID. +SELECT WHERE '1'::int IN ($1::int, '2'::int) \bind '1' \g +SELECT WHERE '4'::int IN ($1::int, '5'::int) \bind '2' \g +SELECT WHERE $2::int IN ($1::int, '1'::int) \bind '1' '2' \g +SELECT WHERE $2::int IN ($1::int, '2'::int) \bind '3' '4' \g + +SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; diff --git a/contrib/pg_stat_statements/sql/select.sql b/contrib/pg_stat_statements/sql/select.sql index eb45cb81ad23f..c419c84579607 100644 --- a/contrib/pg_stat_statements/sql/select.sql +++ b/contrib/pg_stat_statements/sql/select.sql @@ -58,6 +58,14 @@ DEALLOCATE pgss_test; SELECT calls, rows, query FROM pg_stat_statements ORDER BY query COLLATE "C"; SELECT pg_stat_statements_reset() IS NOT NULL AS t; +-- normalization of constants and parameters, with constant locations +-- recorded one or more times. +SELECT pg_stat_statements_reset() IS NOT NULL AS t; +SELECT WHERE '1' IN ('1'::int, '3'::int::text); +SELECT WHERE (1, 2) IN ((1, 2), (2, 3)); +SELECT WHERE (3, 4) IN ((5, 6), (8, 7)); +SELECT query, calls FROM pg_stat_statements ORDER BY query COLLATE "C"; + -- -- queries with locking clauses -- diff --git a/contrib/pg_tde/.gitignore b/contrib/pg_tde/.gitignore index 4bc8580d6e00f..72289d0332d3c 100644 --- a/contrib/pg_tde/.gitignore +++ b/contrib/pg_tde/.gitignore @@ -1,18 +1,16 @@ -*.so -*.o *.frontend __pycache__ -.vscode -/config.cache -/config.log -/config.status -/autom4te.cache -/configure~ -/t/results -/results -/tmp_check -/log +# Generated subdirectories +/log/ +/results/ +/t/results/ +/tmp_check/ -# tools files -typedefs-full.list +# Binaries +/src/bin/pg_tde_archive_decrypt +/src/bin/pg_tde_change_key_provider +/src/bin/pg_tde_restore_encrypt + +# Tool files +/typedefs-full.list diff --git a/contrib/pg_tde/LICENSE b/contrib/pg_tde/LICENSE deleted file mode 100644 index a6d04899b4f2f..0000000000000 --- a/contrib/pg_tde/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2024 Percona LLC - -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. diff --git a/contrib/pg_tde/Makefile b/contrib/pg_tde/Makefile index 105f0523a4a77..97832b46a4e44 100644 --- a/contrib/pg_tde/Makefile +++ b/contrib/pg_tde/Makefile @@ -1,79 +1,106 @@ -# contrib/pg_tde/Makefile - PGFILEDESC = "pg_tde access method" MODULE_big = pg_tde EXTENSION = pg_tde -DATA = pg_tde--1.0-rc.sql +DATA = pg_tde--1.0--2.0.sql pg_tde--1.0.sql +# Since meson supports skipping test suites this is a make only feature +ifndef TDE_MODE REGRESS_OPTS = --temp-config $(top_srcdir)/contrib/pg_tde/pg_tde.conf -# toast_descrypt needs to be the first test when running with pg_tde -# preinstalled and default_principal_key needs to run after key_provider. -REGRESS = toast_decrypt \ -access_control \ -alter_index \ -cache_alloc \ -change_access_method \ -insert_update_delete \ -key_provider \ -keyprovider_dependency \ -kmip_test \ -pg_tde_is_encrypted \ -recreate_storage \ -relocate \ -subtransaction \ -tablespace \ -vault_v2_test \ -default_principal_key +REGRESS = \ + access_control \ + alter_index \ + cache_alloc \ + change_access_method \ + create_database \ + default_principal_key \ + delete_principal_key \ + insert_update_delete \ + key_provider \ + kmip_test \ + partition_table \ + pg_tde_is_encrypted \ + recreate_storage \ + relocate \ + tablespace \ + toast_decrypt \ + vault_v2_test \ + version TAP_TESTS = 1 +endif + +KMIP_OBJS = \ + src/libkmip/libkmip/src/kmip.o \ + src/libkmip/libkmip/src/kmip_bio.o \ + src/libkmip/libkmip/src/kmip_locate.o \ + src/libkmip/libkmip/src/kmip_memset.o + +OBJS = \ + src/encryption/enc_tde.o \ + src/encryption/enc_aes.o \ + src/access/pg_tde_tdemap.o \ + src/access/pg_tde_xlog.o \ + src/access/pg_tde_xlog_keys.o \ + src/access/pg_tde_xlog_smgr.o \ + src/keyring/keyring_curl.o \ + src/keyring/keyring_file.o \ + src/keyring/keyring_vault.o \ + src/keyring/keyring_kmip.o \ + src/keyring/keyring_kmip_impl.o \ + src/keyring/keyring_api.o \ + src/catalog/tde_keyring.o \ + src/catalog/tde_keyring_parse_opts.o \ + src/catalog/tde_principal_key.o \ + src/common/pg_tde_utils.o \ + src/smgr/pg_tde_smgr.o \ + src/pg_tde_event_capture.o \ + src/pg_tde_guc.o \ + src/pg_tde.o \ + $(KMIP_OBJS) + +SCRIPTS_built = \ + src/bin/pg_tde_archive_decrypt \ + src/bin/pg_tde_change_key_provider \ + src/bin/pg_tde_restore_encrypt -OBJS = src/encryption/enc_tde.o \ -src/encryption/enc_aes.o \ -src/access/pg_tde_tdemap.o \ -src/access/pg_tde_xlog.o \ -src/access/pg_tde_xlog_encrypt.o \ -src/transam/pg_tde_xact_handler.o \ -src/keyring/keyring_curl.o \ -src/keyring/keyring_file.o \ -src/keyring/keyring_vault.o \ -src/keyring/keyring_kmip.o \ -src/keyring/keyring_kmip_impl.o \ -src/keyring/keyring_api.o \ -src/catalog/tde_keyring.o \ -src/catalog/tde_keyring_parse_opts.o \ -src/catalog/tde_principal_key.o \ -src/common/pg_tde_shmem.o \ -src/common/pg_tde_utils.o \ -src/smgr/pg_tde_smgr.o \ -src/pg_tde_defs.o \ -src/pg_tde_event_capture.o \ -src/pg_tde_guc.o \ -src/pg_tde.o \ -src/libkmip/libkmip/src/kmip.o \ -src/libkmip/libkmip/src/kmip_bio.o \ -src/libkmip/libkmip/src/kmip_locate.o \ -src/libkmip/libkmip/src/kmip_memset.o - -SCRIPTS_built = src/pg_tde_change_key_provider - -EXTRA_CLEAN += src/pg_tde_change_key_provider.o +EXTRA_INSTALL = contrib/pg_buffercache contrib/test_decoding +EXTRA_CLEAN = \ + src/bin/pg_tde_archive_decrypt.o \ + src/bin/pg_tde_change_key_provider.o \ + src/bin/pg_tde_restore_encrypt.o \ + xlogreader.c \ + xlogreader.o ifdef USE_PGXS PG_CONFIG = pg_config PGXS := $(shell $(PG_CONFIG) --pgxs) -override PG_CPPFLAGS += -I$(CURDIR)/src/include -I$(CURDIR)/src/libkmip/libkmip/include +PG_CPPFLAGS = -I$(CURDIR)/src/include -I$(CURDIR)/src/libkmip/libkmip/include include $(PGXS) else subdir = contrib/pg_tde top_builddir = ../.. -override PG_CPPFLAGS += -I$(top_srcdir)/$(subdir)/src/include -I$(top_srcdir)/$(subdir)/src/libkmip/libkmip/include +PG_CPPFLAGS = -I$(top_srcdir)/$(subdir)/src/include -I$(top_srcdir)/$(subdir)/src/libkmip/libkmip/include include $(top_builddir)/src/Makefile.global include $(top_srcdir)/contrib/contrib-global.mk endif -override SHLIB_LINK += -lcurl -lcrypto -lssl +SHLIB_LINK = -lcurl -lcrypto -lssl +LDFLAGS_EX = -L$(top_builddir)/src/fe_utils -lcurl -lcrypto -lssl -lpgfeutils + +$(KMIP_OBJS): CFLAGS += -w # This is a 3rd party, disable warnings completely + +src/bin/pg_tde_change_key_provider: src/bin/pg_tde_change_key_provider.o $(top_builddir)/src/libtde/libtde.a | submake-libpgfeutils + $(CC) $(CFLAGS) $^ $(PG_LIBS_INTERNAL) $(LDFLAGS) $(LDFLAGS_EX) $(PG_LIBS) $(LIBS) -o $@$(X) + +src/bin/pg_tde_archive_decrypt: src/bin/pg_tde_archive_decrypt.o xlogreader.o $(top_builddir)/src/libtde/libtdexlog.a $(top_builddir)/src/libtde/libtde.a | submake-libpgfeutils + $(CC) $(CFLAGS) $^ $(PG_LIBS_INTERNAL) $(LDFLAGS) $(LDFLAGS_EX) $(PG_LIBS) $(LIBS) -o $@$(X) + +src/bin/pg_tde_restore_encrypt: src/bin/pg_tde_restore_encrypt.o xlogreader.o $(top_builddir)/src/libtde/libtdexlog.a $(top_builddir)/src/libtde/libtde.a | submake-libpgfeutils + $(CC) $(CFLAGS) $^ $(PG_LIBS_INTERNAL) $(LDFLAGS) $(LDFLAGS_EX) $(PG_LIBS) $(LIBS) -o $@$(X) + +xlogreader.c: % : $(top_srcdir)/src/backend/access/transam/% + rm -f $@ && $(LN_S) $< . -src/pg_tde_change_key_provider: src/pg_tde_change_key_provider.o $(top_srcdir)/src/fe_utils/simple_list.o $(top_builddir)/src/libtde/libtde.a - $(CC) -DFRONTEND $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) +xlogreader.o: CFLAGS += -DFRONTEND # Fetches typedefs list for PostgreSQL core and merges it with typedefs defined in this project. # https://wiki.postgresql.org/wiki/Running_pgindent_on_non-core_code_or_development_code diff --git a/contrib/pg_tde/Makefile.tools b/contrib/pg_tde/Makefile.tools index 0d28b8292fd20..6ab1ad75166d6 100644 --- a/contrib/pg_tde/Makefile.tools +++ b/contrib/pg_tde/Makefile.tools @@ -1,18 +1,19 @@ TDE_XLOG_OBJS = \ - src/access/pg_tde_xlog_encrypt.frontend + src/access/pg_tde_xlog_smgr.frontend TDE_OBJS = \ - src/access/pg_tde_tdemap.frontend \ - src/catalog/tde_keyring.frontend \ - src/catalog/tde_keyring_parse_opts.frontend \ - src/catalog/tde_principal_key.frontend \ - src/common/pg_tde_utils.frontend \ - src/encryption/enc_aes.frontend \ - src/encryption/enc_tde.frontend \ - src/keyring/keyring_api.frontend \ - src/keyring/keyring_curl.frontend \ - src/keyring/keyring_file.frontend \ - src/keyring/keyring_vault.frontend \ + src/access/pg_tde_tdemap.frontend \ + src/catalog/tde_keyring.frontend \ + src/access/pg_tde_xlog_keys.frontend \ + src/catalog/tde_keyring_parse_opts.frontend \ + src/catalog/tde_principal_key.frontend \ + src/common/pg_tde_utils.frontend \ + src/encryption/enc_aes.frontend \ + src/encryption/enc_tde.frontend \ + src/keyring/keyring_api.frontend \ + src/keyring/keyring_curl.frontend \ + src/keyring/keyring_file.frontend \ + src/keyring/keyring_vault.frontend \ src/libkmip/libkmip/src/kmip.frontend \ src/libkmip/libkmip/src/kmip_bio.frontend \ src/libkmip/libkmip/src/kmip_locate.frontend \ @@ -20,7 +21,6 @@ TDE_OBJS = \ src/keyring/keyring_kmip.frontend \ src/keyring/keyring_kmip_impl.frontend - TDE_OBJS2 = $(TDE_OBJS:%=$(top_srcdir)/contrib/pg_tde/%) TDE_XLOG_OBJS2 = $(TDE_XLOG_OBJS:%=$(top_srcdir)/contrib/pg_tde/%) @@ -35,5 +35,4 @@ libtdexlog.a: $(TDE_XLOG_OBJS2) rm -f $@ $(AR) $(AROPT) $@ $^ - -tdelibs: libtde.a libtdexlog.a \ No newline at end of file +tdelibs: libtde.a libtdexlog.a diff --git a/contrib/pg_tde/README.md b/contrib/pg_tde/README.md index be689e7624fc8..a87118052f0f6 100644 --- a/contrib/pg_tde/README.md +++ b/contrib/pg_tde/README.md @@ -1,167 +1,66 @@ [![OpenSSF Scorecard](https://api.scorecard.dev/projects/github.com/percona/pg_tde/badge)](https://scorecard.dev/viewer/?uri=github.com/percona/pg_tde) +[![codecov](https://codecov.io/github/percona/postgres/graph/badge.svg?token=Wow78BMYdP)](https://codecov.io/github/percona/postgres) [![Forum](https://img.shields.io/badge/Forum-join-brightgreen)](https://forums.percona.com/) +[![Docs](https://img.shields.io/badge/docs-pg_tde-blue)](https://docs.percona.com/pg-tde/) # pg_tde: Transparent Database Encryption for PostgreSQL -The PostgreSQL extension provides data at rest encryption. It is currently in an experimental phase and is under active development. [We need your feedback!](https://github.com/percona/pg_tde/discussions/151) +The PostgreSQL extension provides data at rest encryption. It is currently in an experimental phase and is under active development. [We need your feedback!](https://github.com/percona/postgres/discussions) + +## Table of Contents -## Table of contents 1. [Overview](#overview) 2. [Documentation](#documentation) -1. [Percona Server for PostgreSQL](#percona-server-for-postgresql) -3. [Build from sources](#building-from-sources-for-community-postgresql) +3. [Percona Server for PostgreSQL](#percona-server-for-postgresql) 4. [Run in docker](#run-in-docker) -5. [Setting up](#setting-up) -6. [Helper functions](#helper-functions) +5. [Set up pg_tde](#set-up-pg_tde) +6. [Downloads](#downloads) +7. [Additional functions](#additional-functions) ## Overview -Transparent Data Encryption offers encryption at the file level and solves the problem of protecting data at rest. The encryption is transparent for users allowing them to access and manipulate the data and not to worry about the encryption process. As a key provider, the extension supports the keyringfile and [Hashicorp Vault](https://www.vaultproject.io/). -### This extension provides one `access method`: +Transparent Data Encryption offers encryption at the file level and solves the problem of protecting data at rest. The encryption is transparent for users allowing them to access and manipulate the data and not to worry about the encryption process. The extension supports [keyringfile and external Key Management Systems (KMS) through a Global Key Provider interface](../pg_tde/documentation/docs/global-key-provider-configuration/index.md). + +### This extension provides the `tde_heap access method` + +This access method: -#### `tde_heap` access method - Works only with [Percona Server for PostgreSQL 17](https://docs.percona.com/postgresql/17/postgresql-server.html) - Uses extended Storage Manager and WAL APIs - Encrypts tuples, WAL and indexes -- **Doesn't** encrypt temporary files and statistics **yet** +- It **does not** encrypt temporary files and statistics **yet** ## Documentation -Full and comprehensive documentation about `pg_tde` is available at https://percona.github.io/pg_tde/. +For more information about `pg_tde`, [see the official documentation](https://docs.percona.com/pg-tde/index.html). ## Percona Server for PostgreSQL -Percona provides binary packages of `pg_tde` extension only for Percona Server for PostgreSQL. Learn how to install them or build `pg_tde` from sources for PSPG in the [documentation](https://percona.github.io/pg_tde/main/install.html). - -## Building from sources for community PostgreSQL - 1. Install required dependencies (replace XX with 16 or 17) - - On Debian and Ubuntu: - ```sh - sudo apt install make gcc autoconf git libcurl4-openssl-dev postgresql-server-dev-XX - ``` - - - On RHEL 8 compatible OS: - ```sh - sudo yum install epel-release - yum --enablerepo=powertools install git make gcc autoconf libcurl-devel perl-IPC-Run redhat-rpm-config openssl-devel postgresqlXX-devel - ``` - - - On MacOS: - ```sh - brew install make autoconf curl gettext postresql@XX - ``` - - 2. Install or build postgresql 16 or 17 - 3. If postgres is installed in a non standard directory, set the `PG_CONFIG` environment variable to point to the `pg_config` executable - - 4. Clone the repository, build and install it with the following commands: - - ```sh - git clone https://github.com/percona/pg_tde - ``` - - 5. Compile and install the extension - - ```sh - cd pg_tde - make USE_PGXS=1 - sudo make USE_PGXS=1 install - ``` +Percona provides binary packages of `pg_tde` extension only for Percona Server for PostgreSQL. Learn how to install them or build `pg_tde` from sources for PSPG in the [documentation](https://docs.percona.com/pg-tde/install.html). ## Run in Docker -There is a [docker image](https://hub.docker.com/r/perconalab/pg_tde) with `pg_tde` based community [PostgreSQL 16](https://hub.docker.com/_/postgres) - -``` -docker run --name pg-tde -e POSTGRES_PASSWORD=mysecretpassword -d perconalab/pg_tde -``` -Docker file is available [here](https://github.com/percona/pg_tde/blob/main/docker/Dockerfile) - - -_See [Make Builds for Developers](https://github.com/percona/pg_tde/wiki/Make-builds-for-developers) for more info on the build infrastructure._ - -## Setting up - - 1. Add extension to the `shared_preload_libraries`: - 1. Via configuration file `postgresql.conf ` - ``` - shared_preload_libraries=pg_tde - ``` - 2. Via SQL using [ALTER SYSTEM](https://www.postgresql.org/docs/current/sql-altersystem.html) command - ```sql - ALTER SYSTEM SET shared_preload_libraries = 'pg_tde'; - ``` - 2. Start or restart the `postgresql` cluster to apply the changes. - * On Debian and Ubuntu: - - ```sh - sudo systemctl restart postgresql-17 - ``` - - * On RHEL 8 compatible OS (replace XX with your version): - ```sh - sudo systemctl restart postgresql-XX.service - ``` - 3. [CREATE EXTENSION](https://www.postgresql.org/docs/current/sql-createextension.html) with SQL (requires superuser or a database owner privileges): - - ```sql - CREATE EXTENSION pg_tde; - ``` - 4. Create a key provider. Currently `pg_tde` supports `File` and `Vault-V2` key providers. You can add the required key provider using one of the functions. - - - ```sql - -- For Vault-V2 key provider - -- pg_tde_add_key_provider_vault_v2(provider_name, vault_token, vault_url, vault_mount_path, vault_ca_path) - SELECT pg_tde_add_key_provider_vault_v2( - 'vault-provider', - json_object( 'type' VALUE 'remote', 'url' VALUE 'http://localhost:8888/token' ), - json_object( 'type' VALUE 'remote', 'url' VALUE 'http://localhost:8888/url' ), - to_json('secret'::text), NULL); - - -- For File key provider - -- pg_tde_add_key_provider_file(provider_name, file_path); - SELECT pg_tde_add_key_provider_file('file','/tmp/pgkeyring'); - ``` - - **Note: The `File` provided is intended for development and stores the keys unencrypted in the specified data file.** - - 5. Set the principal key for the database using the `pg_tde_set_principal_key` function. - - ```sql - -- pg_tde_set_principal_key(principal_key_name, provider_name); - SELECT pg_tde_set_principal_key('my-principal-key','file'); - ``` - - 6. Specify `tde_heap` access method during table creation - ```sql - CREATE TABLE albums ( - album_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, - artist_id INTEGER, - title TEXT NOT NULL, - released DATE NOT NULL - ) USING tde_heap; - ``` - 7. You can encrypt existing table. It requires rewriting the table, so for large tables, it might take a considerable amount of time. - ```sql - ALTER TABLE table_name SET ACCESS METHOD tde_heap; - ``` - - -## Latest test release - -To download the latest build of the main branch, use the `HEAD` release from [releases](https://github.com/percona/pg_tde/releases). +To run `pg_tde` in Docker, follow the instructions in the [official pg_tde Docker documentation](https://docs.percona.com/postgresql/17/docker.html#enable-encryption). -Builds are available in a tar.gz format, containing only the required files, and as a deb package. -The deb package is built against the pgdg16 release, but this dependency is not yet enforced in the package. +_For details on the build process and developer setup, see [Make Builds for Developers](https://github.com/percona/pg_tde/wiki/Make-builds-for-developers)._ + +## Set up pg_tde +For more information on setting up and configuring `pg_tde`, see the [official pg_tde setup topic](https://docs.percona.com/pg-tde/setup.html). -## Helper functions +The guide also includes instructions for: -The extension provides the following helper functions: +- Installing and enabling the extension +- Setting up key providers +- Creating encrypted tables + +## Downloads + +To download the latest build of the main branch, use the `HEAD` release from [releases](https://github.com/percona/postgres/releases). + +Builds are available in a tar.gz format, containing only the required files, and as a deb package. +The deb package is built against the pgdg17 release, but this dependency is not yet enforced in the package. -### pg_tde_is_encrypted(tablename) +## Additional functions -Returns `t` if the relation is encrypted, if unencrypted `f` or `NULL` if the -relation lacks storage, i.e. views, foreign tables, and partitioning tables and -indexes. +Learn more about the helper functions available in `pg_tde`, including how to check table encryption status, in the [Functions topic](https://docs.percona.com/pg-tde/functions.html?h=pg_tde_is_encrypted#encryption-status-check). diff --git a/contrib/pg_tde/documentation/CONTRIBUTING.md b/contrib/pg_tde/documentation/CONTRIBUTING.md index 9de67c5babf4b..580022cfc11aa 100644 --- a/contrib/pg_tde/documentation/CONTRIBUTING.md +++ b/contrib/pg_tde/documentation/CONTRIBUTING.md @@ -54,9 +54,9 @@ When you work, you should periodically run tests to check that your changes don To run the tests, use the following command: -``` +```sh source ci_scripts/setup-keyring-servers.sh -ci_scripts/make-test.sh +ci_scripts/make-test.sh all ``` You can run tests on your local machine with whatever operating system you have. After you submit the pull request, we will check your patch on multiple operating systems. @@ -148,6 +148,7 @@ To verify how your changes look, generate the static site with the documentation cd contrib/pg_tde/documentation docker run --rm -v $(pwd):/docs perconalab/pmm-doc-md mkdocs build ``` + If Docker can't find the image locally, it first downloads the image, and then runs it to build the documentation. 3. Go to the ``site`` directory and open the ``index.html`` file to see the documentation. diff --git a/contrib/pg_tde/documentation/_resource/overrides/main.html b/contrib/pg_tde/documentation/_resource/overrides/main.html index 6aef80e6c1bd3..3cf5dc8d34ff9 100644 --- a/contrib/pg_tde/documentation/_resource/overrides/main.html +++ b/contrib/pg_tde/documentation/_resource/overrides/main.html @@ -3,17 +3,11 @@ -#} {% extends "base.html" %} -{% block announce %} - This is a Release Candidate of Percona Transparent Data Encryption extension and it is - not recommended for production environments yet. We encourage you to test it and give your feedback. - This will help us improve the product and make it production-ready faster. -{% endblock %} - {% block scripts %} {{ super() }} {% endblock %} - + {% block extrahead %} {{ super() }} {% set title = config.site_name %} @@ -27,7 +21,7 @@ {% endblock %} - + {% block site_nav %} {% if nav %} {% if page.meta and page.meta.hide %} @@ -39,7 +33,7 @@ {% include "partials/nav.html" %}
+ @@ -64,6 +58,3 @@ posthog.init('phc_7unoI9J6Fm0SMrfDp35xNOpCRTkOAibbffQwdGWbHnL',{api_host:'https://eu.posthog.com'}) {% endblock %} - - - diff --git a/contrib/pg_tde/documentation/_resource/overrides/partials/banner.html b/contrib/pg_tde/documentation/_resource/overrides/partials/banner.html index fb26631493f1a..69b904fe286bf 100644 --- a/contrib/pg_tde/documentation/_resource/overrides/partials/banner.html +++ b/contrib/pg_tde/documentation/_resource/overrides/partials/banner.html @@ -4,6 +4,6 @@ - \ No newline at end of file + diff --git a/contrib/pg_tde/documentation/_resource/overrides/partials/copyright.html b/contrib/pg_tde/documentation/_resource/overrides/partials/copyright.html index dd0f101fad6df..95c8eaf6cf73d 100644 --- a/contrib/pg_tde/documentation/_resource/overrides/partials/copyright.html +++ b/contrib/pg_tde/documentation/_resource/overrides/partials/copyright.html @@ -11,4 +11,4 @@ Material for MkDocs {% endif %} - \ No newline at end of file + diff --git a/contrib/pg_tde/documentation/_resource/overrides/partials/header.html b/contrib/pg_tde/documentation/_resource/overrides/partials/header.html index 2d0d6e7401a04..1983ab1baef50 100644 --- a/contrib/pg_tde/documentation/_resource/overrides/partials/header.html +++ b/contrib/pg_tde/documentation/_resource/overrides/partials/header.html @@ -132,4 +132,4 @@ {% include "partials/tabs.html" %} {% endif %} {% endif %} - \ No newline at end of file + diff --git a/contrib/pg_tde/documentation/_resource/templates/styles.scss b/contrib/pg_tde/documentation/_resource/templates/styles.scss index fc9bc9fce52e9..ccbbe96de6e37 100644 --- a/contrib/pg_tde/documentation/_resource/templates/styles.scss +++ b/contrib/pg_tde/documentation/_resource/templates/styles.scss @@ -115,4 +115,4 @@ article div.tabbed-content--wrap * { .md-typeset details.note { color: #00162b; border-color: #fff; -} \ No newline at end of file +} diff --git a/contrib/pg_tde/documentation/_resourcepdf/overrides/404.html b/contrib/pg_tde/documentation/_resourcepdf/overrides/404.html new file mode 100644 index 0000000000000..36c0dcfc5f0bb --- /dev/null +++ b/contrib/pg_tde/documentation/_resourcepdf/overrides/404.html @@ -0,0 +1,9 @@ +{#- + This file was automatically generated - do not edit + -#} + {% extends "main.html" %} + {% block content %} +

404 - Not found

+

+ We can't find the page you are looking for. Try using the Search or return to homepage .

+ {% endblock %} \ No newline at end of file diff --git a/contrib/pg_tde/documentation/_resourcepdf/overrides/main.html b/contrib/pg_tde/documentation/_resourcepdf/overrides/main.html new file mode 100644 index 0000000000000..3cf5dc8d34ff9 --- /dev/null +++ b/contrib/pg_tde/documentation/_resourcepdf/overrides/main.html @@ -0,0 +1,60 @@ +{#- + This file was automatically generated - do not edit +-#} +{% extends "base.html" %} + +{% block scripts %} + +{{ super() }} +{% endblock %} + + {% block extrahead %} + {{ super() }} + {% set title = config.site_name %} + {% if page and page.meta and page.meta.title %} + {% set title = title ~ " - " ~ page.meta.title %} + {% elif page and page.title and not page.is_homepage %} + {% set title = title ~ " - " ~ page.title %} + {% endif %} + + + + + {% endblock %} + +{% block site_nav %} + {% if nav %} + {% if page.meta and page.meta.hide %} + {% set hidden = "hidden" if "navigation" in page.meta.hide %} + {% endif %} + + {% endif %} + {% if "toc.integrate" not in features %} + {% if page.meta and page.meta.hide %} + {% set hidden = "hidden" if "toc" in page.meta.hide %} + {% endif %} + + {% endif %} + + {% endblock %} diff --git a/contrib/pg_tde/documentation/_resourcepdf/overrides/partials/banner.html b/contrib/pg_tde/documentation/_resourcepdf/overrides/partials/banner.html new file mode 100644 index 0000000000000..e75867643dc29 --- /dev/null +++ b/contrib/pg_tde/documentation/_resourcepdf/overrides/partials/banner.html @@ -0,0 +1,9 @@ +
+

+

For help, click the link below to get free database assistance or contact our experts for personalized support.

+ + +
\ No newline at end of file diff --git a/contrib/pg_tde/documentation/_resourcepdf/overrides/partials/copyright.html b/contrib/pg_tde/documentation/_resourcepdf/overrides/partials/copyright.html new file mode 100644 index 0000000000000..d31be105f453b --- /dev/null +++ b/contrib/pg_tde/documentation/_resourcepdf/overrides/partials/copyright.html @@ -0,0 +1,14 @@ +{#- + This file was automatically generated - do not edit + -#} + \ No newline at end of file diff --git a/contrib/pg_tde/documentation/_resourcepdf/overrides/partials/header.html b/contrib/pg_tde/documentation/_resourcepdf/overrides/partials/header.html new file mode 100644 index 0000000000000..1983ab1baef50 --- /dev/null +++ b/contrib/pg_tde/documentation/_resourcepdf/overrides/partials/header.html @@ -0,0 +1,135 @@ + + + +{% set class = "md-header" %} +{% if "navigation.tabs.sticky" in features %} + {% set class = class ~ " md-header--shadow md-header--lifted" %} +{% elif "navigation.tabs" not in features %} + {% set class = class ~ " md-header--shadow" %} +{% endif %} + + +
+ + + + + + + + {% if "navigation.tabs.sticky" in features %} + {% if "navigation.tabs" in features %} + {% include "partials/tabs.html" %} + {% endif %} + {% endif %} +
diff --git a/contrib/pg_tde/documentation/docs/advanced-topics/tech-reference.md b/contrib/pg_tde/documentation/docs/advanced-topics/tech-reference.md new file mode 100644 index 0000000000000..309a0b1bf73aa --- /dev/null +++ b/contrib/pg_tde/documentation/docs/advanced-topics/tech-reference.md @@ -0,0 +1,7 @@ +# Overview of technical capabilities + +This section covers the internal components and tools that power `pg_tde`. + +Use it to understand how encryption is implemented, fine-tune a configuration, leverage advanced CLI tools and functions for diagnostics and customization. + +[Architecture](../architecture/architecture.md){.md-button} [GUC Variables](../variables.md){.md-button} [Functions](../functions.md){.md-button} diff --git a/contrib/pg_tde/documentation/docs/apt.md b/contrib/pg_tde/documentation/docs/apt.md index 2ecd9eb232f85..2751eb89e7d2d 100644 --- a/contrib/pg_tde/documentation/docs/apt.md +++ b/contrib/pg_tde/documentation/docs/apt.md @@ -1,55 +1,54 @@ -# Install `pg_tde` on Debian or Ubuntu +# Install pg_tde on Debian or Ubuntu -This tutorial shows how to install `pg_tde` with [Percona Distribution for PostgreSQL :octicons-link-external-16:](https://docs.percona.com/postgresql/latest/index.html). +This page explains how to install `pg_tde` with [Percona Distribution for PostgreSQL :octicons-link-external-16:](https://docs.percona.com/postgresql/latest/index.html). -Check the [list of supported platforms](install.md#__tabbed_1_1). +Check the [list of supported platforms](install.md#__tabbed_1_1) before continuing. ## Preconditions 1. Debian and other systems that use the `apt` package manager include the upstream PostgreSQL server package (`postgresql-{{pgversion17}}`) by default. You need to uninstall this package before you install Percona Server for PostgreSQL and `pg_tde` to avoid conflicts. 2. You need the `percona-release` repository management tool that enables the desired Percona repository for you. - -### Install `percona-release` {.power-number} +### Install percona-release {.power-number} 1. You need the following dependencies to install `percona-release`: - + - `wget` - `gnupg2` - `curl` - `lsb-release` - + Install them with the following command: - + ```{.bash data-prompt="$"} - $ sudo apt-get install -y wget gnupg2 curl lsb-release + sudo apt-get install -y wget gnupg2 curl lsb-release ``` - + 2. Fetch the `percona-release` package ```{.bash data-prompt="$"} - $ sudo wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb + sudo wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb ``` 3. Install `percona-release` ```{.bash data-prompt="$"} - $ sudo dpkg -i percona-release_latest.generic_all.deb + sudo dpkg -i percona-release_latest.generic_all.deb ``` 4. Enable the Percona Distribution for PostgreSQL repository ```{.bash data-prompt="$"} - $ sudo percona-release enable-only ppg-{{pgversion17}} + sudo percona-release enable-only ppg-{{pgversion17}} ``` 6. Update the local cache - ```bash + ```{.bash data-prompt="$"} sudo apt-get update ``` -## Install `pg_tde` {.power-number} +## Install pg_tde {.power-number} !!! important @@ -60,19 +59,17 @@ Check the [list of supported platforms](install.md#__tabbed_1_1). The use of the `CASCADE` parameter deletes all tables that were created in the database with `pg_tde` enabled and also all dependencies upon the encrypted table (e.g. foreign keys in a non-encrypted table used in the encrypted one). ```sql - DROP EXTENSION pg_tde CASCADE + DROP EXTENSION pg_tde CASCADE; ``` 2. Uninstall the `percona-postgresql-17-pg-tde` package. After all [preconditions](#preconditions) are met, run the following command to install `pg_tde`: - ```{.bash data-prompt="$"} -$ sudo apt-get install -y percona-postgresql-17 +sudo apt-get install -y percona-postgresql-17 ``` +## Next steps -## Next step - -[Setup :material-arrow-right:](setup.md){.md-button} +[Configure pg_tde :material-arrow-right:](setup.md){.md-button} diff --git a/contrib/pg_tde/documentation/docs/architecture/architecture.md b/contrib/pg_tde/documentation/docs/architecture/architecture.md new file mode 100644 index 0000000000000..aee77772ece98 --- /dev/null +++ b/contrib/pg_tde/documentation/docs/architecture/architecture.md @@ -0,0 +1,339 @@ +# Architecture + +`pg_tde` is a **customizable, complete, data at rest encryption extension** for PostgreSQL. + +The following sections break down the key architectural components of this design. + +**Customizable** means that `pg_tde` aims to support many different use cases: + +* Encrypting either every table in every database or only some tables in some databases +* Encryption keys can be stored on various external key storage servers including HashiCorp Vault and KMIP servers. +* Using one key for everything or different keys for different databases +* Storing every key on the same key storage, or using different storages for different databases +* Handling permissions: who can manage database specific or global permissions, who can create encrypted or not encrypted tables + +**Complete** means that `pg_tde` aims to encrypt data at rest. + +**Data at rest** means everything written to the disk. This includes the following: + +* Table data files +* Indexes +* Sequences +* Temporary tables +* Write Ahead Log (WAL) + +**Extension** means that `pg_tde` should be implemented only as an extension, possibly compatible with any PostgreSQL distribution, including the open source community version. This requires changes in the PostgreSQL core to make it more extensible. Therefore, `pg_tde` currently works only with the [Percona Server for PostgreSQL](https://docs.percona.com/postgresql/17/index.html) - a binary replacement of community PostgreSQL and included in Percona Distribution for PostgreSQL. + +## Main components + +The main components of `pg_tde` are the following: + +* **Core server changes** focus on making the server more extensible, allowing the main logic of `pg_tde` to remain separate, as an extension. Core changes also add encryption-awareness to some command line tools that have to work directly with encrypted tables or encrypted WAL files. + + [Percona Server for PostgreSQL location](https://github.com/percona/postgres/tree/{{tdebranch}}) + +* The **`pg_tde` extension itself** implements the encryption code by hooking into the extension points introduced in the core changes, and the already existing extension points in the PostgreSQL server. + + Everything is controllable with GUC variables and SQL statements, similar to other extensions. + +* The **keyring API / libraries** implement the key storage logic with different key providers. The API is internal only, the keyring libraries are part of the main library for simplicity. +In the future these could be extracted into separate shared libraries with an open API, allowing the use of third-party providers. + +## Encryption architecture + +### Two-key hierarchy + +`pg_tde` uses two kinds of keys for encryption: + +* Internal keys to encrypt the data. They are stored in PostgreSQL's data directory under `$PGDATA/pg_tde`. +* Higher-level keys to encrypt internal keys. These keys are called *principal keys*. They are stored externally, in a Key Management System (KMS) using the key provider API. + +`pg_tde` uses one principal key per database. Every internal key for the given database is encrypted using this principal key. + +Internal keys are used for specific database files: each file with a different [Object Identifier (OID)](https://www.postgresql.org/docs/current/datatype-oid.html) has a different internal key. + +This means that, for example, a table with 4 indexes will have at least 5 internal keys - one for the table, and one for each index. + +If a table has additional associated relations, such as sequences or a TOAST table, those relations will also have separate keys. + +### Encryption algorithm + +`pg_tde` currently uses the following encryption algorithms: + +* `AES-128-CBC` for encrypting database files; encrypted with internal keys. + +* `AES-128-CTR` for WAL encryption; encrypted with internal keys. + +* `AES-128-GCM` for encrypting internal keys; encrypted with the principal key. + +Support for other cipher lengths / algorithms is planned in the future. + +### Encryption workflow + +`pg_tde` makes it possible to encrypt everything or only some tables in some databases. + +To support this without metadata changes, encrypted tables are labeled with a `tde_heap` access method marker. + +The `tde_heap` access method is the same as the `heap` one. It uses the same functions internally without any changes, but with the different name and ID. In such a way `pg_tde` knows that `tde_heap` tables are encrypted and `heap` tables are not. + +The initial decision what to encrypt is made using the `postgres` event trigger mechanism: if a `CREATE TABLE` or `ALTER TABLE` statement uses the `tde_heap` clause, the newly created data files are marked as encrypted. Then file operations encrypt or decrypt the data. + +Later decisions are made using a slightly modified Storage Manager (SMGR) API: when a database file is re-created with a different ID as a result of a `TRUNCATE` or a `VACUUM FULL` command, the newly created file inherits the encryption information and is either encrypted or not. + +### WAL encryption + +WAL encryption is controlled globally via a global GUC variable, `pg_tde.wal_encrypt`, that requires a server restart. + +WAL keys also contain the [LSN](https://www.postgresql.org/docs/17/wal-internals.html) of the first WAL write after key creation. This allows `pg_tde` to know which WAL ranges are encrypted or not and with which key. + +The setting only controls writes so that only WAL writes are encrypted when WAL encryption is enabled. This means that WAL files can contain both encrypted and unencrypted data, depending on what the status of this variable was when writing the data. + +`pg_tde` keeps track of the encryption status of WAL records using internal keys. When the server is restarted it writes a new internal key if WAL encryption is enabled, or if it is disabled and was previously enabled it writes a dummy key signaling that WAL encryption ended. + +With this information the WAL reader code can decide if a specific WAL record has to be decrypted or not and which key it should use to decrypt it. + +### Encrypting other access methods + +Currently `pg_tde` only encrypts `heap` tables and other files such as indexes, TOAST tables, sequences that are related to the `heap` tables. + +Indexes include any kind of index that goes through the SMGR API, not just the built-in indexes in PostgreSQL. + +In theory, it is also possible to encrypt any other table access method that goes through the SMGR API by similarly providing a marker access method to it and extending the event triggers. + +### Storage Manager (SMGR) API + +`pg_tde` relies on a slightly modified version of the SMGR API. These modifications include: + +* Making the API generally extensible, where extensions can inject custom code into the storage manager +* Adding tracking information for files. When a new file is created for an existing relation, references to the existing file are also passed to the SMGR functions + +With these modifications, the `pg_tde` extension can implement an additional layer on top of the normal Magnetic Disk SMGR API: if the related table is encrypted, `pg_tde` encrypts a file before writing it to the disk and, similarly, decrypts it after reading when needed. + +## Key and key provider management + +### Principal key rotation + +You can rotate principal keys to comply with common policies and to handle situations with potentially exposed principal keys. + +Rotation means that `pg_tde` generates a new version of the principal key, and re-encrypts the associated internal keys with the new key. The old principal key is kept as is at the same location, because it may still be needed to decrypt backups or other databases. + +### Internal key regeneration + +Internal keys for tables, indexes and other data files are fixed once a file is created. There's no way to re-encrypt a file. + +There are workarounds for this, because operations that move the table data to a new file, such as `VACUUM FULL` or an `ALTER TABLE` that rewrites the file will create a new key for the new file, essentially rotating the internal key. This however means taking an exclusive lock on the table for the duration of the operation, which might not be desirable for huge tables. + +WAL internal keys are also fixed to the respective ranges. To generate a new WAL key you need to restart the database. + +### Internal key storage + +Internal keys and `pg_tde` metadata in general are kept in a single `$PGDATA/pg_tde` directory. This directory stores separate files for each database, such as: + +* Encrypted internal keys and internal key mapping to tables +* Information about the key providers + +Also, the `$PGDATA/pg_tde` directory has a special global section marked with the OID `1664`, which includes the global key providers and global internal keys. + +The global section is used for WAL encryption. Specific databases can use the global section too, for scenarios where users configure individual principal keys for databases but use the same global key provider. For this purpose, you must enable the global provider inheritance. + +The global default principal key uses the special OID `1663`. + +### Key providers (principal key storage) + +Principal keys are stored externally in a Key Management Services (KMS). In `pg_tde`a KMS is defined as an external key provider. + +The following key providers are supported: + +* [HashiCorp Vault](https://developer.hashicorp.com/vault/docs/what-is-vault) KV2 secrets engine +* [OpenBao](https://openbao.org/) implementation of Vault +* KMIP compatible servers +* A local file storage. This storage is intended only for development and testing and is not recommended for production use. + +For each key provider `pg_tde` requires a detailed configuration including the address of the service and the authentication information. + +With these details `pg_tde` does the following based on user operations: + +* Uploads a new principal key to it after this key is created +* Retrieves the principal key from the service when it is required for decryption + +Retrieval of the principal key is cached so it only happens when necessary. + +### Key provider management + +Key provider configuration or location may change. For example, a service is moved to a new address or the principal key must be moved to a different key provider type. `pg_tde` supports both these scenarios enabling you to manage principal keys using simple [SQL functions](../functions.md#key-provider-management). + +In certain cases you can't use SQL functions to manage key providers. For example, if the key provider changed while the server wasn't running and is therefore unaware of these changes. The startup can fail if it needs to access the encryption keys. + +For such situations, `pg_tde` also provides [command line tools](../command-line-tools/cli-tools.md) to recover the database. + +### Sensitive key provider information + +!!! important + Authentication details for key providers are sensitive and must be protected. + Do not store these credentials in the `$PGDATA` directory alongside the database. Instead, ensure they are stored in a secure location with strict file system permissions to prevent unauthorized access. + +## User interface + +### Set up pg_tde + +To get started with `pg_tde`, follow these steps: + +* Add `pg_tde` to the `shared_preload_libraries` in `postgresql.conf` as this is required for the SMGR extensions +* Execute `CREATE EXTENSION pg_tde` in the databases where they want to use encryption +* Optionally, enable `pg_tde.wal_encrypt` in `postgresql.conf` +* Optionally, disable `pg_tde.inherit_global_providers` in `postgresql.conf` (it is enabled by default) + +### Add providers + +You can add keyring providers to either the global or database specific scope. + +If `pg_tde.inherit_global_providers` is `on`, global providers are visible for all databases, and can be used. +If `pg_tde.inherit_global_providers` is `off`, global providers are only used for WAL encryption. + +To add a global provider: + +```sql +pg_tde_add_global_key_provider_('provider_name', ... details ...) +``` + +To add a database specific provider: + +```sql +pg_tde_add_database_key_provider_('provider_name', ... details ...) +``` + +### Change providers + +To change a value of a global provider: + +```sql +pg_tde_change_global_key_provider_('provider_name', ... details ...) +``` + +To change a value of a database specific provider: + +```sql +pg_tde_change_database_key_provider_('provider_name', ... details ...) +``` + +These functions also allow changing the type of a provider but **do not** migrate any data. They are expected to be used during infrastructure migration, for example when the address of a server changes. + +### Change providers from the command line + +To change a provider from a command line, `pg_tde` provides the `pg_tde_change_key_provider` command line tool. + +This tool work similarly to the above functions, with the following syntax: + +```sh +pg_tde_change_key_provider ... details ... +``` + +!!! note + Since this tool is expected to be offline, it bypasses all permission checks. This is also the reason why it requires a `dbOid` instead of a name, as it has no way to process the catalog and look up names. + + This tool does not validate any parameters. + +### Delete providers + +Providers can be deleted by using the following functions: + +```sql +pg_tde_delete_database_key_provider(provider_name) +pg_tde_delete_global_key_provider(provider_name) +``` + +For database specific providers, the function first checks if the provider is used or not, and the provider is only deleted if it's not used. + +For global providers, the function checks if the provider is used anywhere, WAL or any specific database, and returns an error if it is. + +### List/query providers + +`pg_tde` provides 2 functions to show providers: + +* `pg_tde_list_all_database_key_providers()` +* `pg_tde_list_all_global_key_providers()` + +These functions return a list of provider names, type and configuration. + +### Provider permissions + +`pg_tde` implements access control based on execution rights on the administration functions. + +For keys and providers administration, it provides two pair of functions: + +```sql +pg_tde_GRANT_database_key_management_TO_role +pg_tde_REVOKE_database_key_management_FROM_role +``` + +### Create and rotate keys + +Principal keys can be created using the following functions: + +```sql +pg_tde_create_key_using_(global/database)_key_provider('key-name', 'provider-name') +``` + +Principal keys can be used or rotated using the following functions: + +```sql +pg_tde_set_key_using_(global/database)_key_provider('key-name', 'provider-name') +pg_tde_set_server_key_using_(global/database)_key_provider('key-name', 'provider-name') +pg_tde_set_default_key_using_(global/database)_key_provider('key-name', 'provider-name') +``` + +### Default principal key + +With `pg_tde.inherit_global_key_providers`, it is also possible to set up a default global principal key, which will be used by any database which has the `pg_tde` extension enabled, but doesn't have a database specific principal key configured using `pg_tde_set_key_using_(global/database)_key_provider`. + +With this feature, it is possible for the entire database server to easily use the same principal key for all databases, completely disabling multi-tenancy. + +#### Manage a default key + +You can manage a default key with the following functions: + +* `pg_tde_create_key_using_global_key_provider('key-name','provider-name')` +* `pg_tde_set_default_key_using_global_key_provider('key-name','provider-name')` +* `pg_tde_delete_default_key()` + +!!! note + `pg_tde_delete_default_key()` is only possible if there's no database currently using the default principal key. + Changing the default principal key will rotate the encryption of internal keys for all databases using the current default principal key. + +#### Delete a key + +The `pg_tde_delete_key()` function unsets the principal key for the current database. If the current database has any encrypted tables, and there isn’t a default principal key configured, it reports an error instead. If there are encrypted tables, but there’s also a default principal key, internal keys will be encrypted with the default key. + +!!! note + WAL keys **cannot** be unset, as server keys are managed separately. + +### Current key details + +`pg_tde_key_info()` returns the name of the current principal key, and the provider it uses. + +`pg_tde_server_key_info()` does the same for the server key. + +`pg_tde_default_key_info()` does the same for the default key. + +`pg_tde_verify_key()` checks that the key provider is accessible, that the current principal key can be downloaded from it, and that it is the same as the current key stored in memory - if any of these fail, it reports an appropriate error. + +### Key permissions + +Users with management permissions to a specific database `(pg_tde_(grant/revoke)_(global/databse)_key_management_(to/from)_role)` can change the keys for the database, and use the current key functions. This includes creating keys using global providers, if `pg_tde.inherit_global_providers` is enabled. + +Also the `pg_tde_(grant/revoke)_database_key_management_to_role` function deals with only the specific permission for the above function: it allows a user to change the key for the database, but not to modify the provider configuration. + +### Create encrypted tables + +To create an encrypted table or modify an existing table to be encrypted, use the following commands: + +```sql +CREATE TABLE t1(a INT) USING tde_heap; +ALTER TABLE t1 SET ACCESS METHOD tde_heap; +``` + +### Change the pg_tde.inherit_global_keys setting + +It is possible to use `pg_tde` with `inherit_global_keys = on`, refer to the global keys or keyrings in databases, and then change this setting to `off`. + +In this case, existing references to global providers or the global default principal key keep working as before, but new references to the global scope cannot be made. diff --git a/contrib/pg_tde/documentation/docs/command-line-tools.md b/contrib/pg_tde/documentation/docs/command-line-tools.md deleted file mode 100644 index e5b2763529bd4..0000000000000 --- a/contrib/pg_tde/documentation/docs/command-line-tools.md +++ /dev/null @@ -1,60 +0,0 @@ -# Command line tools - -The `pg_tde` extension provides new command line tools and modifies some existing tools to work with encrypted WAL and tables. - -## pg_tde_change_key_provider - -A tool for modifying the configuration of a key provider, possibly also changing its type. - -This tool edits the configuration files directly, ignoring permissions or running `postgres` processes. - -Its only intended use is to fix servers that can't start up because of inaccessible key providers. - -For example, you restore from an old backup and the address of the key provider changed in the meantime. You can use this tool to correct the configuration, allowing the server to start up. - -Use this tool **only when the server is offline.** To modify the key provider configuration when the server is up and running, use the [`pg_tde_change_key_provider_`](functions.md#change-an-existing-provider) SQL functions. - -### Usage - -To modify the key provider configuration, specify all parameters depending on the provider type in the same way as you do when using the [`pg_tde_change_key_provider_`](functions.md#change-an-existing-provider) SQL functions. - -The general syntax is as follows: - -``` -pg_tde_change_key_provider [-D ] -``` - -where : - -* [optional] `` is the data directory. When not specified, `pg_tde` uses the `$PGDATA` value. -* `` is the name you assigned to the key provider -* `` can be a `file`, `vault` or `kmip`. -* `` - - -Depending on the provider type, the additional parameters are: - -``` -pg_tde_change_key_provider [-D ] file -pg_tde_change_key_provider [-D ] vault [] -pg_tde_change_key_provider [-D ] kmip [] -``` - -## pg_waldump - -[`pg_waldump` :octicons-link-external-16:](https://www.postgresql.org/docs/current/pgwaldump.html) is a tool to display a human-readable rendering of the write-ahead log of a PostgreSQL database cluster. - -To read encrypted WAL records, `pg_waldump` supports the following additional arguments: - -* `keyring_path`: the directory where keyring config files for WAL are stored. These files are: - - * `pg_tde.map`, - * `pg_tde.dat`, - * `pg_tde_keyrings` - -`pg_waldump` will not try to decrypt WAL if the `keyring_path` is not set. - -## pg_checksums - -[`pg_checksums` :octicons-link-external-16:](https://www.postgresql.org/docs/current/app-pgchecksums.html) cannot calculate checksums for encrypted files. -It skips encrypted files and reports this in the output. diff --git a/contrib/pg_tde/documentation/docs/command-line-tools/cli-tools.md b/contrib/pg_tde/documentation/docs/command-line-tools/cli-tools.md new file mode 100644 index 0000000000000..aac0c8d2f0680 --- /dev/null +++ b/contrib/pg_tde/documentation/docs/command-line-tools/cli-tools.md @@ -0,0 +1,18 @@ +# Overview of pg_tde CLI tools + +The `pg_tde` extension introduces new command-line utilities and extends some existing PostgreSQL tools to support encrypted WAL and tables. + +## New tools + +These tools are introduced by `pg_tde` to support key rotation and WAL encryption workflows: + +* [pg_tde_change_key_provider](./pg-tde-change-key-provider.md): change the encryption key provider for a database +* [pg_tde_archive_decrypt](./pg-tde-archive-decrypt.md): decrypts WAL before archiving +* [pg_tde_restore_encrypt](./pg-tde-restore-encrypt.md): a custom restore command for making sure the restored WAL is encrypted + +## Extended tools + +These existing PostgreSQL tools are enhanced to support `pg_tde`: + +* [pg_checksums](./pg-tde-checksums.md): verify data checksums (non-encrypted files only) +* [pg_waldump](./pg-waldump.md): inspect and decrypt WAL files diff --git a/contrib/pg_tde/documentation/docs/command-line-tools/pg-tde-archive-decrypt.md b/contrib/pg_tde/documentation/docs/command-line-tools/pg-tde-archive-decrypt.md new file mode 100644 index 0000000000000..26a80eda80558 --- /dev/null +++ b/contrib/pg_tde/documentation/docs/command-line-tools/pg-tde-archive-decrypt.md @@ -0,0 +1,57 @@ +# pg_tde_archive_decrypt + +The `pg_tde_archive_decrypt` tool wraps an archive command and decrypts WAL files before archiving. It allows external tools to access unencrypted WAL data, which is required because WAL encryption keys in the two-key hierarchy are host-specific and may not be available on the replay host. + +!!! tip + For more information on the encryption architecture and key hierarchy, see [Architecture](../architecture/architecture.md). + +This tool is often used in conjunction with [pg_tde_restore_encrypt](./pg-tde-restore-encrypt.md) to support WAL archive. + +## How it works + +1. Decrypts the WAL segment to a temporary file on a RAM disk (`/dev/shm`) +2. Replaces `%p` and `%f` in the archive command with the path and name of the decrypted file +3. Executes the archive command + +!!! note + + To ensure security, encrypt the files stored in your WAL archive using tools like `PgBackRest`. + +## Usage + +```bash +pg_tde_archive_decrypt [OPTION] +pg_tde_archive_decrypt DEST-NAME SOURCE-PATH ARCHIVE-COMMAND +``` + +## Parameter descriptions + +* `DEST-NAME`: name of the WAL file to send to the archive +* `SOURCE-PATH`: path to the original encrypted WAL file +* `ARCHIVE-COMMAND`: archive command to wrap. `%p` and `%f` are replaced with the decrypted WAL file path and WAL file name, respectively. + +## Options + +* `-V, --version`: show version information, then exit +* `-?, --help`: show help information, then exit + +!!! note + + Any `%f` or `%p` parameter in `ARCHIVE-COMMAND` has to be escaped as `%%f` or `%%p` respectively if used as `archive_command` in `postgresql.conf`. + +## Examples + +### Using `cp` + +```ini +archive_command='pg_tde_archive_decrypt %f %p "cp %%p /mnt/server/archivedir/%%f"' +``` + +### Using `PgBackRest` + +```ini +archive_command='pg_tde_archive_decrypt %f %p "pgbackrest --stanza=your_stanza archive-push %%p"' +``` + +!!! warning + When using PgBackRest with WAL encryption, disable PostgreSQL data checksums. Otherwise, PgBackRest may spam error messages, and in some package builds the log statement can cause crashes. diff --git a/contrib/pg_tde/documentation/docs/command-line-tools/pg-tde-change-key-provider.md b/contrib/pg_tde/documentation/docs/command-line-tools/pg-tde-change-key-provider.md new file mode 100644 index 0000000000000..4a94de9c84cce --- /dev/null +++ b/contrib/pg_tde/documentation/docs/command-line-tools/pg-tde-change-key-provider.md @@ -0,0 +1,36 @@ +# pg_tde_change_key_provider + +A tool for modifying the configuration of a key provider, possibly also changing its type. + +This tool edits the configuration files directly, ignoring permissions or running `postgres` processes. + +Its only intended use is to fix servers that can't start up because of inaccessible key providers. + +For example, you restore from an old backup and the address of the key provider changed in the meantime. You can use this tool to correct the configuration, allowing the server to start up. + +:material-information: Warning: Use this tool **only when the server is offline.** To modify the key provider configuration when the server is up and running, use the [`pg_tde_change_(global/database)_key_provider_`](../functions.md#change-an-existing-provider) SQL functions. + +## Example usage + +To modify the key provider configuration, specify all parameters depending on the provider type in the same way as you do when using the [`pg_tde_change_(global/database)_key_provider_`](../functions.md#change-an-existing-provider) SQL functions. + +The general syntax is as follows: + +```sh +pg_tde_change_key_provider [-D ] +``` + +## Parameter description + +* [optional] `` is the data directory.`pg_tde` uses the `$PGDATA` environment variable if this is not specified +* `` is the name you assigned to the key provider +* `` can be a `file`, `vault` or `kmip` +* `` + +Depending on the provider type, the additional parameters are: + +```sh +pg_tde_change_key_provider [-D ] file +pg_tde_change_key_provider [-D ] vault-v2 [] +pg_tde_change_key_provider [-D ] kmip [] +``` diff --git a/contrib/pg_tde/documentation/docs/command-line-tools/pg-tde-checksums.md b/contrib/pg_tde/documentation/docs/command-line-tools/pg-tde-checksums.md new file mode 100644 index 0000000000000..391182dcd59c6 --- /dev/null +++ b/contrib/pg_tde/documentation/docs/command-line-tools/pg-tde-checksums.md @@ -0,0 +1,5 @@ +# pg_checksums + +[`pg_checksums` :octicons-link-external-16:](https://www.postgresql.org/docs/current/app-pgchecksums.html) is a PostgreSQL command-line utility used to enable, disable, or verify data checksums on a PostgreSQL data directory. However, it cannot calculate checksums for encrypted files. + +Encrypted files are skipped, and this is reported in the output. diff --git a/contrib/pg_tde/documentation/docs/command-line-tools/pg-tde-restore-encrypt.md b/contrib/pg_tde/documentation/docs/command-line-tools/pg-tde-restore-encrypt.md new file mode 100644 index 0000000000000..8ea0993404c47 --- /dev/null +++ b/contrib/pg_tde/documentation/docs/command-line-tools/pg-tde-restore-encrypt.md @@ -0,0 +1,52 @@ +# pg_tde_restore_encrypt + +The `pg_tde_restore_encrypt` tool wraps a normal restore command from the WAL archive and writes them to disk in a format compatible with `pg_tde`. + +!!! note + + This command is often use together with [pg_tde_archive_decrypt](./pg-tde-archive-decrypt.md). + +## How it works + +1. Replaces `%f` and `%p` in the restore command with the WAL file name and temporary file path (in `/dev/shm`) +2. Runs the restore command to fetch the unencrypted WAL from the archive and write it to the temp file +3. Encrypts the temp file and writes it to the destination path in PostgreSQL’s data directory + +## Usage + +```bash +pg_tde_restore_encrypt [OPTION] +pg_tde_restore_encrypt SOURCE-NAME DEST-PATH RESTORE-COMMAND +``` + +## Parameter descriptions + +* `SOURCE-NAME`: name of the WAL file to retrieve from the archive +* `DEST-PATH`: path where the encrypted WAL file should be written +* `RESTORE-COMMAND`: restore command to wrap; `%p` and `%f` are replaced with the WAL file name and path to write the unencrypted WAL, respectively + +## Options + +* `-V, --version`: show version information, then exit +* `-?, --help`: show help information, then exit + +!!! note + + Any `%f` or `%p` parameter in `RESTORE-COMMAND` has to be escaped as `%%f` or `%%p` respectively if used as `restore_command` in `postgresql.conf`. + +## Examples + +### Using `cp` + +```ini +restore_command='pg_tde_restore_encrypt %f %p "cp /mnt/server/archivedir/%%f %%p"' +``` + +### Using `PgBackRest` + +```ini +restore_command='pg_tde_restore_encrypt %f %p "pgbackrest --stanza=your_stanza archive-get %%f \"%%p\""' +``` + +!!! warning + When using PgBackRest with WAL encryption, disable PostgreSQL data checksums. Otherwise, PgBackRest may spam error messages, and in some package builds the log statement can cause crashes. diff --git a/contrib/pg_tde/documentation/docs/command-line-tools/pg-waldump.md b/contrib/pg_tde/documentation/docs/command-line-tools/pg-waldump.md new file mode 100644 index 0000000000000..a3ac50df4df02 --- /dev/null +++ b/contrib/pg_tde/documentation/docs/command-line-tools/pg-waldump.md @@ -0,0 +1,12 @@ +# pg_waldump + +[`pg_waldump` :octicons-link-external-16:](https://www.postgresql.org/docs/current/pgwaldump.html) is a tool to display a human-readable rendering of the Write-Ahead Log (WAL) of a PostgreSQL database cluster. + +To read encrypted WAL records, `pg_waldump` supports the following additional arguments: + +* `keyring_path` is the directory where the keyring configuration files for WAL are stored. The following files are included: + * `1664_keys` + * `1664_providers` + +!!! note + `pg_waldump` does not decrypt WAL unless the `keyring_path` is set. diff --git a/contrib/pg_tde/documentation/docs/contribute.md b/contrib/pg_tde/documentation/docs/contribute.md index c728f333f49d0..841bbbf64fcc8 100644 --- a/contrib/pg_tde/documentation/docs/contribute.md +++ b/contrib/pg_tde/documentation/docs/contribute.md @@ -1,4 +1,4 @@ -# Contributing guide +# Contributing Guide Welcome to `pg_tde` - the Transparent Data Encryption extension for PostgreSQL! @@ -54,9 +54,9 @@ When you work, you should periodically run tests to check that your changes don To run the tests, use the following command: -``` +```sh source ci_scripts/setup-keyring-servers.sh -ci_scripts/make-test.sh +ci_scripts/make-test.sh all ``` You can run tests on your local machine with whatever operating system you have. After you submit the pull request, we will check your patch on multiple operating systems. @@ -108,6 +108,7 @@ The steps are the following: ```sh git clone --recursive git@github.com:/postgres.git +``` 3. Change the directory to `contrib/pg_tde` and add the remote upstream repository: diff --git a/contrib/pg_tde/documentation/docs/css/design.css b/contrib/pg_tde/documentation/docs/css/design.css index 2e14d20e5853a..d2a6c3cb59bf6 100644 --- a/contrib/pg_tde/documentation/docs/css/design.css +++ b/contrib/pg_tde/documentation/docs/css/design.css @@ -93,7 +93,7 @@ /* Accent */ --md-accent-fg-color: var(--sky500); - + /* Footer */ --md-footer-fg-color: var(--stone900); --md-footer-fg-color--light: rgba(44,50,62,0.72); @@ -732,4 +732,4 @@ i[warning] [class*="moji"] { padding: 1em; } } -/**/ \ No newline at end of file +/**/ diff --git a/contrib/pg_tde/documentation/docs/css/extra.css b/contrib/pg_tde/documentation/docs/css/extra.css index c857532bb8797..38b682c08a883 100644 --- a/contrib/pg_tde/documentation/docs/css/extra.css +++ b/contrib/pg_tde/documentation/docs/css/extra.css @@ -5,9 +5,9 @@ left: 0.6rem; } -} +} .md-sidebar__inner { font-size: 0.65rem; /* Font size */ line-height: 1.6; -} \ No newline at end of file +} diff --git a/contrib/pg_tde/documentation/docs/css/landing.css b/contrib/pg_tde/documentation/docs/css/landing.css index df69386e85e9a..f8a16c5e62519 100644 --- a/contrib/pg_tde/documentation/docs/css/landing.css +++ b/contrib/pg_tde/documentation/docs/css/landing.css @@ -1,4 +1,3 @@ - /* Type */ .landing h1, @@ -250,7 +249,7 @@ a.splash-card img { line-height: 1.4; display: -webkit-box; -webkit-line-clamp: 3; - -webkit-box-orient: vertical; + -webkit-box-orient: vertical; overflow: hidden; text-overflow: ellipsis; max-height: 2.8em; @@ -298,4 +297,4 @@ a.splash-card img { [data-news] [data-article] { flex: 1 1 100%; } -} \ No newline at end of file +} diff --git a/contrib/pg_tde/documentation/docs/css/osano.css b/contrib/pg_tde/documentation/docs/css/osano.css index b89fa6ac21069..c937cb503e8e5 100644 --- a/contrib/pg_tde/documentation/docs/css/osano.css +++ b/contrib/pg_tde/documentation/docs/css/osano.css @@ -14,7 +14,7 @@ .osano-cm-dialog { font-size: 0.75em; padding: 2em 1em; - color: var(--md-typeset-color); + color: var(--md-typeset-color); background: var(--md-footer-bg-color--dark); } .osano-cm-header, @@ -203,4 +203,4 @@ .osano-cm-dialog--type_bar .osano-cm-dialog__buttons { max-width: 20em; } -} \ No newline at end of file +} diff --git a/contrib/pg_tde/documentation/docs/css/postgresql.css b/contrib/pg_tde/documentation/docs/css/postgresql.css index e5d70d97d7e6b..f0931b48906e5 100644 --- a/contrib/pg_tde/documentation/docs/css/postgresql.css +++ b/contrib/pg_tde/documentation/docs/css/postgresql.css @@ -58,4 +58,4 @@ .superNav, .md-nav__source { background-color: var(--night500); -} \ No newline at end of file +} diff --git a/contrib/pg_tde/documentation/docs/external-parameters.md b/contrib/pg_tde/documentation/docs/external-parameters.md deleted file mode 100644 index a27e97b03127f..0000000000000 --- a/contrib/pg_tde/documentation/docs/external-parameters.md +++ /dev/null @@ -1,34 +0,0 @@ -# Use external reference to parameters - -To allow storing secrets or any other parameters in a more secure, external location, `pg_tde` -allows users to specify an external reference instead of hardcoded parameters. - -In Alpha1 version, `pg_tde` supports the following external storage methods: - -* `file`, which just stores the data in a simple file specified by a `path`. The file should be -readable to the postgres process. -* `remote`, which uses a HTTP request to retrieve the parameter from the specified `url`. - -## Examples - -To use the file provider with a file location specified by the `remote` method, -use the following command: - -``` -SELECT pg_tde_add_key_provider_file( - 'file-provider', - json_object( 'type' VALUE 'remote', 'url' VALUE 'http://localhost:8888/hello' ) - );" -``` - -Or to use the `file` method, use the following command: - -``` -SELECT pg_tde_add_key_provider_file( - 'file-provider', - json_object( 'type' VALUE 'remote', 'path' VALUE '/tmp/datafile-location' ) - );" -``` - -Any parameter specified to the `add_key_provider` function can be a `json_object` instead of the string, -similar to the above examples. \ No newline at end of file diff --git a/contrib/pg_tde/documentation/docs/faq.md b/contrib/pg_tde/documentation/docs/faq.md index f7b951ba96218..643b247e65cae 100644 --- a/contrib/pg_tde/documentation/docs/faq.md +++ b/contrib/pg_tde/documentation/docs/faq.md @@ -2,16 +2,18 @@ ## Why do I need TDE? +Using TDE provides the following benefits: + - Compliance to security and legal regulations like General Data Protection Regulation (GDPR), Payment Card Industry Data Security Standard (PCI DSS), California Consumer Privacy Act (CCPA), Data Protection Act 2018 (DPA 2018) and others - Encryption of backups. Even when an authorized person gets physical access to a backup, encryption ensures that the data remains unreadable and secure. -- Granular encryption of specific data sets and reducing the performance overhead that encryption brings. +- Granular encryption of specific data sets and reducing the performance overhead that encryption brings. - Additional layer of security to existing security measures ## When and how should I use TDE? If you are dealing with Personally Identifiable Information (PII), data encryption is crucial. Especially if you are involved in areas with strict regulations like: -* financial services where TDE helps to comply with PCI DSS +* financial services where TDE helps to comply with PCI DSS * healthcare and insurance - compliance with HIPAA, HITECH, CCPA * telecommunications, government and education to ensure data confidentiality. @@ -21,18 +23,21 @@ Using TDE helps you avoid the following risks: * Identity theft that may lead to financial fraud and other crimes * Reputation damage leading to loss of customer trust and business * Legal consequences and financial losses for non-compliance with data protection regulations -* Internal threats by misusing unencrypted sensitive data +* Internal threats by misusing unencrypted sensitive data If to translate sensitive data to files stored in your database, these are user data in tables, temporary files, WAL files. TDE has you covered encrypting all these files. -`pg_tde` does not encrypt system catalogs yet. This means that statistics data and database metadata are not encrypted. The encryption of system catalogs is planned for future releases. +`pg_tde` does not encrypt system catalogs yet. This means that statistics data and database metadata are not encrypted. + +## Will logical replication work with pg_tde? +Yes, logical replication works with the encrypted tables. ## I use disk-level encryption. Why should I care about TDE? Encrypting a hard drive encrypts all data, including system, application, and temporary files. -Full disk encryption protects your data from people who have physical access to your device and even if it is lost or stolen. However, it doesn't protect the data after system boot-up: the data is automatically decrypted when the system runs or when an authorized user requests it. +Full disk encryption protects your data from people who have physical access to your device and even if it is lost or stolen. However, it doesn't protect the data after system boot-up: the data is automatically decrypted when the system runs or when an authorized user requests it. Another point to consider is PCI DSS compliance for Personal Account Numbers (PAN) encryption. @@ -44,7 +49,7 @@ Another point to consider is PCI DSS compliance for Personal Account Numbers (PA Note that PCI DSS 3.4.1 is retiring on March 31, 2025. Therefore, consider switching to PCI DSS 4.0. -* **PCI DSS 4.0** standards consider using only disk and partition-level encryption not enough to ensure PAN protection. It requires an additional layer of security that `pg_tde` can provide. +* **PCI DSS 4.0** standards consider using only disk and partition-level encryption not enough to ensure PAN protection. It requires an additional layer of security that `pg_tde` can provide. `pg_tde` focuses specifically on data files and offers more granular control over encrypted data. The data remains encrypted on disk during runtime and when you move it to another directory, another system or storage. An example of such data is backups. They remain encrypted when moved to the backup storage. @@ -52,7 +57,7 @@ Thus, to protect your sensitive data, consider using TDE to encrypt it at the ta ## Is TDE enough to ensure data security? -No. TDE is an additional layer to ensure data security. It protects data at rest. Consider introducing also these measures: +**No.** Transparent Data Encryption (TDE) adds an extra layer of security for data at rest. You should also consider implementing the following additional security features: * Access control and authentication * Strong network security like TLS @@ -60,60 +65,59 @@ No. TDE is an additional layer to ensure data security. It protects data at rest * Regular monitoring and auditing * Additional data protection for sensitive fields (e.g., application-layer encryption) -## How does `pg_tde` make my data safe? +## How does pg_tde make my data safe? `pg_tde` uses two keys to encrypt data: * Internal encryption keys to encrypt the data. These keys are stored internally in an encrypted format, in a single `$PGDATA/pg_tde` directory. -* Principal keys to encrypt internal encryption keys. These keys are stored externally, in the Key Management System (KMS). +* Principal keys to encrypt internal encryption keys. These keys are stored externally, in the Key Management System (KMS). You can use the following KMSs: -* [HashiCorp Vault](https://developer.hashicorp.com/vault/docs/what-is-vault). `pg_tde` supports the KV secrets engine v2 of Vault. +* [HashiCorp Vault](https://developer.hashicorp.com/vault/docs/what-is-vault). `pg_tde` supports the KV secrets engine v2 of Vault, for more information see [Vault Configuration](global-key-provider-configuration/vault.md). * [OpenBao](https://openbao.org/) implementation of Vault -* KMIP-compatible server. KMIP is a standardized protocol for handling cryptographic workloads and secrets management +* KMIP-compatible servers, KMIP is a standardized protocol for handling cryptographic workloads and secrets management, for more information see [KMIP configuration](global-key-provider-configuration/kmip-server.md). -HashiCorp Vault can also act as the KMIP server, managing cryptographic keys for clients that use the KMIP protocol. +!!! note + HashiCorp Vault can also act as a KMIP server, managing cryptographic keys for clients that use the KMIP protocol. + *(KMIP functionality is available in Vault's enterprise edition.)* -Let's break the encryption into two parts: +Let's break the encryption down into two parts: -### Encryption of data files +### Encryption of data files -First, data files are encrypted with internal keys. Each file that has a different OID, has an internal key. For example, a table with 4 indexes will have 5 internal keys - one for the table and one for each index. +First, data files are encrypted with internal keys. Each file that has a different [Object Identifier (OID)](https://www.postgresql.org/docs/current/datatype-oid.html) has an internal key. For example, a table with 4 indexes will have 5 internal keys - one for the table and one for each index. -The initial decision on what file to encrypt is based on the table access method in PostgreSQL. When you run a `CREATE` or `ALTER TABLE` statement with the `USING tde_heap` clause, the newly created data files are marked as encrypted, and then file operations encrypt/decrypt the data. Later, if an initial file is re-created as a result of a `TRUNCATE` or `VACUUM FULL` command, the newly created file inherits the encryption information and is either encrypted or not. +The initial decision on what file to encrypt is based on the table access method in PostgreSQL. When you run a `CREATE` or `ALTER TABLE` statement with the `USING tde_heap` clause, the newly created data files are marked as encrypted, and then file operations encrypt or decrypt the data. Later, if an initial file is re-created as a result of a `TRUNCATE` or `VACUUM FULL` command, the newly created file inherits the encryption information and is either encrypted or not. The principal key is used to encrypt the internal keys. The principal key is stored in the key management store. When you query the table, the principal key is retrieved from the key store to decrypt the table. Then the internal key for that table is used to decrypt the data. ### WAL encryption -WAL encryption is done globally for the entire database cluster. All modifications to any database within a PostgreSQL cluster are written to the same WAL to maintain data consistency and integrity and ensure that PostgreSQL cluster can be restored to a consistent state. Therefore, WAL is encrypted globally. +WAL encryption is done globally for the entire database cluster. All modifications to any database within a PostgreSQL cluster are written to the same WAL to maintain data consistency and integrity and ensure that PostgreSQL cluster can be restored to a consistent state. Therefore, WAL is encrypted globally. When you turn on WAL encryption, `pg_tde` encrypts entire WAL files starting from the first WAL write after the server was started with the encryption turned on. -The same 2-tier approach is used with WAL as with the table data: WAL pages are first encrypted with the internal key. Then the internal key is encrypted with the global principal key. +The same 2-key approach is used with WAL as with the table data: WAL pages are first encrypted with the internal key. Then the internal key is encrypted with the global principal key. You can turn WAL encryption on and off so WAL can contain both encrypted and unencrypted data. The WAL encryption GUC variable influences only writes. Whenever the WAL is being read (by the recovery process or tools), the decision on what should be decrypted is based solely on the metadata of WAL encryption keys. - ## Should I encrypt all my data? -It depends on your business requirements and the sensitivity of your data. Encrypting all data is a good practice but it can have a performance impact. +It depends on your business requirements and the sensitivity of your data. Encrypting all data is a good practice but it can have a performance impact. -Consider encrypting only tables that store sensitive data. You can decide what tables to encrypt and with what key. The [Set up multi-tenancy](multi-tenant-setup.md) section in the documentation focuses on this approach. +Consider encrypting only tables that store sensitive data. You can decide what tables to encrypt and with what key. The [Set up multi-tenancy](how-to/multi-tenant-setup.md) section in the documentation focuses on this approach. We advise encrypting the whole database only if all your data is sensitive, like PII, or if there is no other way to comply with data safety requirements. -## What cipher mechanisms are used by `pg_tde`? +## What cipher mechanisms are used by pg_tde? `pg_tde` currently uses a AES-CBC-128 algorithm. First the internal keys in the datafile are encrypted using the principal key with AES-CBC-128, then the file data itself is again encrypted using AES-CBC-128 with the internal key. For WAL encryption, AES-CTR-128 is used. -The support of other encryption mechanisms such as AES256 is planned for future releases. Reach out to us with your requirements and usage scenarios of other encryption methods are needed. - ## Is post-quantum encryption supported? No, it's not yet supported. In our implementation we reply on OpenSSL libraries that don't yet support post-quantum encryption. @@ -122,7 +126,7 @@ No, it's not yet supported. In our implementation we reply on OpenSSL libraries Yes, you can encrypt an existing table. Run the `ALTER TABLE` command as follows: -``` +```sql ALTER TABLE table_name SET ACCESS METHOD tde_heap; ``` @@ -133,23 +137,23 @@ Since the `SET ACCESS METHOD` command drops hint bits and this may affect the pe You must restart the database in the following cases to apply the changes: * after you enabled the `pg_tde` extension -* to turn on / off the WAL encryption +* when enabling WAL encryption -After that, no database restart is required. When you create or alter the table using the `tde_heap` access method, the files are marked as those that require encryption. The encryption happens at the storage manager level, before a transaction is written to disk. Read more about [how tde_heap works](table-access-method.md#how-tde_heap-works). +After that, no database restart is required. When you create or alter the table using the `tde_heap` access method, the files are marked as those that require encryption. The encryption happens at the storage manager level, before a transaction is written to disk. Read more about [how tde_heap works](index/table-access-method.md#how-tde_heap-works-with-pg_tde). ## What happens to my data if I lose a principal key? If you lose encryption keys, especially, the principal key, the data is lost. That's why it's critical to back up your encryption keys securely and use the Key Management service for key management. -## Can I use `pg_tde` in a multi-tenant setup? +## Can I use pg_tde in a multi-tenant setup? -Multi-tenancy is the type of architecture where multiple users, or tenants, share the same resource. It can be a database, a schema or an entire cluster. +Multi-tenancy is the type of architecture where multiple users, or tenants, share the same resource. It can be a database, a schema or an entire cluster. In `pg_tde`, multi-tenancy is supported via a separate principal key per database. This means that a database owner can decide what tables to encrypt within a database. The same database can have both encrypted and non-encrypted tables. To control user access to the databases, you can use role-based access control (RBAC). -WAL files are encrypted globally across the entire PostgreSQL cluster using the same encryption keys. Users don't interact with WAL files as these are used by the database management system to ensure data integrity and durability. + ## Are my backups safe? Can I restore from them? @@ -159,6 +163,12 @@ Since the encryption happens on the database level, it makes no difference for y To restore from an encrypted backup, you must have the same principal encryption key, which was used to encrypt files in your backup. -## I'm using OpenSSL in FIPS mode and need to use `pg_tde`. Does `pg_tde` comply with FIPS requirements? Can I use my own FIPS-mode OpenSSL library with `pg_tde`? +## I'm using OpenSSL in FIPS mode and need to use pg_tde. Does pg_tde comply with FIPS requirements? Can I use my own FIPS-mode OpenSSL library with pg_tde? Yes. `pg_tde` works with the FIPS-compliant version of OpenSSL, whether it is provided by your operating system or if you use your own OpenSSL libraries. If you use your own libraries, make sure they are FIPS certified. + +## How to rotate internal encryption keys in pg_tde? + +We don't have a dedicated function to rotate internal keys, because a key is effectively rotated any time a table's data file is completely rewritten. Operations like `VACUUM FULL`, `TRUNCATE`, or some but not all `ALTER TABLE` commands automatically generate a new internal key. + +If you're concerned about internal keys being leaked, the best way to address it is by vacuuming the database. This operation rewrites the table's data and, in the process, creates a new internal key. diff --git a/contrib/pg_tde/documentation/docs/features.md b/contrib/pg_tde/documentation/docs/features.md index 3548c6deb22df..1db6fc24f09a1 100644 --- a/contrib/pg_tde/documentation/docs/features.md +++ b/contrib/pg_tde/documentation/docs/features.md @@ -1,20 +1,26 @@ # Features -We provide `pg_tde` in two versions for both PostgreSQL Community and [Percona Server for PostgreSQL](https://docs.percona.com/postgresql/17/). The difference between the versions is in the set of included features which in its turn depends on the Storage Manager API. While PostgreSQL Community uses the default Storage Manager API, Percona Server for PostgreSQL extends the Storage Manager API enabling to integrate custom storage managers. +`pg_tde` is available for [Percona Server for PostgreSQL](https://docs.percona.com/postgresql/17/) +The Percona Server for PostgreSQL provides an extended Storage Manager API that allows integration with custom storage managers. -The following table provides features available for each version: +The following features are available for the extension: -| Percona Server for PostgreSQL version | PostgreSQL Community version (deprecated) | -|-------------------------------|----------------------| -| Table encryption:
- data tables,
- **Index data for encrypted tables**,
- TOAST tables,
- temporary tables created during the database operation.

Metadata of those tables is not encrypted. | Table encryption:
- data tables,
- TOAST tables
- temporary tables created during the database operation.

Metadata of those tables is not encrypted. | -| **Global** Write-Ahead Log (WAL) encryption: for data in encrypted and non-encrypted tables | Write-Ahead Log (WAL) encryption of data in encrypted tables | -| Single-tenancy support via global keyring provider | | -| Multi-tenancy support | Multi-tenancy support | -| Table-level granularity | Table-level granularity | -| Key management via:
- HashiCorp Vault;
- KMIP server;
- Local keyfile | Key management via:
- HashiCorp Vault;
- Local keyfile | -| Logical replication of encrypted tables | | +* [Table encryption](test.md#encrypt-data-in-a-new-table), including: + * Data tables + * Index data for encrypted tables + * TOAST tables + * Temporary tables +!!! note + Metadata of those tables is not encrypted. +* Single-tenancy support via a [global keyring provider](global-key-provider-configuration/set-principal-key.md) +* [Multi-tenancy support](how-to/multi-tenant-setup.md) +* Table-level granularity for encryption and access control +* Multiple [Key management options](global-key-provider-configuration/overview.md) +## Next steps -[Get started](install.md){.md-button} \ No newline at end of file +Learn more about how `pg_tde` implements Transparent Data Encryption: + +[About Transparent Data Encryption :material-arrow-right:](index/about-tde.md){.md-button} diff --git a/contrib/pg_tde/documentation/docs/functions.md b/contrib/pg_tde/documentation/docs/functions.md index a59e1000bb6f7..2452674a67086 100644 --- a/contrib/pg_tde/documentation/docs/functions.md +++ b/contrib/pg_tde/documentation/docs/functions.md @@ -2,69 +2,34 @@ The `pg_tde` extension provides functions for managing different aspects of its operation: -## Permission management - -By default, `pg_tde` is restrictive. It doesn't allow any operations until permissions are granted to the user. Only superusers can run permission management functions to manage user permissions. - -Permissions are based on the normal `EXECUTE` permission on the functions provided by `pg_tde`. Superusers manage them using the `GRANT EXECUTE` and `REVOKE EXECUTE` commands. - -The following functions are also provided for easier management of functionality groups: - -### Database local key management - -Use these functions to grant or revoke permissions to manage permissions for the current database. They enable or disable all functions related to the providers and keys on the current database: - -* `pg_tde_grant_local_key_management_to_role(role)` -* `pg_tde_revoke_local_key_management_from_role(role)` - -### Global scope key management - -Use these functions to grant or revoke permissions to manage permissions for the global scope - the entire PostgreSQL instance. They enable or disable all functions related to the providers and keys for the global scope: - -* `pg_tde_grant_global_key_management_to_role(role)` -* `pg_tde_revoke_global_key_management_from_role(role)` - -### Permission management - -These functions allow or revoke the use of the permissions management functions: - -* `pg_tde_grant_grant_management_to_role(role)` -* `pg_tde_revoke_grant_management_from_role(role)` - - -### Inspections - -Use these functions to grant or revoke the use of query functions, which do not modify the encryption settings: - -* `pg_tde_grant_key_viewer_to_role(role)` -* `pg_tde_revoke_key_viewer_from_role(role)` - +!!! note + If no error is reported when running the commands below, the operation completed successfully. ## Key provider management A key provider is a system or service responsible for managing encryption keys. `pg_tde` supports the following key providers: -* local file (not for production use) -* Hashicorp Vault / OpenBao +* local file (not recommended for production use) +* HashiCorp Vault / OpenBao * KMIP compatible providers Key provider management includes the following operations: -* creating a new key provider, -* changing an existing key provider, -* deleting a key provider, +* creating a new key provider, +* changing an existing key provider, +* deleting a key provider, * listing key providers. -### Add a provider +### Add a key provider You can add a new key provider using the provided functions, which are implemented for each provider type. -There are two functions to add a key provider: one function adds it for the current database and another one - for the global scope. +There are two functions to add a key provider: one function adds it for the current database and another one - for the global scope. -* `pg_tde_add_key_provider_('provider-name', )` +* `pg_tde_add_database_key_provider_('provider-name', )` * `pg_tde_add_global_key_provider_('provider-name', )` -When you add a new provider, the provider name must be unqiue in the scope. But a local database provider and a global provider can have the same name. +When you add a new provider, the provider name must be unique in the scope. But a local database provider and a global provider can have the same name. ### Change an existing provider @@ -72,7 +37,7 @@ You can change an existing key provider using the provided functions, which are There are two functions to change existing providers: one to change a provider in the current database, and another one to change a provider in the global scope. -* `pg_tde_change_key_provider_('provider-name', )` +* `pg_tde_change_database_key_provider_('provider-name', )` * `pg_tde_change_global_key_provider_('provider-name', )` When you change a provider, the referred name must exist in the database local or a global scope. @@ -81,24 +46,52 @@ The `change` functions require the same parameters as the `add` functions. They Provider specific parameters differ for each implementation. Refer to the respective subsection for details. -**Some provider specific parameters contain sensitive information, such as passwords. Never specify these directly, use the remote configuration option instead.** +!!! note + The updated provider must be able to retrieve the same principal keys as the original configuration. + If the new configuration cannot access existing keys, encrypted data and backups will become unreadable. -#### Adding or modifying Vault providers +#### Add or modify Vault providers The Vault provider connects to a HashiCorp Vault or an OpenBao server, and stores the keys on a key-value store version 2. Use the following functions to add the Vault provider: -``` -SELECT pg_tde_add_key_provider_vault_v2('provider-name','secret_token','url','mount','ca_path'); -SELECT pg_tde_add_global_key_provider_vault_v2('provider-name','secret_token','url','mount','ca_path'); +```sql +SELECT pg_tde_add_database_key_provider_vault_v2( + 'provider-name', + 'url', + 'mount', + 'secret_token_path', + 'ca_path' +); + +SELECT pg_tde_add_global_key_provider_vault_v2( + 'provider-name', + 'url', + 'mount', + 'secret_token_path', + 'ca_path' +); ``` These functions change the Vault provider: -``` -SELECT pg_tde_change_key_provider_vault_v2('provider-name','secret_token','url','mount','ca_path'); -SELECT pg_tde_change_global_key_provider_vault_v2('provider-name','secret_token','url','mount','ca_path'); +```sql +SELECT pg_tde_change_database_key_provider_vault_v2( + 'provider-name', + 'url', + 'mount', + 'secret_token_path', + 'ca_path' +); + +SELECT pg_tde_change_global_key_provider_vault_v2( + 'provider-name', + 'url', + 'mount', + 'secret_token_path', + 'ca_path' +); ``` where: @@ -106,30 +99,55 @@ where: * `provider-name` is the name of the key provider * `url` is the URL of the Vault server * `mount` is the mount point on the Vault server where the key provider should store the keys -* `secret_token` is an access token with read and write access to the above mount point -* [optional] `ca_path` is the path of the CA file used for SSL verification - -All parameters can be either strings, or JSON objects [referencing remote parameters](external-parameters.md). - -**Never specify the secret token directly, use a remote parameter instead.** - +* `secret_token_path` is a path to the file that contains an access token with read and write access to the above mount point +* **[optional]** `ca_path` is the path of the CA file used for SSL verification -#### Adding or modifying KMIP providers +#### Add or modify KMIP providers The KMIP provider uses a remote KMIP server. -Use these functions to add a KMIP provider: +Use these functions to add a KMIP provider: -``` -SELECT pg_tde_add_key_provider_kmip('provider-name','kmip-addr', `port`, '/path_to/server_certificate.pem', '/path_to/client_key.pem'); -SELECT pg_tde_add_global_key_provider_kmip('provider-name','kmip-addr', `port`, '/path_to/server_certificate.pem', '/path_to/client_key.pem'); +```sql +SELECT pg_tde_add_database_key_provider_kmip( + 'provider-name', + 'kmip-addr', + port, + '/path_to/client_cert.pem', + '/path_to/client_key.pem', + '/path_to/server_certificate.pem' +); + +SELECT pg_tde_add_global_key_provider_kmip( + 'provider-name', + 'kmip-addr', + port, + '/path_to/client_certificate.pem', + '/path_to/client_key.pem', + '/path_to/server_certificate.pem' +); ``` These functions change the KMIP provider: -``` -SELECT pg_tde_change_key_provider_kmip('provider-name','kmip-addr', `port`, '/path_to/server_certificate.pem', '/path_to/client_key.pem'); -SELECT pg_tde_change_global_key_provider_kmip('provider-name','kmip-addr', `port`, '/path_to/server_certificate.pem', '/path_to/client_key.pem'); +```sql +SELECT pg_tde_change_database_key_provider_kmip( + 'provider-name', + 'kmip-addr', + port, + '/path_to/client_cert.pem', + '/path_to/client_key.pem', + '/path_to/server_certificate.pem' +); + +SELECT pg_tde_change_global_key_provider_kmip( + 'provider-name', + 'kmip-addr', + port, + '/path_to/client_certificate.pem', + '/path_to/client_key.pem', + '/path_to/server_certificate.pem' +); ``` where: @@ -139,32 +157,47 @@ where: * `port` is the port to communicate with the KMIP server. Most KMIP servers use port 5696. * `server-certificate` is the path to the certificate file for the KMIP server. -* `client key` is the path to the client key. - -The specified access parameters require permission to read and write keys at the server. +* `client-certificate` is the path to the client certificate. +* `client-key` is the path to the client key. -All parameters can be either strings, or JSON objects [referencing remote parameters](external-parameters.md). +!!! note + The specified access parameters require permission to read and write keys at the server. -### Adding or modifying local keyfile providers +### Add or modify local key file providers -This provider manages database keys using a local keyfile. +This provider manages database keys using a local key file. This function is intended for development or quick testing, and stores the keys unencrypted in the specified data file. -**It is not recommended for production.** +!!! important + Local key file providers are **not recommended** for production environments, they lack the security and manageability of external key management systems. -Add a local keyfile provider: +Add a local key file provider: -``` -SELECT pg_tde_add_key_provider_file('provider-name','/path/to/the/key/provider/data.file'); -SELECT pg_tde_add_global_key_provider_file('provider-name','/path/to/the/key/provider/data.file'); +```sql +SELECT pg_tde_add_database_key_provider_file( + 'provider-name', + '/path/to/the/key/provider/data.file' +); + +SELECT pg_tde_add_global_key_provider_file( + 'provider-name', + '/path/to/the/key/provider/data.file' +); ``` -Change a local keyfile provider: +Change a local key file provider: -``` -SELECT pg_tde_change_key_provider_file('provider-name','/path/to/the/key/provider/data.file'); -SELECT pg_tde_change_global_key_provider_file('provider-name','/path/to/the/key/provider/data.file'); +```sql +SELECT pg_tde_change_database_key_provider_file( + 'provider-name', + '/path/to/the/key/provider/data.file' +); + +SELECT pg_tde_change_global_key_provider_file( + 'provider-name', + '/path/to/the/key/provider/data.file' +); ``` where: @@ -172,13 +205,11 @@ where: * `provider-name` is the name of the provider. You can specify any name, it's for you to identify the provider. * `/path/to/the/key/provider/data.file` is the path to the key provider file. -All parameters can be either strings, or JSON objects [referencing remote parameters](external-parameters.md). - ### Delete a provider These functions delete an existing provider in the current database or in the global scope: -* `pg_tde_delete_key_provider('provider-name)` +* `pg_tde_delete_database_key_provider('provider-name)` * `pg_tde_delete_global_key_provider('provider-name)` You can only delete key providers that are not currently in use. An error is returned if the current principal key is using the provider you are trying to delete. @@ -189,76 +220,100 @@ If the use of global key providers is enabled via the `pg_tde.inherit_global` GU These functions list the details of all key providers for the current database or for the global scope, including all configuration values: -* `pg_tde_list_all_key_providers()` +* `pg_tde_list_all_database_key_providers()` * `pg_tde_list_all_global_key_providers()` -**All configuration values include possibly sensitive values, such as passwords. Never specify these directly, use the remote configuration option instead.** - - ## Principal key management -Use these functions to create a new principal key for a specific scope such as a current database, a global or default scope. You can also use them to start using a different existing key for a specific scope. +Use these functions to create a new principal key at a given keyprover, and to use those keys for a specific scope such as a current database, a global or default scope. You can also use them to start using a different existing key for a specific scope. -Princial keys are stored on key providers by the name specified in this function - for example, when using the Vault provider, after creating a key named "foo", a key named "foo" will be visible on the Vault server at the specified mount point. +Principal keys are stored on key providers by the name specified in this function - for example, when using the Vault provider, after creating a key named "foo", a key named "foo" will be visible on the Vault server at the specified mount point. -### pg_tde_set_principal_key +### pg_tde_create_key_using_database_key_provider -Creates or rotates the principal key for the current database using the specified database key provider and key name. +Creates a principal key using the database-local key provider with the specified name. Use this key later with [`pg_tde_set_key_using_database_key_provider()`](#pg_tde_set_key_using_database_key_provider). -``` -SELECT pg_tde_set_principal_key('name-of-the-principal-key','provider-name','ensure_new_key'); +```sql +SELECT pg_tde_create_key_using_database_key_provider( + 'key-name', + 'provider-name' +); ``` - The `ensure_new_key` parameter instructs the function how to handle a principal key during key rotation: +### pg_tde_create_key_using_global_key_provider -* If set to `true` (default), a new key must be unique. - If the provider already stores a key by that name, the function returns an error. -* If set to `false`, an existing principal key may be reused. +Creates a principal key at a global key provider with the given name. Use this key later with the `pg_tde_set_*` series of functions. -### pg_tde_set_global_principal_key +```sql +SELECT pg_tde_create_key_using_global_key_provider( + 'key-name', + 'provider-name' +); +``` -Creates or rotates the global principal key using the specified global key provider and the key name. This key is used for global settings like WAL encryption. +### pg_tde_set_key_using_database_key_provider -``` -SELECT pg_tde_set_global_principal_key('name-of-the-principal-key','provider-name','ensure_new_key'); -``` +Sets the principal key for the **current** database, using the specified local key provider. It also rotates internal encryption keys to use the specified principal key. - The `ensure_new_key` parameter instructs the function how to handle a principal key during key rotation: +This function is typically used when working with per-database encryption through a local key provider. -* If set to `true` (default), a new key must be unique. - If the provider already stores a key by that name, the function returns an error. -* If set to `false`, an existing principal key may be reused. +```sql +SELECT pg_tde_set_key_using_database_key_provider( + 'key-name', + 'provider-name' +); +``` -### pg_tde_set_server_principal_key +### pg_tde_set_key_using_global_key_provider -Creates or rotates the global principal key using the specified key provider. Use this function to set a principal key for WAL encryption. +Sets or rotates the global principal key using the specified global key provider and the key name. This key is used for global settings like WAL encryption. -``` -SELECT pg_tde_set_server_principal_key('name-of-the-principal-key','provider-name','ensure_new_key'); +```sql +SELECT pg_tde_set_key_using_global_key_provider( + 'key-name', + 'provider-name' +); ``` -The `ensure_new_key` parameter instructs the function how to handle a principal key during key rotation: +### pg_tde_set_server_key_using_global_key_provider -* If set to `true` (default), a new key must be unique. - If the provider already stores a key by that name, the function returns an error. -* If set to `false`, an existing principal key may be reused. +Sets or rotates the server principal key using the specified global key provider. Use this function to set a principal key for WAL encryption. +```sql +SELECT pg_tde_set_server_key_using_global_key_provider( + 'key-name', + 'provider-name' +); +``` -### pg_tde_set_default_principal_key +### pg_tde_set_default_key_using_global_key_provider -Creates or rotates the default principal key for the server using the specified key provider. +Sets or rotates the default principal key for the server using the specified global key provider. -The default key is automatically used as a principal key by any database that doesn't have an individual key provider and key configuration. +The default key is automatically used as a principal key by any database that doesn't have an individual key provider and key configuration. +```sql +SELECT pg_tde_set_default_key_using_global_key_provider( + 'key-name', + 'provider-name' +); ``` -SELECT pg_tde_set_default_principal_key('name-of-the-principal-key','provider-name','ensure_new_key'); + +### pg_tde_delete_key + +Unsets the principal key for the current database. If the current database has any encrypted tables, and there isn’t a default principal key configured, it reports an error instead. If there are encrypted tables, but there’s also a default principal key, internal keys will be encrypted with the default key. + +```sql +SELECT pg_tde_delete_key(); ``` -The `ensure_new_key` parameter instructs the function how to handle a principal key during key rotation: +### pg_tde_delete_default_key + +Unsets default principal key. It's possible only if no database uses default principal key. -* If set to `true` (default), a new key must be unique. - If the provider already stores a key by that name, the function returns an error. -* If set to `false`, an existing principal key may be reused. +```sql +SELECT pg_tde_delete_default_key(); +``` ## Encryption status check @@ -270,35 +325,47 @@ tables and indexes. To verify that a table is encrypted, run the following statement: -``` -SELECT pg_tde_is_encrypted('table_name'); +```sql +SELECT pg_tde_is_encrypted( + 'table_name' +); ``` You can also verify if the table in a custom schema is encrypted. Pass the schema name for the function as follows: -``` -SELECT pg_tde_is_encrypted('schema.table_name'); +```sql +SELECT pg_tde_is_encrypted( + 'schema.table_name' +); ``` This can additionally be used to verify that indexes and sequences are encrypted. -### pg_tde_principal_key_info +### pg_tde_key_info Displays information about the principal key for the current database, if it exists. -``` -SELECT pg_tde_principal_key_info() +```sql +SELECT pg_tde_key_info(); ``` -### pg_tde_global_principal_key_info +### pg_tde_server_key_info -Displays information about the principal key for the global scope, if exists. +Displays information about the principal key for the server scope, if exists. +```sql +SELECT pg_tde_server_key_info(); ``` -SELECT pg_tde_global_principal_key_info() + +### pg_tde_default_key_info + +Displays the information about the default principal key, if it exists. + +```sql +SELECT pg_tde_default_key_info(); ``` -### pg_tde_verify_principal_key +### pg_tde_verify_key This function checks that the current database has a properly functional encryption setup, which means: @@ -310,13 +377,13 @@ This function checks that the current database has a properly functional encrypt If any of the above checks fail, the function reports an error. -``` -SELECT pg_tde_verify_principal_key() +```sql +SELECT pg_tde_verify_key(); ``` -### pg_tde_verify_global_principal_key +### pg_tde_verify_server_key -This function checks that the global scope has a properly functional encryption setup, which means: +This function checks that the server scope has a properly functional encryption setup, which means: * A key provider is configured * The key provider is accessible using the specified configuration @@ -326,6 +393,22 @@ This function checks that the global scope has a properly functional encryption If any of the above checks fail, the function reports an error. +```sql +SELECT pg_tde_verify_server_key(); ``` -SELECT pg_tde_verify_principal_key() + +### pg_tde_verify_default_key + +This function checks that the default key is properly configured, which means: + +* A key provider is configured +* The key provider is accessible using the specified configuration +* There is a principal key that can be used for any scope +* The principal key can be retrieved from the remote key provider +* The principal key returned from the key provider is the same as cached in the server memory + +If any of the above checks fail, the function reports an error. + +```sql +SELECT pg_tde_verify_default_key(); ``` diff --git a/contrib/pg_tde/documentation/docs/get-help.md b/contrib/pg_tde/documentation/docs/get-help.md index 81ee0d8b001e9..56bbac165e47a 100644 --- a/contrib/pg_tde/documentation/docs/get-help.md +++ b/contrib/pg_tde/documentation/docs/get-help.md @@ -1,4 +1,4 @@ -# Get help from Percona +# Get Help from Percona Our documentation guides are packed with information, but they can't cover everything you need to know about `pg_tde`. They also won't cover every scenario you might come across. Don't be afraid to try things out and ask questions when you get stuck. @@ -17,7 +17,6 @@ Percona experts bring years of experience in tackling tough database performance
We understand your challenges when managing complex database environments. That's why we offer various services to help you simplify your operations and achieve your goals. - | Service | Description | |----------------------------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------| | 24/7 Expert Support | Our dedicated team of database experts is available 24/7 to assist you with any database issues. We provide flexible support plans tailored to your specific needs. | @@ -25,4 +24,4 @@ We understand your challenges when managing complex database environments. That' | Expert Consulting | Our experienced consultants provide guidance on database topics like architecture design, migration planning, performance optimization, and security best practices. | | Comprehensive Training | Our training programs help your team develop skills to manage databases effectively, offering virtual and in-person courses. | -We're here to help you every step of the way. Whether you need a quick fix or a long-term partnership, we're ready to provide your expertise and support. \ No newline at end of file +We're here to help you every step of the way. Whether you need a quick fix or a long-term partnership, we're ready to provide your expertise and support. diff --git a/contrib/pg_tde/documentation/docs/global-key-provider-configuration/keyring.md b/contrib/pg_tde/documentation/docs/global-key-provider-configuration/keyring.md new file mode 100644 index 0000000000000..5d85a23798711 --- /dev/null +++ b/contrib/pg_tde/documentation/docs/global-key-provider-configuration/keyring.md @@ -0,0 +1,77 @@ +# Keyring file configuration + +This setup is intended for development and stores the keys, unencrypted, in a data file you specify. + +!!! note + While keyring files may be acceptable for **local** or **testing environments**, proper [KMS providers](../global-key-provider-configuration/overview.md) are the recommended approach for production deployments. + +You can configure key providers either at the database level (for development and testing) or at the global level (for production). + +The steps below provide an example on how to add a [database-scoped key provider](../functions.md#add-or-modify-local-key-file-providers): + +1. Create a database-scoped file key provider (`file-keyring` in this example) in the `/tmp/pg_tde_test_local_keyring.per` file: + + ```sql + SELECT pg_tde_add_database_key_provider_file( + 'file-keyring', + '/tmp/pg_tde_test_local_keyring.per' + ); + ``` + +2. Create a key (`my_default_key` in this example) inside the newly created `file-keyring` provider: + + ```sql + SELECT pg_tde_create_key_using_database_key_provider( + 'my_default_key', + 'file-keyring' + ); + ``` + +3. Set the key (`my_default_key`) from the key provider (`file-keyring`): + + ```sql + SELECT pg_tde_set_key_using_database_key_provider( + 'my_default_key', + 'file-keyring' + ); + ``` + + !!! tip + You can check the default key information (such as the date and time of creation). Run: + + ```sql + SELECT pg_tde_default_key_info(); + ``` + +4. Now, create a table using [tde_heap](../index/table-access-method.md#how-tde_heap-works-with-pg_tde): + + ```sql + CREATE TABLE customer_table (a INT) USING tde_heap; + ``` + + The newly created table is encrypted with the default key you have set (`my_default_key`). + + !!! tip + To check if your created table is encrypted with tde_heap, run: + + ```sql + \d+ test1 + ``` + + If `Access method: tde_heap`, then your table is encrypted. + + ??? "Example output" + postgres=# \d+ test1 + Table "public.test1" + Column | Type | Collation | Nullable | Default | Storage | Compression | Stats target | Description + --------+---------+-----------+----------+---------+---------+-------------+--------------+------------- + a | integer | | | | plain | | | + Access method: tde_heap + +## Further reading + +Next, for production deployments, [configure a global principal key](set-principal-key.md) using a proper [KMS provider](../global-key-provider-configuration/overview.md). + +Alternatively, you can skip directly to [validating encryption with pg_tde](../test.md) or [configuring WAL encryption](../wal-encryption.md). + +You can also review the available `pg_tde` functions in [Functions](../functions.md). diff --git a/contrib/pg_tde/documentation/docs/global-key-provider-configuration/kmip-fortanix.md b/contrib/pg_tde/documentation/docs/global-key-provider-configuration/kmip-fortanix.md new file mode 100644 index 0000000000000..db08752133248 --- /dev/null +++ b/contrib/pg_tde/documentation/docs/global-key-provider-configuration/kmip-fortanix.md @@ -0,0 +1,5 @@ +# Fortanix KMIP server configuration + +`pg_tde` is compatible with Fortanix Data Security Manager (DSM) via the KMIP protocol. For a full setup guide, see [the Fortanix KMIP documentation here](https://support.fortanix.com/docs/users-guide-account-client-configurations?highlight=KMIP#23-kmip-clients). + +For more information on adding or modifying the provider, see the [Adding or modifying KMIP providers](https://docs.percona.com/pg-tde/functions.html?h=pg_tde_add_global_key_provider_kmip#adding-or-modifying-kmip-providers) topic. diff --git a/contrib/pg_tde/documentation/docs/global-key-provider-configuration/kmip-openbao.md b/contrib/pg_tde/documentation/docs/global-key-provider-configuration/kmip-openbao.md new file mode 100644 index 0000000000000..91bc1cefd3b7d --- /dev/null +++ b/contrib/pg_tde/documentation/docs/global-key-provider-configuration/kmip-openbao.md @@ -0,0 +1,48 @@ +# Using OpenBao as a key provider + +You can configure `pg_tde` to use OpenBao as a global key provider for managing encryption keys securely. + +!!! note + This guide assumes that your OpenBao server is already set up and accessible. OpenBao configuration is outside the scope of this document, see [OpenBao's official documentation](https://openbao.org/docs/) for more information. + +## Example usage + +To register an OpenBao server as a global key provider: + +```sql +SELECT pg_tde_add_global_key_provider_vault_v2( + 'provider-name', + 'url', + 'mount', + 'secret_token_path', + 'ca_path' +); +``` + +## Parameter descriptions + +* `provider-name` is the name to identify this key provider +* `secret_token_path` is a path to the file that contains an access token with read and write access to the above mount point +* `url` is the URL of the Vault server +* `mount` is the mount point where the keyring should store the keys +* [optional] `ca_path` is the path of the CA file used for SSL verification + +The following example is for testing purposes only. Use secure tokens and proper SSL validation in production environments: + +```sql +SELECT pg_tde_add_global_key_provider_vault_v2( + 'my-openbao-provider', + 'https://openbao.example.com:8200', + 'secret/data', + '/path/to/token_file', + '/path/to/ca_cert.pem' +); +``` + +For more information on related functions, see the link below: + +[Percona pg_tde Function Reference](../functions.md){.md-button} + +## Next steps + +[Global Principal Key Configuration :material-arrow-right:](set-principal-key.md){.md-button} diff --git a/contrib/pg_tde/documentation/docs/global-key-provider-configuration/kmip-server.md b/contrib/pg_tde/documentation/docs/global-key-provider-configuration/kmip-server.md new file mode 100644 index 0000000000000..488ca0007749b --- /dev/null +++ b/contrib/pg_tde/documentation/docs/global-key-provider-configuration/kmip-server.md @@ -0,0 +1,52 @@ +# KMIP configuration + +To use a Key Management Interoperability Protocol (KMIP) server with `pg_tde`, you must configure it as a global key provider. This setup enables `pg_tde` to securely fetch and manage encryption keys from a centralized key management appliance. + +!!! note + You need the root certificate of the KMIP server and a client key/certificate pair with permissions to create and read keys on the server. + +It is recommended to review the [configuration guidelines for the HashiCorp Vault Enterprise KMIP Secrets Engine](https://developer.hashicorp.com/vault/tutorials/enterprise/kmip-engine) if you're using Vault. + +For testing purposes, you can use a lightweight PyKMIP server, which enables easy certificate generation and basic KMIP behavior. If you're using a production-grade KMIP server, ensure you obtain valid, trusted certificates from the key management appliance. + +## Example usage + +```sql +SELECT pg_tde_add_global_key_provider_kmip( + 'provider-name', + 'kmip-IP', + `port`, + '/path_to/server_certificate.pem', + '/path_to/client_cert.pem', + '/path_to/client_key.pem' +); +``` + +## Parameter descriptions + +* `provider-name` is the name of the provider. You can specify any name, it's for you to identify the provider +* `kmip-IP` is the IP address of a domain name of the KMIP server +* `port` is the port to communicate with the KMIP server. Typically used port is 5696 +* `server-certificate` is the path to the certificate file for the KMIP server +* `client_cert` is the path to the client certificate. +* `client_key` is the path to the client key. + +The following example is for testing purposes only. + +```sql +SELECT pg_tde_add_global_key_provider_kmip( + 'kmip','127.0.0.1', + 5696, + '/tmp/server_certificate.pem', + '/tmp/client_cert_jane_doe.pem', + '/tmp/client_key_jane_doe.pem' +); +``` + +For more information on related functions, see the link below: + +[Percona pg_tde Function Reference](../functions.md){.md-button} + +## Next steps + +[Global Principal Key Configuration :material-arrow-right:](set-principal-key.md){.md-button} diff --git a/contrib/pg_tde/documentation/docs/global-key-provider-configuration/kmip-thales.md b/contrib/pg_tde/documentation/docs/global-key-provider-configuration/kmip-thales.md new file mode 100644 index 0000000000000..d31ba22e9fdd2 --- /dev/null +++ b/contrib/pg_tde/documentation/docs/global-key-provider-configuration/kmip-thales.md @@ -0,0 +1,5 @@ +# Thales KMIP server configuration + +`pg_tde` is compatible with the Thales CipherTrust Manager via the KMIP protocol. For a full setup guide, see [the Thales documentation](https://thalesdocs.com/ctp/cm/2.19/reference/kmip-ref/index.html?). + +For more information on adding or modifying the provider, see the [Adding or modifying KMIP providers](https://docs.percona.com/pg-tde/functions.html?h=pg_tde_add_global_key_provider_kmip#adding-or-modifying-kmip-providers) topic. diff --git a/contrib/pg_tde/documentation/docs/global-key-provider-configuration/overview.md b/contrib/pg_tde/documentation/docs/global-key-provider-configuration/overview.md new file mode 100644 index 0000000000000..a6c7e4703fd3e --- /dev/null +++ b/contrib/pg_tde/documentation/docs/global-key-provider-configuration/overview.md @@ -0,0 +1,26 @@ +# Key management overview + +In production environments, storing encryption keys locally on the PostgreSQL server can introduce security risks. To enhance security, `pg_tde` supports integration with external Key Management Systems (KMS) through a Global Key Provider interface. + +This section describes how you can configure `pg_tde` to use the local and external key providers. +To use an external KMS with `pg_tde`, follow these two steps: + +1. Configure a Key Provider +2. Set the [Global Principal Key](set-principal-key.md) + +!!! note + While key files may be acceptable for **local** or **testing environments**, KMS integration is the recommended approach for production deployments. + +!!! warning + Do not rotate encryption keys while `pg_basebackup` is running. Standbys or standalone clusters created from such backups may fail to start during WAL replay. Schedule rotations outside your backup windows and run a new full backup afterward. + +`pg_tde` has been tested with the following key providers: + +| KMS Provider | Description | Documentation | +|--------------------|-------------------------------------------------------|---------------| +| **KMIP** | Standard Key Management Interoperability Protocol. | [Configure KMIP →](kmip-server.md) | +| **Vault** | HashiCorp Vault integration (KV v2 API, KMIP engine). | [Configure Vault →](vault.md) | +| **Fortanix** | Fortanix DSM key management. | [Configure Fortanix →](kmip-fortanix.md) | +| **Thales** | Thales CipherTrust Manager and DSM. | [Configure Thales →](kmip-thales.md) | +| **OpenBao** | Community fork of Vault, supporting KV v2. | [Configure OpenBao →](kmip-openbao.md) | +| **Keyring file** *(not recommended)* | Local key file for dev/test only. | [Configure keyring file →](keyring.md) | diff --git a/contrib/pg_tde/documentation/docs/global-key-provider-configuration/set-principal-key.md b/contrib/pg_tde/documentation/docs/global-key-provider-configuration/set-principal-key.md new file mode 100644 index 0000000000000..781ce5869ddba --- /dev/null +++ b/contrib/pg_tde/documentation/docs/global-key-provider-configuration/set-principal-key.md @@ -0,0 +1,81 @@ +# Global Principal Key configuration + +You can configure a default principal key using a global key provider. This key is used by all databases that do not have their own encryption keys configured. + +There are two main functions for this: + +- [pg_tde_create_key_using_global_key_provider()](../functions.md#pg_tde_create_key_using_global_key_provider) creates a principal key at a global key provider +- [pg_tde_set_default_key_using_global_key_provider()](../functions.md#pg_tde_set_default_key_using_global_key_provider) sets the default principal key and rotates the internal encryption key if one is already configured + +## Create a default principal key + +!!! note + + The sample output below is for demonstration purposes only. Be sure to replace the key name and provider with your actual values. + +To create a global principal key, run: + +```sql +SELECT pg_tde_create_key_using_global_key_provider( + 'key-name', + 'global_vault_provider' +); +``` + +??? example "Sample output" + ```sql + postgres=# SELECT pg_tde_create_key_using_global_key_provider( + 'keytest1', + 'file-keyring' + ); + pg_tde_create_key_using_global_key_provider + --------------------------------------------- + + (1 row) + ``` + +## Configure a default principal key + +To configure a global principal key, run: + +```sql +SELECT pg_tde_set_default_key_using_global_key_provider( + 'key-name', + 'global_vault_provider' +); +``` + +??? example "Sample output" + ```sql + postgres=# SELECT pg_tde_set_default_key_using_global_key_provider( + 'keytest1', + 'file-keyring' + ); + pg_tde_set_default_key_using_global_key_provider + -------------------------------------------------- + + (1 row) + ``` + +## Parameter description + +* `key-name` is the name under which the principal key is stored in the provider. +* `global_vault_provider` is the name of the global key provider you previously configured. + +!!! note + + If no error is reported, the action completed successfully. + +## How key generation works + +The key material (actual cryptographic key) is auto-generated by `pg_tde` and stored securely by the configured provider. + +!!! note + + This process sets the **default principal key for the entire server**. Any database without a key explicitly configured will fall back to this key. + +## Next steps + +To confirm that encryption is working as expected, follow the validation steps: + +[Validate Encryption with pg_tde :material-arrow-right:](../test.md){.md-button} diff --git a/contrib/pg_tde/documentation/docs/global-key-provider-configuration/vault.md b/contrib/pg_tde/documentation/docs/global-key-provider-configuration/vault.md new file mode 100644 index 0000000000000..ee913bc991d6d --- /dev/null +++ b/contrib/pg_tde/documentation/docs/global-key-provider-configuration/vault.md @@ -0,0 +1,55 @@ +# Vault configuration + +You can configure `pg_tde` to use HashiCorp Vault as a global key provider for managing encryption keys securely. Both the open source and enterprise editions are supported. + +!!! note + This guide assumes that your Vault server is already set up and accessible. Vault configuration is outside the scope of this document, see [Vault's official documentation](https://developer.hashicorp.com/vault/docs) for more information. + +## Example usage + +```sql +SELECT pg_tde_add_global_key_provider_vault_v2( + 'provider-name', + 'url', + 'mount', + 'secret_token_path', + 'ca_path' +); +``` + +## Parameter descriptions + +* `provider-name` is the name to identify this key provider +* `secret_token_path` is a path to the file that contains an access token with read and write access to the above mount point +* `url` is the URL of the Vault server +* `mount` is the mount point where the keyring should store the keys +* [optional] `ca_path` is the path of the CA file used for SSL verification + +The following example is for testing purposes only. Use secure tokens and proper SSL validation in production environments: + +```sql +SELECT pg_tde_add_global_key_provider_vault_v2( + 'my-vault', + 'https://vault.vault.svc.cluster.local:8200', + 'secret/data', + '/path/to/token_file', + '/path/to/ca_cert.pem' +); +``` + +For more information on related functions, see the link below: + +[Percona pg_tde Function Reference](../functions.md){.md-button} + +## Required permissions +`pg_tde` requires given permissions on listed Vault's API endpoints +* `sys/mounts/` - **read** permissions +* `/data/*` - **create**, **read** permissions +* `/metadata` - **list** permissions + +!!! note + For more information on Vault permissions, see the [following documentation](https://developer.hashicorp.com/vault/docs/concepts/policies). + +## Next steps + +[Global Principal Key Configuration :material-arrow-right:](set-principal-key.md){.md-button} diff --git a/contrib/pg_tde/documentation/docs/how-to/backup-wal-enabled.md b/contrib/pg_tde/documentation/docs/how-to/backup-wal-enabled.md new file mode 100644 index 0000000000000..7b51bbbd176ea --- /dev/null +++ b/contrib/pg_tde/documentation/docs/how-to/backup-wal-enabled.md @@ -0,0 +1,77 @@ +# Backup with WAL encryption enabled + +To create a backup with WAL encryption enabled: + +1. Copy the `pg_tde` directory from the source server’s data directory, for example `/var/lib/postgresql/data/pg_tde/`, including the `wal_keys` and `1664_providers` files, to the backup destination directory where `pg_basebackup` will write the backup. + +Also copy any external files referenced by your providers configuration (such as certificate or key files) into the same relative paths under the backup destination, so that they are located and validated by `pg_basebackup -E`. + +2. Run: + + ```bash + pg_basebackup -D /path/to/backup -E + ``` + + Where: + + - `-D /path/to/backup` specifies the backup location where you have to copy `pg_tde`. + - `-E` (or `--encrypt-wal`) enables WAL encryption and validates that the copied `pg_tde` and provider files are present and that the server key is accessible (required). + +!!! note + - The `-E` flag only works with the `-X stream` option (default). It is not compatible with `-X none` or `-X fetch`. For more information, see [the other WAL methods topic](#other-wal-methods). + - The `-E` flag is only supported with the plain output format (`-F p`). It cannot be used with the tar output format (`-F t`). + +## Key rotation during backups + +!!! warning + Do not create, change, or rotate global key providers (or their keys) while `pg_basebackup` is running. Standbys or standalone clusters created from such backups may fail to start during WAL replay and may also lead to the corruption of encrypted data (tables, indexes, and other relations). + +Creating, changing, or rotating global key providers (or their keys) during a base backup can leave the standby in an inconsistent state where it cannot retrieve the correct key history. + +For example, you may see errors such as: + +```sql +FATAL: failed to retrieve principal key "database_keyXXXX" from key provider "providerYYYY" +CONTEXT: WAL redo at ... ROTATE_PRINCIPAL_KEY ... +``` + +To ensure standby recoverability, plan key rotations outside backup windows or take a new full backup after rotation completes. + +## Restore a backup created with WAL encryption + +When you want to restore a backup created with `pg_basebackup -E`: + +1. Ensure all external files referenced by your providers configuration (such as certificates or key files) are also present and accessible at the same relative paths. +2. Start PostgreSQL with the restored data directory. + +## Backup method compatibility with WAL encryption + +Tar format (`-F t`): + +* Works with `-X fetch`. +* Does not support `-X stream` when WAL encryption is enabled. Using `pg_basebackup -F t -X stream` will create a broken replica. + +Streaming mode (`-X stream`): + +* **Must** specify `-E` (`--encrypt-wal`). +* Without `-E`, backups may contain decrypted WAL while `wal_encryption=on` remains in `postgresql.conf` and `pg_tde/wal_keys` are copied. This leads to **startup failures and compromised data in the backup**. + +Fetch mode (`-X fetch`): + +* Compatible with encrypted WAL without requiring any additional flags. + +None (`-X none`): + +* Excludes WAL from the backup and is unaffected by WAL encryption. + + +!!! note + If the source server has `pg_tde/wal_keys`, running `pg_basebackup` with `-X none` or `-X fetch` produces warnings such as: + + ```sql + pg_basebackup: warning: the source has WAL keys, but no WAL encryption configured for the target backups + pg_basebackup: detail: This may lead to exposed data and broken backup + pg_basebackup: hint: Run pg_basebackup with -E to encrypt streamed WAL + ``` + + You can safely ignore the warnings with `-X none` or `-X fetch`, since no WAL streaming occurs. diff --git a/contrib/pg_tde/documentation/docs/decrypt.md b/contrib/pg_tde/documentation/docs/how-to/decrypt.md similarity index 86% rename from contrib/pg_tde/documentation/docs/decrypt.md rename to contrib/pg_tde/documentation/docs/how-to/decrypt.md index 1aafcca361e35..d0117a9905761 100644 --- a/contrib/pg_tde/documentation/docs/decrypt.md +++ b/contrib/pg_tde/documentation/docs/how-to/decrypt.md @@ -1,42 +1,39 @@ -# Remove encryption from an encrypted table +# Remove Encryption from an Encrypted Table ## Method 1. Change the access method If you encrypted a table with the `tde_heap` access method and need to remove the encryption from it, run the following command against the desired table (`mytable` in the example below): -``` +```sql ALTER TABLE mytable SET ACCESS METHOD heap; ``` Note that the `SET ACCESS METHOD` command drops hint bits and this may affect performance. Running a plain `SELECT count(*)` or `VACUUM` command on the entire table will check every tuple for visibility and set its hint bits. Therefore, after executing the `ALTER TABLE` command, run a simple `count(*)` on your tables: -``` +```sql SELECT count(*) FROM mytable; ``` Check that the table is not encrypted: -``` +```sql SELECT pg_tde_is_encrypted('mytable'); ``` -The output returns `f` meaning that the table is no longer encrypted. - - +The output returns `f` meaning that the table is no longer encrypted. ## Method 2. Create a new not encrypted table on the base of the encrypted one -Alternatively, you can create a new not encrypted table with the same structure and data as the initial table. For example, the original encrypted table is `EncryptedCustomers`. Use the following command to create a new table `Customers`: +Alternatively, you can create a new not encrypted table with the same structure and data as the initial table. For example, the original encrypted table is `EncryptedCustomers`. Use the following command to create a new table `Customers`: -``` -CREATE TABLE Customers AS -SELECT * FROM EncryptedCustomers; +```sql +CREATE TABLE Customers AS SELECT * FROM EncryptedCustomers; ``` The new table `Customers` inherits the structure and the data from `EncryptedCustomers`. (Optional) If you no longer need the `EncryptedCustomers` table, you can delete it. -``` +```sql DROP TABLE EncryptedCustomers; ``` diff --git a/contrib/pg_tde/documentation/docs/how-to/enforcement.md b/contrib/pg_tde/documentation/docs/how-to/enforcement.md new file mode 100644 index 0000000000000..7796b7ef809b4 --- /dev/null +++ b/contrib/pg_tde/documentation/docs/how-to/enforcement.md @@ -0,0 +1,65 @@ +# Encryption Enforcement + +For `pg_tde`, encryption enforcement ensures that only encrypted storage is allowed for specific operations, tables, or the entire database. It prevents the accidental creation of unencrypted tables or indexes in environments where encryption is required for compliance, security, or policy enforcement. + +## What does enforcement do? + +When enabled, encryption enforcement: + +* Prevents creation of unencrypted tables or indexes +* Enforces consistent encryption usage across tenants, databases, or users +* Can be scoped globally, per database, or per role + +## Enforce encryption usage + +Use the following techniques to enforce the secure use of `pg_tde`. + +### 1. Enforce encryption across the server + +To enforce encryption cluster-wide, set the [`pg_tde.enforce_encryption`](../variables.md/#pg_tdeenforce_encryption) variable in `postgresql.conf`: + +```ini +pg_tde.enforce_encryption = on +``` + +!!! note + **Only** superusers can set or change this variable. + +This ensures that no user, including superusers, can create unencrypted tables. Superusers can however explicitly [override the variable in their session](#override-enforcement-for-trusted-sessions). + +### 2. Enforce encryption for a specific database + +To apply encryption enforcement only within a specific database, run: + +```sql +ALTER DATABASE example_db SET pg_tde.enforce_encryption = on; +``` + +This ensures encryption is enforced **only** when connected to that database. + +### 3. Enforce encryption for a specific user + +You can also enforce encryption on a per-user basis, run: + +```sql +ALTER USER example_user SET pg_tde.enforce_encryption = on; +``` + +This ensures that the user `example_user` cannot create unencrypted tables, regardless of which database they connect to. + +### Override enforcement for trusted sessions + +Superusers can override the variable at the session level: + +```sql +SET pg_tde.enforce_encryption = off; +``` + +This allows temporary creation of unencrypted tables in special cases, such as: + +* Loading trusted, public reference datasets +* Benchmarking and test environments +* Migration staging before re-encryption + +!!! note + While superusers can disable enforcement in their session, they must do so explicitly. Enforcement defaults remain active to protect from accidental misconfiguration. diff --git a/contrib/pg_tde/documentation/docs/how-to/multi-tenant-setup.md b/contrib/pg_tde/documentation/docs/how-to/multi-tenant-setup.md new file mode 100644 index 0000000000000..7cb64197baf6d --- /dev/null +++ b/contrib/pg_tde/documentation/docs/how-to/multi-tenant-setup.md @@ -0,0 +1,201 @@ +# Configure Multi-tenancy + +The steps below describe how to set up multi-tenancy with `pg_tde`. Multi-tenancy allows you to encrypt different databases with different keys. This provides granular control over data and enables you to introduce different security policies and access controls for each database so that only authorized users of specific databases have access to the data. + +If you don't need multi-tenancy, use the global key provider. See the configuration steps from the [Configure pg_tde :octicons-link-external-16:](../setup.md) section. + +For how to enable WAL encryption, refer to the [Configure WAL Encryption :octicons-link-external-16:](../wal-encryption.md) section. + +--8<-- "kms-considerations.md" + +!!! note + If no error is reported when running the commands below, the operation completed successfully. + +## Enable extension + +Load the `pg_tde` at startup time. The extension requires additional shared memory; therefore, add the `pg_tde` value for the `shared_preload_libraries` parameter and restart the `postgresql` cluster. + +1. Use the [ALTER SYSTEM :octicons-link-external-16:](https://www.postgresql.org/docs/current/sql-altersystem.html) command from `psql` terminal to modify the `shared_preload_libraries` parameter. This requires superuser privileges. + + ```sql + ALTER SYSTEM SET shared_preload_libraries = 'pg_tde'; + ``` + +2. Start or restart the `postgresql` cluster to apply the changes. + + * On Debian and Ubuntu: + + ```sh + sudo systemctl restart postgresql-17 + ``` + + * On RHEL and derivatives + + ```sh + sudo systemctl restart postgresql-17 + ``` + +3. Create the extension using the [CREATE EXTENSION :octicons-link-external-16:](https://www.postgresql.org/docs/current/sql-createextension.html) command. You must have the privileges of a superuser or a database owner to use this command. Connect to `psql` as a superuser for a database and run the following command: + + ```sql + CREATE EXTENSION pg_tde; + ``` + + The `pg_tde` extension is created for the currently used database. To enable data encryption in other databases, you must explicitly run the `CREATE EXTENSION` command against them. + + !!! tip + + You can have the `pg_tde` extension automatically enabled for every newly created database. Modify the template `template1` database as follows: + + ```sh + psql -d template1 -c 'CREATE EXTENSION pg_tde;' + ``` + +## Key provider configuration + +You must do these steps for every database where you have created the extension. For more information on configurations, please see the [Configure Key Management (KMS) :octicons-link-external-16:](../global-key-provider-configuration/overview.md) topic. + +1. Set up a key provider. + + === "With KMIP server" + + The KMIP server setup is out of scope of this document. + + Make sure you have obtained the root certificate for the KMIP server and the keypair for the client. The client key needs permissions to create / read keys on the server. Find the [configuration guidelines for the HashiCorp Vault Enterprise KMIP Secrets Engine :octicons-link-external-16:](https://developer.hashicorp.com/vault/tutorials/enterprise/kmip-engine). + + For testing purposes, you can use the PyKMIP server which enables you to set up required certificates. To use a real KMIP server, make sure to obtain the valid certificates issued by the key management appliance. + + ```sql + SELECT pg_tde_add_database_key_provider_kmip( + 'provider-name', + 'kmip-addr', + `port`, + '/path_to/client_cert.pem', + '/path_to/client_key.pem', + '/path_to/server_certificate.pem' + ); + ``` + + where: + + * `provider-name` is the name of the provider. You can specify any name, it's for you to identify the provider. + * `kmip-addr` is the IP address of a domain name of the KMIP server + * `port` is the port to communicate with the KMIP server. Typically used port is 5696. + * `server-certificate` is the path to the certificate file for the KMIP server. + * `client-cert` is the path to the client certificate. + * `client-key` is the path to the client key. + + :material-information: Warning: This example is for testing purposes only: + + ```sql + SELECT pg_tde_add_database_key_provider_kmip( + 'kmip', + '127.0.0.1', + 5696, + '/tmp/client_cert_jane_doe.pem', + '/tmp/client_key_jane_doe.pem', + '/tmp/server_certificate.pem' + ); + ``` + + === "With HashiCorp Vault" + + The Vault server setup is out of scope of this document. + + ```sql + SELECT pg_tde_add_database_key_provider_vault_v2( + 'provider-name', + 'url', + 'mount', + 'secret_token_path', + 'ca_path' + ); + ``` + + where: + + * `url` is the URL of the Vault server + * `mount` is the mount point where the keyring should store the keys + * `secret_token_path` is a path to the file that contains an access token with read and write access to the above mount point + * [optional] `ca_path` is the path of the CA file used for SSL verification + + :material-information: Warning: This example is for testing purposes only: + + ```sql + SELECT pg_tde_add_database_key_provider_file_vault_v2( + 'my-vault', + 'http://vault.vault.svc.cluster.local:8200', + 'secret/data', + 'hvs.zPuyktykA...example...ewUEnIRVaKoBzs2', + NULL + ); + ``` + + === "With a keyring file (not recommended)" + + This setup is intended for development and stores the keys unencrypted in the specified data file. + + ```sql + SELECT pg_tde_add_database_key_provider_file( + 'provider-name', + '/path/to/the/keyring/data.file' + ); + ``` + + :material-information: Warning: This example is for testing purposes only: + + ```sql + SELECT pg_tde_add_database_key_provider_file( + 'file-keyring', + '/tmp/pg_tde_test_local_keyring.per' + ); + ``` + +2. Create a key + + ```sql + SELECT pg_tde_create_key_using_database_key_provider( + 'name-of-the-key', + 'provider-name' + ); + ``` + + where: + + * `name-of-the-key` is the name of the principal key. You will use this name to identify the key. + * `provider-name` is the name of the key provider you added before. The principal key is associated with this provider and it is the location where it is stored and fetched from. + + :material-information: Warning: This example is for testing purposes only: + + ```sql + SELECT pg_tde_create_key_using_database_key_provider( + 'test-db-master-key', + 'file-vault' + ); + ``` + + !!! note + The key is auto-generated. + +3. Use the key as principal key + + ```sql + SELECT pg_tde_set_key_using_database_key_provider( + 'name-of-the-key', + 'provider-name' + ); + ``` + + where: + + * `name-of-the-key` is the name of the principal key. You will use this name to identify the key. + * `provider-name` is the name of the key provider you added before. The principal key will be associated with this provider. + + :material-information: Warning: This example is for testing purposes only: + + ```sql + SELECT pg_tde_set_key_using_database_key_provider( + 'test-db-master-key', + 'file-vault' + ); + ``` diff --git a/contrib/pg_tde/documentation/docs/how-to/restore-backups.md b/contrib/pg_tde/documentation/docs/how-to/restore-backups.md new file mode 100644 index 0000000000000..2abe8747a405b --- /dev/null +++ b/contrib/pg_tde/documentation/docs/how-to/restore-backups.md @@ -0,0 +1,18 @@ +# Restoring encrypted backups + +To restore an encrypted backup created with an earlier key, ensure the key is still available in your Key Management System (KMS). The backup remains **encrypted** on disk, `pg_tde` uses the correct key to transparently access the data. + +## How pg_tde uses old keys to load backups + +* **KMS**: stores the principal key(s) that were active when the backup was made. +* **Encrypted backup**: contains data encrypted with the key available at that time. +* **Current server**: `pg_tde` automatically loads the backup if the key is accessible through the KMS. + +The table (internal) keys are stored within the backup. At runtime, `pg_tde` retrieves the principal key(s) from the configured KMS and uses them to decrypt the internal keys, enabling access to the encrypted table data. + +!!! note + If the required key(s) get deleted or are missing, the backup **cannot** be read. + + If the key(s) still exists but the KMS configuration has changed, you can use [`pg_tde_change_key_provider`](../command-line-tools/pg-tde-change-key-provider.md) to update the configuration. + + However, if the key(s) got deleted from all accessible KMS sources, the encrypted backup is **unrecoverable**. diff --git a/contrib/pg_tde/documentation/docs/how-to/uninstall.md b/contrib/pg_tde/documentation/docs/how-to/uninstall.md new file mode 100644 index 0000000000000..cfb0412799a43 --- /dev/null +++ b/contrib/pg_tde/documentation/docs/how-to/uninstall.md @@ -0,0 +1,142 @@ +# Uninstall pg_tde + +If you no longer wish to use Transparent Data Encryption (TDE) in your deployment, you can remove the `pg_tde` extension. + +To proceed, you must have one of the following privileges: + +- Superuser privileges (to remove the extension globally), or +- Database owner privileges (to remove it from a specific database only) + +To uninstall `pg_tde`, follow the steps below. + +## Step 1. Remove `pg_tde` from all databases + +Before uninstalling, you must remove the extension from every database where it is loaded. This includes template databases if `pg_tde` was previously enabled there. + +a. Clean up encrypted tables: + +To decrypt a table and restore it to its default storage method: + +```sql +ALTER TABLE SET ACCESS METHOD heap; +``` + +b. Remove the extension once all encrypted tables have been handled: + +```sql +DROP EXTENSION pg_tde; +``` + +!!! note + + If there are any encrypted objects that were not previously decrypted or deleted, this command will fail and you have to follow the steps above for these objects. + +## Step 2. Turn off WAL encryption + +If you are using WAL encryption, you need to **turn it off** before you uninstall the `pg_tde` library: + +a. Run: + +```sql +ALTER SYSTEM SET pg_tde.wal_encrypt = off; +``` + +b. Restart the PostgreSQL cluster to apply the changes: + +- On Debian and Ubuntu: + +```sh +sudo systemctl restart postgresql +``` + +- On RHEL and derivatives: + +```sh +sudo systemctl restart postgresql-17 +``` + +## Step 3. Uninstall the `pg_tde` shared library + +!!! warning + + This process removes the extension, but **does not** decrypt data automatically. Only uninstall the shared library after all encrypted data **has been removed or decrypted** and WAL encryption **has been disabled**. + +!!! note + + Encrypted WAL pages **will not be decrypted**, so any postgres cluster needing to read them will need the `pg_tde` library loaded, and the WAL encryption keys available and in use. + +At this point, the shared library is still loaded but no longer active. To fully uninstall `pg_tde`, complete the steps below. + +a. Run `SHOW shared_preload_libraries` to view the current configuration of preloaded libraries. + +For example: + +```sql +postgres=# SHOW shared_preload_libraries; + shared_preload_libraries +----------------------------------------- +pg_stat_statements,pg_tde,auto_explain +(1 row) + +postgres=# +``` + +b. Remove `pg_tde` from the list and apply the new setting using `ALTER SYSTEM SET shared_preload_libraries=`. + +For example: + +```sql +postgres=# ALTER SYSTEM SET shared_preload_libraries=pg_stat_statements,auto_explain; +ALTER SYSTEM +postgres=# +``` + +!!! note + + Your list of libraries will most likely be different than the above example. + + If `pg_tde` is the only shared library in the list, and it was set via `postgresql.conf` you cannot disable it using the `ALTER SYSTEM SET ...` command. Instead: + + 1. Remove the `shared_preload_libraries` line from `postgresql.conf` + 2. Run `ALTER SYSTEM RESET shared_preload_libraries;` + +c. Restart the `postgresql` cluster to apply the changes: + +- On Debian and Ubuntu: + + ```sh + sudo systemctl restart postgresql + ``` + +- On RHEL and derivatives: + + ```sh + sudo systemctl restart postgresql-17 + ``` + +## Step 4. (Optional) Clean up configuration + +At this point it is safe to remove any configuration related to `pg_tde` from `postgresql.conf` and `postgresql.auto.conf`. Look for any configuration parameters prefixed with `pg_tde.` and remove or comment them out, as needed. + +## Troubleshooting: PANIC checkpoint not found on restart + +This can happen if WAL encryption was not properly disabled before removing `pg_tde` from `shared_preload_libraries`, when the PostgreSQL server was not restarted after disabling WAL encryption (see step 3.c). + +You might see this when restarting the PostgreSQL cluster: + +``` +2025-04-01 17:12:50.607 CEST [496385] PANIC: could not locate a valid checkpoint record at 0/17B2580 +``` + +To resolve it follow these steps: + +1. Re-add `pg_tde` to `shared_preload_libraries` +2. Restart the PostgreSQL cluster +3. Follow the [instructions for turning off WAL encryption](#step-2-turn-off-wal-encryption) before uninstalling the shared library again + +!!! note + + Two restarts are required to uninstall properly if WAL encryption was enabled: + + - First to disable WAL encryption + - Second to remove the `pg_tde` library diff --git a/contrib/pg_tde/documentation/docs/index.md b/contrib/pg_tde/documentation/docs/index.md index 2a4095213bc1b..cc0b425f42d86 100644 --- a/contrib/pg_tde/documentation/docs/index.md +++ b/contrib/pg_tde/documentation/docs/index.md @@ -1,51 +1,39 @@ -# `pg_tde` documentation +# Percona Transparent Data Encryption for PostgreSQL documentation -`pg_tde` is the open source PostgreSQL extension that provides Transparent Data Encryption (TDE) to protect data at rest. This ensures that the data stored on disk is encrypted, and no one can read it without the proper encryption keys, even if they gain access to the physical storage media. +Percona Transparent Data Encryption for PostgreSQL (`pg_tde`) is an open source, community driven and futureproof PostgreSQL extension that provides Transparent Data Encryption (TDE) to protect data at rest. `pg_tde` ensures that the data stored on disk is encrypted, and that no one can read it without the proper encryption keys, even if they gain access to the physical storage media. -Learn more [what is Transparent Data Encryption](tde.md#how-does-it-work) and [why you need it](tde.md#why-do-you-need-tde). +`pg_tde` is bundled as a component of Percona Server for PostgreSQL and requires its patches to function. It is packaged with Percona Distribution for PostgreSQL 17+ to ensure compatibility and proper operation. For more information, see the [Percona Distribution for PostgreSQL 17 documentation :octicons-link-external-16:](https://docs.percona.com/postgresql/17/). -!!! important +
- This is the {{release}} version of the extension and it is not meant for production use yet. We encourage you to use it in testing environments and [provide your feedback](https://forums.percona.com/c/postgresql/pg-tde-transparent-data-encryption-tde/82). - -[Get started](install.md){.md-button} -[What's new in pg_tde {{release}}](release-notes/release-notes.md){.md-button} +### :material-progress-download: Installation guide { .title } -## What's encrypted: +Get started quickly with the step-by-step installation instructions. -* User data in tables, including TOAST tables, that are created using the extension. Metadata of those tables is not encrypted. -* Temporary tables created during the database operation for data tables created using the extension -* Write-Ahead Log (WAL) data for the entire database cluster. This includes WAL data in encrypted and non-encrypted tables -* Indexes on encrypted tables -* Logical replication on encrypted tables +[How to install `pg_tde` :material-arrow-right:](install.md){ .md-button } -[Check the full feature list](features.md){.md-button} +
-## Known limitations +### :rocket: Features { .title } -* Keys in the local keyfile are stored unencrypted. For better security we recommend using the Key management storage. -* System tables are currently not encrypted. This means that statistics data and database metadata are currently not encrypted. - -* `pg_rewind` doesn't work with encrypted WAL for now. We plan to fix it in future releases. -* `pb_tde` Release candidate is incompatible with `pg_tde`Beta2 due to significant changes in code. There is no direct upgrade flow from one version to another. You must [uninstall](uninstall.md) `pg_tde` Beta2 first and then [install](install.md) and configure the new Release Candidate version. +Explore what features Percona's `pg_tde` extension brings to PostgreSQL. +[Check what you can do with `pg_tde` :material-arrow-right:](features.md){ .md-button } +
-## Versions and supported PostgreSQL deployments +### :material-cog-refresh-outline: Architecture { .title } -The `pg_tde` extension comes in two distinct versions with specific access methods to encrypt the data. These versions are database-specific and differ in terms of what they encrypt and with what access method. Each version is characterized by the database it supports, the access method it provides, and the scope of encryption it offers. +Understand how `pg_tde` integrates into PostgreSQL with Percona's architecture. Learn how keys are managed, how encryption is applied, and how our design ensures performance and security. -* **Version for Percona Server for PostgreSQL** +[Check what’s under the hood for `pg_tde` :material-arrow-right:](architecture/architecture.md){.md-button} - This `pg_tde` version is based on and supported for [Percona Server for PostgreSQL 17.x :octicons-link-external-16:](https://docs.percona.com/postgresql/17/postgresql-server.html) - an open source binary drop-in replacement for PostgreSQL Community. It provides the `tde_heap` access method and offers [full encryption capabilities](features.md). +
-* **Community version** (deprecated) +### :loudspeaker: What's new? { .title } - This version is available with PostgreSQL Community 16 and 17, and Percona Distribution for PostgreSQL 16. It provides the `tde_heap_basic` access method, offering limited encryption features. The limitations are in encrypting WAL data only for tables created using the extension and no support of index encryption nor logical replication. - -### Which version to choose? - -Enjoy full encryption with the Percona Server for PostgreSQL version and the `tde_heap` access method. The Community version is deprecated and is planned to be removed in future releases. - -Still not sure? [Contact our experts](https://www.percona.com/about/contact) to find the best solution for you. +Learn about the releases and changes in `pg_tde`. +[Check what’s new in the latest version :material-arrow-right:](release-notes/{{latestreleasenotes}}.md){.md-button} +
+
diff --git a/contrib/pg_tde/documentation/docs/index/about-tde.md b/contrib/pg_tde/documentation/docs/index/about-tde.md new file mode 100644 index 0000000000000..e2952ece5b8d2 --- /dev/null +++ b/contrib/pg_tde/documentation/docs/index/about-tde.md @@ -0,0 +1,12 @@ +# About Transparent Data Encryption + +Transparent Data Encryption (TDE) protects your data at rest by ensuring that even if the underlying storage is compromised, the data remains unreadable without the correct decryption keys. This is especially critical for environments handling sensitive, regulated, or high-value information. + +This process runs transparently in the background, with minimal impact on database operations. + +Use the links below to explore how `pg_tde` helps secure your PostgreSQL deployments: + +[Discover the benefits of pg_tde :material-arrow-right:](how-tde-helps.md){.md-button} +[Understand pg_tde limitations :material-arrow-right:](tde-limitations.md){.md-button} +[View the full feature list :material-arrow-right:](../features.md){.md-button} +[Get started with installation :material-arrow-right:](../install.md){.md-button} diff --git a/contrib/pg_tde/documentation/docs/index/how-does-tde-work.md b/contrib/pg_tde/documentation/docs/index/how-does-tde-work.md new file mode 100644 index 0000000000000..64e422e485633 --- /dev/null +++ b/contrib/pg_tde/documentation/docs/index/how-does-tde-work.md @@ -0,0 +1,21 @@ +# How pg_tde works + +To encrypt the data, two types of keys are used: + +* **Internal encryption keys** to encrypt user data. They are stored internally, near the data that they encrypt. +* The **principal key** to encrypt database keys. It is kept separately from the database keys and is managed externally in the key management store. + +!!! note + For more information on managing and storing principal keys externally, including supported key management systems and the local keyring option, see [Key management overview](../global-key-provider-configuration/overview.md). + +The encryption process works as follows: + +![image](../_images/tde-flow.png) + +When a user creates an encrypted table using `pg_tde`, a new random key is generated internally for that table and is encrypted using the AES-CBC cipher algorithm. This key is used to encrypt all data the user inserts in that table. Eventually the encrypted data gets stored in the underlying storage. + +The internal key itself is encrypted using the principal key. The principal key is stored externally in the key management store. + +Similarly when the user queries the encrypted table, the principal key is retrieved from the key store to decrypt the internal key. Then the same unique internal key for that table is used to decrypt the data, and unencrypted data gets returned to the user. So, effectively, every TDE table has a unique key, and each table key is encrypted using the principal key. + +[Understand the encrypted data scope :material-arrow-right:](tde-encrypts.md){.md-button} diff --git a/contrib/pg_tde/documentation/docs/index/how-tde-helps.md b/contrib/pg_tde/documentation/docs/index/how-tde-helps.md new file mode 100644 index 0000000000000..1f213c20b2e0b --- /dev/null +++ b/contrib/pg_tde/documentation/docs/index/how-tde-helps.md @@ -0,0 +1,22 @@ +# Benefits of pg_tde + +The benefits of using `pg_tde` are outlined below for different users and organizations. + +## Benefits for organizations + +* **Data safety:** Prevents unauthorized access to stored data, even if backup files or storage devices are stolen or leaked. +* **Enterprise-ready Architecture:** Supports both single and multi-tenancy, giving flexibility for SaaS providers or internal multi-user systems. + +## Benefits for DBAs and engineers + +* **Granular control:** Encrypt specific tables or databases instead of the entire system, reducing performance overhead. +* **Operational simplicity:** Works transparently without requiring major application changes. +* **Defense in depth:** Adds another layer of protection to existing controls like TLS (encryption in transit), access control, and role-based permissions. + +When combined with the external Key Management Systems (KMS), `pg_tde` enables centralized control, auditing, and rotation of encryption keys—critical for secure production environments. + +!!! admonition "See also" + + You can find more information on Transparent Data Encryption (TDE) in [this article](https://www.percona.com/blog/transparent-data-encryption-tde/). + +[Learn how pg_tde works :material-arrow-right:](how-does-tde-work.md){.md-button} diff --git a/contrib/pg_tde/documentation/docs/index/supported-versions.md b/contrib/pg_tde/documentation/docs/index/supported-versions.md new file mode 100644 index 0000000000000..7d31c7d45664f --- /dev/null +++ b/contrib/pg_tde/documentation/docs/index/supported-versions.md @@ -0,0 +1,21 @@ +# Versions and Supported PostgreSQL deployments + +The `pg_tde` extension is available for [Percona Server for PostgreSQL 17.x](https://docs.percona.com/postgresql/17/postgresql-server.html), an open source, drop-in replacement for PostgreSQL Community. This version provides the `tde_heap` access method and offers [full encryption capabilities](../features.md), including encryption of tables, indexes and WAL data. + +The extension is tightly integrated with Percona Server for PostgreSQL to deliver enhanced encryption functionality that is not available in community builds. + +## Why choose Percona Server for PostgreSQL? + +By using our PostgreSQL distribution, you get: + +- **Full encryption support** through the `tde_heap` access method, including tables, indexes and WAL data. +- **Enhanced performance and enterprise-ready features** not available in community builds. +- **Regular updates and security patches** backed by Percona’s expert support team. +- **Professional support** and guidance for secure PostgreSQL deployments. + +!!! note + Support for earlier or limited versions of `pg_tde` (such as `tde_heap_basic`) has been deprecated. + +Still unsure which deployment fits your needs? [Contact our experts](https://www.percona.com/about/contact) to find the best solution for your environment. + +[Get started with installation :material-arrow-right:](../install.md){.md-button} diff --git a/contrib/pg_tde/documentation/docs/table-access-method.md b/contrib/pg_tde/documentation/docs/index/table-access-method.md similarity index 84% rename from contrib/pg_tde/documentation/docs/table-access-method.md rename to contrib/pg_tde/documentation/docs/index/table-access-method.md index 818ac7f479f4f..90957facded97 100644 --- a/contrib/pg_tde/documentation/docs/table-access-method.md +++ b/contrib/pg_tde/documentation/docs/index/table-access-method.md @@ -1,8 +1,8 @@ -# Table access method +# Table Access Methods and pg_tde A table access method is the way how PostgreSQL stores the data in a table. The default table access method is `heap`. PostgreSQL organizes data in a heap structure, meaning there is no particular order to the rows in the table. Each row is stored independently and identified by its unique row identifier (TID). -## How the `heap` access method works +## How the heap access method works **Insertion**: When a new row is inserted, PostgreSQL finds a free space in the tablespace and stores the row there. @@ -16,7 +16,7 @@ Custom access methods allow you to implement and define your own way of organizi Custom access methods are typically available with PostgreSQL extensions. When you install an extension and enable it in PostgreSQL, a custom access method is created. -An example of such an approach is the `tde_heap` access method. It is automatically created **only** for the databases where you [enabled the `pg_tde` extension](setup.md) and configured the key provider, enabling you to encrypt the data. +An example of such an approach is the `tde_heap` access method. It is automatically created **only** for the databases where you [enabled the `pg_tde` extension](../setup.md) and configured the key provider, enabling you to encrypt the data. To use a custom access method, specify the `USING` clause for the `CREATE TABLE` command: @@ -28,34 +28,33 @@ CREATE TABLE table_name ( ) USING tde_heap; ``` -### How `tde_heap` works +### How tde_heap works with pg_tde -The `tde_heap` access method works on top of the default `heap` access method and is a marker to point which tables require encryption. It uses the custom storage manager TDE SMGR, which becomes active only after you installed the `pg_tde` extension. +The `tde_heap` access method works on top of the default `heap` access method and is a marker to point which tables require encryption. It uses the custom storage manager TDE SMGR, which becomes active only after you installed the `pg_tde` extension. -Every data modification operation is first sent to the Buffer Manager, which updates the buffer cache. Then, it is passed to the storage manager, which then writes it to disk. When a table requires encryption, the data is sent to the TDE storage manager, where it is encrypted before written to disk. +Every data modification operation is first sent to the Buffer Manager, which updates the buffer cache. Then, it is passed to the storage manager, which then writes it to disk. When a table requires encryption, the data is sent to the TDE storage manager, where it is encrypted before written to disk. -Similarly, when a client queries the database, the PostgreSQL core sends the request to the Buffer Manager which checks if the requested data is already in the buffer cache. If it’s not there, the Buffer Manager requests the data from the storage manager. The TDE storage manager reads the encrypted data from disk, decrypts it and loads it to the buffer cache. The Buffer Manager sends the requested data to the PostgreSQL core and then to the client. +Similarly, when a client queries the database, the PostgreSQL core sends the request to the Buffer Manager which checks if the requested data is already in the buffer cache. If it’s not there, the Buffer Manager requests the data from the storage manager. The TDE storage manager reads the encrypted data from disk, decrypts it and loads it to the buffer cache. The Buffer Manager sends the requested data to the PostgreSQL core and then to the client. - -Thus, the encryption is done at the storage manager level. +Thus, the encryption is done at the storage manager level. ## Changing the default table access method -You can change the default table access method so that every table in the entire database cluster is created using the custom access method. For example, you can enable data encryption by default by defining the `tde_heap` as the default table access method. +You can change the default table access method so that every table in the entire database cluster is created using the custom access method. For example, you can enable data encryption by default by defining the `tde_heap` as the default table access method. However, consider the following before making this change: -* This is a global setting and applies across the entire database cluster and not just a single database. -We recommend setting it with caution because all tables and materialized views created without an explicit access method in their `CREATE` statement will default to the specified table access method. +* This is a global setting and applies across the entire database cluster and not just a single database. +We recommend setting it with caution because all tables and materialized views created without an explicit access method in their `CREATE` statement will default to the specified table access method. * You must create the `pg_tde` extension and configure the key provider for all databases before you modify the configuration. Otherwise PostgreSQL won't find the specified access method and will throw an error. -Here's how you can set the new default table access method: +Here is how you can set the new default table access method: -1. Add the access method to the `default_table_access_method` parameter. +1. Add the access method to the `default_table_access_method` parameter: - === "via the SQL statement" + === "via the `ALTER SYSTEM` command" - Use the `ALTER SYSTEM` command. This requires superuser or ALTER SYSTEM privileges. + Use `ALTER SYSTEM`, it requires superuser or `ALTER SYSTEM` privileges. ```sql ALTER SYSTEM SET default_table_access_method = tde_heap; @@ -69,7 +68,7 @@ Here's how you can set the new default table access method: default_table_access_method = 'tde_heap' ``` - === "via the SET command" + === "via the `SET` command" You can use the SET command to change the default table access method temporarily, for the current session. @@ -89,3 +88,4 @@ Here's how you can set the new default table access method: SELECT pg_reload_conf(); ``` +[Understand pg_tde's limitations :material-arrow-right:](tde-limitations.md){.md-button} diff --git a/contrib/pg_tde/documentation/docs/index/tde-encrypts.md b/contrib/pg_tde/documentation/docs/index/tde-encrypts.md new file mode 100644 index 0000000000000..19e9357057c50 --- /dev/null +++ b/contrib/pg_tde/documentation/docs/index/tde-encrypts.md @@ -0,0 +1,10 @@ +# Encrypted data scope + +`pg_tde` encrypts the following components: + +* **User data** in tables using the extension, including associated TOAST data. The table metadata (column names, data types, etc.) is not encrypted. +* **Temporary tables** created during the query execution, for data tables created using the extension. +* **Write-Ahead Log (WAL) data** for the entire database cluster. This includes WAL data in encrypted and non-encrypted tables. +* **Indexes** on encrypted tables. + +[Check out the table access methods :material-arrow-right:](table-access-method.md){.md-button} diff --git a/contrib/pg_tde/documentation/docs/index/tde-limitations.md b/contrib/pg_tde/documentation/docs/index/tde-limitations.md new file mode 100644 index 0000000000000..5208c7ff6b5e8 --- /dev/null +++ b/contrib/pg_tde/documentation/docs/index/tde-limitations.md @@ -0,0 +1,110 @@ +# Limitations of pg_tde + +Limitations of `pg_tde` {{release}}: + +* PostgreSQL’s internal system tables, which include statistics and metadata, are not encrypted. +* Temporary files created when queries exceed `work_mem` are not encrypted. These files may persist during long-running queries or after a server crash which can expose sensitive data in plaintext on disk. + +## Currently unsupported WAL tools + +The following tools are currently unsupported with `pg_tde` WAL encryption: + +* `pg_createsubscriber` +* `pg_receivewal` +* `Barman` +* `pg_verifybackup` by default fails with checksum or WAL key size mismatch errors. + As a workaround, use `-s` (skip checksum) and `-n` (`--no-parse-wal`) to verify backups. + +The following tools and extensions in Percona Distribution for PostgreSQL have been tested and verified to work with `pg_tde` WAL encryption: + +## Supported WAL tools + +The following tools have been tested and verified by Percona to work with `pg_tde` WAL encryption: + +* Patroni, for an example configuration see the following [Patroni configuration file](#example-patroni-configuration) +* `pg_basebackup` (with `--wal-method=stream` or `--wal-method=none`), for details on using `pg_basebackup` with WAL encryption, see [Backup with WAL encryption enabled](../how-to/backup-wal-enabled.md) +* `pg_resetwal` +* `pg_rewind` +* `pg_upgrade` +* `pg_waldump` +* pgBackRest + +## Example Patroni configuration + +The following is a Percona-tested example configuration. + +??? example "Click to expand the Percona-tested Patroni configuration" + ```yaml + # Example Patroni configuration file maintained by Percona + # Source: https://github.com/jobinau/pgscripts/blob/main/patroni/patroni.yml + scope: tde + name: pg1 + restapi: + listen: 0.0.0.0:8008 + connect_address: pg1:8008 + etcd3: + host: etcd1:2379 + bootstrap: + dcs: + ttl: 30 + loop_wait: 10 + retry_timeout: 10 + maximum_lag_on_failover: 1048576 + postgresql: + use_pg_rewind: true + use_slots: true + parameters: + archive_command: "/lib/postgresql/17/bin/pg_tde_archive_decrypt %f %p \"pgbackrest --stanza=tde archive-push %%p\"" + archive_timeout: 600s + archive_mode: "on" + logging_collector: "on" + restore_command: "/lib/postgresql/17/bin/pg_tde_restore_encrypt %f %p \"pgbackrest --stanza=tde archive-get %%f \\\"%%p\\\"\"" + pg_hba: + - local all all peer + - host all all 0.0.0.0/0 scram-sha-256 + - host all all ::/0 scram-sha-256 + - local replication all peer + - host replication all 0.0.0.0/0 scram-sha-256 + - host replication all ::/0 scram-sha-256 + initdb: + - encoding: UTF8 + - data-checksums + - set: shared_preload_libraries=pg_tde + post_init: /usr/local/bin/setup_cluster.sh + postgresql: + listen: 0.0.0.0:5432 + connect_address: pg1:5432 + data_dir: /var/lib/postgresql/patroni-17 + bin_dir: /lib/postgresql/17/bin + pgpass: /var/lib/postgresql/patronipass + authentication: + replication: + username: replicator + password: rep-pass + superuser: + username: postgres + password: secretpassword + parameters: + unix_socket_directories: /tmp + # Use unix_socket_directories: /var/run/postgresql for Debian/Ubuntu distributions + watchdog: + mode: off + tags: + nofailover: false + noloadbalance: false + clonefrom: false + nosync: false + ``` + +!!! warning + The above example is Percona-tested, but Patroni versions differ, especially with discovery backends such as `etcd`. Ensure you adjust the configuration to match your environment, version, and security requirements. + +## Next steps + +Check which PostgreSQL versions and deployment types are compatible with `pg_tde` before planning your installation. + +[View the versions and supported deployments :material-arrow-right:](supported-versions.md){.md-button} + +Begin the installation process when you're ready to set up encryption. + +[Start installing `pg_tde`](../install.md){.md-button} diff --git a/contrib/pg_tde/documentation/docs/install.md b/contrib/pg_tde/documentation/docs/install.md index e4a0cfe78ef25..542c876c2726b 100644 --- a/contrib/pg_tde/documentation/docs/install.md +++ b/contrib/pg_tde/documentation/docs/install.md @@ -1,8 +1,12 @@ -# Installation +# Install pg_tde -Install `pg_tde` using one of the available installation methods: +!!! warning "No upgrade path from RC to GA" + There is no safe upgrade path from the previous versions, such as Release Candidate 2, to the General Availability (GA) version of `pg_tde`. + We recommend starting with a **clean installation** for GA deployments. Avoid using RC environments in production. -=== ":octicons-terminal-16: Package manager" +To install `pg_tde`, use one of the following methods: + +=== ":octicons-terminal-16: Package manager" The packages are available for the following operating systems: @@ -23,13 +27,16 @@ Install `pg_tde` using one of the available installation methods: [Run in Docker :material-arrow-right:](https://docs.percona.com/postgresql/latest/docker.html){.md-button} -=== ":octicons-download-16: Manual download" +=== ":octicons-download-16: Tar download" - `pg_tde` is included in the Percona Distribution for PostgreSQL tarball. Check below to get access to a detailed step-by-step guide. + `pg_tde` is included in the Percona Distribution for PostgreSQL tarball. Select the below link to access the step-by-step guide. [Install from tarballs :material-arrow-right:](https://docs.percona.com/postgresql/17/tarball.html){.md-button} +Follow the configuration steps below to continue: + +[Configure pg_tde :material-arrow-right:](setup.md){.md-button} -## Next steps +If you’ve already completed these steps, feel free to skip ahead to a later section: -[Setup :material-arrow-right:](setup.md){.md-button} + [Configure Key Management (KMS)](global-key-provider-configuration/overview.md){.md-button} [Validate Encryption with pg_tde](test.md){.md-button} [Configure WAL encryption](wal-encryption.md){.md-button} diff --git a/contrib/pg_tde/documentation/docs/js/consent.js b/contrib/pg_tde/documentation/docs/js/consent.js index b6f8a8ac0a3ac..4ff680d8a79e0 100644 --- a/contrib/pg_tde/documentation/docs/js/consent.js +++ b/contrib/pg_tde/documentation/docs/js/consent.js @@ -3,4 +3,4 @@ if (consent && consent.custom) { /* The user accepted the cookie */ } else { /* The user rejected the cookie */ -} \ No newline at end of file +} diff --git a/contrib/pg_tde/documentation/docs/js/promptremover.js b/contrib/pg_tde/documentation/docs/js/promptremover.js index aef117323fbe0..a6241fd80d221 100644 --- a/contrib/pg_tde/documentation/docs/js/promptremover.js +++ b/contrib/pg_tde/documentation/docs/js/promptremover.js @@ -38,7 +38,3 @@ document.addEventListener("DOMContentLoaded", function(){ commandButtonElement.item(0).setAttribute("data-clipboard-text", trueCommand); } }); - - - - diff --git a/contrib/pg_tde/documentation/docs/multi-tenant-setup.md b/contrib/pg_tde/documentation/docs/multi-tenant-setup.md deleted file mode 100644 index 6d8b0f09300c6..0000000000000 --- a/contrib/pg_tde/documentation/docs/multi-tenant-setup.md +++ /dev/null @@ -1,138 +0,0 @@ -# Set up multi-tenancy - -The steps below describe how to set up multi-tenancy with `pg_tde`. Multi-tenancy allows you to encrypt different databases with different keys. This provides granular control over data and enables you to introduce different security policies and access controls for each database so that only authorized users of specific databases have access to the data. - -If you don't need multi-tenancy, use the global key provider. See the configuration steps from the [Setup](setup.md) section. - -For how to enable WAL encryption, refer to the [WAL encryption](wal-encryption.md) section. - ---8<-- "kms-considerations.md" - -## Enable extension - -Load the `pg_tde` at startup time. The extension requires additional shared memory; therefore, add the `pg_tde` value for the `shared_preload_libraries` parameter and restart the `postgresql` cluster. - -1. Use the [ALTER SYSTEM :octicons-link-external-16:](https://www.postgresql.org/docs/current/sql-altersystem.html) command from `psql` terminal to modify the `shared_preload_libraries` parameter. This requires superuser privileges. - - ``` - ALTER SYSTEM SET shared_preload_libraries = 'pg_tde'; - ``` - -2. Start or restart the `postgresql` cluster to apply the changes. - - * On Debian and Ubuntu: - - ```sh - sudo systemctl restart postgresql-17 - ``` - - * On RHEL and derivatives - - ```sh - sudo systemctl restart postgresql-17 - ``` - -3. Create the extension using the [CREATE EXTENSION](https://www.postgresql.org/docs/current/sql-createextension.html) command. You must have the privileges of a superuser or a database owner to use this command. Connect to `psql` as a superuser for a database and run the following command: - - ``` - CREATE EXTENSION pg_tde; - ``` - - The `pg_tde` extension is created for the currently used database. To enable data encryption in other databases, you must explicitly run the `CREATE EXTENSION` command against them. - - !!! tip - - You can have the `pg_tde` extension automatically enabled for every newly created database. Modify the template `template1` database as follows: - - ```sh - psql -d template1 -c 'CREATE EXTENSION pg_tde;' - ``` - -## Key provider configuration - -You must do these steps for every database where you have created the extension. - -1. Set up a key provider. - - === "With KMIP server" - - Make sure you have obtained the root certificate for the KMIP server and the keypair for the client. The client key needs permissions to create / read keys on the server. Find the [configuration guidelines for the HashiCorp Vault Enterprise KMIP Secrets Engine](https://developer.hashicorp.com/vault/tutorials/enterprise/kmip-engine). - - For testing purposes, you can use the PyKMIP server which enables you to set up required certificates. To use a real KMIP server, make sure to obtain the valid certificates issued by the key management appliance. - - ``` - SELECT pg_tde_add_key_provider_kmip('provider-name','kmip-addr', 5696, '/path_to/server_certificate.pem', '/path_to/client_key.pem'); - ``` - - where: - - * `provider-name` is the name of the provider. You can specify any name, it's for you to identify the provider. - * `kmip-addr` is the IP address of a domain name of the KMIP server - * `port` is the port to communicate with the KMIP server. Typically used port is 5696. - * `server-certificate` is the path to the certificate file for the KMIP server. - * `client key` is the path to the client key. - - :material-information: Warning: This example is for testing purposes only: - - ``` - SELECT pg_tde_add_key_provider_kmip('kmip','127.0.0.1', 5696, '/tmp/server_certificate.pem', '/tmp/client_key_jane_doe.pem'); - ``` - - === "With HashiCorp Vault" - - The Vault server setup is out of scope of this document. - - ```sql - SELECT pg_tde_add_key_provider_vault_v2('provider-name','root_token','url','mount','ca_path'); - ``` - - where: - - * `url` is the URL of the Vault server - * `mount` is the mount point where the keyring should store the keys - * `root_token` is an access token with read and write access to the above mount point - * [optional] `ca_path` is the path of the CA file used for SSL verification - - :material-information: Warning: This example is for testing purposes only: - - ``` - SELECT pg_tde_add_key_provider_file_vault_v2('my-vault','http://vault.vault.svc.cluster.local:8200,'secret/data','hvs.zPuyktykA...example...ewUEnIRVaKoBzs2', NULL); - ``` - - === "With a keyring file" - - This setup is intended for development and stores the keys unencrypted in the specified data file. - - ```sql - SELECT pg_tde_add_key_provider_file('provider-name','/path/to/the/keyring/data.file'); - ``` - - :material-information: Warning: This example is for testing purposes only: - - ```sql - SELECT pg_tde_add_key_provider_file('file-keyring','/tmp/pg_tde_test_local_keyring.per'); - ``` - - -2. Add a principal key - - ```sql - SELECT pg_tde_set_principal_key('name-of-the-principal-key', 'provider-name','ensure_new_key'); - ``` - - where: - - * `name-of-the-principal-key` is the name of the principal key. You will use this name to identify the key. - * `provider-name` is the name of the key provider you added before. The principal key will be associated with this provider. - * `ensure_new_key` defines if a principal key must be unique. The default value `true` means that you must speficy a unique key during key rotation. The `false` value allows reusing an existing principal key. - - :material-information: Warning: This example is for testing purposes only: - - ```sql - SELECT pg_tde_set_principal_key('test-db-master-key','file-vault','ensure_new_key'); - ``` - - The key is auto-generated. - - - :material-information: Info: The key provider configuration is stored in the database catalog in an unencrypted table. See [how to use external reference to parameters](external-parameters.md) to add an extra security layer to your setup. \ No newline at end of file diff --git a/contrib/pg_tde/documentation/docs/release-notes/alpha1.md b/contrib/pg_tde/documentation/docs/release-notes/alpha1.md index aad9d43c5ef47..401819f529ba1 100644 --- a/contrib/pg_tde/documentation/docs/release-notes/alpha1.md +++ b/contrib/pg_tde/documentation/docs/release-notes/alpha1.md @@ -1,10 +1,9 @@ # pg_tde Alpha 1 (2024-03-28) -`pg_tde` extension brings in [Transparent Data Encryption (TDE)](../tde.md) to PostgreSQL and enables you to keep sensitive data safe and secure. +`pg_tde` extension brings in [Transparent Data Encryption (TDE)](../index/about-tde.md) to PostgreSQL and enables you to keep sensitive data safe and secure. [Get started](../install.md){.md-button} - !!! important This version of Percona Transparent Data Encryption extension **is @@ -12,7 +11,6 @@ This will help us improve the product and make it production-ready faster. - ## Release Highlights The Alpha1 version of the extension introduces the following key features: @@ -28,7 +26,7 @@ The Alpha1 version of the extension introduces the following key features: * The keyring configuration is now stored in a catalog separately for each database, instead of a configuration file * Avoid storing secrets in the unencrypted catalog by configuring keyring parameters to be read from external sources (file, http(s) request) -## Improvements +## Improvements * Renamed the repository and Docker image from `postgres-tde-ext` to `pg_tde`. The extension name remains unchanged * Changed the Initialization Vector (IV) calculation of both the data and internal keys @@ -36,9 +34,8 @@ The Alpha1 version of the extension introduces the following key features: ## Bugs fixed * Fixed toast related crashes -* Fixed a crash with the DELETE statement +* Fixed a crash with the DELETE statement * Fixed performance-related issues * Fixed a bug where `pg_tde` sent many 404 requests to the Vault server * Fixed сompatibility issues with old OpenSSL versions -* Fixed сompatibility with old Curl versions - +* Fixed сompatibility with old Curl versions diff --git a/contrib/pg_tde/documentation/docs/release-notes/beta.md b/contrib/pg_tde/documentation/docs/release-notes/beta.md index c8c540a4f8935..f01faac5fc92e 100644 --- a/contrib/pg_tde/documentation/docs/release-notes/beta.md +++ b/contrib/pg_tde/documentation/docs/release-notes/beta.md @@ -1,6 +1,6 @@ # pg_tde Beta (2024-06-30) -`pg_tde` extension brings in [Transparent Data Encryption (TDE)](../tde.md) to PostgreSQL and enables you to keep sensitive data safe and secure. +`pg_tde` extension brings in [Transparent Data Encryption (TDE)](../index/about-tde.md) to PostgreSQL and enables you to keep sensitive data safe and secure. [Get started](../install.md){.md-button} @@ -22,4 +22,3 @@ Starting with `pg_tde` Beta, the access method for `pg_tde` extension is renamed * Fixed the issue with adjusting a current position in a file by using raw file descriptor for the `lseek` function. (Thanks to user _rainhard_ for providing the fix) * Enhanced the init script to consider a custom superuser for the POSTGRES_USER parameter when `pg_tde` is running via Docker (Thanks to _Alejandro Paredero_ for reporting the issue) - diff --git a/contrib/pg_tde/documentation/docs/release-notes/beta2.md b/contrib/pg_tde/documentation/docs/release-notes/beta2.md index 8c0e8203d439f..1cd220d7d4785 100644 --- a/contrib/pg_tde/documentation/docs/release-notes/beta2.md +++ b/contrib/pg_tde/documentation/docs/release-notes/beta2.md @@ -1,10 +1,9 @@ # pg_tde Beta 2 (2024-12-16) -`pg_tde` extension brings in [Transparent Data Encryption (TDE)](../tde.md) to PostgreSQL and enables you to keep sensitive data safe and secure. +`pg_tde` extension brings in [Transparent Data Encryption (TDE)](../index/about-tde.md) to PostgreSQL and enables you to keep sensitive data safe and secure. [Get started](../install.md){.md-button} - !!! important This version of Percona Transparent Data Encryption extension **is @@ -26,8 +25,8 @@ The Beta 2 version introduces the following features and improvements: ### New Features * Added the `tde_heap` access method with which you can now enable index encryption for encrypted tables and global WAL data encryption. To use this access method, you must install Percona Server for PostgreSQL. Check the [installation guide](../install.md) -* Added event triggers to identify index creation operations on encrypted tables and store those in a custom storage. -* Added support for secure transfer of keys using the [OASIS Key Management Interoperability Protocol (KMIP)](https://docs.oasis-open.org/kmip/kmip-spec/v2.0/os/kmip-spec-v2.0-os.html). The KMIP implementation was tested with the PyKMIP server and the HashiCorp Vault Enterprise KMIP Secrets Engine. +* Added event triggers to identify index creation operations on encrypted tables and store those in a custom storage. +* Added support for secure transfer of keys using the [OASIS Key Management Interoperability Protocol (KMIP)](https://docs.oasis-open.org/kmip/kmip-spec/v2.0/os/kmip-spec-v2.0-os.html). The KMIP implementation was tested with the PyKMIP server and the HashiCorp Vault Enterprise KMIP Secrets Engine. ### Improvements @@ -53,6 +52,3 @@ The Beta 2 version introduces the following features and improvements: * Fixed multiple bugs with `tde_heap_basic` and TOAST records * Fixed various memory leaks - - - diff --git a/contrib/pg_tde/documentation/docs/release-notes/mvp.md b/contrib/pg_tde/documentation/docs/release-notes/mvp.md index 9f84d24bf46c6..47e52b3bc019b 100644 --- a/contrib/pg_tde/documentation/docs/release-notes/mvp.md +++ b/contrib/pg_tde/documentation/docs/release-notes/mvp.md @@ -3,6 +3,6 @@ The Minimum Viable Product (MVP) version of `pg_tde` introduces the following functionality: * Encryption of heap tables, including TOAST -* Encryption keys are stored either in Hashicorp Vault server or in local keyring file (for development) +* Encryption keys are stored either in Hashicorp Vault server or in local keyring file (for development) * The key storage is configurable via separate JSON configuration files -* Replication support \ No newline at end of file +* Replication support diff --git a/contrib/pg_tde/documentation/docs/release-notes/rc.md b/contrib/pg_tde/documentation/docs/release-notes/rc.md index 9b07d45121f1d..416801e1eaa07 100644 --- a/contrib/pg_tde/documentation/docs/release-notes/rc.md +++ b/contrib/pg_tde/documentation/docs/release-notes/rc.md @@ -1,19 +1,18 @@ -# pg_tde Release Candidate ({{date.RC}}) +# pg_tde Release Candidate 1 ({{date.RC}}) -`pg_tde` extension brings in [Transparent Data Encryption (TDE)](../tde.md) to PostgreSQL and enables you to keep sensitive data safe and secure. +`pg_tde` extension brings in [Transparent Data Encryption (TDE)](../index/about-tde.md) to PostgreSQL and enables you to keep sensitive data safe and secure. [Get started](../install.md){.md-button} - ## Release Highlights This release provides the following features and improvements: -* **Improved performance with redesigned WAL encryption**. +* **Improved performance with redesigned WAL encryption**. The approach to WAL encryption has been redesigned. Now, `pg_tde` encrypts entire WAL files starting from the first WAL write after the server was started with the encryption turned on. The information about what is encrypted is stored in the internal key metadata. This change improves WAL encryption flow with native replication and increases performance for large scale databases. -* **Default encryption key for single-tenancy**. +* **Default encryption key for single-tenancy**. The new functionality allows you to set a default principal key for the entire database cluster. This key is used to encrypt all databases and tables that do not have a custom principal key set. This feature simplifies encryption configuration and management in single-tenant environments where each user has their own database instance. @@ -35,91 +34,86 @@ This release provides the following features and improvements: ## Upgrade considerations -`pg_tde` Release Candidate is not backward compatible with `pg_tde` Beta2 due to significant changes in code. This means you cannot directly upgrade from one version to another. You must [uninstall](../uninstall.md) `pg_tde` Beta2 first and then [install](../install.md) and configure the new Release Candidate version. +`pg_tde` Release Candidate is not backward compatible with `pg_tde` Beta2 due to significant changes in code. This means you cannot directly upgrade from one version to another. You must [uninstall](../how-to/uninstall.md) `pg_tde` Beta2 first and then [install](../install.md) and configure the new Release Candidate version. ## Known issues -* The default `mlock` limit on Rocky Linux 8 for ARM64-based architectures is 64 Kb. The internal `pg_tde` key size is 40 bytes, which results in about 1600 keys that fall into the limit. When the `mlock` limit is reached, `pg_tde` cannot lock memory for more keys and can fail with the error. +* The default `mlock` limit on Rocky Linux 8 for ARM64-based architectures equals the memory page size and is 64 Kb. This results in the child process with `pg_tde` failing to allocate another memory page because the max memory limit is reached by the parent process. - To prevent this, you can change the `mlock` limit: + To prevent this, you can change the `mlock` limit to be at least twice bigger than the memory page size: - * temporarily for the current session using the `ulimit -l ` command. - * set a new hard limit in the `/etc/security/limits.conf` file. To do so, you require the superuser privileges. + * temporarily for the current session using the `ulimit -l ` command. + * set a new hard limit in the `/etc/security/limits.conf` file. To do so, you require the superuser privileges. - Adjust the limits with caution since it affects other processes running in your system. + Adjust the limits with caution since it affects other processes running in your system. * You can now delete global key providers even when their associated principal key is still in use. This known issue will be fixed in the next release. For now, avoid deleting global key providers. - - - ## Changelog ### New Features -* [PG-1234](https://perconadev.atlassian.net/browse/PG-1234) - Added functions for separate global and database key management permissions +* [PG-1234](https://perconadev.atlassian.net/browse/PG-1234) - Added functions for separate global and database key management permissions. -* [PG-1255](https://perconadev.atlassian.net/browse/PG-1255) - Added functionality to delete key providers +* [PG-1255](https://perconadev.atlassian.net/browse/PG-1255) - Added functionality to delete key providers. -* [PG-1256](https://perconadev.atlassian.net/browse/PG-1256) - Added single-tenant support via the default principal key functionality +* [PG-1256](https://perconadev.atlassian.net/browse/PG-1256) - Added single-tenant support via the default principal key functionality. -* [PG-1258](https://perconadev.atlassian.net/browse/PG-1258) - Added functions to display additional information about principal keys / providers +* [PG-1258](https://perconadev.atlassian.net/browse/PG-1258) - Added functions to display additional information about principal keys / providers. -* [PG-1294](https://perconadev.atlassian.net/browse/PG-1294) - Redesigned WAL encryption +* [PG-1294](https://perconadev.atlassian.net/browse/PG-1294) - Redesigned WAL encryption. -* [PG-1303](https://perconadev.atlassian.net/browse/PG-1303) - Deprecated tde_heap_basic access method +* [PG-1303](https://perconadev.atlassian.net/browse/PG-1303) - Deprecated tde_heap_basic access method. ## Improvements -* [PG-858](https://perconadev.atlassian.net/browse/PG-858) - Refactored internal/principal key LWLocks to make local databases inherit a global key provider +* [PG-858](https://perconadev.atlassian.net/browse/PG-858) - Refactored internal/principal key LWLocks to make local databases inherit a global key provider. -* [PG-1243](https://perconadev.atlassian.net/browse/PG-1243) - Investigated performance issues at a specific threshold and large databases and updated documentation about handling hint bits +* [PG-1243](https://perconadev.atlassian.net/browse/PG-1243) - Investigated performance issues at a specific threshold and large databases and updated documentation about handling hint bits. -* [PG-1310](https://perconadev.atlassian.net/browse/PG-1310) - Added access method enforcement via the GUC variable +* [PG-1310](https://perconadev.atlassian.net/browse/PG-1310) - Added access method enforcement via the GUC variable. -* [PG-1361](https://perconadev.atlassian.net/browse/PG-1361) - Fixed pg_tde relocatability +* [PG-1361](https://perconadev.atlassian.net/browse/PG-1361) - Fixed pg_tde relocatability. -* [PG-1380](https://perconadev.atlassian.net/browse/PG-1380) - Added support for `pg_tde_is_encrypted()` function on indexes and sequences +* [PG-1380](https://perconadev.atlassian.net/browse/PG-1380) - Added support for `pg_tde_is_encrypted()` function on indexes and sequences. ### Bugs Fixed +* [PG-821](https://perconadev.atlassian.net/browse/PG-821) - Fixed the issue with `pg_basebackup` failing when configuring replication. -* [PG-821](https://perconadev.atlassian.net/browse/PG-821) - Fixed the issue with `pg_basebackup` failing when configuring replication +* [PG-847](https://perconadev.atlassian.net/browse/PG-847) - Fixed the issue with `pg_basebackup` and `pg_checksum` throwing an error on files created by `pg_tde` when the checksum is enabled on the database cluster. -* [PG-847](https://perconadev.atlassian.net/browse/PG-847) - Fixed the issue with `pg_basebackup` and `pg_checksum` throwing an error on files created by `pg_tde` when the checksum is enabled on the database cluster +* [PG-1004](https://perconadev.atlassian.net/browse/PG-1004) - Fixed the issue with `pg_checksums` utility failing during checksum verification on `pg_tde` tables. Now `pg_checksum` skips encrypted relations by looking if the relation has a custom storage manager (SMGR) key. -* [PG-1004](https://perconadev.atlassian.net/browse/PG-1004) - Fixed the issue with `pg_checksums` utility failing during checksum verification on `pg_tde` tables. Now `pg_checksum` skips encrypted relations by looking if the relation has a custom storage manager (SMGR) key +* [PG-1373](https://perconadev.atlassian.net/browse/PG-1373) - Fixed the issue with potential unterminated strings by using the `memcpy()` or `strlcpy()` instead of the `strncpy()` function. -* [PG-1373](https://perconadev.atlassian.net/browse/PG-1373) - Fixed the issue with potential unterminated strings by using the `memcpy()` or `strlcpy()` instead of the `strncpy()` function +* [PG-1378](https://perconadev.atlassian.net/browse/PG-1378) - Fixed the issue with toast tables created by the `ALTER TABLE` command not being encrypted. -* [PG-1378](https://perconadev.atlassian.net/browse/PG-1378) - Fixed the issue with toast tables created by the `ALTER TABLE` command not being encrypted +* [PG-1379](https://perconadev.atlassian.net/browse/PG-1379) - Fixed sequence and alter table handling in the event trigger. -* [PG-1379](https://perconadev.atlassian.net/browse/PG-1379) - Fixed sequence and alter table handling in the event trigger +* [PG-1222](https://perconadev.atlassian.net/browse/PG-1222) - Fixed the bug with confused relations with the same `RelFileNumber` in different databases. -* [PG-1222](https://perconadev.atlassian.net/browse/PG-1222) - Fixed the bug with confused relations with the same `RelFileNumber` in different databases +* [PG-1400](https://perconadev.atlassian.net/browse/PG-1400) - Corrected the pg_tde_change_key_provider naming in help. -* [PG-1400](https://perconadev.atlassian.net/browse/PG-1400) - Corrected the pg_tde_change_key_provider naming in help +* [PG-1401](https://perconadev.atlassian.net/browse/PG-1401) - Fixed the issue with inheriting an encryption status during the ALTER TABLE SET access method command execution by basing a new encryption status only on the new encryption setting. -* [PG-1401](https://perconadev.atlassian.net/browse/PG-1401) - Fixed the issue with inheriting an encryption status during the ALTER TABLE SET access method command execution by basing a new encryption status only on the new encryption setting - -* [PG-1414](https://perconadev.atlassian.net/browse/PG-1414) - Fixed the error message wording when configuring WAL encryption by referencing to a correct function +* [PG-1414](https://perconadev.atlassian.net/browse/PG-1414) - Fixed the error message wording when configuring WAL encryption by referencing to a correct function. * [PG-1450](https://perconadev.atlassian.net/browse/PG-1450) - Fixed the `pg_tde_delete_key_provider()` function behavior when called multiple times by ignoring already deleted records. * [PG-1451](https://perconadev.atlassian.net/browse/PG-1451) -Fixed the issue with the repeating error message about inability to retrieve a principal key even when a user creates non-encrypted tables by checking the current transaction ID in both the event trigger start function and during a file creation. If the transaction changed during the setup of the current event trigger data, the event trigger is reset. - -* [PG-1473](https://perconadev.atlassian.net/browse/PG-1473) - Allowed only users with key viewer privileges to execute `pg_tde_verify_principal_key()` and `pg_tde_verify_global_principal_key()` functions -* [PG-1474](https://perconadev.atlassian.net/browse/PG-1474) - Fixed the issue with the principal key reference corruption when reassigning it to a key provider with the same name by setting the key name in vault/kmip getters +* [PG-1473](https://perconadev.atlassian.net/browse/PG-1473) - Allowed only users with key viewer privileges to execute `pg_tde_verify_principal_key()` and `pg_tde_verify_global_principal_key()` functions. + +* [PG-1474](https://perconadev.atlassian.net/browse/PG-1474) - Fixed the issue with the principal key reference corruption when reassigning it to a key provider with the same name by setting the key name in vault/kmip getters. -* [PG-1476](https://perconadev.atlassian.net/browse/PG-1476) - Fixed the issue with the server failing to start when WAL encryption is enabled by creating a new principal key for WAL in case only one default key exists in the database +* [PG-1476](https://perconadev.atlassian.net/browse/PG-1476) - Fixed the issue with the server failing to start when WAL encryption is enabled by creating a new principal key for WAL in case only one default key exists in the database. -* [PG-1479](https://perconadev.atlassian.net/browse/PG-1479), [PG-1480](https://perconadev.atlassian.net/browse/PG-1480) - Fixed the issue with the lost access to data after the global key provider change and the server restart by fixing the incorrect parameter order in default key rotation +* [PG-1479](https://perconadev.atlassian.net/browse/PG-1479), [PG-1480](https://perconadev.atlassian.net/browse/PG-1480) - Fixed the issue with the lost access to data after the global key provider change and the server restart by fixing the incorrect parameter order in default key rotation. * [PG-1489](https://perconadev.atlassian.net/browse/PG-1489) - Fixed the issue with replicating the keys and key provider configuration by creating the `pg_tde` directory on the replica server. -/browse/PG-1476) - Fixed the issue with the server failing to start when WAL encryption is enabled by creating a new principal key for WAL in case only one default key exists in the database +/browse/PG-1476) - Fixed the issue with the server failing to start when WAL encryption is enabled by creating a new principal key for WAL in case only one default key exists in the database. -* [PG-1479](https://perconadev.atlassian.net/browse/PG-1479), [PG-1480](https://perconadev.atlassian.net/browse/PG-1480) - Fixed the issue with the lost access to data after the global key provider change and the server restart by fixing the incorrect parameter order in default key rotation +* [PG-1479](https://perconadev.atlassian.net/browse/PG-1479), [PG-1480](https://perconadev.atlassian.net/browse/PG-1480) - Fixed the issue with the lost access to data after the global key provider change and the server restart by fixing the incorrect parameter order in default key rotation. * [PG-1489](https://perconadev.atlassian.net/browse/PG-1489) - Fixed the issue with replicating the keys and key provider configuration by creating the `pg_tde` directory on the replica server. - diff --git a/contrib/pg_tde/documentation/docs/release-notes/rc2.md b/contrib/pg_tde/documentation/docs/release-notes/rc2.md new file mode 100644 index 0000000000000..0d25d1d49b591 --- /dev/null +++ b/contrib/pg_tde/documentation/docs/release-notes/rc2.md @@ -0,0 +1,113 @@ +# pg_tde Release Candidate 2 ({{date.RC2}}) + +`pg_tde` extension brings in [Transparent Data Encryption (TDE)](../index/about-tde.md) to PostgreSQL and enables you to keep sensitive data safe and secure. + +[Get Started](../install.md){.md-button} + +## Release Highlights + +This release provides the following features and improvements: + +* **Restricted key provider configuration to superusers** + + The database owners can no longer configure key providers directly. Instead, they must refer to the superuser who manages the provider setup. This security improvement clearly separates the responsibilities between users and administrators. + +* **WAL encryption supports Vault**. + + `pg_tde` now supports using the Vault keyring for secure storage and management of WAL encryption keys. + +* **Automatic WAL internal key generation at server startup**. + + On each server start, a new internal key is generated for encrypting subsequent WAL records (assuming WAL encryption is enabled). The existing WAL records and their keys remain unchanged, this ensures continuity and secure key management without affecting historical data. + +* **Proper removal of relation-level encryption keys on table drop** + + Previously, encrypted relation keys persisted even after dropping the associated tables, potentially leaving orphaned entries in the map file. This is now corrected, when an encrypted table is dropped, its corresponding key is also removed from the key map. + +* **Fixed external tablespace data loss with encrypted partitions** + + An issue was fixed where data could be lost when the encrypted partitioned tables were moved to external tablespaces. + +* **New visibility and verification functions for default principal keys** + + Added additional functions to help you verify and inspect the state of default principal keys more easily. + +* **Fixed SQL failures caused by inconsistent key provider switching** + + An issue was resolved where SQL queries could fail after switching key providers while the server was running. + This occurred because principal keys became inaccessible when spread across multiple keyring backends, triggering the single-provider-at-a-time design constraint. + `pg_tde` now enforces consistency during provider changes to prevent a corrupted key state and query errors. + +## Upgrade considerations + +`pg_tde` Release Candidate 2 is not backward compatible with `pg_tde` Beta2 due to significant changes in code. This means you cannot directly upgrade from one version to another. You must [uninstall](../how-to/uninstall.md) `pg_tde` Beta2 first and then [install](../install.md) and configure the new Release Candidate version. + +## Known issues + +* The default `mlock` limit on Rocky Linux 8 for ARM64-based architectures equals the memory page size and is 64 Kb. This results in the child process with `pg_tde` failing to allocate another memory page because the max memory limit is reached by the parent process. + +To prevent this, you can change the `mlock` limit to be at least twice bigger than the memory page size: + +* temporarily for the current session using the `ulimit -l ` command. +* set a new hard limit in the `/etc/security/limits.conf` file. To do so, you require the superuser privileges. + +Adjust the limits with caution since it affects other processes running in your system. + +## Changelog + +### New Features + +* [PG-817](https://perconadev.atlassian.net/browse/PG-817) – Added fuzz testing to `pstress` to strengthen validation and resilience. +* [PG-824](https://perconadev.atlassian.net/browse/PG-824) – Ensured fsync is called on `pg_tde.map`, `pg_tde.dat`, and FS key provider files. +* [PG-830](https://perconadev.atlassian.net/browse/PG-830) – Implemented full WAL encryption using Vault keyring. +* [PG-831](https://perconadev.atlassian.net/browse/PG-831) – Tested WAL recovery and both streaming and logical replication compatibility. +* [PG-855](https://perconadev.atlassian.net/browse/PG-855) – Added a contributor guide to help new developers engage with pg_tde. +* [PG-938](https://perconadev.atlassian.net/browse/PG-938) – Evaluated use of `pg_basebackup` for automated backup validation with pg_tde. +* [PG-962](https://perconadev.atlassian.net/browse/PG-962) – Automated test cases to validate data integrity after PostgreSQL restart. +* [PG-1001](https://perconadev.atlassian.net/browse/PG-1001) – Verified encryption behavior of temporary tables. +* [PG-1099](https://perconadev.atlassian.net/browse/PG-1099) – Developed automation for bare-metal performance benchmarking. +* [PG-1289](https://perconadev.atlassian.net/browse/PG-1289) – Added test cases for verifying compatibility with different PostgreSQL versions. +* [PG-1444](https://perconadev.atlassian.net/browse/PG-1444) – Implemented support for removing relation-level encryption keys when dropping tables. +* [PG-1455](https://perconadev.atlassian.net/browse/PG-1455) – Introduced random base numbers in encryption IVs for enhanced security. +* [PG-1458](https://perconadev.atlassian.net/browse/PG-1458) – Added visibility and verification functions for default principal keys. +* [PG-1460](https://perconadev.atlassian.net/browse/PG-1460) – Enabled automatic rotation of WAL internal keys on server start. +* [PG-1461](https://perconadev.atlassian.net/browse/PG-1461) – Implemented random IV initialization for WAL keys. +* [PG-1506](https://perconadev.atlassian.net/browse/PG-1506) – Added parameter support for client certificates in KMIP provider configuration. + +## Improvements + +* [PG-826](https://perconadev.atlassian.net/browse/PG-826) – Documented how to encrypt and decrypt existing tables using pg_tde. +* [PG-827](https://perconadev.atlassian.net/browse/PG-827) – Fixed CI pipeline tests on the smgr branch. +* [PG-834](https://perconadev.atlassian.net/browse/PG-834) – Resolved issues with `CREATE ... USING pg_tde` on the smgr branch. +* [PG-1427](https://perconadev.atlassian.net/browse/PG-1427) – Tested and fixed KMIP implementation for Thales support. +* [PG-1507](https://perconadev.atlassian.net/browse/PG-1507) – Handled ALTER TYPE operations in the TDE event trigger. +* [PG-1508](https://perconadev.atlassian.net/browse/PG-1508) – Fixed encryption state inconsistencies when altering inherited tables. +* [PG-1550](https://perconadev.atlassian.net/browse/PG-1550) – Restricted database owners from creating key providers to improve security. +* [PG-1586](https://perconadev.atlassian.net/browse/PG-1586) – Verified and fixed KMIP compatibility with Fortanix HSM. + +### Bugs Fixed + +* [PG-1397](https://perconadev.atlassian.net/browse/PG-1397) – Fixed segmentation fault during replication with WAL encryption enabled. +* [PG-1413](https://perconadev.atlassian.net/browse/PG-1413) – Resolved invalid WAL magic number errors after toggling encryption. +* [PG-1416](https://perconadev.atlassian.net/browse/PG-1416) – Fixed SQL query failures caused by inconsistent key provider switching. +* [PG-1468](https://perconadev.atlassian.net/browse/PG-1468) – Fixed WAL read failures on replicas after key rotation. +* [PG-1491](https://perconadev.atlassian.net/browse/PG-1491) – Corrected `pg_tde_is_encrypted()` behavior for partitioned tables. +* [PG-1493](https://perconadev.atlassian.net/browse/PG-1493) – Fixed data loss when encrypted partitioned tables were moved to external tablespaces. +* [PG-1503](https://perconadev.atlassian.net/browse/PG-1503) – Blocked deletion of global key providers still associated with principal keys. +* [PG-1504](https://perconadev.atlassian.net/browse/PG-1504) – Ensured correct encryption inheritance in partitioned `tde_heap` tables. +* [PG-1510](https://perconadev.atlassian.net/browse/PG-1510) – Used different keys and IVs for PostgreSQL forks to prevent conflicts. +* [PG-1530](https://perconadev.atlassian.net/browse/PG-1530) – Fixed inability to read WAL after toggling WAL encryption. +* [PG-1532](https://perconadev.atlassian.net/browse/PG-1532) – Resolved errors rewriting owned sequences when pg_tde isn't in the default schema. +* [PG-1535](https://perconadev.atlassian.net/browse/PG-1535) – Prevented server crash on calling `pg_tde_principal_key_info()`. +* [PG-1537](https://perconadev.atlassian.net/browse/PG-1537) – Fixed crash on NULL input in user-facing functions. +* [PG-1539](https://perconadev.atlassian.net/browse/PG-1539) – Handled principal key header verification errors gracefully. +* [PG-1540](https://perconadev.atlassian.net/browse/PG-1540) – Ensured sequences are assigned correct encryption status. +* [PG-1541](https://perconadev.atlassian.net/browse/PG-1541) – Resolved WAL decryption failure after key rotation. +* [PG-1543](https://perconadev.atlassian.net/browse/PG-1543) – Fixed validation error when multiple server keys exist. +* [PG-1545](https://perconadev.atlassian.net/browse/PG-1545) – Resolved error from `pg_tde_grant_grant_management_to_role()` execution. +* [PG-1546](https://perconadev.atlassian.net/browse/PG-1546) – Fixed incorrect behavior in role grant function. +* [PG-1551](https://perconadev.atlassian.net/browse/PG-1551) – Improved handling of short reads and errors in WAL storage code. +* [PG-1571](https://perconadev.atlassian.net/browse/PG-1571) – Fixed WAL decryption failure due to corrupted or mismatched principal keys. +* [PG-1573](https://perconadev.atlassian.net/browse/PG-1573) – Prevented crash during WAL replay when lock was not held. +* [PG-1574](https://perconadev.atlassian.net/browse/PG-1574) – Ensured encrypted WAL is readable by streaming replica. +* [PG-1576](https://perconadev.atlassian.net/browse/PG-1576) – Resolved crash from malformed JSON in user-facing functions. diff --git a/contrib/pg_tde/documentation/docs/release-notes/release-notes-v1.0.md b/contrib/pg_tde/documentation/docs/release-notes/release-notes-v1.0.md new file mode 100644 index 0000000000000..8a62726818ccf --- /dev/null +++ b/contrib/pg_tde/documentation/docs/release-notes/release-notes-v1.0.md @@ -0,0 +1,61 @@ +# pg_tde 1.0 ({{date.GA10}}) + +The `pg_tde` by Percona extension brings in [Transparent Data Encryption (TDE) :octicons-link-external-16:](../index/about-tde.md) to PostgreSQL and enables you to keep sensitive data safe and secure. + +[Get Started](../install.md){.md-button} + +## Release Highlights + +* **`pg_tde` 1.0 is now GA (Generally Available)** + +And **stable** for encrypting relational data in PostgreSQL using [Transparent Data Encryption (TDE) :octicons-link-external-16:](../index/about-tde.md). This milestone brings production-level data protection to PostgreSQL workloads. + +* **WAL encryption is still in Beta** + +The WAL encryption feature is currently still in beta and is not effective unless explicitly enabled. **It is not yet production ready.** Do **not** enable this feature in production environments. + +## Upgrade considerations + +`pg_tde` 1.0 is **not** backward compatible with previous `pg_tde` versions, like Release Candidate 2, due to significant changes in code. This means you **cannot** directly upgrade from one version to another. You must do **a clean installation** of `pg_tde`. + +## Known issues + +* The default `mlock` limit on Rocky Linux 8 for ARM64-based architectures equals the memory page size and is 64 Kb. This results in the child process with `pg_tde` failing to allocate another memory page because the max memory limit is reached by the parent process. + +To prevent this, you can change the `mlock` limit to be at least twice bigger than the memory page size: + +* temporarily for the current session using the `ulimit -l ` command. +* set a new hard limit in the `/etc/security/limits.conf` file. To do so, you require the superuser privileges. + +Adjust the limits with caution since it affects other processes running in your system. + +## Changelog + +### New Features + +- [PG-1257 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1257) – Added SQL function to remove the current principal key + +### Improvements + +- [PG-1617 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1617) – Removed relation key cache +- [PG-1635 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1635) – User-facing TDE functions now return void +- [PG-1605 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1605) – Removed undeclared dependencies for `pg_tde_grant_database_key_management_to_role()` + +### Bugs Fixed + +- [PG-1581 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1581) – Fixed PostgreSQL crashes on table access when KMIP key is unavailable after restart +- [PG-1583 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1583) – Fixed a crash when dropping the `pg_tde` extension with CASCADE after changing the key provider file +- [PG-1585 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1585) – Fixed the vault provider re-addition that failed after server restart with a new token +- [PG-1592 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1592) – Improve error logs when Server Key Info is requested without being created +- [PG-1593 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1593) – Fixed runtime failures when invalid Vault tokens are allowed during key provider creation +- [PG-1600 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1600) – Fixed Postmaster error when dropping a table with an unavailable key provider +- [PG-1606 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1606) – Fixed missing superuser check in role grant function leads to misleading errors +- [PG-1607 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1607) – Improved CA parameter order and surrounding documentation for clearer interpretation +- [PG-1608 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1608) – Updated and fixed global key configuration parameters in documentation +- [PG-1613 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1613) – Tested and improved the `pg_tde_change_key_provider` CLI utility +- [PG-1637 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1637) – Fixed unused keys in key files which caused issues after OID wraparound +- [PG-1651 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1651) – Fixed the CLI tool when working with Vault key export/import +- [PG-1652 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1652) – Fixed when the server fails to find encryption keys after CLI-based provider change +- [PG-1662 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1662) – Fixed the creation of inconsistent encryption status when altering partitioned tables +- [PG-1663 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1663) – Fixed the indexes on partitioned tables which were not encrypted +- [PG-1700 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1700) – Fixed the error hint when the principal key is missing diff --git a/contrib/pg_tde/documentation/docs/release-notes/release-notes-v2.0.md b/contrib/pg_tde/documentation/docs/release-notes/release-notes-v2.0.md new file mode 100644 index 0000000000000..5a11ed3300d0b --- /dev/null +++ b/contrib/pg_tde/documentation/docs/release-notes/release-notes-v2.0.md @@ -0,0 +1,82 @@ +# pg_tde 2.0 ({{date.GA20}}) + +The `pg_tde` by Percona extension brings [Transparent Data Encryption (TDE)](../index/about-tde.md) to PostgreSQL and enables you to keep sensitive data safe and secure. + +[Get Started](../install.md){.md-button} + +## Release Highlights + +### WAL encryption is now generally available + +The WAL (Write-Ahead Logging) encryption feature is now fully supported and production-ready, it adds secure write-ahead logging to `pg_tde`, expanding Percona's PostgreSQL encryption coverage by enabling secure, transparent encryption of write-ahead logs using the same key infrastructure as data encryption. + +### WAL encryption upgrade limitation + +Clusters that used WAL encryption in the beta release (`pg_tde` 1.0 or older) cannot be upgraded to `pg_tde` 2.0. The following error indicates that WAL encryption was enabled: + +```sql +FATAL: principal key not configured +HINT: Use pg_tde_set_server_key_using_global_key_provider() to configure one. +``` + +Clusters that did not use WAL encryption in beta can be upgraded normally. + +### Documentation updates + +* Updated the [Limitations](../index/tde-limitations.md) topic, it now includes WAL encryption limitations and both supported and unsupported WAL tools +* [PG-1858 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1858) - Added a new topic for [Backup with WAL encryption enabled](../how-to/backup-wal-enabled.md) that includes restoring a backup created with WAL encryption +* [PG-1832 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1858) - Added documentation for using the `pg_tde_archive_decrypt` and `pg_tde_restore_encrypt` utilities. These tools are now covered in [CLI Tools](../command-line-tools/cli-tools.md) to guide users on how to archive and restore encrypted WAL segments securely +* [PG-1740 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1740) - Updated documentation for [uninstalling `pg_tde`](../how-to/uninstall.md) with WAL encryption enabled and improved the uninstall instructions to cover cases where TDE is disabled while WAL encryption remains active + +## Known issues + +* Creating, changing, or rotating global key providers (or their keys) while `pg_basebackup` is running may cause standbys or standalone clusters initialized from the backup to fail during WAL replay and may also lead to the corruption of encrypted data (tables, indexes, and other relations). + + Avoid making these actions during backup windows. Run a new full backup after completing a rotation or provider update. + +* Using `pg_basebackup` with `--wal-method=fetch` produces warnings. + + This behavior is expected and will be addressed in a future release. + +* The default `mlock` limit on Rocky Linux 8 for ARM64-based architectures equals the memory page size and is 64 Kb. This results in the child process with `pg_tde` failing to allocate another memory page because the max memory limit is reached by the parent process. + + To prevent this, you can change the `mlock` limit to be at least twice bigger than the memory page size: + + * temporarily for the current session using the `ulimit -l ` command. + * set a new hard limit in the `/etc/security/limits.conf` file. To do so, you require the superuser privileges. + + Adjust the limits with caution since it affects other processes running in your system. + +## Changelog + +### New Features + +* [PG-1497 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1497) WAL encryption is now generally available (GA) +* [PG-1037 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1037) - Added support for `pg_rewind` with encrypted WAL +* [PG-1411 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1497) - Added support for `pg_resetwal` with encrypted WAL +* [PG-1603 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1603) - Added support for `pg_basebackup` with encrypted WAL +* [PG-1710 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1710) - Added support for WAL archiving with encrypted WAL +* [PG-1711 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1711) - Added support for incremental backups with encrypted WAL, compatibility has been verified with `pg_combinebackup` and the WAL summarizer tool. +* [PG-1712 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1712) - Added support for `pg_createsubscriber` with encrypted WAL +* [PG-1833 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1833) - Added verified support for using `pg_waldump` with encrypted WAL +* [PG-1834 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1834) - Verified `pg_upgrade` with encryption + +### Improvements + +* [PG-1661 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1661) - Added validation for key material received from providers +* [PG-1667 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1667) - Validated Vault keyring engine type + +### Bugs Fixed + +* [PG-1391 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1391) - Fixed unencrypted checkpoint segment on replica with encrypted key +* [PG-1412 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1412) – Fixed an issue where `XLogFileCopy` failed with encrypted WAL during PITR and `pg_rewind` +* [PG-1452 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1452) - Fixed an issue where `pg_tde_change_key_provider` did not work without the `-D` flag even if `PGDATA` was set +* [PG-1485 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1485) - Fixed an issue where streaming replication failed with an invalid magic number in WAL when `wal_encryption` was enabled +* [PG-1604 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1604) - Fixed a crash during standby promotion caused by an invalid magic number when replaying two-phase transactions from WAL +* [PG-1658 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1658) - Fixed an issue where the global key provider could not be deleted after server restart +* [PG-1835 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1835) - Fixed an issue where `pg_resetwal` corrupted encrypted WAL, causing PostgreSQL to fail at startup with an invalid checkpoint +* [PG-1842 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1842) - Fixed a delay in replica startup with encrypted tables in streaming replication setups +* [PG-1843 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1843) - Fixed performance issues when creating encrypted tables +* [PG-1863 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1863) - Fixed an issue where unnecessary WAL was generated when creating temporary tables +* [PG-1866 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1866) - Fixed an issue where automatic restart after crash sometimes failed with WAL encryption enabled +* [PG-1867 :octicons-link-external-16:](https://perconadev.atlassian.net/browse/PG-1867) - Fixed archive recovery with encrypted WAL diff --git a/contrib/pg_tde/documentation/docs/release-notes/release-notes.md b/contrib/pg_tde/documentation/docs/release-notes/release-notes.md index d5228f15d3e77..9f50fcba58c75 100644 --- a/contrib/pg_tde/documentation/docs/release-notes/release-notes.md +++ b/contrib/pg_tde/documentation/docs/release-notes/release-notes.md @@ -1,11 +1,20 @@ -# `pg_tde` release notes index +# Percona Transparent Data Encryption for PostgreSQL release notes index -`pg_tde` extension brings in [Transparent Data Encryption (TDE)](../tde.md) to PostgreSQL and enables you to keep sensitive data safe and secure. +This page lists all release notes for `pg_tde`, organized by year and version. Use it to track new features, fixes, and updates across major and minor versions. -* [pg_tde Release Candidate {{date.RC}}](rc.md) -* [pg_tde Beta2 (2024-12-16)](beta2.md) -* [pg_tde Beta (2024-06-30)](beta.md) -* [pg_tde Alpha1 (2024-03-28)](alpha1.md) -* [pg_tde MVP (2023-12-12)](mvp.md) +## 2025 +* [2.0](release-notes-v2.0.md) ({{date.GA20}}) +* [1.0](release-notes-v1.0.md) ({{date.GA10}}) +* [Release Candidate 2 (RC2)](rc2.md) ({{date.RC2}}) +* [Release Candidate 1 (RC1)](rc.md) ({{date.RC}}) +## 2024 + +* [Beta 2](beta2.md) (2024-12-16) +* [Beta 1](beta.md) (2024-06-30) +* [Alpha 1](alpha1.md) (2024-03-28) + +## 2023 + +* [MVP](mvp.md) (2023-12-12) diff --git a/contrib/pg_tde/documentation/docs/replication.md b/contrib/pg_tde/documentation/docs/replication.md new file mode 100644 index 0000000000000..ac47d122f39e9 --- /dev/null +++ b/contrib/pg_tde/documentation/docs/replication.md @@ -0,0 +1,102 @@ +# Streaming Replication with tde_heap + +This section outlines how to set up PostgreSQL streaming replication when the `pg_tde` extension, specifically the [`tde_heap`](index/table-access-method.md) access method, is enabled on the primary server. + +Before you begin, ensure you have followed the [`pg_tde` setup instructions](setup.md). + +!!! note + You do **not** need to run `CREATE EXTENSION` on the standby. It will be replicated automatically. + +## 1. Configure the Primary + +### Create a principal key + +Use the [`pg_tde_set_server_key_using_global_key_provider`](functions.md#pg_tde_set_server_key_using_global_key_provider) function to create a principal key. + +### Create the replication role + +Create a replication role on the primary: + +```sql +CREATE ROLE example_replicator WITH REPLICATION LOGIN PASSWORD 'example_password'; +``` + +### Configure pg_hba.conf + +To allow the replica to connect to the primary server, add the following line in `pg_hba.conf`: + +```conf +host replication example_replicator standby_ip/32 scram-sha-256 +``` + +Ensure that it is placed before the other host rules for replication and then **reload** the configuration: + +```sql +SELECT pg_reload_conf(); +``` + +## 2. Configure the Standby + +### Perform a database backup + +Run the base backup from your standby machine to pull the encrypted base backup: + +```bash +export PGPASSWORD='example_password' +pg_basebackup \ + -h primary_ip \ + -D /var/lib/pgsql/data \ + -U example_replicator \ + --wal-method=stream \ + --slot=tde_slot \ + -C \ + -c fast \ + -v -P +``` + +### Configure postgresql.conf + +After the base backup completes, add the following line to the standby's `postgresql.conf` file: + +```ini +shared_preload_libraries = 'pg_tde' +``` + +## 3. Start and validate replication + +Assuming that the primary and the standby are running on separate hosts, start the PostgreSQL service: + +```bash +sudo systemctl start postgresql +``` + +!!! warning "Key management consistency **required** for replication" + + If you're using a KMS provider, such as Vault or KMIP, make sure that both the primary and the standby have access to the **same** key management configuration, and that the paths to the configuration files are identical on both systems. + + For example: + + - If you configure Vault with a secret path: `/path/to/secret.file`, then that file **must** exist at the same path on both the primary and the standby. + - If you use the `keyring_file` provider, be aware that it stores key material in a local file and it is **not designed** for shared or concurrent use across multiple servers. It is **not recommended** in replication setups. + +* On primary: + +```sql +SELECT client_addr, state FROM pg_stat_replication; +``` + +* On standby: + +```sql +SELECT + pg_is_in_recovery() AS in_recovery, + pg_last_wal_receive_lsn() AS receive_lsn, + pg_last_wal_replay_lsn() AS replay_lsn; +``` + +!!! tip + Want to verify that everything is working? After creating an encrypted table on the primary, run the following command on the standby to confirm that the encryption is active and the keys are resolved: + + ```sql + SELECT pg_tde_is_encrypted('your_encrypted_table'); + ``` diff --git a/contrib/pg_tde/documentation/docs/setup.md b/contrib/pg_tde/documentation/docs/setup.md index 20c3514e50e20..8b0d1f24136c3 100644 --- a/contrib/pg_tde/documentation/docs/setup.md +++ b/contrib/pg_tde/documentation/docs/setup.md @@ -1,137 +1,68 @@ -# Set up `pg_tde` +# Configure pg_tde -The steps below describe the default key configuration. This means that the entire PostgreSQL cluster is encrypted using the same global encryption key. For how to configure multi-tenancy, see the [Set up multi-tenancy](multi-tenant-setup.md) guidelines. +Before you can use `pg_tde` for data encryption, you must enable the extension and configure PostgreSQL to load it at startup. This setup ensures that the necessary hooks and shared memory are available for encryption operations. ---8<-- "kms-considerations.md" +!!! note + To learn how to configure multi-tenancy, refer to the [Configure multi-tenancy](how-to/multi-tenant-setup.md) guidelines. -## Enable extension +The `pg_tde` extension requires additional shared memory. You need to configure PostgreSQL to preload it at startup. -Load the `pg_tde` at startup time. The extension requires additional shared memory; therefore, add the `pg_tde` value for the `shared_preload_libraries` parameter and restart the `postgresql` cluster. +## 1. Configure shared_preload_libraries -1. Use the [ALTER SYSTEM :octicons-link-external-16:](https://www.postgresql.org/docs/current/sql-altersystem.html) command from `psql` terminal to modify the `shared_preload_libraries` parameter. This requires superuser privileges. +You can configure the `shared_preload_libraries` parameter in two ways: + +* Add the following line to the `postgresql.conf` file: + + ```bash + shared_preload_libraries = 'pg_tde' + ``` + +* Use the [ALTER SYSTEM :octicons-link-external-16:](https://www.postgresql.org/docs/current/sql-altersystem.html) command. Run the following command in `psql` as a **superuser**: ```sql ALTER SYSTEM SET shared_preload_libraries = 'pg_tde'; ``` -2. Start or restart the `postgresql` cluster to apply the changes. +## 2. Restart the PostgreSQL cluster + +Restart the `postgresql` cluster to apply the configuration. - * On Debian and Ubuntu: +* On Debian and Ubuntu: ```sh sudo systemctl restart postgresql.service ``` - - * On RHEL and derivatives + +* On RHEL and derivatives: ```sh sudo systemctl restart postgresql-17 ``` -3. Create the extension using the [CREATE EXTENSION :octicons-link-external-16:](https://www.postgresql.org/docs/current/sql-createextension.html) command. You must have the privileges of a superuser or a database owner to use this command. Connect to `psql` as a superuser for a database and run the following command: - - ``` - CREATE EXTENSION pg_tde; - ``` - - The `pg_tde` extension is created for the currently used database. To enable data encryption in other databases, you must explicitly run the `CREATE EXTENSION` command against them. - -4. Enable the `pg_tde` extension automatically for every newly created database. Modify the template `template1` database as follows: - - ```sh - psql -d template1 -c 'CREATE EXTENSION pg_tde;' - ``` - -## Global key provider configuration - -1. Set up a global key provider. - - === "With KMIP server" - - Make sure you have obtained the root certificate for the KMIP server and the keypair for the client. The client key needs permissions to create / read keys on the server. Find the [configuration guidelines for the HashiCorp Vault Enterprise KMIP Secrets Engine](https://developer.hashicorp.com/vault/tutorials/enterprise/kmip-engine). - - For testing purposes, you can use the PyKMIP server which enables you to set up required certificates. To use a real KMIP server, make sure to obtain the valid certificates issued by the key management appliance. - - ```sql - SELECT pg_tde_add_global_key_provider_kmip('provider-name','kmip-IP', 5696, '/path_to/server_certificate.pem', '/path_to/client_key.pem'); - ``` - - where: - - * `provider-name` is the name of the provider. You can specify any name, it's for you to identify the provider. - * `kmip-IP` is the IP address of a domain name of the KMIP server - * `port` is the port to communicate with the KMIP server. Typically used port is 5696. - * `server-certificate` is the path to the certificate file for the KMIP server. - * `client key` is the path to the client key. +## 3. Create the extension - :material-information: Warning: Note that pg_tde_add_global_key_provider_kmip currently accepts only a combined client key + client certificate for the last parameter of this function named as `client key`. +After restarting PostgreSQL, connect to `psql` as a **superuser** or **database owner** and run: - :material-information: Warning: This example is for testing purposes only: +```sql +CREATE EXTENSION pg_tde; +``` - ``` - SELECT pg_tde_add_global_key_provider_kmip('kmip','127.0.0.1', 5696, '/tmp/server_certificate.pem', '/tmp/client_key_jane_doe.pem'); - ``` +See [CREATE EXTENSION :octicons-link-external-16:](https://www.postgresql.org/docs/current/sql-createextension.html) for more details. - === "With HashiCorp Vault" +!!! note + The `pg_tde` extension is created only for the current database. To enable it for other databases, you must run the command in each individual database. - The Vault server setup is out of scope of this document. +## 4. (Optional) Enable pg_tde by default - ``` - SELECT pg_tde_add_global_key_provider_vault_v2('provider-name','root_token','url','mount','ca_path'); - ``` - - where: - - * `url` is the URL of the Vault server - * `mount` is the mount point where the keyring should store the keys - * `root_token` is an access token with read and write access to the above mount point - * [optional] `ca_path` is the path of the CA file used for SSL verification - - :material-information: Warning: This example is for testing purposes only: - - ``` - SELECT pg_tde_add_global_key_provider_vault_v2('my-vault','http://vault.vault.svc.cluster.local:8200,'secret/data','hvs.zPuyktykA...example...ewUEnIRVaKoBzs2', NULL); - ``` - - === "With a keyring file" - - This setup is intended for development and stores the keys unencrypted in the specified data file. See [how to use external reference to parameters](external-parameters.md) to add an extra security layer to your setup. - - - ```sql - SELECT pg_tde_add_global_key_provider_file('provider-name','/path/to/the/keyring/data.file'); - ``` - - :material-information: Warning: This example is for testing purposes only: - - ```sql - SELECT pg_tde_add_global_key_provider_file('file-keyring','/tmp/pg_tde_test_local_keyring.per'); - ``` - - -2. Add a default principal key - - ```sql - SELECT pg_tde_set_default_principal_key('name-of-the-principal-key','provider-name','ensure_new_key'); - ``` - - where: - - * `name-of-the-principal-key` is the name of the principal key. You will use this name to identify the key. - * `provider-name` is the name of the key provider you added before. The principal key will be associated with this provider. - * `ensure_new_key` defines if a principal key must be unique. The default value `true` means that you must speficy a unique key during key rotation. The `false` value allows reusing an existing principal key. - - :material-information: Warning: This example is for testing purposes only. Replace the key name and provider name with your values: - - ```sql - SELECT pg_tde_set_global_principal_key('test-db-master-key','file-vault','ensure_new_key'); - ``` +To automatically have `pg_tde` enabled for all new databases, modify the `template1` database: - The key is auto-generated. +```sql +psql -d template1 -c 'CREATE EXTENSION pg_tde;' +``` - After this, all databases that do not have something else configured will use this newly generated principal key. +!!! note + It’s recommended to use an external key provider (KMS) to manage encryption keys. For configuration instructions, see [Next steps](#next-steps). ## Next steps -[WAL encryption](wal-encryption.md){.md-button} - +[Configure Key Management (KMS) :material-arrow-right:](global-key-provider-configuration/overview.md){.md-button} diff --git a/contrib/pg_tde/documentation/docs/tde.md b/contrib/pg_tde/documentation/docs/tde.md deleted file mode 100644 index dd23cc39b7e80..0000000000000 --- a/contrib/pg_tde/documentation/docs/tde.md +++ /dev/null @@ -1,43 +0,0 @@ -# What is Transparent Data Encryption (TDE) - -Transparent Data Encryption is a technology to protect data at rest. The encryption process happens transparently in the background, without affecting database operations. Data is automatically encrypted as it's written to the disk and decrypted as it's read, all in real-time. Users and applications interact with the data as usual without noticing any difference. - -## How does it work? - -To encrypt the data, two types of keys are used: - -* Internal encryption keys to encrypt user data. They are stored internally, near the data that they encrypt. -* The principal key to encrypt database keys. It is kept separately from the database keys and is managed externally in the key management store. - -You have the following options to store and manage principal keys externally: - -* Use the HashiCorp Vault server. Only the back end KV Secrets Engine - Version 2 (API) is supported. -* Use the KMIP-compatible server. `pg_tde` has been tested with the [PyKMIP](https://pykmip.readthedocs.io/en/latest/server.html) server and [the HashiCorp Vault Enterprise KMIP Secrets Engine](https://www.vaultproject.io/docs/secrets/kmip). - -The encryption process is the following: - -![image](_images/tde-flow.png) - -When a user creates an encrypted table using `pg_tde`, a new random key is generated internally for that table and is encrypted using the AES-CBC cipher algorithm. This key is used to encrypt all data the user inserts in that table. Eventually the encrypted data gets stored in the underlying storage. - -The internal key itself is encrypted using the principal key. The principal key is stored externally in the key management store. - -Similarly when the user queries the encrypted table, the principal key is retrieved from the key store to decrypt the internal key. Then the same unique internal key for that table is used to decrypt the data, and unencrypted data gets returned to the user. So, effectively, every TDE table has a unique key, and each table key is encrypted using the principal key. - -## Why do you need TDE? - -Using TDE has the following benefits: - -* For organizations: - - - Ensure data safety when it is stored on disk and in backups - - Comply with security and legal standards like HIPAA, PCI DSS, SOC 2, ISO 27001 - -* For DBAs: - - - Granular encryption of specific tables and reducing the performance overhead that encryption brings - - Additional layer of security to existing security measures like storage-level encryption, data encryption in transit using TLS, access control and more. - -!!! admonition "See also" - - Percona Blog: [Transparent Data Encryption (TDE)](https://www.percona.com/blog/transparent-data-encryption-tde/) \ No newline at end of file diff --git a/contrib/pg_tde/documentation/docs/templates/pdf_cover_page.tpl b/contrib/pg_tde/documentation/docs/templates/pdf_cover_page.tpl new file mode 100644 index 0000000000000..576e8d262efde --- /dev/null +++ b/contrib/pg_tde/documentation/docs/templates/pdf_cover_page.tpl @@ -0,0 +1,11 @@ + +{{ config.extra.added_key }} +

+ +

+

Percona Transparent Data Encryption

+{% if config.site_description %} +

{{ config.site_description }}

+{% endif %} +

2.0 (2025-09-01)

+ \ No newline at end of file diff --git a/contrib/pg_tde/documentation/docs/test.md b/contrib/pg_tde/documentation/docs/test.md index e848dd267faba..e4578e6bf6ed3 100644 --- a/contrib/pg_tde/documentation/docs/test.md +++ b/contrib/pg_tde/documentation/docs/test.md @@ -1,47 +1,39 @@ -# Test Transparent Data Encryption +# Validate Encryption with pg_tde -Enabling `pg_tde` extension for a database creates the table access method `tde_heap` . This access method enables you to encrypt the data. - -Here's how to do it: +After enabling the `pg_tde` extension for a database, you can begin encrypting data using the `tde_heap` table access method. ## Encrypt data in a new table 1. Create a table in the database for which you have [enabled `pg_tde`](setup.md) using the `tde_heap` access method as follows: - ``` + ```sql CREATE TABLE ( ) USING tde_heap; ``` :material-information: Warning: Example for testing purposes only: - ``` + ```sql CREATE TABLE albums ( - album_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, - artist_id INTEGER, - title TEXT NOT NULL, - released DATE NOT NULL + album_id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + artist_id INTEGER, + title TEXT NOT NULL, + released DATE NOT NULL ) USING tde_heap; ``` - - Learn more about table access methods and how you can enable data encryption by default in the [Table access methods](table-access-method.md) section. + + Learn more about table access methods and how you can enable data encryption by default in the [Table Access Methods and TDE](index/table-access-method.md) section. 2. To check if the data is encrypted, run the following function: - ``` + ```sql SELECT pg_tde_is_encrypted('table_name'); ``` - The function returns `t` if the table is encrypted and `f` - if not. + The function returns `true` or `false`. -3. Rotate the principal key when needed: +3. (Optional) Rotate the principal key. - ``` - SELECT pg_tde_rotate_principal_key(); -- uses automatic key versionin - -- or - SELECT pg_tde_rotate_principal_key('new-principal-key', NULL); -- specify new key name - -- or - SELECT pg_tde_rotate_principal_key('new-principal-key', 'new-provider'); -- changeprovider - ``` +To re-encrypt the data using a new key, see [Principal key management](functions.md#principal-key-management). ## Encrypt existing table @@ -49,16 +41,22 @@ You can encrypt an existing table. It requires rewriting the table, so for large Run the following command: -``` +```sql ALTER TABLE table_name SET ACCESS METHOD tde_heap; ``` -Note that the `SET ACCESS METHOD` command drops hint bits and this may affect the performance. Running a plain `SELECT count(*)` or `VACUUM` commands on the entire table will check every tuple for visibility and set its hint bits. Therefore, after executing the `ALTER TABLE` command, run a simple `count(*)` on your tables: +!!! important + Using `SET ACCESS METHOD` drops hint bits which can impact query performance. To restore performance, run: -``` -SELECT count(*) FROM table_name; -``` + ```sql + SELECT count(*) FROM table_name; + ``` + + This forces PostgreSQL to check every tuple for visibility and reset the hint bits. !!! hint + Want to remove encryption later? See how to [decrypt your data](how-to/decrypt.md). + +## Next steps - If you no longer wish to use `pg_tde` or wish to switch to using the `tde_heap_basic` access method, see how you can [decrypt your data](decrypt.md). +[Configure WAL encryption :material-arrow-right:](wal-encryption.md){.md-button} diff --git a/contrib/pg_tde/documentation/docs/uninstall.md b/contrib/pg_tde/documentation/docs/uninstall.md deleted file mode 100644 index 3005d249416e2..0000000000000 --- a/contrib/pg_tde/documentation/docs/uninstall.md +++ /dev/null @@ -1,43 +0,0 @@ -# Uninstall `pg_tde` - -If you no longer wish to use TDE in your deployment, you can remove the `pg_tde` extension. To do so, your user must have the superuser privileges, or a database owner privileges in case you only want to remove it from a single database. - -Here's how to do it: - -1. Drop the extension using the `DROP EXTENSION` command: - - ``` - DROP EXTENSION pg_tde; - ``` - - This command will fail if there are still encrypted tables in the database. - - In this case, you must drop the dependent objects manually. Alternatively, you can run the `DROP EXTENSION ... CASCADE` command to drop all dependent objects automatically. - - Note that the `DROP EXTENSION` command does not delete the `pg_tde` data files related to the database. - -2. Run the `DROP EXTENSION` command against every database where you have enabled the `pg_tde` extension, if the goal is to completely remove the extension. This also includes the template databases, in case `pg_tde` was previously enabled there. - -3. Remove any reference to `pg_tde` GUC variables from the PostgreSQL configuration file. - -4. Modify the `shared_preload_libraries` and remove the 'pg_tde' from it. Use the `ALTER SYSTEM` command for this purpose, or edit the configuration file. - - !!! warning - - Once `pg_tde` is removed from the `shared_preload_libraries`, reading any leftover encrypted files will fail. Removing the extension from the `shared_preload_libraries` is also possible if the extension is still installed in some databases. - - Make sure to do this only if the server has no encrypted files in its data directory. - -5. Start or restart the `postgresql` cluster to apply the changes. - - * On Debian and Ubuntu: - - ```sh - sudo systemctl restart postgresql - ``` - - * On RHEL and derivatives - - ```sh - sudo systemctl restart postgresql-17 - ``` diff --git a/contrib/pg_tde/documentation/docs/variables.md b/contrib/pg_tde/documentation/docs/variables.md index 9947eacc385fe..74bdd62138193 100644 --- a/contrib/pg_tde/documentation/docs/variables.md +++ b/contrib/pg_tde/documentation/docs/variables.md @@ -17,7 +17,10 @@ This variable only controls new writes to the WAL, it doesn't affect existing WA `pg_tde` is always capable of reading existing encrypted WAL records, as long as the keys used for the encryption are still available. -Enabling WAL encryption requires a configured global principal key. Refer to the [WAL encryption configuration](wal-encryption.md) documentation for more information. +Enabling WAL encryption requires a configured global principal key. Refer to the [WAL encryption configuration](wal-encryption.md) topic for more information. + +!!! warning + The WAL encryption feature is currently in beta and is not effective unless explicitly enabled. It is not yet production ready. **Do not enable this feature in production environments**. ## pg_tde.enforce_encryption @@ -32,14 +35,14 @@ Similarly, `ALTER TABLE SET ACCESS METHOD` is only allowed, if the access me Other DDL operations are still allowed. For example other `ALTER` commands are allowed on unencrypted tables, as long as the access method isn't changed. -You can set this variable at the following levels: +You can set this variable at the following levels: -* global - for the entire PostgreSQL cluster. -* database - for specific databases. -* user - for specific users. -* session - for the current session. +* global - for the entire PostgreSQL cluster +* database - for specific databases +* user - for specific users +* session - for the current session -Setting or changing the value requires superuser permissions. +Setting or changing the value requires superuser permissions. For examples, see the [Encryption Enforcement](how-to/enforcement.md) topic. ## pg_tde.inherit_global_providers @@ -52,12 +55,12 @@ If disabled, functions that change the key providers can only work with database In this case, the default principal key, if set, is also disabled. -You can set this variable at the following levels: - -* global - for the entire PostgreSQL cluster. -* database - for specific databases. -* user - for specific users. -* session - for the current session. +You can set this variable at the following levels: +* global - for the entire PostgreSQL cluster +* database - for specific databases +* user - for specific users +* session - for the current session -Setting this variable doesn't affect existing uses of global keys. It only prevents the creation of new principal keys using global providers. +!!! note + Setting this variable doesn't affect existing uses of global keys. It only prevents the creation of new principal keys using global providers. diff --git a/contrib/pg_tde/documentation/docs/wal-encryption.md b/contrib/pg_tde/documentation/docs/wal-encryption.md index 9abdddd72d685..6de83230c11de 100644 --- a/contrib/pg_tde/documentation/docs/wal-encryption.md +++ b/contrib/pg_tde/documentation/docs/wal-encryption.md @@ -1,24 +1,30 @@ -# WAL encryption configuration (tech preview) +# Configure WAL encryption -Before turning WAL encryption on, you must first create a principal key for WAL. +Before enabling WAL encryption, follow the steps below to create a principal key and configure it for WAL: -Here's what to do: - -1. Create pg_tde extesion if it is not exists: +1. Create the `pg_tde` extension if it does not exist: ```sql CREATE EXTENSION IF NOT EXISTS pg_tde; ``` -2. Set up the key provider for WAL encryption + +2. Set up the key provider for WAL encryption: === "With KMIP server" Make sure you have obtained the root certificate for the KMIP server and the keypair for the client. The client key needs permissions to create / read keys on the server. Find the [configuration guidelines for the HashiCorp Vault Enterprise KMIP Secrets Engine](https://developer.hashicorp.com/vault/tutorials/enterprise/kmip-engine). - - For testing purposes, you can use the PyKMIP server which enables you to set up required certificates. To use a real KMIP server, make sure to obtain the valid certificates issued by the key management appliance. + + For testing purposes, you can use the PyKMIP server which enables you to set up required certificates. To use a real KMIP server, make sure to obtain the valid certificates issued by the key management appliance. ```sql - SELECT pg_tde_add_global_key_provider_kmip('provider-name','kmip-addr', 5696, '/path_to/server_certificate.pem', '/path_to/client_key.pem'); + SELECT pg_tde_add_global_key_provider_kmip( + 'provider-name', + 'kmip-addr', + 5696, + '/path_to/client_cert.pem', + '/path_to/client_key.pem', + '/path_to/server_certificate.pem' + ); ``` where: @@ -27,41 +33,62 @@ Here's what to do: * `kmip-addr` is the IP address of a domain name of the KMIP server * `port` is the port to communicate with the KMIP server. Typically used port is 5696. * `server-certificate` is the path to the certificate file for the KMIP server. - * `client key` is the path to the client key. + * `client-cert` is the path to the client certificate. + * `client-key` is the path to the client key. :material-information: Warning: This example is for testing purposes only: - ``` - SELECT pg_tde_add_key_global_provider_kmip('kmip','127.0.0.1', 5696, '/tmp/server_certificate.pem', '/tmp/client_key_jane_doe.pem'); + ```sql + SELECT pg_tde_add_key_using_global_key_provider_kmip( + 'kmip', + '127.0.0.1', + 5696, + '/tmp/client_cert_jane_doe.pem', + '/tmp/client_key_jane_doe.pem', + '/tmp/server_certificate.pem' + ); ``` === "With HashiCorp Vault" - + ```sql - SELECT pg_tde_add_global_key_provider_vault_v2('provider-name', 'secret_token', 'url', 'mount', 'ca_path'); - ``` + SELECT pg_tde_add_global_key_provider_vault_v2( + 'provider-name', + 'url', + 'mount', + 'secret_token_path', + 'ca_path' + ); + ``` - where: + where: * `provider-name` is the name you define for the key provider * `url` is the URL of the Vault server * `mount` is the mount point where the keyring should store the keys - * `secret_token` is an access token with read and write access to the above mount point + * `secret_token_path` is a path to the file that contains an access token with read and write access to the above mount point * [optional] `ca_path` is the path of the CA file used for SSL verification - === "With keyring file" - This setup is intended for development and stores the keys unencrypted in the specified data file. + This setup is **not recommended**, as it is intended for development. + + :material-information: Warning: The keys are stored **unencrypted** in the specified data file. ```sql - SELECT pg_tde_add_global_key_provider_file('provider-name','/path/to/the/keyring/data.file'); + SELECT pg_tde_add_global_key_provider_file( + 'provider-name', + '/path/to/the/keyring/data.file' + ); ``` 3. Create principal key - + ```sql - SELECT pg_tde_set_server_principal_key('principal-key', 'provider-name'); + SELECT pg_tde_set_server_key_using_global_key_provider( + 'key', + 'provider-name' + ); ``` 4. Enable WAL level encryption using the `ALTER SYSTEM` command. You need the privileges of the superuser to run this command: @@ -72,20 +99,21 @@ Here's what to do: 5. Restart the server to apply the changes. - * On Debian and Ubuntu: + * On Debian and Ubuntu: + + ```sh + sudo systemctl restart postgresql + ``` - ```sh - sudo systemctl restart postgresql - ``` - * On RHEL and derivatives - ```sh - sudo systemctl restart postgresql-17 - ``` + ```sh + sudo systemctl restart postgresql-17 + ``` Now WAL files start to be encrypted for both encrypted and unencrypted tables. -## Next steps +For more technical references related to architecture, variables or functions, see: +[Technical Reference](advanced-topics/tech-reference.md){.md-button} -[Test TDE](test.md){.md-button} \ No newline at end of file +💬 Need help customizing this for your infrastructure? [Contact Percona support :octicons-link-external-16:](get-help.md) \ No newline at end of file diff --git a/contrib/pg_tde/documentation/docs/yum.md b/contrib/pg_tde/documentation/docs/yum.md index 58abb8bdc366f..e627833f34c60 100644 --- a/contrib/pg_tde/documentation/docs/yum.md +++ b/contrib/pg_tde/documentation/docs/yum.md @@ -1,50 +1,26 @@ -# Install `pg_tde` on Red Hat Enterprise Linux and derivatives +# Install pg_tde on Red Hat Enterprise Linux and Derivatives This tutorial shows how to install `pg_tde` with [Percona Distribution for PostgreSQL](https://docs.percona.com/postgresql/latest/index.html). -Check the [list of supported platforms](install.md#__tabbed_1_1). +Make sure you check the [list of supported platforms](install.md#__tabbed_1_1) before continuing. -## Memory limits for `pg_tde` keys - -The `pg_tde` uses memory locks (mlocks) to keep internal encryption keys in RAM, both for WAL and for user data. - -A memory lock (`mlock`) is a system call to lock a specified memory range in RAM for a process. The maximum amount of memory that can be locked differs between systems. You can check the current setting with this command: - -``` -ulimit -a -``` - -Memory locking is done only in memory pages. This means that when a process uses `mlocks`, it locks the entire memory page. - -A process can have child processes that share the `mlock` limits of their parent. In PostgreSQL, the parent process is the one that runs the server. And its child backend processes handle client connections to the server. - -If the `mlock` limit is greater than the page size, a child process locks another page for its operation. However, when the `mlock` limit equals the page size, the child process cannot run because the max memory limit is already reached by the parent process that used it for reading WAL files. This results in `pg_tde` failing with the error. - -To prevent this, you can change the `mlock` limit to be at least twice bigger than the memory page size: - -* temporarily for the current session using the `ulimit -l ` command. -* set a new hard limit in the `/etc/security/limits.conf` file. To do so, you require the superuser privileges. - -Adjust the limits with caution since it affects other processes running in your system. - - -## Install `percona-release` {.power-number} +## Install percona-release {.power-number} You need the `percona-release` repository management tool that enables the desired Percona repository for you. 1. Install `percona-release`: ```{.bash data-prompt="$"} - $ sudo yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm + sudo yum -y install https://repo.percona.com/yum/percona-release-latest.noarch.rpm ``` 2. Enable the repository. ```{.bash data-prompt="$"} - $ sudo percona-release enable-only ppg-{{pgversion17}} + sudo percona-release enable-only ppg-17.5 ``` -## Install `pg_tde` {.power-number} +## Install pg_tde {.power-number} !!! important @@ -54,18 +30,18 @@ You need the `percona-release` repository management tool that enables the desir The use of the `CASCADE` parameter deletes all tables that were created in the database with `pg_tde` enabled and also all dependencies upon the encrypted table (e.g. foreign keys in a non-encrypted table used in the encrypted one). - ```sql - DROP EXTENSION pg_tde CASCADE - ``` + ```sql + DROP EXTENSION pg_tde CASCADE; + ``` 2. Uninstall the `percona-pg_tde_17` package. Run the following command to install `pg_tde`: ```{.bash data-prompt="$"} -$ sudo yum -y install percona-postgresql17 +sudo yum -y install percona-postgresql17-server percona-postgresql17-contrib ``` ## Next steps -[Setup :material-arrow-right:](setup.md){.md-button} +[Configure pg_tde :material-arrow-right:](setup.md){.md-button} diff --git a/contrib/pg_tde/documentation/mkdocs-pdf.yml b/contrib/pg_tde/documentation/mkdocs-pdf.yml deleted file mode 100644 index fc87289bae446..0000000000000 --- a/contrib/pg_tde/documentation/mkdocs-pdf.yml +++ /dev/null @@ -1,16 +0,0 @@ -# MkDocs configuration for PDF builds -# Usage: ENABLE_PDF_EXPORT=1 mkdocs build -f mkdocs-pdf.yml - -INHERIT: mkdocs.yml - -copyright: Percona LLC, © 2025 - -extra_css: - - https://unicons.iconscout.com/release/v3.0.3/css/line.css - - https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.4.0/css/font-awesome.min.css - - css/extra.css - -markdown_extensions: - pymdownx.tabbed: {} - admonition: {} - diff --git a/contrib/pg_tde/documentation/mkdocs.yml b/contrib/pg_tde/documentation/mkdocs.yml index 3e03345be1daf..bdb43ccb5ed75 100644 --- a/contrib/pg_tde/documentation/mkdocs.yml +++ b/contrib/pg_tde/documentation/mkdocs.yml @@ -1,12 +1,11 @@ # MkDocs general configuration -site_name: pg_tde documentation +site_name: Percona Transparent Data Encryption for PostgreSQL site_description: Documentation site_author: Percona LLC copyright: > Percona LLC and/or its affiliates © 2025 — Cookie Consent - repo_name: percona/postgres repo_url: https://github.com/percona/postgres edit_uri: edit/TDE_REL_17_STABLE/contrib/pg_tde/documentation/docs @@ -18,7 +17,7 @@ theme: name: material logo: _images/postgresql-mark.svg favicon: _images/postgresql-fav.svg - custom_dir: _resource/overrides + custom_dir: _resourcepdf/overrides font: text: Roboto palette: @@ -52,8 +51,7 @@ theme: - content.tabs.link - navigation.top - navigation.tracking - - + - navigation.indexes extra_css: - https://unicons.iconscout.com/release/v3.0.3/css/line.css @@ -92,8 +90,6 @@ markdown_extensions: linenums: false - pymdownx.snippets: base_path: ["snippets"] -# auto_append: -# - services-banner.md - pymdownx.emoji: emoji_index: !!python/name:material.extensions.emoji.twemoji emoji_generator: !!python/name:material.extensions.emoji.to_svg @@ -101,7 +97,6 @@ markdown_extensions: custom_icons: - _resource/.icons - plugins: - search: separator: '[\s\-,:!=\[\]()"/]+|(?!\b)(?=[A-Z][a-z])|\.(?!\d)|&[lg]t;' @@ -121,16 +116,24 @@ plugins: - macros: include_yaml: - 'variables.yml' # Use in markdown as '{{ VAR }}' - - with-pdf: # https://github.com/orzih/mkdocs-with-pdf - output_path: '_pdf/PerconaTDE.pdf' - cover_title: 'Percona Transparent Data Encryption' - cover_subtitle: Release Candidate (2025-03-27) - author: 'Percona Technical Documentation Team' - cover_logo: docs/_images/Percona_Logo_Color.png - debug_html: false -# two_columns_level: 3 - custom_template_path: _resource/templates - enabled_if_env: ENABLE_PDF_EXPORT + - print-site: + add_to_navigation: false + print_page_title: 'Percona Transparent Data Encryption documentation' + add_print_site_banner: false + # Table of contents + add_table_of_contents: true + toc_title: 'Table of Contents' + toc_depth: 2 + # Content-related + add_full_urls: false + enumerate_headings: false + enumerate_headings_depth: 1 + enumerate_figures: true + add_cover_page: true + cover_page_template: "docs/templates/pdf_cover_page.tpl" + path_to_pdf: "" + include_css: true + enabled: true extra: version: @@ -149,41 +152,71 @@ extra: - icon: material/emoticon-sad-outline name: This page could be improved data: 0 - note: >- - Thank you for your feedback! Help us improve by using our + note: >- + Thank you for your feedback! Help us improve by using our feedback form. nav: - - Home: index.md + - "Home": index.md - get-help.md - - features.md - - Get started: - - "1. Install": "install.md" - - "Via apt": apt.md - - "Via yum": yum.md - - "2. Set up": "setup.md" - - "3. Configure WAL encryption (tech preview)": wal-encryption.md - - "4. Test TDE": "test.md" - - functions.md - - command-line-tools.md - - variables.md - - Concepts: - - "What is TDE": tde.md - - table-access-method.md - - How to: - - Set up multi-tenancy: multi-tenant-setup.md - - Use reference to external parameters: external-parameters.md - - Decrypt an encrypted table: decrypt.md + - "Features": features.md + - "Overview": + - "About Transparent Data Encryption": index/about-tde.md + - "About pg_tde": + - "Benefits of pg_tde": index/how-tde-helps.md + - "How pg_tde works": index/how-does-tde-work.md + - "Encrypted data scope": index/tde-encrypts.md + - "Table access methods and pg_tde": index/table-access-method.md + - "Limitations of pg_tde": index/tde-limitations.md + - "Versions and supported PostgreSQL deployments": index/supported-versions.md + - "Get started": + - "1. Install pg_tde": install.md + - "1.1 Via apt": apt.md + - "1.2 Via yum": yum.md + - "2. Configure pg_tde": setup.md + - "2.1 Configure Key Management (KMS)": + - "Key management overview": global-key-provider-configuration/overview.md + - "KMIP configuration": global-key-provider-configuration/kmip-server.md + - "Fortanix configuration": global-key-provider-configuration/kmip-fortanix.md + - "Vault configuration": global-key-provider-configuration/vault.md + - "Thales configuration": global-key-provider-configuration/kmip-thales.md + - "Using OpenBao as a key provider": global-key-provider-configuration/kmip-openbao.md + - "Keyring file configuration": global-key-provider-configuration/keyring.md + - "2.2 Global Principal Key configuration": global-key-provider-configuration/set-principal-key.md + - "3. Validate encryption with pg_tde": test.md + - "4. Configure WAL encryption": wal-encryption.md + - "Technical reference": + - "Overview": advanced-topics/tech-reference.md + - "Architecture": architecture/architecture.md + - "GUC variables": variables.md + - "Functions": functions.md + - "Streaming Replication with tde_heap": replication.md + - "TDE operations": + - "pg_tde CLI tools": + - "Overview": command-line-tools/cli-tools.md + - "pg_tde_change_key_provider": command-line-tools/pg-tde-change-key-provider.md + - "pg_tde_archive_decrypt": command-line-tools/pg-tde-archive-decrypt.md + - "pg_tde_restore_encrypt": command-line-tools/pg-tde-restore-encrypt.md + - "pg_checksums": command-line-tools/pg-tde-checksums.md + - "pg_waldump": command-line-tools/pg-waldump.md + - "Uninstall pg_tde": how-to/uninstall.md + - "Configure Multi-tenancy": how-to/multi-tenant-setup.md + - "Encryption Enforcement": how-to/enforcement.md + - "Decrypt an Encrypted Table": how-to/decrypt.md + - "Backup with WAL encryption enabled": how-to/backup-wal-enabled.md + - "Restore an encrypted pg_tde backup": how-to/restore-backups.md - faq.md - - Release notes: - - "pg_tde release notes": release-notes/release-notes.md - - release-notes/rc.md - - release-notes/beta2.md - - release-notes/beta.md - - release-notes/alpha1.md - - release-notes/mvp.md - - uninstall.md + - "Release notes": + - "Release notes index": release-notes/release-notes.md + - "2.0": release-notes/release-notes-v2.0.md + - "1.0": release-notes/release-notes-v1.0.md + - "Release Candidate 2": release-notes/rc2.md + - "Release Candidate 1": release-notes/rc.md + - "2024 (Alpha 1 - Beta 2)": + - "Beta 2": release-notes/beta2.md + - "Beta": release-notes/beta.md + - "Alpha 1": release-notes/alpha1.md + - "2023 (MVP)": + - "MVP": release-notes/mvp.md - contribute.md - - diff --git a/contrib/pg_tde/documentation/requirements.txt b/contrib/pg_tde/documentation/requirements.txt index b3ee7d78e7043..dfaa1ad8e0d55 100644 --- a/contrib/pg_tde/documentation/requirements.txt +++ b/contrib/pg_tde/documentation/requirements.txt @@ -1,4 +1,3 @@ - Markdown mkdocs mkdocs-versioning @@ -15,5 +14,7 @@ mkdocs-htmlproofer-plugin mkdocs-meta-descriptions-plugin mike mkdocs-glightbox -Pillow > 10.1.0 -mkdocs-open-in-new-tab \ No newline at end of file +Pillow > 10.1.0 # Pillow is required for mkdocs-glightbox +mkdocs-open-in-new-tab # added to fix the open in new tab issue with mkdocs-material +mkdocs-open-in-new-tab +mkdocs-print-site-plugin \ No newline at end of file diff --git a/contrib/pg_tde/documentation/snippets/kms-considerations.md b/contrib/pg_tde/documentation/snippets/kms-considerations.md index f3bfaee1de1f6..5ef51732fc76a 100644 --- a/contrib/pg_tde/documentation/snippets/kms-considerations.md +++ b/contrib/pg_tde/documentation/snippets/kms-considerations.md @@ -1,25 +1,3 @@ ## Considerations -You can use the following options to manage encryption keys: - -* Use the Key Management Store (KMS). This is the recommended approach. `pg_tde` supports the following KMS: - - * HashiCorp Vault as the key/value secrets engine version 2 with secret versioning - * HashiCorp Vault as the KMIP server. The KMIP server is part of Vault Enterprise and requires a license - * OpenBao as the open-source alternative to HashiCorp Vault KMIP - * A KMIP-compatible server. For testing and development purposes you can use PyKMIP - - The KMS configuration is out of scope of this document. We assume that you have the KMS up and running. For the `pg_tde` configuration, you need the following information: - - === "Vault secrets engine" - - * The secret access token to the Vault server - * The URL to access the Vault server - * (Optional) The CA file used for SSL verification - - === "KMIP server" - - * The hostname or IP address of the KMIP server. - * The valid certificates issued by the key management appliance. - -* Use the local keyfile. Use the keyfile only development and testing purposes since the keys are stored unencrypted. \ No newline at end of file +You can use external key providers to manage encryption keys. The recommended approach is to use the Key Management Store (KMS). For more information, see [Configure Key Management (KMS) :octicons-link-external-16:](../global-key-provider-configuration/overview.md). diff --git a/contrib/pg_tde/documentation/variables.yml b/contrib/pg_tde/documentation/variables.yml index a59ec5fe46192..1427a44065327 100644 --- a/contrib/pg_tde/documentation/variables.yml +++ b/contrib/pg_tde/documentation/variables.yml @@ -1,8 +1,13 @@ #Variables used throughout the docs -release: 'RC' -pgversion17: '17.4' -tdebranch: TDE_REL_17_STABLE +latestreleasenotes: 'release-notes-v2.0' +tdeversion: '2.0' +release: '2.0' +pgversion17: '17.5' +tdebranch: release-17.5.3 date: + GA20: '2025-09-01' + GA10: '2025-06-30' + RC2: '2025-05-29' RC: '2025-03-27' diff --git a/contrib/pg_tde/expected/access_control.out b/contrib/pg_tde/expected/access_control.out index e2df4fe87bb87..37f649853a38b 100644 --- a/contrib/pg_tde/expected/access_control.out +++ b/contrib/pg_tde/expected/access_control.out @@ -1,69 +1,71 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -CREATE USER regress_pg_tde_access_control; -SET ROLE regress_pg_tde_access_control; --- should throw access denied -SELECT pg_tde_add_key_provider_file('file-vault', '/tmp/pg_tde_test_keyring.per'); -ERROR: permission denied for function pg_tde_add_key_provider_file -SELECT pg_tde_set_principal_key('test-db-principal-key', 'file-vault'); -ERROR: permission denied for function pg_tde_set_principal_key -RESET ROLE; -SELECT pg_tde_grant_local_key_management_to_role('regress_pg_tde_access_control'); - pg_tde_grant_local_key_management_to_role -------------------------------------------- - -(1 row) - -SELECT pg_tde_grant_key_viewer_to_role('regress_pg_tde_access_control'); - pg_tde_grant_key_viewer_to_role ---------------------------------- +\! rm -f '/tmp/pg_tde_test_keyring.per' +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('local-file-provider', '/tmp/pg_tde_test_keyring.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- (1 row) +CREATE USER regress_pg_tde_access_control; SET ROLE regress_pg_tde_access_control; --- should now be allowed -SELECT pg_tde_add_key_provider_file('file-vault', '/tmp/pg_tde_test_keyring.per'); - pg_tde_add_key_provider_file ------------------------------- - 1 -(1 row) - -SELECT pg_tde_add_key_provider_file('file-2', '/tmp/pg_tde_test_keyring_2.per'); - pg_tde_add_key_provider_file ------------------------------- - 2 -(1 row) - -SELECT pg_tde_set_principal_key('test-db-principal-key', 'file-vault'); - pg_tde_set_principal_key --------------------------- - -(1 row) - -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+---------------+---------------+-------------------------------------------------------------- - 1 | file-vault | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring.per"} - 2 | file-2 | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring_2.per"} -(2 rows) - -SELECT principal_key_name, key_provider_name, key_provider_id FROM pg_tde_principal_key_info(); - principal_key_name | key_provider_name | key_provider_id ------------------------+-------------------+----------------- - test-db-principal-key | file-vault | 1 -(1 row) - +-- should throw access denied +SELECT pg_tde_create_key_using_database_key_provider('test-db-key', 'local-file-provider'); +ERROR: permission denied for function pg_tde_create_key_using_database_key_provider +SELECT pg_tde_set_key_using_database_key_provider('test-db-key', 'local-file-provider'); +ERROR: permission denied for function pg_tde_set_key_using_database_key_provider +SELECT pg_tde_delete_key(); +ERROR: permission denied for function pg_tde_delete_key +SELECT pg_tde_list_all_database_key_providers(); +ERROR: permission denied for function pg_tde_list_all_database_key_providers +SELECT pg_tde_list_all_global_key_providers(); +ERROR: permission denied for function pg_tde_list_all_global_key_providers +SELECT pg_tde_key_info(); +ERROR: permission denied for function pg_tde_key_info +SELECT pg_tde_server_key_info(); +ERROR: permission denied for function pg_tde_server_key_info +SELECT pg_tde_default_key_info(); +ERROR: permission denied for function pg_tde_default_key_info +SELECT pg_tde_verify_key(); +ERROR: permission denied for function pg_tde_verify_key +SELECT pg_tde_verify_server_key(); +ERROR: permission denied for function pg_tde_verify_server_key +SELECT pg_tde_verify_default_key(); +ERROR: permission denied for function pg_tde_verify_default_key RESET ROLE; -SELECT pg_tde_revoke_key_viewer_from_role('regress_pg_tde_access_control'); - pg_tde_revoke_key_viewer_from_role ------------------------------------- - -(1 row) - +-- Only superusers can execute key management functions, regardless of role grants +GRANT EXECUTE ON FUNCTION pg_tde_add_database_key_provider(TEXT, TEXT, JSON) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_add_global_key_provider(TEXT, TEXT, JSON) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_change_database_key_provider(TEXT, TEXT, JSON) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_change_global_key_provider(TEXT, TEXT, JSON) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_create_key_using_global_key_provider(TEXT, TEXT) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_delete_database_key_provider(TEXT) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_delete_global_key_provider(TEXT) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_set_default_key_using_global_key_provider(TEXT, TEXT) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_set_key_using_global_key_provider(TEXT, TEXT) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_set_server_key_using_global_key_provider(TEXT, TEXT) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_delete_default_key() TO regress_pg_tde_access_control; SET ROLE regress_pg_tde_access_control; --- verify the view access is revoked -SELECT * FROM pg_tde_list_all_key_providers(); -ERROR: permission denied for function pg_tde_list_all_key_providers -SELECT principal_key_name, key_provider_name, key_provider_id FROM pg_tde_principal_key_info(); -ERROR: permission denied for function pg_tde_principal_key_info +SELECT pg_tde_add_database_key_provider_file('local-file-provider', '/tmp/pg_tde_test_keyring.per'); +ERROR: must be superuser to modify key providers +SELECT pg_tde_change_global_key_provider_file('local-file-provider', '/tmp/pg_tde_test_keyring.per'); +ERROR: must be superuser to modify key providers +SELECT pg_tde_delete_database_key_provider('local-file-provider'); +ERROR: must be superuser to modify key providers +SELECT pg_tde_add_global_key_provider_file('global-file-provider', '/tmp/pg_tde_test_keyring.per'); +ERROR: must be superuser to modify key providers +SELECT pg_tde_change_global_key_provider_file('global-file-provider', '/tmp/pg_tde_test_keyring.per'); +ERROR: must be superuser to modify key providers +SELECT pg_tde_delete_global_key_provider('global-file-provider'); +ERROR: must be superuser to modify key providers +SELECT pg_tde_create_key_using_global_key_provider('key1', 'global-file-provider'); +ERROR: must be superuser to access global key providers +SELECT pg_tde_set_key_using_global_key_provider('key1', 'global-file-provider'); +ERROR: must be superuser to access global key providers +SELECT pg_tde_set_default_key_using_global_key_provider('key1', 'global-file-provider'); +ERROR: must be superuser to access global key providers +SELECT pg_tde_set_server_key_using_global_key_provider('key1', 'global-file-provider'); +ERROR: must be superuser to access global key providers +SELECT pg_tde_delete_default_key(); +ERROR: must be superuser to access global key providers RESET ROLE; DROP EXTENSION pg_tde CASCADE; diff --git a/contrib/pg_tde/expected/alter_index.out b/contrib/pg_tde/expected/alter_index.out index d1d343a448e1f..667c32687baef 100644 --- a/contrib/pg_tde/expected/alter_index.out +++ b/contrib/pg_tde/expected/alter_index.out @@ -1,13 +1,20 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); - pg_tde_add_key_provider_file ------------------------------- - 1 +\! rm -f '/tmp/pg_tde_test_keyring.per' +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + (1 row) -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); - pg_tde_set_principal_key --------------------------- +SELECT pg_tde_create_key_using_database_key_provider('test-db-key','file-vault'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('test-db-key','file-vault'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- (1 row) @@ -67,5 +74,17 @@ SELECT relid, parentrelid, level FROM pg_partition_tree('concur_reindex_part_ind (5 rows) DROP TABLE concur_reindex_part; +SELECT pg_tde_delete_key(); + pg_tde_delete_key +------------------- + +(1 row) + +SELECT pg_tde_delete_database_key_provider('file-vault'); + pg_tde_delete_database_key_provider +------------------------------------- + +(1 row) + DROP EXTENSION pg_tde; RESET default_table_access_method; diff --git a/contrib/pg_tde/expected/cache_alloc.out b/contrib/pg_tde/expected/cache_alloc.out index 096d557f73614..528d83ed40c52 100644 --- a/contrib/pg_tde/expected/cache_alloc.out +++ b/contrib/pg_tde/expected/cache_alloc.out @@ -1,14 +1,21 @@ +\! rm -f '/tmp/pg_tde_test_keyring.per' -- Just checking there are no mem debug WARNINGs during the cache population -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); - pg_tde_add_key_provider_file ------------------------------- - 1 +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('test-db-key','file-vault'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + (1 row) -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); - pg_tde_set_principal_key --------------------------- +SELECT pg_tde_set_key_using_database_key_provider('test-db-key','file-vault'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- (1 row) diff --git a/contrib/pg_tde/expected/change_access_method.out b/contrib/pg_tde/expected/change_access_method.out index 1e66f894466d4..d33b3e68f10aa 100644 --- a/contrib/pg_tde/expected/change_access_method.out +++ b/contrib/pg_tde/expected/change_access_method.out @@ -1,22 +1,28 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); - pg_tde_add_key_provider_file ------------------------------- - 1 +\! rm -f '/tmp/pg_tde_test_keyring.per' +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('file-vault', '/tmp/pg_tde_test_keyring.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + (1 row) -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); - pg_tde_set_principal_key --------------------------- +SELECT pg_tde_create_key_using_database_key_provider('test-db-key', 'file-vault'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- (1 row) -CREATE TABLE country_table ( - country_id serial primary key, - country_name varchar(32) unique not null, - continent varchar(32) not null -) using tde_heap; +SELECT pg_tde_set_key_using_database_key_provider('test-db-key', 'file-vault'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- +(1 row) + +CREATE TABLE country_table ( + country_id serial primary key, + country_name varchar(32) unique not null, + continent varchar(32) not null +) USING tde_heap; INSERT INTO country_table (country_name, continent) VALUES ('Japan', 'Asia'), ('UK', 'Europe'), @@ -48,20 +54,8 @@ SELECT pg_tde_is_encrypted('country_table_pkey'); (1 row) -- Try changing the encrypted table to an unencrypted table -ALTER TABLE country_table SET access method heap; -SELECT pg_tde_is_encrypted('country_table_country_id_seq'); - pg_tde_is_encrypted ---------------------- - f -(1 row) - -SELECT pg_tde_is_encrypted('country_table_pkey'); - pg_tde_is_encrypted ---------------------- - f -(1 row) - --- Insert some more data +ALTER TABLE country_table SET ACCESS METHOD heap; +-- Insert some more data INSERT INTO country_table (country_name, continent) VALUES ('France', 'Europe'), ('Germany', 'Europe'), @@ -96,7 +90,7 @@ SELECT pg_tde_is_encrypted('country_table_pkey'); (1 row) -- Change it back to encrypted -ALTER TABLE country_table SET access method tde_heap; +ALTER TABLE country_table SET ACCESS METHOD tde_heap; INSERT INTO country_table (country_name, continent) VALUES ('China', 'Asia'), ('Brazil', 'South America'), @@ -133,36 +127,53 @@ SELECT pg_tde_is_encrypted('country_table_pkey'); t (1 row) +-- Test that we honor the default value +SET default_table_access_method = 'heap'; +ALTER TABLE country_table SET ACCESS METHOD DEFAULT; +SELECT pg_tde_is_encrypted('country_table'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +SET default_table_access_method = 'tde_heap'; +ALTER TABLE country_table SET ACCESS METHOD DEFAULT; +SELECT pg_tde_is_encrypted('country_table'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +RESET default_table_access_method; ALTER TABLE country_table ADD y text; -SELECT pg_tde_is_encrypted(('pg_toast.pg_toast_' || 'country_table'::regclass::oid)::regclass); +SELECT pg_tde_is_encrypted('pg_toast.pg_toast_' || 'country_table'::regclass::oid); pg_tde_is_encrypted --------------------- t (1 row) CREATE TABLE country_table2 ( - country_id serial primary key, - country_name text unique not null, - continent text not null + country_id serial primary key, + country_name text unique not null, + continent text not null ); -SET pg_tde.enforce_encryption = ON; +SET pg_tde.enforce_encryption = on; CREATE TABLE country_table3 ( - country_id serial primary key, - country_name text unique not null, - continent text not null + country_id serial primary key, + country_name text unique not null, + continent text not null ) USING heap; ERROR: pg_tde.enforce_encryption is ON, only the tde_heap access method is allowed. - -ALTER TABLE country_table SET access method heap; +ALTER TABLE country_table SET ACCESS METHOD heap; ERROR: pg_tde.enforce_encryption is ON, only the tde_heap access method is allowed. -ALTER TABLE country_table2 SET access method tde_heap; +ALTER TABLE country_table2 SET ACCESS METHOD tde_heap; CREATE TABLE country_table3 ( - country_id serial primary key, - country_name text unique not null, - continent text not null -) using tde_heap; + country_id serial primary key, + country_name text unique not null, + continent text not null +) USING tde_heap; DROP TABLE country_table; DROP TABLE country_table2; DROP TABLE country_table3; -SET pg_tde.enforce_encryption = OFF; +SET pg_tde.enforce_encryption = off; DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/expected/create_database.out b/contrib/pg_tde/expected/create_database.out new file mode 100644 index 0000000000000..e320dea12c0e0 --- /dev/null +++ b/contrib/pg_tde/expected/create_database.out @@ -0,0 +1,131 @@ +\! rm -f '/tmp/template_provider_global.per' +\! rm -f '/tmp/template_provider.per' +CREATE EXTENSION pg_tde; +CREATE DATABASE template_db; +SELECT current_database() AS regress_database +\gset +\c template_db +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('file-vault', '/tmp/template_provider.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('test-db-key', 'file-vault'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('test-db-key', 'file-vault'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- + +(1 row) + +CREATE TABLE test_enc (id serial PRIMARY KEY, x int) USING tde_heap; +CREATE TABLE test_plain (id serial PRIMARY KEY, x int) USING heap; +INSERT INTO test_enc (x) VALUES (10), (20); +INSERT INTO test_plain (x) VALUES (30), (40); +\c :regress_database +-- TODO: Test the case where we have no default key once we can delete default keys +--CREATE DATABASE new_db TEMPLATE template_db; +SELECT pg_tde_add_global_key_provider_file('global-file-vault','/tmp/template_provider_global.per'); + pg_tde_add_global_key_provider_file +------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_global_key_provider('default-key', 'global-file-vault'); + pg_tde_create_key_using_global_key_provider +--------------------------------------------- + +(1 row) + +SELECT pg_tde_set_default_key_using_global_key_provider('default-key', 'global-file-vault'); + pg_tde_set_default_key_using_global_key_provider +-------------------------------------------------- + +(1 row) + +CREATE DATABASE new_db TEMPLATE template_db; +\c new_db +INSERT INTO test_enc (x) VALUES (25); +SELECT * FROM test_enc; + id | x +----+---- + 1 | 10 + 2 | 20 + 3 | 25 +(3 rows) + +SELECT pg_tde_is_encrypted('test_enc'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +SELECT pg_tde_is_encrypted('test_enc_pkey'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +SELECT pg_tde_is_encrypted('test_enc_id_seq'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +INSERT INTO test_plain (x) VALUES (45); +SELECT * FROM test_plain; + id | x +----+---- + 1 | 30 + 2 | 40 + 3 | 45 +(3 rows) + +SELECT pg_tde_is_encrypted('test_plain'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +SELECT pg_tde_is_encrypted('test_plain_pkey'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +SELECT pg_tde_is_encrypted('test_plain_id_seq'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +\c :regress_database +CREATE DATABASE new_db_file_copy TEMPLATE template_db STRATEGY FILE_COPY; +ERROR: The FILE_COPY strategy cannot be used when there are encrypted objects in the template database: 3 objects found +HINT: Use the WAL_LOG strategy instead. +\c template_db +DROP TABLE test_enc; +\c :regress_database +CREATE DATABASE new_db_file_copy TEMPLATE template_db STRATEGY FILE_COPY; +DROP DATABASE new_db_file_copy; +DROP DATABASE new_db; +DROP DATABASE template_db; +SELECT pg_tde_delete_default_key(); + pg_tde_delete_default_key +--------------------------- + +(1 row) + +SELECT pg_tde_delete_global_key_provider('global-file-vault'); + pg_tde_delete_global_key_provider +----------------------------------- + +(1 row) + +DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/expected/default_principal_key.out b/contrib/pg_tde/expected/default_principal_key.out index ff23a39dea7d5..21319d568ea60 100644 --- a/contrib/pg_tde/expected/default_principal_key.out +++ b/contrib/pg_tde/expected/default_principal_key.out @@ -1,31 +1,65 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT pg_tde_add_global_key_provider_file('file-provider','/tmp/pg_tde_regression_default_principal_key.per'); +\! rm -f '/tmp/pg_tde_regression_default_key.per' +CREATE EXTENSION pg_tde; +CREATE EXTENSION pg_buffercache; +SELECT pg_tde_add_global_key_provider_file('file-provider','/tmp/pg_tde_regression_default_key.per'); pg_tde_add_global_key_provider_file ------------------------------------- - -3 + (1 row) -SELECT pg_tde_set_default_principal_key('default-principal-key', 'file-provider', false); - pg_tde_set_default_principal_key ----------------------------------- +-- Should fail: no default principal key for the server yet +SELECT pg_tde_verify_default_key(); +ERROR: principal key not configured for current database +-- Should fail: no default principal key for the server yet +SELECT provider_id, provider_name, key_name + FROM pg_tde_default_key_info(); + provider_id | provider_name | key_name +-------------+---------------+---------- + | | +(1 row) + +SELECT pg_tde_create_key_using_global_key_provider('default-key', 'file-provider'); + pg_tde_create_key_using_global_key_provider +--------------------------------------------- (1 row) +SELECT pg_tde_set_default_key_using_global_key_provider('default-key', 'file-provider'); + pg_tde_set_default_key_using_global_key_provider +-------------------------------------------------- + +(1 row) + +SELECT pg_tde_verify_default_key(); + pg_tde_verify_default_key +--------------------------- + +(1 row) + +SELECT provider_id, provider_name, key_name + FROM pg_tde_default_key_info(); + provider_id | provider_name | key_name +-------------+---------------+------------- + -2 | file-provider | default-key +(1 row) + -- fails SELECT pg_tde_delete_global_key_provider('file-provider'); -ERROR: Can't delete a provider which is currently in use -SELECT id, provider_name FROM pg_tde_list_all_global_key_providers(); - id | provider_name +ERROR: cannot delete provider which is currently in use +SELECT id, name FROM pg_tde_list_all_global_key_providers(); + id | name ----+--------------- - -3 | file-provider + -2 | file-provider (1 row) -- Should fail: no principal key for the database yet -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); -ERROR: Principal key does not exists for the database -HINT: Use set_principal_key interface to set the principal key - +SELECT provider_id, provider_name, key_name + FROM pg_tde_key_info(); + provider_id | provider_name | key_name +-------------+---------------+---------- + | | +(1 row) + -- Should succeed: "localizes" the default principal key for the database CREATE TABLE test_enc( id SERIAL, @@ -34,11 +68,11 @@ CREATE TABLE test_enc( ) USING tde_heap; INSERT INTO test_enc (k) VALUES (1), (2), (3); -- Should succeed: create table localized the principal key -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); - key_provider_id | key_provider_name | principal_key_name ------------------+-------------------+----------------------- - -3 | file-provider | default-principal-key +SELECT provider_id, provider_name, key_name + FROM pg_tde_key_info(); + provider_id | provider_name | key_name +-------------+---------------+------------- + -2 | file-provider | default-key (1 row) SELECT current_database() AS regress_database @@ -46,11 +80,15 @@ SELECT current_database() AS regress_database CREATE DATABASE regress_pg_tde_other; \c regress_pg_tde_other CREATE EXTENSION pg_tde; +CREATE EXTENSION pg_buffercache; -- Should fail: no principal key for the database yet -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); -ERROR: Principal key does not exists for the database -HINT: Use set_principal_key interface to set the principal key +SELECT provider_id, provider_name, key_name + FROM pg_tde_key_info(); + provider_id | provider_name | key_name +-------------+---------------+---------- + | | +(1 row) + -- Should succeed: "localizes" the default principal key for the database CREATE TABLE test_enc( id SERIAL, @@ -59,38 +97,86 @@ CREATE TABLE test_enc( ) USING tde_heap; INSERT INTO test_enc (k) VALUES (1), (2), (3); -- Should succeed: create table localized the principal key -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); - key_provider_id | key_provider_name | principal_key_name ------------------+-------------------+----------------------- - -3 | file-provider | default-principal-key +SELECT provider_id, provider_name, key_name + FROM pg_tde_key_info(); + provider_id | provider_name | key_name +-------------+---------------+------------- + -2 | file-provider | default-key (1 row) \c :regress_database -SELECT pg_tde_set_default_principal_key('new-default-principal-key', 'file-provider', false); - pg_tde_set_default_principal_key ----------------------------------- +CHECKPOINT; +SELECT pg_tde_create_key_using_global_key_provider('new-default-key', 'file-provider'); + pg_tde_create_key_using_global_key_provider +--------------------------------------------- (1 row) -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); - key_provider_id | key_provider_name | principal_key_name ------------------+-------------------+--------------------------- - -3 | file-provider | new-default-principal-key +SELECT pg_tde_set_default_key_using_global_key_provider('new-default-key', 'file-provider'); + pg_tde_set_default_key_using_global_key_provider +-------------------------------------------------- + +(1 row) + +SELECT provider_id, provider_name, key_name + FROM pg_tde_key_info(); + provider_id | provider_name | key_name +-------------+---------------+----------------- + -2 | file-provider | new-default-key (1 row) \c regress_pg_tde_other -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); - key_provider_id | key_provider_name | principal_key_name ------------------+-------------------+--------------------------- - -3 | file-provider | new-default-principal-key +SELECT provider_id, provider_name, key_name + FROM pg_tde_key_info(); + provider_id | provider_name | key_name +-------------+---------------+----------------- + -2 | file-provider | new-default-key +(1 row) + +SELECT pg_buffercache_evict(bufferid) FROM pg_buffercache WHERE relfilenode = (SELECT relfilenode FROM pg_class WHERE oid = 'test_enc'::regclass); + pg_buffercache_evict +---------------------- + t (1 row) +SELECT * FROM test_enc; + id | k +----+--- + 1 | 1 + 2 | 2 + 3 | 3 +(3 rows) + DROP TABLE test_enc; DROP EXTENSION pg_tde CASCADE; \c :regress_database +SELECT pg_buffercache_evict(bufferid) FROM pg_buffercache WHERE relfilenode = (SELECT relfilenode FROM pg_class WHERE oid = 'test_enc'::regclass); + pg_buffercache_evict +---------------------- + t +(1 row) + +SELECT * FROM test_enc; + id | k +----+--- + 1 | 1 + 2 | 2 + 3 | 3 +(3 rows) + DROP TABLE test_enc; +SELECT pg_tde_delete_default_key(); + pg_tde_delete_default_key +--------------------------- + +(1 row) + +SELECT pg_tde_delete_global_key_provider('file-provider'); + pg_tde_delete_global_key_provider +----------------------------------- + +(1 row) + DROP EXTENSION pg_tde CASCADE; +DROP EXTENSION pg_buffercache; DROP DATABASE regress_pg_tde_other; diff --git a/contrib/pg_tde/expected/default_principal_key_1.out b/contrib/pg_tde/expected/default_principal_key_1.out deleted file mode 100644 index f8a6b17056c33..0000000000000 --- a/contrib/pg_tde/expected/default_principal_key_1.out +++ /dev/null @@ -1,97 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT pg_tde_add_global_key_provider_file('file-provider','/tmp/pg_tde_regression_default_principal_key.per'); - pg_tde_add_global_key_provider_file -------------------------------------- - -4 -(1 row) - -SELECT pg_tde_set_default_principal_key('default-principal-key', 'file-provider', false); - pg_tde_set_default_principal_key ----------------------------------- - -(1 row) - --- fails -SELECT pg_tde_delete_global_key_provider('file-provider'); -ERROR: Can't delete a provider which is currently in use -SELECT id, provider_name FROM pg_tde_list_all_global_key_providers(); - id | provider_name -----+----------------- - -1 | reg_file-global - -4 | file-provider -(2 rows) - --- Should fail: no principal key for the database yet -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); -ERROR: Principal key does not exists for the database -HINT: Use set_principal_key interface to set the principal key - --- Should succeed: "localizes" the default principal key for the database -CREATE TABLE test_enc( - id SERIAL, - k INTEGER DEFAULT '0' NOT NULL, - PRIMARY KEY (id) -) USING tde_heap; -INSERT INTO test_enc (k) VALUES (1), (2), (3); --- Should succeed: create table localized the principal key -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); - key_provider_id | key_provider_name | principal_key_name ------------------+-------------------+----------------------- - -4 | file-provider | default-principal-key -(1 row) - -SELECT current_database() AS regress_database -\gset -CREATE DATABASE regress_pg_tde_other; -\c regress_pg_tde_other -CREATE EXTENSION pg_tde; --- Should fail: no principal key for the database yet -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); -ERROR: Principal key does not exists for the database -HINT: Use set_principal_key interface to set the principal key --- Should succeed: "localizes" the default principal key for the database -CREATE TABLE test_enc( - id SERIAL, - k INTEGER DEFAULT '0' NOT NULL, - PRIMARY KEY (id) -) USING tde_heap; -INSERT INTO test_enc (k) VALUES (1), (2), (3); --- Should succeed: create table localized the principal key -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); - key_provider_id | key_provider_name | principal_key_name ------------------+-------------------+----------------------- - -4 | file-provider | default-principal-key -(1 row) - -\c :regress_database -SELECT pg_tde_set_default_principal_key('new-default-principal-key', 'file-provider', false); - pg_tde_set_default_principal_key ----------------------------------- - -(1 row) - -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); - key_provider_id | key_provider_name | principal_key_name ------------------+-------------------+--------------------------- - -4 | file-provider | new-default-principal-key -(1 row) - -\c regress_pg_tde_other -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); - key_provider_id | key_provider_name | principal_key_name ------------------+-------------------+--------------------------- - -4 | file-provider | new-default-principal-key -(1 row) - -DROP TABLE test_enc; -DROP EXTENSION pg_tde CASCADE; -\c :regress_database -DROP TABLE test_enc; -DROP EXTENSION pg_tde CASCADE; -DROP DATABASE regress_pg_tde_other; diff --git a/contrib/pg_tde/expected/delete_key_provider.out b/contrib/pg_tde/expected/delete_key_provider.out deleted file mode 100644 index f4f4ed109db53..0000000000000 --- a/contrib/pg_tde/expected/delete_key_provider.out +++ /dev/null @@ -1,74 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT * FROM pg_tde_principal_key_info(); -ERROR: Principal key does not exists for the database -HINT: Use set_principal_key interface to set the principal key -SELECT pg_tde_add_key_provider_file('file-provider','/tmp/pg_tde_test_keyring.per'); - pg_tde_add_key_provider_file ------------------------------- - 1 -(1 row) - -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+---------------+---------------+------------------------------------------------------------ - 1 | file-provider | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring.per"} -(1 row) - -SELECT pg_tde_delete_key_provider('file-provider'); - pg_tde_delete_key_provider ----------------------------- - -(1 row) - -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+---------------+---------------+--------- -(0 rows) - -SELECT pg_tde_add_key_provider_file('file-provider','/tmp/pg_tde_test_keyring.per'); - pg_tde_add_key_provider_file ------------------------------- - 2 -(1 row) - -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+---------------+---------------+------------------------------------------------------------ - 2 | file-provider | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring.per"} -(1 row) - -SELECT pg_tde_delete_key_provider('file-provider'); - pg_tde_delete_key_provider ----------------------------- - -(1 row) - -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+---------------+---------------+--------- -(0 rows) - -SELECT pg_tde_add_key_provider_file('file-provider','/tmp/pg_tde_test_keyring.per'); - pg_tde_add_key_provider_file ------------------------------- - 3 -(1 row) - -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+---------------+---------------+------------------------------------------------------------ - 3 | file-provider | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring.per"} -(1 row) - -SELECT pg_tde_delete_key_provider('file-provider'); - pg_tde_delete_key_provider ----------------------------- - -(1 row) - -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+---------------+---------------+--------- -(0 rows) - -DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/expected/delete_principal_key.out b/contrib/pg_tde/expected/delete_principal_key.out new file mode 100644 index 0000000000000..ffabfa7603b41 --- /dev/null +++ b/contrib/pg_tde/expected/delete_principal_key.out @@ -0,0 +1,182 @@ +\! rm -f '/tmp/pg_tde_test_keyring.per' +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_global_key_provider_file('file-provider','/tmp/pg_tde_test_keyring.per'); + pg_tde_add_global_key_provider_file +------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_global_key_provider('defalut-key','file-provider'); + pg_tde_create_key_using_global_key_provider +--------------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_global_key_provider('test-db-key','file-provider'); + pg_tde_create_key_using_global_key_provider +--------------------------------------------- + +(1 row) + +-- Set the local key and delete it without any encrypted tables +-- Should succeed: nothing used the key +SELECT pg_tde_set_key_using_global_key_provider('test-db-key','file-provider'); + pg_tde_set_key_using_global_key_provider +------------------------------------------ + +(1 row) + +SELECT provider_id, provider_name, key_name FROM pg_tde_key_info(); + provider_id | provider_name | key_name +-------------+---------------+------------- + -3 | file-provider | test-db-key +(1 row) + +SELECT pg_tde_delete_key(); + pg_tde_delete_key +------------------- + +(1 row) + +-- Set local key, encrypt a table, and delete the key +-- Should fail: the is no default key to fallback +SELECT pg_tde_set_key_using_global_key_provider('test-db-key','file-provider'); + pg_tde_set_key_using_global_key_provider +------------------------------------------ + +(1 row) + +CREATE TABLE test_table (id int, data text) USING tde_heap; +SELECT pg_tde_delete_key(); +ERROR: cannot delete principal key +DETAIL: There are encrypted tables in the database. +HINT: Set default principal key as fallback option or decrypt all tables before deleting principal key. +-- Decrypt the table and delete the key +-- Should succeed: there is no more encrypted tables +ALTER TABLE test_table SET ACCESS METHOD heap; +SELECT pg_tde_delete_key(); + pg_tde_delete_key +------------------- + +(1 row) + +-- Set local key, encrypt the table then delete teable and key +-- Should succeed: the table is deleted and there are no more encrypted tables +SELECT pg_tde_set_key_using_global_key_provider('test-db-key','file-provider'); + pg_tde_set_key_using_global_key_provider +------------------------------------------ + +(1 row) + +ALTER TABLE test_table SET ACCESS METHOD tde_heap; +DROP TABLE test_table; +SELECT pg_tde_delete_key(); + pg_tde_delete_key +------------------- + +(1 row) + +-- Set default key, set regular key, create table, delete regular key +-- Should succeed: regular key will be rotated to default key +SELECT pg_tde_set_default_key_using_global_key_provider('defalut-key','file-provider'); + pg_tde_set_default_key_using_global_key_provider +-------------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_global_key_provider('test-db-key','file-provider'); + pg_tde_set_key_using_global_key_provider +------------------------------------------ + +(1 row) + +CREATE TABLE test_table (id int, data text) USING tde_heap; +SELECT pg_tde_delete_key(); + pg_tde_delete_key +------------------- + +(1 row) + +SELECT provider_id, provider_name, key_name FROM pg_tde_key_info(); + provider_id | provider_name | key_name +-------------+---------------+------------- + -3 | file-provider | defalut-key +(1 row) + +-- Try to delete key when default key is used +-- Should fail: table already uses the default key, so there is no key to fallback to +SELECT pg_tde_delete_key(); +ERROR: cannot delete principal key +DETAIL: There are encrypted tables in the database. +-- Try to delete default key +-- Should fail: default key is used by the table +SELECT pg_tde_delete_default_key(); +ERROR: cannot delete default principal key +HINT: There are encrypted tables in the database with id: 16384. +-- Set regular principal key, delete default key +-- Should succeed: the table will use the regular key +SELECT pg_tde_set_key_using_global_key_provider('test-db-key','file-provider'); + pg_tde_set_key_using_global_key_provider +------------------------------------------ + +(1 row) + +SELECT pg_tde_delete_default_key(); + pg_tde_delete_default_key +--------------------------- + +(1 row) + +DROP TABLE test_table; +SELECT pg_tde_delete_key(); + pg_tde_delete_key +------------------- + +(1 row) + +-- Delete default key even if it's configured for a database or server key, as +-- long as it's unused. Regardless how the key was set, we unset it if it's the +-- same key as is used as a default key. This is probably a bug. +SELECT pg_tde_set_default_key_using_global_key_provider('test-db-key','file-provider'); + pg_tde_set_default_key_using_global_key_provider +-------------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_global_key_provider('test-db-key','file-provider'); + pg_tde_set_key_using_global_key_provider +------------------------------------------ + +(1 row) + +SELECT pg_tde_set_server_key_using_global_key_provider('test-db-key','file-provider'); + pg_tde_set_server_key_using_global_key_provider +------------------------------------------------- + +(1 row) + +SELECT pg_tde_delete_default_key(); + pg_tde_delete_default_key +--------------------------- + +(1 row) + +SELECT pg_tde_key_info(); -- No key configured + pg_tde_key_info +----------------- + (,,,) +(1 row) + +SELECT pg_tde_server_key_info(); -- No key configured + pg_tde_server_key_info +------------------------ + (,,,) +(1 row) + +SELECT pg_tde_delete_global_key_provider('file-provider'); + pg_tde_delete_global_key_provider +----------------------------------- + +(1 row) + +DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/expected/insert_update_delete.out b/contrib/pg_tde/expected/insert_update_delete.out index f9ac74fbf988c..97e7f18d1aae5 100644 --- a/contrib/pg_tde/expected/insert_update_delete.out +++ b/contrib/pg_tde/expected/insert_update_delete.out @@ -1,13 +1,20 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); - pg_tde_add_key_provider_file ------------------------------- - 1 +\! rm -f '/tmp/pg_tde_test_keyring.per' +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('test-db-key','file-vault'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + (1 row) -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); - pg_tde_set_principal_key --------------------------- +SELECT pg_tde_set_key_using_database_key_provider('test-db-key','file-vault'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- (1 row) @@ -91,4 +98,18 @@ SELECT * FROM albums; (12 rows) DROP TABLE albums; +CREATE TEMPORARY TABLE animals ( + id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + type TEXT UNIQUE, + num INT +) USING tde_heap; +INSERT INTO animals (type, num) VALUES ('cows', 3), ('pigs', 11); +SELECT * FROM animals ORDER BY id; + id | type | num +----+------+----- + 1 | cows | 3 + 2 | pigs | 11 +(2 rows) + +DROP TABLE animals; DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/expected/key_provider.out b/contrib/pg_tde/expected/key_provider.out index 47930b72efe5f..3bf4f6de9623a 100644 --- a/contrib/pg_tde/expected/key_provider.out +++ b/contrib/pg_tde/expected/key_provider.out @@ -1,166 +1,366 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT * FROM pg_tde_principal_key_info(); -ERROR: Principal key does not exists for the database -HINT: Use set_principal_key interface to set the principal key -SELECT pg_tde_add_key_provider_file('incorrect-file-provider', json_object('foo' VALUE '/tmp/pg_tde_test_keyring.per')); -ERROR: parse json keyring config: unexpected field foo -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+---------------+---------------+--------- -(0 rows) - -SELECT pg_tde_add_key_provider_file('file-provider','/tmp/pg_tde_test_keyring.per'); - pg_tde_add_key_provider_file ------------------------------- - 1 -(1 row) - -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+---------------+---------------+------------------------------------------------------------ - 1 | file-provider | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring.per"} -(1 row) - -SELECT pg_tde_add_key_provider_file('file-provider2','/tmp/pg_tde_test_keyring2.per'); - pg_tde_add_key_provider_file ------------------------------- - 2 -(1 row) - -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+----------------+---------------+------------------------------------------------------------- - 1 | file-provider | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring.per"} - 2 | file-provider2 | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring2.per"} -(2 rows) +\! rm -f '/tmp/db-provider-file' +\! rm -f '/tmp/global-provider-file-1' +\! rm -f '/tmp/pg_tde_test_keyring.per' +\! rm -f '/tmp/pg_tde_test_keyring2.per' +CREATE EXTENSION pg_tde; +SELECT * FROM pg_tde_key_info(); + key_name | provider_name | provider_id | key_creation_time +----------+---------------+-------------+------------------- + | | | +(1 row) -SELECT pg_tde_verify_principal_key(); -ERROR: principal key not configured for current database -SELECT pg_tde_set_principal_key('test-db-principal-key','file-provider'); - pg_tde_set_principal_key --------------------------- +SELECT pg_tde_add_database_key_provider('file', 'incorrect-file-provider', '{"path": {"foo": "/tmp/pg_tde_test_keyring.per"}}'); +ERROR: key provider value cannot be an object +SELECT pg_tde_add_database_key_provider_file('file-provider','/tmp/pg_tde_test_keyring.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- (1 row) -SELECT pg_tde_verify_principal_key(); - pg_tde_verify_principal_key ------------------------------ +SELECT pg_tde_add_database_key_provider_file('file-provider2','/tmp/pg_tde_test_keyring2.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- (1 row) -SELECT pg_tde_change_key_provider_file('not-existent-provider','/tmp/pg_tde_test_keyring.per'); -ERROR: key provider "not-existent-provider" does not exists -HINT: Use pg_tde_add_key_provider interface to create the key provider -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+----------------+---------------+------------------------------------------------------------- - 1 | file-provider | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring.per"} - 2 | file-provider2 | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring2.per"} +SELECT pg_tde_add_database_key_provider_file('file-provider','/tmp/pg_tde_test_keyring_dup.per'); +ERROR: Key provider "file-provider" already exists. +SELECT * FROM pg_tde_list_all_database_key_providers(); + id | name | type | options +----+----------------+------+-------------------------------------------- + 1 | file-provider | file | {"path" : "/tmp/pg_tde_test_keyring.per"} + 2 | file-provider2 | file | {"path" : "/tmp/pg_tde_test_keyring2.per"} (2 rows) -SELECT pg_tde_change_key_provider_file('file-provider','/tmp/pg_tde_test_keyring_other.per'); - pg_tde_change_key_provider_file ---------------------------------- - 1 +SELECT pg_tde_create_key_using_database_key_provider('test-db-key','file-provider'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + (1 row) -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+----------------+---------------+------------------------------------------------------------------ - 1 | file-provider | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring_other.per"} - 2 | file-provider2 | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring2.per"} +SELECT pg_tde_verify_key(); +ERROR: principal key not configured for current database +SELECT pg_tde_set_key_using_database_key_provider('test-db-key','file-provider'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- + +(1 row) + +SELECT pg_tde_verify_key(); + pg_tde_verify_key +------------------- + +(1 row) + +SELECT pg_tde_change_database_key_provider_file('not-existent-provider','/tmp/pg_tde_test_keyring.per'); +ERROR: key provider "not-existent-provider" does not exists +SELECT * FROM pg_tde_list_all_database_key_providers(); + id | name | type | options +----+----------------+------+-------------------------------------------- + 1 | file-provider | file | {"path" : "/tmp/pg_tde_test_keyring.per"} + 2 | file-provider2 | file | {"path" : "/tmp/pg_tde_test_keyring2.per"} (2 rows) -SELECT pg_tde_verify_principal_key(); -ERROR: failed to retrieve principal key test-db-principal-key from keyring with ID 1 -SELECT pg_tde_change_key_provider_file('file-provider', json_object('foo' VALUE '/tmp/pg_tde_test_keyring.per')); -ERROR: parse json keyring config: unexpected field foo -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+----------------+---------------+------------------------------------------------------------------ - 1 | file-provider | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring_other.per"} - 2 | file-provider2 | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring2.per"} +SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": {"foo": "/tmp/pg_tde_test_keyring.per"}}'); +ERROR: key provider value cannot be an object +SELECT * FROM pg_tde_list_all_database_key_providers(); + id | name | type | options +----+----------------+------+-------------------------------------------- + 1 | file-provider | file | {"path" : "/tmp/pg_tde_test_keyring.per"} + 2 | file-provider2 | file | {"path" : "/tmp/pg_tde_test_keyring2.per"} (2 rows) SELECT pg_tde_add_global_key_provider_file('file-keyring','/tmp/pg_tde_test_keyring.per'); pg_tde_add_global_key_provider_file ------------------------------------- - -1 + (1 row) SELECT pg_tde_add_global_key_provider_file('file-keyring2','/tmp/pg_tde_test_keyring2.per'); pg_tde_add_global_key_provider_file ------------------------------------- - -2 + (1 row) -SELECT id, provider_name FROM pg_tde_list_all_global_key_providers(); - id | provider_name +SELECT id, name FROM pg_tde_list_all_global_key_providers(); + id | name ----+--------------- - -1 | file-keyring - -2 | file-keyring2 + -4 | file-keyring + -5 | file-keyring2 (2 rows) --- TODO: verify that we can also can change the type of it -- fails -SELECT pg_tde_delete_key_provider('file-provider'); -ERROR: Can't delete a provider which is currently in use -SELECT id, provider_name FROM pg_tde_list_all_key_providers(); - id | provider_name +SELECT pg_tde_delete_database_key_provider('file-provider'); +ERROR: cannot delete provider which is currently in use +SELECT id, name FROM pg_tde_list_all_database_key_providers(); + id | name ----+---------------- 1 | file-provider 2 | file-provider2 (2 rows) -- works -SELECT pg_tde_delete_key_provider('file-provider2'); - pg_tde_delete_key_provider ----------------------------- +SELECT pg_tde_delete_database_key_provider('file-provider2'); + pg_tde_delete_database_key_provider +------------------------------------- (1 row) -SELECT id, provider_name FROM pg_tde_list_all_key_providers(); - id | provider_name +SELECT id, name FROM pg_tde_list_all_database_key_providers(); + id | name ----+--------------- 1 | file-provider (1 row) -SELECT id, provider_name FROM pg_tde_list_all_global_key_providers(); - id | provider_name +SELECT id, name FROM pg_tde_list_all_global_key_providers(); + id | name ----+--------------- - -1 | file-keyring - -2 | file-keyring2 + -4 | file-keyring + -5 | file-keyring2 (2 rows) -SELECT pg_tde_set_global_principal_key('test-db-principal-key', 'file-keyring', false); - pg_tde_set_global_principal_key ---------------------------------- +SELECT pg_tde_set_key_using_global_key_provider('test-db-key', 'file-keyring'); + pg_tde_set_key_using_global_key_provider +------------------------------------------ (1 row) -- fails SELECT pg_tde_delete_global_key_provider('file-keyring'); +ERROR: cannot delete provider which is currently in use +SELECT id, name FROM pg_tde_list_all_global_key_providers(); + id | name +----+--------------- + -4 | file-keyring + -5 | file-keyring2 +(2 rows) + +-- works +SELECT pg_tde_delete_global_key_provider('file-keyring2'); pg_tde_delete_global_key_provider ----------------------------------- (1 row) -SELECT id, provider_name FROM pg_tde_list_all_global_key_providers(); - id | provider_name -----+--------------- - -2 | file-keyring2 +SELECT id, name FROM pg_tde_list_all_global_key_providers(); + id | name +----+-------------- + -4 | file-keyring (1 row) --- works -SELECT pg_tde_delete_global_key_provider('file-keyring2'); - pg_tde_delete_global_key_provider ------------------------------------ +-- Creating a file key provider fails if we can't open or create the file +SELECT pg_tde_add_database_key_provider_file('will-not-work','/cant-create-file-in-root.per'); +ERROR: Failed to open keyring file /cant-create-file-in-root.per: Permission denied +-- Creating key providers fails if any required parameter is NULL +SELECT pg_tde_add_database_key_provider(NULL, 'name', '{}'); +ERROR: provider type cannot be null +SELECT pg_tde_add_database_key_provider('file', NULL, '{}'); +ERROR: provider name cannot be null +SELECT pg_tde_add_database_key_provider('file', 'name', NULL); +ERROR: provider options cannot be null +SELECT pg_tde_add_global_key_provider(NULL, 'name', '{}'); +ERROR: provider type cannot be null +SELECT pg_tde_add_global_key_provider('file', NULL, '{}'); +ERROR: provider name cannot be null +SELECT pg_tde_add_global_key_provider('file', 'name', NULL); +ERROR: provider options cannot be null +-- Empty string is not allowed for a key provider name +SELECT pg_tde_add_database_key_provider('file', '', '{}'); +ERROR: provider name "" is too short +SELECT pg_tde_add_global_key_provider('file', '', '{}'); +ERROR: provider name "" is too short +-- Creating key providers fails if the name is too long +SELECT pg_tde_add_database_key_provider('file', repeat('K', 128), '{}'); +ERROR: provider name "KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK" is too long +HINT: Maximum length is 127 bytes. +SELECT pg_tde_add_global_key_provider('file', repeat('K', 128), '{}'); +ERROR: provider name "KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK" is too long +HINT: Maximum length is 127 bytes. +-- Creating key providers fails if options is too long +SELECT pg_tde_add_database_key_provider('file', 'name', json_build_object('key', repeat('K', 1024))); +ERROR: too large provider options, maximum size is 1023 bytes +SELECT pg_tde_add_global_key_provider('file', 'name', json_build_object('key', repeat('K', 1024))); +ERROR: too large provider options, maximum size is 1023 bytes +-- Creating key providers fails if configuration is not a JSON object +SELECT pg_tde_add_database_key_provider('file', 'provider', '"bare string"'); +ERROR: key provider options must be an object +SELECT pg_tde_add_database_key_provider('file', 'provider', '["array"]'); +ERROR: key provider options must be an object +SELECT pg_tde_add_database_key_provider('file', 'provider', 'true'); +ERROR: key provider options must be an object +SELECT pg_tde_add_database_key_provider('file', 'provider', 'null'); +ERROR: key provider options must be an object +-- Creating key providers fails if vaules are not scalar +SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {}}'); +ERROR: key provider value cannot be an object +SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": ["array"]}'); +ERROR: unexpected array in field "path" +SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": true}'); +ERROR: unexpected boolean in field "path" +-- Modifying key providers fails if any required parameter is NULL +SELECT pg_tde_change_database_key_provider(NULL, 'file-keyring', '{}'); +ERROR: provider type cannot be null +SELECT pg_tde_change_database_key_provider('file', NULL, '{}'); +ERROR: provider name cannot be null +SELECT pg_tde_change_database_key_provider('file', 'file-keyring', NULL); +ERROR: provider options cannot be null +SELECT pg_tde_change_global_key_provider(NULL, 'file-keyring', '{}'); +ERROR: provider type cannot be null +SELECT pg_tde_change_global_key_provider('file', NULL, '{}'); +ERROR: provider name cannot be null +SELECT pg_tde_change_global_key_provider('file', 'file-keyring', NULL); +ERROR: provider options cannot be null +-- Modifying key providers fails if options is too long +SELECT pg_tde_change_database_key_provider('file', 'file-provider', json_build_object('key', repeat('V', 1024))); +ERROR: too large provider options, maximum size is 1023 bytes +SELECT pg_tde_change_global_key_provider('file', 'file-keyring', json_build_object('key', repeat('V', 1024))); +ERROR: too large provider options, maximum size is 1023 bytes +-- Modifying key providers fails if configuration is not a JSON object +SELECT pg_tde_change_database_key_provider('file', 'file-provider', '"bare string"'); +ERROR: key provider options must be an object +SELECT pg_tde_change_database_key_provider('file', 'file-provider', '["array"]'); +ERROR: key provider options must be an object +SELECT pg_tde_change_database_key_provider('file', 'file-provider', 'true'); +ERROR: key provider options must be an object +SELECT pg_tde_change_database_key_provider('file', 'file-provider', 'null'); +ERROR: key provider options must be an object +-- Modifying key providers fails if vaules are not scalar +SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": {}}'); +ERROR: key provider value cannot be an object +SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": ["array"]}'); +ERROR: unexpected array in field "path" +SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": true}'); +ERROR: unexpected boolean in field "path" +-- Modifying key providers fails if new settings can't fetch existing server key +SELECT pg_tde_add_global_key_provider_file('global-provider', '/tmp/global-provider-file-1'); + pg_tde_add_global_key_provider_file +------------------------------------- (1 row) -SELECT id, provider_name FROM pg_tde_list_all_global_key_providers(); - id | provider_name -----+--------------- -(0 rows) +SELECT pg_tde_create_key_using_global_key_provider('server-key', 'global-provider'); + pg_tde_create_key_using_global_key_provider +--------------------------------------------- + +(1 row) + +SELECT pg_tde_set_server_key_using_global_key_provider('server-key', 'global-provider'); + pg_tde_set_server_key_using_global_key_provider +------------------------------------------------- + +(1 row) + +SELECT pg_tde_change_global_key_provider_file('global-provider','/tmp/global-provider-file-2'); +ERROR: key "server-key" used as server key not found in modified key provider "global-provider" +-- Modifying key providers fails if new settings can't fetch existing database key +SELECT pg_tde_add_global_key_provider_file('global-provider2', '/tmp/global-provider-file-1'); + pg_tde_add_global_key_provider_file +------------------------------------- + +(1 row) + +SELECT current_database() AS regress_database +\gset +CREATE DATABASE db_using_global_provider; +\c db_using_global_provider; +CREATE EXTENSION pg_tde; +SELECT pg_tde_create_key_using_global_key_provider('database-key', 'global-provider2'); + pg_tde_create_key_using_global_key_provider +--------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_global_key_provider('database-key', 'global-provider2'); + pg_tde_set_key_using_global_key_provider +------------------------------------------ + +(1 row) + +\c :regress_database +SELECT pg_tde_change_global_key_provider_file('global-provider2', '/tmp/global-provider-file-2'); +ERROR: key "database-key" used by database "db_using_global_provider" not found in modified key provider "global-provider2" +DROP DATABASE db_using_global_provider; +CREATE DATABASE db_using_database_provider; +\c db_using_database_provider; +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('db-provider', '/tmp/db-provider-file'); + pg_tde_add_database_key_provider_file +--------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('database-key', 'db-provider'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('database-key', 'db-provider'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- + +(1 row) + +SELECT pg_tde_change_database_key_provider_file('db-provider', '/tmp/db-provider-file-2'); +ERROR: key "database-key" used by database "db_using_database_provider" not found in modified key provider "db-provider" +\c :regress_database +DROP DATABASE db_using_database_provider; +-- Deleting key providers fails if key name is NULL +SELECT pg_tde_delete_database_key_provider(NULL); +ERROR: provider_name cannot be null +SELECT pg_tde_delete_global_key_provider(NULL); +ERROR: provider_name cannot be null +-- Setting principal key fails if provider name is NULL +SELECT pg_tde_set_default_key_using_global_key_provider('key', NULL); +ERROR: key provider name cannot be null +SELECT pg_tde_set_key_using_database_key_provider('key', NULL); +ERROR: key provider name cannot be null +SELECT pg_tde_set_key_using_global_key_provider('key', NULL); +ERROR: key provider name cannot be null +SELECT pg_tde_set_server_key_using_global_key_provider('key', NULL); +ERROR: key provider name cannot be null +-- Setting principal key fails if key name is NULL +SELECT pg_tde_set_default_key_using_global_key_provider(NULL, 'file-keyring'); +ERROR: key name cannot be null +SELECT pg_tde_set_key_using_database_key_provider(NULL, 'file-keyring'); +ERROR: key name cannot be null +SELECT pg_tde_set_key_using_global_key_provider(NULL, 'file-keyring'); +ERROR: key name cannot be null +SELECT pg_tde_set_server_key_using_global_key_provider(NULL, 'file-keyring'); +ERROR: key name cannot be null +-- Empty string is not allowed for a principal key name +SELECT pg_tde_create_key_using_database_key_provider('', 'file-provider'); +ERROR: key name "" is too short +SELECT pg_tde_create_key_using_global_key_provider('', 'file-keyring'); +ERROR: key name "" is too short +-- Creating principal key fails if the key name is too long +SELECT pg_tde_create_key_using_database_key_provider(repeat('K', 256), 'file-provider'); +ERROR: key name "KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK" is too long +HINT: Maximum length is 255 bytes. +SELECT pg_tde_create_key_using_global_key_provider(repeat('K', 256), 'file-keyring'); +ERROR: key name "KKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKK" is too long +HINT: Maximum length is 255 bytes. +-- Creating principal key fails if key already exists +SELECT pg_tde_create_key_using_database_key_provider('existing-key','file-provider'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) +SELECT pg_tde_create_key_using_database_key_provider('existing-key','file-provider'); +ERROR: cannot create key "existing-key" because it already exists +SELECT pg_tde_create_key_using_global_key_provider('existing-key','file-keyring'); +ERROR: cannot create key "existing-key" because it already exists +-- Setting principal key fails if key does not exist +SELECT pg_tde_set_default_key_using_global_key_provider('not-existing', 'file-keyring'); +ERROR: key "not-existing" does not exist +HINT: Use pg_tde_create_key_using_global_key_provider() to create it. +SELECT pg_tde_set_key_using_database_key_provider('not-existing', 'file-keyring'); +ERROR: key provider "file-keyring" does not exists +SELECT pg_tde_set_key_using_global_key_provider('not-existing', 'file-keyring'); +ERROR: key "not-existing" does not exist +HINT: Use pg_tde_create_key_using_global_key_provider() to create it. +SELECT pg_tde_set_server_key_using_global_key_provider('not-existing', 'file-keyring'); +ERROR: key "not-existing" does not exist +HINT: Use pg_tde_create_key_using_global_key_provider() to create it. DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/expected/key_provider_1.out b/contrib/pg_tde/expected/key_provider_1.out deleted file mode 100644 index 18ba31455eba3..0000000000000 --- a/contrib/pg_tde/expected/key_provider_1.out +++ /dev/null @@ -1,170 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT * FROM pg_tde_principal_key_info(); -ERROR: Principal key does not exists for the database -HINT: Use set_principal_key interface to set the principal key -SELECT pg_tde_add_key_provider_file('incorrect-file-provider', json_object('foo' VALUE '/tmp/pg_tde_test_keyring.per')); -ERROR: parse json keyring config: unexpected field foo -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+---------------+---------------+--------- -(0 rows) - -SELECT pg_tde_add_key_provider_file('file-provider','/tmp/pg_tde_test_keyring.per'); - pg_tde_add_key_provider_file ------------------------------- - 1 -(1 row) - -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+---------------+---------------+------------------------------------------------------------ - 1 | file-provider | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring.per"} -(1 row) - -SELECT pg_tde_add_key_provider_file('file-provider2','/tmp/pg_tde_test_keyring2.per'); - pg_tde_add_key_provider_file ------------------------------- - 2 -(1 row) - -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+----------------+---------------+------------------------------------------------------------- - 1 | file-provider | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring.per"} - 2 | file-provider2 | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring2.per"} -(2 rows) - -SELECT pg_tde_verify_principal_key(); -ERROR: principal key not configured for current database -SELECT pg_tde_set_principal_key('test-db-principal-key','file-provider'); - pg_tde_set_principal_key --------------------------- - -(1 row) - -SELECT pg_tde_verify_principal_key(); - pg_tde_verify_principal_key ------------------------------ - -(1 row) - -SELECT pg_tde_change_key_provider_file('not-existent-provider','/tmp/pg_tde_test_keyring.per'); -ERROR: key provider "not-existent-provider" does not exists -HINT: Use pg_tde_add_key_provider interface to create the key provider -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+----------------+---------------+------------------------------------------------------------- - 1 | file-provider | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring.per"} - 2 | file-provider2 | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring2.per"} -(2 rows) - -SELECT pg_tde_change_key_provider_file('file-provider','/tmp/pg_tde_test_keyring_other.per'); - pg_tde_change_key_provider_file ---------------------------------- - 1 -(1 row) - -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+----------------+---------------+------------------------------------------------------------------ - 1 | file-provider | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring_other.per"} - 2 | file-provider2 | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring2.per"} -(2 rows) - -SELECT pg_tde_verify_principal_key(); -ERROR: failed to retrieve principal key test-db-principal-key from keyring with ID 1 -SELECT pg_tde_change_key_provider_file('file-provider', json_object('foo' VALUE '/tmp/pg_tde_test_keyring.per')); -ERROR: parse json keyring config: unexpected field foo -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+----------------+---------------+------------------------------------------------------------------ - 1 | file-provider | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring_other.per"} - 2 | file-provider2 | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring2.per"} -(2 rows) - -SELECT pg_tde_add_global_key_provider_file('file-keyring','/tmp/pg_tde_test_keyring.per'); - pg_tde_add_global_key_provider_file -------------------------------------- - -2 -(1 row) - -SELECT pg_tde_add_global_key_provider_file('file-keyring2','/tmp/pg_tde_test_keyring2.per'); - pg_tde_add_global_key_provider_file -------------------------------------- - -3 -(1 row) - -SELECT id, provider_name FROM pg_tde_list_all_global_key_providers(); - id | provider_name -----+----------------- - -1 | reg_file-global - -2 | file-keyring - -3 | file-keyring2 -(3 rows) - --- TODO: verify that we can also can change the type of it --- fails -SELECT pg_tde_delete_key_provider('file-provider'); -ERROR: Can't delete a provider which is currently in use -SELECT id, provider_name FROM pg_tde_list_all_key_providers(); - id | provider_name -----+---------------- - 1 | file-provider - 2 | file-provider2 -(2 rows) - --- works -SELECT pg_tde_delete_key_provider('file-provider2'); - pg_tde_delete_key_provider ----------------------------- - -(1 row) - -SELECT id, provider_name FROM pg_tde_list_all_key_providers(); - id | provider_name -----+--------------- - 1 | file-provider -(1 row) - -SELECT id, provider_name FROM pg_tde_list_all_global_key_providers(); - id | provider_name -----+----------------- - -1 | reg_file-global - -2 | file-keyring - -3 | file-keyring2 -(3 rows) - -SELECT pg_tde_set_global_principal_key('test-db-principal-key', 'file-keyring', false); - pg_tde_set_global_principal_key ---------------------------------- - -(1 row) - --- fails -SELECT pg_tde_delete_global_key_provider('file-keyring'); - pg_tde_delete_global_key_provider ------------------------------------ - -(1 row) - -SELECT id, provider_name FROM pg_tde_list_all_global_key_providers(); - id | provider_name -----+----------------- - -1 | reg_file-global - -3 | file-keyring2 -(2 rows) - --- works -SELECT pg_tde_delete_global_key_provider('file-keyring2'); - pg_tde_delete_global_key_provider ------------------------------------ - -(1 row) - -SELECT id, provider_name FROM pg_tde_list_all_global_key_providers(); - id | provider_name -----+----------------- - -1 | reg_file-global -(1 row) - -DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/expected/keyprovider_dependency.out b/contrib/pg_tde/expected/keyprovider_dependency.out deleted file mode 100644 index e9133e52f72d5..0000000000000 --- a/contrib/pg_tde/expected/keyprovider_dependency.out +++ /dev/null @@ -1,34 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT pg_tde_add_key_provider_file('mk-file','/tmp/pg_tde_test_keyring.per'); - pg_tde_add_key_provider_file ------------------------------- - 1 -(1 row) - -SELECT pg_tde_add_key_provider_file('free-file','/tmp/pg_tde_test_keyring_2.per'); - pg_tde_add_key_provider_file ------------------------------- - 2 -(1 row) - -SELECT pg_tde_add_key_provider_vault_v2('V2-vault','vault-token','percona.com/vault-v2/percona','/mount/dev','ca-cert-auth'); - pg_tde_add_key_provider_vault_v2 ----------------------------------- - 3 -(1 row) - -SELECT * FROM pg_tde_list_all_key_providers(); - id | provider_name | provider_type | options -----+---------------+---------------+----------------------------------------------------------------------------------------------------------------------------------------------- - 1 | mk-file | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring.per"} - 2 | free-file | file | {"type" : "file", "path" : "/tmp/pg_tde_test_keyring_2.per"} - 3 | V2-vault | vault-v2 | {"type" : "vault-v2", "url" : "percona.com/vault-v2/percona", "token" : "vault-token", "mountPath" : "/mount/dev", "caPath" : "ca-cert-auth"} -(3 rows) - -SELECT pg_tde_set_principal_key('test-db-principal-key','mk-file'); - pg_tde_set_principal_key --------------------------- - -(1 row) - -DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/expected/kmip_test.out b/contrib/pg_tde/expected/kmip_test.out index 71f5ac083d84c..630dfe69c3509 100644 --- a/contrib/pg_tde/expected/kmip_test.out +++ b/contrib/pg_tde/expected/kmip_test.out @@ -1,13 +1,19 @@ CREATE EXTENSION pg_tde; -SELECT pg_tde_add_key_provider_kmip('kmip-prov','127.0.0.1', 5696, '/tmp/server_certificate.pem', '/tmp/client_key_jane_doe.pem'); - pg_tde_add_key_provider_kmip ------------------------------- - 1 +SELECT pg_tde_add_database_key_provider_kmip('kmip-prov', '127.0.0.1', 5696, '/tmp/client_certificate_jane_doe.pem', '/tmp/client_key_jane_doe.pem', '/tmp/server_certificate.pem'); + pg_tde_add_database_key_provider_kmip +--------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('kmip-key','kmip-prov'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + (1 row) -SELECT pg_tde_set_principal_key('kmip-principal-key','kmip-prov'); - pg_tde_set_principal_key --------------------------- +SELECT pg_tde_set_key_using_database_key_provider('kmip-key','kmip-prov'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- (1 row) @@ -27,5 +33,14 @@ SELECT * from test_enc; 3 | 3 (3 rows) +SELECT pg_tde_verify_key(); + pg_tde_verify_key +------------------- + +(1 row) + DROP TABLE test_enc; +-- Creating provider fails if we can't connect to kmip server +SELECT pg_tde_add_database_key_provider_kmip('will-not-work', '127.0.0.1', 61, '/tmp/client_certificate_jane_doe.pem', '/tmp/client_key_jane_doe.pem', '/tmp/server_certificate.pem'); +ERROR: SSL error: BIO_do_connect failed DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/expected/no_provider_error.out b/contrib/pg_tde/expected/no_provider_error.out deleted file mode 100644 index e4eb1693d21e3..0000000000000 --- a/contrib/pg_tde/expected/no_provider_error.out +++ /dev/null @@ -1,8 +0,0 @@ -CREATE EXTENSION pg_tde; --- should fail -CREATE TABLE t1 (n INT) USING tde_heap; -ERROR: failed to retrieve principal key. Create one using pg_tde_set_principal_key before using encrypted tables. --- should work -CREATE TABLE t2 (n INT) USING heap; -DROP TABLE t2; -DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/expected/partition_table.out b/contrib/pg_tde/expected/partition_table.out new file mode 100644 index 0000000000000..55835d3d4f0cd --- /dev/null +++ b/contrib/pg_tde/expected/partition_table.out @@ -0,0 +1,234 @@ +\! rm -f '/tmp/pg_tde_keyring.per' +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('database_keyring_provider','/tmp/pg_tde_keyring.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('table_key','database_keyring_provider'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('table_key','database_keyring_provider'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- + +(1 row) + +CREATE TABLE IF NOT EXISTS partitioned_table ( + id SERIAL, + data TEXT, + created_at DATE NOT NULL, + PRIMARY KEY (id, created_at) + ) PARTITION BY RANGE (created_at) USING tde_heap; +CREATE TABLE partition_q1_2024 PARTITION OF partitioned_table FOR VALUES FROM ('2024-01-01') TO ('2024-04-01') USING tde_heap; +CREATE TABLE partition_q2_2024 PARTITION OF partitioned_table FOR VALUES FROM ('2024-04-01') TO ('2024-07-01') USING heap; +CREATE TABLE partition_q3_2024 PARTITION OF partitioned_table FOR VALUES FROM ('2024-07-01') TO ('2024-10-01') USING tde_heap; +CREATE TABLE partition_q4_2024 PARTITION OF partitioned_table FOR VALUES FROM ('2024-10-01') TO ('2025-01-01') USING heap; +SELECT pg_tde_is_encrypted('partitioned_table'); + pg_tde_is_encrypted +--------------------- + +(1 row) + +SELECT pg_tde_is_encrypted('partition_q1_2024'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +SELECT pg_tde_is_encrypted('partition_q2_2024'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +SELECT pg_tde_is_encrypted('partition_q3_2024'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +SELECT pg_tde_is_encrypted('partition_q4_2024'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +ALTER TABLE partitioned_table SET ACCESS METHOD heap; +ERROR: Recursive ALTER TABLE on a mix of encrypted and unencrypted relations is not supported +ALTER TABLE partition_q1_2024 SET ACCESS METHOD heap; +ALTER TABLE partition_q2_2024 SET ACCESS METHOD tde_heap; +ALTER TABLE partition_q3_2024 SET ACCESS METHOD heap; +ALTER TABLE partition_q4_2024 SET ACCESS METHOD tde_heap; +SELECT pg_tde_is_encrypted('partitioned_table'); + pg_tde_is_encrypted +--------------------- + +(1 row) + +SELECT pg_tde_is_encrypted('partition_q1_2024'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +SELECT pg_tde_is_encrypted('partition_q2_2024'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +SELECT pg_tde_is_encrypted('partition_q3_2024'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +SELECT pg_tde_is_encrypted('partition_q4_2024'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +-- Does not care about parent AM as long as all children with storage use the same +ALTER TABLE partition_q1_2024 SET ACCESS METHOD tde_heap; +ALTER TABLE partition_q2_2024 SET ACCESS METHOD tde_heap; +ALTER TABLE partition_q3_2024 SET ACCESS METHOD tde_heap; +ALTER TABLE partition_q4_2024 SET ACCESS METHOD tde_heap; +ALTER TABLE partitioned_table SET ACCESS METHOD heap; +DROP TABLE partitioned_table; +-- Partition inherits encryption status from parent table if default is heap and parent is tde_heap +SET default_table_access_method = "heap"; +CREATE TABLE partition_parent (a int) PARTITION BY RANGE (a) USING tde_heap; +CREATE TABLE partition_child PARTITION OF partition_parent FOR VALUES FROM (0) TO (9); +SELECT pg_tde_is_encrypted('partition_child'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +DROP TABLE partition_parent; +RESET default_table_access_method; +-- Partition inherits encryption status from parent table if default is tde_heap and parent is heap +SET default_table_access_method = "tde_heap"; +CREATE TABLE partition_parent (a int) PARTITION BY RANGE (a) USING heap; +CREATE TABLE partition_child PARTITION OF partition_parent FOR VALUES FROM (0) TO (9); +SELECT pg_tde_is_encrypted('partition_child'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +DROP TABLE partition_parent; +RESET default_table_access_method; +-- Partition uses default access method to determine encryption status if neither parent nor child have an access method set +CREATE TABLE partition_parent (a int) PARTITION BY RANGE (a); +SET default_table_access_method = "tde_heap"; +CREATE TABLE partition_child_tde PARTITION OF partition_parent FOR VALUES FROM (0) TO (9); +SELECT pg_tde_is_encrypted('partition_child_tde'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +SET default_table_access_method = "heap"; +CREATE TABLE partition_child_heap PARTITION OF partition_parent FOR VALUES FROM (10) TO (19); +SELECT pg_tde_is_encrypted('partition_child_heap'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +DROP TABLE partition_parent; +RESET default_table_access_method; +-- Enforce encryption GUC is respected when creating partitions even if parent is plain text +CREATE TABLE partition_parent (a int) PARTITION BY RANGE (a) USING heap; +SET pg_tde.enforce_encryption = on; +CREATE TABLE partition_child_inherit PARTITION OF partition_parent FOR VALUES FROM (0) TO (10); +ERROR: pg_tde.enforce_encryption is ON, only the tde_heap access method is allowed. +CREATE TABLE partition_child_heap PARTITION OF partition_parent FOR VALUES FROM (11) TO (20) USING heap; +ERROR: pg_tde.enforce_encryption is ON, only the tde_heap access method is allowed. +CREATE TABLE partition_child_tde_heap PARTITION OF partition_parent FOR VALUES FROM (11) TO (20) USING tde_heap; +SELECT pg_tde_is_encrypted('partition_child_tde_heap'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +DROP TABLE partition_parent; +RESET pg_tde.enforce_encryption; +-- Does not change encryption of child tables when rewriting and changing AM +CREATE TABLE partition_parent (a int, b int) PARTITION BY RANGE (a) USING tde_heap; +CREATE TABLE partition_child PARTITION OF partition_parent FOR VALUES FROM (0) TO (9) USING tde_heap; +SELECT pg_tde_is_encrypted('partition_child'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +ALTER TABLE partition_parent SET ACCESS METHOD heap, ALTER b TYPE bigint; +SELECT relname, amname FROM pg_class JOIN pg_am ON pg_am.oid = pg_class.relam WHERE relname IN ('partition_parent', 'partition_child') ORDER BY relname; + relname | amname +------------------+---------- + partition_child | tde_heap + partition_parent | heap +(2 rows) + +SELECT pg_tde_is_encrypted('partition_child'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +DROP TABLE partition_parent; +-- Partitioned indexes should be encrypted +CREATE TABLE partition_parent (a int) PARTITION BY RANGE (a); +CREATE TABLE partition_child PARTITION OF partition_parent FOR VALUES FROM (0) TO (9) USING tde_heap; +CREATE INDEX ON partition_parent (a); +SELECT pg_tde_is_encrypted('partition_parent_a_idx'); -- Also check that the parent index is NULL + pg_tde_is_encrypted +--------------------- + +(1 row) + +SELECT pg_tde_is_encrypted('partition_child_a_idx'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +DROP TABLE partition_parent; +-- Partitioned indexes should be not encrypted with heap +CREATE TABLE partition_parent (a int) PARTITION BY RANGE (a); +CREATE TABLE partition_child PARTITION OF partition_parent FOR VALUES FROM (0) TO (9) USING heap; +CREATE INDEX ON partition_parent (a); +SELECT pg_tde_is_encrypted('partition_child_a_idx'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +DROP TABLE partition_parent; +-- We refuse to create an index when the inheritance heirarchy has mixed statuses +CREATE TABLE partition_parent (a int) PARTITION BY RANGE (a); +CREATE TABLE partition_child_heap PARTITION OF partition_parent FOR VALUES FROM (0) TO (9) USING heap; +CREATE TABLE partition_child_tde_heap PARTITION OF partition_parent FOR VALUES FROM (10) TO (19) USING tde_heap; +CREATE INDEX ON partition_parent (a); +ERROR: Recursive CREATE INDEX on a mix of encrypted and unencrypted relations is not supported +DROP TABLE partition_parent; +-- Index should also be encrypted for new partitionins +CREATE TABLE partition_parent (a int) PARTITION BY RANGE (a); +CREATE INDEX ON partition_parent (a); +CREATE TABLE partition_child PARTITION OF partition_parent FOR VALUES FROM (10) TO (19) USING tde_heap; +SELECT pg_tde_is_encrypted('partition_child_a_idx'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +DROP TABLE partition_parent; +DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/expected/pg_tde_is_encrypted.out b/contrib/pg_tde/expected/pg_tde_is_encrypted.out index f9607ae10a0ae..eb3c68fbc7e74 100644 --- a/contrib/pg_tde/expected/pg_tde_is_encrypted.out +++ b/contrib/pg_tde/expected/pg_tde_is_encrypted.out @@ -1,65 +1,82 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT * FROM pg_tde_principal_key_info(); -ERROR: Principal key does not exists for the database -HINT: Use set_principal_key interface to set the principal key -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); - pg_tde_add_key_provider_file ------------------------------- - 1 +\! rm -f '/tmp/pg_tde_test_keyring.per' +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('test-db-key','file-vault'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + (1 row) -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); - pg_tde_set_principal_key --------------------------- +SELECT pg_tde_set_key_using_database_key_provider('test-db-key','file-vault'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- (1 row) -CREATE TABLE test_enc( - id SERIAL, - k INTEGER DEFAULT '0' NOT NULL, - PRIMARY KEY (id) - ) USING tde_heap; -CREATE TABLE test_norm( - id SERIAL, - k INTEGER DEFAULT '0' NOT NULL, - PRIMARY KEY (id) - ) USING heap; -CREATE TABLE test_part( - id SERIAL, - k INTEGER DEFAULT '0' NOT NULL, - PRIMARY KEY (id) - ) PARTITION BY RANGE (id) USING tde_heap; -SELECT relname, amname FROM pg_class JOIN pg_am ON pg_am.oid = pg_class.relam WHERE relname IN ('test_enc', 'test_norm', 'test_part') ORDER BY relname; - relname | amname ------------+---------- - test_enc | tde_heap - test_norm | heap - test_part | tde_heap -(3 rows) +CREATE TABLE test_enc ( + id SERIAL, + PRIMARY KEY (id) +) USING tde_heap; +CREATE TABLE test_norm ( + id SERIAL, + PRIMARY KEY (id) +) USING heap; +CREATE TABLE test_part ( + id SERIAL, + PRIMARY KEY (id) +) PARTITION BY RANGE (id) USING tde_heap; +CREATE TEMP TABLE test_temp_enc ( + id SERIAL, + PRIMARY KEY (id) +) USING tde_heap; +CREATE TEMP TABLE test_temp_norm ( + id SERIAL, + PRIMARY KEY (id) +) USING heap; +SELECT relname, amname FROM pg_class JOIN pg_am ON pg_am.oid = pg_class.relam WHERE relname IN ('test_enc', 'test_norm', 'test_part', 'test_temp_enc', 'test_temp_norm') ORDER BY relname; + relname | amname +----------------+---------- + test_enc | tde_heap + test_norm | heap + test_part | tde_heap + test_temp_enc | tde_heap + test_temp_norm | heap +(5 rows) -SELECT relname, pg_tde_is_encrypted(relname) FROM (VALUES ('test_enc'), ('test_norm'), ('test_part')) AS r (relname) ORDER BY relname; - relname | pg_tde_is_encrypted ------------+--------------------- - test_enc | t - test_norm | f - test_part | -(3 rows) +SELECT relname, pg_tde_is_encrypted(relname) FROM (VALUES ('test_enc'), ('test_norm'), ('test_part'), ('test_temp_enc'), ('test_temp_norm')) AS r (relname) ORDER BY relname; + relname | pg_tde_is_encrypted +----------------+--------------------- + test_enc | t + test_norm | f + test_part | + test_temp_enc | t + test_temp_norm | f +(5 rows) -SELECT relname, pg_tde_is_encrypted(relname) FROM (VALUES ('test_enc_id_seq'), ('test_norm_id_seq'), ('test_part_id_seq')) AS r (relname) ORDER BY relname; +SELECT relname, pg_tde_is_encrypted(relname) FROM (VALUES ('test_enc_id_seq'), ('test_norm_id_seq'), ('test_part_id_seq'), ('test_temp_enc'), ('test_temp_norm')) AS r (relname) ORDER BY relname; relname | pg_tde_is_encrypted ------------------+--------------------- test_enc_id_seq | t test_norm_id_seq | f test_part_id_seq | t -(3 rows) + test_temp_enc | t + test_temp_norm | f +(5 rows) -SELECT relname, pg_tde_is_encrypted(relname) FROM (VALUES ('test_enc_pkey'), ('test_norm_pkey'), ('test_part_pkey')) AS r (relname) ORDER BY relname; +SELECT relname, pg_tde_is_encrypted(relname) FROM (VALUES ('test_enc_pkey'), ('test_norm_pkey'), ('test_part_pkey'), ('test_temp_enc'), ('test_temp_norm')) AS r (relname) ORDER BY relname; relname | pg_tde_is_encrypted ----------------+--------------------- test_enc_pkey | t test_norm_pkey | f test_part_pkey | -(3 rows) + test_temp_enc | t + test_temp_norm | f +(5 rows) SELECT pg_tde_is_encrypted(NULL); pg_tde_is_encrypted @@ -67,13 +84,15 @@ SELECT pg_tde_is_encrypted(NULL); (1 row) -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); - key_provider_id | key_provider_name | principal_key_name ------------------+-------------------+----------------------- - 1 | file-vault | test-db-principal-key +SELECT provider_id, provider_name, key_name + FROM pg_tde_key_info(); + provider_id | provider_name | key_name +-------------+---------------+------------- + 1 | file-vault | test-db-key (1 row) +DROP TABLE test_temp_norm; +DROP TABLE test_temp_enc; DROP TABLE test_part; DROP TABLE test_norm; DROP TABLE test_enc; diff --git a/contrib/pg_tde/expected/recreate_storage.out b/contrib/pg_tde/expected/recreate_storage.out index 0f8ce3d66c99d..307f8c96f5c8d 100644 --- a/contrib/pg_tde/expected/recreate_storage.out +++ b/contrib/pg_tde/expected/recreate_storage.out @@ -1,13 +1,20 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); - pg_tde_add_key_provider_file ------------------------------- - 1 +\! rm -f '/tmp/pg_tde_test_keyring.per' +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + (1 row) -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); - pg_tde_set_principal_key --------------------------- +SELECT pg_tde_create_key_using_database_key_provider('test-db-key','file-vault'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('test-db-key','file-vault'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- (1 row) @@ -104,6 +111,7 @@ SELECT pg_tde_is_encrypted('rewritemetoo2'); CREATE TABLE encrypted_table ( id SERIAL, + id2 INT, data TEXT, created_at DATE NOT NULL, PRIMARY KEY (id, created_at) @@ -135,6 +143,143 @@ SELECT pg_tde_is_encrypted('encrypted_table_id_seq'); t (1 row) +CREATE TABLE plain_table ( + id2 INT +) USING heap; +-- Starts independent and becomes encrypted +CREATE SEQUENCE independent_seq; +SELECT pg_tde_is_encrypted('independent_seq'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +ALTER SEQUENCE independent_seq OWNED BY encrypted_table.id2; +SELECT pg_tde_is_encrypted('independent_seq'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +-- Starts independent and stays plain +CREATE SEQUENCE independent_seq2 OWNED BY NONE; +SELECT pg_tde_is_encrypted('independent_seq2'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +ALTER SEQUENCE independent_seq2 OWNED BY plain_table.id2; +SELECT pg_tde_is_encrypted('independent_seq2'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +-- Starts owned by an encrypted table and becomes owned by a plain table +CREATE SEQUENCE encrypted_table_id2_seq OWNED BY encrypted_table.id2; +SELECT pg_tde_is_encrypted('encrypted_table_id2_seq'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +ALTER SEQUENCE encrypted_table_id2_seq OWNED BY plain_table.id2; +SELECT pg_tde_is_encrypted('encrypted_table_id2_seq'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +-- Starts owned by an encrypted table and becomes independent +CREATE SEQUENCE encrypted_table_id2_seq2 OWNED BY encrypted_table.id2; +SELECT pg_tde_is_encrypted('encrypted_table_id2_seq2'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +ALTER SEQUENCE encrypted_table_id2_seq2 OWNED BY NONE; +SELECT pg_tde_is_encrypted('encrypted_table_id2_seq2'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +-- Starts owned by a plain table and becomes owned by an encrypted table +CREATE SEQUENCE plain_table_id2_seq OWNED BY plain_table.id2; +SELECT pg_tde_is_encrypted('plain_table_id2_seq'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +ALTER SEQUENCE plain_table_id2_seq OWNED BY encrypted_table.id2; +SELECT pg_tde_is_encrypted('plain_table_id2_seq'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +-- Starts owned by a plain table and becomes independent +CREATE SEQUENCE plain_table_id2_seq2 OWNED BY plain_table.id2; +SELECT pg_tde_is_encrypted('plain_table_id2_seq2'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +ALTER SEQUENCE plain_table_id2_seq2 OWNED BY NONE; +SELECT pg_tde_is_encrypted('plain_table_id2_seq2'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +-- Enforce that we do not mess up encryption status for toast table +CREATE TABLE cities ( + name varchar(8), + population real, + elevation int +) USING tde_heap; +CREATE TABLE state_capitals ( + state char(2) UNIQUE NOT NULL +) INHERITS (cities) USING heap; +CREATE TABLE capitals ( + country char(2) UNIQUE NOT NULL +) INHERITS (cities) USING tde_heap; +ALTER TABLE cities ALTER COLUMN name TYPE TEXT; +ERROR: Recursive ALTER TABLE on a mix of encrypted and unencrypted relations is not supported +-- Enforce the same for typed tables +CREATE TYPE people_type AS (age int, name varchar(8), dob date); +CREATE TABLE sales_staff OF people_type USING tde_heap; +CREATE TABLE other_staff OF people_type USING heap; +ALTER TYPE people_type ALTER ATTRIBUTE name TYPE text CASCADE; +ERROR: Recursive ALTER TABLE on a mix of encrypted and unencrypted relations is not supported +-- If all tpyed tables are encrypted everything should work as usual +ALTER TABLE other_staff SET ACCESS METHOD tde_heap; +ALTER TYPE people_type ALTER ATTRIBUTE name TYPE text CASCADE; +SELECT pg_tde_is_encrypted('pg_toast.pg_toast_' || 'sales_staff'::regclass::oid); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +SELECT pg_tde_is_encrypted('pg_toast.pg_toast_' || 'other_staff'::regclass::oid); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +DROP TYPE people_type CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to table sales_staff +drop cascades to table other_staff +DROP TABLE cities CASCADE; +NOTICE: drop cascades to 2 other objects +DETAIL: drop cascades to table state_capitals +drop cascades to table capitals +DROP TABLE plain_table; DROP EXTENSION pg_tde CASCADE; NOTICE: drop cascades to 7 other objects DETAIL: drop cascades to table t1 diff --git a/contrib/pg_tde/expected/relocate.out b/contrib/pg_tde/expected/relocate.out index fef8c84030243..256ad4e314980 100644 --- a/contrib/pg_tde/expected/relocate.out +++ b/contrib/pg_tde/expected/relocate.out @@ -1,17 +1,8 @@ --- Support pg_tde already being installed -SET client_min_messages = 'warning'; -DROP EXTENSION IF EXISTS pg_tde; CREATE SCHEMA other; CREATE EXTENSION pg_tde SCHEMA other; -SELECT other.pg_tde_add_key_provider_file('file-vault', '/tmp/pg_tde_test_keyring.per'); - pg_tde_add_key_provider_file ------------------------------- - 1 -(1 row) - -SELECT other.pg_tde_grant_key_viewer_to_role('public'); - pg_tde_grant_key_viewer_to_role ---------------------------------- +SELECT other.pg_tde_add_database_key_provider_file('file-vault', '/tmp/pg_tde_test_keyring.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- (1 row) diff --git a/contrib/pg_tde/expected/subtransaction.out b/contrib/pg_tde/expected/subtransaction.out deleted file mode 100644 index 7508be79bcb17..0000000000000 --- a/contrib/pg_tde/expected/subtransaction.out +++ /dev/null @@ -1,30 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); - pg_tde_add_key_provider_file ------------------------------- - 1 -(1 row) - -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); - pg_tde_set_principal_key --------------------------- - -(1 row) - -BEGIN; -- Nesting level 1 -SAVEPOINT sp; -CREATE TABLE foo(s TEXT); -- Nesting level 2 -RELEASE SAVEPOINT sp; -SAVEPOINT sp; -CREATE TABLE bar(s TEXT); -- Nesting level 2 -ROLLBACK TO sp; -- Rollback should not affect first subtransaction -COMMIT; -BEGIN; -- Nesting level 1 -SAVEPOINT sp; -DROP TABLE foo; -- Nesting level 2 -RELEASE SAVEPOINT sp; -SAVEPOINT sp; -CREATE TABLE bar(s TEXT); -- Nesting level 2 -ROLLBACK TO sp; -- Rollback should not affect first subtransaction -COMMIT; -DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/expected/tablespace.out b/contrib/pg_tde/expected/tablespace.out index 6384afeaa4c66..5d5e290207f99 100644 --- a/contrib/pg_tde/expected/tablespace.out +++ b/contrib/pg_tde/expected/tablespace.out @@ -1,13 +1,20 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); - pg_tde_add_key_provider_file ------------------------------- - 1 +\! rm -f '/tmp/pg_tde_test_keyring.per' +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('test-db-key','file-vault'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + (1 row) -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); - pg_tde_set_principal_key --------------------------- +SELECT pg_tde_set_key_using_database_key_provider('test-db-key','file-vault'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- (1 row) diff --git a/contrib/pg_tde/expected/toast_decrypt.out b/contrib/pg_tde/expected/toast_decrypt.out index fff4e7744add7..242c266cf4bd6 100644 --- a/contrib/pg_tde/expected/toast_decrypt.out +++ b/contrib/pg_tde/expected/toast_decrypt.out @@ -1,13 +1,20 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); - pg_tde_add_key_provider_file ------------------------------- - 1 +\! rm -f '/tmp/pg_tde_test_keyring.per' +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('test-db-key','file-vault'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + (1 row) -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); - pg_tde_set_principal_key --------------------------- +SELECT pg_tde_set_key_using_database_key_provider('test-db-key','file-vault'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- (1 row) diff --git a/contrib/pg_tde/expected/toast_decrypt_1.out b/contrib/pg_tde/expected/toast_decrypt_1.out deleted file mode 100644 index 6765617555537..0000000000000 --- a/contrib/pg_tde/expected/toast_decrypt_1.out +++ /dev/null @@ -1,24 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -NOTICE: extension "pg_tde" already exists, skipping -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); - pg_tde_add_key_provider_file ------------------------------- - 2 -(1 row) - -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); - pg_tde_set_principal_key --------------------------- - -(1 row) - -CREATE TABLE src (f1 TEXT STORAGE EXTERNAL) USING tde_heap; -INSERT INTO src VALUES(repeat('abcdeF',1000)); -SELECT * FROM src; - f1 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - abcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeFabcdeF -(1 row) - -DROP TABLE src; -DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/expected/vault_v2_test.out b/contrib/pg_tde/expected/vault_v2_test.out index 0629d847848bf..be25e0052e78c 100644 --- a/contrib/pg_tde/expected/vault_v2_test.out +++ b/contrib/pg_tde/expected/vault_v2_test.out @@ -1,30 +1,32 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -\getenv root_token ROOT_TOKEN -SELECT pg_tde_add_key_provider_vault_v2('vault-incorrect',:'root_token','http://127.0.0.1:8200','DUMMY-TOKEN',NULL); - pg_tde_add_key_provider_vault_v2 ----------------------------------- - 1 +CREATE EXTENSION pg_tde; +\getenv root_token_file VAULT_ROOT_TOKEN_FILE +\getenv cacert_file VAULT_CACERT_FILE +-- FAILS as mount path does not exist +SELECT pg_tde_add_database_key_provider_vault_v2('vault-incorrect', 'https://127.0.0.1:8200', 'DUMMY-MOUNT-PATH', :'root_token_file', :'cacert_file'); +ERROR: failed to get mount info for "https://127.0.0.1:8200" at mountpoint "DUMMY-MOUNT-PATH" (HTTP 400) +-- FAILS as it's not supported engine type +SELECT pg_tde_add_database_key_provider_vault_v2('vault-incorrect', 'https://127.0.0.1:8200', 'cubbyhole', :'root_token_file', :'cacert_file'); +ERROR: vault mount at "cubbyhole" has unsupported engine type "cubbyhole" +HINT: The only supported vault engine type is Key/Value version "2" +-- FAILS as it's not supported engine version +SELECT pg_tde_add_database_key_provider_vault_v2('vault-incorrect', 'https://127.0.0.1:8200', 'kv-v1', :'root_token_file', :'cacert_file'); +ERROR: vault mount at "kv-v1" has unsupported Key/Value engine version "1" +HINT: The only supported vault engine type is Key/Value version "2" +SELECT pg_tde_add_database_key_provider_vault_v2('vault-v2', 'https://127.0.0.1:8200', 'secret', :'root_token_file', :'cacert_file'); + pg_tde_add_database_key_provider_vault_v2 +------------------------------------------- + (1 row) --- FAILS -SELECT pg_tde_set_principal_key('vault-v2-principal-key','vault-incorrect'); -ERROR: Invalid HTTP response from keyring provider "vault-incorrect": 404 -CREATE TABLE test_enc( - id SERIAL, - k INTEGER DEFAULT '0' NOT NULL, - PRIMARY KEY (id) - ) USING tde_heap; -ERROR: principal key not configured -HINT: create one using pg_tde_set_principal_key before using encrypted tables -SELECT pg_tde_add_key_provider_vault_v2('vault-v2',:'root_token','http://127.0.0.1:8200','secret',NULL); - pg_tde_add_key_provider_vault_v2 ----------------------------------- - 2 +SELECT pg_tde_create_key_using_database_key_provider('vault-v2-key', 'vault-v2'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + (1 row) -SELECT pg_tde_set_principal_key('vault-v2-principal-key','vault-v2'); - pg_tde_set_principal_key --------------------------- +SELECT pg_tde_set_key_using_database_key_provider('vault-v2-key', 'vault-v2'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- (1 row) @@ -44,5 +46,23 @@ SELECT * from test_enc; 3 | 3 (3 rows) +SELECT pg_tde_verify_key(); + pg_tde_verify_key +------------------- + +(1 row) + DROP TABLE test_enc; +-- Creating provider fails if we can't connect to vault +SELECT pg_tde_add_database_key_provider_vault_v2('will-not-work', 'https://127.0.0.1:61', 'secret', :'root_token_file', :'cacert_file'); +ERROR: HTTP(S) request to keyring provider "will-not-work" failed +-- Changing provider fails if we can't connect to vault +SELECT pg_tde_change_database_key_provider_vault_v2('vault-v2', 'https://127.0.0.1:61', 'secret', :'root_token_file', :'cacert_file'); +ERROR: HTTP(S) request to keyring provider "vault-v2" failed +-- HTTPS without cert fails +SELECT pg_tde_change_database_key_provider_vault_v2('vault-v2', 'https://127.0.0.1:8200', 'secret', :'root_token_file', NULL); +ERROR: HTTP(S) request to keyring provider "vault-v2" failed +-- HTTP against HTTPS server fails +SELECT pg_tde_change_database_key_provider_vault_v2('vault-v2', 'http://127.0.0.1:8200', 'secret', :'root_token_file', NULL); +ERROR: failed to get mount info for "http://127.0.0.1:8200" at mountpoint "secret" (HTTP 400) DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/expected/version.out b/contrib/pg_tde/expected/version.out index fddbafca98f12..54e00d133bf6a 100644 --- a/contrib/pg_tde/expected/version.out +++ b/contrib/pg_tde/expected/version.out @@ -1,8 +1,8 @@ CREATE EXTENSION pg_tde; SELECT pg_tde_version(); - pg_tde_version ------------------ - pg_tde 1.0.0-rc + pg_tde_version +---------------- + pg_tde 2.0.0 (1 row) DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/meson.build b/contrib/pg_tde/meson.build index 70c8cbc52637c..0899f2ebb618f 100644 --- a/contrib/pg_tde/meson.build +++ b/contrib/pg_tde/meson.build @@ -1,46 +1,56 @@ - curldep = dependency('libcurl') pg_tde_sources = files( - 'src/pg_tde.c', - 'src/transam/pg_tde_xact_handler.c', - 'src/access/pg_tde_tdemap.c', - 'src/access/pg_tde_xlog.c', - 'src/access/pg_tde_xlog_encrypt.c', - - 'src/encryption/enc_tde.c', - 'src/encryption/enc_aes.c', - - 'src/keyring/keyring_curl.c', - 'src/keyring/keyring_file.c', - 'src/keyring/keyring_vault.c', - 'src/keyring/keyring_kmip.c', - 'src/keyring/keyring_kmip_impl.c', - 'src/keyring/keyring_api.c', - - 'src/smgr/pg_tde_smgr.c', - - 'src/catalog/tde_keyring.c', - 'src/catalog/tde_keyring_parse_opts.c', - 'src/catalog/tde_principal_key.c', - 'src/common/pg_tde_shmem.c', - 'src/common/pg_tde_utils.c', - 'src/pg_tde_defs.c', - 'src/pg_tde_event_capture.c', - 'src/pg_tde_guc.c', - 'src/pg_tde.c', + 'src/access/pg_tde_tdemap.c', + 'src/access/pg_tde_xlog.c', + 'src/access/pg_tde_xlog_keys.c', + 'src/access/pg_tde_xlog_smgr.c', + 'src/catalog/tde_keyring.c', + 'src/catalog/tde_keyring_parse_opts.c', + 'src/catalog/tde_principal_key.c', + 'src/common/pg_tde_utils.c', + 'src/encryption/enc_aes.c', + 'src/encryption/enc_tde.c', + 'src/keyring/keyring_api.c', + 'src/keyring/keyring_curl.c', + 'src/keyring/keyring_file.c', + 'src/keyring/keyring_kmip.c', + 'src/keyring/keyring_kmip_impl.c', + 'src/keyring/keyring_vault.c', + 'src/pg_tde.c', + 'src/pg_tde_event_capture.c', + 'src/pg_tde_guc.c', + 'src/smgr/pg_tde_smgr.c', +) + +tde_frontend_sources = files( + 'src/access/pg_tde_tdemap.c', + 'src/access/pg_tde_xlog_keys.c', + 'src/access/pg_tde_xlog_smgr.c', + 'src/catalog/tde_keyring.c', + 'src/catalog/tde_keyring_parse_opts.c', + 'src/catalog/tde_principal_key.c', + 'src/common/pg_tde_utils.c', + 'src/encryption/enc_aes.c', + 'src/encryption/enc_tde.c', + 'src/keyring/keyring_api.c', + 'src/keyring/keyring_curl.c', + 'src/keyring/keyring_file.c', + 'src/keyring/keyring_kmip.c', + 'src/keyring/keyring_kmip_impl.c', + 'src/keyring/keyring_vault.c', ) incdir = include_directories('src/include', '.', 'src/libkmip/libkmip/include/') kmip = static_library( 'kmip', - files( - 'src/libkmip/libkmip/src/kmip.c', - 'src/libkmip/libkmip/src/kmip_bio.c', - 'src/libkmip/libkmip/src/kmip_locate.c', - 'src/libkmip/libkmip/src/kmip_memset.c' - ), + files( + 'src/libkmip/libkmip/src/kmip.c', + 'src/libkmip/libkmip/src/kmip_bio.c', + 'src/libkmip/libkmip/src/kmip_locate.c', + 'src/libkmip/libkmip/src/kmip_memset.c' + ), c_args: [ '-w' ], # This is a 3rd party, disable warnings completely include_directories: incdir ) @@ -67,42 +77,61 @@ endif install_data( 'pg_tde.control', - 'pg_tde--1.0-rc.sql', + 'pg_tde--1.0.sql', + 'pg_tde--1.0--2.0.sql', kwargs: contrib_data_args, ) -# toast_descrypt needs to be the first test when running with pg_tde -# preinstalled and default_principal_key needs to run after key_provider. sql_tests = [ - 'toast_decrypt', - 'access_control', - 'alter_index', - 'cache_alloc', - 'change_access_method', - 'insert_update_delete', - 'key_provider', - 'keyprovider_dependency', - 'kmip_test', - 'pg_tde_is_encrypted', - 'relocate', - 'recreate_storage', - 'subtransaction', - 'tablespace', - 'vault_v2_test', - 'default_principal_key', + 'access_control', + 'alter_index', + 'cache_alloc', + 'change_access_method', + 'create_database', + 'default_principal_key', + 'delete_principal_key', + 'insert_update_delete', + 'key_provider', + 'kmip_test', + 'partition_table', + 'pg_tde_is_encrypted', + 'recreate_storage', + 'relocate', + 'tablespace', + 'toast_decrypt', + 'vault_v2_test', + 'version', ] tap_tests = [ - 't/001_basic.pl', - 't/002_rotate_key.pl', - 't/003_remote_config.pl', - 't/004_file_config.pl', - 't/005_multiple_extensions.pl', - 't/006_remote_vault_config.pl', - 't/007_tde_heap.pl', - 't/008_key_rotate_tablespace.pl', - 't/009_wal_encrypt.pl', - 't/010_change_key_provider.pl', + 't/basic.pl', + 't/change_key_provider.pl', + 't/crash_recovery.pl', + 't/key_rotate_tablespace.pl', + 't/key_validation.pl', + 't/multiple_extensions.pl', + 't/pg_basebackup.pl', + 't/pg_tde_change_key_provider.pl', + 't/pg_rewind_basic.pl', + 't/pg_rewind_databases.pl', + 't/pg_rewind_extrafiles.pl', + 't/pg_rewind_growing_files.pl', + 't/pg_rewind_keep_recycled_wals.pl', + 't/pg_rewind_min_recovery_point.pl', + 't/pg_rewind_options.pl', + 't/pg_rewind_pg_xlog_symlink.pl', + 't/pg_rewind_same_timeline.pl', + 't/pg_waldump_basic.pl', + 't/pg_waldump_fullpage.pl', + 't/replication.pl', + 't/rotate_key.pl', + 't/tde_heap.pl', + 't/unlogged_tables.pl', + 't/wal_archiving.pl', + 't/wal_encrypt.pl', + 't/wal_key_tli.pl', + 't/2pc_replication.pl', + 't/stream_rep.pl', ] tests += { @@ -115,31 +144,14 @@ tests += { 'runningcheck': false, }, 'tap': { - 'tests': tap_tests }, + 'tests': tap_tests + }, } -# TODO: do not duplicate -tde_decrypt_sources = files( - 'src/access/pg_tde_tdemap.c', - 'src/access/pg_tde_xlog_encrypt.c', - 'src/catalog/tde_keyring.c', - 'src/catalog/tde_keyring_parse_opts.c', - 'src/catalog/tde_principal_key.c', - 'src/common/pg_tde_utils.c', - 'src/encryption/enc_aes.c', - 'src/encryption/enc_tde.c', - 'src/keyring/keyring_api.c', - 'src/keyring/keyring_curl.c', - 'src/keyring/keyring_file.c', - 'src/keyring/keyring_vault.c', - 'src/keyring/keyring_kmip.c', - 'src/keyring/keyring_kmip_impl.c', - ) - pg_tde_inc = incdir pg_tde_frontend = static_library('pg_tde_frontend', - tde_decrypt_sources, + tde_frontend_sources, c_pch: pch_postgres_h, c_args: ['-DFRONTEND'], kwargs: mod_args, @@ -148,7 +160,7 @@ pg_tde_frontend = static_library('pg_tde_frontend', ) pg_tde_change_key_provider_sources = files( - 'src/pg_tde_change_key_provider.c', + 'src/bin/pg_tde_change_key_provider.c', ) pg_tde_change_key_provider = executable('pg_tde_change_key_provider', @@ -160,3 +172,31 @@ pg_tde_change_key_provider = executable('pg_tde_change_key_provider', link_with: [pg_tde_frontend] ) contrib_targets += pg_tde_change_key_provider + +pg_tde_archive_decrypt_sources = files( + 'src/bin/pg_tde_archive_decrypt.c', +) + xlogreader_sources + +pg_tde_archive_decrypt = executable('pg_tde_archive_decrypt', + pg_tde_archive_decrypt_sources, + dependencies: [frontend_code], + c_args: ['-DFRONTEND'], # needed for xlogreader et al + kwargs: default_bin_args, + include_directories: [postgres_inc, pg_tde_inc], + link_with: [pg_tde_frontend] +) +contrib_targets += pg_tde_archive_decrypt + +pg_tde_restore_encrypt_sources = files( + 'src/bin/pg_tde_restore_encrypt.c', +) + xlogreader_sources + +pg_tde_restore_encrypt = executable('pg_tde_restore_encrypt', + pg_tde_restore_encrypt_sources, + dependencies: [frontend_code], + c_args: ['-DFRONTEND'], # needed for xlogreader et al + kwargs: default_bin_args, + include_directories: [postgres_inc, pg_tde_inc], + link_with: [pg_tde_frontend] +) +contrib_targets += pg_tde_restore_encrypt diff --git a/contrib/pg_tde/pg_tde--1.0--2.0.sql b/contrib/pg_tde/pg_tde--1.0--2.0.sql new file mode 100644 index 0000000000000..04d243f79afc2 --- /dev/null +++ b/contrib/pg_tde/pg_tde--1.0--2.0.sql @@ -0,0 +1,4 @@ +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "ALTER EXTENSION pg_tde UPDATE TO '2.0'" to load this file. \quit + +-- This file is a dummy, because no SQL changed between 1.0 and 2.0 diff --git a/contrib/pg_tde/pg_tde--1.0-rc.sql b/contrib/pg_tde/pg_tde--1.0-rc.sql deleted file mode 100644 index 9cd513a0f2f2e..0000000000000 --- a/contrib/pg_tde/pg_tde--1.0-rc.sql +++ /dev/null @@ -1,760 +0,0 @@ -/* contrib/pg_tde/pg_tde--1.0-rc.sql */ - --- complain if script is sourced in psql, rather than via CREATE EXTENSION -\echo Use "CREATE EXTENSION pg_tde" to load this file. \quit - --- Key Provider Management -CREATE FUNCTION pg_tde_add_key_provider(provider_type TEXT, provider_name TEXT, options JSON) -RETURNS INT -LANGUAGE C -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION pg_tde_add_key_provider_file(provider_name TEXT, file_path TEXT) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_file_keyring_provider_options function. - SELECT pg_tde_add_key_provider('file', provider_name, - json_object('type' VALUE 'file', 'path' VALUE COALESCE(file_path, ''))); -END; - -CREATE FUNCTION pg_tde_add_key_provider_file(provider_name TEXT, file_path JSON) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_file_keyring_provider_options function. - SELECT pg_tde_add_key_provider('file', provider_name, - json_object('type' VALUE 'file', 'path' VALUE file_path)); -END; - -CREATE FUNCTION pg_tde_add_key_provider_vault_v2(provider_name TEXT, - vault_token TEXT, - vault_url TEXT, - vault_mount_path TEXT, - vault_ca_path TEXT) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_vaultV2_keyring_provider_options function. - SELECT pg_tde_add_key_provider('vault-v2', provider_name, - json_object('type' VALUE 'vault-v2', - 'url' VALUE COALESCE(vault_url, ''), - 'token' VALUE COALESCE(vault_token, ''), - 'mountPath' VALUE COALESCE(vault_mount_path, ''), - 'caPath' VALUE COALESCE(vault_ca_path, ''))); -END; - -CREATE FUNCTION pg_tde_add_key_provider_vault_v2(provider_name TEXT, - vault_token JSON, - vault_url JSON, - vault_mount_path JSON, - vault_ca_path JSON) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_vaultV2_keyring_provider_options function. - SELECT pg_tde_add_key_provider('vault-v2', provider_name, - json_object('type' VALUE 'vault-v2', - 'url' VALUE vault_url, - 'token' VALUE vault_token, - 'mountPath' VALUE vault_mount_path, - 'caPath' VALUE vault_ca_path)); -END; - -CREATE FUNCTION pg_tde_add_key_provider_kmip(provider_name TEXT, - kmip_host TEXT, - kmip_port INT, - kmip_ca_path TEXT, - kmip_cert_path TEXT) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_kmip_keyring_provider_options function. - SELECT pg_tde_add_key_provider('kmip', provider_name, - json_object('type' VALUE 'kmip', - 'host' VALUE COALESCE(kmip_host, ''), - 'port' VALUE kmip_port, - 'caPath' VALUE COALESCE(kmip_ca_path, ''), - 'certPath' VALUE COALESCE(kmip_cert_path, ''))); -END; - -CREATE FUNCTION pg_tde_add_key_provider_kmip(provider_name TEXT, - kmip_host JSON, - kmip_port JSON, - kmip_ca_path JSON, - kmip_cert_path JSON) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_kmip_keyring_provider_options function. - SELECT pg_tde_add_key_provider('kmip', provider_name, - json_object('type' VALUE 'kmip', - 'host' VALUE kmip_host, - 'port' VALUE kmip_port, - 'caPath' VALUE kmip_ca_path, - 'certPath' VALUE kmip_cert_path)); -END; - -CREATE FUNCTION pg_tde_set_default_principal_key(principal_key_name TEXT, provider_name TEXT DEFAULT NULL, ensure_new_key BOOLEAN DEFAULT FALSE) -RETURNS VOID -AS 'MODULE_PATHNAME' -LANGUAGE C; - -CREATE FUNCTION pg_tde_list_all_key_providers - (OUT id INT, - OUT provider_name TEXT, - OUT provider_type TEXT, - OUT options JSON) -RETURNS SETOF record -LANGUAGE C STRICT -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION pg_tde_list_all_global_key_providers - (OUT id INT, - OUT provider_name TEXT, - OUT provider_type TEXT, - OUT options JSON) -RETURNS SETOF record -LANGUAGE C STRICT -AS 'MODULE_PATHNAME'; - --- Global Tablespace Key Provider Management -CREATE FUNCTION pg_tde_add_global_key_provider(provider_type TEXT, provider_name TEXT, options JSON) -RETURNS INT -LANGUAGE C -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION pg_tde_add_global_key_provider_file(provider_name TEXT, file_path TEXT) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_file_keyring_provider_options function. - SELECT pg_tde_add_global_key_provider('file', provider_name, - json_object('type' VALUE 'file', 'path' VALUE COALESCE(file_path, ''))); -END; - -CREATE FUNCTION pg_tde_add_global_key_provider_file(provider_name TEXT, file_path JSON) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_file_keyring_provider_options function. - SELECT pg_tde_add_global_key_provider('file', provider_name, - json_object('type' VALUE 'file', 'path' VALUE file_path)); -END; - -CREATE FUNCTION pg_tde_add_global_key_provider_vault_v2(provider_name TEXT, - vault_token TEXT, - vault_url TEXT, - vault_mount_path TEXT, - vault_ca_path TEXT) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_vaultV2_keyring_provider_options function. - SELECT pg_tde_add_global_key_provider('vault-v2', provider_name, - json_object('type' VALUE 'vault-v2', - 'url' VALUE COALESCE(vault_url, ''), - 'token' VALUE COALESCE(vault_token, ''), - 'mountPath' VALUE COALESCE(vault_mount_path, ''), - 'caPath' VALUE COALESCE(vault_ca_path, ''))); -END; - -CREATE FUNCTION pg_tde_add_global_key_provider_vault_v2(provider_name TEXT, - vault_token JSON, - vault_url JSON, - vault_mount_path JSON, - vault_ca_path JSON) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_vaultV2_keyring_provider_options function. - SELECT pg_tde_add_global_key_provider('vault-v2', provider_name, - json_object('type' VALUE 'vault-v2', - 'url' VALUE vault_url, - 'token' VALUE vault_token, - 'mountPath' VALUE vault_mount_path, - 'caPath' VALUE vault_ca_path)); -END; - -CREATE FUNCTION pg_tde_add_global_key_provider_kmip(provider_name TEXT, - kmip_host TEXT, - kmip_port INT, - kmip_ca_path TEXT, - kmip_cert_path TEXT) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_kmip_keyring_provider_options function. - SELECT pg_tde_add_global_key_provider('kmip', provider_name, - json_object('type' VALUE 'kmip', - 'host' VALUE COALESCE(kmip_host, ''), - 'port' VALUE kmip_port, - 'caPath' VALUE COALESCE(kmip_ca_path, ''), - 'certPath' VALUE COALESCE(kmip_cert_path, ''))); -END; - -CREATE FUNCTION pg_tde_add_global_key_provider_kmip(provider_name TEXT, - kmip_host JSON, - kmip_port JSON, - kmip_ca_path JSON, - kmip_cert_path JSON) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_kmip_keyring_provider_options function. - SELECT pg_tde_add_global_key_provider('vault-v2', provider_name, - json_object('type' VALUE 'vault-v2', - 'host' VALUE kmip_host, - 'port' VALUE kmip_port, - 'caPath' VALUE kmip_ca_path, - 'certPath' VALUE kmip_cert_path)); -END; - --- Key Provider Management -CREATE FUNCTION pg_tde_change_key_provider(provider_type TEXT, provider_name TEXT, options JSON) -RETURNS INT -LANGUAGE C -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION pg_tde_change_key_provider_file(provider_name TEXT, file_path TEXT) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_file_keyring_provider_options function. - SELECT pg_tde_change_key_provider('file', provider_name, - json_object('type' VALUE 'file', 'path' VALUE COALESCE(file_path, ''))); -END; - -CREATE FUNCTION pg_tde_change_key_provider_file(provider_name TEXT, file_path JSON) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_file_keyring_provider_options function. - SELECT pg_tde_change_key_provider('file', provider_name, - json_object('type' VALUE 'file', 'path' VALUE file_path)); -END; - -CREATE FUNCTION pg_tde_change_key_provider_vault_v2(provider_name TEXT, - vault_token TEXT, - vault_url TEXT, - vault_mount_path TEXT, - vault_ca_path TEXT) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_vaultV2_keyring_provider_options function. - SELECT pg_tde_change_key_provider('vault-v2', provider_name, - json_object('type' VALUE 'vault-v2', - 'url' VALUE COALESCE(vault_url, ''), - 'token' VALUE COALESCE(vault_token, ''), - 'mountPath' VALUE COALESCE(vault_mount_path, ''), - 'caPath' VALUE COALESCE(vault_ca_path, ''))); -END; - -CREATE FUNCTION pg_tde_change_key_provider_vault_v2(provider_name TEXT, - vault_token JSON, - vault_url JSON, - vault_mount_path JSON, - vault_ca_path JSON) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_vaultV2_keyring_provider_options function. - SELECT pg_tde_change_key_provider('vault-v2', provider_name, - json_object('type' VALUE 'vault-v2', - 'url' VALUE vault_url, - 'token' VALUE vault_token, - 'mountPath' VALUE vault_mount_path, - 'caPath' VALUE vault_ca_path)); -END; - -CREATE FUNCTION pg_tde_change_key_provider_kmip(provider_name TEXT, - kmip_host TEXT, - kmip_port INT, - kmip_ca_path TEXT, - kmip_cert_path TEXT) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_kmip_keyring_provider_options function. - SELECT pg_tde_change_key_provider('kmip', provider_name, - json_object('type' VALUE 'kmip', - 'host' VALUE COALESCE(kmip_host, ''), - 'port' VALUE kmip_port, - 'caPath' VALUE COALESCE(kmip_ca_path, ''), - 'certPath' VALUE COALESCE(kmip_cert_path, ''))); -END; - -CREATE FUNCTION pg_tde_change_key_provider_kmip(provider_name TEXT, - kmip_host JSON, - kmip_port JSON, - kmip_ca_path JSON, - kmip_cert_path JSON) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_kmip_keyring_provider_options function. - SELECT pg_tde_change_key_provider('kmip', provider_name, - json_object('type' VALUE 'kmip', - 'host' VALUE kmip_host, - 'port' VALUE kmip_port, - 'caPath' VALUE kmip_ca_path, - 'certPath' VALUE kmip_cert_path)); -END; - --- Global Tablespace Key Provider Management -CREATE FUNCTION pg_tde_change_global_key_provider(provider_type TEXT, provider_name TEXT, options JSON) -RETURNS INT -LANGUAGE C -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION pg_tde_change_global_key_provider_file(provider_name TEXT, file_path TEXT) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_file_keyring_provider_options function. - SELECT pg_tde_change_global_key_provider('file', provider_name, - json_object('type' VALUE 'file', 'path' VALUE COALESCE(file_path, ''))); -END; - -CREATE FUNCTION pg_tde_change_global_key_provider_file(provider_name TEXT, file_path JSON) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_file_keyring_provider_options function. - SELECT pg_tde_change_global_key_provider('file', provider_name, - json_object('type' VALUE 'file', 'path' VALUE file_path)); -END; - -CREATE FUNCTION pg_tde_change_global_key_provider_vault_v2(provider_name TEXT, - vault_token TEXT, - vault_url TEXT, - vault_mount_path TEXT, - vault_ca_path TEXT) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_vaultV2_keyring_provider_options function. - SELECT pg_tde_change_global_key_provider('vault-v2', provider_name, - json_object('type' VALUE 'vault-v2', - 'url' VALUE COALESCE(vault_url, ''), - 'token' VALUE COALESCE(vault_token, ''), - 'mountPath' VALUE COALESCE(vault_mount_path, ''), - 'caPath' VALUE COALESCE(vault_ca_path, ''))); -END; - -CREATE FUNCTION pg_tde_change_global_key_provider_vault_v2(provider_name TEXT, - vault_token JSON, - vault_url JSON, - vault_mount_path JSON, - vault_ca_path JSON) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_vaultV2_keyring_provider_options function. - SELECT pg_tde_change_global_key_provider('vault-v2', provider_name, - json_object('type' VALUE 'vault-v2', - 'url' VALUE vault_url, - 'token' VALUE vault_token, - 'mountPath' VALUE vault_mount_path, - 'caPath' VALUE vault_ca_path)); -END; - -CREATE FUNCTION pg_tde_change_global_key_provider_kmip(provider_name TEXT, - kmip_host TEXT, - kmip_port INT, - kmip_ca_path TEXT, - kmip_cert_path TEXT) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_kmip_keyring_provider_options function. - SELECT pg_tde_change_global_key_provider('kmip', provider_name, - json_object('type' VALUE 'kmip', - 'host' VALUE COALESCE(kmip_host, ''), - 'port' VALUE kmip_port, - 'caPath' VALUE COALESCE(kmip_ca_path, ''), - 'certPath' VALUE COALESCE(kmip_cert_path, ''))); -END; - -CREATE FUNCTION pg_tde_change_global_key_provider_kmip(provider_name TEXT, - kmip_host JSON, - kmip_port JSON, - kmip_ca_path JSON, - kmip_cert_path JSON) -RETURNS INT -LANGUAGE SQL -BEGIN ATOMIC - -- JSON keys in the options must be matched to the keys in - -- load_kmip_keyring_provider_options function. - SELECT pg_tde_change_global_key_provider('vault-v2', provider_name, - json_object('type' VALUE 'vault-v2', - 'host' VALUE kmip_host, - 'port' VALUE kmip_port, - 'caPath' VALUE kmip_ca_path, - 'certPath' VALUE kmip_cert_path)); -END; - - -CREATE FUNCTION pg_tde_internal_refresh_sequences(table_oid OID) -RETURNS VOID -AS -$BODY$ -DECLARE - rec RECORD; -BEGIN - FOR rec IN - SELECT s.relname AS sequence_name, - ns.nspname AS sequence_namespace, - se.seqstart AS sequence_start - FROM pg_class AS t - JOIN pg_attribute AS a - ON a.attrelid = t.oid - JOIN pg_depend AS d - ON d.refobjid = t.oid - AND d.refobjsubid = a.attnum - JOIN pg_class AS s - ON s.oid = d.objid - JOIN pg_sequence AS se - ON se.seqrelid = d.objid - JOIN pg_namespace AS ns - ON ns.oid = s.relnamespace - WHERE d.classid = 'pg_catalog.pg_class'::regclass - AND d.refclassid = 'pg_catalog.pg_class'::regclass - AND d.deptype IN ('i', 'a') - AND t.relkind IN ('r', 'P') - AND s.relkind = 'S' - AND t.oid = table_oid - LOOP - EXECUTE format('ALTER SEQUENCE %s.%s START %s', rec.sequence_namespace, rec.sequence_name, rec.sequence_start); - END LOOP; -END -$BODY$ -LANGUAGE plpgsql; - -CREATE FUNCTION pg_tde_is_encrypted(relation regclass) -RETURNS boolean -STRICT -LANGUAGE C -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION pg_tde_set_principal_key(principal_key_name TEXT, provider_name TEXT DEFAULT NULL, ensure_new_key BOOLEAN DEFAULT FALSE) -RETURNS VOID -LANGUAGE C -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION pg_tde_set_global_principal_key(principal_key_name TEXT, provider_name TEXT DEFAULT NULL, ensure_new_key BOOLEAN DEFAULT FALSE) -RETURNS VOID -LANGUAGE C -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION pg_tde_set_server_principal_key(principal_key_name TEXT, provider_name TEXT DEFAULT NULL, ensure_new_key BOOLEAN DEFAULT FALSE) -RETURNS VOID -LANGUAGE C -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION pg_tde_extension_initialize() -RETURNS VOID -LANGUAGE C -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION pg_tde_verify_principal_key() -RETURNS VOID -LANGUAGE C -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION pg_tde_verify_global_principal_key() -RETURNS VOID -LANGUAGE C -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION pg_tde_principal_key_info() -RETURNS TABLE ( principal_key_name text, - key_provider_name text, - key_provider_id integer, - key_createion_time timestamp with time zone) -LANGUAGE C -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION pg_tde_global_principal_key_info() -RETURNS TABLE ( principal_key_name text, - key_provider_name text, - key_provider_id integer, - key_createion_time timestamp with time zone) -LANGUAGE C -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION pg_tde_delete_global_key_provider(provider_name TEXT) -RETURNS VOID -LANGUAGE C -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION pg_tde_delete_key_provider(provider_name TEXT) -RETURNS VOID -LANGUAGE C -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION pg_tde_version() RETURNS TEXT LANGUAGE C AS 'MODULE_PATHNAME'; - --- Table access method -CREATE FUNCTION pg_tdeam_handler(internal) -RETURNS table_am_handler -LANGUAGE C -AS 'MODULE_PATHNAME'; - -CREATE ACCESS METHOD tde_heap TYPE TABLE HANDLER pg_tdeam_handler; -COMMENT ON ACCESS METHOD tde_heap IS 'tde_heap table access method'; - -CREATE FUNCTION pg_tde_ddl_command_start_capture() -RETURNS event_trigger -LANGUAGE C -AS 'MODULE_PATHNAME'; - -CREATE FUNCTION pg_tde_ddl_command_end_capture() -RETURNS event_trigger -LANGUAGE C -AS 'MODULE_PATHNAME'; - -CREATE EVENT TRIGGER pg_tde_trigger_create_index -ON ddl_command_start -EXECUTE FUNCTION pg_tde_ddl_command_start_capture(); -ALTER EVENT TRIGGER pg_tde_trigger_create_index ENABLE ALWAYS; - -CREATE EVENT TRIGGER pg_tde_trigger_create_index_2 -ON ddl_command_end -EXECUTE FUNCTION pg_tde_ddl_command_end_capture(); -ALTER EVENT TRIGGER pg_tde_trigger_create_index_2 ENABLE ALWAYS; - --- Per database extension initialization -SELECT pg_tde_extension_initialize(); - -CREATE FUNCTION pg_tde_grant_global_key_management_to_role( - target_role TEXT) -RETURNS VOID -LANGUAGE plpgsql -SET search_path = @extschema@ -AS $$ -BEGIN - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_add_global_key_provider(text, text, JSON) TO %I', target_role); - - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_add_global_key_provider_file(text, json) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_add_global_key_provider_file(text, text) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_add_global_key_provider_vault_v2(text, text, text, text, text) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_add_global_key_provider_vault_v2(text, JSON, JSON, JSON, JSON) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_add_global_key_provider_kmip(text, text, int, text, text) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_add_global_key_provider_kmip(text, JSON, JSON, JSON, JSON) TO %I', target_role); - - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_change_global_key_provider(text, text, JSON) TO %I', target_role); - - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_change_global_key_provider_file(text, json) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_change_global_key_provider_file(text, text) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_change_global_key_provider_vault_v2(text, text, text, text, text) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_change_global_key_provider_vault_v2(text, JSON, JSON, JSON, JSON) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_change_global_key_provider_kmip(text, text, int, text, text) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_change_global_key_provider_kmip(text, JSON, JSON, JSON, JSON) TO %I', target_role); - - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_delete_global_key_provider(text) TO %I', target_role); - - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_set_global_principal_key(text, text, BOOLEAN) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_set_server_principal_key(text, text, BOOLEAN) TO %I', target_role); - - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_set_default_principal_key(text, text, BOOLEAN) TO %I', target_role); -END; -$$; - -CREATE FUNCTION pg_tde_grant_local_key_management_to_role( - target_role TEXT) -RETURNS VOID -LANGUAGE plpgsql -SET search_path = @extschema@ -AS $$ -BEGIN - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_add_key_provider(text, text, JSON) TO %I', target_role); - - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_add_key_provider_file(text, json) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_add_key_provider_file(text, text) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_add_key_provider_vault_v2(text, text, text, text, text) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_add_key_provider_vault_v2(text, JSON, JSON, JSON, JSON) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_add_key_provider_kmip(text, text, int, text, text) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_add_key_provider_kmip(text, JSON, JSON, JSON, JSON) TO %I', target_role); - - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_change_key_provider(text, text, JSON) TO %I', target_role); - - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_change_key_provider_file(text, json) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_change_key_provider_file(text, text) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_change_key_provider_vault_v2(text, text, text,text,text) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_change_key_provider_vault_v2(text, JSON, JSON,JSON,JSON) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_change_key_provider_kmip(text, text, int, text, text) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_change_key_provider_kmip(text, JSON, JSON, JSON, JSON) TO %I', target_role); - - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_delete_key_provider(text) TO %I', target_role); - - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_set_principal_key(text, text, BOOLEAN) TO %I', target_role); -END; -$$; - -CREATE FUNCTION pg_tde_grant_key_viewer_to_role( - target_role TEXT) -RETURNS VOID -LANGUAGE plpgsql -SET search_path = @extschema@ -AS $$ -BEGIN - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_list_all_key_providers() TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_list_all_global_key_providers() TO %I', target_role); - - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_principal_key_info() TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_global_principal_key_info() TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_verify_principal_key() TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_verify_global_principal_key() TO %I', target_role); -END; -$$; - -CREATE FUNCTION pg_tde_revoke_global_key_management_from_role( - target_role TEXT) -RETURNS VOID -LANGUAGE plpgsql -SET search_path = @extschema@ -AS $$ -BEGIN - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_add_global_key_provider(text, text, JSON) FROM %I', target_role); - - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_add_global_key_provider_file(text, json) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_add_global_key_provider_file(text, text) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_add_global_key_provider_vault_v2(text, text, text, text, text) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_add_global_key_provider_vault_v2(text, JSON, JSON, JSON, JSON) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_add_global_key_provider_kmip(text, text, int, text, text) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_add_global_key_provider_kmip(text, JSON, JSON, JSON, JSON) FROM %I', target_role); - - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_change_global_key_provider(text, text, JSON) FROM %I', target_role); - - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_change_global_key_provider_file(text, json) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_change_global_key_provider_file(text, text) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_change_global_key_provider_vault_v2(text, text, text, text, text) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_change_global_key_provider_vault_v2(text, JSON, JSON, JSON, JSON) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_change_global_key_provider_kmip(text, text, int, text, text) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_change_global_key_provider_kmip(text, JSON, JSON, JSON, JSON) FROM %I', target_role); - - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_delete_global_key_provider(text) FROM %I', target_role); - - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_set_global_principal_key(text, text, BOOLEAN) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_set_server_principal_key(text, text, BOOLEAN) FROM %I', target_role); - - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_set_default_principal_key(text, text, BOOLEAN) FROM %I', target_role); -END; -$$; - -CREATE FUNCTION pg_tde_revoke_local_key_management_from_role( - target_role TEXT) -RETURNS VOID -LANGUAGE plpgsql -SET search_path = @extschema@ -AS $$ -BEGIN - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_add_key_provider(text, text, JSON) FROM %I', target_role); - - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_add_key_provider_file(text, json) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_add_key_provider_file(text, text) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_add_key_provider_vault_v2(text, text, text, text, text) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_add_key_provider_vault_v2(text, JSON, JSON, JSON, JSON) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_add_key_provider_kmip(text, text, int, text, text) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_add_key_provider_kmip(text, JSON, JSON, JSON, JSON) FROM %I', target_role); - - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_change_key_provider(text, text, JSON) FROM %I', target_role); - - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_change_key_provider_file(text, json) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_change_key_provider_file(text, text) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_change_key_provider_vault_v2(text, text, text, text, text) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_change_key_provider_vault_v2(text, JSON, JSON, JSON, JSON) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_change_key_provider_kmip(text, text, int, text, text) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_change_key_provider_kmip(text, JSON, JSON, JSON, JSON) FROM %I', target_role); - - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_delete_key_provider(text) FROM %I', target_role); - - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_set_principal_key(text, text, BOOLEAN) FROM %I', target_role); -END; -$$; - -CREATE FUNCTION pg_tde_revoke_key_viewer_from_role( - target_role TEXT) -RETURNS VOID -LANGUAGE plpgsql -SET search_path = @extschema@ -AS $$ -BEGIN - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_list_all_key_providers() FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_list_all_global_key_providers() FROM %I', target_role); - - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_principal_key_info() FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_global_principal_key_info() FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_verify_principal_key() FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_verify_global_principal_key() FROM %I', target_role); -END; -$$; - -CREATE FUNCTION pg_tde_grant_grant_management_to_role( - target_role TEXT) -RETURNS VOID -LANGUAGE plpgsql -SET search_path = @extschema@ -AS $$ -BEGIN - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_grant_global_key_management_to_role(TEXT) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_grant_local_key_management_to_role(TEXT) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_grant_grant_management_to_role(TEXT) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_grant_key_viewer_to_role(TEXT) TO %I', target_role); - - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_revoke_global_key_management_from_role(TEXT) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_revoke_local_key_management_from_role(TEXT) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_revoke_grant_management_from_role(TEXT) TO %I', target_role); - EXECUTE format('GRANT EXECUTE ON FUNCTION pg_tde_revoke_key_viewer_from_role(TEXT) TO %I', target_role); -END; -$$; - -CREATE FUNCTION pg_tde_revoke_grant_management_from_role( - target_role TEXT) -RETURNS VOID -LANGUAGE plpgsql -SET search_path = @extschema@ -AS $$ -BEGIN - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_grant_global_key_management_to_role(TEXT) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_grant_local_key_management_to_role(TEXT) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_grant_grant_management_to_role(TEXT) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_grant_key_viewer_to_role(TEXT) FROM %I', target_role); - - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_revoke_global_key_management_from_role(TEXT) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_revoke_local_key_management_from_role(TEXT) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_revoke_grant_management_from_role(TEXT) FROM %I', target_role); - EXECUTE format('REVOKE EXECUTE ON FUNCTION pg_tde_revoke_key_viewer_from_role(TEXT) FROM %I', target_role); -END; -$$; - --- Revoking all the privileges from the public role -SELECT pg_tde_revoke_local_key_management_from_role('public'); -SELECT pg_tde_revoke_global_key_management_from_role('public'); -SELECT pg_tde_revoke_grant_management_from_role('public'); -SELECT pg_tde_revoke_key_viewer_from_role('public'); diff --git a/contrib/pg_tde/pg_tde--1.0.sql b/contrib/pg_tde/pg_tde--1.0.sql new file mode 100644 index 0000000000000..5d23b685bb67a --- /dev/null +++ b/contrib/pg_tde/pg_tde--1.0.sql @@ -0,0 +1,363 @@ +-- complain if script is sourced in psql, rather than via CREATE EXTENSION +\echo Use "CREATE EXTENSION pg_tde" to load this file. \quit + +-- Key Provider Management +CREATE FUNCTION pg_tde_add_database_key_provider(type TEXT, name TEXT, options JSON) +RETURNS VOID +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_add_database_key_provider(TEXT, TEXT, JSON) FROM PUBLIC; + +CREATE FUNCTION pg_tde_add_database_key_provider_file(provider_name TEXT, file_path TEXT) +RETURNS VOID +LANGUAGE SQL +BEGIN ATOMIC + SELECT pg_tde_add_database_key_provider('file', provider_name, + json_object('path' VALUE file_path)); +END; + +CREATE FUNCTION pg_tde_add_database_key_provider_vault_v2(provider_name TEXT, + vault_url TEXT, + vault_mount_path TEXT, + vault_token_path TEXT, + vault_ca_path TEXT) +RETURNS VOID +LANGUAGE SQL +BEGIN ATOMIC + SELECT pg_tde_add_database_key_provider('vault-v2', provider_name, + json_object('url' VALUE vault_url, + 'mountPath' VALUE vault_mount_path, + 'tokenPath' VALUE vault_token_path, + 'caPath' VALUE vault_ca_path)); +END; + +CREATE FUNCTION pg_tde_add_database_key_provider_kmip(provider_name TEXT, + kmip_host TEXT, + kmip_port INT, + kmip_cert_path TEXT, + kmip_key_path TEXT, + kmip_ca_path TEXT) +RETURNS VOID +LANGUAGE SQL +BEGIN ATOMIC + SELECT pg_tde_add_database_key_provider('kmip', provider_name, + json_object('host' VALUE kmip_host, + 'port' VALUE kmip_port, + 'certPath' VALUE kmip_cert_path, + 'keyPath' VALUE kmip_key_path, + 'caPath' VALUE kmip_ca_path)); +END; + +CREATE FUNCTION pg_tde_list_all_database_key_providers + (OUT id INT, + OUT name TEXT, + OUT type TEXT, + OUT options JSON) +RETURNS SETOF RECORD +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_list_all_database_key_providers() FROM PUBLIC; + +CREATE FUNCTION pg_tde_list_all_global_key_providers + (OUT id INT, + OUT name TEXT, + OUT type TEXT, + OUT options JSON) +RETURNS SETOF RECORD +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_list_all_global_key_providers() FROM PUBLIC; + +-- Global Tablespace Key Provider Management +CREATE FUNCTION pg_tde_add_global_key_provider(type TEXT, name TEXT, options JSON) +RETURNS VOID +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_add_global_key_provider(TEXT, TEXT, JSON) FROM PUBLIC; + +CREATE FUNCTION pg_tde_add_global_key_provider_file(provider_name TEXT, file_path TEXT) +RETURNS VOID +LANGUAGE SQL +BEGIN ATOMIC + SELECT pg_tde_add_global_key_provider('file', provider_name, + json_object('path' VALUE file_path)); +END; + +CREATE FUNCTION pg_tde_add_global_key_provider_vault_v2(provider_name TEXT, + vault_url TEXT, + vault_mount_path TEXT, + vault_token_path TEXT, + vault_ca_path TEXT) +RETURNS VOID +LANGUAGE SQL +BEGIN ATOMIC + SELECT pg_tde_add_global_key_provider('vault-v2', provider_name, + json_object('url' VALUE vault_url, + 'mountPath' VALUE vault_mount_path, + 'tokenPath' VALUE vault_token_path, + 'caPath' VALUE vault_ca_path)); +END; + +CREATE FUNCTION pg_tde_add_global_key_provider_kmip(provider_name TEXT, + kmip_host TEXT, + kmip_port INT, + kmip_cert_path TEXT, + kmip_key_path TEXT, + kmip_ca_path TEXT) +RETURNS VOID +LANGUAGE SQL +BEGIN ATOMIC + SELECT pg_tde_add_global_key_provider('kmip', provider_name, + json_object('host' VALUE kmip_host, + 'port' VALUE kmip_port, + 'certPath' VALUE kmip_cert_path, + 'keyPath' VALUE kmip_key_path, + 'caPath' VALUE kmip_ca_path)); +END; + +-- Key Provider Management +CREATE FUNCTION pg_tde_change_database_key_provider(type TEXT, name TEXT, options JSON) +RETURNS VOID +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_change_database_key_provider(TEXT, TEXT, JSON) FROM PUBLIC; + +CREATE FUNCTION pg_tde_change_database_key_provider_file(provider_name TEXT, file_path TEXT) +RETURNS VOID +LANGUAGE SQL +BEGIN ATOMIC + SELECT pg_tde_change_database_key_provider('file', provider_name, + json_object('path' VALUE file_path)); +END; + +CREATE FUNCTION pg_tde_change_database_key_provider_vault_v2(provider_name TEXT, + vault_url TEXT, + vault_mount_path TEXT, + vault_token_path TEXT, + vault_ca_path TEXT) +RETURNS VOID +LANGUAGE SQL +BEGIN ATOMIC + SELECT pg_tde_change_database_key_provider('vault-v2', provider_name, + json_object('url' VALUE vault_url, + 'mountPath' VALUE vault_mount_path, + 'tokenPath' VALUE vault_token_path, + 'caPath' VALUE vault_ca_path)); +END; + +CREATE FUNCTION pg_tde_change_database_key_provider_kmip(provider_name TEXT, + kmip_host TEXT, + kmip_port INT, + kmip_cert_path TEXT, + kmip_key_path TEXT, + kmip_ca_path TEXT) +RETURNS VOID +LANGUAGE SQL +BEGIN ATOMIC + SELECT pg_tde_change_database_key_provider('kmip', provider_name, + json_object('host' VALUE kmip_host, + 'port' VALUE kmip_port, + 'caPath' VALUE kmip_ca_path, + 'certPath' VALUE kmip_cert_path, + 'keyPath' VALUE kmip_key_path)); +END; + +-- Global Tablespace Key Provider Management +CREATE FUNCTION pg_tde_change_global_key_provider(type TEXT, name TEXT, options JSON) +RETURNS VOID +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_change_global_key_provider(TEXT, TEXT, JSON) FROM PUBLIC; + +CREATE FUNCTION pg_tde_change_global_key_provider_file(provider_name TEXT, file_path TEXT) +RETURNS VOID +LANGUAGE SQL +BEGIN ATOMIC + SELECT pg_tde_change_global_key_provider('file', provider_name, + json_object('path' VALUE file_path)); +END; + +CREATE FUNCTION pg_tde_change_global_key_provider_vault_v2(provider_name TEXT, + vault_url TEXT, + vault_mount_path TEXT, + vault_token_path TEXT, + vault_ca_path TEXT) +RETURNS VOID +LANGUAGE SQL +BEGIN ATOMIC + SELECT pg_tde_change_global_key_provider('vault-v2', provider_name, + json_object('url' VALUE vault_url, + 'mountPath' VALUE vault_mount_path, + 'tokenPath' VALUE vault_token_path, + 'caPath' VALUE vault_ca_path)); +END; + +CREATE FUNCTION pg_tde_change_global_key_provider_kmip(provider_name TEXT, + kmip_host TEXT, + kmip_port INT, + kmip_cert_path TEXT, + kmip_key_path TEXT, + kmip_ca_path TEXT) +RETURNS VOID +LANGUAGE SQL +BEGIN ATOMIC + SELECT pg_tde_change_global_key_provider('kmip', provider_name, + json_object('host' VALUE kmip_host, + 'port' VALUE kmip_port, + 'certPath' VALUE kmip_cert_path, + 'keyPath' VALUE kmip_key_path, + 'caPath' VALUE kmip_ca_path)); +END; + +CREATE FUNCTION pg_tde_is_encrypted(relation REGCLASS) +RETURNS BOOLEAN +STRICT +LANGUAGE C +AS 'MODULE_PATHNAME'; + +CREATE FUNCTION pg_tde_create_key_using_database_key_provider(key_name TEXT, provider_name TEXT) +RETURNS VOID +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_create_key_using_database_key_provider(TEXT, TEXT) FROM PUBLIC; + +CREATE FUNCTION pg_tde_create_key_using_global_key_provider(key_name TEXT, provider_name TEXT) +RETURNS VOID +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_create_key_using_global_key_provider(TEXT, TEXT) FROM PUBLIC; + +CREATE FUNCTION pg_tde_set_key_using_database_key_provider(key_name TEXT, provider_name TEXT) +RETURNS VOID +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_set_key_using_database_key_provider(TEXT, TEXT) FROM PUBLIC; + +CREATE FUNCTION pg_tde_set_key_using_global_key_provider(key_name TEXT, provider_name TEXT) +RETURNS VOID +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_set_key_using_global_key_provider(TEXT, TEXT) FROM PUBLIC; + +CREATE FUNCTION pg_tde_set_server_key_using_global_key_provider(key_name TEXT, provider_name TEXT) +RETURNS VOID +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_set_server_key_using_global_key_provider(TEXT, TEXT) FROM PUBLIC; + +CREATE FUNCTION pg_tde_set_default_key_using_global_key_provider(key_name TEXT, provider_name TEXT) +RETURNS VOID +AS 'MODULE_PATHNAME' +LANGUAGE C; +REVOKE ALL ON FUNCTION pg_tde_set_default_key_using_global_key_provider(TEXT, TEXT) FROM PUBLIC; + +CREATE FUNCTION pg_tde_verify_key() +RETURNS VOID +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_verify_key() FROM PUBLIC; + +CREATE FUNCTION pg_tde_verify_server_key() +RETURNS VOID +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_verify_server_key() FROM PUBLIC; + +CREATE FUNCTION pg_tde_verify_default_key() +RETURNS VOID +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_verify_default_key() FROM PUBLIC; + +CREATE FUNCTION pg_tde_delete_key() +RETURNS VOID +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_delete_key() FROM PUBLIC; + +CREATE FUNCTION pg_tde_delete_default_key() +RETURNS VOID +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_delete_default_key() FROM PUBLIC; + +CREATE FUNCTION pg_tde_key_info() +RETURNS TABLE ( key_name TEXT, + provider_name TEXT, + provider_id INT, + key_creation_time TIMESTAMP WITH TIME ZONE) +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_key_info() FROM PUBLIC; + +CREATE FUNCTION pg_tde_server_key_info() +RETURNS TABLE ( key_name TEXT, + provider_name TEXT, + provider_id INT, + key_creation_time TIMESTAMP WITH TIME ZONE) +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_server_key_info() FROM PUBLIC; + +CREATE FUNCTION pg_tde_default_key_info() +RETURNS TABLE ( key_name TEXT, + provider_name TEXT, + provider_id INT, + key_creation_time TIMESTAMP WITH TIME ZONE) +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_default_key_info() FROM PUBLIC; + +CREATE FUNCTION pg_tde_delete_global_key_provider(provider_name TEXT) +RETURNS VOID +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_delete_global_key_provider(TEXT) FROM PUBLIC; + +CREATE FUNCTION pg_tde_delete_database_key_provider(provider_name TEXT) +RETURNS VOID +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_delete_database_key_provider(TEXT) FROM PUBLIC; + +CREATE FUNCTION pg_tde_version() RETURNS TEXT LANGUAGE C AS 'MODULE_PATHNAME'; + +-- Table access method +CREATE FUNCTION pg_tdeam_handler(internal) +RETURNS TABLE_AM_HANDLER +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tdeam_handler(internal) FROM PUBLIC; + +CREATE ACCESS METHOD tde_heap TYPE TABLE HANDLER pg_tdeam_handler; +COMMENT ON ACCESS METHOD tde_heap IS 'tde_heap table access method'; + +CREATE FUNCTION pg_tde_ddl_command_start_capture() +RETURNS EVENT_TRIGGER +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_ddl_command_start_capture() FROM PUBLIC; + +CREATE FUNCTION pg_tde_ddl_command_end_capture() +RETURNS EVENT_TRIGGER +LANGUAGE C +AS 'MODULE_PATHNAME'; +REVOKE ALL ON FUNCTION pg_tde_ddl_command_end_capture() FROM PUBLIC; + +CREATE EVENT TRIGGER pg_tde_ddl_start +ON ddl_command_start +EXECUTE FUNCTION pg_tde_ddl_command_start_capture(); +ALTER EVENT TRIGGER pg_tde_ddl_start ENABLE ALWAYS; + +CREATE EVENT TRIGGER pg_tde_ddl_end +ON ddl_command_end +EXECUTE FUNCTION pg_tde_ddl_command_end_capture(); +ALTER EVENT TRIGGER pg_tde_ddl_end ENABLE ALWAYS; + +-- Per database extension initialization +CREATE FUNCTION pg_tde_extension_initialize() +RETURNS VOID +LANGUAGE C +AS 'MODULE_PATHNAME'; +SELECT pg_tde_extension_initialize(); +DROP FUNCTION pg_tde_extension_initialize(); diff --git a/contrib/pg_tde/pg_tde.control b/contrib/pg_tde/pg_tde.control index b72231dd1aa1e..5496ed190ecc4 100644 --- a/contrib/pg_tde/pg_tde.control +++ b/contrib/pg_tde/pg_tde.control @@ -1,5 +1,4 @@ -# pg_tde extension comment = 'pg_tde access method' -default_version = '1.0-rc' +default_version = '2.0' module_pathname = '$libdir/pg_tde' relocatable = false diff --git a/contrib/pg_tde/sql/access_control.sql b/contrib/pg_tde/sql/access_control.sql index fc6d76ac1f026..69bc1eb35a6fe 100644 --- a/contrib/pg_tde/sql/access_control.sql +++ b/contrib/pg_tde/sql/access_control.sql @@ -1,36 +1,54 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; +\! rm -f '/tmp/pg_tde_test_keyring.per' -CREATE USER regress_pg_tde_access_control; - -SET ROLE regress_pg_tde_access_control; - --- should throw access denied -SELECT pg_tde_add_key_provider_file('file-vault', '/tmp/pg_tde_test_keyring.per'); -SELECT pg_tde_set_principal_key('test-db-principal-key', 'file-vault'); +CREATE EXTENSION pg_tde; -RESET ROLE; +SELECT pg_tde_add_database_key_provider_file('local-file-provider', '/tmp/pg_tde_test_keyring.per'); -SELECT pg_tde_grant_local_key_management_to_role('regress_pg_tde_access_control'); -SELECT pg_tde_grant_key_viewer_to_role('regress_pg_tde_access_control'); +CREATE USER regress_pg_tde_access_control; SET ROLE regress_pg_tde_access_control; --- should now be allowed -SELECT pg_tde_add_key_provider_file('file-vault', '/tmp/pg_tde_test_keyring.per'); -SELECT pg_tde_add_key_provider_file('file-2', '/tmp/pg_tde_test_keyring_2.per'); -SELECT pg_tde_set_principal_key('test-db-principal-key', 'file-vault'); -SELECT * FROM pg_tde_list_all_key_providers(); -SELECT principal_key_name, key_provider_name, key_provider_id FROM pg_tde_principal_key_info(); +-- should throw access denied +SELECT pg_tde_create_key_using_database_key_provider('test-db-key', 'local-file-provider'); +SELECT pg_tde_set_key_using_database_key_provider('test-db-key', 'local-file-provider'); +SELECT pg_tde_delete_key(); +SELECT pg_tde_list_all_database_key_providers(); +SELECT pg_tde_list_all_global_key_providers(); +SELECT pg_tde_key_info(); +SELECT pg_tde_server_key_info(); +SELECT pg_tde_default_key_info(); +SELECT pg_tde_verify_key(); +SELECT pg_tde_verify_server_key(); +SELECT pg_tde_verify_default_key(); RESET ROLE; -SELECT pg_tde_revoke_key_viewer_from_role('regress_pg_tde_access_control'); +-- Only superusers can execute key management functions, regardless of role grants +GRANT EXECUTE ON FUNCTION pg_tde_add_database_key_provider(TEXT, TEXT, JSON) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_add_global_key_provider(TEXT, TEXT, JSON) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_change_database_key_provider(TEXT, TEXT, JSON) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_change_global_key_provider(TEXT, TEXT, JSON) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_create_key_using_global_key_provider(TEXT, TEXT) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_delete_database_key_provider(TEXT) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_delete_global_key_provider(TEXT) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_set_default_key_using_global_key_provider(TEXT, TEXT) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_set_key_using_global_key_provider(TEXT, TEXT) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_set_server_key_using_global_key_provider(TEXT, TEXT) TO regress_pg_tde_access_control; +GRANT EXECUTE ON FUNCTION pg_tde_delete_default_key() TO regress_pg_tde_access_control; SET ROLE regress_pg_tde_access_control; --- verify the view access is revoked -SELECT * FROM pg_tde_list_all_key_providers(); -SELECT principal_key_name, key_provider_name, key_provider_id FROM pg_tde_principal_key_info(); +SELECT pg_tde_add_database_key_provider_file('local-file-provider', '/tmp/pg_tde_test_keyring.per'); +SELECT pg_tde_change_global_key_provider_file('local-file-provider', '/tmp/pg_tde_test_keyring.per'); +SELECT pg_tde_delete_database_key_provider('local-file-provider'); +SELECT pg_tde_add_global_key_provider_file('global-file-provider', '/tmp/pg_tde_test_keyring.per'); +SELECT pg_tde_change_global_key_provider_file('global-file-provider', '/tmp/pg_tde_test_keyring.per'); +SELECT pg_tde_delete_global_key_provider('global-file-provider'); +SELECT pg_tde_create_key_using_global_key_provider('key1', 'global-file-provider'); +SELECT pg_tde_set_key_using_global_key_provider('key1', 'global-file-provider'); +SELECT pg_tde_set_default_key_using_global_key_provider('key1', 'global-file-provider'); +SELECT pg_tde_set_server_key_using_global_key_provider('key1', 'global-file-provider'); +SELECT pg_tde_delete_default_key(); RESET ROLE; diff --git a/contrib/pg_tde/sql/alter_index.sql b/contrib/pg_tde/sql/alter_index.sql index 7f578d3fb3a50..e00f1a407341b 100644 --- a/contrib/pg_tde/sql/alter_index.sql +++ b/contrib/pg_tde/sql/alter_index.sql @@ -1,7 +1,10 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; +\! rm -f '/tmp/pg_tde_test_keyring.per' -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); +CREATE EXTENSION pg_tde; + +SELECT pg_tde_add_database_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); +SELECT pg_tde_create_key_using_database_key_provider('test-db-key','file-vault'); +SELECT pg_tde_set_key_using_database_key_provider('test-db-key','file-vault'); SET default_table_access_method = "tde_heap"; @@ -33,5 +36,7 @@ SELECT relid, parentrelid, level FROM pg_partition_tree('concur_reindex_part_ind SELECT relid, parentrelid, level FROM pg_partition_tree('concur_reindex_part_index') ORDER BY relid, level; DROP TABLE concur_reindex_part; +SELECT pg_tde_delete_key(); +SELECT pg_tde_delete_database_key_provider('file-vault'); DROP EXTENSION pg_tde; RESET default_table_access_method; diff --git a/contrib/pg_tde/sql/cache_alloc.sql b/contrib/pg_tde/sql/cache_alloc.sql index 9e89ba2efb180..4f6c9f05fa330 100644 --- a/contrib/pg_tde/sql/cache_alloc.sql +++ b/contrib/pg_tde/sql/cache_alloc.sql @@ -1,9 +1,12 @@ +\! rm -f '/tmp/pg_tde_test_keyring.per' + -- Just checking there are no mem debug WARNINGs during the cache population -CREATE EXTENSION IF NOT EXISTS pg_tde; +CREATE EXTENSION pg_tde; -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); +SELECT pg_tde_add_database_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); +SELECT pg_tde_create_key_using_database_key_provider('test-db-key','file-vault'); +SELECT pg_tde_set_key_using_database_key_provider('test-db-key','file-vault'); do $$ DECLARE idx integer; diff --git a/contrib/pg_tde/sql/change_access_method.sql b/contrib/pg_tde/sql/change_access_method.sql index 34a0955679730..e2a1faeef2394 100644 --- a/contrib/pg_tde/sql/change_access_method.sql +++ b/contrib/pg_tde/sql/change_access_method.sql @@ -1,35 +1,31 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; +\! rm -f '/tmp/pg_tde_test_keyring.per' -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); +CREATE EXTENSION pg_tde; + +SELECT pg_tde_add_database_key_provider_file('file-vault', '/tmp/pg_tde_test_keyring.per'); +SELECT pg_tde_create_key_using_database_key_provider('test-db-key', 'file-vault'); +SELECT pg_tde_set_key_using_database_key_provider('test-db-key', 'file-vault'); CREATE TABLE country_table ( - country_id serial primary key, - country_name varchar(32) unique not null, - continent varchar(32) not null -) using tde_heap; - + country_id serial primary key, + country_name varchar(32) unique not null, + continent varchar(32) not null +) USING tde_heap; + INSERT INTO country_table (country_name, continent) VALUES ('Japan', 'Asia'), ('UK', 'Europe'), ('USA', 'North America'); SELECT * FROM country_table; - SELECT pg_tde_is_encrypted('country_table'); - SELECT pg_tde_is_encrypted('country_table_country_id_seq'); - SELECT pg_tde_is_encrypted('country_table_pkey'); -- Try changing the encrypted table to an unencrypted table -ALTER TABLE country_table SET access method heap; - -SELECT pg_tde_is_encrypted('country_table_country_id_seq'); - -SELECT pg_tde_is_encrypted('country_table_pkey'); +ALTER TABLE country_table SET ACCESS METHOD heap; --- Insert some more data +-- Insert some more data INSERT INTO country_table (country_name, continent) VALUES ('France', 'Europe'), ('Germany', 'Europe'), @@ -37,57 +33,68 @@ INSERT INTO country_table (country_name, continent) SELECT * FROM country_table; SELECT pg_tde_is_encrypted('country_table'); - SELECT pg_tde_is_encrypted('country_table_country_id_seq'); - SELECT pg_tde_is_encrypted('country_table_pkey'); -- Change it back to encrypted -ALTER TABLE country_table SET access method tde_heap; +ALTER TABLE country_table SET ACCESS METHOD tde_heap; INSERT INTO country_table (country_name, continent) VALUES ('China', 'Asia'), ('Brazil', 'South America'), ('Australia', 'Oceania'); + SELECT * FROM country_table; SELECT pg_tde_is_encrypted('country_table'); - SELECT pg_tde_is_encrypted('country_table_country_id_seq'); - SELECT pg_tde_is_encrypted('country_table_pkey'); +-- Test that we honor the default value +SET default_table_access_method = 'heap'; + +ALTER TABLE country_table SET ACCESS METHOD DEFAULT; + +SELECT pg_tde_is_encrypted('country_table'); + +SET default_table_access_method = 'tde_heap'; + +ALTER TABLE country_table SET ACCESS METHOD DEFAULT; + +SELECT pg_tde_is_encrypted('country_table'); + +RESET default_table_access_method; + ALTER TABLE country_table ADD y text; -SELECT pg_tde_is_encrypted(('pg_toast.pg_toast_' || 'country_table'::regclass::oid)::regclass); +SELECT pg_tde_is_encrypted('pg_toast.pg_toast_' || 'country_table'::regclass::oid); CREATE TABLE country_table2 ( - country_id serial primary key, - country_name text unique not null, - continent text not null + country_id serial primary key, + country_name text unique not null, + continent text not null ); -SET pg_tde.enforce_encryption = ON; +SET pg_tde.enforce_encryption = on; CREATE TABLE country_table3 ( - country_id serial primary key, - country_name text unique not null, - continent text not null + country_id serial primary key, + country_name text unique not null, + continent text not null ) USING heap; - -ALTER TABLE country_table SET access method heap; -ALTER TABLE country_table2 SET access method tde_heap; +ALTER TABLE country_table SET ACCESS METHOD heap; +ALTER TABLE country_table2 SET ACCESS METHOD tde_heap; CREATE TABLE country_table3 ( - country_id serial primary key, - country_name text unique not null, - continent text not null -) using tde_heap; + country_id serial primary key, + country_name text unique not null, + continent text not null +) USING tde_heap; DROP TABLE country_table; DROP TABLE country_table2; DROP TABLE country_table3; -SET pg_tde.enforce_encryption = OFF; +SET pg_tde.enforce_encryption = off; DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/sql/create_database.sql b/contrib/pg_tde/sql/create_database.sql new file mode 100644 index 0000000000000..a1a3aa6f1649d --- /dev/null +++ b/contrib/pg_tde/sql/create_database.sql @@ -0,0 +1,68 @@ +\! rm -f '/tmp/template_provider_global.per' +\! rm -f '/tmp/template_provider.per' + +CREATE EXTENSION pg_tde; + +CREATE DATABASE template_db; + +SELECT current_database() AS regress_database +\gset + +\c template_db + +CREATE EXTENSION pg_tde; + +SELECT pg_tde_add_database_key_provider_file('file-vault', '/tmp/template_provider.per'); +SELECT pg_tde_create_key_using_database_key_provider('test-db-key', 'file-vault'); +SELECT pg_tde_set_key_using_database_key_provider('test-db-key', 'file-vault'); + +CREATE TABLE test_enc (id serial PRIMARY KEY, x int) USING tde_heap; +CREATE TABLE test_plain (id serial PRIMARY KEY, x int) USING heap; + +INSERT INTO test_enc (x) VALUES (10), (20); +INSERT INTO test_plain (x) VALUES (30), (40); + +\c :regress_database + +-- TODO: Test the case where we have no default key once we can delete default keys +--CREATE DATABASE new_db TEMPLATE template_db; + +SELECT pg_tde_add_global_key_provider_file('global-file-vault','/tmp/template_provider_global.per'); +SELECT pg_tde_create_key_using_global_key_provider('default-key', 'global-file-vault'); +SELECT pg_tde_set_default_key_using_global_key_provider('default-key', 'global-file-vault'); + +CREATE DATABASE new_db TEMPLATE template_db; + +\c new_db + +INSERT INTO test_enc (x) VALUES (25); +SELECT * FROM test_enc; +SELECT pg_tde_is_encrypted('test_enc'); +SELECT pg_tde_is_encrypted('test_enc_pkey'); +SELECT pg_tde_is_encrypted('test_enc_id_seq'); + +INSERT INTO test_plain (x) VALUES (45); +SELECT * FROM test_plain; +SELECT pg_tde_is_encrypted('test_plain'); +SELECT pg_tde_is_encrypted('test_plain_pkey'); +SELECT pg_tde_is_encrypted('test_plain_id_seq'); + +\c :regress_database + +CREATE DATABASE new_db_file_copy TEMPLATE template_db STRATEGY FILE_COPY; + +\c template_db + +DROP TABLE test_enc; + +\c :regress_database + +CREATE DATABASE new_db_file_copy TEMPLATE template_db STRATEGY FILE_COPY; + +DROP DATABASE new_db_file_copy; +DROP DATABASE new_db; +DROP DATABASE template_db; + +SELECT pg_tde_delete_default_key(); +SELECT pg_tde_delete_global_key_provider('global-file-vault'); +DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/sql/default_principal_key.sql b/contrib/pg_tde/sql/default_principal_key.sql index 1f60541e05231..8d2c60c63b85e 100644 --- a/contrib/pg_tde/sql/default_principal_key.sql +++ b/contrib/pg_tde/sql/default_principal_key.sql @@ -1,17 +1,32 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; +\! rm -f '/tmp/pg_tde_regression_default_key.per' -SELECT pg_tde_add_global_key_provider_file('file-provider','/tmp/pg_tde_regression_default_principal_key.per'); +CREATE EXTENSION pg_tde; +CREATE EXTENSION pg_buffercache; + +SELECT pg_tde_add_global_key_provider_file('file-provider','/tmp/pg_tde_regression_default_key.per'); + +-- Should fail: no default principal key for the server yet +SELECT pg_tde_verify_default_key(); + +-- Should fail: no default principal key for the server yet +SELECT provider_id, provider_name, key_name + FROM pg_tde_default_key_info(); -SELECT pg_tde_set_default_principal_key('default-principal-key', 'file-provider', false); +SELECT pg_tde_create_key_using_global_key_provider('default-key', 'file-provider'); +SELECT pg_tde_set_default_key_using_global_key_provider('default-key', 'file-provider'); +SELECT pg_tde_verify_default_key(); + +SELECT provider_id, provider_name, key_name + FROM pg_tde_default_key_info(); -- fails SELECT pg_tde_delete_global_key_provider('file-provider'); -SELECT id, provider_name FROM pg_tde_list_all_global_key_providers(); +SELECT id, name FROM pg_tde_list_all_global_key_providers(); -- Should fail: no principal key for the database yet -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); - +SELECT provider_id, provider_name, key_name + FROM pg_tde_key_info(); + -- Should succeed: "localizes" the default principal key for the database CREATE TABLE test_enc( id SERIAL, @@ -22,8 +37,8 @@ CREATE TABLE test_enc( INSERT INTO test_enc (k) VALUES (1), (2), (3); -- Should succeed: create table localized the principal key -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); +SELECT provider_id, provider_name, key_name + FROM pg_tde_key_info(); SELECT current_database() AS regress_database \gset @@ -33,10 +48,11 @@ CREATE DATABASE regress_pg_tde_other; \c regress_pg_tde_other CREATE EXTENSION pg_tde; +CREATE EXTENSION pg_buffercache; -- Should fail: no principal key for the database yet -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); +SELECT provider_id, provider_name, key_name + FROM pg_tde_key_info(); -- Should succeed: "localizes" the default principal key for the database CREATE TABLE test_enc( @@ -48,20 +64,27 @@ CREATE TABLE test_enc( INSERT INTO test_enc (k) VALUES (1), (2), (3); -- Should succeed: create table localized the principal key -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); +SELECT provider_id, provider_name, key_name + FROM pg_tde_key_info(); \c :regress_database -SELECT pg_tde_set_default_principal_key('new-default-principal-key', 'file-provider', false); +CHECKPOINT; + +SELECT pg_tde_create_key_using_global_key_provider('new-default-key', 'file-provider'); +SELECT pg_tde_set_default_key_using_global_key_provider('new-default-key', 'file-provider'); -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); +SELECT provider_id, provider_name, key_name + FROM pg_tde_key_info(); \c regress_pg_tde_other -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); +SELECT provider_id, provider_name, key_name + FROM pg_tde_key_info(); + +SELECT pg_buffercache_evict(bufferid) FROM pg_buffercache WHERE relfilenode = (SELECT relfilenode FROM pg_class WHERE oid = 'test_enc'::regclass); + +SELECT * FROM test_enc; DROP TABLE test_enc; @@ -69,8 +92,14 @@ DROP EXTENSION pg_tde CASCADE; \c :regress_database -DROP TABLE test_enc; +SELECT pg_buffercache_evict(bufferid) FROM pg_buffercache WHERE relfilenode = (SELECT relfilenode FROM pg_class WHERE oid = 'test_enc'::regclass); +SELECT * FROM test_enc; + +DROP TABLE test_enc; +SELECT pg_tde_delete_default_key(); +SELECT pg_tde_delete_global_key_provider('file-provider'); DROP EXTENSION pg_tde CASCADE; +DROP EXTENSION pg_buffercache; DROP DATABASE regress_pg_tde_other; diff --git a/contrib/pg_tde/sql/delete_key_provider.sql b/contrib/pg_tde/sql/delete_key_provider.sql deleted file mode 100644 index 431c97d6cc8fa..0000000000000 --- a/contrib/pg_tde/sql/delete_key_provider.sql +++ /dev/null @@ -1,20 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; - -SELECT * FROM pg_tde_principal_key_info(); - -SELECT pg_tde_add_key_provider_file('file-provider','/tmp/pg_tde_test_keyring.per'); -SELECT * FROM pg_tde_list_all_key_providers(); -SELECT pg_tde_delete_key_provider('file-provider'); -SELECT * FROM pg_tde_list_all_key_providers(); - -SELECT pg_tde_add_key_provider_file('file-provider','/tmp/pg_tde_test_keyring.per'); -SELECT * FROM pg_tde_list_all_key_providers(); -SELECT pg_tde_delete_key_provider('file-provider'); -SELECT * FROM pg_tde_list_all_key_providers(); - -SELECT pg_tde_add_key_provider_file('file-provider','/tmp/pg_tde_test_keyring.per'); -SELECT * FROM pg_tde_list_all_key_providers(); -SELECT pg_tde_delete_key_provider('file-provider'); -SELECT * FROM pg_tde_list_all_key_providers(); - -DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/sql/delete_principal_key.sql b/contrib/pg_tde/sql/delete_principal_key.sql new file mode 100644 index 0000000000000..142eedde0a56d --- /dev/null +++ b/contrib/pg_tde/sql/delete_principal_key.sql @@ -0,0 +1,68 @@ +\! rm -f '/tmp/pg_tde_test_keyring.per' + +CREATE EXTENSION pg_tde; + +SELECT pg_tde_add_global_key_provider_file('file-provider','/tmp/pg_tde_test_keyring.per'); +SELECT pg_tde_create_key_using_global_key_provider('defalut-key','file-provider'); +SELECT pg_tde_create_key_using_global_key_provider('test-db-key','file-provider'); + +-- Set the local key and delete it without any encrypted tables +-- Should succeed: nothing used the key +SELECT pg_tde_set_key_using_global_key_provider('test-db-key','file-provider'); +SELECT provider_id, provider_name, key_name FROM pg_tde_key_info(); +SELECT pg_tde_delete_key(); + +-- Set local key, encrypt a table, and delete the key +-- Should fail: the is no default key to fallback +SELECT pg_tde_set_key_using_global_key_provider('test-db-key','file-provider'); +CREATE TABLE test_table (id int, data text) USING tde_heap; +SELECT pg_tde_delete_key(); + +-- Decrypt the table and delete the key +-- Should succeed: there is no more encrypted tables +ALTER TABLE test_table SET ACCESS METHOD heap; +SELECT pg_tde_delete_key(); + +-- Set local key, encrypt the table then delete teable and key +-- Should succeed: the table is deleted and there are no more encrypted tables +SELECT pg_tde_set_key_using_global_key_provider('test-db-key','file-provider'); +ALTER TABLE test_table SET ACCESS METHOD tde_heap; +DROP TABLE test_table; +SELECT pg_tde_delete_key(); + +-- Set default key, set regular key, create table, delete regular key +-- Should succeed: regular key will be rotated to default key +SELECT pg_tde_set_default_key_using_global_key_provider('defalut-key','file-provider'); +SELECT pg_tde_set_key_using_global_key_provider('test-db-key','file-provider'); +CREATE TABLE test_table (id int, data text) USING tde_heap; +SELECT pg_tde_delete_key(); +SELECT provider_id, provider_name, key_name FROM pg_tde_key_info(); + +-- Try to delete key when default key is used +-- Should fail: table already uses the default key, so there is no key to fallback to +SELECT pg_tde_delete_key(); + +-- Try to delete default key +-- Should fail: default key is used by the table +SELECT pg_tde_delete_default_key(); + +-- Set regular principal key, delete default key +-- Should succeed: the table will use the regular key +SELECT pg_tde_set_key_using_global_key_provider('test-db-key','file-provider'); +SELECT pg_tde_delete_default_key(); + +DROP TABLE test_table; +SELECT pg_tde_delete_key(); + +-- Delete default key even if it's configured for a database or server key, as +-- long as it's unused. Regardless how the key was set, we unset it if it's the +-- same key as is used as a default key. This is probably a bug. +SELECT pg_tde_set_default_key_using_global_key_provider('test-db-key','file-provider'); +SELECT pg_tde_set_key_using_global_key_provider('test-db-key','file-provider'); +SELECT pg_tde_set_server_key_using_global_key_provider('test-db-key','file-provider'); +SELECT pg_tde_delete_default_key(); +SELECT pg_tde_key_info(); -- No key configured +SELECT pg_tde_server_key_info(); -- No key configured + +SELECT pg_tde_delete_global_key_provider('file-provider'); +DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/sql/insert_update_delete.sql b/contrib/pg_tde/sql/insert_update_delete.sql index 3231a220a7e36..be2b3ff61f451 100644 --- a/contrib/pg_tde/sql/insert_update_delete.sql +++ b/contrib/pg_tde/sql/insert_update_delete.sql @@ -1,7 +1,10 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; +\! rm -f '/tmp/pg_tde_test_keyring.per' -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); +CREATE EXTENSION pg_tde; + +SELECT pg_tde_add_database_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); +SELECT pg_tde_create_key_using_database_key_provider('test-db-key','file-vault'); +SELECT pg_tde_set_key_using_database_key_provider('test-db-key','file-vault'); CREATE TABLE albums ( id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, @@ -38,4 +41,16 @@ UPDATE albums SET released='2020-04-01' WHERE id=2; SELECT * FROM albums; DROP TABLE albums; + +CREATE TEMPORARY TABLE animals ( + id INTEGER GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + type TEXT UNIQUE, + num INT +) USING tde_heap; + +INSERT INTO animals (type, num) VALUES ('cows', 3), ('pigs', 11); +SELECT * FROM animals ORDER BY id; + +DROP TABLE animals; + DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/sql/key_provider.sql b/contrib/pg_tde/sql/key_provider.sql index 9732440bdb070..072176cccc836 100644 --- a/contrib/pg_tde/sql/key_provider.sql +++ b/contrib/pg_tde/sql/key_provider.sql @@ -1,58 +1,174 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; +\! rm -f '/tmp/db-provider-file' +\! rm -f '/tmp/global-provider-file-1' +\! rm -f '/tmp/pg_tde_test_keyring.per' +\! rm -f '/tmp/pg_tde_test_keyring2.per' -SELECT * FROM pg_tde_principal_key_info(); +CREATE EXTENSION pg_tde; -SELECT pg_tde_add_key_provider_file('incorrect-file-provider', json_object('foo' VALUE '/tmp/pg_tde_test_keyring.per')); -SELECT * FROM pg_tde_list_all_key_providers(); +SELECT * FROM pg_tde_key_info(); -SELECT pg_tde_add_key_provider_file('file-provider','/tmp/pg_tde_test_keyring.per'); -SELECT * FROM pg_tde_list_all_key_providers(); +SELECT pg_tde_add_database_key_provider('file', 'incorrect-file-provider', '{"path": {"foo": "/tmp/pg_tde_test_keyring.per"}}'); +SELECT pg_tde_add_database_key_provider_file('file-provider','/tmp/pg_tde_test_keyring.per'); +SELECT pg_tde_add_database_key_provider_file('file-provider2','/tmp/pg_tde_test_keyring2.per'); +SELECT pg_tde_add_database_key_provider_file('file-provider','/tmp/pg_tde_test_keyring_dup.per'); +SELECT * FROM pg_tde_list_all_database_key_providers(); -SELECT pg_tde_add_key_provider_file('file-provider2','/tmp/pg_tde_test_keyring2.per'); -SELECT * FROM pg_tde_list_all_key_providers(); +SELECT pg_tde_create_key_using_database_key_provider('test-db-key','file-provider'); -SELECT pg_tde_verify_principal_key(); +SELECT pg_tde_verify_key(); +SELECT pg_tde_set_key_using_database_key_provider('test-db-key','file-provider'); +SELECT pg_tde_verify_key(); -SELECT pg_tde_set_principal_key('test-db-principal-key','file-provider'); -SELECT pg_tde_verify_principal_key(); +SELECT pg_tde_change_database_key_provider_file('not-existent-provider','/tmp/pg_tde_test_keyring.per'); +SELECT * FROM pg_tde_list_all_database_key_providers(); -SELECT pg_tde_change_key_provider_file('not-existent-provider','/tmp/pg_tde_test_keyring.per'); -SELECT * FROM pg_tde_list_all_key_providers(); - -SELECT pg_tde_change_key_provider_file('file-provider','/tmp/pg_tde_test_keyring_other.per'); -SELECT * FROM pg_tde_list_all_key_providers(); -SELECT pg_tde_verify_principal_key(); - -SELECT pg_tde_change_key_provider_file('file-provider', json_object('foo' VALUE '/tmp/pg_tde_test_keyring.per')); -SELECT * FROM pg_tde_list_all_key_providers(); +SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": {"foo": "/tmp/pg_tde_test_keyring.per"}}'); +SELECT * FROM pg_tde_list_all_database_key_providers(); SELECT pg_tde_add_global_key_provider_file('file-keyring','/tmp/pg_tde_test_keyring.per'); SELECT pg_tde_add_global_key_provider_file('file-keyring2','/tmp/pg_tde_test_keyring2.per'); -SELECT id, provider_name FROM pg_tde_list_all_global_key_providers(); - --- TODO: verify that we can also can change the type of it +SELECT id, name FROM pg_tde_list_all_global_key_providers(); -- fails -SELECT pg_tde_delete_key_provider('file-provider'); -SELECT id, provider_name FROM pg_tde_list_all_key_providers(); +SELECT pg_tde_delete_database_key_provider('file-provider'); +SELECT id, name FROM pg_tde_list_all_database_key_providers(); -- works -SELECT pg_tde_delete_key_provider('file-provider2'); -SELECT id, provider_name FROM pg_tde_list_all_key_providers(); +SELECT pg_tde_delete_database_key_provider('file-provider2'); +SELECT id, name FROM pg_tde_list_all_database_key_providers(); -SELECT id, provider_name FROM pg_tde_list_all_global_key_providers(); +SELECT id, name FROM pg_tde_list_all_global_key_providers(); -SELECT pg_tde_set_global_principal_key('test-db-principal-key', 'file-keyring', false); +SELECT pg_tde_set_key_using_global_key_provider('test-db-key', 'file-keyring'); -- fails SELECT pg_tde_delete_global_key_provider('file-keyring'); -SELECT id, provider_name FROM pg_tde_list_all_global_key_providers(); +SELECT id, name FROM pg_tde_list_all_global_key_providers(); -- works SELECT pg_tde_delete_global_key_provider('file-keyring2'); -SELECT id, provider_name FROM pg_tde_list_all_global_key_providers(); +SELECT id, name FROM pg_tde_list_all_global_key_providers(); + +-- Creating a file key provider fails if we can't open or create the file +SELECT pg_tde_add_database_key_provider_file('will-not-work','/cant-create-file-in-root.per'); + +-- Creating key providers fails if any required parameter is NULL +SELECT pg_tde_add_database_key_provider(NULL, 'name', '{}'); +SELECT pg_tde_add_database_key_provider('file', NULL, '{}'); +SELECT pg_tde_add_database_key_provider('file', 'name', NULL); +SELECT pg_tde_add_global_key_provider(NULL, 'name', '{}'); +SELECT pg_tde_add_global_key_provider('file', NULL, '{}'); +SELECT pg_tde_add_global_key_provider('file', 'name', NULL); + +-- Empty string is not allowed for a key provider name +SELECT pg_tde_add_database_key_provider('file', '', '{}'); +SELECT pg_tde_add_global_key_provider('file', '', '{}'); + +-- Creating key providers fails if the name is too long +SELECT pg_tde_add_database_key_provider('file', repeat('K', 128), '{}'); +SELECT pg_tde_add_global_key_provider('file', repeat('K', 128), '{}'); + +-- Creating key providers fails if options is too long +SELECT pg_tde_add_database_key_provider('file', 'name', json_build_object('key', repeat('K', 1024))); +SELECT pg_tde_add_global_key_provider('file', 'name', json_build_object('key', repeat('K', 1024))); + +-- Creating key providers fails if configuration is not a JSON object +SELECT pg_tde_add_database_key_provider('file', 'provider', '"bare string"'); +SELECT pg_tde_add_database_key_provider('file', 'provider', '["array"]'); +SELECT pg_tde_add_database_key_provider('file', 'provider', 'true'); +SELECT pg_tde_add_database_key_provider('file', 'provider', 'null'); + +-- Creating key providers fails if vaules are not scalar +SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": {}}'); +SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": ["array"]}'); +SELECT pg_tde_add_database_key_provider('file', 'provider', '{"path": true}'); + +-- Modifying key providers fails if any required parameter is NULL +SELECT pg_tde_change_database_key_provider(NULL, 'file-keyring', '{}'); +SELECT pg_tde_change_database_key_provider('file', NULL, '{}'); +SELECT pg_tde_change_database_key_provider('file', 'file-keyring', NULL); +SELECT pg_tde_change_global_key_provider(NULL, 'file-keyring', '{}'); +SELECT pg_tde_change_global_key_provider('file', NULL, '{}'); +SELECT pg_tde_change_global_key_provider('file', 'file-keyring', NULL); + +-- Modifying key providers fails if options is too long +SELECT pg_tde_change_database_key_provider('file', 'file-provider', json_build_object('key', repeat('V', 1024))); +SELECT pg_tde_change_global_key_provider('file', 'file-keyring', json_build_object('key', repeat('V', 1024))); + +-- Modifying key providers fails if configuration is not a JSON object +SELECT pg_tde_change_database_key_provider('file', 'file-provider', '"bare string"'); +SELECT pg_tde_change_database_key_provider('file', 'file-provider', '["array"]'); +SELECT pg_tde_change_database_key_provider('file', 'file-provider', 'true'); +SELECT pg_tde_change_database_key_provider('file', 'file-provider', 'null'); + +-- Modifying key providers fails if vaules are not scalar +SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": {}}'); +SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": ["array"]}'); +SELECT pg_tde_change_database_key_provider('file', 'file-provider', '{"path": true}'); + +-- Modifying key providers fails if new settings can't fetch existing server key +SELECT pg_tde_add_global_key_provider_file('global-provider', '/tmp/global-provider-file-1'); +SELECT pg_tde_create_key_using_global_key_provider('server-key', 'global-provider'); +SELECT pg_tde_set_server_key_using_global_key_provider('server-key', 'global-provider'); +SELECT pg_tde_change_global_key_provider_file('global-provider','/tmp/global-provider-file-2'); + +-- Modifying key providers fails if new settings can't fetch existing database key +SELECT pg_tde_add_global_key_provider_file('global-provider2', '/tmp/global-provider-file-1'); +SELECT current_database() AS regress_database +\gset +CREATE DATABASE db_using_global_provider; +\c db_using_global_provider; +CREATE EXTENSION pg_tde; +SELECT pg_tde_create_key_using_global_key_provider('database-key', 'global-provider2'); +SELECT pg_tde_set_key_using_global_key_provider('database-key', 'global-provider2'); +\c :regress_database +SELECT pg_tde_change_global_key_provider_file('global-provider2', '/tmp/global-provider-file-2'); +DROP DATABASE db_using_global_provider; +CREATE DATABASE db_using_database_provider; +\c db_using_database_provider; +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('db-provider', '/tmp/db-provider-file'); +SELECT pg_tde_create_key_using_database_key_provider('database-key', 'db-provider'); +SELECT pg_tde_set_key_using_database_key_provider('database-key', 'db-provider'); +SELECT pg_tde_change_database_key_provider_file('db-provider', '/tmp/db-provider-file-2'); +\c :regress_database +DROP DATABASE db_using_database_provider; + +-- Deleting key providers fails if key name is NULL +SELECT pg_tde_delete_database_key_provider(NULL); +SELECT pg_tde_delete_global_key_provider(NULL); + +-- Setting principal key fails if provider name is NULL +SELECT pg_tde_set_default_key_using_global_key_provider('key', NULL); +SELECT pg_tde_set_key_using_database_key_provider('key', NULL); +SELECT pg_tde_set_key_using_global_key_provider('key', NULL); +SELECT pg_tde_set_server_key_using_global_key_provider('key', NULL); + +-- Setting principal key fails if key name is NULL +SELECT pg_tde_set_default_key_using_global_key_provider(NULL, 'file-keyring'); +SELECT pg_tde_set_key_using_database_key_provider(NULL, 'file-keyring'); +SELECT pg_tde_set_key_using_global_key_provider(NULL, 'file-keyring'); +SELECT pg_tde_set_server_key_using_global_key_provider(NULL, 'file-keyring'); + +-- Empty string is not allowed for a principal key name +SELECT pg_tde_create_key_using_database_key_provider('', 'file-provider'); +SELECT pg_tde_create_key_using_global_key_provider('', 'file-keyring'); + +-- Creating principal key fails if the key name is too long +SELECT pg_tde_create_key_using_database_key_provider(repeat('K', 256), 'file-provider'); +SELECT pg_tde_create_key_using_global_key_provider(repeat('K', 256), 'file-keyring'); + +-- Creating principal key fails if key already exists +SELECT pg_tde_create_key_using_database_key_provider('existing-key','file-provider'); +SELECT pg_tde_create_key_using_database_key_provider('existing-key','file-provider'); +SELECT pg_tde_create_key_using_global_key_provider('existing-key','file-keyring'); + +-- Setting principal key fails if key does not exist +SELECT pg_tde_set_default_key_using_global_key_provider('not-existing', 'file-keyring'); +SELECT pg_tde_set_key_using_database_key_provider('not-existing', 'file-keyring'); +SELECT pg_tde_set_key_using_global_key_provider('not-existing', 'file-keyring'); +SELECT pg_tde_set_server_key_using_global_key_provider('not-existing', 'file-keyring'); DROP EXTENSION pg_tde; - diff --git a/contrib/pg_tde/sql/keyprovider_dependency.sql b/contrib/pg_tde/sql/keyprovider_dependency.sql deleted file mode 100644 index 2c56d2d9e38e2..0000000000000 --- a/contrib/pg_tde/sql/keyprovider_dependency.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; - -SELECT pg_tde_add_key_provider_file('mk-file','/tmp/pg_tde_test_keyring.per'); -SELECT pg_tde_add_key_provider_file('free-file','/tmp/pg_tde_test_keyring_2.per'); -SELECT pg_tde_add_key_provider_vault_v2('V2-vault','vault-token','percona.com/vault-v2/percona','/mount/dev','ca-cert-auth'); - -SELECT * FROM pg_tde_list_all_key_providers(); - -SELECT pg_tde_set_principal_key('test-db-principal-key','mk-file'); - -DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/sql/kmip_test.sql b/contrib/pg_tde/sql/kmip_test.sql index 85db4e9766e53..0e148566f52bd 100644 --- a/contrib/pg_tde/sql/kmip_test.sql +++ b/contrib/pg_tde/sql/kmip_test.sql @@ -1,7 +1,8 @@ CREATE EXTENSION pg_tde; -SELECT pg_tde_add_key_provider_kmip('kmip-prov','127.0.0.1', 5696, '/tmp/server_certificate.pem', '/tmp/client_key_jane_doe.pem'); -SELECT pg_tde_set_principal_key('kmip-principal-key','kmip-prov'); +SELECT pg_tde_add_database_key_provider_kmip('kmip-prov', '127.0.0.1', 5696, '/tmp/client_certificate_jane_doe.pem', '/tmp/client_key_jane_doe.pem', '/tmp/server_certificate.pem'); +SELECT pg_tde_create_key_using_database_key_provider('kmip-key','kmip-prov'); +SELECT pg_tde_set_key_using_database_key_provider('kmip-key','kmip-prov'); CREATE TABLE test_enc( id SERIAL, @@ -15,6 +16,11 @@ INSERT INTO test_enc (k) VALUES (3); SELECT * from test_enc; +SELECT pg_tde_verify_key(); + DROP TABLE test_enc; +-- Creating provider fails if we can't connect to kmip server +SELECT pg_tde_add_database_key_provider_kmip('will-not-work', '127.0.0.1', 61, '/tmp/client_certificate_jane_doe.pem', '/tmp/client_key_jane_doe.pem', '/tmp/server_certificate.pem'); + DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/sql/no_provider_error.sql b/contrib/pg_tde/sql/no_provider_error.sql deleted file mode 100644 index abe2e18cbcc5e..0000000000000 --- a/contrib/pg_tde/sql/no_provider_error.sql +++ /dev/null @@ -1,11 +0,0 @@ -CREATE EXTENSION pg_tde; - --- should fail -CREATE TABLE t1 (n INT) USING tde_heap; - --- should work -CREATE TABLE t2 (n INT) USING heap; - -DROP TABLE t2; - -DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/sql/partition_table.sql b/contrib/pg_tde/sql/partition_table.sql new file mode 100644 index 0000000000000..45e125dd0e8d9 --- /dev/null +++ b/contrib/pg_tde/sql/partition_table.sql @@ -0,0 +1,121 @@ +\! rm -f '/tmp/pg_tde_keyring.per' + +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('database_keyring_provider','/tmp/pg_tde_keyring.per'); +SELECT pg_tde_create_key_using_database_key_provider('table_key','database_keyring_provider'); +SELECT pg_tde_set_key_using_database_key_provider('table_key','database_keyring_provider'); +CREATE TABLE IF NOT EXISTS partitioned_table ( + id SERIAL, + data TEXT, + created_at DATE NOT NULL, + PRIMARY KEY (id, created_at) + ) PARTITION BY RANGE (created_at) USING tde_heap; + +CREATE TABLE partition_q1_2024 PARTITION OF partitioned_table FOR VALUES FROM ('2024-01-01') TO ('2024-04-01') USING tde_heap; +CREATE TABLE partition_q2_2024 PARTITION OF partitioned_table FOR VALUES FROM ('2024-04-01') TO ('2024-07-01') USING heap; +CREATE TABLE partition_q3_2024 PARTITION OF partitioned_table FOR VALUES FROM ('2024-07-01') TO ('2024-10-01') USING tde_heap; +CREATE TABLE partition_q4_2024 PARTITION OF partitioned_table FOR VALUES FROM ('2024-10-01') TO ('2025-01-01') USING heap; + +SELECT pg_tde_is_encrypted('partitioned_table'); +SELECT pg_tde_is_encrypted('partition_q1_2024'); +SELECT pg_tde_is_encrypted('partition_q2_2024'); +SELECT pg_tde_is_encrypted('partition_q3_2024'); +SELECT pg_tde_is_encrypted('partition_q4_2024'); + +ALTER TABLE partitioned_table SET ACCESS METHOD heap; +ALTER TABLE partition_q1_2024 SET ACCESS METHOD heap; +ALTER TABLE partition_q2_2024 SET ACCESS METHOD tde_heap; +ALTER TABLE partition_q3_2024 SET ACCESS METHOD heap; +ALTER TABLE partition_q4_2024 SET ACCESS METHOD tde_heap; + +SELECT pg_tde_is_encrypted('partitioned_table'); +SELECT pg_tde_is_encrypted('partition_q1_2024'); +SELECT pg_tde_is_encrypted('partition_q2_2024'); +SELECT pg_tde_is_encrypted('partition_q3_2024'); +SELECT pg_tde_is_encrypted('partition_q4_2024'); + +-- Does not care about parent AM as long as all children with storage use the same +ALTER TABLE partition_q1_2024 SET ACCESS METHOD tde_heap; +ALTER TABLE partition_q2_2024 SET ACCESS METHOD tde_heap; +ALTER TABLE partition_q3_2024 SET ACCESS METHOD tde_heap; +ALTER TABLE partition_q4_2024 SET ACCESS METHOD tde_heap; +ALTER TABLE partitioned_table SET ACCESS METHOD heap; + +DROP TABLE partitioned_table; + +-- Partition inherits encryption status from parent table if default is heap and parent is tde_heap +SET default_table_access_method = "heap"; +CREATE TABLE partition_parent (a int) PARTITION BY RANGE (a) USING tde_heap; +CREATE TABLE partition_child PARTITION OF partition_parent FOR VALUES FROM (0) TO (9); +SELECT pg_tde_is_encrypted('partition_child'); +DROP TABLE partition_parent; +RESET default_table_access_method; + +-- Partition inherits encryption status from parent table if default is tde_heap and parent is heap +SET default_table_access_method = "tde_heap"; +CREATE TABLE partition_parent (a int) PARTITION BY RANGE (a) USING heap; +CREATE TABLE partition_child PARTITION OF partition_parent FOR VALUES FROM (0) TO (9); +SELECT pg_tde_is_encrypted('partition_child'); +DROP TABLE partition_parent; +RESET default_table_access_method; + +-- Partition uses default access method to determine encryption status if neither parent nor child have an access method set +CREATE TABLE partition_parent (a int) PARTITION BY RANGE (a); +SET default_table_access_method = "tde_heap"; +CREATE TABLE partition_child_tde PARTITION OF partition_parent FOR VALUES FROM (0) TO (9); +SELECT pg_tde_is_encrypted('partition_child_tde'); +SET default_table_access_method = "heap"; +CREATE TABLE partition_child_heap PARTITION OF partition_parent FOR VALUES FROM (10) TO (19); +SELECT pg_tde_is_encrypted('partition_child_heap'); +DROP TABLE partition_parent; +RESET default_table_access_method; + +-- Enforce encryption GUC is respected when creating partitions even if parent is plain text +CREATE TABLE partition_parent (a int) PARTITION BY RANGE (a) USING heap; +SET pg_tde.enforce_encryption = on; +CREATE TABLE partition_child_inherit PARTITION OF partition_parent FOR VALUES FROM (0) TO (10); +CREATE TABLE partition_child_heap PARTITION OF partition_parent FOR VALUES FROM (11) TO (20) USING heap; +CREATE TABLE partition_child_tde_heap PARTITION OF partition_parent FOR VALUES FROM (11) TO (20) USING tde_heap; +SELECT pg_tde_is_encrypted('partition_child_tde_heap'); +DROP TABLE partition_parent; +RESET pg_tde.enforce_encryption; + +-- Does not change encryption of child tables when rewriting and changing AM +CREATE TABLE partition_parent (a int, b int) PARTITION BY RANGE (a) USING tde_heap; +CREATE TABLE partition_child PARTITION OF partition_parent FOR VALUES FROM (0) TO (9) USING tde_heap; +SELECT pg_tde_is_encrypted('partition_child'); +ALTER TABLE partition_parent SET ACCESS METHOD heap, ALTER b TYPE bigint; +SELECT relname, amname FROM pg_class JOIN pg_am ON pg_am.oid = pg_class.relam WHERE relname IN ('partition_parent', 'partition_child') ORDER BY relname; +SELECT pg_tde_is_encrypted('partition_child'); +DROP TABLE partition_parent; + +-- Partitioned indexes should be encrypted +CREATE TABLE partition_parent (a int) PARTITION BY RANGE (a); +CREATE TABLE partition_child PARTITION OF partition_parent FOR VALUES FROM (0) TO (9) USING tde_heap; +CREATE INDEX ON partition_parent (a); +SELECT pg_tde_is_encrypted('partition_parent_a_idx'); -- Also check that the parent index is NULL +SELECT pg_tde_is_encrypted('partition_child_a_idx'); +DROP TABLE partition_parent; + +-- Partitioned indexes should be not encrypted with heap +CREATE TABLE partition_parent (a int) PARTITION BY RANGE (a); +CREATE TABLE partition_child PARTITION OF partition_parent FOR VALUES FROM (0) TO (9) USING heap; +CREATE INDEX ON partition_parent (a); +SELECT pg_tde_is_encrypted('partition_child_a_idx'); +DROP TABLE partition_parent; + +-- We refuse to create an index when the inheritance heirarchy has mixed statuses +CREATE TABLE partition_parent (a int) PARTITION BY RANGE (a); +CREATE TABLE partition_child_heap PARTITION OF partition_parent FOR VALUES FROM (0) TO (9) USING heap; +CREATE TABLE partition_child_tde_heap PARTITION OF partition_parent FOR VALUES FROM (10) TO (19) USING tde_heap; +CREATE INDEX ON partition_parent (a); +DROP TABLE partition_parent; + +-- Index should also be encrypted for new partitionins +CREATE TABLE partition_parent (a int) PARTITION BY RANGE (a); +CREATE INDEX ON partition_parent (a); +CREATE TABLE partition_child PARTITION OF partition_parent FOR VALUES FROM (10) TO (19) USING tde_heap; +SELECT pg_tde_is_encrypted('partition_child_a_idx'); +DROP TABLE partition_parent; + +DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/sql/pg_tde_is_encrypted.sql b/contrib/pg_tde/sql/pg_tde_is_encrypted.sql index aa6d0c07ac17d..36f1aa5f708b6 100644 --- a/contrib/pg_tde/sql/pg_tde_is_encrypted.sql +++ b/contrib/pg_tde/sql/pg_tde_is_encrypted.sql @@ -1,41 +1,51 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; +\! rm -f '/tmp/pg_tde_test_keyring.per' -SELECT * FROM pg_tde_principal_key_info(); +CREATE EXTENSION pg_tde; -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); +SELECT pg_tde_add_database_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); +SELECT pg_tde_create_key_using_database_key_provider('test-db-key','file-vault'); +SELECT pg_tde_set_key_using_database_key_provider('test-db-key','file-vault'); -CREATE TABLE test_enc( - id SERIAL, - k INTEGER DEFAULT '0' NOT NULL, - PRIMARY KEY (id) - ) USING tde_heap; +CREATE TABLE test_enc ( + id SERIAL, + PRIMARY KEY (id) +) USING tde_heap; -CREATE TABLE test_norm( - id SERIAL, - k INTEGER DEFAULT '0' NOT NULL, - PRIMARY KEY (id) - ) USING heap; +CREATE TABLE test_norm ( + id SERIAL, + PRIMARY KEY (id) +) USING heap; -CREATE TABLE test_part( - id SERIAL, - k INTEGER DEFAULT '0' NOT NULL, - PRIMARY KEY (id) - ) PARTITION BY RANGE (id) USING tde_heap; +CREATE TABLE test_part ( + id SERIAL, + PRIMARY KEY (id) +) PARTITION BY RANGE (id) USING tde_heap; -SELECT relname, amname FROM pg_class JOIN pg_am ON pg_am.oid = pg_class.relam WHERE relname IN ('test_enc', 'test_norm', 'test_part') ORDER BY relname; +CREATE TEMP TABLE test_temp_enc ( + id SERIAL, + PRIMARY KEY (id) +) USING tde_heap; -SELECT relname, pg_tde_is_encrypted(relname) FROM (VALUES ('test_enc'), ('test_norm'), ('test_part')) AS r (relname) ORDER BY relname; +CREATE TEMP TABLE test_temp_norm ( + id SERIAL, + PRIMARY KEY (id) +) USING heap; -SELECT relname, pg_tde_is_encrypted(relname) FROM (VALUES ('test_enc_id_seq'), ('test_norm_id_seq'), ('test_part_id_seq')) AS r (relname) ORDER BY relname; +SELECT relname, amname FROM pg_class JOIN pg_am ON pg_am.oid = pg_class.relam WHERE relname IN ('test_enc', 'test_norm', 'test_part', 'test_temp_enc', 'test_temp_norm') ORDER BY relname; -SELECT relname, pg_tde_is_encrypted(relname) FROM (VALUES ('test_enc_pkey'), ('test_norm_pkey'), ('test_part_pkey')) AS r (relname) ORDER BY relname; +SELECT relname, pg_tde_is_encrypted(relname) FROM (VALUES ('test_enc'), ('test_norm'), ('test_part'), ('test_temp_enc'), ('test_temp_norm')) AS r (relname) ORDER BY relname; + +SELECT relname, pg_tde_is_encrypted(relname) FROM (VALUES ('test_enc_id_seq'), ('test_norm_id_seq'), ('test_part_id_seq'), ('test_temp_enc'), ('test_temp_norm')) AS r (relname) ORDER BY relname; + +SELECT relname, pg_tde_is_encrypted(relname) FROM (VALUES ('test_enc_pkey'), ('test_norm_pkey'), ('test_part_pkey'), ('test_temp_enc'), ('test_temp_norm')) AS r (relname) ORDER BY relname; SELECT pg_tde_is_encrypted(NULL); -SELECT key_provider_id, key_provider_name, principal_key_name - FROM pg_tde_principal_key_info(); +SELECT provider_id, provider_name, key_name + FROM pg_tde_key_info(); +DROP TABLE test_temp_norm; +DROP TABLE test_temp_enc; DROP TABLE test_part; DROP TABLE test_norm; DROP TABLE test_enc; diff --git a/contrib/pg_tde/sql/recreate_storage.sql b/contrib/pg_tde/sql/recreate_storage.sql index 4389144e5de7e..26770e14e58e6 100644 --- a/contrib/pg_tde/sql/recreate_storage.sql +++ b/contrib/pg_tde/sql/recreate_storage.sql @@ -1,7 +1,10 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; +\! rm -f '/tmp/pg_tde_test_keyring.per' -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); +CREATE EXTENSION pg_tde; + +SELECT pg_tde_add_database_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); +SELECT pg_tde_create_key_using_database_key_provider('test-db-key','file-vault'); +SELECT pg_tde_set_key_using_database_key_provider('test-db-key','file-vault'); SET default_table_access_method = "tde_heap"; @@ -41,10 +44,12 @@ SELECT pg_tde_is_encrypted('rewritemetoo2'); CREATE TABLE encrypted_table ( id SERIAL, + id2 INT, data TEXT, created_at DATE NOT NULL, PRIMARY KEY (id, created_at) ) USING tde_heap; + CREATE INDEX idx_date ON encrypted_table (created_at); SELECT pg_tde_is_encrypted('encrypted_table'); CLUSTER encrypted_table USING idx_date; @@ -54,5 +59,79 @@ SELECT pg_tde_is_encrypted('encrypted_table_id_seq'); ALTER SEQUENCE encrypted_table_id_seq RESTART; SELECT pg_tde_is_encrypted('encrypted_table_id_seq'); +CREATE TABLE plain_table ( + id2 INT +) USING heap; + +-- Starts independent and becomes encrypted +CREATE SEQUENCE independent_seq; +SELECT pg_tde_is_encrypted('independent_seq'); +ALTER SEQUENCE independent_seq OWNED BY encrypted_table.id2; +SELECT pg_tde_is_encrypted('independent_seq'); + +-- Starts independent and stays plain +CREATE SEQUENCE independent_seq2 OWNED BY NONE; +SELECT pg_tde_is_encrypted('independent_seq2'); +ALTER SEQUENCE independent_seq2 OWNED BY plain_table.id2; +SELECT pg_tde_is_encrypted('independent_seq2'); + +-- Starts owned by an encrypted table and becomes owned by a plain table +CREATE SEQUENCE encrypted_table_id2_seq OWNED BY encrypted_table.id2; +SELECT pg_tde_is_encrypted('encrypted_table_id2_seq'); +ALTER SEQUENCE encrypted_table_id2_seq OWNED BY plain_table.id2; +SELECT pg_tde_is_encrypted('encrypted_table_id2_seq'); + +-- Starts owned by an encrypted table and becomes independent +CREATE SEQUENCE encrypted_table_id2_seq2 OWNED BY encrypted_table.id2; +SELECT pg_tde_is_encrypted('encrypted_table_id2_seq2'); +ALTER SEQUENCE encrypted_table_id2_seq2 OWNED BY NONE; +SELECT pg_tde_is_encrypted('encrypted_table_id2_seq2'); + +-- Starts owned by a plain table and becomes owned by an encrypted table +CREATE SEQUENCE plain_table_id2_seq OWNED BY plain_table.id2; +SELECT pg_tde_is_encrypted('plain_table_id2_seq'); +ALTER SEQUENCE plain_table_id2_seq OWNED BY encrypted_table.id2; +SELECT pg_tde_is_encrypted('plain_table_id2_seq'); + +-- Starts owned by a plain table and becomes independent +CREATE SEQUENCE plain_table_id2_seq2 OWNED BY plain_table.id2; +SELECT pg_tde_is_encrypted('plain_table_id2_seq2'); +ALTER SEQUENCE plain_table_id2_seq2 OWNED BY NONE; +SELECT pg_tde_is_encrypted('plain_table_id2_seq2'); + +-- Enforce that we do not mess up encryption status for toast table +CREATE TABLE cities ( + name varchar(8), + population real, + elevation int +) USING tde_heap; + +CREATE TABLE state_capitals ( + state char(2) UNIQUE NOT NULL +) INHERITS (cities) USING heap; + +CREATE TABLE capitals ( + country char(2) UNIQUE NOT NULL +) INHERITS (cities) USING tde_heap; + +ALTER TABLE cities ALTER COLUMN name TYPE TEXT; + +-- Enforce the same for typed tables +CREATE TYPE people_type AS (age int, name varchar(8), dob date); +CREATE TABLE sales_staff OF people_type USING tde_heap; +CREATE TABLE other_staff OF people_type USING heap; + +ALTER TYPE people_type ALTER ATTRIBUTE name TYPE text CASCADE; + +-- If all tpyed tables are encrypted everything should work as usual +ALTER TABLE other_staff SET ACCESS METHOD tde_heap; +ALTER TYPE people_type ALTER ATTRIBUTE name TYPE text CASCADE; + +SELECT pg_tde_is_encrypted('pg_toast.pg_toast_' || 'sales_staff'::regclass::oid); +SELECT pg_tde_is_encrypted('pg_toast.pg_toast_' || 'other_staff'::regclass::oid); + +DROP TYPE people_type CASCADE; +DROP TABLE cities CASCADE; +DROP TABLE plain_table; DROP EXTENSION pg_tde CASCADE; RESET default_table_access_method; diff --git a/contrib/pg_tde/sql/relocate.sql b/contrib/pg_tde/sql/relocate.sql index a18cb38095133..1f06077208a0a 100644 --- a/contrib/pg_tde/sql/relocate.sql +++ b/contrib/pg_tde/sql/relocate.sql @@ -1,14 +1,8 @@ --- Support pg_tde already being installed -SET client_min_messages = 'warning'; -DROP EXTENSION IF EXISTS pg_tde; - CREATE SCHEMA other; CREATE EXTENSION pg_tde SCHEMA other; -SELECT other.pg_tde_add_key_provider_file('file-vault', '/tmp/pg_tde_test_keyring.per'); - -SELECT other.pg_tde_grant_key_viewer_to_role('public'); +SELECT other.pg_tde_add_database_key_provider_file('file-vault', '/tmp/pg_tde_test_keyring.per'); ALTER EXTENSION pg_tde SET SCHEMA public; diff --git a/contrib/pg_tde/sql/subtransaction.sql b/contrib/pg_tde/sql/subtransaction.sql deleted file mode 100644 index 681d505092a7f..0000000000000 --- a/contrib/pg_tde/sql/subtransaction.sql +++ /dev/null @@ -1,25 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; - -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); - - -BEGIN; -- Nesting level 1 -SAVEPOINT sp; -CREATE TABLE foo(s TEXT); -- Nesting level 2 -RELEASE SAVEPOINT sp; -SAVEPOINT sp; -CREATE TABLE bar(s TEXT); -- Nesting level 2 -ROLLBACK TO sp; -- Rollback should not affect first subtransaction -COMMIT; - -BEGIN; -- Nesting level 1 -SAVEPOINT sp; -DROP TABLE foo; -- Nesting level 2 -RELEASE SAVEPOINT sp; -SAVEPOINT sp; -CREATE TABLE bar(s TEXT); -- Nesting level 2 -ROLLBACK TO sp; -- Rollback should not affect first subtransaction -COMMIT; - -DROP EXTENSION pg_tde; \ No newline at end of file diff --git a/contrib/pg_tde/sql/tablespace.sql b/contrib/pg_tde/sql/tablespace.sql index 102e8b755c535..920d51bf8cd6e 100644 --- a/contrib/pg_tde/sql/tablespace.sql +++ b/contrib/pg_tde/sql/tablespace.sql @@ -1,7 +1,10 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; +\! rm -f '/tmp/pg_tde_test_keyring.per' -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); +CREATE EXTENSION pg_tde; + +SELECT pg_tde_add_database_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); +SELECT pg_tde_create_key_using_database_key_provider('test-db-key','file-vault'); +SELECT pg_tde_set_key_using_database_key_provider('test-db-key','file-vault'); CREATE TABLE test(num1 bigint, num2 double precision, t text) USING tde_heap; INSERT INTO test(num1, num2, t) diff --git a/contrib/pg_tde/sql/toast_decrypt.sql b/contrib/pg_tde/sql/toast_decrypt.sql index 073e6bf27f83e..92ad6c104ae64 100644 --- a/contrib/pg_tde/sql/toast_decrypt.sql +++ b/contrib/pg_tde/sql/toast_decrypt.sql @@ -1,7 +1,10 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; +\! rm -f '/tmp/pg_tde_test_keyring.per' -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); +CREATE EXTENSION pg_tde; + +SELECT pg_tde_add_database_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); +SELECT pg_tde_create_key_using_database_key_provider('test-db-key','file-vault'); +SELECT pg_tde_set_key_using_database_key_provider('test-db-key','file-vault'); CREATE TABLE src (f1 TEXT STORAGE EXTERNAL) USING tde_heap; INSERT INTO src VALUES(repeat('abcdeF',1000)); diff --git a/contrib/pg_tde/sql/vault_v2_test.sql b/contrib/pg_tde/sql/vault_v2_test.sql index 0e210dc1a65ba..50fb17f07e812 100644 --- a/contrib/pg_tde/sql/vault_v2_test.sql +++ b/contrib/pg_tde/sql/vault_v2_test.sql @@ -1,19 +1,20 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; +CREATE EXTENSION pg_tde; -\getenv root_token ROOT_TOKEN +\getenv root_token_file VAULT_ROOT_TOKEN_FILE +\getenv cacert_file VAULT_CACERT_FILE -SELECT pg_tde_add_key_provider_vault_v2('vault-incorrect',:'root_token','http://127.0.0.1:8200','DUMMY-TOKEN',NULL); --- FAILS -SELECT pg_tde_set_principal_key('vault-v2-principal-key','vault-incorrect'); +-- FAILS as mount path does not exist +SELECT pg_tde_add_database_key_provider_vault_v2('vault-incorrect', 'https://127.0.0.1:8200', 'DUMMY-MOUNT-PATH', :'root_token_file', :'cacert_file'); -CREATE TABLE test_enc( - id SERIAL, - k INTEGER DEFAULT '0' NOT NULL, - PRIMARY KEY (id) - ) USING tde_heap; +-- FAILS as it's not supported engine type +SELECT pg_tde_add_database_key_provider_vault_v2('vault-incorrect', 'https://127.0.0.1:8200', 'cubbyhole', :'root_token_file', :'cacert_file'); + +-- FAILS as it's not supported engine version +SELECT pg_tde_add_database_key_provider_vault_v2('vault-incorrect', 'https://127.0.0.1:8200', 'kv-v1', :'root_token_file', :'cacert_file'); -SELECT pg_tde_add_key_provider_vault_v2('vault-v2',:'root_token','http://127.0.0.1:8200','secret',NULL); -SELECT pg_tde_set_principal_key('vault-v2-principal-key','vault-v2'); +SELECT pg_tde_add_database_key_provider_vault_v2('vault-v2', 'https://127.0.0.1:8200', 'secret', :'root_token_file', :'cacert_file'); +SELECT pg_tde_create_key_using_database_key_provider('vault-v2-key', 'vault-v2'); +SELECT pg_tde_set_key_using_database_key_provider('vault-v2-key', 'vault-v2'); CREATE TABLE test_enc( id SERIAL, @@ -27,6 +28,20 @@ INSERT INTO test_enc (k) VALUES (3); SELECT * from test_enc; +SELECT pg_tde_verify_key(); + DROP TABLE test_enc; +-- Creating provider fails if we can't connect to vault +SELECT pg_tde_add_database_key_provider_vault_v2('will-not-work', 'https://127.0.0.1:61', 'secret', :'root_token_file', :'cacert_file'); + +-- Changing provider fails if we can't connect to vault +SELECT pg_tde_change_database_key_provider_vault_v2('vault-v2', 'https://127.0.0.1:61', 'secret', :'root_token_file', :'cacert_file'); + +-- HTTPS without cert fails +SELECT pg_tde_change_database_key_provider_vault_v2('vault-v2', 'https://127.0.0.1:8200', 'secret', :'root_token_file', NULL); + +-- HTTP against HTTPS server fails +SELECT pg_tde_change_database_key_provider_vault_v2('vault-v2', 'http://127.0.0.1:8200', 'secret', :'root_token_file', NULL); + DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/src/access/pg_tde_tdemap.c b/contrib/pg_tde/src/access/pg_tde_tdemap.c index 5392b976097b2..70b6722a2ebc4 100644 --- a/contrib/pg_tde/src/access/pg_tde_tdemap.c +++ b/contrib/pg_tde/src/access/pg_tde_tdemap.c @@ -1,42 +1,26 @@ -/*------------------------------------------------------------------------- - * - * pg_tde_tdemap.c - * tde relation fork manager code - * - * - * IDENTIFICATION - * src/access/pg_tde_tdemap.c - * - *------------------------------------------------------------------------- - */ - #include "postgres.h" -#include "access/pg_tde_tdemap.h" -#include "common/file_perm.h" -#include "transam/pg_tde_xact_handler.h" -#include "storage/fd.h" -#include "utils/wait_event.h" -#include "utils/memutils.h" + +#include +#include + #include "access/xlog.h" #include "access/xlog_internal.h" #include "access/xloginsert.h" -#include "utils/builtins.h" +#include "common/file_perm.h" #include "miscadmin.h" +#include "storage/fd.h" +#include "utils/builtins.h" +#include "utils/memutils.h" +#include "utils/wait_event.h" #include "access/pg_tde_tdemap.h" #include "access/pg_tde_xlog.h" #include "catalog/tde_global_space.h" #include "catalog/tde_principal_key.h" +#include "common/pg_tde_utils.h" #include "encryption/enc_aes.h" +#include "encryption/enc_tde.h" #include "keyring/keyring_api.h" -#include "common/pg_tde_utils.h" - -#include -#include -#include -#include - -#include "pg_tde_defines.h" #ifdef FRONTEND #include "pg_tde_fe.h" @@ -55,145 +39,81 @@ } #endif -#define PG_TDE_FILEMAGIC 0x02454454 /* version ID value = TDE 02 */ - +#define PG_TDE_FILEMAGIC 0x03454454 /* version ID value = TDE 03 */ +#define PG_TDE_MAP_FILENAME "%d_keys" -#define MAP_ENTRY_SIZE sizeof(TDEMapEntry) -#define TDE_FILE_HEADER_SIZE sizeof(TDEFileHeader) - -#define MaxXLogRecPtr (~(XLogRecPtr)0) +typedef enum +{ + MAP_ENTRY_TYPE_EMPTY = 0, + MAP_ENTRY_TYPE_KEY = 1, +} TDEMapEntryType; typedef struct TDEFileHeader { int32 file_version; - TDEPrincipalKeyInfo principal_key_info; + TDESignedPrincipalKeyInfo signed_key_info; } TDEFileHeader; -typedef struct RelKeyCacheRec -{ - RelFileLocator locator; - InternalKey key; -} RelKeyCacheRec; - /* - * Relation keys cache. + * Feel free to use the unused fields for something, but beware that existing + * files may contain unexpected values here. Also be aware of alignment if + * changing any of the types as this struct is written/read directly from file. * - * This is a slice backed by memory `*data`. Initially, we allocate one memory - * page (usually 4Kb). We reallocate it by adding another page when we run out - * of space. This memory is locked in the RAM so it won't be paged to the swap - * (we don't want decrypted keys on disk). We do allocations in mem pages as - * these are the units `mlock()` operations are performed in. - * - * Currently, the cache can only grow (no eviction). The data is located in - * TopMemoryContext hence being wiped when the process exits, as well as memory - * is being unlocked by OS. + * If changes are made, know that the first four fields are used as AAD when + * encrypting/decrypting existing keys from the key files, so any changes here + * might break existing clusters. */ -typedef struct RelKeyCache +typedef struct TDEMapEntry { - RelKeyCacheRec *data; /* must be a multiple of a memory page - * (usually 4Kb) */ - int len; /* num of RelKeyCacheRecs currenty in cache */ - int cap; /* max amount of RelKeyCacheRec data can fit */ -} RelKeyCache; + Oid spcOid; /* Part of AAD */ + RelFileNumber relNumber; /* Part of AAD */ + uint32 type; /* Part of AAD */ + uint32 _unused3; /* Part of AAD */ -RelKeyCache tde_rel_key_cache = { - .data = NULL, - .len = 0, - .cap = 0, -}; + uint8 encrypted_key_data[INTERNAL_KEY_LEN]; + uint8 key_base_iv[INTERNAL_KEY_IV_LEN]; + uint32 _unused1; /* Will be 1 in existing files entries. */ + uint32 _unused4; + uint64 _unused2; /* Will be 0 in existing files entries. */ -/* - * TODO: WAL should have its own RelKeyCache - */ -static WALKeyCacheRec *tde_wal_key_cache = NULL; -static WALKeyCacheRec *tde_wal_key_last_rec = NULL; + /* IV and tag used when encrypting the key itself */ + unsigned char entry_iv[MAP_ENTRY_IV_SIZE]; + unsigned char aead_tag[MAP_ENTRY_AEAD_TAG_SIZE]; +} TDEMapEntry; -static InternalKey *pg_tde_get_key_from_file(const RelFileLocator *rlocator, uint32 key_type); -static TDEMapEntry *pg_tde_find_map_entry(const RelFileLocator *rlocator, uint32 key_type, char *db_map_path); -static InternalKey *tde_decrypt_rel_key(TDEPrincipalKey *principal_key, TDEMapEntry *map_entry); +static void pg_tde_set_db_file_path(Oid dbOid, char *path); +static bool pg_tde_find_map_entry(const RelFileLocator *rlocator, char *db_map_path, TDEMapEntry *map_entry); +static InternalKey *tde_decrypt_rel_key(const TDEPrincipalKey *principal_key, TDEMapEntry *map_entry); static int pg_tde_open_file_basic(const char *tde_filename, int fileFlags, bool ignore_missing); +static int pg_tde_open_file_read(const char *tde_filename, bool ignore_missing, off_t *curr_pos); static void pg_tde_file_header_read(const char *tde_filename, int fd, TDEFileHeader *fheader, off_t *bytes_read); -static bool pg_tde_read_one_map_entry(int fd, const RelFileLocator *rlocator, int flags, TDEMapEntry *map_entry, off_t *offset); -static TDEMapEntry *pg_tde_read_one_map_entry2(int keydata_fd, int32 key_index, TDEPrincipalKey *principal_key); -static int pg_tde_open_file_read(const char *tde_filename, off_t *curr_pos); -static InternalKey *pg_tde_get_key_from_cache(const RelFileLocator *rlocator, uint32 key_type); -static WALKeyCacheRec *pg_tde_add_wal_key_to_cache(InternalKey *cached_key, XLogRecPtr start_lsn); -static InternalKey *pg_tde_put_key_into_cache(const RelFileLocator *locator, InternalKey *key); +static bool pg_tde_read_one_map_entry(int fd, TDEMapEntry *map_entry, off_t *offset); #ifndef FRONTEND -static InternalKey *pg_tde_create_key_map_entry(const RelFileLocator *newrlocator, uint32 entry_type); -static InternalKey *pg_tde_create_local_key(const RelFileLocator *newrlocator, uint32 entry_type); -static void pg_tde_generate_internal_key(InternalKey *int_key, uint32 entry_type); -static int pg_tde_file_header_write(const char *tde_filename, int fd, TDEPrincipalKeyInfo *principal_key_info, off_t *bytes_written); -static off_t pg_tde_write_one_map_entry(int fd, const TDEMapEntry *map_entry, off_t *offset, const char *db_map_path); -static void pg_tde_write_key_map_entry(const RelFileLocator *rlocator, InternalKey *rel_key_data, TDEPrincipalKey *principal_key, bool write_xlog); -static bool pg_tde_delete_map_entry(const RelFileLocator *rlocator, char *db_map_path, off_t offset); -static int keyrotation_init_file(TDEPrincipalKeyInfo *new_principal_key_info, char *rotated_filename, char *filename, off_t *curr_pos); -static void finalize_key_rotation(const char *path_old, const char *path_new); -static int pg_tde_open_file_write(const char *tde_filename, TDEPrincipalKeyInfo *principal_key_info, bool truncate, off_t *curr_pos); -static void update_wal_keys_cache(void); - -InternalKey * -pg_tde_create_smgr_key(const RelFileLocatorBackend *newrlocator) -{ - if (RelFileLocatorBackendIsTemp(*newrlocator)) - return pg_tde_create_local_key(&newrlocator->locator, TDE_KEY_TYPE_SMGR); - else - return pg_tde_create_key_map_entry(&newrlocator->locator, TDE_KEY_TYPE_SMGR); -} +static void pg_tde_write_one_map_entry(int fd, const TDEMapEntry *map_entry, off_t *offset, const char *db_map_path); +static int pg_tde_file_header_write(const char *tde_filename, int fd, const TDESignedPrincipalKeyInfo *signed_key_info, off_t *bytes_written); +static void pg_tde_initialize_map_entry(TDEMapEntry *map_entry, const TDEPrincipalKey *principal_key, const RelFileLocator *rlocator, const InternalKey *rel_key_data); +static int pg_tde_open_file_write(const char *tde_filename, const TDESignedPrincipalKeyInfo *signed_key_info, bool truncate, off_t *curr_pos); +static void pg_tde_replace_key_map_entry(const RelFileLocator *rlocator, const InternalKey *rel_key_data, const TDEPrincipalKey *principal_key); -/* - * Generate an encrypted key for the relation and store it in the keymap file. - */ -static InternalKey * -pg_tde_create_key_map_entry(const RelFileLocator *newrlocator, uint32 entry_type) +void +pg_tde_save_smgr_key(RelFileLocator rel, const InternalKey *rel_key_data) { - InternalKey rel_key_data; TDEPrincipalKey *principal_key; LWLock *lock_pk = tde_lwlock_enc_keys(); - pg_tde_generate_internal_key(&rel_key_data, entry_type); - LWLockAcquire(lock_pk, LW_EXCLUSIVE); - principal_key = GetPrincipalKey(newrlocator->dbOid, LW_EXCLUSIVE); + principal_key = GetPrincipalKey(rel.dbOid, LW_EXCLUSIVE); if (principal_key == NULL) { ereport(ERROR, - (errmsg("principal key not configured"), - errhint("create one using pg_tde_set_principal_key before using encrypted tables"))); + errmsg("principal key not configured"), + errhint("Use pg_tde_set_key_using_database_key_provider() or pg_tde_set_key_using_global_key_provider() to configure one.")); } - /* - * Add the encrypted key to the key map data file structure. - */ - pg_tde_write_key_map_entry(newrlocator, &rel_key_data, principal_key, true); + pg_tde_replace_key_map_entry(&rel, rel_key_data, principal_key); LWLockRelease(lock_pk); - - return pg_tde_put_key_into_cache(newrlocator, &rel_key_data); -} - -static InternalKey * -pg_tde_create_local_key(const RelFileLocator *newrlocator, uint32 entry_type) -{ - InternalKey int_key; - - pg_tde_generate_internal_key(&int_key, entry_type); - - return pg_tde_put_key_into_cache(newrlocator, &int_key); -} - -static void -pg_tde_generate_internal_key(InternalKey *int_key, uint32 entry_type) -{ - int_key->rel_type = entry_type; - int_key->start_lsn = InvalidXLogRecPtr; - - if (!RAND_bytes(int_key->key, INTERNAL_KEY_LEN)) - ereport(ERROR, - (errcode(ERRCODE_INTERNAL_ERROR), - errmsg("could not generate internal key: %s", - ERR_error_string(ERR_get_error(), NULL)))); } const char * @@ -209,49 +129,13 @@ tde_sprint_key(InternalKey *k) } /* - * Generates a new internal key for WAL and adds it to the _dat file. It doesn't - * add unecnrypted key into cache but rather sets it in `rel_key_data`. - * - * We have a special function for WAL as it is being called during recovery - * (start) so there should be no XLog records, aquired locks, and reads from - * cache. The key is always created with start_lsn = InvalidXLogRecPtr. Which - * will be updated with the actual lsn by the first WAL write. - */ -void -pg_tde_create_wal_key(InternalKey *rel_key_data, const RelFileLocator *newrlocator, uint32 entry_type) -{ - TDEPrincipalKey *principal_key; - - LWLockAcquire(tde_lwlock_enc_keys(), LW_SHARED); - - principal_key = GetPrincipalKey(newrlocator->dbOid, LW_SHARED); - if (principal_key == NULL) - { - ereport(ERROR, - (errmsg("principal key not configured"), - errhint("create one using pg_tde_set_server_principal_key before using encrypted WAL"))); - } - - /* TODO: no need in generating key if TDE_KEY_TYPE_WAL_UNENCRYPTED */ - pg_tde_generate_internal_key(rel_key_data, TDE_KEY_TYPE_GLOBAL | entry_type); - - /* - * Add the encrypted key to the key map data file structure. - */ - pg_tde_write_key_map_entry(newrlocator, rel_key_data, principal_key, false); - - LWLockRelease(tde_lwlock_enc_keys()); -} - -/* - * Deletes the key map file for a given database. + * Deletes the key file for a given database. */ void pg_tde_delete_tde_files(Oid dbOid) { - char db_map_path[MAXPGPATH] = {0}; + char db_map_path[MAXPGPATH]; - /* Set the file paths */ pg_tde_set_db_file_path(dbOid, db_map_path); /* Remove file without emitting any error */ @@ -259,150 +143,329 @@ pg_tde_delete_tde_files(Oid dbOid) } void -pg_tde_save_principal_key_redo(TDEPrincipalKeyInfo *principal_key_info) +pg_tde_save_principal_key_redo(const TDESignedPrincipalKeyInfo *signed_key_info) { + int map_fd; + off_t curr_pos; + char db_map_path[MAXPGPATH]; + + pg_tde_set_db_file_path(signed_key_info->data.databaseId, db_map_path); + LWLockAcquire(tde_lwlock_enc_keys(), LW_EXCLUSIVE); - pg_tde_save_principal_key(principal_key_info); + map_fd = pg_tde_open_file_write(db_map_path, signed_key_info, false, &curr_pos); + CloseTransientFile(map_fd); LWLockRelease(tde_lwlock_enc_keys()); } /* - * Creates the key map file and saves the principal key information. + * Creates the key file and saves the principal key information. * * If the file pre-exist, it truncates the file before adding principal key * information. * * The caller must have an EXCLUSIVE LOCK on the files before calling this function. + * + * write_xlog: if true, the function will write an XLOG record about the + * principal key addition. We may want to skip this during server recovery/startup + * or in some other cases when WAL writes are not allowed. */ void -pg_tde_save_principal_key(TDEPrincipalKeyInfo *principal_key_info) +pg_tde_save_principal_key(const TDEPrincipalKey *principal_key, bool write_xlog) { - int map_fd = -1; + int map_fd; off_t curr_pos = 0; - char db_map_path[MAXPGPATH] = {0}; + char db_map_path[MAXPGPATH]; + TDESignedPrincipalKeyInfo signed_key_Info; + + pg_tde_set_db_file_path(principal_key->keyInfo.databaseId, db_map_path); - /* Set the file paths */ - pg_tde_set_db_file_path(principal_key_info->databaseId, db_map_path); + pg_tde_sign_principal_key_info(&signed_key_Info, principal_key); - ereport(DEBUG2, (errmsg("pg_tde_save_principal_key"))); + if (write_xlog) + { + XLogBeginInsert(); + XLogRegisterData((char *) &signed_key_Info, sizeof(TDESignedPrincipalKeyInfo)); + XLogInsert(RM_TDERMGR_ID, XLOG_TDE_ADD_PRINCIPAL_KEY); + } - map_fd = pg_tde_open_file_write(db_map_path, principal_key_info, true, &curr_pos); - close(map_fd); + map_fd = pg_tde_open_file_write(db_map_path, &signed_key_Info, true, &curr_pos); + CloseTransientFile(map_fd); } /* - * Write TDE file header to a TDE file. + * Mark relation map entry as free and overwrite the key + * + * This fucntion is called by the pg_tde SMGR when storage is unlinked on + * transaction commit/abort. */ -static int -pg_tde_file_header_write(const char *tde_filename, int fd, TDEPrincipalKeyInfo *principal_key_info, off_t *bytes_written) +void +pg_tde_free_key_map_entry(const RelFileLocator rlocator) { - TDEFileHeader fheader; + char db_map_path[MAXPGPATH]; + File map_fd; + off_t curr_pos = 0; + + pg_tde_set_db_file_path(rlocator.dbOid, db_map_path); - Assert(principal_key_info); + LWLockAcquire(tde_lwlock_enc_keys(), LW_EXCLUSIVE); - /* Create the header for this file. */ - fheader.file_version = PG_TDE_FILEMAGIC; + /* Open and validate file for basic correctness. */ + map_fd = pg_tde_open_file_write(db_map_path, NULL, false, &curr_pos); + + while (1) + { + TDEMapEntry map_entry; + off_t prev_pos = curr_pos; + + if (!pg_tde_read_one_map_entry(map_fd, &map_entry, &curr_pos)) + break; + + if (map_entry.type == MAP_ENTRY_TYPE_KEY && map_entry.spcOid == rlocator.spcOid && map_entry.relNumber == rlocator.relNumber) + { + TDEMapEntry empty_map_entry = { + .type = MAP_ENTRY_TYPE_EMPTY, + }; + + pg_tde_write_one_map_entry(map_fd, &empty_map_entry, &prev_pos, db_map_path); + break; + } + } + + CloseTransientFile(map_fd); + + LWLockRelease(tde_lwlock_enc_keys()); +} + +/* + * Rotate keys and generates the WAL record for it. + */ +void +pg_tde_perform_rotate_key(const TDEPrincipalKey *principal_key, const TDEPrincipalKey *new_principal_key, bool write_xlog) +{ + TDESignedPrincipalKeyInfo new_signed_key_info; + off_t old_curr_pos, + new_curr_pos; + int old_fd, + new_fd; + char old_path[MAXPGPATH], + new_path[MAXPGPATH]; + + /* This function cannot be used to rotate the server key. */ + Assert(principal_key); + Assert(principal_key->keyInfo.databaseId != GLOBAL_DATA_TDE_OID); - /* Fill in the data */ - fheader.principal_key_info = *principal_key_info; + pg_tde_sign_principal_key_info(&new_signed_key_info, new_principal_key); - *bytes_written = pg_pwrite(fd, &fheader, TDE_FILE_HEADER_SIZE, 0); + pg_tde_set_db_file_path(principal_key->keyInfo.databaseId, old_path); + snprintf(new_path, MAXPGPATH, "%s.r", old_path); - if (*bytes_written != TDE_FILE_HEADER_SIZE) + old_fd = pg_tde_open_file_read(old_path, false, &old_curr_pos); + new_fd = pg_tde_open_file_write(new_path, &new_signed_key_info, true, &new_curr_pos); + + /* Read all entries until EOF */ + while (1) { - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not write tde file \"%s\": %m", - tde_filename))); + InternalKey *rel_key_data; + TDEMapEntry read_map_entry, + write_map_entry; + RelFileLocator rloc; + + if (!pg_tde_read_one_map_entry(old_fd, &read_map_entry, &old_curr_pos)) + break; + + if (read_map_entry.type == MAP_ENTRY_TYPE_EMPTY) + continue; + + rloc.spcOid = read_map_entry.spcOid; + rloc.dbOid = principal_key->keyInfo.databaseId; + rloc.relNumber = read_map_entry.relNumber; + + /* Decrypt and re-encrypt key */ + rel_key_data = tde_decrypt_rel_key(principal_key, &read_map_entry); + pg_tde_initialize_map_entry(&write_map_entry, new_principal_key, &rloc, rel_key_data); + + pg_tde_write_one_map_entry(new_fd, &write_map_entry, &new_curr_pos, new_path); + + pfree(rel_key_data); } - if (pg_fsync(fd) != 0) + CloseTransientFile(old_fd); + CloseTransientFile(new_fd); + + /* + * Do the final step - replace the current _keys with the file with new + * data + */ + durable_rename(new_path, old_path, ERROR); + + /* + * We do WAL writes past the event ("the write behind logging") rather + * than before ("the write ahead") because we need logging here only for + * replication purposes. The rotation results in data written and fsynced + * to disk. Which in most cases would happen way before it's written to + * the WAL disk file. As WAL will be flushed at the end of the + * transaction, on its commit, hence after this function returns (there is + * also a bg writer, but the commit is what is guaranteed). And it makes + * sense to replicate the event only after its effect has been + * successfully applied to the source. + */ + if (write_xlog) { - ereport(data_sync_elevel(ERROR), - (errcode_for_file_access(), - errmsg("could not fsync file \"%s\": %m", tde_filename))); + XLogPrincipalKeyRotate xlrec; + + xlrec.databaseId = new_principal_key->keyInfo.databaseId; + xlrec.keyringId = new_principal_key->keyInfo.keyringId; + memcpy(xlrec.keyName, new_principal_key->keyInfo.name, sizeof(new_principal_key->keyInfo.name)); + + XLogBeginInsert(); + XLogRegisterData((char *) &xlrec, sizeof(XLogPrincipalKeyRotate)); + XLogInsert(RM_TDERMGR_ID, XLOG_TDE_ROTATE_PRINCIPAL_KEY); } - ereport(DEBUG2, - (errmsg("Wrote the header to %s", tde_filename))); +} - return fd; +void +pg_tde_delete_principal_key_redo(Oid dbOid) +{ + char path[MAXPGPATH]; + + pg_tde_set_db_file_path(dbOid, path); + + LWLockAcquire(tde_lwlock_enc_keys(), LW_EXCLUSIVE); + durable_unlink(path, WARNING); + LWLockRelease(tde_lwlock_enc_keys()); +} + +/* + * Deletes the principal key for the database. This fucntion checks if key map + * file has any entries, and if not, it removes the file. Otherwise raises an error. + */ +void +pg_tde_delete_principal_key(Oid dbOid) +{ + char path[MAXPGPATH]; + + Assert(LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_EXCLUSIVE)); + Assert(pg_tde_count_encryption_keys(dbOid) == 0); + + pg_tde_set_db_file_path(dbOid, path); + + XLogBeginInsert(); + XLogRegisterData((char *) &dbOid, sizeof(Oid)); + XLogInsert(RM_TDERMGR_ID, XLOG_TDE_DELETE_PRINCIPAL_KEY); + + /* Remove whole key map file */ + durable_unlink(path, ERROR); +} + +#endif /* !FRONTEND */ + +static void +pg_tde_set_db_file_path(Oid dbOid, char *path) +{ + char *fname = psprintf(PG_TDE_MAP_FILENAME, dbOid); + + join_path_components(path, pg_tde_get_data_dir(), fname); + pfree(fname); +} + +void +pg_tde_sign_principal_key_info(TDESignedPrincipalKeyInfo *signed_key_info, const TDEPrincipalKey *principal_key) +{ + signed_key_info->data = principal_key->keyInfo; + + if (!RAND_bytes(signed_key_info->sign_iv, MAP_ENTRY_IV_SIZE)) + ereport(ERROR, + errcode(ERRCODE_INTERNAL_ERROR), + errmsg("could not generate iv for key map: %s", ERR_error_string(ERR_get_error(), NULL))); + + AesGcmEncrypt(principal_key->keyData, + signed_key_info->sign_iv, MAP_ENTRY_IV_SIZE, + (unsigned char *) &signed_key_info->data, sizeof(signed_key_info->data), + NULL, 0, + NULL, + signed_key_info->aead_tag, MAP_ENTRY_AEAD_TAG_SIZE); } +#ifndef FRONTEND static void pg_tde_initialize_map_entry(TDEMapEntry *map_entry, const TDEPrincipalKey *principal_key, const RelFileLocator *rlocator, const InternalKey *rel_key_data) { map_entry->spcOid = rlocator->spcOid; map_entry->relNumber = rlocator->relNumber; - map_entry->flags = rel_key_data->rel_type; - map_entry->enc_key = *rel_key_data; + map_entry->type = MAP_ENTRY_TYPE_KEY; + memcpy(map_entry->key_base_iv, rel_key_data->base_iv, INTERNAL_KEY_IV_LEN); + + /* + * We set these fields here so that existing file entries will be + * consistent and future use of these fields easier. + */ + map_entry->_unused1 = 1; + map_entry->_unused2 = 0; - if (!RAND_bytes(map_entry->entry_iv, MAP_ENTRY_EMPTY_IV_SIZE)) + if (!RAND_bytes(map_entry->entry_iv, MAP_ENTRY_IV_SIZE)) ereport(ERROR, - (errcode(ERRCODE_INTERNAL_ERROR), - errmsg("could not generate iv for key map: %s", ERR_error_string(ERR_get_error(), NULL)))); + errcode(ERRCODE_INTERNAL_ERROR), + errmsg("could not generate iv for key map: %s", ERR_error_string(ERR_get_error(), NULL))); - AesGcmEncrypt(principal_key->keyData, map_entry->entry_iv, (unsigned char *) map_entry, offsetof(TDEMapEntry, enc_key), rel_key_data->key, INTERNAL_KEY_LEN, map_entry->enc_key.key, map_entry->aead_tag); + AesGcmEncrypt(principal_key->keyData, + map_entry->entry_iv, MAP_ENTRY_IV_SIZE, + (unsigned char *) map_entry, offsetof(TDEMapEntry, encrypted_key_data), + rel_key_data->key, INTERNAL_KEY_LEN, + map_entry->encrypted_key_data, + map_entry->aead_tag, MAP_ENTRY_AEAD_TAG_SIZE); } +#endif -/* - * Based on the given arguments,write the entry into the key map file. - */ -static off_t +#ifndef FRONTEND +static void pg_tde_write_one_map_entry(int fd, const TDEMapEntry *map_entry, off_t *offset, const char *db_map_path) { int bytes_written = 0; - bytes_written = pg_pwrite(fd, map_entry, MAP_ENTRY_SIZE, *offset); + bytes_written = pg_pwrite(fd, map_entry, sizeof(TDEMapEntry), *offset); - /* Add the entry to the file */ - if (bytes_written != MAP_ENTRY_SIZE) + if (bytes_written != sizeof(TDEMapEntry)) { ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not write tde map file \"%s\": %m", - db_map_path))); + errcode_for_file_access(), + errmsg("could not write tde map file \"%s\": %m", db_map_path)); } if (pg_fsync(fd) != 0) { ereport(data_sync_elevel(ERROR), - (errcode_for_file_access(), - errmsg("could not fsync file \"%s\": %m", db_map_path))); + errcode_for_file_access(), + errmsg("could not fsync file \"%s\": %m", db_map_path)); } - return (*offset + bytes_written); + *offset += bytes_written; } +#endif +#ifndef FRONTEND /* - * Calls the create map entry function to get an index into the keydata. This - * The keydata function will then write the encrypted key on the desired - * location. - * - * Key Map Table [pg_tde.map]: - * header: {Format Version, Principal Key Name} - * data: {OID, Flag, index of key in pg_tde.dat}... - * - * The caller must hold an exclusive lock on the map file to avoid + * The caller must hold an exclusive lock on the key file to avoid * concurrent in place updates leading to data conflicts. */ void -pg_tde_write_key_map_entry(const RelFileLocator *rlocator, InternalKey *rel_key_data, TDEPrincipalKey *principal_key, bool write_xlog) +pg_tde_replace_key_map_entry(const RelFileLocator *rlocator, const InternalKey *rel_key_data, const TDEPrincipalKey *principal_key) { - char db_map_path[MAXPGPATH] = {0}; - int map_fd = -1; + char db_map_path[MAXPGPATH]; + int map_fd; off_t curr_pos = 0; - off_t prev_pos = 0; + off_t write_pos = 0; TDEMapEntry write_map_entry; + TDESignedPrincipalKeyInfo signed_key_Info; Assert(rlocator); - /* Set the file paths */ pg_tde_set_db_file_path(rlocator->dbOid, db_map_path); + pg_tde_sign_principal_key_info(&signed_key_Info, principal_key); + /* Open and validate file for basic correctness. */ - map_fd = pg_tde_open_file_write(db_map_path, &principal_key->keyInfo, false, &curr_pos); - prev_pos = curr_pos; + map_fd = pg_tde_open_file_write(db_map_path, &signed_key_Info, false, &curr_pos); /* * Read until we find an empty slot. Otherwise, read until end. This seems @@ -412,648 +475,212 @@ pg_tde_write_key_map_entry(const RelFileLocator *rlocator, InternalKey *rel_key_ while (1) { TDEMapEntry read_map_entry; - bool found; + off_t prev_pos = curr_pos; - prev_pos = curr_pos; - found = pg_tde_read_one_map_entry(map_fd, NULL, MAP_ENTRY_EMPTY, &read_map_entry, &curr_pos); + if (!pg_tde_read_one_map_entry(map_fd, &read_map_entry, &curr_pos)) + { + if (write_pos == 0) + write_pos = prev_pos; + break; + } - /* - * We either reach EOF or found an empty slot in the middle of the - * file - */ - if (prev_pos == curr_pos || found) + if (read_map_entry.spcOid == rlocator->spcOid && read_map_entry.relNumber == rlocator->relNumber) + { + write_pos = prev_pos; break; + } + + if (write_pos == 0 && read_map_entry.type == MAP_ENTRY_TYPE_EMPTY) + write_pos = prev_pos; } /* Initialize map entry and encrypt key */ pg_tde_initialize_map_entry(&write_map_entry, principal_key, rlocator, rel_key_data); - if (write_xlog) - { - XLogRelKey xlrec; - - xlrec.mapEntry = write_map_entry; - xlrec.pkInfo = principal_key->keyInfo; - - XLogBeginInsert(); - XLogRegisterData((char *) &xlrec, sizeof(xlrec)); - XLogInsert(RM_TDERMGR_ID, XLOG_TDE_ADD_RELATION_KEY); - } - - /* - * Write the given entry at the location pointed by prev_pos; i.e. the - * free entry - */ - curr_pos = prev_pos; - pg_tde_write_one_map_entry(map_fd, &write_map_entry, &prev_pos, db_map_path); - - /* Let's close the file. */ - close(map_fd); + /* Write the given entry at curr_pos; i.e. the free entry. */ + pg_tde_write_one_map_entry(map_fd, &write_map_entry, &write_pos, db_map_path); - /* Register the entry to be freed in case the transaction aborts */ - RegisterEntryForDeletion(rlocator, curr_pos, false); + CloseTransientFile(map_fd); } +#endif /* - * Write and already encrypted entry to the key map. - * - * The caller must hold an exclusive lock on the map file to avoid - * concurrent in place updates leading to data conflicts. + * Returns true if we find a valid match; e.g. type is not set to + * MAP_ENTRY_TYPE_EMPTY and the relNumber and spcOid matches the one provided + * in rlocator. */ -void -pg_tde_write_key_map_entry_redo(const TDEMapEntry *write_map_entry, TDEPrincipalKeyInfo *principal_key_info) +static bool +pg_tde_find_map_entry(const RelFileLocator *rlocator, char *db_map_path, TDEMapEntry *map_entry) { - char db_map_path[MAXPGPATH] = {0}; - int map_fd = -1; + File map_fd; off_t curr_pos = 0; - off_t prev_pos = 0; - - /* Set the file paths */ - pg_tde_set_db_file_path(principal_key_info->databaseId, db_map_path); + bool found = false; - LWLockAcquire(tde_lwlock_enc_keys(), LW_EXCLUSIVE); + Assert(rlocator != NULL); - /* Open and validate file for basic correctness. */ - map_fd = pg_tde_open_file_write(db_map_path, principal_key_info, false, &curr_pos); - prev_pos = curr_pos; + map_fd = pg_tde_open_file_read(db_map_path, false, &curr_pos); - /* - * Read until we find an empty slot. Otherwise, read until end. This seems - * to be less frequent than vacuum. So let's keep this function here - * rather than overloading the vacuum process. - */ - while (1) + while (pg_tde_read_one_map_entry(map_fd, map_entry, &curr_pos)) { - TDEMapEntry read_map_entry; - bool found; - - prev_pos = curr_pos; - found = pg_tde_read_one_map_entry(map_fd, NULL, MAP_ENTRY_EMPTY, &read_map_entry, &curr_pos); - - /* - * We either reach EOF or found an empty slot in the middle of the - * file - */ - if (prev_pos == curr_pos || found) + if (map_entry->type == MAP_ENTRY_TYPE_KEY && map_entry->spcOid == rlocator->spcOid && map_entry->relNumber == rlocator->relNumber) + { + found = true; break; + } } - /* - * Write the given entry at the location pointed by prev_pos; i.e. the - * free entry - */ - curr_pos = prev_pos; - pg_tde_write_one_map_entry(map_fd, write_map_entry, &prev_pos, db_map_path); - - /* Let's close the file. */ - close(map_fd); + CloseTransientFile(map_fd); - LWLockRelease(tde_lwlock_enc_keys()); -} - -static bool -pg_tde_delete_map_entry(const RelFileLocator *rlocator, char *db_map_path, off_t offset) -{ - File map_fd; - bool found = false; - off_t curr_pos = 0; - - /* Open and validate file for basic correctness. */ - map_fd = pg_tde_open_file_write(db_map_path, NULL, false, &curr_pos); - - /* - * If we need to delete an entry, we expect an offset value to the start - * of the entry to speed up the operation. Otherwise, we'd be sequentially - * scanning the entire map file. - */ - if (offset > 0) - { - curr_pos = lseek(map_fd, offset, SEEK_SET); - - if (curr_pos == -1) - { - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not seek in tde map file \"%s\": %m", - db_map_path))); - } - } - - /* - * Read until we find an empty slot. Otherwise, read until end. This seems - * to be less frequent than vacuum. So let's keep this function here - * rather than overloading the vacuum process. - */ - while (1) - { - TDEMapEntry read_map_entry; - off_t prev_pos = curr_pos; - - found = pg_tde_read_one_map_entry(map_fd, rlocator, MAP_ENTRY_VALID, &read_map_entry, &curr_pos); - - /* We've reached EOF */ - if (curr_pos == prev_pos) - break; - - /* We found a valid entry for the relation */ - if (found) - { - TDEMapEntry empty_map_entry = { - .flags = MAP_ENTRY_EMPTY, - .enc_key = { - .rel_type = MAP_ENTRY_EMPTY, - }, - }; - - pg_tde_write_one_map_entry(map_fd, &empty_map_entry, &prev_pos, db_map_path); - break; - } - } - - /* Let's close the file. */ - close(map_fd); - - /* Return -1 indicating that no entry was removed */ - return found; + return found; } /* - * Called when transaction is being completed; either committed or aborted. - * By default, when a transaction creates an entry, we mark it as MAP_ENTRY_VALID. - * Only during the abort phase of the transaction that we are proceed on with - * marking the entry as MAP_ENTRY_FREE. This optimistic strategy that assumes - * that transaction will commit more often then getting aborted avoids - * unnecessary locking. + * Counts number of encryption keys in a key file. + * + * Does not check if objects actually exist but just that they have keys in + * the key file. * - * The offset allows us to simply seek to the desired location and mark the entry - * as MAP_ENTRY_FREE without needing any further processing. + * Works even if the database has no key file. */ -void -pg_tde_free_key_map_entry(const RelFileLocator *rlocator, off_t offset) +int +pg_tde_count_encryption_keys(Oid dbOid) { - bool found; - char db_map_path[MAXPGPATH] = {0}; - - Assert(rlocator); - - /* Get the file paths */ - pg_tde_set_db_file_path(rlocator->dbOid, db_map_path); + char db_map_path[MAXPGPATH]; + File map_fd; + off_t curr_pos = 0; + TDEMapEntry map_entry; + int count = 0; - LWLockAcquire(tde_lwlock_enc_keys(), LW_EXCLUSIVE); + Assert(LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_SHARED) || LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_EXCLUSIVE)); - /* Remove the map entry if found */ - found = pg_tde_delete_map_entry(rlocator, db_map_path, offset); + pg_tde_set_db_file_path(dbOid, db_map_path); - LWLockRelease(tde_lwlock_enc_keys()); + map_fd = pg_tde_open_file_read(db_map_path, true, &curr_pos); + if (map_fd < 0) + return count; - if (!found) + while (pg_tde_read_one_map_entry(map_fd, &map_entry, &curr_pos)) { - ereport(WARNING, - (errcode(ERRCODE_NO_DATA_FOUND), - errmsg("could not find the required map entry for deletion of relation %d in tablespace %d in tde map file \"%s\": %m", - rlocator->relNumber, - rlocator->spcOid, - db_map_path))); - + if (map_entry.type == MAP_ENTRY_TYPE_KEY) + count++; } -} -/* - * Accepts the unrotated filename and returns the rotation temp - * filename. Both the strings are expected to be of the size - * MAXPGPATH. - * - * No error checking by this function. - */ -static File -keyrotation_init_file(TDEPrincipalKeyInfo *new_principal_key_info, char *rotated_filename, char *filename, off_t *curr_pos) -{ - /* - * Set the new filenames for the key rotation process - temporary at the - * moment - */ - snprintf(rotated_filename, MAXPGPATH, "%s.r", filename); + CloseTransientFile(map_fd); - /* Create file, truncate if the rotate file already exits */ - return pg_tde_open_file_write(rotated_filename, new_principal_key_info, true, curr_pos); + return count; } -/* - * Do the final steps in the key rotation. - */ -static void -finalize_key_rotation(const char *path_old, const char *path_new) +bool +pg_tde_verify_principal_key_info(TDESignedPrincipalKeyInfo *signed_key_info, const KeyData *principal_key_data) { - durable_unlink(path_old, ERROR); - durable_rename(path_new, path_old, ERROR); + return AesGcmDecrypt(principal_key_data->data, + signed_key_info->sign_iv, MAP_ENTRY_IV_SIZE, + (unsigned char *) &signed_key_info->data, sizeof(signed_key_info->data), + NULL, 0, + NULL, + signed_key_info->aead_tag, MAP_ENTRY_AEAD_TAG_SIZE); } -/* - * Rotate keys and generates the WAL record for it. - */ -void -pg_tde_perform_rotate_key(TDEPrincipalKey *principal_key, TDEPrincipalKey *new_principal_key) +static InternalKey * +tde_decrypt_rel_key(const TDEPrincipalKey *principal_key, TDEMapEntry *map_entry) { -#define OLD_PRINCIPAL_KEY 0 -#define NEW_PRINCIPAL_KEY 1 -#define PRINCIPAL_KEY_COUNT 2 - - off_t curr_pos[PRINCIPAL_KEY_COUNT] = {0}; - int fd[PRINCIPAL_KEY_COUNT]; - char path[PRINCIPAL_KEY_COUNT][MAXPGPATH]; - off_t map_size; - XLogPrincipalKeyRotate *xlrec; - off_t xlrec_size; - - pg_tde_set_db_file_path(principal_key->keyInfo.databaseId, path[OLD_PRINCIPAL_KEY]); - - fd[OLD_PRINCIPAL_KEY] = pg_tde_open_file_read(path[OLD_PRINCIPAL_KEY], &curr_pos[OLD_PRINCIPAL_KEY]); - fd[NEW_PRINCIPAL_KEY] = keyrotation_init_file(&new_principal_key->keyInfo, path[NEW_PRINCIPAL_KEY], path[OLD_PRINCIPAL_KEY], &curr_pos[NEW_PRINCIPAL_KEY]); + InternalKey *key = palloc_object(InternalKey); - /* Read all entries until EOF */ - while (1) - { - InternalKey *rel_key_data; - off_t prev_pos[PRINCIPAL_KEY_COUNT]; - TDEMapEntry read_map_entry, - write_map_entry; - RelFileLocator rloc; - bool found; - - prev_pos[OLD_PRINCIPAL_KEY] = curr_pos[OLD_PRINCIPAL_KEY]; - found = pg_tde_read_one_map_entry(fd[OLD_PRINCIPAL_KEY], NULL, MAP_ENTRY_VALID, &read_map_entry, &curr_pos[OLD_PRINCIPAL_KEY]); - - /* We either reach EOF */ - if (prev_pos[OLD_PRINCIPAL_KEY] == curr_pos[OLD_PRINCIPAL_KEY]) - break; - - /* We didn't find a valid entry */ - if (found == false) - continue; - - rloc.spcOid = read_map_entry.spcOid; - rloc.dbOid = principal_key->keyInfo.databaseId; - rloc.relNumber = read_map_entry.relNumber; - - /* Decrypt and re-encrypt key */ - rel_key_data = tde_decrypt_rel_key(principal_key, &read_map_entry); - pg_tde_initialize_map_entry(&write_map_entry, new_principal_key, &rloc, rel_key_data); - - /* Write the given entry at the location pointed by prev_pos */ - prev_pos[NEW_PRINCIPAL_KEY] = curr_pos[NEW_PRINCIPAL_KEY]; - curr_pos[NEW_PRINCIPAL_KEY] = pg_tde_write_one_map_entry(fd[NEW_PRINCIPAL_KEY], &write_map_entry, &prev_pos[NEW_PRINCIPAL_KEY], path[NEW_PRINCIPAL_KEY]); - - pfree(rel_key_data); - } - - close(fd[OLD_PRINCIPAL_KEY]); - - /* Let's calculate sizes */ - map_size = lseek(fd[NEW_PRINCIPAL_KEY], 0, SEEK_END); - xlrec_size = map_size + SizeoOfXLogPrincipalKeyRotate; - - /* palloc and fill in the structure */ - xlrec = (XLogPrincipalKeyRotate *) palloc(xlrec_size); - - xlrec->databaseId = principal_key->keyInfo.databaseId; - xlrec->file_size = map_size; + Assert(principal_key); - if (pg_pread(fd[NEW_PRINCIPAL_KEY], xlrec->buff, xlrec->file_size, 0) == -1) + if (!AesGcmDecrypt(principal_key->keyData, + map_entry->entry_iv, MAP_ENTRY_IV_SIZE, + (unsigned char *) map_entry, offsetof(TDEMapEntry, encrypted_key_data), + map_entry->encrypted_key_data, INTERNAL_KEY_LEN, + key->key, + map_entry->aead_tag, MAP_ENTRY_AEAD_TAG_SIZE)) ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not write WAL for key rotation: %m"))); - - close(fd[NEW_PRINCIPAL_KEY]); - - /* Insert the XLog record */ - XLogBeginInsert(); - XLogRegisterData((char *) xlrec, xlrec_size); - XLogInsert(RM_TDERMGR_ID, XLOG_TDE_ROTATE_KEY); + errmsg("Failed to decrypt key, incorrect principal key or corrupted key file")); - /* Do the final steps */ - finalize_key_rotation(path[OLD_PRINCIPAL_KEY], path[NEW_PRINCIPAL_KEY]); + memcpy(key->base_iv, map_entry->key_base_iv, INTERNAL_KEY_IV_LEN); - /* Free up the palloc'ed data */ - pfree(xlrec); - -#undef OLD_PRINCIPAL_KEY -#undef NEW_PRINCIPAL_KEY -#undef PRINCIPAL_KEY_COUNT + return key; } /* - * Rotate keys on a standby. - */ -void -pg_tde_write_map_keydata_file(off_t file_size, char *file_data) -{ - TDEFileHeader *fheader; - char path_new[MAXPGPATH]; - int fd_new; - off_t curr_pos = 0; - char db_map_path[MAXPGPATH] = {0}; - bool is_err = false; - - /* Let's get the header. Buff should start with the map file header. */ - fheader = (TDEFileHeader *) file_data; - - /* Set the file paths */ - pg_tde_set_db_file_path(fheader->principal_key_info.databaseId, db_map_path); - - /* Initialize the new file and set the name */ - fd_new = keyrotation_init_file(&fheader->principal_key_info, path_new, db_map_path, &curr_pos); - - if (pg_pwrite(fd_new, file_data, file_size, 0) != file_size) - { - ereport(WARNING, - (errcode_for_file_access(), - errmsg("could not write tde file \"%s\": %m", path_new))); - is_err = true; - goto FINALIZE; - } - if (pg_fsync(fd_new) != 0) - { - ereport(WARNING, - (errcode_for_file_access(), - errmsg("could not fsync file \"%s\": %m", path_new))); - is_err = true; - goto FINALIZE; - } - -FINALIZE: - close(fd_new); - - if (!is_err) - finalize_key_rotation(db_map_path, path_new); -} - -/* It's called by seg_write inside crit section so no pallocs, hence - * needs keyfile_path + * Open a TDE file: + * + * Returns the file descriptor in case of a success. Otherwise, error + * is raised except when ignore_missing is true and the file does not exit. */ -void -pg_tde_wal_last_key_set_lsn(XLogRecPtr lsn, const char *keyfile_path) +static int +pg_tde_open_file_basic(const char *tde_filename, int fileFlags, bool ignore_missing) { - LWLock *lock_pk = tde_lwlock_enc_keys(); - int fd = -1; - off_t read_pos, - write_pos, - last_key_idx; - - LWLockAcquire(lock_pk, LW_EXCLUSIVE); - - fd = pg_tde_open_file_write(keyfile_path, NULL, false, &read_pos); - - last_key_idx = ((lseek(fd, 0, SEEK_END) - TDE_FILE_HEADER_SIZE) / MAP_ENTRY_SIZE) - 1; - write_pos = TDE_FILE_HEADER_SIZE + (last_key_idx * MAP_ENTRY_SIZE) + offsetof(TDEMapEntry, enc_key) + offsetof(InternalKey, start_lsn); + int fd; - if (pg_pwrite(fd, &lsn, sizeof(XLogRecPtr), write_pos) != sizeof(XLogRecPtr)) + fd = OpenTransientFile(tde_filename, fileFlags); + if (fd < 0 && !(errno == ENOENT && ignore_missing == true)) { ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not write tde key data file: %m"))); - } - - /* - * If the last key overlaps with the previous, then invalidate the - * previous one. This may (and will) happen on replicas because it - * re-reads primary's data from the beginning of the segment on restart. - */ - if (last_key_idx > 0) - { - off_t prev_key_pos = TDE_FILE_HEADER_SIZE + ((last_key_idx - 1) * MAP_ENTRY_SIZE); - TDEMapEntry prev_map_entry; - - if (pg_pread(fd, &prev_map_entry, MAP_ENTRY_SIZE, prev_key_pos) != MAP_ENTRY_SIZE) - { - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not read previous WAL key: %m"))); - } - - if (prev_map_entry.enc_key.start_lsn >= lsn) - { - WALKeySetInvalid(&prev_map_entry.enc_key); - - if (pg_pwrite(fd, &prev_map_entry, MAP_ENTRY_SIZE, prev_key_pos) != MAP_ENTRY_SIZE) - { - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not write invalidated key: %m"))); - } - } - } - - if (pg_fsync(fd) != 0) - { - ereport(data_sync_elevel(ERROR), - (errcode_for_file_access(), - errmsg("could not fsync file: %m"))); + errcode_for_file_access(), + errmsg("could not open tde file \"%s\": %m", tde_filename)); } - LWLockRelease(lock_pk); - close(fd); + return fd; } /* - * Open for write and Validate File Header [pg_tde.*]: + * Open for read and Validate File Header: * header: {Format Version, Principal Key Name} * * Returns the file descriptor in case of a success. Otherwise, error * is raised. */ static int -pg_tde_open_file_write(const char *tde_filename, TDEPrincipalKeyInfo *principal_key_info, bool truncate, off_t *curr_pos) +pg_tde_open_file_read(const char *tde_filename, bool ignore_missing, off_t *curr_pos) { int fd; TDEFileHeader fheader; off_t bytes_read = 0; - off_t bytes_written = 0; - int file_flags = O_RDWR | O_CREAT | PG_BINARY | (truncate ? O_TRUNC : 0); - Assert(LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_EXCLUSIVE)); + Assert(LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_SHARED) || LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_EXCLUSIVE)); - fd = pg_tde_open_file_basic(tde_filename, file_flags, false); + fd = pg_tde_open_file_basic(tde_filename, O_RDONLY | PG_BINARY, ignore_missing); + if (ignore_missing && fd < 0) + return fd; pg_tde_file_header_read(tde_filename, fd, &fheader, &bytes_read); + *curr_pos = bytes_read; - /* In case it's a new file, let's add the header now. */ - if (bytes_read == 0 && principal_key_info) - pg_tde_file_header_write(tde_filename, fd, principal_key_info, &bytes_written); - - *curr_pos = bytes_read + bytes_written; return fd; } -#endif /* !FRONTEND */ - -/* - * Reads the key of the required relation. It identifies its map entry and then simply - * reads the key data from the keydata file. - */ -static InternalKey * -pg_tde_get_key_from_file(const RelFileLocator *rlocator, uint32 key_type) -{ - TDEMapEntry *map_entry; - TDEPrincipalKey *principal_key; - LWLock *lock_pk = tde_lwlock_enc_keys(); - char db_map_path[MAXPGPATH] = {0}; - InternalKey *rel_key; - - Assert(rlocator); - - /* Get the file paths */ - pg_tde_set_db_file_path(rlocator->dbOid, db_map_path); - - if (access(db_map_path, F_OK) == -1) - return NULL; - - LWLockAcquire(lock_pk, LW_SHARED); - - /* Read the map entry and get the index of the relation key */ - map_entry = pg_tde_find_map_entry(rlocator, key_type, db_map_path); - - if (map_entry == NULL) - { - LWLockRelease(lock_pk); - return NULL; - } - - /* - * Get/generate a principal key, create the key for relation and get the - * encrypted key with bytes to write - * - * We should hold the lock until the internal key is loaded to be sure the - * retrieved key was encrypted with the obtained principal key. Otherwise, - * the next may happen: - GetPrincipalKey returns key "PKey_1". - Some - * other process rotates the Principal key and re-encrypt an Internal key - * with "PKey_2". - We read the Internal key and decrypt it with "PKey_1" - * (that's what we've got). As the result we return an invalid Internal - * key. - */ - principal_key = GetPrincipalKey(rlocator->dbOid, LW_SHARED); - if (principal_key == NULL) - ereport(ERROR, - (errmsg("principal key not configured"), - errhint("create one using pg_tde_set_principal_key before using encrypted tables"))); - - rel_key = tde_decrypt_rel_key(principal_key, map_entry); - - LWLockRelease(lock_pk); - - return rel_key; -} - -/* - * Returns the index of the read map if we find a valid match; e.g. flags is set to - * MAP_ENTRY_VALID and the relNumber and spcOid matches the one provided in rlocator. - */ -static TDEMapEntry * -pg_tde_find_map_entry(const RelFileLocator *rlocator, uint32 key_type, char *db_map_path) -{ - File map_fd; - TDEMapEntry *map_entry = palloc_object(TDEMapEntry); - off_t curr_pos = 0; - - map_fd = pg_tde_open_file_read(db_map_path, &curr_pos); - - /* - * Read until we find an empty slot. Otherwise, read until end. This seems - * to be less frequent than vacuum. So let's keep this function here - * rather than overloading the vacuum process. - */ - while (1) - { - bool found; - off_t prev_pos = curr_pos; - - found = pg_tde_read_one_map_entry(map_fd, rlocator, key_type, map_entry, &curr_pos); - - /* We've reached EOF */ - if (curr_pos == prev_pos) - { - close(map_fd); - pfree(map_entry); - return NULL; - } - - /* We found a valid entry for the relation */ - if (found) - { - close(map_fd); - return map_entry; - } - } -} - -/* - * Decrypts a given key and returns the decrypted one. - */ -static InternalKey * -tde_decrypt_rel_key(TDEPrincipalKey *principal_key, TDEMapEntry *map_entry) -{ - InternalKey *rel_key_data = palloc_object(InternalKey); - - /* Ensure we are getting a valid pointer here */ - Assert(principal_key); - - /* Fill in the structure */ - *rel_key_data = map_entry->enc_key; - - if (!AesGcmDecrypt(principal_key->keyData, map_entry->entry_iv, (unsigned char *) map_entry, offsetof(TDEMapEntry, enc_key), map_entry->enc_key.key, INTERNAL_KEY_LEN, rel_key_data->key, map_entry->aead_tag)) - ereport(ERROR, - (errmsg("Failed to decrypt key, incorrect principal key or corrupted key file"))); - - - return rel_key_data; -} - +#ifndef FRONTEND /* - * Open for read and Validate File Header [pg_tde.*]: + * Open for write and Validate File Header: * header: {Format Version, Principal Key Name} * * Returns the file descriptor in case of a success. Otherwise, error * is raised. */ static int -pg_tde_open_file_read(const char *tde_filename, off_t *curr_pos) +pg_tde_open_file_write(const char *tde_filename, const TDESignedPrincipalKeyInfo *signed_key_info, bool truncate, off_t *curr_pos) { int fd; TDEFileHeader fheader; off_t bytes_read = 0; + off_t bytes_written = 0; + int file_flags = O_RDWR | O_CREAT | PG_BINARY | (truncate ? O_TRUNC : 0); - Assert(LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_SHARED) || LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_EXCLUSIVE)); + Assert(LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_EXCLUSIVE)); - fd = pg_tde_open_file_basic(tde_filename, O_RDONLY | PG_BINARY, false); + fd = pg_tde_open_file_basic(tde_filename, file_flags, false); pg_tde_file_header_read(tde_filename, fd, &fheader, &bytes_read); - *curr_pos = bytes_read; - - return fd; -} - -/* - * Open a TDE file [pg_tde.*]: - * - * Returns the file descriptor in case of a success. Otherwise, error - * is raised except when ignore_missing is true and the file does not exit. - */ -static int -pg_tde_open_file_basic(const char *tde_filename, int fileFlags, bool ignore_missing) -{ - int fd; - fd = BasicOpenFile(tde_filename, fileFlags); - if (fd < 0 && !(errno == ENOENT && ignore_missing == true)) - { - ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open tde file \"%s\": %m", - tde_filename))); - } + /* In case it's a new file, let's add the header now. */ + if (bytes_read == 0 && signed_key_info) + pg_tde_file_header_write(tde_filename, fd, signed_key_info, &bytes_written); + *curr_pos = bytes_read + bytes_written; return fd; } - +#endif /* * Read TDE file header from a TDE file and fill in the fheader data structure. @@ -1063,121 +690,92 @@ pg_tde_file_header_read(const char *tde_filename, int fd, TDEFileHeader *fheader { Assert(fheader); - *bytes_read = pg_pread(fd, fheader, TDE_FILE_HEADER_SIZE, 0); + *bytes_read = pg_pread(fd, fheader, sizeof(TDEFileHeader), 0); /* File is empty */ if (*bytes_read == 0) return; - if (*bytes_read != TDE_FILE_HEADER_SIZE + if (*bytes_read != sizeof(TDEFileHeader) || fheader->file_version != PG_TDE_FILEMAGIC) { - /* Corrupt file */ - close(fd); ereport(FATAL, - (errcode_for_file_access(), - errmsg("TDE map file \"%s\" is corrupted: %m", - tde_filename))); + errcode_for_file_access(), + errmsg("TDE map file \"%s\" is corrupted: %m", tde_filename)); } } - +#ifndef FRONTEND /* - * Returns true if a valid map entry if found. Otherwise, it only increments - * the offset and returns false. If the same offset value is set, it indicates - * to the caller that nothing was read. - * - * If a non-NULL rlocator is provided, the function compares the read value - * against the relNumber of rlocator. It sets found accordingly. - * - * The caller is reponsible for identifying that we have reached EOF by - * comparing old and new value of the offset. + * Write TDE file header to a TDE file. */ -static bool -pg_tde_read_one_map_entry(File map_file, const RelFileLocator *rlocator, int flags, TDEMapEntry *map_entry, off_t *offset) +static int +pg_tde_file_header_write(const char *tde_filename, int fd, const TDESignedPrincipalKeyInfo *signed_key_info, off_t *bytes_written) { - bool found; - off_t bytes_read = 0; - - Assert(map_entry); - Assert(offset); + TDEFileHeader fheader; - /* Read the entry at the given offset */ - bytes_read = pg_pread(map_file, map_entry, MAP_ENTRY_SIZE, *offset); + Assert(signed_key_info); - /* We've reached the end of the file. */ - if (bytes_read != MAP_ENTRY_SIZE) - return false; + fheader.file_version = PG_TDE_FILEMAGIC; + fheader.signed_key_info = *signed_key_info; + *bytes_written = pg_pwrite(fd, &fheader, sizeof(TDEFileHeader), 0); - *offset += bytes_read; + if (*bytes_written != sizeof(TDEFileHeader)) + { + ereport(ERROR, + errcode_for_file_access(), + errmsg("could not write tde file \"%s\": %m", tde_filename)); + } - /* We found a valid entry */ - found = map_entry->flags & flags; + if (pg_fsync(fd) != 0) + { + ereport(data_sync_elevel(ERROR), + errcode_for_file_access(), + errmsg("could not fsync file \"%s\": %m", tde_filename)); + } - /* If a valid rlocator is provided, let's compare and set found value */ - if (rlocator != NULL) - found &= map_entry->spcOid == rlocator->spcOid && map_entry->relNumber == rlocator->relNumber; + ereport(DEBUG2, errmsg("Wrote the header to %s", tde_filename)); - return found; + return fd; } +#endif /* - * TODO: Unify with pg_tde_read_one_map_entry() + * Returns true if a map entry if found or false if we have reached the end of + * the file. */ -static TDEMapEntry * -pg_tde_read_one_map_entry2(int fd, int32 key_index, TDEPrincipalKey *principal_key) +static bool +pg_tde_read_one_map_entry(int map_file, TDEMapEntry *map_entry, off_t *offset) { - TDEMapEntry *map_entry; - off_t read_pos = 0; - - /* Calculate the reading position in the file. */ - read_pos += (key_index * MAP_ENTRY_SIZE) + TDE_FILE_HEADER_SIZE; - - /* Check if the file has a valid key */ - if ((read_pos + MAP_ENTRY_SIZE) > lseek(fd, 0, SEEK_END)) - { - char db_map_path[MAXPGPATH] = {0}; + off_t bytes_read = 0; - pg_tde_set_db_file_path(principal_key->keyInfo.databaseId, db_map_path); - ereport(FATAL, - (errcode(ERRCODE_NO_DATA_FOUND), - errmsg("could not find the required key at index %d in tde data file \"%s\": %m", - key_index, db_map_path))); - } + Assert(map_entry); + Assert(offset); - /* Allocate and fill in the structure */ - map_entry = palloc_object(TDEMapEntry); + bytes_read = pg_pread(map_file, map_entry, sizeof(TDEMapEntry), *offset); - /* Read the encrypted key */ - if (pg_pread(fd, map_entry, MAP_ENTRY_SIZE, read_pos) != MAP_ENTRY_SIZE) - { - char db_map_path[MAXPGPATH] = {0}; + /* We've reached the end of the file. */ + if (bytes_read != sizeof(TDEMapEntry)) + return false; - pg_tde_set_db_file_path(principal_key->keyInfo.databaseId, db_map_path); - ereport(FATAL, - (errcode_for_file_access(), - errmsg("could not read key at index %d in tde key data file \"%s\": %m", - key_index, db_map_path))); - } + *offset += bytes_read; - return map_entry; + return true; } - /* - * Get the principal key from the map file. The caller must hold + * Get the principal key from the key file. The caller must hold * a LW_SHARED or higher lock on files before calling this function. */ -TDEPrincipalKeyInfo * +TDESignedPrincipalKeyInfo * pg_tde_get_principal_key_info(Oid dbOid) { - int fd = -1; + char db_map_path[MAXPGPATH]; + int fd; TDEFileHeader fheader; - TDEPrincipalKeyInfo *principal_key_info = NULL; + TDESignedPrincipalKeyInfo *signed_key_info = NULL; off_t bytes_read = 0; - char db_map_path[MAXPGPATH] = {0}; - /* Set the file paths */ pg_tde_set_db_file_path(dbOid, db_map_path); /* @@ -1192,7 +790,7 @@ pg_tde_get_principal_key_info(Oid dbOid) pg_tde_file_header_read(db_map_path, fd, &fheader, &bytes_read); - close(fd); + CloseTransientFile(fd); /* * It's not a new file. So we can copy the principal key info from the @@ -1200,347 +798,86 @@ pg_tde_get_principal_key_info(Oid dbOid) */ if (bytes_read > 0) { - principal_key_info = palloc_object(TDEPrincipalKeyInfo); - *principal_key_info = fheader.principal_key_info; + signed_key_info = palloc_object(TDESignedPrincipalKeyInfo); + *signed_key_info = fheader.signed_key_info; } - return principal_key_info; + return signed_key_info; } /* - * Returns TDE key for a given relation. - * First it looks in a cache. If nothing found in the cache, it reads data from - * the tde fork file and populates cache. + * Figures out whether a relation is encrypted or not, but without trying to + * decrypt the key if it is. */ -InternalKey * -GetSMGRRelationKey(RelFileLocatorBackend rel) +bool +pg_tde_has_smgr_key(RelFileLocator rel) { - Assert(rel.locator.relNumber != InvalidRelFileNumber); - - if (RelFileLocatorBackendIsTemp(rel)) - return pg_tde_get_key_from_cache(&rel.locator, TDE_KEY_TYPE_SMGR); - else - { - InternalKey *key; + bool result; + TDEMapEntry map_entry; + char db_map_path[MAXPGPATH]; - key = pg_tde_get_key_from_cache(&rel.locator, TDE_KEY_TYPE_SMGR); - if (key) - return key; + Assert(rel.relNumber != InvalidRelFileNumber); - key = pg_tde_get_key_from_file(&rel.locator, TDE_KEY_TYPE_SMGR); - if (key) - { - InternalKey *cached_key = pg_tde_put_key_into_cache(&rel.locator, key); + pg_tde_set_db_file_path(rel.dbOid, db_map_path); - pfree(key); - return cached_key; - } - - return NULL; - } -} + if (access(db_map_path, F_OK) == -1) + return false; -static InternalKey * -pg_tde_get_key_from_cache(const RelFileLocator *rlocator, uint32 key_type) -{ - for (int i = 0; i < tde_rel_key_cache.len; i++) - { - RelKeyCacheRec *rec = tde_rel_key_cache.data + i; + LWLockAcquire(tde_lwlock_enc_keys(), LW_SHARED); - if (RelFileLocatorEquals(rec->locator, *rlocator) && rec->key.rel_type & key_type) - { - return &rec->key; - } - } + result = pg_tde_find_map_entry(&rel, db_map_path, &map_entry); - return NULL; + LWLockRelease(tde_lwlock_enc_keys()); + return result; } /* - * Returns last (the most recent) key for a given relation + * Reads the map entry of the relation and decrypts the key. */ -WALKeyCacheRec * -pg_tde_get_last_wal_key(void) -{ - return tde_wal_key_last_rec; -} - -WALKeyCacheRec * -pg_tde_get_wal_cache_keys(void) -{ - return tde_wal_key_cache; -} - -/* Updates WAL keys cache pointers */ -static void -update_wal_keys_cache(void) -{ - WALKeyCacheRec *wal_rec = tde_wal_key_cache; - RelFileLocator rlocator = GLOBAL_SPACE_RLOCATOR(XLOG_TDE_OID); - - for (int i = 0; i < tde_rel_key_cache.len && wal_rec; i++) - { - RelKeyCacheRec *rec = tde_rel_key_cache.data + i; - - if (RelFileLocatorEquals(rec->locator, rlocator)) - { - wal_rec->key = &rec->key; - wal_rec = wal_rec->next; - } - } -} - InternalKey * -pg_tde_read_last_wal_key(void) +pg_tde_get_smgr_key(RelFileLocator rel) { - RelFileLocator rlocator = GLOBAL_SPACE_RLOCATOR(XLOG_TDE_OID); - char db_map_path[MAXPGPATH] = {0}; - off_t read_pos = 0; - LWLock *lock_pk = tde_lwlock_enc_keys(); + TDEMapEntry map_entry; TDEPrincipalKey *principal_key; - int fd = -1; - int file_idx = 0; - TDEMapEntry *map_entry; - InternalKey *rel_key_data; - off_t fsize; + LWLock *lock_pk = tde_lwlock_enc_keys(); + char db_map_path[MAXPGPATH]; + InternalKey *rel_key; + Assert(rel.relNumber != InvalidRelFileNumber); - LWLockAcquire(lock_pk, LW_EXCLUSIVE); - principal_key = GetPrincipalKey(rlocator.dbOid, LW_EXCLUSIVE); - if (principal_key == NULL) - { - LWLockRelease(lock_pk); - elog(DEBUG1, "init WAL encryption: no principal key"); - return NULL; - } - pg_tde_set_db_file_path(rlocator.dbOid, db_map_path); - - fd = pg_tde_open_file_read(db_map_path, &read_pos); - fsize = lseek(fd, 0, SEEK_END); - /* No keys */ - if (fsize == TDE_FILE_HEADER_SIZE) - { - LWLockRelease(lock_pk); - return NULL; - } + pg_tde_set_db_file_path(rel.dbOid, db_map_path); - file_idx = ((fsize - TDE_FILE_HEADER_SIZE) / MAP_ENTRY_SIZE) - 1; - map_entry = pg_tde_read_one_map_entry2(fd, file_idx, principal_key); - if (!map_entry) - { - LWLockRelease(lock_pk); + if (access(db_map_path, F_OK) == -1) return NULL; - } - - rel_key_data = tde_decrypt_rel_key(principal_key, map_entry); - LWLockRelease(lock_pk); - close(fd); - pfree(map_entry); - - return rel_key_data; -} - -/* Fetches WAL keys from disk and adds them to the WAL cache */ -WALKeyCacheRec * -pg_tde_fetch_wal_keys(XLogRecPtr start_lsn) -{ - RelFileLocator rlocator = GLOBAL_SPACE_RLOCATOR(XLOG_TDE_OID); - char db_map_path[MAXPGPATH] = {0}; - off_t read_pos = 0; - LWLock *lock_pk = tde_lwlock_enc_keys(); - TDEPrincipalKey *principal_key; - int fd = -1; - int keys_count; - WALKeyCacheRec *return_wal_rec = NULL; LWLockAcquire(lock_pk, LW_SHARED); - principal_key = GetPrincipalKey(rlocator.dbOid, LW_SHARED); - if (principal_key == NULL) + + if (!pg_tde_find_map_entry(&rel, db_map_path, &map_entry)) { LWLockRelease(lock_pk); - elog(DEBUG1, "fetch WAL keys: no principal key"); return NULL; } - pg_tde_set_db_file_path(rlocator.dbOid, db_map_path); - - fd = pg_tde_open_file_read(db_map_path, &read_pos); - - keys_count = (lseek(fd, 0, SEEK_END) - TDE_FILE_HEADER_SIZE) / MAP_ENTRY_SIZE; - /* - * If there is no keys, return a fake one (with the range 0-infinity) so - * the reader won't try to check the disk all the time. This for the - * walsender in case if WAL is unencrypted and never was. + * Get/generate a principal key, create the key for relation and get the + * encrypted key with bytes to write + * + * We should hold the lock until the internal key is loaded to be sure the + * retrieved key was encrypted with the obtained principal key. Otherwise, + * the next may happen: - GetPrincipalKey returns key "PKey_1". - Some + * other process rotates the Principal key and re-encrypt an Internal key + * with "PKey_2". - We read the Internal key and decrypt it with "PKey_1" + * (that's what we've got). As the result we return an invalid Internal + * key. */ - if (keys_count == 0) - { - InternalKey *cached_key; - WALKeyCacheRec *wal_rec; - InternalKey stub_key = { - .start_lsn = InvalidXLogRecPtr, - }; - - cached_key = pg_tde_put_key_into_cache(&rlocator, &stub_key); - wal_rec = pg_tde_add_wal_key_to_cache(cached_key, InvalidXLogRecPtr); - - LWLockRelease(lock_pk); - close(fd); - return wal_rec; - } - - for (int file_idx = 0; file_idx < keys_count; file_idx++) - { - TDEMapEntry *map_entry = pg_tde_read_one_map_entry2(fd, file_idx, principal_key); - - /* - * Skip new (just created but not updated by write) and invalid keys - */ - if (map_entry->enc_key.start_lsn != InvalidXLogRecPtr && - WALKeyIsValid(&map_entry->enc_key) && - map_entry->enc_key.start_lsn >= start_lsn) - { - InternalKey *rel_key_data = tde_decrypt_rel_key(principal_key, map_entry); - InternalKey *cached_key = pg_tde_put_key_into_cache(&rlocator, rel_key_data); - WALKeyCacheRec *wal_rec; - - pfree(rel_key_data); + principal_key = GetPrincipalKey(rel.dbOid, LW_SHARED); + if (principal_key == NULL) + ereport(ERROR, + errmsg("principal key not configured"), + errhint("Use pg_tde_set_key_using_database_key_provider() or pg_tde_set_key_using_global_key_provider() to configure one.")); + rel_key = tde_decrypt_rel_key(principal_key, &map_entry); - wal_rec = pg_tde_add_wal_key_to_cache(cached_key, map_entry->enc_key.start_lsn); - if (!return_wal_rec) - return_wal_rec = wal_rec; - } - pfree(map_entry); - } LWLockRelease(lock_pk); - close(fd); - - return return_wal_rec; -} - -static WALKeyCacheRec * -pg_tde_add_wal_key_to_cache(InternalKey *cached_key, XLogRecPtr start_lsn) -{ - WALKeyCacheRec *wal_rec; -#ifndef FRONTEND - MemoryContext oldCtx; - - oldCtx = MemoryContextSwitchTo(TopMemoryContext); -#endif - wal_rec = palloc0_object(WALKeyCacheRec); -#ifndef FRONTEND - MemoryContextSwitchTo(oldCtx); -#endif - wal_rec->start_lsn = start_lsn; - wal_rec->end_lsn = MaxXLogRecPtr; - wal_rec->key = cached_key; - wal_rec->crypt_ctx = NULL; - if (!tde_wal_key_last_rec) - { - tde_wal_key_last_rec = wal_rec; - tde_wal_key_cache = tde_wal_key_last_rec; - } - else - { - tde_wal_key_last_rec->next = wal_rec; - tde_wal_key_last_rec->end_lsn = wal_rec->start_lsn - 1; - tde_wal_key_last_rec = wal_rec; - } - - return wal_rec; -} - -/* - * Add key to cache. See comments on `RelKeyCache`. - */ -static InternalKey * -pg_tde_put_key_into_cache(const RelFileLocator *rlocator, InternalKey *key) -{ - static long pageSize = 0; - RelKeyCacheRec *rec; - MemoryContext oldCtx; - - if (pageSize == 0) - { -#ifndef _SC_PAGESIZE - pageSize = getpagesize(); -#else - pageSize = sysconf(_SC_PAGESIZE); -#endif - } - - if (tde_rel_key_cache.data == NULL) - { -#ifndef FRONTEND - oldCtx = MemoryContextSwitchTo(TopMemoryContext); - tde_rel_key_cache.data = palloc_aligned(pageSize, pageSize, MCXT_ALLOC_ZERO); - MemoryContextSwitchTo(oldCtx); -#else - tde_rel_key_cache.data = aligned_alloc(pageSize, pageSize); - memset(tde_rel_key_cache.data, 0, pageSize); -#endif - - if (mlock(tde_rel_key_cache.data, pageSize) == -1) - elog(ERROR, "could not mlock internal key initial cache page: %m"); - - tde_rel_key_cache.len = 0; - tde_rel_key_cache.cap = (pageSize - 1) / sizeof(RelKeyCacheRec); - } - - /* - * Add another mem page if there is no more room left for another key. We - * allocate `current_memory_size` + 1 page and copy data there. - */ - if (tde_rel_key_cache.len == tde_rel_key_cache.cap) - { - size_t size; - size_t old_size; - RelKeyCacheRec *cachePage; - - old_size = TYPEALIGN(pageSize, tde_rel_key_cache.cap * sizeof(RelKeyCacheRec)); - - /* - * TODO: consider some formula for less allocations when caching a - * lot of objects. But on the other, hand it'll use more memory... - * E.g.: if (old_size < 0x8000) size = old_size * 2; else size = - * TYPEALIGN(pageSize, old_size + ((old_size + 3*256) >> 2)); - * - */ - size = old_size + pageSize; - -#ifndef FRONTEND - oldCtx = MemoryContextSwitchTo(TopMemoryContext); - cachePage = palloc_aligned(size, pageSize, MCXT_ALLOC_ZERO); - MemoryContextSwitchTo(oldCtx); -#else - cachePage = aligned_alloc(pageSize, size); - memset(cachePage, 0, size); -#endif - - memcpy(cachePage, tde_rel_key_cache.data, old_size); - - explicit_bzero(tde_rel_key_cache.data, old_size); - if (munlock(tde_rel_key_cache.data, old_size) == -1) - elog(WARNING, "could not munlock internal key cache pages: %m"); - pfree(tde_rel_key_cache.data); - - tde_rel_key_cache.data = cachePage; - - if (mlock(tde_rel_key_cache.data, size) == -1) - elog(WARNING, "could not mlock internal key cache pages: %m"); - - tde_rel_key_cache.cap = (size - 1) / sizeof(RelKeyCacheRec); - - /* update wal key pointers after moving the cache */ - update_wal_keys_cache(); - } - - rec = tde_rel_key_cache.data + tde_rel_key_cache.len; - - rec->locator = *rlocator; - rec->key = *key; - tde_rel_key_cache.len++; - - return &rec->key; + return rel_key; } diff --git a/contrib/pg_tde/src/access/pg_tde_xlog.c b/contrib/pg_tde/src/access/pg_tde_xlog.c index 9eea9e23a33da..abace30143bac 100644 --- a/contrib/pg_tde/src/access/pg_tde_xlog.c +++ b/contrib/pg_tde/src/access/pg_tde_xlog.c @@ -1,39 +1,32 @@ -/*------------------------------------------------------------------------- - * - * tdeheap_xlog.c - * TDE XLog resource manager - * - * - * IDENTIFICATION - * src/access/pg_tde_xlog.c - * - *------------------------------------------------------------------------- +/* + * TDE XLog resource manager */ #include "postgres.h" -#include "pg_tde.h" -#include "pg_tde_defines.h" #include "access/xlog.h" #include "access/xlog_internal.h" #include "access/xloginsert.h" -#include "catalog/tde_keyring.h" #include "storage/bufmgr.h" #include "storage/shmem.h" #include "utils/guc.h" #include "utils/memutils.h" +#include "access/pg_tde_xlog_keys.h" #include "access/pg_tde_xlog.h" +#include "catalog/tde_global_space.h" +#include "catalog/tde_keyring.h" #include "encryption/enc_tde.h" +#include "pg_tde.h" +#include "pg_tde_defines.h" +#include "smgr/pg_tde_smgr.h" static void tdeheap_rmgr_redo(XLogReaderState *record); static void tdeheap_rmgr_desc(StringInfo buf, XLogReaderState *record); static const char *tdeheap_rmgr_identify(uint8 info); -#define RM_TDERMGR_NAME "test_tdeheap_custom_rmgr" - static const RmgrData tdeheap_rmgr = { - .rm_name = RM_TDERMGR_NAME, + .rm_name = "pg_tde", .rm_redo = tdeheap_rmgr_redo, .rm_desc = tdeheap_rmgr_desc, .rm_identify = tdeheap_rmgr_identify, @@ -45,52 +38,55 @@ RegisterTdeRmgr(void) RegisterCustomRmgr(RM_TDERMGR_ID, &tdeheap_rmgr); } -/* - * TDE fork XLog - */ static void tdeheap_rmgr_redo(XLogReaderState *record) { uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK; - if (info == XLOG_TDE_ADD_RELATION_KEY) + if (info == XLOG_TDE_CREATE_RELATION_KEY) { XLogRelKey *xlrec = (XLogRelKey *) XLogRecGetData(record); - pg_tde_write_key_map_entry_redo(&xlrec->mapEntry, &xlrec->pkInfo); + tde_smgr_create_key_redo(&xlrec->rlocator); } else if (info == XLOG_TDE_ADD_PRINCIPAL_KEY) { - TDEPrincipalKeyInfo *mkey = (TDEPrincipalKeyInfo *) XLogRecGetData(record); + TDESignedPrincipalKeyInfo *mkey = (TDESignedPrincipalKeyInfo *) XLogRecGetData(record); - pg_tde_save_principal_key_redo(mkey); + if (mkey->data.databaseId == GLOBAL_DATA_TDE_OID) + pg_tde_save_server_key_redo(mkey); + else + pg_tde_save_principal_key_redo(mkey); } - else if (info == XLOG_TDE_EXTENSION_INSTALL_KEY) + else if (info == XLOG_TDE_DELETE_RELATION_KEY) { - XLogExtensionInstall *xlrec = (XLogExtensionInstall *) XLogRecGetData(record); + XLogRelKey *xlrec = (XLogRelKey *) XLogRecGetData(record); - extension_install_redo(xlrec); + tde_smgr_delete_leftover_key_redo(&xlrec->rlocator); } - - else if (info == XLOG_TDE_ADD_KEY_PROVIDER_KEY) + else if (info == XLOG_TDE_ROTATE_PRINCIPAL_KEY) { - KeyringProviderXLRecord *xlrec = (KeyringProviderXLRecord *) XLogRecGetData(record); + XLogPrincipalKeyRotate *xlrec = (XLogPrincipalKeyRotate *) XLogRecGetData(record); - redo_key_provider_info(xlrec); + xl_tde_perform_rotate_key(xlrec); } - - else if (info == XLOG_TDE_ROTATE_KEY) + else if (info == XLOG_TDE_DELETE_PRINCIPAL_KEY) { - XLogPrincipalKeyRotate *xlrec = (XLogPrincipalKeyRotate *) XLogRecGetData(record); + Oid dbOid = *((Oid *) XLogRecGetData(record)); - xl_tde_perform_rotate_key(xlrec); + pg_tde_delete_principal_key_redo(dbOid); } + else if (info == XLOG_TDE_WRITE_KEY_PROVIDER) + { + KeyringProviderRecordInFile *xlrec = (KeyringProviderRecordInFile *) XLogRecGetData(record); - else if (info == XLOG_TDE_FREE_MAP_ENTRY) + redo_key_provider_info(xlrec); + } + else if (info == XLOG_TDE_INSTALL_EXTENSION) { - RelFileLocator *xlrec = (RelFileLocator *) XLogRecGetData(record); + XLogExtensionInstall *xlrec = (XLogExtensionInstall *) XLogRecGetData(record); - pg_tde_free_key_map_entry(xlrec, 0); + extension_install_redo(xlrec); } else { @@ -103,49 +99,70 @@ tdeheap_rmgr_desc(StringInfo buf, XLogReaderState *record) { uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK; - if (info == XLOG_TDE_ADD_RELATION_KEY) + if (info == XLOG_TDE_CREATE_RELATION_KEY) { XLogRelKey *xlrec = (XLogRelKey *) XLogRecGetData(record); - appendStringInfo(buf, "add tde internal key for relation %u/%u", xlrec->pkInfo.databaseId, xlrec->mapEntry.relNumber); + appendStringInfo(buf, "rel: %u/%u/%u", xlrec->rlocator.spcOid, xlrec->rlocator.dbOid, xlrec->rlocator.relNumber); } - if (info == XLOG_TDE_ADD_PRINCIPAL_KEY) + else if (info == XLOG_TDE_ADD_PRINCIPAL_KEY) { TDEPrincipalKeyInfo *xlrec = (TDEPrincipalKeyInfo *) XLogRecGetData(record); - appendStringInfo(buf, "add tde principal key for db %u", xlrec->databaseId); + appendStringInfo(buf, "db: %u", xlrec->databaseId); } - if (info == XLOG_TDE_EXTENSION_INSTALL_KEY) + else if (info == XLOG_TDE_ROTATE_PRINCIPAL_KEY) { - XLogExtensionInstall *xlrec = (XLogExtensionInstall *) XLogRecGetData(record); + XLogPrincipalKeyRotate *xlrec = (XLogPrincipalKeyRotate *) XLogRecGetData(record); - appendStringInfo(buf, "tde extension install for db %u", xlrec->database_id); + appendStringInfo(buf, "db: %u", xlrec->databaseId); } - if (info == XLOG_TDE_ROTATE_KEY) + else if (info == XLOG_TDE_DELETE_PRINCIPAL_KEY) { - XLogPrincipalKeyRotate *xlrec = (XLogPrincipalKeyRotate *) XLogRecGetData(record); + Oid dbOid = *((Oid *) XLogRecGetData(record)); - appendStringInfo(buf, "rotate principal key for %u", xlrec->databaseId); + appendStringInfo(buf, "db: %u", dbOid); } - if (info == XLOG_TDE_ADD_KEY_PROVIDER_KEY) + else if (info == XLOG_TDE_DELETE_RELATION_KEY) { - KeyringProviderXLRecord *xlrec = (KeyringProviderXLRecord *) XLogRecGetData(record); + XLogRelKey *xlrec = (XLogRelKey *) XLogRecGetData(record); - appendStringInfo(buf, "add key provider %s for %u", xlrec->provider.provider_name, xlrec->database_id); + appendStringInfo(buf, "rel: %u/%u/%u", xlrec->rlocator.spcOid, xlrec->rlocator.dbOid, xlrec->rlocator.relNumber); + } + else if (info == XLOG_TDE_WRITE_KEY_PROVIDER) + { + KeyringProviderRecordInFile *xlrec = (KeyringProviderRecordInFile *) XLogRecGetData(record); + + appendStringInfo(buf, "db: %u, provider id: %d", xlrec->database_id, xlrec->provider.provider_id); + } + else if (info == XLOG_TDE_INSTALL_EXTENSION) + { + XLogExtensionInstall *xlrec = (XLogExtensionInstall *) XLogRecGetData(record); + + appendStringInfo(buf, "db: %u", xlrec->database_id); } } static const char * tdeheap_rmgr_identify(uint8 info) { - if ((info & ~XLR_INFO_MASK) == XLOG_TDE_ADD_RELATION_KEY) - return "XLOG_TDE_ADD_RELATION_KEY"; - - if ((info & ~XLR_INFO_MASK) == XLOG_TDE_ADD_PRINCIPAL_KEY) - return "XLOG_TDE_ADD_PRINCIPAL_KEY"; - - if ((info & ~XLR_INFO_MASK) == XLOG_TDE_EXTENSION_INSTALL_KEY) - return "XLOG_TDE_EXTENSION_INSTALL_KEY"; - - return NULL; + switch (info & ~XLR_INFO_MASK) + { + case XLOG_TDE_CREATE_RELATION_KEY: + return "CREATE_RELATION_KEY"; + case XLOG_TDE_ADD_PRINCIPAL_KEY: + return "ADD_PRINCIPAL_KEY"; + case XLOG_TDE_ROTATE_PRINCIPAL_KEY: + return "ROTATE_PRINCIPAL_KEY"; + case XLOG_TDE_DELETE_RELATION_KEY: + return "DELETE_RELATION_KEY"; + case XLOG_TDE_DELETE_PRINCIPAL_KEY: + return "DELETE_PRINCIPAL_KEY"; + case XLOG_TDE_WRITE_KEY_PROVIDER: + return "WRITE_KEY_PROVIDER"; + case XLOG_TDE_INSTALL_EXTENSION: + return "INSTALL_EXTENSION"; + default: + return NULL; + } } diff --git a/contrib/pg_tde/src/access/pg_tde_xlog_encrypt.c b/contrib/pg_tde/src/access/pg_tde_xlog_encrypt.c deleted file mode 100644 index c41af6ae45b09..0000000000000 --- a/contrib/pg_tde/src/access/pg_tde_xlog_encrypt.c +++ /dev/null @@ -1,378 +0,0 @@ -/*------------------------------------------------------------------------- - * - * pg_tde_xlog_encrypt.c - * Encrypted XLog storage manager - * - * - * IDENTIFICATION - * src/access/pg_tde_xlog_encrypt.c - * - *------------------------------------------------------------------------- - */ - -#include "postgres.h" - -#include "pg_tde.h" -#include "pg_tde_defines.h" -#include "pg_tde_guc.h" -#include "access/xlog.h" -#include "access/xlog_internal.h" -#include "access/xlog_smgr.h" -#include "access/xloginsert.h" -#include "storage/bufmgr.h" -#include "storage/shmem.h" -#include "utils/guc.h" -#include "utils/memutils.h" - -#include "access/pg_tde_tdemap.h" -#include "access/pg_tde_xlog_encrypt.h" -#include "catalog/tde_global_space.h" -#include "encryption/enc_tde.h" - -#ifdef FRONTEND -#include "pg_tde_fe.h" -#else -#include "port/atomics.h" -#endif - -static void SetXLogPageIVPrefix(TimeLineID tli, XLogRecPtr lsn, char *iv_prefix); -static ssize_t tdeheap_xlog_seg_read(int fd, void *buf, size_t count, off_t offset, - TimeLineID tli, XLogSegNo segno, int segSize); -static ssize_t tdeheap_xlog_seg_write(int fd, const void *buf, size_t count, - off_t offset, TimeLineID tli, - XLogSegNo segno); - -static const XLogSmgr tde_xlog_smgr = { - .seg_read = tdeheap_xlog_seg_read, - .seg_write = tdeheap_xlog_seg_write, -}; - -#ifndef FRONTEND -static Size TDEXLogEncryptBuffSize(void); - -/* - * Must be the same as in replication/walsender.c - * - * This is used to calculate the encryption buffer size. - */ -#define MAX_SEND_SIZE (XLOG_BLCKSZ * 16) - -static ssize_t TDEXLogWriteEncryptedPages(int fd, const void *buf, size_t count, - off_t offset, TimeLineID tli, - XLogSegNo segno); - -typedef struct EncryptionStateData -{ - char *segBuf; - char db_map_path[MAXPGPATH]; - pg_atomic_uint64 enc_key_lsn; /* to sync with readers */ -} EncryptionStateData; - -static EncryptionStateData *EncryptionState = NULL; - -/* TODO: can be swapped out to the disk */ -static InternalKey EncryptionKey = -{ - .rel_type = MAP_ENTRY_EMPTY, - .start_lsn = InvalidXLogRecPtr, -}; -static void *EncryptionCryptCtx = NULL; - -static int XLOGChooseNumBuffers(void); - -static int -XLOGChooseNumBuffers(void) -{ - int xbuffers; - - xbuffers = NBuffers / 32; - if (xbuffers > (wal_segment_size / XLOG_BLCKSZ)) - xbuffers = (wal_segment_size / XLOG_BLCKSZ); - if (xbuffers < 8) - xbuffers = 8; - return xbuffers; -} - -/* - * Defines the size of the XLog encryption buffer - */ -static Size -TDEXLogEncryptBuffSize(void) -{ - int xbuffers; - - xbuffers = (XLOGbuffers == -1) ? XLOGChooseNumBuffers() : XLOGbuffers; - return Max(MAX_SEND_SIZE, mul_size(XLOG_BLCKSZ, xbuffers)); -} - -Size -TDEXLogEncryptStateSize(void) -{ - Size sz; - - sz = sizeof(EncryptionStateData); - if (EncryptXLog) - { - sz = add_size(sz, TDEXLogEncryptBuffSize()); - sz = add_size(sz, PG_IO_ALIGN_SIZE); - } - - return sz; -} - -/* - * Alloc memory for the encryption buffer. - * - * It should fit XLog buffers (XLOG_BLCKSZ * wal_buffers). We can't - * (re)alloc this buf in tdeheap_xlog_seg_write() based on the write size as - * it's called in the CRIT section, hence no allocations are allowed. - * - * Access to this buffer happens during XLogWrite() call which should - * be called with WALWriteLock held, hence no need in extra locks. - */ -void -TDEXLogShmemInit(void) -{ - bool foundBuf; - char *allocptr; - - EncryptionState = (EncryptionStateData *) - ShmemInitStruct("TDE XLog Encryption State", - TDEXLogEncryptStateSize(), - &foundBuf); - - memset(EncryptionState, 0, sizeof(EncryptionStateData)); - - if (EncryptXLog) - { - allocptr = ((char *) EncryptionState) + sizeof(EncryptionStateData); - allocptr = (char *) TYPEALIGN(PG_IO_ALIGN_SIZE, allocptr); - EncryptionState->segBuf = allocptr; - - Assert((char *) EncryptionState + TDEXLogEncryptStateSize() >= (char *) EncryptionState->segBuf + TDEXLogEncryptBuffSize()); - } - - pg_atomic_init_u64(&EncryptionState->enc_key_lsn, 0); - - elog(DEBUG1, "pg_tde: initialized encryption buffer %lu bytes", TDEXLogEncryptStateSize()); -} - -/* - * Encrypt XLog page(s) from the buf and write to the segment file. - */ -static ssize_t -TDEXLogWriteEncryptedPages(int fd, const void *buf, size_t count, off_t offset, - TimeLineID tli, XLogSegNo segno) -{ - char iv_prefix[16] = {0,}; - InternalKey *key = &EncryptionKey; - char *enc_buff = EncryptionState->segBuf; - - Assert(count <= TDEXLogEncryptBuffSize()); - -#ifdef TDE_XLOG_DEBUG - elog(DEBUG1, "write encrypted WAL, size: %lu, offset: %ld [%lX], seg: %X/%X, key_start_lsn: %X/%X", - count, offset, offset, LSN_FORMAT_ARGS(segno), LSN_FORMAT_ARGS(key->start_lsn)); -#endif - - SetXLogPageIVPrefix(tli, segno, iv_prefix); - PG_TDE_ENCRYPT_DATA(iv_prefix, offset, - (char *) buf, count, - enc_buff, key, &EncryptionCryptCtx); - - return pg_pwrite(fd, enc_buff, count, offset); -} - -#endif /* !FRONTEND */ - -void -TDEXLogSmgrInit(void) -{ -#ifndef FRONTEND - /* TODO: move to the separate func, it's not an SMGR init */ - InternalKey *key = pg_tde_read_last_wal_key(); - - /* TDOO: clean-up this mess */ - if ((!key && EncryptXLog) || (key && - ((key->rel_type & TDE_KEY_TYPE_WAL_ENCRYPTED && !EncryptXLog) || - (key->rel_type & TDE_KEY_TYPE_WAL_UNENCRYPTED && EncryptXLog)))) - { - pg_tde_create_wal_key(&EncryptionKey, &GLOBAL_SPACE_RLOCATOR(XLOG_TDE_OID), - (EncryptXLog ? TDE_KEY_TYPE_WAL_ENCRYPTED : TDE_KEY_TYPE_WAL_UNENCRYPTED)); - } - else if (key) - { - EncryptionKey = *key; - pfree(key); - pg_atomic_write_u64(&EncryptionState->enc_key_lsn, EncryptionKey.start_lsn); - } - - pg_tde_set_db_file_path(GLOBAL_SPACE_RLOCATOR(XLOG_TDE_OID).dbOid, EncryptionState->db_map_path); - -#endif - SetXLogSmgr(&tde_xlog_smgr); -} - -static ssize_t -tdeheap_xlog_seg_write(int fd, const void *buf, size_t count, off_t offset, - TimeLineID tli, XLogSegNo segno) -{ -#ifndef FRONTEND - - /* - * Set the last (most recent) key's start LSN if not set. - * - * This func called with WALWriteLock held, so no need in any extra sync. - */ - if (EncryptionKey.rel_type & TDE_KEY_TYPE_GLOBAL && - pg_atomic_read_u64(&EncryptionState->enc_key_lsn) == 0) - { - XLogRecPtr lsn; - - XLogSegNoOffsetToRecPtr(segno, offset, wal_segment_size, lsn); - - pg_tde_wal_last_key_set_lsn(lsn, EncryptionState->db_map_path); - EncryptionKey.start_lsn = lsn; - pg_atomic_write_u64(&EncryptionState->enc_key_lsn, lsn); - } - - if (EncryptXLog) - return TDEXLogWriteEncryptedPages(fd, buf, count, offset, tli, segno); - else -#endif - return pg_pwrite(fd, buf, count, offset); -} - -/* - * Read the XLog pages from the segment file and dectypt if need. - */ -static ssize_t -tdeheap_xlog_seg_read(int fd, void *buf, size_t count, off_t offset, - TimeLineID tli, XLogSegNo segno, int segSize) -{ - ssize_t readsz; - char iv_prefix[16] = {0,}; - WALKeyCacheRec *keys = pg_tde_get_wal_cache_keys(); - XLogRecPtr write_key_lsn = 0; - WALKeyCacheRec *curr_key = NULL; - off_t dec_off = 0; - off_t dec_end = 0; - size_t dec_sz = 0; - XLogRecPtr data_start; - XLogRecPtr data_end; - -#ifdef TDE_XLOG_DEBUG - elog(DEBUG1, "read from a WAL segment, size: %lu offset: %ld [%lX], seg: %X/%X", - count, offset, offset, LSN_FORMAT_ARGS(segno)); -#endif - - /* - * Read data from disk - */ - readsz = pg_pread(fd, buf, count, offset); - - if (!keys) - { - /* cache is empty, try to read keys from disk */ - keys = pg_tde_fetch_wal_keys(0); - } - -#ifndef FRONTEND - write_key_lsn = pg_atomic_read_u64(&EncryptionState->enc_key_lsn); -#endif - - if (write_key_lsn != 0) - { - WALKeyCacheRec *last_key = pg_tde_get_last_wal_key(); - - Assert(last_key); - - /* write has generated a new key, need to fetch it */ - if (last_key->start_lsn < write_key_lsn) - { - pg_tde_fetch_wal_keys(write_key_lsn); - - /* in case cache was empty before */ - keys = pg_tde_get_wal_cache_keys(); - } - } - - SetXLogPageIVPrefix(tli, segno, iv_prefix); - - XLogSegNoOffsetToRecPtr(segno, offset, segSize, data_start); - XLogSegNoOffsetToRecPtr(segno, offset + count, segSize, data_end); - - /* - * TODO: this is higly ineffective. We should get rid of linked list and - * search from the last key as this is what the walsender is useing. - */ - curr_key = keys; - while (curr_key) - { -#ifdef TDE_XLOG_DEBUG - elog(DEBUG1, "WAL key %X/%X-%X/%X, encrypted: %s", - LSN_FORMAT_ARGS(curr_key->start_lsn), - LSN_FORMAT_ARGS(curr_key->end_lsn), - curr_key->key->rel_type & TDE_KEY_TYPE_WAL_ENCRYPTED ? "yes" : "no"); -#endif - - if (curr_key->key->start_lsn != InvalidXLogRecPtr && - (curr_key->key->rel_type & TDE_KEY_TYPE_WAL_ENCRYPTED)) - { - /* - * Check if the key's range overlaps with the buffer's and decypt - * the part that does. - */ - if (data_start <= curr_key->end_lsn && curr_key->start_lsn <= data_end) - { - dec_off = XLogSegmentOffset(Max(data_start, curr_key->start_lsn), segSize); - dec_end = XLogSegmentOffset(Min(data_end, curr_key->end_lsn), segSize); - - /* We have reached the end of the segment */ - if (dec_end == 0) - { - dec_end = offset + count; - } - - dec_sz = dec_end - dec_off; - -#ifdef TDE_XLOG_DEBUG - elog(DEBUG1, "decrypt WAL, dec_off: %lu [buff_off %lu], sz: %lu | key %X/%X", - dec_off, offset - dec_off, dec_sz, LSN_FORMAT_ARGS(curr_key->key->start_lsn)); -#endif - PG_TDE_DECRYPT_DATA(iv_prefix, dec_off, - (char *) buf + (offset - dec_off), - dec_sz, (char *) buf + (offset - dec_off), - curr_key->key, &curr_key->crypt_ctx); - - if (dec_off + dec_sz == offset) - { - break; - } - } - } - - curr_key = curr_key->next; - } - - return readsz; -} - -/* IV: TLI(uint32) + XLogRecPtr(uint64)*/ -static inline void -SetXLogPageIVPrefix(TimeLineID tli, XLogRecPtr lsn, char *iv_prefix) -{ - iv_prefix[0] = (tli >> 24); - iv_prefix[1] = ((tli >> 16) & 0xFF); - iv_prefix[2] = ((tli >> 8) & 0xFF); - iv_prefix[3] = (tli & 0xFF); - - iv_prefix[4] = (lsn >> 56); - iv_prefix[5] = ((lsn >> 48) & 0xFF); - iv_prefix[6] = ((lsn >> 40) & 0xFF); - iv_prefix[7] = ((lsn >> 32) & 0xFF); - iv_prefix[8] = ((lsn >> 24) & 0xFF); - iv_prefix[9] = ((lsn >> 16) & 0xFF); - iv_prefix[10] = ((lsn >> 8) & 0xFF); - iv_prefix[11] = (lsn & 0xFF); -} diff --git a/contrib/pg_tde/src/access/pg_tde_xlog_keys.c b/contrib/pg_tde/src/access/pg_tde_xlog_keys.c new file mode 100644 index 0000000000000..06253573fc9ac --- /dev/null +++ b/contrib/pg_tde/src/access/pg_tde_xlog_keys.c @@ -0,0 +1,897 @@ +#include "postgres.h" + +#include +#include + +#include "access/xlog_internal.h" +#include "access/xlog.h" +#include "access/xloginsert.h" +#include "storage/fd.h" +#include "utils/memutils.h" + +#include "access/pg_tde_xlog_keys.h" +#include "access/pg_tde_xlog.h" +#include "catalog/tde_global_space.h" +#include "catalog/tde_principal_key.h" +#include "common/pg_tde_utils.h" +#include "encryption/enc_aes.h" +#include "encryption/enc_tde.h" +#include "utils/palloc.h" + +#ifdef FRONTEND +#include "pg_tde_fe.h" +#endif + +#define PG_TDE_WAL_KEY_FILE_MAGIC 0x014B4557 /* version ID value = WEK 01 */ +#define PG_TDE_WAL_KEY_FILE_NAME "wal_keys" + +typedef struct WalKeyFileHeader +{ + int32 file_version; + TDESignedPrincipalKeyInfo signed_key_info; +} WalKeyFileHeader; + +/* + * Feel free to use the unused fields for something, but beware that existing + * files may contain unexpected values here. Also be aware of alignment if + * changing any of the types as this struct is written/read directly from file. + * + * If changes are made, know that the first two fields are used as AAD when + * encrypting/decrypting existing keys from the key files, so any changes here + * might break existing clusters. + */ +typedef struct WalKeyFileEntry +{ + uint32 _unused1; /* Part of AAD, is 1 or 2 in existing entries */ + uint32 _unused2; /* Part of AAD */ + + uint8 encrypted_key_data[INTERNAL_KEY_LEN]; + uint8 key_base_iv[INTERNAL_KEY_IV_LEN]; + + uint32 range_type; /* WalEncryptionRangeType */ + uint32 _unused3; + WalLocation range_start; + + /* IV and tag used when encrypting the key itself */ + unsigned char entry_iv[MAP_ENTRY_IV_SIZE]; + unsigned char aead_tag[MAP_ENTRY_AEAD_TAG_SIZE]; +} WalKeyFileEntry; + +static WALKeyCacheRec *tde_wal_key_cache = NULL; +static WALKeyCacheRec *tde_wal_prealloc_record = NULL; +static WALKeyCacheRec *tde_wal_key_last_rec = NULL; +static WalEncryptionRange *tde_wal_prealloc_range = NULL; + +static WALKeyCacheRec *pg_tde_add_wal_range_to_cache(WalEncryptionRange *cached_range); +static WalEncryptionRange *pg_tde_wal_range_from_entry(const TDEPrincipalKey *principal_key, WalKeyFileEntry *entry); +static void pg_tde_initialize_wal_key_file_entry(WalKeyFileEntry *entry, const TDEPrincipalKey *principal_key, const WalEncryptionRange *range); +static int pg_tde_open_wal_key_file_basic(const char *filename, int flags, bool ignore_missing); +static int pg_tde_open_wal_key_file_read(const char *filename, bool ignore_missing, off_t *curr_pos); +static int pg_tde_open_wal_key_file_write(const char *filename, const TDESignedPrincipalKeyInfo *signed_key_info, bool truncate, off_t *curr_pos); +static bool pg_tde_read_one_wal_key_file_entry(int fd, WalKeyFileEntry *entry, off_t *offset); +static void pg_tde_read_one_wal_key_file_entry2(int fd, int32 key_index, WalKeyFileEntry *entry); +static void pg_tde_wal_key_file_header_read(const char *filename, int fd, WalKeyFileHeader *fheader, off_t *bytes_read); +static int pg_tde_wal_key_file_header_write(const char *filename, int fd, const TDESignedPrincipalKeyInfo *signed_key_info, off_t *bytes_written); +static void pg_tde_write_one_wal_key_file_entry(int fd, const WalKeyFileEntry *entry, off_t *offset, const char *db_map_path); +static void pg_tde_write_wal_key_file_entry(const WalEncryptionRange *range, const TDEPrincipalKey *principal_key); + +static char * +get_wal_key_file_path(void) +{ + static char wal_key_file_path[MAXPGPATH] = {0}; + + if (strlen(wal_key_file_path) == 0) + join_path_components(wal_key_file_path, pg_tde_get_data_dir(), PG_TDE_WAL_KEY_FILE_NAME); + + return wal_key_file_path; +} + +void +pg_tde_free_wal_key_cache(void) +{ + WALKeyCacheRec *rec = tde_wal_key_cache; + + while (rec != NULL) + { + WALKeyCacheRec *next = rec->next; + + pfree(rec); + rec = next; + } + + tde_wal_key_cache = NULL; + tde_wal_key_last_rec = NULL; +} + +void +pg_tde_wal_last_range_set_location(WalLocation loc) +{ + LWLock *lock_pk = tde_lwlock_enc_keys(); + int fd; + off_t read_pos, + write_pos, + last_key_idx; + + LWLockAcquire(lock_pk, LW_EXCLUSIVE); + + fd = pg_tde_open_wal_key_file_write(get_wal_key_file_path(), NULL, false, &read_pos); + + last_key_idx = ((lseek(fd, 0, SEEK_END) - sizeof(WalKeyFileHeader)) / sizeof(WalKeyFileEntry)) - 1; + write_pos = sizeof(WalKeyFileHeader) + + (last_key_idx * sizeof(WalKeyFileEntry)) + + offsetof(WalKeyFileEntry, range_start); + + if (pg_pwrite(fd, &loc, sizeof(WalLocation), write_pos) != sizeof(WalLocation)) + { + ereport(ERROR, + errcode_for_file_access(), + errmsg("could not write WAL key data file: %m")); + } + + /* + * If the last key overlaps with the previous, then invalidate the + * previous one. This may (and will) happen on replicas because it + * re-reads primary's data from the beginning of the segment on restart. + */ + if (last_key_idx > 0) + { + off_t prev_key_pos = sizeof(WalKeyFileHeader) + ((last_key_idx - 1) * sizeof(WalKeyFileEntry)); + WalKeyFileEntry prev_entry; + + if (pg_pread(fd, &prev_entry, sizeof(WalKeyFileEntry), prev_key_pos) != sizeof(WalKeyFileEntry)) + { + ereport(ERROR, + errcode_for_file_access(), + errmsg("could not read previous WAL key: %m")); + } + + if (wal_location_cmp(prev_entry.range_start, loc) >= 0) + { + prev_entry.range_type = WAL_ENCRYPTION_RANGE_INVALID; + + if (pg_pwrite(fd, &prev_entry, sizeof(WalKeyFileEntry), prev_key_pos) != sizeof(WalKeyFileEntry)) + { + ereport(ERROR, + errcode_for_file_access(), + errmsg("could not write invalidated key: %m")); + } + } + } + + if (pg_fsync(fd) != 0) + { + ereport(data_sync_elevel(ERROR), + errcode_for_file_access(), + errmsg("could not fsync file: %m")); + } + + LWLockRelease(lock_pk); + CloseTransientFile(fd); +} + +/* + * Generates a new internal key for WAL and adds it to the key file. + * + * We have a special function for WAL as it is being called during recovery + * start so there should be no XLog records and aquired locks. The key is + * always created with start_lsn = InvalidXLogRecPtr. Which will be updated + * with the actual lsn by the first WAL write. + */ +void +pg_tde_create_wal_range(WalEncryptionRange *range, WalEncryptionRangeType type) +{ + TDEPrincipalKey *principal_key; + + LWLockAcquire(tde_lwlock_enc_keys(), LW_EXCLUSIVE); + + principal_key = GetPrincipalKey(GLOBAL_DATA_TDE_OID, LW_EXCLUSIVE); + if (principal_key == NULL) + { + ereport(ERROR, + errmsg("principal key not configured"), + errhint("Use pg_tde_set_server_key_using_global_key_provider() to configure one.")); + } + + /* TODO: no need in generating key if WAL_ENCRYPTION_RANGE_UNENCRYPTED */ + range->type = type; + range->start.lsn = InvalidXLogRecPtr; + range->start.tli = 0; + range->end.lsn = MaxXLogRecPtr; + range->end.tli = MaxTimeLineID; + + pg_tde_generate_internal_key(&range->key); + + pg_tde_write_wal_key_file_entry(range, principal_key); + +#ifdef FRONTEND + free(principal_key); +#endif + LWLockRelease(tde_lwlock_enc_keys()); +} + +/* + * Returns last (the most recent) key for a given relation + */ +WALKeyCacheRec * +pg_tde_get_last_wal_key(void) +{ + return tde_wal_key_last_rec; +} + +WALKeyCacheRec * +pg_tde_get_wal_cache_keys(void) +{ + return tde_wal_key_cache; +} + +WalEncryptionRange * +pg_tde_read_last_wal_range(void) +{ + off_t read_pos = 0; + LWLock *lock_pk = tde_lwlock_enc_keys(); + TDEPrincipalKey *principal_key; + int fd; + int file_idx; + WalKeyFileEntry entry; + WalEncryptionRange *range; + off_t fsize; + + LWLockAcquire(lock_pk, LW_EXCLUSIVE); + principal_key = GetPrincipalKey(GLOBAL_DATA_TDE_OID, LW_EXCLUSIVE); + if (principal_key == NULL) + { + LWLockRelease(lock_pk); + elog(DEBUG1, "init WAL encryption: no principal key"); + return NULL; + } + + fd = pg_tde_open_wal_key_file_read(get_wal_key_file_path(), false, &read_pos); + fsize = lseek(fd, 0, SEEK_END); + /* No keys */ + if (fsize == sizeof(WalKeyFileHeader)) + { +#ifdef FRONTEND + pfree(principal_key); +#endif + LWLockRelease(lock_pk); + CloseTransientFile(fd); + return NULL; + } + + file_idx = ((fsize - sizeof(WalKeyFileHeader)) / sizeof(WalKeyFileEntry)) - 1; + pg_tde_read_one_wal_key_file_entry2(fd, file_idx, &entry); + + range = pg_tde_wal_range_from_entry(principal_key, &entry); +#ifdef FRONTEND + pfree(principal_key); +#endif + LWLockRelease(lock_pk); + CloseTransientFile(fd); + + return range; +} + +/* Fetches WAL keys from disk and adds them to the WAL cache */ +WALKeyCacheRec * +pg_tde_fetch_wal_keys(WalLocation start) +{ + off_t read_pos = 0; + LWLock *lock_pk = tde_lwlock_enc_keys(); + TDEPrincipalKey *principal_key; + int fd; + int keys_count; + WALKeyCacheRec *return_wal_rec = NULL; + + LWLockAcquire(lock_pk, LW_SHARED); + principal_key = GetPrincipalKey(GLOBAL_DATA_TDE_OID, LW_SHARED); + if (principal_key == NULL) + { + LWLockRelease(lock_pk); + elog(DEBUG1, "fetch WAL keys: no principal key"); + return NULL; + } + + fd = pg_tde_open_wal_key_file_read(get_wal_key_file_path(), false, &read_pos); + + keys_count = (lseek(fd, 0, SEEK_END) - sizeof(WalKeyFileHeader)) / sizeof(WalKeyFileEntry); + + /* + * If there is no keys, return a fake one (with the range 0-infinity) so + * the reader won't try to check the disk all the time. This for the + * walsender in case if WAL is unencrypted and never was. + */ + if (keys_count == 0) + { + WALKeyCacheRec *wal_rec; + WalEncryptionRange stub_range = { + .start = {.tli = 0,.lsn = InvalidXLogRecPtr}, + .end = {.tli = MaxTimeLineID,.lsn = MaxXLogRecPtr}, + }; + + wal_rec = pg_tde_add_wal_range_to_cache(&stub_range); + +#ifdef FRONTEND + /* The backend frees it after copying to the cache. */ + pfree(principal_key); +#endif + LWLockRelease(lock_pk); + CloseTransientFile(fd); + return wal_rec; + } + + for (int file_idx = 0; file_idx < keys_count; file_idx++) + { + WalKeyFileEntry entry; + + pg_tde_read_one_wal_key_file_entry2(fd, file_idx, &entry); + + /* + * Skip new (just created but not updated by write) and invalid keys + */ + if (entry.range_type != WAL_ENCRYPTION_RANGE_INVALID && + wal_location_valid(entry.range_start) && + wal_location_cmp(entry.range_start, start) >= 0) + { + WalEncryptionRange *range = pg_tde_wal_range_from_entry(principal_key, &entry); + WALKeyCacheRec *wal_rec; + + wal_rec = pg_tde_add_wal_range_to_cache(range); + + pfree(range); + + if (!return_wal_rec) + return_wal_rec = wal_rec; + } + } +#ifdef FRONTEND + pfree(principal_key); +#endif + LWLockRelease(lock_pk); + CloseTransientFile(fd); + + return return_wal_rec; +} + +/* + * In special cases, we have to add one more record to the WAL key cache during write (in the critical section, when we can't allocate). + * This method is a helper to deal with that: when adding a single key, we potentially allocate 2 records. + * These variables help preallocate them, so in the critical section we can just use the already allocated objects, and update the cache with them. + * + * While this is somewhat a hack, it is also simple, safe, reliable, and way easier to implement than to refactor the cache or the decryption/encryption loop. + */ +void +pg_tde_wal_cache_extra_palloc(void) +{ +#ifndef FRONTEND + MemoryContext oldCtx; + + oldCtx = MemoryContextSwitchTo(TopMemoryContext); +#endif + if (tde_wal_prealloc_record == NULL) + { + tde_wal_prealloc_record = palloc0_object(WALKeyCacheRec); + } + if (tde_wal_prealloc_range == NULL) + { + tde_wal_prealloc_range = palloc0_object(WalEncryptionRange); + } +#ifndef FRONTEND + MemoryContextSwitchTo(oldCtx); +#endif +} + +static WALKeyCacheRec * +pg_tde_add_wal_range_to_cache(WalEncryptionRange *range) +{ + WALKeyCacheRec *wal_rec; +#ifndef FRONTEND + MemoryContext oldCtx; + + oldCtx = MemoryContextSwitchTo(TopMemoryContext); +#endif + wal_rec = tde_wal_prealloc_record == NULL ? palloc0_object(WALKeyCacheRec) : tde_wal_prealloc_record; + tde_wal_prealloc_record = NULL; +#ifndef FRONTEND + MemoryContextSwitchTo(oldCtx); +#endif + + wal_rec->range = *range; + wal_rec->crypt_ctx = NULL; + if (!tde_wal_key_last_rec) + { + tde_wal_key_last_rec = wal_rec; + tde_wal_key_cache = tde_wal_key_last_rec; + } + else + { + tde_wal_key_last_rec->next = wal_rec; + tde_wal_key_last_rec->range.end = wal_rec->range.start; + tde_wal_key_last_rec = wal_rec; + } + + return wal_rec; +} + +static int +pg_tde_open_wal_key_file_basic(const char *filename, + int flags, + bool ignore_missing) +{ + int fd; + + fd = OpenTransientFile(filename, flags); + if (fd < 0 && !(errno == ENOENT && ignore_missing == true)) + { + ereport(ERROR, + errcode_for_file_access(), + errmsg("could not open WAL key file \"%s\": %m", filename)); + } + + return fd; +} + +static int +pg_tde_open_wal_key_file_read(const char *filename, + bool ignore_missing, + off_t *curr_pos) +{ + int fd; + WalKeyFileHeader fheader; + off_t bytes_read = 0; + + Assert(LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_SHARED) || + LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_EXCLUSIVE)); + + fd = pg_tde_open_wal_key_file_basic(filename, O_RDONLY | PG_BINARY, ignore_missing); + if (ignore_missing && fd < 0) + return fd; + + pg_tde_wal_key_file_header_read(filename, fd, &fheader, &bytes_read); + *curr_pos = bytes_read; + + return fd; +} + +static int +pg_tde_open_wal_key_file_write(const char *filename, + const TDESignedPrincipalKeyInfo *signed_key_info, + bool truncate, + off_t *curr_pos) +{ + int fd; + WalKeyFileHeader fheader; + off_t bytes_read = 0; + off_t bytes_written = 0; + int file_flags = O_RDWR | O_CREAT | PG_BINARY | (truncate ? O_TRUNC : 0); + + Assert(LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_EXCLUSIVE)); + + fd = pg_tde_open_wal_key_file_basic(filename, file_flags, false); + + pg_tde_wal_key_file_header_read(filename, fd, &fheader, &bytes_read); + + /* In case it's a new file, let's add the header now. */ + if (bytes_read == 0 && signed_key_info) + pg_tde_wal_key_file_header_write(filename, fd, signed_key_info, &bytes_written); + + *curr_pos = bytes_read + bytes_written; + return fd; +} + +static void +pg_tde_wal_key_file_header_read(const char *filename, + int fd, + WalKeyFileHeader *fheader, + off_t *bytes_read) +{ + Assert(fheader); + + *bytes_read = pg_pread(fd, fheader, sizeof(WalKeyFileHeader), 0); + + /* File is empty */ + if (*bytes_read == 0) + return; + + if (*bytes_read != sizeof(WalKeyFileHeader) + || fheader->file_version != PG_TDE_WAL_KEY_FILE_MAGIC) + { + ereport(FATAL, + errcode_for_file_access(), + errmsg("WAL key file \"%s\" is corrupted: %m", filename)); + } +} + +static int +pg_tde_wal_key_file_header_write(const char *filename, + int fd, + const TDESignedPrincipalKeyInfo *signed_key_info, + off_t *bytes_written) +{ + WalKeyFileHeader fheader; + + Assert(signed_key_info); + + fheader.file_version = PG_TDE_WAL_KEY_FILE_MAGIC; + fheader.signed_key_info = *signed_key_info; + *bytes_written = pg_pwrite(fd, &fheader, sizeof(WalKeyFileHeader), 0); + + if (*bytes_written != sizeof(WalKeyFileHeader)) + { + ereport(ERROR, + errcode_for_file_access(), + errmsg("could not write WAL key file \"%s\": %m", filename)); + } + + if (pg_fsync(fd) != 0) + { + ereport(data_sync_elevel(ERROR), + errcode_for_file_access(), + errmsg("could not fsync file \"%s\": %m", filename)); + } + + ereport(DEBUG2, errmsg("Wrote the header to %s", filename)); + + return fd; +} + +/* + * Returns true if an entry is found or false if we have reached the end of the + * file. + */ +static bool +pg_tde_read_one_wal_key_file_entry(int fd, + WalKeyFileEntry *entry, + off_t *offset) +{ + off_t bytes_read = 0; + + Assert(entry); + Assert(offset); + + bytes_read = pg_pread(fd, entry, sizeof(WalKeyFileEntry), *offset); + + /* We've reached the end of the file. */ + if (bytes_read != sizeof(WalKeyFileEntry)) + return false; + + *offset += bytes_read; + + return true; +} + +static void +pg_tde_read_one_wal_key_file_entry2(int fd, + int32 key_index, + WalKeyFileEntry *entry) +{ + off_t read_pos; + + read_pos = sizeof(WalKeyFileHeader) + key_index * sizeof(WalKeyFileEntry); + if (pg_pread(fd, entry, sizeof(WalKeyFileEntry), read_pos) != sizeof(WalKeyFileEntry)) + { + ereport(FATAL, + errcode_for_file_access(), + errmsg("could not find the required key at index %d in WAL key file \"%s\": %m", + key_index, get_wal_key_file_path())); + } +} + +static void +pg_tde_write_wal_key_file_entry(const WalEncryptionRange *range, + const TDEPrincipalKey *principal_key) +{ + int fd; + off_t curr_pos = 0; + WalKeyFileEntry write_entry; + TDESignedPrincipalKeyInfo signed_key_Info; + + pg_tde_sign_principal_key_info(&signed_key_Info, principal_key); + + /* Open and validate file for basic correctness. */ + fd = pg_tde_open_wal_key_file_write(get_wal_key_file_path(), &signed_key_Info, false, &curr_pos); + + /* WAL keys are always added at the end of the file */ + curr_pos = lseek(fd, 0, SEEK_END); + + /* Initialize WAL key file entry and encrypt key */ + pg_tde_initialize_wal_key_file_entry(&write_entry, principal_key, range); + + /* Write the given entry at curr_pos; i.e. the free entry. */ + pg_tde_write_one_wal_key_file_entry(fd, &write_entry, &curr_pos, get_wal_key_file_path()); + + CloseTransientFile(fd); +} + +static WalEncryptionRange * +pg_tde_wal_range_from_entry(const TDEPrincipalKey *principal_key, WalKeyFileEntry *entry) +{ + WalEncryptionRange *range = tde_wal_prealloc_range == NULL ? palloc0_object(WalEncryptionRange) : tde_wal_prealloc_range; + + tde_wal_prealloc_range = NULL; + + Assert(principal_key); + + range->type = entry->range_type; + range->start = entry->range_start; + range->end.tli = MaxTimeLineID; + range->end.lsn = MaxXLogRecPtr; + + memcpy(range->key.base_iv, entry->key_base_iv, INTERNAL_KEY_IV_LEN); + if (!AesGcmDecrypt(principal_key->keyData, + entry->entry_iv, MAP_ENTRY_IV_SIZE, + (unsigned char *) entry, offsetof(WalKeyFileEntry, encrypted_key_data), + entry->encrypted_key_data, INTERNAL_KEY_LEN, + range->key.key, + entry->aead_tag, MAP_ENTRY_AEAD_TAG_SIZE)) + ereport(ERROR, + errmsg("Failed to decrypt key, incorrect principal key or corrupted key file")); + + return range; +} + +static void +pg_tde_write_one_wal_key_file_entry(int fd, + const WalKeyFileEntry *entry, + off_t *offset, + const char *db_map_path) +{ + int bytes_written = 0; + + bytes_written = pg_pwrite(fd, entry, sizeof(WalKeyFileEntry), *offset); + + if (bytes_written != sizeof(WalKeyFileEntry)) + { + ereport(ERROR, + errcode_for_file_access(), + errmsg("could not write WAL key file \"%s\": %m", db_map_path)); + } + if (pg_fsync(fd) != 0) + { + ereport(data_sync_elevel(ERROR), + errcode_for_file_access(), + errmsg("could not fsync file \"%s\": %m", db_map_path)); + } + + *offset += bytes_written; +} + +static void +pg_tde_initialize_wal_key_file_entry(WalKeyFileEntry *entry, + const TDEPrincipalKey *principal_key, + const WalEncryptionRange *range) +{ + Assert(range->type == WAL_ENCRYPTION_RANGE_ENCRYPTED || range->type == WAL_ENCRYPTION_RANGE_UNENCRYPTED); + + memset(entry, 0, sizeof(WalKeyFileEntry)); + + /* + * We set this field here so that existing file entries will be consistent + * and future use of this field easier. Some existing entries will have 2 + * here. + */ + entry->_unused1 = 1; + + entry->range_type = range->type; + entry->range_start = range->start; + memcpy(entry->key_base_iv, range->key.base_iv, INTERNAL_KEY_IV_LEN); + + if (!RAND_bytes(entry->entry_iv, MAP_ENTRY_IV_SIZE)) + ereport(ERROR, + errcode(ERRCODE_INTERNAL_ERROR), + errmsg("could not generate iv for wal key file entry: %s", ERR_error_string(ERR_get_error(), NULL))); + + AesGcmEncrypt(principal_key->keyData, + entry->entry_iv, MAP_ENTRY_IV_SIZE, + (unsigned char *) entry, offsetof(WalKeyFileEntry, encrypted_key_data), + range->key.key, INTERNAL_KEY_LEN, + entry->encrypted_key_data, + entry->aead_tag, MAP_ENTRY_AEAD_TAG_SIZE); +} + +#ifndef FRONTEND +/* + * Rotate keys and generates the WAL record for it. + */ +void +pg_tde_perform_rotate_server_key(const TDEPrincipalKey *principal_key, + const TDEPrincipalKey *new_principal_key, + bool write_xlog) +{ + TDESignedPrincipalKeyInfo new_signed_key_info; + off_t old_curr_pos, + new_curr_pos; + int old_fd, + new_fd; + char tmp_path[MAXPGPATH]; + + Assert(principal_key); + Assert(principal_key->keyInfo.databaseId == GLOBAL_DATA_TDE_OID); + + pg_tde_sign_principal_key_info(&new_signed_key_info, new_principal_key); + + snprintf(tmp_path, MAXPGPATH, "%s.r", get_wal_key_file_path()); + + old_fd = pg_tde_open_wal_key_file_read(get_wal_key_file_path(), false, &old_curr_pos); + new_fd = pg_tde_open_wal_key_file_write(tmp_path, &new_signed_key_info, true, &new_curr_pos); + + /* Read all entries until EOF */ + while (1) + { + WalEncryptionRange *range; + WalKeyFileEntry read_map_entry; + WalKeyFileEntry write_map_entry; + + if (!pg_tde_read_one_wal_key_file_entry(old_fd, &read_map_entry, &old_curr_pos)) + break; + + /* Decrypt and re-encrypt key */ + range = pg_tde_wal_range_from_entry(principal_key, &read_map_entry); + pg_tde_initialize_wal_key_file_entry(&write_map_entry, new_principal_key, range); + pg_tde_write_one_wal_key_file_entry(new_fd, &write_map_entry, &new_curr_pos, tmp_path); + pfree(range); + } + + CloseTransientFile(old_fd); + CloseTransientFile(new_fd); + + /* + * Do the final step - replace the current WAL key file with the file with + * new data. + */ + durable_rename(tmp_path, get_wal_key_file_path(), ERROR); + + /* + * We do WAL writes past the event ("the write behind logging") rather + * than before ("the write ahead") because we need logging here only for + * replication purposes. The rotation results in data written and fsynced + * to disk. Which in most cases would happen way before it's written to + * the WAL disk file. As WAL will be flushed at the end of the + * transaction, on its commit, hence after this function returns (there is + * also a bg writer, but the commit is what is guaranteed). And it makes + * sense to replicate the event only after its effect has been + * successfully applied to the source. + */ + if (write_xlog) + { + XLogPrincipalKeyRotate xlrec; + + xlrec.databaseId = new_principal_key->keyInfo.databaseId; + xlrec.keyringId = new_principal_key->keyInfo.keyringId; + memcpy(xlrec.keyName, new_principal_key->keyInfo.name, sizeof(new_principal_key->keyInfo.name)); + + XLogBeginInsert(); + XLogRegisterData((char *) &xlrec, sizeof(XLogPrincipalKeyRotate)); + XLogInsert(RM_TDERMGR_ID, XLOG_TDE_ROTATE_PRINCIPAL_KEY); + } +} +#endif + +#ifndef FRONTEND +void +pg_tde_save_server_key_redo(const TDESignedPrincipalKeyInfo *signed_key_info) +{ + int fd; + off_t curr_pos; + + LWLockAcquire(tde_lwlock_enc_keys(), LW_EXCLUSIVE); + + fd = pg_tde_open_wal_key_file_write(get_wal_key_file_path(), signed_key_info, false, &curr_pos); + CloseTransientFile(fd); + + LWLockRelease(tde_lwlock_enc_keys()); +} +#endif + +/* + * Creates the key file and saves the principal key information. + * + * If the file pre-exist, it truncates the file before adding principal key + * information. + * + * The caller must have an EXCLUSIVE LOCK on the files before calling this function. + * + * write_xlog: if true, the function will write an XLOG record about the + * principal key addition. We may want to skip this during server recovery/startup + * or in some other cases when WAL writes are not allowed. + */ +void +pg_tde_save_server_key(const TDEPrincipalKey *principal_key, bool write_xlog) +{ + int fd; + off_t curr_pos = 0; + TDESignedPrincipalKeyInfo signed_key_Info; + + pg_tde_sign_principal_key_info(&signed_key_Info, principal_key); + +#ifndef FRONTEND + if (write_xlog) + { + XLogBeginInsert(); + XLogRegisterData((char *) &signed_key_Info, sizeof(TDESignedPrincipalKeyInfo)); + XLogInsert(RM_TDERMGR_ID, XLOG_TDE_ADD_PRINCIPAL_KEY); + } +#endif + + fd = pg_tde_open_wal_key_file_write(get_wal_key_file_path(), &signed_key_Info, true, &curr_pos); + CloseTransientFile(fd); +} + +/* + * Get the principal key from the key file. The caller must hold + * a LW_SHARED or higher lock on files before calling this function. + */ +TDESignedPrincipalKeyInfo * +pg_tde_get_server_key_info(void) +{ + int fd; + WalKeyFileHeader fheader; + TDESignedPrincipalKeyInfo *signed_key_info = NULL; + off_t bytes_read = 0; + + /* + * Ensuring that we always open the file in binary mode. The caller must + * specify other flags for reading, writing or creating the file. + */ + fd = pg_tde_open_wal_key_file_basic(get_wal_key_file_path(), O_RDONLY, true); + + /* The file does not exist. */ + if (fd < 0) + return NULL; + + pg_tde_wal_key_file_header_read(get_wal_key_file_path(), fd, &fheader, &bytes_read); + + CloseTransientFile(fd); + + /* + * It's not a new file. So we can copy the principal key info from the + * header + */ + if (bytes_read > 0) + { + signed_key_info = palloc_object(TDESignedPrincipalKeyInfo); + *signed_key_info = fheader.signed_key_info; + } + + return signed_key_info; +} + +int +pg_tde_count_wal_ranges_in_file(void) +{ + File fd; + off_t curr_pos = 0; + WalKeyFileEntry entry; + int count = 0; + + Assert(LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_SHARED) || + LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_EXCLUSIVE)); + + fd = pg_tde_open_wal_key_file_read(get_wal_key_file_path(), true, &curr_pos); + if (fd < 0) + return count; + + while (pg_tde_read_one_wal_key_file_entry(fd, &entry, &curr_pos)) + count++; + + CloseTransientFile(fd); + + return count; +} + +#ifndef FRONTEND +void +pg_tde_delete_server_key(void) +{ + Oid dbOid = GLOBAL_DATA_TDE_OID; + + Assert(LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_EXCLUSIVE)); + Assert(pg_tde_count_wal_ranges_in_file() == 0); + + XLogBeginInsert(); + XLogRegisterData((char *) &dbOid, sizeof(Oid)); + XLogInsert(RM_TDERMGR_ID, XLOG_TDE_DELETE_PRINCIPAL_KEY); + + /* Remove whole key map file */ + durable_unlink(get_wal_key_file_path(), ERROR); +} +#endif diff --git a/contrib/pg_tde/src/access/pg_tde_xlog_smgr.c b/contrib/pg_tde/src/access/pg_tde_xlog_smgr.c new file mode 100644 index 0000000000000..c8e62a1edc144 --- /dev/null +++ b/contrib/pg_tde/src/access/pg_tde_xlog_smgr.c @@ -0,0 +1,636 @@ +/* + * Encrypted XLog storage manager + */ + +#include "postgres.h" + +#include "access/xlog.h" +#include "access/xlog_internal.h" +#include "access/xlog_smgr.h" +#include "access/xloginsert.h" +#include "storage/bufmgr.h" +#include "storage/shmem.h" +#include "utils/guc.h" +#include "utils/memutils.h" + +#include "access/pg_tde_xlog_keys.h" +#include "access/pg_tde_xlog_smgr.h" +#include "catalog/tde_global_space.h" +#include "encryption/enc_tde.h" +#include "pg_tde.h" +#include "pg_tde_defines.h" + +#ifdef FRONTEND +#include "pg_tde_fe.h" +#else +#include "port/atomics.h" +#endif + +static void CalcXLogPageIVPrefix(TimeLineID tli, XLogRecPtr lsn, const unsigned char *base_iv, char *iv_prefix); +static ssize_t tdeheap_xlog_seg_read(int fd, void *buf, size_t count, off_t offset, + TimeLineID tli, XLogSegNo segno, int segSize); +static ssize_t tdeheap_xlog_seg_write(int fd, const void *buf, size_t count, + off_t offset, TimeLineID tli, + XLogSegNo segno, int segSize); + +static const XLogSmgr tde_xlog_smgr = { + .seg_read = tdeheap_xlog_seg_read, + .seg_write = tdeheap_xlog_seg_write, +}; + +static void *EncryptionCryptCtx = NULL; + +/* TODO: can be swapped out to the disk */ +static WalEncryptionRange CurrentWalEncryptionRange = { + .type = WAL_ENCRYPTION_RANGE_INVALID, + .start = {.tli = 0,.lsn = InvalidXLogRecPtr}, + .end = {.tli = MaxTimeLineID,.lsn = MaxXLogRecPtr}, +}; + +/* + * Must be the same as in replication/walsender.c + * + * This is used to calculate the encryption buffer size. + */ +#define MAX_SEND_SIZE (XLOG_BLCKSZ * 16) + +/* + * Since the backend code needs to use atomics and shared memory while the + * frotnend code cannot do that we provide two separate implementations of some + * data structures and the functions which operate one them. + */ + +#ifndef FRONTEND + +typedef struct EncryptionStateData +{ + /* + * To sync with readers. We sync on LSN only and TLI here just to + * communicate its value to readers. + */ + pg_atomic_uint32 enc_key_tli; + pg_atomic_uint64 enc_key_lsn; +} EncryptionStateData; + +static EncryptionStateData *EncryptionState = NULL; + +static char *EncryptionBuf; + +static XLogRecPtr +TDEXLogGetEncKeyLsn() +{ + return (XLogRecPtr) pg_atomic_read_u64(&EncryptionState->enc_key_lsn); +} + +static TimeLineID +TDEXLogGetEncKeyTli() +{ + return (TimeLineID) pg_atomic_read_u32(&EncryptionState->enc_key_tli); +} + +static void +TDEXLogSetEncKeyLocation(WalLocation loc) +{ + /* + * Write TLI first and then LSN. The barrier ensures writes won't be + * reordered. When reading, the opposite must be done (with a matching + * barrier in between), so we always see a valid TLI after observing a + * valid LSN. + */ + pg_atomic_write_u32(&EncryptionState->enc_key_tli, loc.tli); + pg_write_barrier(); + pg_atomic_write_u64(&EncryptionState->enc_key_lsn, loc.lsn); +} + +static Size TDEXLogEncryptBuffSize(void); + +static int XLOGChooseNumBuffers(void); + +static int +XLOGChooseNumBuffers(void) +{ + int xbuffers; + + xbuffers = NBuffers / 32; + if (xbuffers > (wal_segment_size / XLOG_BLCKSZ)) + xbuffers = (wal_segment_size / XLOG_BLCKSZ); + if (xbuffers < 8) + xbuffers = 8; + return xbuffers; +} + +/* + * Defines the size of the XLog encryption buffer + */ +static Size +TDEXLogEncryptBuffSize(void) +{ + int xbuffers; + + xbuffers = (XLOGbuffers == -1) ? XLOGChooseNumBuffers() : XLOGbuffers; + return Max(MAX_SEND_SIZE, mul_size(XLOG_BLCKSZ, xbuffers)); +} + +Size +TDEXLogEncryptStateSize(void) +{ + Size sz; + + sz = sizeof(EncryptionStateData); + sz = add_size(sz, TDEXLogEncryptBuffSize()); + sz = add_size(sz, PG_IO_ALIGN_SIZE); + + return sz; +} + +/* + * Alloc memory for the encryption buffer. + * + * It should fit XLog buffers (XLOG_BLCKSZ * wal_buffers). We can't + * (re)alloc this buf in tdeheap_xlog_seg_write() based on the write size as + * it's called in the CRIT section, hence no allocations are allowed. + * + * Access to this buffer happens during XLogWrite() call which should + * be called with WALWriteLock held, hence no need in extra locks. + */ +void +TDEXLogShmemInit(void) +{ + bool found; + + Assert(LWLockHeldByMeInMode(AddinShmemInitLock, LW_EXCLUSIVE)); + + EncryptionState = (EncryptionStateData *) + ShmemInitStruct("TDE XLog Encryption State", + TDEXLogEncryptStateSize(), + &found); + + if (!found) + { + memset(EncryptionState, 0, sizeof(EncryptionStateData)); + + pg_atomic_init_u64(&EncryptionState->enc_key_lsn, 0); + + elog(DEBUG1, "pg_tde: initialized encryption buffer %lu bytes", TDEXLogEncryptStateSize()); + } + + EncryptionBuf = (char *) TYPEALIGN(PG_IO_ALIGN_SIZE, ((char *) EncryptionState) + sizeof(EncryptionStateData)); + + Assert((char *) EncryptionState + TDEXLogEncryptStateSize() >= (char *) EncryptionBuf + TDEXLogEncryptBuffSize()); +} + +#else /* !FRONTEND */ + +typedef struct EncryptionStateData +{ + TimeLineID enc_key_tli; + XLogRecPtr enc_key_lsn; +} EncryptionStateData; + +static EncryptionStateData EncryptionStateD = {0}; + +static EncryptionStateData *EncryptionState = &EncryptionStateD; + +static char EncryptionBuf[MAX_SEND_SIZE]; + +static XLogRecPtr +TDEXLogGetEncKeyLsn() +{ + return (XLogRecPtr) EncryptionState->enc_key_lsn; +} + +static TimeLineID +TDEXLogGetEncKeyTli() +{ + return (TimeLineID) EncryptionState->enc_key_tli; +} + +static void +TDEXLogSetEncKeyLocation(WalLocation loc) +{ + EncryptionState->enc_key_tli = loc.tli; + EncryptionState->enc_key_lsn = loc.lsn; +} + +#endif /* FRONTEND */ + +void +TDEXLogSmgrInit() +{ + SetXLogSmgr(&tde_xlog_smgr); +} + +void +TDEXLogSmgrInitWrite(bool encrypt_xlog) +{ + WalEncryptionRange *range; + WALKeyCacheRec *keys; + + /* + * If the postmaster have done a "soft" restart after a backend crash, we + * may have inherited the cache in a weird state. Clearing the cache here + * ensures we reinitialize all keys from disk. + */ + pg_tde_free_wal_key_cache(); + + range = pg_tde_read_last_wal_range(); + + /* + * Always generate a new key on starting PostgreSQL to protect against + * attacks on CTR ciphers based on comparing the WAL generated by two + * divergent copies of the same cluster. + */ + if (encrypt_xlog) + { + pg_tde_create_wal_range(&CurrentWalEncryptionRange, WAL_ENCRYPTION_RANGE_ENCRYPTED); + } + else if (range && range->type == WAL_ENCRYPTION_RANGE_ENCRYPTED) + { + pg_tde_create_wal_range(&CurrentWalEncryptionRange, WAL_ENCRYPTION_RANGE_UNENCRYPTED); + } + else if (range) + { + CurrentWalEncryptionRange = *range; + TDEXLogSetEncKeyLocation(CurrentWalEncryptionRange.start); + } + + keys = pg_tde_get_wal_cache_keys(); + + if (keys == NULL) + { + WalLocation start = {.tli = 1,.lsn = 0}; + + /* cache is empty, prefetch keys from disk */ + pg_tde_fetch_wal_keys(start); + pg_tde_wal_cache_extra_palloc(); + } + + if (range) + pfree(range); +} + +/* + * Used by pg_tde_restore_encrypt to simulate being constantly in recovery + * since the command does not have access to any information about if we are in + * recovery or not. + * + * Creates a dummy key which points at the very end of the WAL stream. + */ +void +TDEXLogSmgrInitWriteOldKeys() +{ + WALKeyCacheRec *keys; + WalEncryptionRange dummy = { + .type = WAL_ENCRYPTION_RANGE_UNENCRYPTED, + .start = {.tli = MaxTimeLineID,.lsn = MaxXLogRecPtr}, + .end = {.tli = MaxTimeLineID,.lsn = MaxXLogRecPtr}, + }; + + CurrentWalEncryptionRange = dummy; + TDEXLogSetEncKeyLocation(dummy.start); + + keys = pg_tde_get_wal_cache_keys(); + + if (keys == NULL) + { + WalLocation start = {.tli = 1,.lsn = 0}; + + /* cache is empty, prefetch keys from disk */ + pg_tde_fetch_wal_keys(start); + } +} + +/* + * Encrypt XLog page(s) from the buf and write to the segment file. + */ +static ssize_t +TDEXLogWriteEncryptedPagesOldKeys(int fd, const void *buf, size_t count, off_t offset, + TimeLineID tli, XLogSegNo segno, int segSize) +{ + char *enc_buff = EncryptionBuf; + +#ifndef FRONTEND + Assert(count <= TDEXLogEncryptBuffSize()); +#endif + + /* Copy the data as-is, as we might have unencrypted parts */ + memcpy(enc_buff, buf, count); + + /* + * This method potentially allocates, but only in very early execution Can + * happen during a write, but we have one more cache entry preallocated. + */ + TDEXLogCryptBuffer(buf, enc_buff, count, offset, tli, segno, segSize); + + return pg_pwrite(fd, enc_buff, count, offset); +} + +/* + * Encrypt XLog page(s) from the buf and write to the segment file. + */ +static ssize_t +TDEXLogWriteEncryptedPages(int fd, const void *buf, size_t count, off_t offset, + TimeLineID tli, XLogSegNo segno) +{ + char iv_prefix[16]; + WalEncryptionRange *range = &CurrentWalEncryptionRange; + char *enc_buff = EncryptionBuf; + +#ifndef FRONTEND + Assert(count <= TDEXLogEncryptBuffSize()); +#endif + +#ifdef TDE_XLOG_DEBUG + elog(DEBUG1, "write encrypted WAL, size: %lu, offset: %ld [%lX], seg: %X/%X, key_start_lsn: %u_%X/%X", + count, offset, offset, LSN_FORMAT_ARGS(segno), range->start.tli, LSN_FORMAT_ARGS(range->start.lsn)); +#endif + + CalcXLogPageIVPrefix(tli, segno, range->key.base_iv, iv_prefix); + + pg_tde_stream_crypt(iv_prefix, + offset, + (char *) buf, + count, + enc_buff, + range->key.key, + &EncryptionCryptCtx); + + return pg_pwrite(fd, enc_buff, count, offset); +} + +/* + * Set the last (most recent) key's start location if not set. + */ +bool +tde_ensure_xlog_key_location(WalLocation loc) +{ + bool lastKeyUsable; + bool afterWriteKey; + WalLocation writeKeyLoc; +#ifdef FRONTEND + bool crashRecovery = false; +#else + bool crashRecovery = GetRecoveryState() == RECOVERY_STATE_CRASH; +#endif + + /* + * On backend this called with WALWriteLock held, so no need in any extra + * sync. + */ + writeKeyLoc.lsn = TDEXLogGetEncKeyLsn(); + pg_read_barrier(); + writeKeyLoc.tli = TDEXLogGetEncKeyTli(); + + lastKeyUsable = (writeKeyLoc.lsn != 0); + afterWriteKey = wal_location_cmp(writeKeyLoc, loc) <= 0; + + if (CurrentWalEncryptionRange.type != WAL_ENCRYPTION_RANGE_INVALID && !lastKeyUsable && afterWriteKey && !crashRecovery) + { + WALKeyCacheRec *last_key = pg_tde_get_last_wal_key(); + + if (last_key == NULL || last_key->range.start.lsn < loc.lsn) + { + pg_tde_wal_last_range_set_location(loc); + CurrentWalEncryptionRange.start = loc; + TDEXLogSetEncKeyLocation(CurrentWalEncryptionRange.start); + lastKeyUsable = true; + } + } + + return lastKeyUsable && afterWriteKey; +} + +static ssize_t +tdeheap_xlog_seg_write(int fd, const void *buf, size_t count, off_t offset, + TimeLineID tli, XLogSegNo segno, int segSize) +{ + bool lastKeyUsable; + WalLocation loc = {.tli = tli}; + + XLogSegNoOffsetToRecPtr(segno, offset, segSize, loc.lsn); + lastKeyUsable = tde_ensure_xlog_key_location(loc); + + if (!lastKeyUsable && CurrentWalEncryptionRange.type != WAL_ENCRYPTION_RANGE_INVALID) + { + return TDEXLogWriteEncryptedPagesOldKeys(fd, buf, count, offset, tli, segno, segSize); + } + else if (CurrentWalEncryptionRange.type == WAL_ENCRYPTION_RANGE_ENCRYPTED) + { + return TDEXLogWriteEncryptedPages(fd, buf, count, offset, tli, segno); + } + else + { + return pg_pwrite(fd, buf, count, offset); + } +} + +/* + * Read the XLog pages from the segment file and dectypt if need. + */ +static ssize_t +tdeheap_xlog_seg_read(int fd, void *buf, size_t count, off_t offset, + TimeLineID tli, XLogSegNo segno, int segSize) +{ + ssize_t readsz; + +#ifdef TDE_XLOG_DEBUG + elog(DEBUG1, "read from a WAL segment, size: %lu offset: %ld [%lX], seg: %u_%X/%X", + count, offset, offset, tli, LSN_FORMAT_ARGS(segno)); +#endif + + readsz = pg_pread(fd, buf, count, offset); + + if (readsz <= 0) + return readsz; + + TDEXLogCryptBuffer(buf, buf, count, offset, tli, segno, segSize); + + return readsz; +} + +/* + * [De]Crypt buffer if needed based on provided segment offset, number and TLI + */ +void +TDEXLogCryptBuffer(const void *buf, void *out_buf, size_t count, off_t offset, + TimeLineID tli, XLogSegNo segno, int segSize) +{ + WALKeyCacheRec *keys = pg_tde_get_wal_cache_keys(); + XLogRecPtr write_key_lsn; + WalLocation data_end = {.tli = tli}; + WalLocation data_start = {.tli = tli}; + + if (keys == NULL) + { + WalLocation start = {.tli = 1,.lsn = 0}; + + /* cache is empty, try to read keys from disk */ + keys = pg_tde_fetch_wal_keys(start); + } + + /* + * The barrier ensures that we always read a vaild TLI after the valid + * LSN. See the comment in TDEXLogSetEncKeyLocation() + */ + write_key_lsn = TDEXLogGetEncKeyLsn(); + pg_read_barrier(); + + if (!XLogRecPtrIsInvalid(write_key_lsn)) + { + WALKeyCacheRec *last_key = pg_tde_get_last_wal_key(); + WalLocation write_loc = {.tli = TDEXLogGetEncKeyTli(),.lsn = write_key_lsn}; + + /* write has generated a new key, need to fetch it */ + if (last_key != NULL && wal_location_cmp(last_key->range.start, write_loc) < 0) + { + pg_tde_fetch_wal_keys(write_loc); + + /* in case cache was empty before */ + keys = pg_tde_get_wal_cache_keys(); + } + } + + XLogSegNoOffsetToRecPtr(segno, offset, segSize, data_start.lsn); + XLogSegNoOffsetToRecPtr(segno, offset + count, segSize, data_end.lsn); + + /* + * TODO: this is higly ineffective. We should get rid of linked list and + * search from the last key as this is what the walsender is useing. + */ + for (WALKeyCacheRec *curr_key = keys; curr_key != NULL; curr_key = curr_key->next) + { +#ifdef TDE_XLOG_DEBUG + elog(DEBUG1, "WAL key %u_%X/%X - %u_%X/%X, encrypted: %s", + curr_key->range.start.tli, LSN_FORMAT_ARGS(curr_key->range.start.lsn), + curr_key->range.end.tli, LSN_FORMAT_ARGS(curr_key->range.end.lsn), + curr_key->range.type == WAL_ENCRYPTION_RANGE_ENCRYPTED ? "yes" : "no"); +#endif + + if (wal_location_valid(curr_key->range.start) && + curr_key->range.type == WAL_ENCRYPTION_RANGE_ENCRYPTED) + { + /* + * Check if the key's range overlaps with the buffer's and decypt + * the part that does. + */ + if (wal_location_cmp(data_start, curr_key->range.end) < 0 && + wal_location_cmp(data_end, curr_key->range.start) > 0) + { + char iv_prefix[16]; + + /* + * We want to calculate where to start / end encrypting. This + * depends on two factors: + * + * 1. Where does the key start / end + * + * 2. Where does the data start / end + * + * And this is complicated even more by the fact that keys can + * span multiple timelines: if a key starts at TLI 3 LSN 100, + * and ends at TLI 5 LSN 200 it means it is used for + * everything between two, including the entire TLI 4. For + * example, TLI 4 LSN 1 and TLI 4 LSN 400 are both encrypted + * with it, even through 1 is less than 100 and 400 is greater + * than 200. + * + * The below min/max calculations make sure that if the key + * and data are in the same timeline, we only encrypt/decrypt + * in the range of the current key - if the data is longer in + * some directions, we use multiple keys. But if the data + * starts/ends in a TLI "within" the key, we can safely + * decrypt/encrypt from the beginning / until the end, as it + * is part of the key. + */ + + size_t end_lsn = + data_end.tli < curr_key->range.end.tli ? data_end.lsn : + Min(data_end.lsn, curr_key->range.end.lsn); + size_t start_lsn = + data_start.tli > curr_key->range.start.tli ? data_start.lsn : + Max(data_start.lsn, curr_key->range.start.lsn); + off_t dec_off = + XLogSegmentOffset(start_lsn, segSize); + off_t dec_end = + XLogSegmentOffset(end_lsn, segSize); + size_t dec_sz; + char *dec_buf = (char *) buf + (dec_off - offset); + char *o_buf = (char *) out_buf + (dec_off - offset); + + Assert(dec_off >= offset); + + CalcXLogPageIVPrefix(tli, segno, curr_key->range.key.base_iv, + iv_prefix); + + /* + * We have reached the end of the segment + */ + if (dec_end == 0) + { + dec_end = offset + count; + } + + Assert(dec_end > dec_off); + dec_sz = dec_end - dec_off; + +#ifdef TDE_XLOG_DEBUG + elog(DEBUG1, "decrypt WAL, dec_off: %lu [buff_off %lu], sz: %lu | key %u_%X/%X", + dec_off, dec_off - offset, dec_sz, curr_key->range.start.tli, LSN_FORMAT_ARGS(curr_key->range.start.lsn)); +#endif + + pg_tde_stream_crypt(iv_prefix, + dec_off, + dec_buf, + dec_sz, + o_buf, + curr_key->range.key.key, + &curr_key->crypt_ctx); + } + } + } +} + +union u128cast +{ + char a[16]; + unsigned __int128 i; +}; + +/* + * Calculate the start IV for an XLog segmenet. + * + * IV: (TLI(uint32) + XLogRecPtr(uint64)) + BaseIV(uint8[12]) + * + * TODO: Make the calculation more like OpenSSL's CTR withot any gaps and + * preferrably without zeroing the lowest bytes for the base IV. + * + * TODO: This code vectorizes poorly in both gcc and clang. + */ +static void +CalcXLogPageIVPrefix(TimeLineID tli, XLogRecPtr lsn, const unsigned char *base_iv, char *iv_prefix) +{ + union u128cast base; + union u128cast iv; + unsigned __int128 offset; + + for (int i = 0; i < 16; i++) +#ifdef WORDS_BIGENDIAN + base.a[i] = base_iv[i]; +#else + base.a[i] = base_iv[15 - i]; +#endif + + /* We do not support wrapping addition in Aes128EncryptedZeroBlocks() */ + base.i &= ~(((unsigned __int128) 1) << 32); + + offset = (((unsigned __int128) tli) << 112) | (((unsigned __int128) lsn) << 32); + + iv.i = base.i + offset; + + for (int i = 0; i < 16; i++) +#ifdef WORDS_BIGENDIAN + iv_prefix[i] = iv.a[i]; +#else + iv_prefix[i] = iv.a[15 - i]; +#endif +} diff --git a/contrib/pg_tde/src/bin/pg_tde_archive_decrypt.c b/contrib/pg_tde/src/bin/pg_tde_archive_decrypt.c new file mode 100644 index 0000000000000..786919a3150ce --- /dev/null +++ b/contrib/pg_tde/src/bin/pg_tde_archive_decrypt.c @@ -0,0 +1,240 @@ +#include "postgres_fe.h" + +#include "access/xlog_internal.h" +#include "access/xlog_smgr.h" +#include "common/logging.h" +#include "common/percentrepl.h" + +#include "access/pg_tde_fe_init.h" +#include "access/pg_tde_xlog_smgr.h" + +#define TMPFS_DIRECTORY "/dev/shm" + +static bool +is_segment(const char *filename) +{ + return strspn(filename, "0123456789ABCDEF") == XLOG_FNAME_LEN && + (filename[XLOG_FNAME_LEN] == '\0' || strcmp(filename + XLOG_FNAME_LEN, ".partial") == 0); +} + +static void +write_decrypted_segment(const char *segpath, const char *segname, const char *tmppath) +{ + int segfd; + int tmpfd; + off_t fsize; + int r; + int w; + TimeLineID tli; + XLogSegNo segno; + PGAlignedXLogBlock buf; + off_t pos = 0; + + segfd = open(segpath, O_RDONLY | PG_BINARY, 0); + if (segfd < 0) + pg_fatal("could not open file \"%s\": %m", segpath); + + tmpfd = open(tmppath, O_CREAT | O_WRONLY | PG_BINARY, 0666); + if (tmpfd < 0) + pg_fatal("could not open file \"%s\": %m", tmppath); + + /* + * WalSegSz extracted from the first page header but it might be + * encrypted. But we need to know the segment seize to decrypt it (it's + * required for encryption offset calculations). So we get the segment + * size from the file's actual size. XLogLongPageHeaderData->xlp_seg_size + * there is "just as a cross-check" anyway. + */ + fsize = lseek(segfd, 0, SEEK_END); + XLogFromFileName(segname, &tli, &segno, fsize); + + r = xlog_smgr->seg_read(segfd, buf.data, XLOG_BLCKSZ, pos, tli, segno, fsize); + + if (r == XLOG_BLCKSZ) + { + XLogLongPageHeader longhdr = (XLogLongPageHeader) buf.data; + int walsegsz = longhdr->xlp_seg_size; + + if (walsegsz != fsize) + pg_fatal("mismatch of segment size in WAL file \"%s\" (header: %d bytes, file size: %ld bytes)", + segname, walsegsz, fsize); + + if (!IsValidWalSegSize(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), + segname, 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", + segpath); + else + pg_fatal("could not read file \"%s\": read %d of %d", + segpath, r, XLOG_BLCKSZ); + + pos += r; + + w = write(tmpfd, buf.data, XLOG_BLCKSZ); + + if (w < 0) + pg_fatal("could not write file \"%s\": %m", tmppath); + else if (w != r) + pg_fatal("could not write file \"%s\": wrote %d of %d", + tmppath, w, r); + + while (1) + { + r = xlog_smgr->seg_read(segfd, buf.data, XLOG_BLCKSZ, pos, tli, segno, fsize); + + if (r == 0) + break; + else if (r < 0) + pg_fatal("could not read file \"%s\": %m", segpath); + + pos += r; + + w = write(tmpfd, buf.data, r); + + if (w < 0) + pg_fatal("could not write file \"%s\": %m", tmppath); + else if (w != r) + pg_fatal("could not write file \"%s\": wrote %d of %d", + tmppath, w, r); + } + + close(tmpfd); + close(segfd); +} + +static void +usage(const char *progname) +{ + printf(_("%s wraps an archive command to give the command unencrypted WAL.\n\n"), progname); + printf(_("Usage:\n")); + printf(_(" %s [OPTION]\n"), progname); + printf(_(" %s DEST-NAME SOURCE-PATH ARCHIVE-COMMAND\n"), progname); + printf(_("\nOptions:\n")); + printf(_(" -V, --version output version information, then exit\n")); + printf(_(" -?, --help show this help, then exit\n")); + printf(_(" DEST-NAME name of the WAL file to send to archive\n")); + printf(_(" SOURCE-PATH path of the source WAL segment to decrypt\n")); + printf(_(" ARCHIVE-COMMAND archive command to wrap, %%p will be replaced with the\n" + " absolute path of the decrypted WAL segment, %%f with the name\n")); + printf(_("\n")); + printf(_("Note that any %%f or %%p parameter in ARCHIVE-COMMAND will have to be escaped\n" + "as %%%%f or %%%%p respectively if used as archive_command in postgresql.conf.\n" + "e.g.\n" + " archive_command='%s %%f %%p \"cp %%%%p /mnt/server/archivedir/%%%%f\"'\n" + "or\n" + " archive_command='%s %%f %%p \"pgbackrest --stanza=your_stanza archive-push %%%%p\"'\n" + "\n"), progname, progname); +} + +int +main(int argc, char *argv[]) +{ + const char *progname; + char *targetname; + char *sourcepath; + char *command; + char *sep; + char *sourcename; + char tmpdir[MAXPGPATH] = TMPFS_DIRECTORY "/pg_tde_archiveXXXXXX"; + char tmppath[MAXPGPATH]; + bool issegment; + int rc; + + pg_logging_init(argv[0]); + progname = get_progname(argv[0]); + + if (argc > 1) + { + if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0) + { + usage(progname); + exit(0); + } + if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0) + { + puts("pg_tde_archive_decrypt (PostgreSQL) " PG_VERSION); + exit(0); + } + } + + if (argc != 4) + { + pg_log_error("wrong number of arguments, 3 expected"); + pg_log_error_detail("Try \"%s --help\" for more information.", progname); + exit(1); + } + + targetname = argv[1]; + sourcepath = argv[2]; + command = argv[3]; + + pg_tde_fe_init("pg_tde"); + TDEXLogSmgrInit(); + + sep = strrchr(sourcepath, '/'); + + if (sep != NULL) + sourcename = sep + 1; + else + sourcename = sourcepath; + + issegment = is_segment(targetname); + + if (issegment) + { + char *s; + + if (mkdtemp(tmpdir) == NULL) + pg_fatal("could not create temporary directory \"%s\": %m", tmpdir); + + s = stpcpy(tmppath, tmpdir); + s = stpcpy(s, "/"); + stpcpy(s, sourcename); + + command = replace_percent_placeholders(command, + "ARCHIVE-COMMAND", "fp", + targetname, tmppath); + + write_decrypted_segment(sourcepath, targetname, tmppath); + } + else + command = replace_percent_placeholders(command, + "ARCHIVE-COMMAND", "fp", + targetname, sourcepath); + rc = system(command); + + if (rc != 0) + { + if (rc == -1) + pg_fatal("ARCHIVE-COMMAND \"%s\" failed: %m", command); + else if (WIFEXITED(rc)) + pg_fatal("ARCHIVE-COMMAND \"%s\" failed with exit code %d", + command, WEXITSTATUS(rc)); + else if (WIFSIGNALED(rc)) + pg_fatal("ARCHIVE-COMMAND \"%s\" was terminated by signal %d: %s", + command, WTERMSIG(rc), pg_strsignal(WTERMSIG(rc))); + else + pg_fatal("ARCHIVE-COMMAND \"%s\" exited with unrecognized status %d", + command, rc); + } + + free(command); + + if (issegment) + { + if (unlink(tmppath) < 0) + pg_log_warning("could not remove file \"%s\": %m", tmppath); + if (rmdir(tmpdir) < 0) + pg_log_warning("could not remove directory \"%s\": %m", tmpdir); + } + + return 0; +} diff --git a/contrib/pg_tde/src/bin/pg_tde_change_key_provider.c b/contrib/pg_tde/src/bin/pg_tde_change_key_provider.c new file mode 100644 index 0000000000000..58db875f0ac27 --- /dev/null +++ b/contrib/pg_tde/src/bin/pg_tde_change_key_provider.c @@ -0,0 +1,262 @@ +#include "postgres_fe.h" + +#include +#include + +#include "common/controldata_utils.h" +#include "common/logging.h" +#include "pg_getopt.h" + +#include "catalog/tde_global_space.h" +#include "catalog/tde_keyring.h" +#include "common/pg_tde_utils.h" +#include "pg_tde.h" + +static const char *progname; + +static void +usage(void) +{ + printf(_("%s changes the configuration of a pg_tde key provider\n\n"), progname); + printf(_("Usage:\n")); + printf(_(" %s [-D ] \n\n"), progname); + printf(_(" Where can be file, vault-v2 or kmip\n\n")); + printf(_("Depending on the provider type, the complete parameter list is:\n\n")); + printf(_("pg_tde_change_key_provider [-D ] file \n")); + printf(_("pg_tde_change_key_provider [-D ] vault-v2 []\n")); + printf(_("pg_tde_change_key_provider [-D ] kmip []\n")); + printf(_("\nUse dbOid %d for global key providers.\n\n"), GLOBAL_DATA_TDE_OID); + printf(_("WARNING:\n")); + printf(_(" This tool only changes the values, without properly XLogging the changes, or validating that keys can be fetched using them. Only use it in case the database is inaccessible and can't be started.\n")); +} + +#define BUFFER_SIZE 1024 + +static bool +build_json(char *buffer, int count,...) +{ + va_list args; + char *ptr; + + va_start(args, count); + + ptr = strcat(buffer, "{"); + + for (int i = 0; i < count; ++i) + { + /* TODO: no validation about the paramters at all... */ + /* not much we can do without a proper JSON library */ + /* If the JSON is incorrect, it will fail a bit later when */ + /* we try to backread it */ + const char *key = va_arg(args, const char *); + const char *value = va_arg(args, const char *); + + bool addQuotes = value == NULL || (value[0] != '{' && value[0] != '"'); + + if (i != 0) + { + ptr = strcat(ptr, ","); + } + + ptr = strcat(ptr, "\""); + ptr = strcat(ptr, key); + ptr = strcat(ptr, "\":"); + + if (addQuotes) + { + ptr = strcat(ptr, "\""); + } + if (value != NULL) + { + ptr = strcat(ptr, value); + } + if (addQuotes) + { + ptr = strcat(ptr, "\""); + } + if (ptr - buffer > BUFFER_SIZE) + { + pg_log_error("configuration too long"); + return false; + } + } + va_end(args); + + ptr = strcat(ptr, "}"); + + if (ptr - buffer > BUFFER_SIZE) + { + pg_log_error("configuration too long"); + return false; + } + + return true; +} + +int +main(int argc, char *argv[]) +{ + static struct option long_options[] = { + {"pgdata", required_argument, NULL, 'D'}, + {NULL, 0, NULL, 0} + }; + + int c; + int option_index; + char *datadir = NULL; + Oid db_oid; + char *provider_name; + char *new_provider_type; + char json[BUFFER_SIZE * 2] = {0}; + ControlFileData *controlfile; + bool crc_ok; + char tdedir[MAXPGPATH] = {0}; + char *cptr = tdedir; + KeyringProviderRecordInFile record; + + pg_logging_init(argv[0]); + set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_tde_change_key_provider")); + progname = get_progname(argv[0]); + + if (argc > 1) + { + if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0) + { + usage(); + exit(0); + } + if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0) + { + puts("pg_tde_change_key_provider (PostgreSQL) " PG_VERSION); + exit(0); + } + } + + while ((c = getopt_long(argc, argv, "D:", long_options, &option_index)) != -1) + { + switch (c) + { + case 'D': + datadir = optarg; + break; + default: + /* getopt_long already emitted a complaint */ + pg_log_error_hint("Try \"%s --help\" for more information.", progname); + exit(1); + } + } + + if (datadir == NULL) + { + datadir = getenv("PGDATA"); + + /* If no datadir was specified, and none could be found, error out */ + if (datadir == NULL) + { + pg_log_error("no data directory specified"); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); + exit(1); + } + } + + if (argc - optind < 3) + { + pg_log_error("too few arguments"); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); + exit(1); + } + + db_oid = atoi(argv[optind++]); + provider_name = argv[optind++]; + new_provider_type = argv[optind++]; + + if (strcmp("file", new_provider_type) == 0) + { + if (argc - optind != 1) + { + pg_log_error("wrong number of arguments for \"%s\"", new_provider_type); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); + exit(1); + } + + if (!build_json(json, 1, "path", argv[optind])) + { + exit(1); + } + } + else if (strcmp("vault-v2", new_provider_type) == 0) + { + if (argc - optind != 3 && argc - optind != 4) + { + pg_log_error("wrong number of arguments for \"%s\"", new_provider_type); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); + exit(1); + } + + if (!build_json(json, 4, + "url", argv[optind], + "mountPath", argv[optind + 1], + "tokenPath", argv[optind + 2], + "caPath", (argc - optind > 3 ? argv[optind + 3] : ""))) + { + exit(1); + } + } + else if (strcmp("kmip", new_provider_type) == 0) + { + if (argc - optind != 4 && argc - optind != 5) + { + pg_log_error("wrong number of arguments for \"%s\"", new_provider_type); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); + exit(1); + } + + if (!build_json(json, 5, + "host", argv[optind], + "port", argv[optind + 1], + "certPath", argv[optind + 2], + "keyPath", argv[optind + 3], + "caPath", argc - optind > 4 ? argv[optind + 4] : "")) + { + exit(1); + } + } + else + { + pg_log_error("unknown provider type \"%s\"", new_provider_type); + pg_log_error_hint("Try \"%s --help\" for more information.", progname); + exit(1); + } + + /* + * Check if cluster is running. This way we can be sure we have no + * concurrent modifcations of the key providers. Note that this doesn't + * guard against someone starting the cluster concurrently. + */ + controlfile = get_controlfile(datadir, &crc_ok); + if (!crc_ok) + pg_fatal("pg_control CRC value is incorrect"); + + if (controlfile->state != DB_SHUTDOWNED && + controlfile->state != DB_SHUTDOWNED_IN_RECOVERY) + pg_fatal("cluster must be shut down"); + + pfree(controlfile); + cptr = strcat(cptr, datadir); + cptr = strcat(cptr, "/"); + cptr = strcat(cptr, PG_TDE_DATA_DIR); + pg_tde_set_data_dir(tdedir); + + if (get_keyring_info_file_record_by_name(provider_name, db_oid, &record) == false) + pg_fatal("provder \"%s\" not found for database %u", provider_name, db_oid); + + record.provider.provider_type = get_keyring_provider_from_typename(new_provider_type); + memset(record.provider.options, 0, sizeof(record.provider.options)); + strncpy(record.provider.options, json, sizeof(record.provider.options)); + + write_key_provider_info(&record, false); + + printf("Key provider updated successfully!\n"); + + return 0; +} diff --git a/contrib/pg_tde/src/bin/pg_tde_restore_encrypt.c b/contrib/pg_tde/src/bin/pg_tde_restore_encrypt.c new file mode 100644 index 0000000000000..1d5c51f4a7bda --- /dev/null +++ b/contrib/pg_tde/src/bin/pg_tde_restore_encrypt.c @@ -0,0 +1,235 @@ +#include "postgres_fe.h" + +#include "access/xlog_internal.h" +#include "access/xlog_smgr.h" +#include "common/logging.h" +#include "common/percentrepl.h" + +#include "access/pg_tde_fe_init.h" +#include "access/pg_tde_xlog_smgr.h" + +#define TMPFS_DIRECTORY "/dev/shm" + +/* + * Partial WAL segments are archived but never automatically fetched from the + * archive by the restore_command. We support them here for symmetry though + * since if someone would want to fetch a partial segment from the archive and + * write it to pg_wal then they would want it encrypted. + */ +static bool +is_segment(const char *filename) +{ + return strspn(filename, "0123456789ABCDEF") == XLOG_FNAME_LEN && + (filename[XLOG_FNAME_LEN] == '\0' || strcmp(filename + XLOG_FNAME_LEN, ".partial") == 0); +} + +static void +write_encrypted_segment(const char *segpath, const char *segname, const char *tmppath) +{ + int tmpfd; + int segfd; + PGAlignedXLogBlock buf; + int r; + int w; + int pos = 0; + XLogLongPageHeader longhdr; + int walsegsz; + TimeLineID tli; + XLogSegNo segno; + + tmpfd = open(tmppath, O_RDONLY | PG_BINARY, 0); + if (tmpfd < 0) + pg_fatal("could not open file \"%s\": %m", tmppath); + + segfd = open(segpath, O_CREAT | O_WRONLY | PG_BINARY, 0666); + if (segfd < 0) + pg_fatal("could not open file \"%s\": %m", segpath); + + r = read(tmpfd, buf.data, XLOG_BLCKSZ); + + if (r < 0) + pg_fatal("could not read file \"%s\": %m", tmppath); + else if (r != XLOG_BLCKSZ) + pg_fatal("could not read file \"%s\": read %d of %d", + tmppath, r, XLOG_BLCKSZ); + + longhdr = (XLogLongPageHeader) buf.data; + walsegsz = longhdr->xlp_seg_size; + + if (!IsValidWalSegSize(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), + segname, walsegsz); + pg_log_error_detail("The WAL segment size must be a power of two between 1 MB and 1 GB."); + exit(1); + } + + XLogFromFileName(segname, &tli, &segno, walsegsz); + + TDEXLogSmgrInitWriteOldKeys(); + + w = xlog_smgr->seg_write(segfd, buf.data, r, pos, tli, segno, walsegsz); + + if (w < 0) + pg_fatal("could not write file \"%s\": %m", segpath); + else if (w != r) + pg_fatal("could not write file \"%s\": wrote %d of %d", + segpath, w, r); + + pos += w; + + while (1) + { + r = read(tmpfd, buf.data, XLOG_BLCKSZ); + + if (r == 0) + break; + else if (r < 0) + pg_fatal("could not read file \"%s\": %m", tmppath); + + w = xlog_smgr->seg_write(segfd, buf.data, r, pos, tli, segno, walsegsz); + + if (w < 0) + pg_fatal("could not write file \"%s\": %m", segpath); + else if (w != r) + pg_fatal("could not write file \"%s\": wrote %d of %d", + segpath, w, r); + + pos += w; + } + + close(segfd); + close(tmpfd); +} + +static void +usage(const char *progname) +{ + printf(_("%s wraps a restore command to encrypt its returned WAL.\n\n"), progname); + printf(_("Usage:\n")); + printf(_(" %s [OPTION]\n"), progname); + printf(_(" %s SOURCE-NAME DEST-PATH RESTORE-COMMAND\n"), progname); + printf(_("\nOptions:\n")); + printf(_(" -V, --version output version information, then exit\n")); + printf(_(" -?, --help show this help, then exit\n")); + printf(_(" SOURCE-NAME name of the WAL file to retrieve from archive\n")); + printf(_(" DEST-PATH path where the encrypted WAL segment should be written\n")); + printf(_(" RESTORE-COMMAND restore command to wrap, %%p will be replaced with the path\n" + " where it should write the unencrypted WAL segment, %%f with\n" + " the WAL segment's name\n")); + printf(_("\n")); + printf(_("Note that any %%f or %%p parameter in RESTORE-COMMAND will have to be escaped\n" + "as %%%%f or %%%%p respectively if used as restore_command in postgresql.conf.\n" + "e.g.\n" + " restore_command='%s %%f %%p \"cp /mnt/server/archivedir/%%%%f %%%%p\"'\n" + "or\n" + " restore_command='%s %%f %%p \"pgbackrest --stanza=your_stanza archive-get %%%%f \\\"%%%%p\\\"\"'\n" + "\n"), progname, progname); +} + +int +main(int argc, char *argv[]) +{ + const char *progname; + char *sourcename; + char *targetpath; + char *command; + char *sep; + char *targetname; + char tmpdir[MAXPGPATH] = TMPFS_DIRECTORY "/pg_tde_restoreXXXXXX"; + char tmppath[MAXPGPATH]; + bool issegment; + int rc; + + pg_logging_init(argv[0]); + progname = get_progname(argv[0]); + + if (argc > 1) + { + if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0) + { + usage(progname); + exit(0); + } + if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0) + { + puts("pg_tde_restore_encrypt (PostgreSQL) " PG_VERSION); + exit(0); + } + } + + if (argc != 4) + { + pg_log_error("wrong number of arguments, 3 expected"); + pg_log_error_detail("Try \"%s --help\" for more information.", progname); + exit(1); + } + + sourcename = argv[1]; + targetpath = argv[2]; + command = argv[3]; + + pg_tde_fe_init("pg_tde"); + TDEXLogSmgrInit(); + + sep = strrchr(targetpath, '/'); + + if (sep != NULL) + targetname = sep + 1; + else + targetname = targetpath; + + issegment = is_segment(sourcename); + + if (issegment) + { + char *s; + + if (mkdtemp(tmpdir) == NULL) + pg_fatal("could not create temporary directory \"%s\": %m", tmpdir); + + s = stpcpy(tmppath, tmpdir); + s = stpcpy(s, "/"); + stpcpy(s, targetname); + + command = replace_percent_placeholders(command, + "RESTORE-COMMAND", "fp", + sourcename, tmppath); + } + else + command = replace_percent_placeholders(command, + "RESTORE-COMMAND", "fp", + sourcename, targetpath); + rc = system(command); + + if (rc != 0) + { + if (rc == -1) + pg_fatal("RESTORE-COMMAND \"%s\" failed: %m", command); + else if (WIFEXITED(rc)) + pg_fatal("RESTORE-COMMAND \"%s\" failed with exit code %d", + command, WEXITSTATUS(rc)); + else if (WIFSIGNALED(rc)) + pg_fatal("RESTORE-COMMAND \"%s\" was terminated by signal %d: %s", + command, WTERMSIG(rc), pg_strsignal(WTERMSIG(rc))); + else + pg_fatal("RESTORE-COMMAND \"%s\" exited with unrecognized status %d", + command, rc); + } + + free(command); + + if (issegment) + { + write_encrypted_segment(targetpath, sourcename, tmppath); + + if (unlink(tmppath) < 0) + pg_log_warning("could not remove file \"%s\": %m", tmppath); + if (rmdir(tmpdir) < 0) + pg_log_warning("could not remove directory \"%s\": %m", tmpdir); + } + + return 0; +} diff --git a/contrib/pg_tde/src/catalog/tde_keyring.c b/contrib/pg_tde/src/catalog/tde_keyring.c index 7fd6649ee7358..4ca489885058c 100644 --- a/contrib/pg_tde/src/catalog/tde_keyring.c +++ b/contrib/pg_tde/src/catalog/tde_keyring.c @@ -1,40 +1,36 @@ -/*------------------------------------------------------------------------- - * - * tde_keyring.c - * Deals with the tde keyring configuration - * routines. - * - * IDENTIFICATION - * contrib/pg_tde/src/catalog/tde_keyring.c - * - *------------------------------------------------------------------------- +/* + * Deals with the tde keyring configuration routines. */ + #include "postgres.h" + +#include "access/skey.h" #include "access/xlog.h" #include "access/xloginsert.h" +#include "miscadmin.h" +#include "storage/fd.h" +#include "utils/builtins.h" +#include "utils/fmgroids.h" +#include "utils/lsyscache.h" +#include "utils/memutils.h" +#include "utils/snapmgr.h" + #include "access/pg_tde_xlog.h" #include "catalog/tde_global_space.h" #include "catalog/tde_keyring.h" #include "catalog/tde_principal_key.h" -#include "access/skey.h" -#include "utils/lsyscache.h" -#include "utils/memutils.h" -#include "utils/snapmgr.h" -#include "utils/fmgroids.h" #include "common/pg_tde_utils.h" -#include "miscadmin.h" -#include "unistd.h" -#include "utils/builtins.h" #include "pg_tde.h" #ifndef FRONTEND #include "access/heapam.h" -#include "common/pg_tde_shmem.h" #include "funcapi.h" #include "access/relscan.h" #include "access/relation.h" +#include "access/relscan.h" #include "catalog/namespace.h" #include "executor/spi.h" +#include "funcapi.h" #else #include "fe_utils/simple_list.h" #include "pg_tde_fe.h" @@ -44,28 +40,25 @@ typedef enum ProviderScanType { PROVIDER_SCAN_BY_NAME, PROVIDER_SCAN_BY_ID, - PROVIDER_SCAN_BY_TYPE, PROVIDER_SCAN_ALL } ProviderScanType; -#define PG_TDE_KEYRING_FILENAME "pg_tde_%d_keyring" +#define PG_TDE_KEYRING_FILENAME "%d_providers" #define FILE_KEYRING_TYPE "file" #define VAULTV2_KEYRING_TYPE "vault-v2" #define KMIP_KEYRING_TYPE "kmip" +static void debug_print_kerying(GenericKeyring *keyring); +static bool fetch_next_key_provider(int fd, off_t *curr_pos, KeyringProviderRecord *provider); +static inline void get_keyring_infofile_path(char *resPath, Oid dbOid); static FileKeyring *load_file_keyring_provider_options(char *keyring_options); +static GenericKeyring *load_keyring_provider_from_record(KeyringProviderRecord *provider); static GenericKeyring *load_keyring_provider_options(ProviderType provider_type, char *keyring_options); -static VaultV2Keyring *load_vaultV2_keyring_provider_options(char *keyring_options); static KmipKeyring *load_kmip_keyring_provider_options(char *keyring_options); -static void debug_print_kerying(GenericKeyring *keyring); -static GenericKeyring *load_keyring_provider_from_record(KeyringProvideRecord *provider); -static inline void get_keyring_infofile_path(char *resPath, Oid dbOid); -static bool fetch_next_key_provider(int fd, off_t *curr_pos, KeyringProvideRecord *provider); - -static uint32 write_key_provider_info(KeyringProvideRecord *provider, - Oid database_id, off_t position, - bool error_if_exists, bool write_xlog); +static VaultV2Keyring *load_vaultV2_keyring_provider_options(char *keyring_options); +static int open_keyring_infofile(Oid dbOid, int flags); +static char *get_file_value(const char *path, const char *field_name); #ifdef FRONTEND @@ -74,96 +67,51 @@ static void simple_list_free(SimplePtrList *list); #else -static List *scan_key_provider_file(ProviderScanType scanType, void *scanKey, Oid dbOid); - -PG_FUNCTION_INFO_V1(pg_tde_add_key_provider); -Datum pg_tde_add_key_provider(PG_FUNCTION_ARGS); - +PG_FUNCTION_INFO_V1(pg_tde_add_database_key_provider); PG_FUNCTION_INFO_V1(pg_tde_add_global_key_provider); -Datum pg_tde_add_global_key_provider(PG_FUNCTION_ARGS); - -PG_FUNCTION_INFO_V1(pg_tde_change_key_provider); -Datum pg_tde_change_key_provider(PG_FUNCTION_ARGS); - +PG_FUNCTION_INFO_V1(pg_tde_change_database_key_provider); PG_FUNCTION_INFO_V1(pg_tde_change_global_key_provider); -Datum pg_tde_change_global_key_provider(PG_FUNCTION_ARGS); - -static Datum pg_tde_list_all_key_providers_internal(const char *fname, bool global, PG_FUNCTION_ARGS); - -PG_FUNCTION_INFO_V1(pg_tde_list_all_key_providers); -Datum pg_tde_list_all_key_providers(PG_FUNCTION_ARGS); - +PG_FUNCTION_INFO_V1(pg_tde_delete_database_key_provider); +PG_FUNCTION_INFO_V1(pg_tde_delete_global_key_provider); +PG_FUNCTION_INFO_V1(pg_tde_list_all_database_key_providers); PG_FUNCTION_INFO_V1(pg_tde_list_all_global_key_providers); -Datum pg_tde_list_all_global_key_providers(PG_FUNCTION_ARGS); - -static Datum pg_tde_change_key_provider_internal(PG_FUNCTION_ARGS, Oid dbOid); - -static Datum pg_tde_add_key_provider_internal(PG_FUNCTION_ARGS, Oid dbOid); - -#define PG_TDE_LIST_PROVIDERS_COLS 4 -static void key_provider_startup_cleanup(int tde_tbl_count, XLogExtensionInstall *ext_info, bool redo, void *arg); static const char *get_keyring_provider_typename(ProviderType p_type); static List *GetAllKeyringProviders(Oid dbOid); -static void cleanup_key_provider_info(Oid databaseId); - -static Size initialize_shared_state(void *start_address); -static Size required_shared_mem_size(void); - -typedef struct TdeKeyProviderInfoSharedState -{ - LWLockPadded *Locks; -} TdeKeyProviderInfoSharedState; - -TdeKeyProviderInfoSharedState *sharedPrincipalKeyState = NULL; /* Lives in shared state */ - -static const TDEShmemSetupRoutine key_provider_info_shmem_routine = { - .init_shared_state = initialize_shared_state, - .init_dsa_area_objects = NULL, - .required_shared_mem_size = required_shared_mem_size, - .shmem_kill = NULL -}; - -static Size -required_shared_mem_size(void) -{ - return MAXALIGN(sizeof(TdeKeyProviderInfoSharedState)); -} +static Datum pg_tde_add_key_provider_internal(PG_FUNCTION_ARGS, Oid dbOid); +static Datum pg_tde_change_key_provider_internal(PG_FUNCTION_ARGS, Oid dbOid); +static Datum pg_tde_delete_key_provider_internal(PG_FUNCTION_ARGS, Oid dbOid); +static Datum pg_tde_list_all_key_providers_internal(PG_FUNCTION_ARGS, const char *fname, Oid dbOid); +static List *scan_key_provider_file(ProviderScanType scanType, void *scanKey, Oid dbOid); +static void save_new_key_provider_info(KeyringProviderRecord *provider, Oid databaseId); +static void modify_key_provider_info(KeyringProviderRecord *provider, Oid databaseId); +static void delete_key_provider_info(char *provider_name, Oid databaseId); +static void check_provider_record(KeyringProviderRecord *provider_record); -static Size -initialize_shared_state(void *start_address) -{ - sharedPrincipalKeyState = (TdeKeyProviderInfoSharedState *) start_address; - sharedPrincipalKeyState->Locks = GetNamedLWLockTranche(TDE_TRANCHE_NAME); +#define PG_TDE_LIST_PROVIDERS_COLS 4 - return sizeof(TdeKeyProviderInfoSharedState); -} +static LWLockPadded *tdeLocks = NULL; /* Lives in shared state */ static inline LWLock * tde_provider_info_lock(void) { - Assert(sharedPrincipalKeyState); - return &sharedPrincipalKeyState->Locks[TDE_LWLOCK_PI_FILES].lock; + Assert(tdeLocks); + return &tdeLocks[TDE_LWLOCK_PI_FILES].lock; } void -InitializeKeyProviderInfo(void) +KeyProviderShmemInit(void) { - ereport(LOG, (errmsg("initializing TDE key provider info"))); - RegisterShmemRequest(&key_provider_info_shmem_routine); - on_ext_install(key_provider_startup_cleanup, NULL); + tdeLocks = GetNamedLWLockTranche(TDE_TRANCHE_NAME); } -static void -key_provider_startup_cleanup(int tde_tbl_count, XLogExtensionInstall *ext_info, bool redo, void *arg) + +void +key_provider_startup_cleanup(Oid databaseId) { + char kp_info_path[MAXPGPATH]; - if (tde_tbl_count > 0) - { - ereport(WARNING, - (errmsg("failed to perform initialization. database already has %d TDE tables", tde_tbl_count))); - return; - } - cleanup_key_provider_info(ext_info->database_id); + get_keyring_infofile_path(kp_info_path, databaseId); + PathNameDeleteTemporaryFile(kp_info_path, false); } static const char * @@ -178,9 +126,8 @@ get_keyring_provider_typename(ProviderType p_type) case KMIP_KEY_PROVIDER: return KMIP_KEYRING_TYPE; default: - break; + return NULL; } - return NULL; } static List * @@ -189,24 +136,27 @@ GetAllKeyringProviders(Oid dbOid) return scan_key_provider_file(PROVIDER_SCAN_ALL, NULL, dbOid); } -uint32 -redo_key_provider_info(KeyringProviderXLRecord *xlrec) +void +redo_key_provider_info(KeyringProviderRecordInFile *xlrec) { - return write_key_provider_info(&xlrec->provider, xlrec->database_id, xlrec->offset_in_file, false, false); + LWLockAcquire(tde_provider_info_lock(), LW_EXCLUSIVE); + write_key_provider_info(xlrec, false); + LWLockRelease(tde_provider_info_lock()); } -static void -cleanup_key_provider_info(Oid databaseId) +static char * +required_text_argument(NullableDatum arg, const char *name) { - /* Remove the key provider info file */ - char kp_info_path[MAXPGPATH] = {0}; + if (arg.isnull) + ereport(ERROR, + errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), + errmsg("%s cannot be null", name)); - get_keyring_infofile_path(kp_info_path, databaseId); - PathNameDeleteTemporaryFile(kp_info_path, false); + return text_to_cstring(DatumGetTextPP(arg.value)); } Datum -pg_tde_change_key_provider(PG_FUNCTION_ARGS) +pg_tde_change_database_key_provider(PG_FUNCTION_ARGS) { return pg_tde_change_key_provider_internal(fcinfo, MyDatabaseId); } @@ -220,43 +170,47 @@ pg_tde_change_global_key_provider(PG_FUNCTION_ARGS) static Datum pg_tde_change_key_provider_internal(PG_FUNCTION_ARGS, Oid dbOid) { - char *provider_type = text_to_cstring(PG_GETARG_TEXT_PP(0)); - char *provider_name = text_to_cstring(PG_GETARG_TEXT_PP(1)); - char *options = text_to_cstring(PG_GETARG_TEXT_PP(2)); - int nlen, - olen; - KeyringProvideRecord provider; - - /* reports error if not found */ - GenericKeyring *keyring = GetKeyProviderByName(provider_name, dbOid); + char *provider_type; + char *provider_name; + char *options; + int olen; + KeyringProviderRecord provider; + GenericKeyring *keyring; + + if (!superuser()) + ereport(ERROR, + errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("must be superuser to modify key providers")); - pfree(keyring); + provider_type = required_text_argument(fcinfo->args[0], "provider type"); + provider_name = required_text_argument(fcinfo->args[1], "provider name"); + options = required_text_argument(fcinfo->args[2], "provider options"); - nlen = strlen(provider_name); - if (nlen >= sizeof(provider.provider_name)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("too long provider name, maximum lenght is %ld bytes", sizeof(provider.provider_name) - 1))); + /* reports error if not found */ + keyring = GetKeyProviderByName(provider_name, dbOid); olen = strlen(options); if (olen >= sizeof(provider.options)) ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("too large provider options, maximum size is %ld bytes", sizeof(provider.options) - 1))); + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("too large provider options, maximum size is %ld bytes", sizeof(provider.options) - 1)); /* Struct will be saved to disk so keep clean */ memset(&provider, 0, sizeof(provider)); - provider.provider_id = 0; - memcpy(provider.provider_name, provider_name, nlen); + provider.provider_id = keyring->keyring_id; + memcpy(provider.provider_name, provider_name, strlen(provider_name)); memcpy(provider.options, options, olen); provider.provider_type = get_keyring_provider_from_typename(provider_type); - modify_key_provider_info(&provider, dbOid, true); - PG_RETURN_INT32(provider.provider_id); + pfree(keyring); + + modify_key_provider_info(&provider, dbOid); + + PG_RETURN_VOID(); } Datum -pg_tde_add_key_provider(PG_FUNCTION_ARGS) +pg_tde_add_database_key_provider(PG_FUNCTION_ARGS) { return pg_tde_add_key_provider_internal(fcinfo, MyDatabaseId); } @@ -267,27 +221,41 @@ pg_tde_add_global_key_provider(PG_FUNCTION_ARGS) return pg_tde_add_key_provider_internal(fcinfo, GLOBAL_DATA_TDE_OID); } -Datum +static Datum pg_tde_add_key_provider_internal(PG_FUNCTION_ARGS, Oid dbOid) { - char *provider_type = text_to_cstring(PG_GETARG_TEXT_PP(0)); - char *provider_name = text_to_cstring(PG_GETARG_TEXT_PP(1)); - char *options = text_to_cstring(PG_GETARG_TEXT_PP(2)); + char *provider_type; + char *provider_name; + char *options; int nlen, olen; - KeyringProvideRecord provider; + KeyringProviderRecord provider; + + if (!superuser()) + ereport(ERROR, + errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("must be superuser to modify key providers")); + + provider_type = required_text_argument(fcinfo->args[0], "provider type"); + provider_name = required_text_argument(fcinfo->args[1], "provider name"); + options = required_text_argument(fcinfo->args[2], "provider options"); nlen = strlen(provider_name); + if (nlen == 0) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("provider name \"\" is too short")); if (nlen >= sizeof(provider.provider_name) - 1) ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("too long provider name, maximum lenght is %ld bytes", sizeof(provider.provider_name) - 1))); + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("provider name \"%s\" is too long", provider_name), + errhint("Maximum length is %ld bytes.", sizeof(provider.provider_name) - 1)); olen = strlen(options); if (olen >= sizeof(provider.options)) ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("too large provider options, maximum size is %ld bytes", sizeof(provider.options) - 1))); + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("too large provider options, maximum size is %ld bytes", sizeof(provider.options) - 1)); /* Struct will be saved to disk so keep clean */ memset(&provider, 0, sizeof(provider)); @@ -295,28 +263,77 @@ pg_tde_add_key_provider_internal(PG_FUNCTION_ARGS, Oid dbOid) memcpy(provider.provider_name, provider_name, nlen); memcpy(provider.options, options, olen); provider.provider_type = get_keyring_provider_from_typename(provider_type); - save_new_key_provider_info(&provider, dbOid, true); + save_new_key_provider_info(&provider, dbOid); + + PG_RETURN_VOID(); +} + +Datum +pg_tde_delete_database_key_provider(PG_FUNCTION_ARGS) +{ + return pg_tde_delete_key_provider_internal(fcinfo, MyDatabaseId); +} + +Datum +pg_tde_delete_global_key_provider(PG_FUNCTION_ARGS) +{ + return pg_tde_delete_key_provider_internal(fcinfo, GLOBAL_DATA_TDE_OID); +} - PG_RETURN_INT32(provider.provider_id); +static Datum +pg_tde_delete_key_provider_internal(PG_FUNCTION_ARGS, Oid db_oid) +{ + char *provider_name; + GenericKeyring *provider; + int provider_id; + bool provider_used; + + if (!superuser()) + ereport(ERROR, + errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("must be superuser to modify key providers")); + + provider_name = required_text_argument(fcinfo->args[0], "provider_name"); + + provider = GetKeyProviderByName(provider_name, db_oid); + if (provider == NULL) + { + ereport(ERROR, errmsg("Keyring provider not found")); + } + + provider_id = provider->keyring_id; + provider_used = pg_tde_is_provider_used(db_oid, provider_id); + + pfree(provider); + + if (provider_used) + { + ereport(ERROR, + errcode(ERRCODE_OBJECT_IN_USE), + errmsg("cannot delete provider which is currently in use")); + } + + delete_key_provider_info(provider_name, db_oid); + + PG_RETURN_VOID(); } Datum -pg_tde_list_all_key_providers(PG_FUNCTION_ARGS) +pg_tde_list_all_database_key_providers(PG_FUNCTION_ARGS) { - return pg_tde_list_all_key_providers_internal("pg_tde_list_all_key_providers", false, fcinfo); + return pg_tde_list_all_key_providers_internal(fcinfo, "pg_tde_list_all_database_key_providers_database", MyDatabaseId); } Datum pg_tde_list_all_global_key_providers(PG_FUNCTION_ARGS) { - return pg_tde_list_all_key_providers_internal("pg_tde_list_all_key_providers_global", true, fcinfo); + return pg_tde_list_all_key_providers_internal(fcinfo, "pg_tde_list_all_database_key_providers_global", GLOBAL_DATA_TDE_OID); } static Datum -pg_tde_list_all_key_providers_internal(const char *fname, bool global, PG_FUNCTION_ARGS) +pg_tde_list_all_key_providers_internal(PG_FUNCTION_ARGS, const char *fname, Oid dbOid) { - Oid database = (global ? GLOBAL_DATA_TDE_OID : MyDatabaseId); - List *all_providers = GetAllKeyringProviders(database); + List *all_providers = GetAllKeyringProviders(dbOid); ListCell *lc; Tuplestorestate *tupstore; TupleDesc tupdesc; @@ -327,12 +344,12 @@ pg_tde_list_all_key_providers_internal(const char *fname, bool global, PG_FUNCTI /* check to see if caller supports us returning a tuplestore */ if (rsinfo == NULL || !IsA(rsinfo, ReturnSetInfo)) ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("%s: set-valued function called in context that cannot accept a set", fname))); + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("%s: set-valued function called in context that cannot accept a set", fname)); if (!(rsinfo->allowedModes & SFRM_Materialize)) ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("%s: materialize mode required, but it is not allowed in this context", fname))); + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("%s: materialize mode required, but it is not allowed in this context", fname)); /* Switch into long-lived context to construct returned data structures */ per_query_ctx = rsinfo->econtext->ecxt_per_query_memory; @@ -380,194 +397,305 @@ GetKeyProviderByID(int provider_id, Oid dbOid) keyring = (GenericKeyring *) linitial(providers); list_free(providers); } + return keyring; } -#endif /* !FRONTEND */ - -static uint32 -write_key_provider_info(KeyringProvideRecord *provider, Oid database_id, - off_t position, bool error_if_exists, bool write_xlog) +/* + * Save the key provider info to the file + */ +static void +save_new_key_provider_info(KeyringProviderRecord *provider, Oid databaseId) { - off_t bytes_written = 0; - off_t curr_pos = 0; + off_t next_file_offset; int fd; - int seek_pos = -1; - - /* Named max, but global key provider oids are stored as negative numbers! */ + KeyringProviderRecord existing_provider; int max_provider_id = 0; - char kp_info_path[MAXPGPATH] = {0}; - KeyringProvideRecord existing_provider; - GenericKeyring *record; + int new_provider_id; + KeyringProviderRecordInFile file_record; Assert(provider != NULL); - if (error_if_exists && provider->provider_id != 0) - { - ereport(ERROR, - (errcode(ERRCODE_DATA_EXCEPTION), errmsg("Invalid write provider call"))); - } + check_provider_record(provider); + + LWLockAcquire(tde_provider_info_lock(), LW_EXCLUSIVE); - /* Try to parse the JSON data first: if it doesn't work, don't save it! */ - if (provider->provider_type != UNKNOWN_KEY_PROVIDER) + /* + * Validate that the provider name does not collide with an existing + * provider, find the largest existing provider_id and also find the end + * of file offset for appending the provider record. + */ + fd = open_keyring_infofile(databaseId, O_CREAT | O_RDONLY); + + next_file_offset = 0; + while (fetch_next_key_provider(fd, &next_file_offset, &existing_provider)) { - record = load_keyring_provider_from_record(provider); - if (record == NULL) + /* + * abs() is used here because provider_id is negative for global + * providers. + */ + max_provider_id = Max(max_provider_id, abs(existing_provider.provider_id)); + + /* Ignore deleted records */ + if (existing_provider.provider_type == UNKNOWN_KEY_PROVIDER) + continue; + + if (strcmp(existing_provider.provider_name, provider->provider_name) == 0) { ereport(ERROR, - (errcode(ERRCODE_DATA_EXCEPTION), errmsg("Invalid provider options"))); - } - else - { - pfree(record); + errcode(ERRCODE_DUPLICATE_OBJECT), + errmsg("Key provider \"%s\" already exists.", provider->provider_name)); } } + CloseTransientFile(fd); - get_keyring_infofile_path(kp_info_path, database_id); + if (max_provider_id == PG_INT32_MAX) + { + ereport(ERROR, + errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE), + errmsg("cannot create key provider, id out of range")); + } + new_provider_id = max_provider_id + 1; + provider->provider_id = (databaseId == GLOBAL_DATA_TDE_OID ? -new_provider_id : new_provider_id); + + file_record.database_id = databaseId; + file_record.offset_in_file = next_file_offset; + file_record.provider = *provider; + + write_key_provider_info(&file_record, true); + + LWLockRelease(tde_provider_info_lock()); +} + +static void +modify_key_provider_info(KeyringProviderRecord *provider, Oid databaseId) +{ + KeyringProviderRecordInFile record; + + Assert(provider != NULL); + + check_provider_record(provider); LWLockAcquire(tde_provider_info_lock(), LW_EXCLUSIVE); - fd = BasicOpenFile(kp_info_path, O_CREAT | O_RDWR | PG_BINARY); - if (fd < 0) + if (get_keyring_info_file_record_by_name(provider->provider_name, databaseId, &record) == false) { ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not open tde file \"%s\": %m", kp_info_path))); + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("keyring \"%s\" does not exist", provider->provider_name)); } - if (position == -1) + + if (provider->provider_id != record.provider.provider_id) { - /* - * we also need to verify the name conflict and generate the next - * provider ID - */ - int before_pos = curr_pos; + /* This should never happen. */ + ereport(ERROR, + errcode(ERRCODE_DATA_EXCEPTION), + errmsg("provider id mismatch %d is not %d", provider->provider_id, record.provider.provider_id)); + } - while (fetch_next_key_provider(fd, &curr_pos, &existing_provider)) - { - if (provider->provider_id != 0 && existing_provider.provider_id == provider->provider_id) - { - seek_pos = before_pos; - break; - } - if (strlen(existing_provider.provider_name) > 0 && strcmp(existing_provider.provider_name, provider->provider_name) == 0) - { - if (error_if_exists) - { - close(fd); - ereport(ERROR, - (errcode(ERRCODE_DUPLICATE_OBJECT), - errmsg("key provider \"%s\" already exists", provider->provider_name))); - } - else - { - - seek_pos = before_pos; - provider->provider_id = existing_provider.provider_id; - break; - } - } - if (max_provider_id < abs(existing_provider.provider_id)) - max_provider_id = abs(existing_provider.provider_id); + record.provider = *provider; + write_key_provider_info(&record, true); - before_pos = curr_pos; - } - if (seek_pos == -1) - { - provider->provider_id = max_provider_id + 1; + LWLockRelease(tde_provider_info_lock()); +} - if (database_id == GLOBAL_DATA_TDE_OID) - { - provider->provider_id = -provider->provider_id; - } - curr_pos = lseek(fd, 0, SEEK_END); - } - else - { - curr_pos = lseek(fd, seek_pos, SEEK_CUR); - } +static void +delete_key_provider_info(char *provider_name, Oid databaseId) +{ + int provider_id; + KeyringProviderRecordInFile record; + Assert(provider_name != NULL); - /* - * emit the xlog here. So that we can handle partial file write errors - * but cannot make new WAL entries during recovery. - */ - if (write_xlog) - { -#ifndef FRONTEND - KeyringProviderXLRecord xlrec; + LWLockAcquire(tde_provider_info_lock(), LW_EXCLUSIVE); + + if (get_keyring_info_file_record_by_name(provider_name, databaseId, &record) == false) + { + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("key provider \"%s\" does not exist", provider_name)); + } - xlrec.database_id = database_id; - xlrec.offset_in_file = curr_pos; - xlrec.provider = *provider; + /* Preserve provider_id for deleted records in the file. */ + provider_id = record.provider.provider_id; + memset(&(record.provider), 0, sizeof(KeyringProviderRecord)); + record.provider.provider_id = provider_id; + write_key_provider_info(&record, true); - XLogBeginInsert(); - XLogRegisterData((char *) &xlrec, sizeof(KeyringProviderXLRecord)); - XLogInsert(RM_TDERMGR_ID, XLOG_TDE_ADD_KEY_PROVIDER_KEY); -#else - Assert(0); -#endif - } + LWLockRelease(tde_provider_info_lock()); +} + +static void +check_provider_record(KeyringProviderRecord *provider_record) +{ + GenericKeyring *provider; + + if (provider_record->provider_type == UNKNOWN_KEY_PROVIDER) + { + ereport(ERROR, + errcode(ERRCODE_DATA_EXCEPTION), + errmsg("Invalid provider type.")); } - else + + /* Validate that the provider record can be properly parsed. */ + provider = load_keyring_provider_from_record(provider_record); + + if (provider == NULL) + { + ereport(ERROR, + errcode(ERRCODE_DATA_EXCEPTION), + errmsg("Invalid provider options.")); + } + + KeyringValidate(provider); + + if (provider->keyring_id != 0) { /* - * we are performing redo, just go to the position received from the - * xlog and write the record there. No need to verify the name - * conflict and generate the provider ID + * If we are modifying an existing provider, verify that all of the + * keys already in use are the same. */ - curr_pos = lseek(fd, position, SEEK_SET); + pg_tde_verify_provider_keys_in_use(provider); + } + + pfree(provider); +} + +#endif /* !FRONTEND */ + +void +free_keyring(GenericKeyring *keyring) +{ + FileKeyring *file = (FileKeyring *) keyring; + VaultV2Keyring *vault = (VaultV2Keyring *) keyring; + KmipKeyring *kmip = (KmipKeyring *) keyring; + + switch (keyring->type) + { + case FILE_KEY_PROVIDER: + if (file->file_name) + pfree(file->file_name); + break; + case VAULT_V2_KEY_PROVIDER: + if (vault->vault_ca_path) + pfree(vault->vault_ca_path); + if (vault->vault_mount_path) + pfree(vault->vault_mount_path); + if (vault->vault_token) + pfree(vault->vault_token); + if (vault->vault_token_path) + pfree(vault->vault_token_path); + if (vault->vault_url) + pfree(vault->vault_url); + break; + case KMIP_KEY_PROVIDER: + if (kmip->kmip_ca_path) + pfree(kmip->kmip_ca_path); + if (kmip->kmip_cert_path) + pfree(kmip->kmip_cert_path); + if (kmip->kmip_host) + pfree(kmip->kmip_host); + if (kmip->kmip_key_path) + pfree(kmip->kmip_key_path); + if (kmip->kmip_port) + pfree(kmip->kmip_port); + break; + default: + Assert(false); + break; + } + + pfree(keyring); +} + +void +write_key_provider_info(KeyringProviderRecordInFile *record, bool write_xlog) +{ + off_t bytes_written; + int fd; + char kp_info_path[MAXPGPATH]; + + Assert(record != NULL); + Assert(record->offset_in_file >= 0); + Assert(LWLockHeldByMeInMode(tde_provider_info_lock(), LW_EXCLUSIVE)); + + get_keyring_infofile_path(kp_info_path, record->database_id); + fd = OpenTransientFile(kp_info_path, O_CREAT | O_RDWR | PG_BINARY); + if (fd < 0) + { + ereport(ERROR, + errcode_for_file_access(), + errmsg("could not open tde file \"%s\": %m", kp_info_path)); } /* - * All good, Just add a new provider + * emit the xlog here. So that we can handle partial file write errors but + * cannot make new WAL entries during recovery. */ - bytes_written = pg_pwrite(fd, provider, sizeof(KeyringProvideRecord), curr_pos); - if (bytes_written != sizeof(KeyringProvideRecord)) + if (write_xlog) + { +#ifndef FRONTEND + XLogBeginInsert(); + XLogRegisterData((char *) record, sizeof(KeyringProviderRecordInFile)); + XLogInsert(RM_TDERMGR_ID, XLOG_TDE_WRITE_KEY_PROVIDER); +#else + Assert(false); +#endif + } + + bytes_written = pg_pwrite(fd, &(record->provider), + sizeof(KeyringProviderRecord), + record->offset_in_file); + if (bytes_written != sizeof(KeyringProviderRecord)) { - close(fd); ereport(ERROR, - (errcode_for_file_access(), - errmsg("key provider info file \"%s\" can't be written: %m", - kp_info_path))); + errcode_for_file_access(), + errmsg("key provider info file \"%s\" can't be written: %m", + kp_info_path)); } if (pg_fsync(fd) != 0) { - close(fd); ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not fsync file \"%s\": %m", - kp_info_path))); + errcode_for_file_access(), + errmsg("could not fsync file \"%s\": %m", kp_info_path)); } - close(fd); - LWLockRelease(tde_provider_info_lock()); - return provider->provider_id; + CloseTransientFile(fd); } - -/* - * Save the key provider info to the file - */ -uint32 -save_new_key_provider_info(KeyringProvideRecord *provider, Oid databaseId, bool write_xlog) +/* Returns true if the record is found, false otherwise. */ +bool +get_keyring_info_file_record_by_name(char *provider_name, Oid database_id, + KeyringProviderRecordInFile *record) { - return write_key_provider_info(provider, databaseId, -1, true, write_xlog); -} + off_t current_file_offset = 0; + off_t next_file_offset = 0; + int fd; + KeyringProviderRecord existing_provider; -uint32 -modify_key_provider_info(KeyringProvideRecord *provider, Oid databaseId, bool write_xlog) -{ - return write_key_provider_info(provider, databaseId, -1, false, write_xlog); -} + Assert(provider_name != NULL); + Assert(record != NULL); -uint32 -delete_key_provider_info(int provider_id, Oid databaseId, bool write_xlog) -{ - KeyringProvideRecord kpr; + fd = open_keyring_infofile(database_id, O_RDONLY); + + while (fetch_next_key_provider(fd, &next_file_offset, &existing_provider)) + { + /* Ignore deleted provider records */ + if (existing_provider.provider_type != UNKNOWN_KEY_PROVIDER + && strcmp(existing_provider.provider_name, provider_name) == 0) + { + record->database_id = database_id; + record->offset_in_file = current_file_offset; + record->provider = existing_provider; + CloseTransientFile(fd); + return true; + } - memset(&kpr, 0, sizeof(KeyringProvideRecord)); - kpr.provider_id = provider_id; + current_file_offset = next_file_offset; + } - return modify_key_provider_info(&kpr, databaseId, write_xlog); + /* No matching key provider found */ + CloseTransientFile(fd); + return false; } #ifdef FRONTEND @@ -583,15 +711,15 @@ GetKeyProviderByID(int provider_id, Oid dbOid) keyring = (GenericKeyring *) providers->head->ptr; simple_list_free(providers); } + return keyring; } static void simple_list_free(SimplePtrList *list) { - SimplePtrListCell *cell; + SimplePtrListCell *cell = list->head; - cell = list->head; while (cell != NULL) { SimplePtrListCell *next; @@ -600,6 +728,8 @@ simple_list_free(SimplePtrList *list) pfree(cell); cell = next; } + + pfree(list); } #endif /* FRONTEND */ @@ -615,8 +745,8 @@ scan_key_provider_file(ProviderScanType scanType, void *scanKey, Oid dbOid) { off_t curr_pos = 0; int fd; - char kp_info_path[MAXPGPATH] = {0}; - KeyringProvideRecord provider; + char kp_info_path[MAXPGPATH]; + KeyringProviderRecord provider; #ifndef FRONTEND List *providers_list = NIL; #else @@ -630,13 +760,13 @@ scan_key_provider_file(ProviderScanType scanType, void *scanKey, Oid dbOid) LWLockAcquire(tde_provider_info_lock(), LW_SHARED); - fd = BasicOpenFile(kp_info_path, PG_BINARY); + fd = OpenTransientFile(kp_info_path, PG_BINARY); if (fd < 0) { LWLockRelease(tde_provider_info_lock()); ereport(DEBUG2, - (errcode_for_file_access(), - errmsg("could not open tde file \"%s\": %m", kp_info_path))); + errcode_for_file_access(), + errmsg("could not open tde file \"%s\": %m", kp_info_path)); return providers_list; } while (fetch_next_key_provider(fd, &curr_pos, &provider)) @@ -650,7 +780,7 @@ scan_key_provider_file(ProviderScanType scanType, void *scanKey, Oid dbOid) } ereport(DEBUG2, - (errmsg("read key provider ID=%d %s", provider.provider_id, provider.provider_name))); + errmsg("read key provider ID=%d %s", provider.provider_id, provider.provider_name)); if (scanType == PROVIDER_SCAN_BY_NAME) { @@ -662,11 +792,6 @@ scan_key_provider_file(ProviderScanType scanType, void *scanKey, Oid dbOid) if (provider.provider_id == *(int *) scanKey) match = true; } - else if (scanType == PROVIDER_SCAN_BY_TYPE) - { - if (provider.provider_type == *(ProviderType *) scanKey) - match = true; - } else if (scanType == PROVIDER_SCAN_ALL) match = true; @@ -680,23 +805,24 @@ scan_key_provider_file(ProviderScanType scanType, void *scanKey, Oid dbOid) providers_list = lappend(providers_list, keyring); #else if (providers_list == NULL) - providers_list = palloc_object(SimplePtrList); + providers_list = palloc0_object(SimplePtrList); simple_ptr_list_append(providers_list, keyring); #endif } } } - close(fd); + CloseTransientFile(fd); LWLockRelease(tde_provider_info_lock()); return providers_list; } static GenericKeyring * -load_keyring_provider_from_record(KeyringProvideRecord *provider) +load_keyring_provider_from_record(KeyringProviderRecord *provider) { - GenericKeyring *keyring = NULL; + GenericKeyring *keyring; keyring = load_keyring_provider_options(provider->provider_type, provider->options); + if (keyring) { keyring->keyring_id = provider->provider_id; @@ -705,10 +831,10 @@ load_keyring_provider_from_record(KeyringProvideRecord *provider) memcpy(keyring->options, provider->options, sizeof(keyring->options)); debug_print_kerying(keyring); } + return keyring; } - static GenericKeyring * load_keyring_provider_options(ProviderType provider_type, char *keyring_options) { @@ -716,37 +842,32 @@ load_keyring_provider_options(ProviderType provider_type, char *keyring_options) { case FILE_KEY_PROVIDER: return (GenericKeyring *) load_file_keyring_provider_options(keyring_options); - break; case VAULT_V2_KEY_PROVIDER: return (GenericKeyring *) load_vaultV2_keyring_provider_options(keyring_options); - break; case KMIP_KEY_PROVIDER: return (GenericKeyring *) load_kmip_keyring_provider_options(keyring_options); - break; default: - break; + return NULL; } - return NULL; } static FileKeyring * load_file_keyring_provider_options(char *keyring_options) { - FileKeyring *file_keyring = palloc0(sizeof(FileKeyring)); + FileKeyring *file_keyring = palloc0_object(FileKeyring); file_keyring->keyring.type = FILE_KEY_PROVIDER; - if (!ParseKeyringJSONOptions(FILE_KEY_PROVIDER, file_keyring, - keyring_options, strlen(keyring_options))) - { - return NULL; - } + ParseKeyringJSONOptions(FILE_KEY_PROVIDER, (GenericKeyring *) file_keyring, + keyring_options, strlen(keyring_options)); if (file_keyring->file_name == NULL || file_keyring->file_name[0] == '\0') { ereport(WARNING, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("file path is missing in the keyring options"))); + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("file path is missing in the keyring options")); + + free_keyring((GenericKeyring *) file_keyring); return NULL; } @@ -756,90 +877,122 @@ load_file_keyring_provider_options(char *keyring_options) static VaultV2Keyring * load_vaultV2_keyring_provider_options(char *keyring_options) { - VaultV2Keyring *vaultV2_keyring = palloc0(sizeof(VaultV2Keyring)); + VaultV2Keyring *vaultV2_keyring = palloc0_object(VaultV2Keyring); vaultV2_keyring->keyring.type = VAULT_V2_KEY_PROVIDER; - if (!ParseKeyringJSONOptions(VAULT_V2_KEY_PROVIDER, vaultV2_keyring, - keyring_options, strlen(keyring_options))) - { - return NULL; - } + ParseKeyringJSONOptions(VAULT_V2_KEY_PROVIDER, + (GenericKeyring *) vaultV2_keyring, + keyring_options, strlen(keyring_options)); - if (vaultV2_keyring->vault_token == NULL || vaultV2_keyring->vault_token[0] == '\0' || + if (vaultV2_keyring->vault_token_path == NULL || vaultV2_keyring->vault_token_path[0] == '\0' || vaultV2_keyring->vault_url == NULL || vaultV2_keyring->vault_url[0] == '\0' || vaultV2_keyring->vault_mount_path == NULL || vaultV2_keyring->vault_mount_path[0] == '\0') { ereport(WARNING, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("missing in the keyring options:%s%s%s", - (vaultV2_keyring->vault_token != NULL && vaultV2_keyring->vault_token[0] != '\0') ? "" : " token", - (vaultV2_keyring->vault_url != NULL && vaultV2_keyring->vault_url[0] != '\0') ? "" : " url", - (vaultV2_keyring->vault_mount_path != NULL && vaultV2_keyring->vault_mount_path[0] != '\0') ? "" : " mountPath"))); + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("missing in the keyring options:%s%s%s", + (vaultV2_keyring->vault_token_path != NULL && vaultV2_keyring->vault_token_path[0] != '\0') ? "" : " tokenPath", + (vaultV2_keyring->vault_url != NULL && vaultV2_keyring->vault_url[0] != '\0') ? "" : " url", + (vaultV2_keyring->vault_mount_path != NULL && vaultV2_keyring->vault_mount_path[0] != '\0') ? "" : " mountPath")); + + free_keyring((GenericKeyring *) vaultV2_keyring); return NULL; } + /* TODO: the vault_token mem should be protected from paging to the swap */ + vaultV2_keyring->vault_token = get_file_value(vaultV2_keyring->vault_token_path, "vault_token"); + return vaultV2_keyring; } static KmipKeyring * load_kmip_keyring_provider_options(char *keyring_options) { - KmipKeyring *kmip_keyring = palloc0(sizeof(KmipKeyring)); + KmipKeyring *kmip_keyring = palloc0_object(KmipKeyring); kmip_keyring->keyring.type = KMIP_KEY_PROVIDER; - if (!ParseKeyringJSONOptions(KMIP_KEY_PROVIDER, kmip_keyring, - keyring_options, strlen(keyring_options))) - { - return NULL; - } + ParseKeyringJSONOptions(KMIP_KEY_PROVIDER, (GenericKeyring *) kmip_keyring, + keyring_options, strlen(keyring_options)); - if (strlen(kmip_keyring->kmip_host) == 0 || - strlen(kmip_keyring->kmip_port) == 0 || - strlen(kmip_keyring->kmip_ca_path) == 0 || - strlen(kmip_keyring->kmip_cert_path) == 0) + if (kmip_keyring->kmip_host == NULL || kmip_keyring->kmip_host[0] == '\0' || + kmip_keyring->kmip_port == NULL || kmip_keyring->kmip_port[0] == '\0' || + kmip_keyring->kmip_ca_path == NULL || kmip_keyring->kmip_ca_path[0] == '\0' || + kmip_keyring->kmip_cert_path == NULL || kmip_keyring->kmip_cert_path[0] == '\0' || + kmip_keyring->kmip_key_path == NULL || kmip_keyring->kmip_key_path[0] == '\0') { ereport(WARNING, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("missing in the keyring options:%s%s%s%s", - (kmip_keyring->kmip_host != NULL && kmip_keyring->kmip_host[0] != '\0') ? "" : " host", - (kmip_keyring->kmip_port != NULL && kmip_keyring->kmip_port[0] != '\0') ? "" : " port", - (kmip_keyring->kmip_ca_path != NULL && kmip_keyring->kmip_ca_path[0] != '\0') ? "" : " caPath", - (kmip_keyring->kmip_cert_path != NULL && kmip_keyring->kmip_cert_path[0] != '\0') ? "" : " certPath"))); + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("missing in the keyring options:%s%s%s%s%s", + (kmip_keyring->kmip_host != NULL && kmip_keyring->kmip_host[0] != '\0') ? "" : " host", + (kmip_keyring->kmip_port != NULL && kmip_keyring->kmip_port[0] != '\0') ? "" : " port", + (kmip_keyring->kmip_ca_path != NULL && kmip_keyring->kmip_ca_path[0] != '\0') ? "" : " caPath", + (kmip_keyring->kmip_cert_path != NULL && kmip_keyring->kmip_cert_path[0] != '\0') ? "" : " certPath", + (kmip_keyring->kmip_key_path != NULL && kmip_keyring->kmip_key_path[0] != '\0') ? "" : " keyPath")); + + free_keyring((GenericKeyring *) kmip_keyring); return NULL; } return kmip_keyring; } +#define MAX_FILE_DATA_LENGTH 1024 + +static char * +get_file_value(const char *path, const char *field_name) +{ + FILE *fd; + char *val; + + fd = AllocateFile(path, "r"); + if (fd == NULL) + { + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not open file \"%s\" for \"%s\": %m", path, field_name))); + } + + val = palloc(MAX_FILE_DATA_LENGTH); + if (fgets(val, MAX_FILE_DATA_LENGTH, fd) == NULL && ferror(fd)) + { + ereport(ERROR, + (errcode_for_file_access(), + errmsg("could not read file \"%s\" for \"%s\": %m", path, field_name))); + } + /* remove trailing whitespace */ + val[strcspn(val, " \t\n\r")] = '\0'; + + FreeFile(fd); + return val; +} + static void debug_print_kerying(GenericKeyring *keyring) { - int debug_level = DEBUG2; - - elog(debug_level, "Keyring type: %d", keyring->type); - elog(debug_level, "Keyring name: %s", keyring->provider_name); - elog(debug_level, "Keyring id: %d", keyring->keyring_id); + elog(DEBUG2, "Keyring type: %d", keyring->type); + elog(DEBUG2, "Keyring name: %s", keyring->provider_name); + elog(DEBUG2, "Keyring id: %d", keyring->keyring_id); switch (keyring->type) { case FILE_KEY_PROVIDER: - elog(debug_level, "File Keyring Path: %s", ((FileKeyring *) keyring)->file_name); + elog(DEBUG2, "File Keyring Path: %s", ((FileKeyring *) keyring)->file_name); break; case VAULT_V2_KEY_PROVIDER: - elog(debug_level, "Vault Keyring Token: %s", ((VaultV2Keyring *) keyring)->vault_token); - elog(debug_level, "Vault Keyring URL: %s", ((VaultV2Keyring *) keyring)->vault_url); - elog(debug_level, "Vault Keyring Mount Path: %s", ((VaultV2Keyring *) keyring)->vault_mount_path); - elog(debug_level, "Vault Keyring CA Path: %s", ((VaultV2Keyring *) keyring)->vault_ca_path); + elog(DEBUG2, "Vault Keyring Token Path: %s", ((VaultV2Keyring *) keyring)->vault_token_path); + elog(DEBUG2, "Vault Keyring URL: %s", ((VaultV2Keyring *) keyring)->vault_url); + elog(DEBUG2, "Vault Keyring Mount Path: %s", ((VaultV2Keyring *) keyring)->vault_mount_path); + elog(DEBUG2, "Vault Keyring CA Path: %s", ((VaultV2Keyring *) keyring)->vault_ca_path); break; case KMIP_KEY_PROVIDER: - elog(debug_level, "KMIP Keyring Host: %s", ((KmipKeyring *) keyring)->kmip_host); - elog(debug_level, "KMIP Keyring Port: %s", ((KmipKeyring *) keyring)->kmip_port); - elog(debug_level, "KMIP Keyring CA Path: %s", ((KmipKeyring *) keyring)->kmip_ca_path); - elog(debug_level, "KMIP Keyring Cert Path: %s", ((KmipKeyring *) keyring)->kmip_cert_path); + elog(DEBUG2, "KMIP Keyring Host: %s", ((KmipKeyring *) keyring)->kmip_host); + elog(DEBUG2, "KMIP Keyring Port: %s", ((KmipKeyring *) keyring)->kmip_port); + elog(DEBUG2, "KMIP Keyring CA Path: %s", ((KmipKeyring *) keyring)->kmip_ca_path); + elog(DEBUG2, "KMIP Keyring Cert Path: %s", ((KmipKeyring *) keyring)->kmip_cert_path); + elog(DEBUG2, "KMIP Keyring Key Path: %s", ((KmipKeyring *) keyring)->kmip_key_path); break; case UNKNOWN_KEY_PROVIDER: - elog(debug_level, "Unknown Keyring "); break; } } @@ -847,33 +1000,52 @@ debug_print_kerying(GenericKeyring *keyring) static inline void get_keyring_infofile_path(char *resPath, Oid dbOid) { - join_path_components(resPath, pg_tde_get_tde_data_dir(), psprintf(PG_TDE_KEYRING_FILENAME, dbOid)); + char *fname = psprintf(PG_TDE_KEYRING_FILENAME, dbOid); + + join_path_components(resPath, pg_tde_get_data_dir(), fname); + pfree(fname); +} + +static int +open_keyring_infofile(Oid database_id, int flags) +{ + int fd; + char kp_info_path[MAXPGPATH]; + + get_keyring_infofile_path(kp_info_path, database_id); + fd = OpenTransientFile(kp_info_path, flags | PG_BINARY); + if (fd < 0) + { + ereport(ERROR, + errcode_for_file_access(), + errmsg("could not open tde file \"%s\": %m", kp_info_path)); + } + return fd; } /* * Fetch the next key provider from the file and update the curr_pos */ static bool -fetch_next_key_provider(int fd, off_t *curr_pos, KeyringProvideRecord *provider) +fetch_next_key_provider(int fd, off_t *curr_pos, KeyringProviderRecord *provider) { - off_t bytes_read = 0; + off_t bytes_read; Assert(provider != NULL); Assert(fd >= 0); - bytes_read = pg_pread(fd, provider, sizeof(KeyringProvideRecord), *curr_pos); + bytes_read = pg_pread(fd, provider, sizeof(KeyringProviderRecord), *curr_pos); *curr_pos += bytes_read; if (bytes_read == 0) return false; - if (bytes_read != sizeof(KeyringProvideRecord)) + if (bytes_read != sizeof(KeyringProviderRecord)) { - close(fd); /* Corrupt file */ ereport(ERROR, - (errcode_for_file_access(), - errmsg("key provider info file is corrupted: %m"), - errdetail("invalid key provider record size %ld expected %lu", bytes_read, sizeof(KeyringProvideRecord)))); + errcode_for_file_access(), + errmsg("key provider info file is corrupted: %m"), + errdetail("invalid key provider record size %ld expected %lu", bytes_read, sizeof(KeyringProviderRecord))); } return true; } @@ -881,27 +1053,24 @@ fetch_next_key_provider(int fd, off_t *curr_pos, KeyringProvideRecord *provider) ProviderType get_keyring_provider_from_typename(char *provider_type) { - if (provider_type == NULL) - return UNKNOWN_KEY_PROVIDER; - if (strcmp(FILE_KEYRING_TYPE, provider_type) == 0) return FILE_KEY_PROVIDER; - if (strcmp(VAULTV2_KEYRING_TYPE, provider_type) == 0) + else if (strcmp(VAULTV2_KEYRING_TYPE, provider_type) == 0) return VAULT_V2_KEY_PROVIDER; - if (strcmp(KMIP_KEYRING_TYPE, provider_type) == 0) + else if (strcmp(KMIP_KEYRING_TYPE, provider_type) == 0) return KMIP_KEY_PROVIDER; - return UNKNOWN_KEY_PROVIDER; + else + return UNKNOWN_KEY_PROVIDER; } GenericKeyring * GetKeyProviderByName(const char *provider_name, Oid dbOid) { GenericKeyring *keyring = NULL; - #ifndef FRONTEND - static List *providers; + List *providers; #else - static SimplePtrList *providers; + SimplePtrList *providers; #endif providers = scan_key_provider_file(PROVIDER_SCAN_BY_NAME, (void *) provider_name, dbOid); @@ -919,9 +1088,8 @@ GetKeyProviderByName(const char *provider_name, Oid dbOid) else { ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("key provider \"%s\" does not exists", provider_name), - errhint("Use pg_tde_add_key_provider interface to create the key provider"))); + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("key provider \"%s\" does not exists", provider_name)); } return keyring; } diff --git a/contrib/pg_tde/src/catalog/tde_keyring_parse_opts.c b/contrib/pg_tde/src/catalog/tde_keyring_parse_opts.c index 6512f260776cc..1297e16e9e924 100644 --- a/contrib/pg_tde/src/catalog/tde_keyring_parse_opts.c +++ b/contrib/pg_tde/src/catalog/tde_keyring_parse_opts.c @@ -1,70 +1,38 @@ -/*------------------------------------------------------------------------- - * - * tde_keyring_parse_opts.c - * Parser routines for the keyring JSON options - * - * Each value in the JSON document can be either scalar (string) - a value itself - * or a reference to the external object that contains the value. Though the top - * level field "type" can be only scalar. - * - * Examples: - * {"type" : "file", "path" : "/tmp/keyring_data_file"} - * {"type" : "file", "path" : {"type" : "file", "path" : "/tmp/datafile-location"}} - * in the latter one, /tmp/datafile-location contains not keyring data but the - * location of such. - * - * A field type can be "file", in this case, we expect "path" field. Or "remote", - * when "url" field is expected. - * - * IDENTIFICATION - * contrib/pg_tde/src/catalog/tde_keyring_parse_opts.c +/* + * Parser routines for the keyring JSON options * - *------------------------------------------------------------------------- + * We expect one-dimentional JSON object with scalar fields */ #include "postgres.h" -#include "common/file_perm.h" + #include "common/jsonapi.h" #include "mb/pg_wchar.h" -#include "storage/fd.h" +#include "utils/jsonfuncs.h" #include "catalog/tde_keyring.h" -#include "keyring/keyring_curl.h" #ifdef FRONTEND #include "pg_tde_fe.h" #endif -#include - -#define MAX_CONFIG_FILE_DATA_LENGTH 1024 - /* * JSON parser state */ - -typedef enum JsonKeringSemState +typedef enum JsonKeyringSemState { - JK_EXPECT_TOP_FIELD, - JK_EXPECT_EXTERN_VAL, -} JsonKeringSemState; - -#define KEYRING_REMOTE_FIELD_TYPE "remote" -#define KEYRING_FILE_FIELD_TYPE "file" + JK_EXPECT_TOP_LEVEL_OBJECT, + JK_EXPECT_FIELD, +} JsonKeyringSemState; typedef enum JsonKeyringField { JK_FIELD_UNKNOWN, - JK_KRING_TYPE, - - JK_FIELD_TYPE, - JK_REMOTE_URL, - JK_FIELD_PATH, + /* Settings specific for the individual key provider types. */ + JK_FILE_PATH, - JF_FILE_PATH, - - JK_VAULT_TOKEN, + JK_VAULT_TOKEN_PATH, JK_VAULT_URL, JK_VAULT_MOUNT_PATH, JK_VAULT_CA_PATH, @@ -73,6 +41,7 @@ typedef enum JsonKeyringField JK_KMIP_PORT, JK_KMIP_CA_PATH, JK_KMIP_CERT_PATH, + JK_KMIP_KEY_PATH, /* must be the last */ JK_FIELDS_TOTAL @@ -80,17 +49,15 @@ typedef enum JsonKeyringField static const char *JK_FIELD_NAMES[JK_FIELDS_TOTAL] = { [JK_FIELD_UNKNOWN] = "unknownField", - [JK_KRING_TYPE] = "type", - [JK_FIELD_TYPE] = "type", - [JK_REMOTE_URL] = "url", - [JK_FIELD_PATH] = "path", /* - * These values should match pg_tde_add_key_provider_vault_v2 and - * pg_tde_add_key_provider_file SQL interfaces + * These values should match pg_tde_add_database_key_provider_vault_v2, + * pg_tde_add_database_key_provider_file and + * pg_tde_add_database_key_provider_kmip SQL interfaces */ - [JF_FILE_PATH] = "path", - [JK_VAULT_TOKEN] = "token", + [JK_FILE_PATH] = "path", + + [JK_VAULT_TOKEN_PATH] = "tokenPath", [JK_VAULT_URL] = "url", [JK_VAULT_MOUNT_PATH] = "mountPath", [JK_VAULT_CA_PATH] = "caPath", @@ -99,75 +66,44 @@ static const char *JK_FIELD_NAMES[JK_FIELDS_TOTAL] = { [JK_KMIP_PORT] = "port", [JK_KMIP_CA_PATH] = "caPath", [JK_KMIP_CERT_PATH] = "certPath", + [JK_KMIP_KEY_PATH] = "keyPath", }; -#define MAX_JSON_DEPTH 64 typedef struct JsonKeyringState { ProviderType provider_type; - /* - * Caller's options to be set from JSON values. Expected either - * `VaultV2Keyring` or `FileKeyring` - */ - void *provider_opts; + /* Caller's options to be set from JSON values. */ + GenericKeyring *provider_opts; - /* - * A field hierarchy of the current branch, field[level] is the current - * one, field[level-1] is the parent and so on. We need to track parent - * fields because of the external values - */ - JsonKeyringField field[MAX_JSON_DEPTH]; - JsonKeringSemState state; - int level; + JsonKeyringField current_field; - /* - * The rest of the scalar fields might be in the JSON document but has no - * direct value for the caller. Although we need them for the values - * extraction or state tracking. - */ - char *kring_type; - char *field_type; - char *extern_url; - char *extern_path; + JsonKeyringSemState state; } JsonKeyringState; static JsonParseErrorType json_kring_scalar(void *state, char *token, JsonTokenType tokentype); +static JsonParseErrorType json_kring_array_start(void *state); static JsonParseErrorType json_kring_object_field_start(void *state, char *fname, bool isnull); static JsonParseErrorType json_kring_object_start(void *state); -static JsonParseErrorType json_kring_object_end(void *state); - -static JsonParseErrorType json_kring_assign_scalar(JsonKeyringState *parse, JsonKeyringField field, char *value); -static char *get_remote_kring_value(const char *url, const char *field_name); -static char *get_file_kring_value(const char *path, const char *field_name); +static void json_kring_assign_scalar(JsonKeyringState *parse, JsonKeyringField field, char *value); /* - * Parses json input for the given provider type and sets the provided options - * out_opts should be a palloc'd `VaultV2Keyring` or `FileKeyring` struct as the - * respective option values will be mem copied into it. - * Returns `true` if parsing succeded and `false` otherwise. -*/ -bool -ParseKeyringJSONOptions(ProviderType provider_type, void *out_opts, char *in_buf, int buf_len) + * Parses json input for the given provider type and sets the provided options. + * out_opts should be a palloc'd keyring object matching the provider_type. + */ +void +ParseKeyringJSONOptions(ProviderType provider_type, GenericKeyring *out_opts, char *in_buf, int buf_len) { JsonLexContext *jlex; JsonKeyringState parse = {0}; JsonSemAction sem; - JsonParseErrorType jerr; /* Set up parsing context and initial semantic state */ parse.provider_type = provider_type; parse.provider_opts = out_opts; - parse.level = -1; - parse.state = JK_EXPECT_TOP_FIELD; - memset(parse.field, 0, MAX_JSON_DEPTH * sizeof(JsonKeyringField)); - -#if PG_VERSION_NUM >= 170000 + parse.state = JK_EXPECT_TOP_LEVEL_OBJECT; jlex = makeJsonLexContextCstringLen(NULL, in_buf, buf_len, PG_UTF8, true); -#else - jlex = makeJsonLexContextCstringLen(in_buf, buf_len, PG_UTF8, true); -#endif /* * Set up semantic actions. The function below will be called when the @@ -175,8 +111,8 @@ ParseKeyringJSONOptions(ProviderType provider_type, void *out_opts, char *in_buf */ sem.semstate = &parse; sem.object_start = json_kring_object_start; - sem.object_end = json_kring_object_end; - sem.array_start = NULL; + sem.object_end = NULL; + sem.array_start = json_kring_array_start; sem.array_end = NULL; sem.object_field_start = json_kring_object_field_start; sem.object_field_end = NULL; @@ -184,188 +120,141 @@ ParseKeyringJSONOptions(ProviderType provider_type, void *out_opts, char *in_buf sem.array_element_end = NULL; sem.scalar = json_kring_scalar; - /* Run the parser */ - jerr = pg_parse_json(jlex, &sem); - if (jerr != JSON_SUCCESS) +#ifndef FRONTEND + pg_parse_json_or_ereport(jlex, &sem); +#else { - ereport(ERROR, - (errmsg("parsing of keyring options failed: %s", - json_errdetail(jerr, jlex)))); + JsonParseErrorType jerr = pg_parse_json(jlex, &sem); + + if (jerr != JSON_SUCCESS) + { + ereport(ERROR, + errmsg("parsing of keyring options failed: %s", + json_errdetail(jerr, jlex))); + } } -#if PG_VERSION_NUM >= 170000 - freeJsonLexContext(jlex); #endif - return jerr == JSON_SUCCESS; + freeJsonLexContext(jlex); } /* * JSON parser semantic actions */ -/* - * Invoked at the start of each object in the JSON document. - * - * Every new object increases the level of nesting as the whole document is the - * object itself (level 0) and every next one means going deeper into nesting. - * - * On the top level, we expect either scalar (string) values or objects referencing - * the external value of the field. Hence, if we are on level 1, we expect an - * "external field object" e.g. ({"type" : "remote", "url" : "http://localhost:8888/hello"}) - */ static JsonParseErrorType -json_kring_object_start(void *state) +json_kring_array_start(void *state) { JsonKeyringState *parse = state; - if (MAX_JSON_DEPTH == ++parse->level) - { - elog(WARNING, "reached max depth of JSON nesting"); - return JSON_SEM_ACTION_FAILED; - } - - switch (parse->level) + switch (parse->state) { - case 0: - parse->state = JK_EXPECT_TOP_FIELD; + case JK_EXPECT_TOP_LEVEL_OBJECT: + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("key provider options must be an object")); break; - case 1: - parse->state = JK_EXPECT_EXTERN_VAL; + case JK_EXPECT_FIELD: + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unexpected array in field \"%s\"", JK_FIELD_NAMES[parse->current_field])); break; } - return JSON_SUCCESS; + /* Never reached */ + Assert(false); + return JSON_SEM_ACTION_FAILED; } /* - * Invoked at the end of each object in the JSON document. - * - * First, it means we are going back to the higher level. Plus, if it was the - * level 1, we expect only external objects there, which means we have all - * the necessary info to extract the value and assign the result to the - * appropriate (parent) field. + * Invoked at the start of each object in the JSON document. */ static JsonParseErrorType -json_kring_object_end(void *state) +json_kring_object_start(void *state) { JsonKeyringState *parse = state; - /* - * we're done with the nested object and if it's an external field, the - * value should be extracted and assigned to the parent "field". for - * example if : "field" : {"type" : "remote", "url" : - * "http://localhost:8888/hello"} or "field" : {"type" : "file", "path" : - * "/tmp/datafile-location"} the "field"'s value should be the content of - * "path" or "url" respectively - */ - if (parse->level == 1) + switch (parse->state) { - if (parse->state == JK_EXPECT_EXTERN_VAL) - { - JsonKeyringField parent_field = parse->field[0]; - JsonParseErrorType ret; - - char *value = NULL; - - if (strcmp(parse->field_type, KEYRING_REMOTE_FIELD_TYPE) == 0) - value = get_remote_kring_value(parse->extern_url, JK_FIELD_NAMES[parent_field]); - if (strcmp(parse->field_type, KEYRING_FILE_FIELD_TYPE) == 0) - value = get_file_kring_value(parse->extern_path, JK_FIELD_NAMES[parent_field]); - - if (value == NULL) - { - return JSON_INCOMPLETE; - } - - ret = json_kring_assign_scalar(parse, parent_field, value); - - if (ret != JSON_SUCCESS) - { - return ret; - } - } - - parse->state = JK_EXPECT_TOP_FIELD; + case JK_EXPECT_TOP_LEVEL_OBJECT: + parse->state = JK_EXPECT_FIELD; + break; + case JK_EXPECT_FIELD: + elog(ERROR, "key provider value cannot be an object"); + break; } - parse->level--; - return JSON_SUCCESS; } /* * Invoked at the start of each object field in the JSON document. * - * Based on the given field name and the semantic state (we expect a top-level - * field or an external object) we set the state so that when we get the value, - * we know what is it and where to assign it. + * Based on the given field name and the semantic state we set the state so + * that when we get the value, we know what is it and where to assign it. */ static JsonParseErrorType json_kring_object_field_start(void *state, char *fname, bool isnull) { JsonKeyringState *parse = state; - JsonKeyringField *field; - - Assert(parse->level >= 0); - - field = &parse->field[parse->level]; switch (parse->state) { - case JK_EXPECT_TOP_FIELD: - - /* - * On the top level, "type" stores a keyring type and this field - * is common for all keyrings. The rest of the fields depend on - * the keyring type. - */ - if (strcmp(fname, JK_FIELD_NAMES[JK_KRING_TYPE]) == 0) - { - *field = JK_KRING_TYPE; - break; - } + case JK_EXPECT_TOP_LEVEL_OBJECT: + Assert(false); + elog(ERROR, "invalid semantic state"); + break; + case JK_EXPECT_FIELD: switch (parse->provider_type) { case FILE_KEY_PROVIDER: - if (strcmp(fname, JK_FIELD_NAMES[JF_FILE_PATH]) == 0) - *field = JF_FILE_PATH; + if (strcmp(fname, JK_FIELD_NAMES[JK_FILE_PATH]) == 0) + parse->current_field = JK_FILE_PATH; else { - *field = JK_FIELD_UNKNOWN; - elog(ERROR, "parse file keyring config: unexpected field %s", fname); + parse->current_field = JK_FIELD_UNKNOWN; + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unexpected field \"%s\" for file provider", fname)); } break; case VAULT_V2_KEY_PROVIDER: - if (strcmp(fname, JK_FIELD_NAMES[JK_VAULT_TOKEN]) == 0) - *field = JK_VAULT_TOKEN; + if (strcmp(fname, JK_FIELD_NAMES[JK_VAULT_TOKEN_PATH]) == 0) + parse->current_field = JK_VAULT_TOKEN_PATH; else if (strcmp(fname, JK_FIELD_NAMES[JK_VAULT_URL]) == 0) - *field = JK_VAULT_URL; + parse->current_field = JK_VAULT_URL; else if (strcmp(fname, JK_FIELD_NAMES[JK_VAULT_MOUNT_PATH]) == 0) - *field = JK_VAULT_MOUNT_PATH; + parse->current_field = JK_VAULT_MOUNT_PATH; else if (strcmp(fname, JK_FIELD_NAMES[JK_VAULT_CA_PATH]) == 0) - *field = JK_VAULT_CA_PATH; + parse->current_field = JK_VAULT_CA_PATH; else { - *field = JK_FIELD_UNKNOWN; - elog(ERROR, "parse json keyring config: unexpected field %s", fname); + parse->current_field = JK_FIELD_UNKNOWN; + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unexpected field \"%s\" for vault-v2 provider", fname)); } break; case KMIP_KEY_PROVIDER: if (strcmp(fname, JK_FIELD_NAMES[JK_KMIP_HOST]) == 0) - *field = JK_KMIP_HOST; + parse->current_field = JK_KMIP_HOST; else if (strcmp(fname, JK_FIELD_NAMES[JK_KMIP_PORT]) == 0) - *field = JK_KMIP_PORT; + parse->current_field = JK_KMIP_PORT; else if (strcmp(fname, JK_FIELD_NAMES[JK_KMIP_CA_PATH]) == 0) - *field = JK_KMIP_CA_PATH; + parse->current_field = JK_KMIP_CA_PATH; else if (strcmp(fname, JK_FIELD_NAMES[JK_KMIP_CERT_PATH]) == 0) - *field = JK_KMIP_CERT_PATH; + parse->current_field = JK_KMIP_CERT_PATH; + else if (strcmp(fname, JK_FIELD_NAMES[JK_KMIP_KEY_PATH]) == 0) + parse->current_field = JK_KMIP_KEY_PATH; else { - *field = JK_FIELD_UNKNOWN; - elog(ERROR, "parse json keyring config: unexpected field %s", fname); + parse->current_field = JK_FIELD_UNKNOWN; + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unexpected field \"%s\" for vault-v2 provider", fname)); } break; @@ -373,22 +262,9 @@ json_kring_object_field_start(void *state, char *fname, bool isnull) return JSON_INVALID_TOKEN; } break; - - case JK_EXPECT_EXTERN_VAL: - if (strcmp(fname, JK_FIELD_NAMES[JK_FIELD_TYPE]) == 0) - *field = JK_FIELD_TYPE; - else if (strcmp(fname, JK_FIELD_NAMES[JK_REMOTE_URL]) == 0) - *field = JK_REMOTE_URL; - else if (strcmp(fname, JK_FIELD_NAMES[JK_FIELD_PATH]) == 0) - *field = JK_FIELD_PATH; - else - { - *field = JK_FIELD_UNKNOWN; - elog(ERROR, "parse json keyring config: unexpected field %s", fname); - } - break; } + pfree(fname); return JSON_SUCCESS; } @@ -402,39 +278,57 @@ static JsonParseErrorType json_kring_scalar(void *state, char *token, JsonTokenType tokentype) { JsonKeyringState *parse = state; + char *value; - return json_kring_assign_scalar(parse, parse->field[parse->level], token); -} - -static JsonParseErrorType -json_kring_assign_scalar(JsonKeyringState *parse, JsonKeyringField field, char *value) -{ - VaultV2Keyring *vault = parse->provider_opts; - FileKeyring *file = parse->provider_opts; - KmipKeyring *kmip = parse->provider_opts; + if (parse->state == JK_EXPECT_TOP_LEVEL_OBJECT) + { + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("key provider options must be an object")); + } - switch (field) + switch (tokentype) { - case JK_KRING_TYPE: - parse->kring_type = value; + case JSON_TOKEN_STRING: + case JSON_TOKEN_NUMBER: + value = token; break; - - case JK_FIELD_TYPE: - parse->field_type = value; + case JSON_TOKEN_TRUE: + case JSON_TOKEN_FALSE: + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unexpected boolean in field \"%s\"", JK_FIELD_NAMES[parse->current_field])); break; - case JK_REMOTE_URL: - parse->extern_url = value; + case JSON_TOKEN_NULL: + value = NULL; + pfree(token); break; - case JK_FIELD_PATH: - parse->extern_path = value; + default: + Assert(false); + elog(ERROR, "invalid token type"); break; + } + + json_kring_assign_scalar(parse, parse->current_field, value); + + return JSON_SUCCESS; +} + +static void +json_kring_assign_scalar(JsonKeyringState *parse, JsonKeyringField field, char *value) +{ + VaultV2Keyring *vault = (VaultV2Keyring *) parse->provider_opts; + FileKeyring *file = (FileKeyring *) parse->provider_opts; + KmipKeyring *kmip = (KmipKeyring *) parse->provider_opts; - case JF_FILE_PATH: + switch (field) + { + case JK_FILE_PATH: file->file_name = value; break; - case JK_VAULT_TOKEN: - vault->vault_token = value; + case JK_VAULT_TOKEN_PATH: + vault->vault_token_path = value; break; case JK_VAULT_URL: vault->vault_url = value; @@ -458,63 +352,12 @@ json_kring_assign_scalar(JsonKeyringState *parse, JsonKeyringField field, char * case JK_KMIP_CERT_PATH: kmip->kmip_cert_path = value; break; + case JK_KMIP_KEY_PATH: + kmip->kmip_key_path = value; + break; default: + Assert(false); elog(ERROR, "json keyring: unexpected scalar field %d", field); } - - return JSON_SUCCESS; -} - -static char * -get_remote_kring_value(const char *url, const char *field_name) -{ - long httpCode; - CurlString outStr; - - outStr.ptr = palloc0(1); - outStr.len = 0; - - if (!curlSetupSession(url, NULL, &outStr)) - { - elog(ERROR, "CURL error for remote object %s", field_name); - } - if (curl_easy_perform(keyringCurl) != CURLE_OK) - { - elog(ERROR, "HTTP request error for remote object %s", field_name); - } - if (curl_easy_getinfo(keyringCurl, CURLINFO_RESPONSE_CODE, &httpCode) != CURLE_OK) - { - elog(ERROR, "HTTP error for remote object %s, HTTP code %li", field_name, httpCode); - } - - /* remove trailing whitespace */ - outStr.ptr[strcspn(outStr.ptr, " \t\n\r")] = '\0'; - - return outStr.ptr; -} - -static char * -get_file_kring_value(const char *path, const char *field_name) -{ - int fd = -1; - char *val; - - fd = BasicOpenFile(path, O_RDONLY); - if (fd < 0) - { - elog(ERROR, "failed to open file %s for %s", path, field_name); - } - - val = palloc0(MAX_CONFIG_FILE_DATA_LENGTH); - if (pg_pread(fd, val, MAX_CONFIG_FILE_DATA_LENGTH, 0) == -1) - { - close(fd); - elog(ERROR, "failed to read file %s for %s", path, field_name); - } - /* remove trailing whitespace */ - val[strcspn(val, " \t\n\r")] = '\0'; - - close(fd); - return val; } diff --git a/contrib/pg_tde/src/catalog/tde_principal_key.c b/contrib/pg_tde/src/catalog/tde_principal_key.c index 3e7db9a9afe88..97ae2a612babe 100644 --- a/contrib/pg_tde/src/catalog/tde_principal_key.c +++ b/contrib/pg_tde/src/catalog/tde_principal_key.c @@ -1,74 +1,64 @@ -/*------------------------------------------------------------------------- - * - * tde_principal_key.c - * Deals with the tde principal key configuration catalog - * routines. - * - * IDENTIFICATION - * contrib/pg_tde/src/catalog/tde_principal_key.c - * - *------------------------------------------------------------------------- +/* + * Deals with the tde principal key configuration catalog routines. */ + #include "postgres.h" + +#include +#include + #include "access/xlog.h" #include "access/xloginsert.h" -#include "catalog/tde_principal_key.h" -#include "storage/fd.h" -#include "utils/palloc.h" -#include "utils/memutils.h" -#include "utils/wait_event.h" -#include "utils/timestamp.h" +#include "catalog/pg_database.h" #include "common/relpath.h" #include "miscadmin.h" +#include "storage/fd.h" #include "utils/builtins.h" -#include "pg_tde.h" -#include "access/pg_tde_xlog.h" -#include -#include #include "utils/fmgroids.h" #include "utils/guc.h" -#include "catalog/pg_database.h" -#include "keyring/keyring_api.h" +#include "utils/memutils.h" +#include "utils/palloc.h" +#include "utils/timestamp.h" +#include "utils/wait_event.h" #include "access/pg_tde_tdemap.h" +#include "access/pg_tde_xlog_keys.h" +#include "access/pg_tde_xlog.h" #include "catalog/tde_global_space.h" +#include "catalog/tde_principal_key.h" +#include "keyring/keyring_api.h" +#include "pg_tde.h" + #ifndef FRONTEND #include "access/genam.h" +#include "access/heapam.h" #include "access/table.h" -#include "common/pg_tde_shmem.h" +#include "access/tableam.h" #include "funcapi.h" #include "lib/dshash.h" #include "storage/lwlock.h" #include "storage/shmem.h" +#include "pg_tde_guc.h" #else #include "pg_tde_fe.h" #endif -#include "pg_tde_guc.h" - -#include #ifndef FRONTEND -PG_FUNCTION_INFO_V1(pg_tde_delete_key_provider); -PG_FUNCTION_INFO_V1(pg_tde_delete_global_key_provider); - -PG_FUNCTION_INFO_V1(pg_tde_verify_principal_key); -PG_FUNCTION_INFO_V1(pg_tde_verify_global_principal_key); +PG_FUNCTION_INFO_V1(pg_tde_verify_key); +PG_FUNCTION_INFO_V1(pg_tde_verify_server_key); +PG_FUNCTION_INFO_V1(pg_tde_verify_default_key); typedef struct TdePrincipalKeySharedState { LWLockPadded *Locks; - int hashTrancheId; dshash_table_handle hashHandle; void *rawDsaArea; /* DSA area pointer */ - } TdePrincipalKeySharedState; typedef struct TdePrincipalKeylocalState { TdePrincipalKeySharedState *sharedPrincipalKeyState; - dsa_area *dsa; /* local dsa area for backend attached to the - * dsa area created by postmaster at startup. */ dshash_table *sharedHash; } TdePrincipalKeylocalState; @@ -81,83 +71,35 @@ static dshash_parameters principal_key_dsh_params = { .entry_size = sizeof(TDEPrincipalKey), .compare_function = dshash_memcmp, .hash_function = dshash_memhash, + .copy_function = dshash_memcpy, }; -TdePrincipalKeylocalState principalKeyLocalState; +static TdePrincipalKeylocalState principalKeyLocalState; static void principal_key_info_attach_shmem(void); -static Size initialize_shared_state(void *start_address); -static void initialize_objects_in_dsa_area(dsa_area *dsa, void *raw_dsa_area); -static Size required_shared_mem_size(void); -static void shared_memory_shutdown(int code, Datum arg); -static void principal_key_startup_cleanup(int tde_tbl_count, XLogExtensionInstall *ext_info, bool redo, void *arg); static void clear_principal_key_cache(Oid databaseId); -static inline dshash_table *get_principal_key_Hash(void); +static inline dshash_table *get_principal_key_hash(void); static TDEPrincipalKey *get_principal_key_from_cache(Oid dbOid); static bool pg_tde_is_same_principal_key(TDEPrincipalKey *a, TDEPrincipalKey *b); -static void pg_tde_update_global_principal_key_everywhere(TDEPrincipalKey *oldKey, TDEPrincipalKey *newKey); +static void pg_tde_update_default_principal_key_everywhere(TDEPrincipalKey *oldKey, TDEPrincipalKey *newKey); static void push_principal_key_to_cache(TDEPrincipalKey *principalKey); static Datum pg_tde_get_key_info(PG_FUNCTION_ARGS, Oid dbOid); static TDEPrincipalKey *get_principal_key_from_keyring(Oid dbOid); static TDEPrincipalKey *GetPrincipalKeyNoDefault(Oid dbOid, LWLockMode lockMode); -static void set_principal_key_with_keyring(const char *key_name, - const char *provider_name, - Oid providerOid, - Oid dbOid, - bool ensure_new_key); -static bool pg_tde_is_provider_used(Oid databaseOid, Oid providerId); static bool pg_tde_verify_principal_key_internal(Oid databaseOid); - -static Datum pg_tde_delete_key_provider_internal(PG_FUNCTION_ARGS, int is_global); - -PG_FUNCTION_INFO_V1(pg_tde_set_default_principal_key); -Datum pg_tde_set_default_principal_key(PG_FUNCTION_ARGS); - -PG_FUNCTION_INFO_V1(pg_tde_set_principal_key); -Datum pg_tde_set_principal_key(PG_FUNCTION_ARGS); - -PG_FUNCTION_INFO_V1(pg_tde_set_global_principal_key); -Datum pg_tde_set_principal_key(PG_FUNCTION_ARGS); - -PG_FUNCTION_INFO_V1(pg_tde_set_server_principal_key); -Datum pg_tde_set_principal_key(PG_FUNCTION_ARGS); - -enum global_status -{ - GS_LOCAL, - GS_GLOBAL, - GS_SERVER, - GS_DEFAULT -}; - -static void pg_tde_set_principal_key_internal(char *principal_key_name, enum global_status global, char *provider_name, bool ensure_new_key); - -static const TDEShmemSetupRoutine principal_key_info_shmem_routine = { - .init_shared_state = initialize_shared_state, - .init_dsa_area_objects = initialize_objects_in_dsa_area, - .required_shared_mem_size = required_shared_mem_size, - .shmem_kill = shared_memory_shutdown -}; - -void -InitializePrincipalKeyInfo(void) -{ - ereport(LOG, (errmsg("Initializing TDE principal key info"))); - RegisterShmemRequest(&principal_key_info_shmem_routine); - on_ext_install(principal_key_startup_cleanup, NULL); -} - -/* - * Lock to guard internal/principal key. Usually, this lock has to be held until - * the caller fetches an internal_key or rotates the principal. - */ -LWLock * -tde_lwlock_enc_keys(void) -{ - Assert(principalKeyLocalState.sharedPrincipalKeyState); - - return &principalKeyLocalState.sharedPrincipalKeyState->Locks[TDE_LWLOCK_ENC_KEY].lock; -} +static void pg_tde_create_principal_key_internal(Oid providerOid, const char *key_name, const char *provider_name); +static void pg_tde_rotate_default_key_for_database(TDEPrincipalKey *oldKey, TDEPrincipalKey *newKeyTemplate); +static void pg_tde_set_principal_key_internal(Oid providerOid, Oid dbOid, const char *principal_key_name, const char *provider_name); +static void set_principal_key_with_keyring(const char *key_name, const char *provider_name, Oid providerOid, Oid dbOid); + +PG_FUNCTION_INFO_V1(pg_tde_create_key_using_database_key_provider); +PG_FUNCTION_INFO_V1(pg_tde_create_key_using_global_key_provider); +PG_FUNCTION_INFO_V1(pg_tde_set_default_key_using_global_key_provider); +PG_FUNCTION_INFO_V1(pg_tde_set_key_using_database_key_provider); +PG_FUNCTION_INFO_V1(pg_tde_set_key_using_global_key_provider); +PG_FUNCTION_INFO_V1(pg_tde_set_server_key_using_global_key_provider); +PG_FUNCTION_INFO_V1(pg_tde_delete_key); +PG_FUNCTION_INFO_V1(pg_tde_delete_default_key); /* * Request some pages so we can fit the DSA header, empty hash table plus some @@ -169,8 +111,8 @@ tde_lwlock_enc_keys(void) */ #define CACHE_DSA_INITIAL_SIZE (4096 * 64) -static Size -required_shared_mem_size(void) +Size +PrincipalKeyShmemSize(void) { Size sz = CACHE_DSA_INITIAL_SIZE; @@ -178,45 +120,73 @@ required_shared_mem_size(void) return MAXALIGN(sz); } -/* - * Initialize the shared area for Principal key info. - * This includes locks and cache area for principal key info - */ - -static Size -initialize_shared_state(void *start_address) +void +PrincipalKeyShmemInit(void) { - TdePrincipalKeySharedState *sharedState = (TdePrincipalKeySharedState *) start_address; + bool found; + char *free_start; + Size required_shmem_size = PrincipalKeyShmemSize(); - ereport(LOG, (errmsg("initializing shared state for principal key"))); - principalKeyLocalState.dsa = NULL; - principalKeyLocalState.sharedHash = NULL; + Assert(LWLockHeldByMeInMode(AddinShmemInitLock, LW_EXCLUSIVE)); - sharedState->Locks = GetNamedLWLockTranche(TDE_TRANCHE_NAME); + /* Create or attach to the shared memory state */ + ereport(NOTICE, errmsg("PrincipalKeyShmemInit: requested %ld bytes", required_shmem_size)); + free_start = ShmemInitStruct("pg_tde", required_shmem_size, &found); - principalKeyLocalState.sharedPrincipalKeyState = sharedState; - return sizeof(TdePrincipalKeySharedState); -} + if (!found) + { + TdePrincipalKeySharedState *sharedState; + Size sz; + Size dsa_area_size; + dsa_area *dsa; + dshash_table *dsh; -void -initialize_objects_in_dsa_area(dsa_area *dsa, void *raw_dsa_area) -{ - dshash_table *dsh; - TdePrincipalKeySharedState *sharedState = principalKeyLocalState.sharedPrincipalKeyState; + /* Now place shared state structure */ + sharedState = (TdePrincipalKeySharedState *) free_start; + sz = MAXALIGN(sizeof(TdePrincipalKeySharedState)); + free_start += sz; + Assert(sz <= required_shmem_size); - ereport(LOG, (errmsg("initializing dsa area objects for principal key"))); + /* Create DSA area */ + dsa_area_size = required_shmem_size - sz; + Assert(dsa_area_size > 0); - Assert(sharedState != NULL); + ereport(LOG, errmsg("creating DSA area of size %lu", dsa_area_size)); - sharedState->rawDsaArea = raw_dsa_area; - sharedState->hashTrancheId = LWLockNewTrancheId(); - principal_key_dsh_params.tranche_id = sharedState->hashTrancheId; -#if PG_VERSION_NUM >= 170000 - principal_key_dsh_params.copy_function = dshash_memcpy; -#endif - dsh = dshash_create(dsa, &principal_key_dsh_params, 0); - sharedState->hashHandle = dshash_get_hash_table_handle(dsh); - dshash_detach(dsh); + dsa = dsa_create_in_place(free_start, + dsa_area_size, + LWLockNewTrancheId(), 0); + dsa_pin(dsa); + + /* Limit area size during population to get a nice error */ + dsa_set_size_limit(dsa, dsa_area_size); + + principal_key_dsh_params.tranche_id = LWLockNewTrancheId(); + dsh = dshash_create(dsa, &principal_key_dsh_params, NULL); + + dsa_set_size_limit(dsa, -1); + + sharedState->Locks = GetNamedLWLockTranche(TDE_TRANCHE_NAME); + sharedState->hashHandle = dshash_get_hash_table_handle(dsh); + sharedState->rawDsaArea = free_start; + + principalKeyLocalState.sharedPrincipalKeyState = sharedState; + principalKeyLocalState.sharedHash = NULL; + + dshash_detach(dsh); + } +} + +/* + * Lock to guard internal/principal key. Usually, this lock has to be held until + * the caller fetches an internal_key or rotates the principal. + */ +LWLock * +tde_lwlock_enc_keys(void) +{ + Assert(principalKeyLocalState.sharedPrincipalKeyState); + + return &principalKeyLocalState.sharedPrincipalKeyState->Locks[TDE_LWLOCK_ENC_KEY].lock; } /* @@ -226,9 +196,7 @@ static void principal_key_info_attach_shmem(void) { MemoryContext oldcontext; - - if (principalKeyLocalState.dsa) - return; + dsa_area *dsa; /* * We want the dsa to remain valid throughout the lifecycle of this @@ -236,43 +204,27 @@ principal_key_info_attach_shmem(void) */ oldcontext = MemoryContextSwitchTo(TopMemoryContext); - principalKeyLocalState.dsa = dsa_attach_in_place(principalKeyLocalState.sharedPrincipalKeyState->rawDsaArea, - NULL); - - /* - * pin the attached area to keep the area attached until end of session or - * explicit detach. - */ - dsa_pin_mapping(principalKeyLocalState.dsa); + dsa = dsa_attach_in_place(principalKeyLocalState.sharedPrincipalKeyState->rawDsaArea, NULL); + dsa_pin_mapping(dsa); - principal_key_dsh_params.tranche_id = principalKeyLocalState.sharedPrincipalKeyState->hashTrancheId; - principalKeyLocalState.sharedHash = dshash_attach(principalKeyLocalState.dsa, &principal_key_dsh_params, + principalKeyLocalState.sharedHash = dshash_attach(dsa, &principal_key_dsh_params, principalKeyLocalState.sharedPrincipalKeyState->hashHandle, 0); - MemoryContextSwitchTo(oldcontext); -} -static void -shared_memory_shutdown(int code, Datum arg) -{ - principalKeyLocalState.sharedPrincipalKeyState = NULL; + MemoryContextSwitchTo(oldcontext); } void -set_principal_key_with_keyring(const char *key_name, const char *provider_name, - Oid providerOid, Oid dbOid, bool ensure_new_key) +set_principal_key_with_keyring(const char *key_name, + const char *provider_name, + Oid providerOid, + Oid dbOid) { - TDEPrincipalKey *curr_principal_key = NULL; - TDEPrincipalKey *new_principal_key = NULL; + TDEPrincipalKey *curr_principal_key; + TDEPrincipalKey *new_principal_key; LWLock *lock_files = tde_lwlock_enc_keys(); - bool already_has_key = false; + bool already_has_key; GenericKeyring *new_keyring; - const KeyInfo *keyInfo = NULL; - - if (AllowInheritGlobalProviders == false && providerOid != dbOid) - { - ereport(ERROR, - (errmsg("Usage of global key providers is disabled. Enable it with pg_tde.inherit_global_providers = ON"))); - } + KeyInfo *keyInfo = NULL; /* * Try to get principal key from cache. @@ -282,53 +234,33 @@ set_principal_key_with_keyring(const char *key_name, const char *provider_name, curr_principal_key = GetPrincipalKeyNoDefault(dbOid, LW_EXCLUSIVE); already_has_key = (curr_principal_key != NULL); - if (provider_name == NULL && !already_has_key) - { - ereport(ERROR, - (errmsg("provider_name is a required parameter when creating the first principal key for a database"))); - } - - if (provider_name != NULL) - { - new_keyring = GetKeyProviderByName(provider_name, providerOid); - } - else - { - new_keyring = GetKeyProviderByID(curr_principal_key->keyInfo.keyringId, - curr_principal_key->keyInfo.databaseId); - } + new_keyring = GetKeyProviderByName(provider_name, providerOid); { - KeyringReturnCodes kr_ret; + KeyringReturnCode return_code; - keyInfo = KeyringGetKey(new_keyring, key_name, &kr_ret); + keyInfo = KeyringGetKey(new_keyring, key_name, &return_code); - if (kr_ret != KEYRING_CODE_SUCCESS && kr_ret != KEYRING_CODE_RESOURCE_NOT_AVAILABLE) + if (return_code != KEYRING_CODE_SUCCESS) { ereport(ERROR, - (errmsg("failed to retrieve principal key from keyring provider :\"%s\"", new_keyring->provider_name), - errdetail("Error code: %d", kr_ret))); + errmsg("failed to retrieve principal key \"%s\" from key provider \"%s\"", key_name, new_keyring->provider_name), + errdetail("%s", KeyringErrorCodeToString(return_code))); } } - if (keyInfo != NULL && ensure_new_key) - { - ereport(ERROR, - (errmsg("failed to create principal key: already exists"))); - } - - if (strlen(key_name) >= sizeof(keyInfo->name)) - ereport(ERROR, - (errcode(ERRCODE_INVALID_PARAMETER_VALUE), - errmsg("too long principal key name, maximum lenght is %ld bytes", sizeof(keyInfo->name) - 1))); - - if (keyInfo == NULL) - keyInfo = KeyringGenerateNewKeyAndStore(new_keyring, key_name, PRINCIPAL_KEY_LEN); - - if (keyInfo == NULL) + if (!keyInfo) { - ereport(ERROR, - (errmsg("failed to retrieve/create principal key."))); + if (providerOid == GLOBAL_DATA_TDE_OID) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("key \"%s\" does not exist", key_name), + errhint("Use pg_tde_create_key_using_global_key_provider() to create it.")); + else + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("key \"%s\" does not exist", key_name), + errhint("Use pg_tde_create_key_using_database_key_provider() to create it.")); } new_principal_key = palloc_object(TDEPrincipalKey); @@ -343,30 +275,29 @@ set_principal_key_with_keyring(const char *key_name, const char *provider_name, if (!already_has_key) { /* First key created for the database */ - pg_tde_save_principal_key(&new_principal_key->keyInfo); - - /* XLog the new key */ - XLogBeginInsert(); - XLogRegisterData((char *) &new_principal_key->keyInfo, sizeof(TDEPrincipalKeyInfo)); - XLogInsert(RM_TDERMGR_ID, XLOG_TDE_ADD_PRINCIPAL_KEY); - + if (dbOid == GLOBAL_DATA_TDE_OID) + pg_tde_save_server_key(new_principal_key, true); + else + pg_tde_save_principal_key(new_principal_key, true); push_principal_key_to_cache(new_principal_key); } else { /* key rotation */ - pg_tde_perform_rotate_key(curr_principal_key, new_principal_key); + if (dbOid == GLOBAL_DATA_TDE_OID) + pg_tde_perform_rotate_server_key(curr_principal_key, new_principal_key, true); + else + pg_tde_perform_rotate_key(curr_principal_key, new_principal_key, true); - if (!TDEisInGlobalSpace(curr_principal_key->keyInfo.databaseId)) - { - clear_principal_key_cache(curr_principal_key->keyInfo.databaseId); - push_principal_key_to_cache(new_principal_key); - } + clear_principal_key_cache(curr_principal_key->keyInfo.databaseId); + push_principal_key_to_cache(new_principal_key); } LWLockRelease(lock_files); + pfree(keyInfo); pfree(new_keyring); + pfree(new_principal_key); } /* @@ -375,12 +306,61 @@ set_principal_key_with_keyring(const char *key_name, const char *provider_name, void xl_tde_perform_rotate_key(XLogPrincipalKeyRotate *xlrec) { + TDEPrincipalKey *curr_principal_key; + TDEPrincipalKey *new_principal_key; + GenericKeyring *new_keyring; + KeyInfo *keyInfo; + KeyringReturnCode return_code; + LWLockAcquire(tde_lwlock_enc_keys(), LW_EXCLUSIVE); - pg_tde_write_map_keydata_file(xlrec->file_size, xlrec->buff); - clear_principal_key_cache(xlrec->databaseId); + curr_principal_key = GetPrincipalKeyNoDefault(xlrec->databaseId, LW_EXCLUSIVE); + + /* Should not happen */ + if (curr_principal_key == NULL) + { + ereport(ERROR, errmsg("failed to retrieve current principal key for database %u.", xlrec->databaseId)); + } + + new_keyring = GetKeyProviderByID(xlrec->keyringId, xlrec->databaseId); + keyInfo = KeyringGetKey(new_keyring, xlrec->keyName, &return_code); + + if (return_code != KEYRING_CODE_SUCCESS) + { + ereport(ERROR, + errmsg("failed to retrieve principal key \"%s\" from key provider \"%s\"", xlrec->keyName, new_keyring->provider_name), + errdetail("%s", KeyringErrorCodeToString(return_code))); + } + + /* The new key should be on keyring by this time */ + if (keyInfo == NULL) + { + ereport(ERROR, errmsg("failed to retrieve principal key \"%s\" from key provider \"%s\" for database %u", + xlrec->keyName, new_keyring->provider_name, xlrec->databaseId)); + } + + new_principal_key = palloc_object(TDEPrincipalKey); + new_principal_key->keyInfo.databaseId = xlrec->databaseId; + new_principal_key->keyInfo.keyringId = new_keyring->keyring_id; + memcpy(new_principal_key->keyInfo.name, keyInfo->name, TDE_KEY_NAME_LEN); + gettimeofday(&new_principal_key->keyInfo.creationTime, NULL); + new_principal_key->keyLength = keyInfo->data.len; + + memcpy(new_principal_key->keyData, keyInfo->data.data, keyInfo->data.len); + + if (xlrec->databaseId == GLOBAL_DATA_TDE_OID) + pg_tde_perform_rotate_server_key(curr_principal_key, new_principal_key, false); + else + pg_tde_perform_rotate_key(curr_principal_key, new_principal_key, false); + + clear_principal_key_cache(curr_principal_key->keyInfo.databaseId); + push_principal_key_to_cache(new_principal_key); LWLockRelease(tde_lwlock_enc_keys()); + + pfree(keyInfo); + pfree(new_keyring); + pfree(new_principal_key); } /* @@ -389,9 +369,10 @@ xl_tde_perform_rotate_key(XLogPrincipalKeyRotate *xlrec) */ static inline dshash_table * -get_principal_key_Hash(void) +get_principal_key_hash(void) { - principal_key_info_attach_shmem(); + if (!principalKeyLocalState.sharedHash) + principal_key_info_attach_shmem(); return principalKeyLocalState.sharedHash; } @@ -403,10 +384,10 @@ get_principal_key_from_cache(Oid dbOid) { TDEPrincipalKey *cacheEntry = NULL; - cacheEntry = (TDEPrincipalKey *) dshash_find(get_principal_key_Hash(), + cacheEntry = (TDEPrincipalKey *) dshash_find(get_principal_key_hash(), &dbOid, false); if (cacheEntry) - dshash_release_lock(get_principal_key_Hash(), cacheEntry); + dshash_release_lock(get_principal_key_hash(), cacheEntry); return cacheEntry; } @@ -428,12 +409,12 @@ push_principal_key_to_cache(TDEPrincipalKey *principalKey) Oid databaseId = principalKey->keyInfo.databaseId; bool found = false; - cacheEntry = dshash_find_or_insert(get_principal_key_Hash(), + cacheEntry = dshash_find_or_insert(get_principal_key_hash(), &databaseId, &found); if (!found) *cacheEntry = *principalKey; - dshash_release_lock(get_principal_key_Hash(), cacheEntry); + dshash_release_lock(get_principal_key_hash(), cacheEntry); /* we don't want principal keys to end up paged to the swap */ if (mlock(cacheEntry, sizeof(TDEPrincipalKey)) == -1) @@ -449,21 +430,13 @@ push_principal_key_to_cache(TDEPrincipalKey *principalKey) * at the time of extension creation to start fresh again. * Idelly we should have a mechanism to remove these when the extension * but unfortunately we do not have any such mechanism in PG. -*/ -static void -principal_key_startup_cleanup(int tde_tbl_count, XLogExtensionInstall *ext_info, bool redo, void *arg) + */ +void +principal_key_startup_cleanup(Oid databaseId) { - if (tde_tbl_count > 0) - { - ereport(WARNING, - (errmsg("Failed to perform initialization. database already has %d TDE tables", tde_tbl_count))); - return; - } + clear_principal_key_cache(databaseId); - clear_principal_key_cache(ext_info->database_id); - - /* Remove the tde files */ - pg_tde_delete_tde_files(ext_info->database_id); + pg_tde_delete_tde_files(databaseId); } static void @@ -472,11 +445,11 @@ clear_principal_key_cache(Oid databaseId) TDEPrincipalKey *cache_entry; /* Start with deleting the cache entry for the database */ - cache_entry = (TDEPrincipalKey *) dshash_find(get_principal_key_Hash(), + cache_entry = (TDEPrincipalKey *) dshash_find(get_principal_key_hash(), &databaseId, true); if (cache_entry) { - dshash_delete_entry(get_principal_key_Hash(), cache_entry); + dshash_delete_entry(get_principal_key_hash(), cache_entry); } } @@ -485,81 +458,188 @@ clear_principal_key_cache(Oid databaseId) */ Datum -pg_tde_set_default_principal_key(PG_FUNCTION_ARGS) +pg_tde_create_key_using_database_key_provider(PG_FUNCTION_ARGS) { - char *principal_key_name = text_to_cstring(PG_GETARG_TEXT_PP(0)); + char *key_name = PG_ARGISNULL(0) ? NULL : text_to_cstring(PG_GETARG_TEXT_PP(0)); char *provider_name = PG_ARGISNULL(1) ? NULL : text_to_cstring(PG_GETARG_TEXT_PP(1)); - bool ensure_new_key = PG_GETARG_BOOL(2); - pg_tde_set_principal_key_internal(principal_key_name, GS_DEFAULT, provider_name, ensure_new_key); + pg_tde_create_principal_key_internal(MyDatabaseId, + key_name, + provider_name); PG_RETURN_VOID(); } Datum -pg_tde_set_principal_key(PG_FUNCTION_ARGS) +pg_tde_create_key_using_global_key_provider(PG_FUNCTION_ARGS) { - char *principal_key_name = text_to_cstring(PG_GETARG_TEXT_PP(0)); + char *key_name = PG_ARGISNULL(0) ? NULL : text_to_cstring(PG_GETARG_TEXT_PP(0)); char *provider_name = PG_ARGISNULL(1) ? NULL : text_to_cstring(PG_GETARG_TEXT_PP(1)); - bool ensure_new_key = PG_GETARG_BOOL(2); - pg_tde_set_principal_key_internal(principal_key_name, GS_LOCAL, provider_name, ensure_new_key); + pg_tde_create_principal_key_internal(GLOBAL_DATA_TDE_OID, + key_name, + provider_name); + + PG_RETURN_VOID(); +} + +static void +pg_tde_create_principal_key_internal(Oid providerOid, + const char *key_name, + const char *provider_name) +{ + + GenericKeyring *provider; + KeyInfo *key_info; + KeyringReturnCode return_code; + + if (providerOid == GLOBAL_DATA_TDE_OID && !superuser()) + ereport(ERROR, + errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("must be superuser to access global key providers")); + if (providerOid == GLOBAL_DATA_TDE_OID && !AllowInheritGlobalProviders) + ereport(ERROR, + errmsg("usage of global key providers is disabled"), + errhint("Set \"pg_tde.inherit_global_providers = on\" in postgresql.conf.")); + + if (key_name == NULL) + ereport(ERROR, + errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), + errmsg("key name cannot be null")); + if (strlen(key_name) == 0) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("key name \"\" is too short")); + if (strlen(key_name) >= PRINCIPAL_KEY_NAME_LEN) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("key name \"%s\" is too long", key_name), + errhint("Maximum length is %d bytes.", PRINCIPAL_KEY_NAME_LEN - 1)); + if (provider_name == NULL) + ereport(ERROR, + errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), + errmsg("key provider name cannot be null")); + + provider = GetKeyProviderByName(provider_name, providerOid); + + key_info = KeyringGetKey(provider, key_name, &return_code); + + if (return_code != KEYRING_CODE_SUCCESS) + ereport(ERROR, + errmsg("failed to retrieve principal key \"%s\" from key provider \"%s\"", key_name, provider_name), + errdetail("%s", KeyringErrorCodeToString(return_code))); + + if (key_info != NULL) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("cannot create key \"%s\" because it already exists", key_name)); + + key_info = KeyringGenerateNewKeyAndStore(provider, key_name, PRINCIPAL_KEY_LEN); + + pfree(key_info); + pfree(provider); +} + +Datum +pg_tde_set_default_key_using_global_key_provider(PG_FUNCTION_ARGS) +{ + char *principal_key_name = PG_ARGISNULL(0) ? NULL : text_to_cstring(PG_GETARG_TEXT_PP(0)); + char *provider_name = PG_ARGISNULL(1) ? NULL : text_to_cstring(PG_GETARG_TEXT_PP(1)); + + /* Using a global provider for the default encryption setting */ + pg_tde_set_principal_key_internal(GLOBAL_DATA_TDE_OID, + DEFAULT_DATA_TDE_OID, + principal_key_name, + provider_name); PG_RETURN_VOID(); } Datum -pg_tde_set_global_principal_key(PG_FUNCTION_ARGS) +pg_tde_set_key_using_database_key_provider(PG_FUNCTION_ARGS) { - char *principal_key_name = text_to_cstring(PG_GETARG_TEXT_PP(0)); + char *principal_key_name = PG_ARGISNULL(0) ? NULL : text_to_cstring(PG_GETARG_TEXT_PP(0)); char *provider_name = PG_ARGISNULL(1) ? NULL : text_to_cstring(PG_GETARG_TEXT_PP(1)); - bool ensure_new_key = PG_GETARG_BOOL(2); - pg_tde_set_principal_key_internal(principal_key_name, GS_GLOBAL, provider_name, ensure_new_key); + /* Using a local provider for the current database */ + pg_tde_set_principal_key_internal(MyDatabaseId, + MyDatabaseId, + principal_key_name, + provider_name); PG_RETURN_VOID(); } Datum -pg_tde_set_server_principal_key(PG_FUNCTION_ARGS) +pg_tde_set_key_using_global_key_provider(PG_FUNCTION_ARGS) { - char *principal_key_name = text_to_cstring(PG_GETARG_TEXT_PP(0)); + char *principal_key_name = PG_ARGISNULL(0) ? NULL : text_to_cstring(PG_GETARG_TEXT_PP(0)); char *provider_name = PG_ARGISNULL(1) ? NULL : text_to_cstring(PG_GETARG_TEXT_PP(1)); - bool ensure_new_key = PG_GETARG_BOOL(2); - pg_tde_set_principal_key_internal(principal_key_name, GS_SERVER, provider_name, ensure_new_key); + /* Using a global provider for the current database */ + pg_tde_set_principal_key_internal(GLOBAL_DATA_TDE_OID, + MyDatabaseId, + principal_key_name, + provider_name); + + PG_RETURN_VOID(); +} + +Datum +pg_tde_set_server_key_using_global_key_provider(PG_FUNCTION_ARGS) +{ + char *principal_key_name = PG_ARGISNULL(0) ? NULL : text_to_cstring(PG_GETARG_TEXT_PP(0)); + char *provider_name = PG_ARGISNULL(1) ? NULL : text_to_cstring(PG_GETARG_TEXT_PP(1)); + + /* Using a global provider for the global (wal) database */ + pg_tde_set_principal_key_internal(GLOBAL_DATA_TDE_OID, + GLOBAL_DATA_TDE_OID, + principal_key_name, + provider_name); PG_RETURN_VOID(); } static void -pg_tde_set_principal_key_internal(char *principal_key_name, enum global_status global, char *provider_name, bool ensure_new_key) +pg_tde_set_principal_key_internal(Oid providerOid, + Oid dbOid, + const char *key_name, + const char *provider_name) { - Oid providerOid = MyDatabaseId; - Oid dbOid = MyDatabaseId; TDEPrincipalKey *existingDefaultKey = NULL; TDEPrincipalKey existingKeyCopy; - ereport(LOG, (errmsg("Setting principal key [%s : %s] for the database", principal_key_name, provider_name))); + if (providerOid == GLOBAL_DATA_TDE_OID && !superuser()) + ereport(ERROR, + errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("must be superuser to access global key providers")); + if (providerOid == GLOBAL_DATA_TDE_OID && !AllowInheritGlobalProviders) + ereport(ERROR, + errmsg("usage of global key providers is disabled"), + errhint("Set \"pg_tde.inherit_global_providers = on\" in postgresql.conf.")); - if (global == GS_GLOBAL) /* using a global provider for the current - * database */ - { - providerOid = GLOBAL_DATA_TDE_OID; - } - if (global == GS_SERVER) /* using a globla provider for the global - * (wal) database */ - { - providerOid = GLOBAL_DATA_TDE_OID; - dbOid = GLOBAL_DATA_TDE_OID; - } + if (key_name == NULL) + ereport(ERROR, + errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), + errmsg("key name cannot be null")); + if (strlen(key_name) == 0) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("key name \"\" is too short")); + if (strlen(key_name) >= PRINCIPAL_KEY_NAME_LEN) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("key name \"%s\" is too long", key_name), + errhint("Maximum length is %d bytes.", PRINCIPAL_KEY_NAME_LEN - 1)); + if (provider_name == NULL) + ereport(ERROR, + errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED), + errmsg("key provider name cannot be null")); - if (global == GS_DEFAULT) /* using a globla provider for the default - * encryption setting */ - { - providerOid = GLOBAL_DATA_TDE_OID; - dbOid = DEFAULT_DATA_TDE_OID; + ereport(LOG, errmsg("Setting principal key [%s : %s] for the database", key_name, provider_name)); + if (dbOid == DEFAULT_DATA_TDE_OID) + { /* Do we already have a default key? If yes, look up the name of it */ LWLockAcquire(tde_lwlock_enc_keys(), LW_SHARED); existingDefaultKey = GetPrincipalKeyNoDefault(dbOid, LW_SHARED); @@ -570,13 +650,12 @@ pg_tde_set_principal_key_internal(char *principal_key_name, enum global_status g LWLockRelease(tde_lwlock_enc_keys()); } - set_principal_key_with_keyring(principal_key_name, + set_principal_key_with_keyring(key_name, provider_name, providerOid, - dbOid, - ensure_new_key); + dbOid); - if (global == GS_DEFAULT && existingDefaultKey != NULL) + if (dbOid == DEFAULT_DATA_TDE_OID && existingDefaultKey != NULL) { /* * In the previous step, we marked a new default provider Now we have @@ -594,38 +673,217 @@ pg_tde_set_principal_key_internal(char *principal_key_name, enum global_status g LWLockAcquire(tde_lwlock_enc_keys(), LW_EXCLUSIVE); newDefaultKey = GetPrincipalKeyNoDefault(dbOid, LW_EXCLUSIVE); - pg_tde_update_global_principal_key_everywhere(&existingKeyCopy, newDefaultKey); + pg_tde_update_default_principal_key_everywhere(&existingKeyCopy, newDefaultKey); LWLockRelease(tde_lwlock_enc_keys()); } } -PG_FUNCTION_INFO_V1(pg_tde_principal_key_info); +/* + * SQL interface to delete principal key. + * + * This operation allowed if there is no any encrypted tables in the database or + * if the default principal key is set for the database. In second case, + * key for database rotated to the default key. + */ Datum -pg_tde_principal_key_info(PG_FUNCTION_ARGS) +pg_tde_delete_key(PG_FUNCTION_ARGS) +{ + TDEPrincipalKey *principal_key; + TDEPrincipalKey *default_principal_key; + + LWLockAcquire(tde_lwlock_enc_keys(), LW_EXCLUSIVE); + + principal_key = GetPrincipalKeyNoDefault(MyDatabaseId, LW_EXCLUSIVE); + if (principal_key == NULL) + ereport(ERROR, errmsg("principal key does not exists for the database")); + + ereport(LOG, errmsg("Deleting principal key [%s] for the database", principal_key->keyInfo.name)); + + /* + * If database has something encryted, we can try to fallback to the + * default principal key + */ + if (pg_tde_count_encryption_keys(MyDatabaseId) != 0) + { + default_principal_key = GetPrincipalKeyNoDefault(DEFAULT_DATA_TDE_OID, LW_EXCLUSIVE); + if (default_principal_key == NULL) + { + ereport(ERROR, + errcode(ERRCODE_OBJECT_IN_USE), + errmsg("cannot delete principal key"), + errdetail("There are encrypted tables in the database."), + errhint("Set default principal key as fallback option or decrypt all tables before deleting principal key.")); + } + + /* + * If database already encrypted with default principal key, there is + * nothing to do + */ + if (pg_tde_is_same_principal_key(principal_key, default_principal_key)) + { + ereport(ERROR, + errcode(ERRCODE_OBJECT_IN_USE), + errmsg("cannot delete principal key"), + errdetail("There are encrypted tables in the database.")); + } + + pg_tde_rotate_default_key_for_database(principal_key, default_principal_key); + + LWLockRelease(tde_lwlock_enc_keys()); + PG_RETURN_VOID(); + } + + pg_tde_delete_principal_key(MyDatabaseId); + clear_principal_key_cache(MyDatabaseId); + + LWLockRelease(tde_lwlock_enc_keys()); + PG_RETURN_VOID(); +} + +/* + * SQL interface to delete default principal key. + * + * This operation allowed if there is no databases using the default principal key. + */ +Datum +pg_tde_delete_default_key(PG_FUNCTION_ARGS) +{ + HeapTuple tuple; + SysScanDesc scan; + Relation rel; + TDEPrincipalKey *principal_key; + TDEPrincipalKey *default_principal_key; + List *dbs = NIL; + + if (!superuser()) + ereport(ERROR, + errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("must be superuser to access global key providers")); + + LWLockAcquire(tde_lwlock_enc_keys(), LW_EXCLUSIVE); + + default_principal_key = GetPrincipalKeyNoDefault(DEFAULT_DATA_TDE_OID, LW_EXCLUSIVE); + if (default_principal_key == NULL) + ereport(ERROR, errmsg("default principal key is not set")); + + ereport(LOG, errmsg("Deleting default principal key [%s]", default_principal_key->keyInfo.name)); + + /* + * Take row exclusive lock, as we do not want anybody to create/drop a + * database in parallel. If it happens, its not the end of the world, but + * not ideal. + */ + rel = table_open(DatabaseRelationId, RowExclusiveLock); + scan = systable_beginscan(rel, 0, false, NULL, 0, NULL); + + while (HeapTupleIsValid(tuple = systable_getnext(scan))) + { + Oid dbOid = ((Form_pg_database) GETSTRUCT(tuple))->oid; + + principal_key = GetPrincipalKeyNoDefault(dbOid, LW_EXCLUSIVE); + + /* Check if database uses default principalkey */ + if (pg_tde_is_same_principal_key(default_principal_key, principal_key)) + { + /* + * If database key map is non-empty raise an error, as we cannot + * delete default principal key if there are encrypted tables in + * the database. + */ + if (pg_tde_count_encryption_keys(dbOid) != 0) + { + ereport(ERROR, + errcode(ERRCODE_OBJECT_IN_USE), + errmsg("cannot delete default principal key"), + errhint("There are encrypted tables in the database with id: %u.", dbOid)); + } + + /* Remember databases that has no encrypted tables */ + dbs = lappend_oid(dbs, dbOid); + } + } + + /* + * The default key may have been used as server key, check if there are + * any WAL encryption keys that uses it. + */ + principal_key = GetPrincipalKeyNoDefault(GLOBAL_DATA_TDE_OID, LW_EXCLUSIVE); + if (pg_tde_is_same_principal_key(default_principal_key, principal_key)) + { + if (pg_tde_count_wal_ranges_in_file() != 0) + ereport(ERROR, + errcode(ERRCODE_OBJECT_IN_USE), + errmsg("cannot delete default principal key"), + errhint("There are WAL encryption keys.")); + + pg_tde_delete_server_key(); + clear_principal_key_cache(GLOBAL_DATA_TDE_OID); + } + + /* + * Remove empty key files for OIDs that have no encryption keys as we + * cannot leave references to the default principal key. + */ + foreach_oid(dbOid, dbs) + { + pg_tde_delete_principal_key(dbOid); + clear_principal_key_cache(dbOid); + } + + systable_endscan(scan); + table_close(rel, RowExclusiveLock); + + /* No databases use default principal key, so we can delete it */ + pg_tde_delete_principal_key(DEFAULT_DATA_TDE_OID); + clear_principal_key_cache(DEFAULT_DATA_TDE_OID); + + LWLockRelease(tde_lwlock_enc_keys()); + + list_free(dbs); + + PG_RETURN_VOID(); +} + +PG_FUNCTION_INFO_V1(pg_tde_key_info); +Datum +pg_tde_key_info(PG_FUNCTION_ARGS) { return pg_tde_get_key_info(fcinfo, MyDatabaseId); } -PG_FUNCTION_INFO_V1(pg_tde_global_principal_key_info); +PG_FUNCTION_INFO_V1(pg_tde_server_key_info); Datum -pg_tde_global_principal_key_info(PG_FUNCTION_ARGS) +pg_tde_server_key_info(PG_FUNCTION_ARGS) { return pg_tde_get_key_info(fcinfo, GLOBAL_DATA_TDE_OID); } +PG_FUNCTION_INFO_V1(pg_tde_default_key_info); +Datum +pg_tde_default_key_info(PG_FUNCTION_ARGS) +{ + return pg_tde_get_key_info(fcinfo, DEFAULT_DATA_TDE_OID); +} + Datum -pg_tde_verify_principal_key(PG_FUNCTION_ARGS) +pg_tde_verify_key(PG_FUNCTION_ARGS) { return pg_tde_verify_principal_key_internal(MyDatabaseId); } Datum -pg_tde_verify_global_principal_key(PG_FUNCTION_ARGS) +pg_tde_verify_server_key(PG_FUNCTION_ARGS) { return pg_tde_verify_principal_key_internal(GLOBAL_DATA_TDE_OID); } +Datum +pg_tde_verify_default_key(PG_FUNCTION_ARGS) +{ + return pg_tde_verify_principal_key_internal(DEFAULT_DATA_TDE_OID); +} + static Datum pg_tde_get_key_info(PG_FUNCTION_ARGS, Oid dbOid) { @@ -633,112 +891,115 @@ pg_tde_get_key_info(PG_FUNCTION_ARGS, Oid dbOid) Datum values[6]; bool isnull[6]; HeapTuple tuple; - Datum result; TDEPrincipalKey *principal_key; - TimestampTz ts; - GenericKeyring *keyring; - /* Build a tuple descriptor for our result type */ if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE) ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("function returning record called in context that cannot accept type record"))); + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("function returning record called in context that cannot accept type record")); LWLockAcquire(tde_lwlock_enc_keys(), LW_SHARED); + principal_key = GetPrincipalKeyNoDefault(dbOid, LW_SHARED); + if (principal_key == NULL) { - ereport(ERROR, - (errmsg("Principal key does not exists for the database"), - errhint("Use set_principal_key interface to set the principal key"))); + memset(isnull, true, sizeof(isnull)); } + else + { + GenericKeyring *keyring = GetKeyProviderByID(principal_key->keyInfo.keyringId, principal_key->keyInfo.databaseId); + TimestampTz ts; - keyring = GetKeyProviderByID(principal_key->keyInfo.keyringId, principal_key->keyInfo.databaseId); + values[0] = CStringGetTextDatum(principal_key->keyInfo.name); + isnull[0] = false; - /* Initialize the values and null flags */ + if (keyring) + { + values[1] = CStringGetTextDatum(keyring->provider_name); + isnull[1] = false; + } + else + isnull[1] = true; - /* TEXT: Principal key name */ - values[0] = CStringGetTextDatum(principal_key->keyInfo.name); - isnull[0] = false; - /* TEXT: Keyring provider name */ - if (keyring) - { - values[1] = CStringGetTextDatum(keyring->provider_name); - isnull[1] = false; - } - else - isnull[1] = true; + values[2] = Int32GetDatum(principal_key->keyInfo.keyringId); + isnull[2] = false; - /* INTEGERT: key provider id */ - values[2] = Int32GetDatum(principal_key->keyInfo.keyringId); - isnull[2] = false; + ts = (TimestampTz) principal_key->keyInfo.creationTime.tv_sec - ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY); + ts = (ts * USECS_PER_SEC) + principal_key->keyInfo.creationTime.tv_usec; + values[3] = TimestampTzGetDatum(ts); + isnull[3] = false; - /* TIMESTAMP TZ: Principal key creation time */ - ts = (TimestampTz) principal_key->keyInfo.creationTime.tv_sec - ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY); - ts = (ts * USECS_PER_SEC) + principal_key->keyInfo.creationTime.tv_usec; - values[3] = TimestampTzGetDatum(ts); - isnull[3] = false; + pfree(keyring); + } LWLockRelease(tde_lwlock_enc_keys()); - /* Form the tuple */ tuple = heap_form_tuple(tupdesc, values, isnull); - /* Make the tuple into a datum */ - result = HeapTupleGetDatum(tuple); - -#ifndef FRONTEND - pfree(keyring); -#endif - - PG_RETURN_DATUM(result); + PG_RETURN_DATUM(HeapTupleGetDatum(tuple)); } + #endif /* FRONTEND */ /* - * Gets principal key form the keyring. - * - * Caller should hold an exclusive tde_lwlock_enc_keys lock + * Get principal key form the keyring. */ static TDEPrincipalKey * get_principal_key_from_keyring(Oid dbOid) { - TDEPrincipalKeyInfo *principalKeyInfo; + TDESignedPrincipalKeyInfo *principalKeyInfo; GenericKeyring *keyring; KeyInfo *keyInfo; - KeyringReturnCodes keyring_ret; + KeyringReturnCode keyring_ret; TDEPrincipalKey *principalKey; Assert(LWLockHeldByMeInMode(tde_lwlock_enc_keys(), LW_EXCLUSIVE)); - principalKeyInfo = pg_tde_get_principal_key_info(dbOid); + if (dbOid == GLOBAL_DATA_TDE_OID) + principalKeyInfo = pg_tde_get_server_key_info(); + else + principalKeyInfo = pg_tde_get_principal_key_info(dbOid); + if (principalKeyInfo == NULL) return NULL; - keyring = GetKeyProviderByID(principalKeyInfo->keyringId, dbOid); + keyring = GetKeyProviderByID(principalKeyInfo->data.keyringId, dbOid); if (keyring == NULL) ereport(ERROR, - (errcode(ERRCODE_DATA_CORRUPTED), - errmsg("keyring lookup failed for principal key %s, unknown keyring with ID %d", - principalKeyInfo->name, principalKeyInfo->keyringId))); + errcode(ERRCODE_DATA_CORRUPTED), + errmsg("keyring lookup failed for principal key %s, unknown keyring with ID %d", + principalKeyInfo->data.name, principalKeyInfo->data.keyringId)); + + keyInfo = KeyringGetKey(keyring, principalKeyInfo->data.name, &keyring_ret); + + if (keyring_ret != KEYRING_CODE_SUCCESS) + ereport(ERROR, + errmsg("failed to retrieve principal key \"%s\" from key provider \"%s\"", principalKeyInfo->data.name, keyring->provider_name), + errdetail("%s", KeyringErrorCodeToString(keyring_ret))); - keyInfo = KeyringGetKey(keyring, principalKeyInfo->name, &keyring_ret); if (keyInfo == NULL) ereport(ERROR, - (errcode(ERRCODE_NO_DATA_FOUND), - errmsg("failed to retrieve principal key %s from keyring with ID %d", - principalKeyInfo->name, principalKeyInfo->keyringId))); + errcode(ERRCODE_NO_DATA_FOUND), + errmsg("key \"%s\" not found in key provider \"%s\"", + principalKeyInfo->data.name, keyring->provider_name)); + + if (!pg_tde_verify_principal_key_info(principalKeyInfo, &keyInfo->data)) + ereport(ERROR, + errcode(ERRCODE_DATA_CORRUPTED), + errmsg("Failed to verify principal key header for key %s, incorrect principal key or corrupted key file", + principalKeyInfo->data.name)); principalKey = palloc_object(TDEPrincipalKey); - principalKey->keyInfo = *principalKeyInfo; + principalKey->keyInfo = principalKeyInfo->data; memcpy(principalKey->keyData, keyInfo->data.data, keyInfo->data.len); principalKey->keyLength = keyInfo->data.len; Assert(dbOid == principalKey->keyInfo.databaseId); pfree(keyInfo); - pfree(keyring); + free_keyring(keyring); pfree(principalKeyInfo); return principalKey; @@ -770,14 +1031,11 @@ GetPrincipalKeyNoDefault(Oid dbOid, LWLockMode lockMode) #ifndef FRONTEND Assert(LWLockHeldByMeInMode(tde_lwlock_enc_keys(), lockMode)); - /* We don't store global space key in cache */ - if (!TDEisInGlobalSpace(dbOid)) - { - principalKey = get_principal_key_from_cache(dbOid); - if (likely(principalKey)) - return principalKey; - } + principalKey = get_principal_key_from_cache(dbOid); + + if (likely(principalKey)) + return principalKey; if (lockMode != LW_EXCLUSIVE) { @@ -789,8 +1047,7 @@ GetPrincipalKeyNoDefault(Oid dbOid, LWLockMode lockMode) principalKey = get_principal_key_from_keyring(dbOid); #ifndef FRONTEND - /* We don't store global space key in cache */ - if (principalKey && !TDEisInGlobalSpace(dbOid)) + if (principalKey) { push_principal_key_to_cache(principalKey); @@ -810,36 +1067,43 @@ TDEPrincipalKey * GetPrincipalKey(Oid dbOid, LWLockMode lockMode) { TDEPrincipalKey *principalKey = GetPrincipalKeyNoDefault(dbOid, lockMode); -#ifndef FRONTEND - TDEPrincipalKey *newPrincipalKey = NULL; -#endif - - if (principalKey != NULL) - { - return principalKey; - } #ifndef FRONTEND - - /* Lock is already updated to exclusive at this point */ - principalKey = GetPrincipalKeyNoDefault(DEFAULT_DATA_TDE_OID, LW_EXCLUSIVE); - if (principalKey == NULL) { - return NULL; - } + /* + * If database doesn't have dedicated principal key we should try to + * fallback to default principal key. + */ + TDEPrincipalKey *newPrincipalKey; + + /* Lock is already updated to exclusive at this point */ + principalKey = GetPrincipalKeyNoDefault(DEFAULT_DATA_TDE_OID, LW_EXCLUSIVE); - newPrincipalKey = palloc_object(TDEPrincipalKey); - *newPrincipalKey = *principalKey; - newPrincipalKey->keyInfo.databaseId = dbOid; + if (principalKey == NULL) + return NULL; - pg_tde_save_principal_key(&newPrincipalKey->keyInfo); + newPrincipalKey = palloc_object(TDEPrincipalKey); + *newPrincipalKey = *principalKey; + newPrincipalKey->keyInfo.databaseId = dbOid; - push_principal_key_to_cache(newPrincipalKey); + /* + * We have to write default principal key info to database keys file. + * However we cannot write XLOG records about this operation as + * current funcion may be invoked during server startup/recovery where + * WAL writes forbidden. + */ + if (dbOid == GLOBAL_DATA_TDE_OID) + pg_tde_save_server_key(newPrincipalKey, false); + else + pg_tde_save_principal_key(newPrincipalKey, false); - pfree(newPrincipalKey); + push_principal_key_to_cache(newPrincipalKey); - principalKey = GetPrincipalKeyNoDefault(dbOid, LW_EXCLUSIVE); + pfree(newPrincipalKey); + + principalKey = GetPrincipalKeyNoDefault(dbOid, LW_EXCLUSIVE); + } #endif return principalKey; @@ -865,7 +1129,7 @@ pg_tde_principal_key_configured(Oid databaseId) return principalKey != NULL; } -static bool +bool pg_tde_is_provider_used(Oid databaseOid, Oid providerId) { bool is_global = (databaseOid == GLOBAL_DATA_TDE_OID); @@ -878,59 +1142,40 @@ pg_tde_is_provider_used(Oid databaseOid, Oid providerId) HeapTuple tuple; SysScanDesc scan; Relation rel; + TDEPrincipalKey *principal_key; + bool used; /* First verify that the global/default oid doesn't use it */ - Oid dbOid = GLOBAL_DATA_TDE_OID; - TDEPrincipalKey *principal_key = GetPrincipalKeyNoDefault(dbOid, LW_EXCLUSIVE); - + principal_key = GetPrincipalKeyNoDefault(GLOBAL_DATA_TDE_OID, LW_EXCLUSIVE); if (principal_key != NULL && providerId == principal_key->keyInfo.keyringId) { LWLockRelease(tde_lwlock_enc_keys()); - return true; } - dbOid = DEFAULT_DATA_TDE_OID; - principal_key = GetPrincipalKeyNoDefault(dbOid, LW_EXCLUSIVE); - + principal_key = GetPrincipalKeyNoDefault(DEFAULT_DATA_TDE_OID, LW_EXCLUSIVE); if (principal_key != NULL && providerId == principal_key->keyInfo.keyringId) { LWLockRelease(tde_lwlock_enc_keys()); - return true; } /* We have to verify that it isn't currently used by any database */ - rel = table_open(DatabaseRelationId, AccessShareLock); - scan = systable_beginscan(rel, 0, false, NULL, 0, NULL); - while ((tuple = systable_getnext(scan)) != NULL) + used = false; + while (HeapTupleIsValid(tuple = systable_getnext(scan))) { - if (!HeapTupleIsValid(tuple)) - { - break; - } - - dbOid = ((Form_pg_database) GETSTRUCT(tuple))->oid; + Oid dbOid = ((Form_pg_database) GETSTRUCT(tuple))->oid; principal_key = GetPrincipalKeyNoDefault(dbOid, LW_EXCLUSIVE); - - if (principal_key == NULL) + if (principal_key && principal_key->keyInfo.keyringId == providerId) { - continue; - } - - if (providerId == principal_key->keyInfo.keyringId && principal_key->keyInfo.databaseId == GLOBAL_DATA_TDE_OID) - { - systable_endscan(scan); - table_close(rel, AccessShareLock); - LWLockRelease(tde_lwlock_enc_keys()); - - return true; + used = true; + break; } } @@ -938,7 +1183,7 @@ pg_tde_is_provider_used(Oid databaseOid, Oid providerId) table_close(rel, AccessShareLock); LWLockRelease(tde_lwlock_enc_keys()); - return false; + return used; } else { @@ -948,15 +1193,125 @@ pg_tde_is_provider_used(Oid databaseOid, Oid providerId) bool used = principal_key != NULL && providerId == principal_key->keyInfo.keyringId; LWLockRelease(tde_lwlock_enc_keys()); - return used; } } +/* + * Verifies that all keys that are currently in use matches the keys available + * at the provided key provider. This is meant to be used before modifying an + * existing provider to ensure the new settings will provide the same keys as + * those that are already in use. + */ +void +pg_tde_verify_provider_keys_in_use(GenericKeyring *modified_provider) +{ + TDESignedPrincipalKeyInfo *existing_principal_key; + HeapTuple tuple; + SysScanDesc scan; + Relation rel; + + Assert(modified_provider); + Assert(modified_provider->keyring_id); + + LWLockAcquire(tde_lwlock_enc_keys(), LW_EXCLUSIVE); + + /* Check the server key that is used for WAL encryption */ + existing_principal_key = pg_tde_get_server_key_info(); + if (existing_principal_key != NULL && + existing_principal_key->data.keyringId == modified_provider->keyring_id) + { + char *key_name = existing_principal_key->data.name; + KeyringReturnCode return_code; + KeyInfo *proposed_key; + + proposed_key = KeyringGetKey(modified_provider, key_name, &return_code); + + if (return_code != KEYRING_CODE_SUCCESS) + { + ereport(ERROR, + errmsg("failed to retreive \"%s\" key used as server key from modified key provider \"%s\"", + key_name, modified_provider->provider_name), + errdetail("%s", KeyringErrorCodeToString(return_code))); + } + + if (!proposed_key) + { + ereport(ERROR, + errcode(ERRCODE_NO_DATA_FOUND), + errmsg("key \"%s\" used as server key not found in modified key provider \"%s\"", + key_name, modified_provider->provider_name)); + } + + if (!pg_tde_verify_principal_key_info(existing_principal_key, &proposed_key->data)) + { + ereport(ERROR, + errmsg("key \"%s\" from modified key provider \"%s\" does not match existing server key", + key_name, modified_provider->provider_name)); + } + + pfree(proposed_key); + } + + if (existing_principal_key) + pfree(existing_principal_key); + + /* Check all databases for usage of keys from this key provider. */ + rel = table_open(DatabaseRelationId, AccessShareLock); + scan = systable_beginscan(rel, 0, false, NULL, 0, NULL); + + while (HeapTupleIsValid(tuple = systable_getnext(scan))) + { + Form_pg_database database = (Form_pg_database) GETSTRUCT(tuple); + + existing_principal_key = pg_tde_get_principal_key_info(database->oid); + if (existing_principal_key != NULL && + existing_principal_key->data.keyringId == modified_provider->keyring_id) + { + char *key_name = existing_principal_key->data.name; + KeyringReturnCode return_code; + KeyInfo *proposed_key; + + proposed_key = KeyringGetKey(modified_provider, key_name, &return_code); + if (return_code != KEYRING_CODE_SUCCESS) + { + ereport(ERROR, + errmsg("failed to retreive \"%s\" key used by database \"%s\" from modified key provider \"%s\"", + key_name, database->datname.data, modified_provider->provider_name), + errdetail("%s", KeyringErrorCodeToString(return_code))); + } + + if (!proposed_key) + { + ereport(ERROR, + errcode(ERRCODE_NO_DATA_FOUND), + errmsg("key \"%s\" used by database \"%s\" not found in modified key provider \"%s\"", + key_name, database->datname.data, modified_provider->provider_name)); + } + + if (!pg_tde_verify_principal_key_info(existing_principal_key, &proposed_key->data)) + { + ereport(ERROR, + errmsg("key \"%s\" from modified key provider \"%s\" does not match existing key used by database \"%s\"", + key_name, modified_provider->provider_name, database->datname.data)); + } + + pfree(proposed_key); + } + + if (existing_principal_key) + pfree(existing_principal_key); + } + systable_endscan(scan); + table_close(rel, AccessShareLock); + + LWLockRelease(tde_lwlock_enc_keys()); +} + static bool pg_tde_is_same_principal_key(TDEPrincipalKey *a, TDEPrincipalKey *b) { - return a != NULL && b != NULL && strncmp(a->keyInfo.name, b->keyInfo.name, PRINCIPAL_KEY_NAME_LEN) == 0 && a->keyInfo.keyringId == b->keyInfo.keyringId; + return a != NULL && b != NULL && strcmp(a->keyInfo.name, b->keyInfo.name) == 0 && a->keyInfo.keyringId == b->keyInfo.keyringId; } static void @@ -967,105 +1322,65 @@ pg_tde_rotate_default_key_for_database(TDEPrincipalKey *oldKey, TDEPrincipalKey *newKey = *newKeyTemplate; newKey->keyInfo.databaseId = oldKey->keyInfo.databaseId; - /* key rotation */ - pg_tde_perform_rotate_key(oldKey, newKey); + if (oldKey->keyInfo.databaseId == GLOBAL_DATA_TDE_OID) + pg_tde_perform_rotate_server_key(oldKey, newKey, true); + else + pg_tde_perform_rotate_key(oldKey, newKey, true); - if (!TDEisInGlobalSpace(newKey->keyInfo.databaseId)) - { - clear_principal_key_cache(oldKey->keyInfo.databaseId); - push_principal_key_to_cache(newKey); - } + clear_principal_key_cache(oldKey->keyInfo.databaseId); + push_principal_key_to_cache(newKey); pfree(newKey); } +/* + * Update the default principal key for all databases that use it. + * + * This function is called when the default principal key is rotated. It + * updates all databases that use the old default principal key to use the new + * one. + * + * Caller should hold an exclusive tde_lwlock_enc_keys lock. + */ static void -pg_tde_update_global_principal_key_everywhere(TDEPrincipalKey *oldKey, TDEPrincipalKey *newKey) +pg_tde_update_default_principal_key_everywhere(TDEPrincipalKey *oldKey, TDEPrincipalKey *newKey) { HeapTuple tuple; SysScanDesc scan; Relation rel; - Oid dbOid = GLOBAL_DATA_TDE_OID; TDEPrincipalKey *principal_key; /* First check the global oid */ - principal_key = GetPrincipalKeyNoDefault(dbOid, LW_EXCLUSIVE); + principal_key = GetPrincipalKeyNoDefault(GLOBAL_DATA_TDE_OID, LW_EXCLUSIVE); if (pg_tde_is_same_principal_key(oldKey, principal_key)) { pg_tde_rotate_default_key_for_database(principal_key, newKey); } - /* * Take row exclusive lock, as we do not want anybody to create/drop a * database in parallel. If it happens, its not the end of the world, but * not ideal */ rel = table_open(DatabaseRelationId, RowExclusiveLock); - scan = systable_beginscan(rel, 0, false, NULL, 0, NULL); - while ((tuple = systable_getnext(scan)) != NULL) + while (HeapTupleIsValid(tuple = systable_getnext(scan))) { - dbOid = ((Form_pg_database) GETSTRUCT(tuple))->oid; + Oid dbOid = ((Form_pg_database) GETSTRUCT(tuple))->oid; principal_key = GetPrincipalKeyNoDefault(dbOid, LW_EXCLUSIVE); - if (pg_tde_is_same_principal_key(oldKey, principal_key)) { pg_tde_rotate_default_key_for_database(principal_key, newKey); } - } systable_endscan(scan); table_close(rel, RowExclusiveLock); } -Datum -pg_tde_delete_key_provider(PG_FUNCTION_ARGS) -{ - return pg_tde_delete_key_provider_internal(fcinfo, 0); -} - -Datum -pg_tde_delete_global_key_provider(PG_FUNCTION_ARGS) -{ - return pg_tde_delete_key_provider_internal(fcinfo, 1); -} - -Datum -pg_tde_delete_key_provider_internal(PG_FUNCTION_ARGS, int is_global) -{ - char *provider_name = text_to_cstring(PG_GETARG_TEXT_PP(0)); - Oid db_oid = (is_global == 1) ? GLOBAL_DATA_TDE_OID : MyDatabaseId; - GenericKeyring *provider = GetKeyProviderByName(provider_name, db_oid); - int provider_id; - bool provider_used; - - if (provider == NULL) - { - ereport(ERROR, - (errmsg("Keyring provider not found"))); - } - - provider_id = provider->keyring_id; - provider_used = pg_tde_is_provider_used(db_oid, provider_id); - - pfree(provider); - - if (provider_used) - { - ereport(ERROR, - (errmsg("Can't delete a provider which is currently in use"))); - } - - delete_key_provider_info(provider_id, db_oid, true); - - PG_RETURN_VOID(); -} - static bool pg_tde_verify_principal_key_internal(Oid databaseOid) { @@ -1080,13 +1395,13 @@ pg_tde_verify_principal_key_internal(Oid databaseOid) if (fromKeyring == NULL) { ereport(ERROR, - (errmsg("principal key not configured for current database"))); + errmsg("principal key not configured for current database")); } if (fromCache != NULL && (fromKeyring->keyLength != fromCache->keyLength || memcmp(fromKeyring->keyData, fromCache->keyData, fromCache->keyLength) != 0)) { ereport(ERROR, - (errmsg("key returned from keyring and cached in pg_tde differ"))); + errmsg("key returned from keyring and cached in pg_tde differ")); } LWLockRelease(tde_lwlock_enc_keys()); diff --git a/contrib/pg_tde/src/common/pg_tde_shmem.c b/contrib/pg_tde/src/common/pg_tde_shmem.c deleted file mode 100644 index 9b511437bbf12..0000000000000 --- a/contrib/pg_tde/src/common/pg_tde_shmem.c +++ /dev/null @@ -1,151 +0,0 @@ -/*------------------------------------------------------------------------- - * - * pg_tde_shmem.c - * Shared memory area to manage cache and locks. - * - * IDENTIFICATION - * contrib/pg_tde/src/pg_tde_shmem.c - * - *------------------------------------------------------------------------- - */ - -#include "postgres.h" -#include "storage/ipc.h" -#include "common/pg_tde_shmem.h" -#include "lib/dshash.h" -#include "nodes/pg_list.h" -#include "storage/lwlock.h" -#include "storage/shmem.h" - -typedef struct TdeSharedState -{ - LWLock *principalKeyLock; - int principalKeyHashTrancheId; - void *rawDsaArea; /* DSA area pointer to store cache hashes */ - dshash_table_handle principalKeyHashHandle; -} TdeSharedState; - -typedef struct TDELocalState -{ - TdeSharedState *sharedTdeState; - dsa_area **dsa; /* local dsa area for backend attached to the - * dsa area created by postmaster at startup. */ - dshash_table *principalKeySharedHash; -} TDELocalState; - -static void tde_shmem_shutdown(int code, Datum arg); - -List *registeredShmemRequests = NIL; -bool shmemInited = false; - -void -RegisterShmemRequest(const TDEShmemSetupRoutine *routine) -{ - Assert(shmemInited == false); - registeredShmemRequests = lappend(registeredShmemRequests, (void *) routine); -} - -Size -TdeRequiredSharedMemorySize(void) -{ - Size sz = 0; - ListCell *lc; - - foreach(lc, registeredShmemRequests) - { - TDEShmemSetupRoutine *routine = (TDEShmemSetupRoutine *) lfirst(lc); - - if (routine->required_shared_mem_size) - sz = add_size(sz, routine->required_shared_mem_size()); - } - sz = add_size(sz, sizeof(TdeSharedState)); - return MAXALIGN(sz); -} - -int -TdeRequiredLocksCount(void) -{ - return TDE_LWLOCK_COUNT; -} - -void -TdeShmemInit(void) -{ - bool found; - TdeSharedState *tdeState; - Size required_shmem_size = TdeRequiredSharedMemorySize(); - - LWLockAcquire(AddinShmemInitLock, LW_EXCLUSIVE); - /* Create or attach to the shared memory state */ - ereport(NOTICE, (errmsg("TdeShmemInit: requested %ld bytes", required_shmem_size))); - tdeState = ShmemInitStruct("pg_tde", required_shmem_size, &found); - - if (!found) - { - /* First time through ... */ - char *p = (char *) tdeState; - dsa_area *dsa; - ListCell *lc; - Size used_size = 0; - Size dsa_area_size; - - p += MAXALIGN(sizeof(TdeSharedState)); - used_size += MAXALIGN(sizeof(TdeSharedState)); - /* Now place all shared state structures */ - foreach(lc, registeredShmemRequests) - { - Size sz = 0; - TDEShmemSetupRoutine *routine = (TDEShmemSetupRoutine *) lfirst(lc); - - if (routine->init_shared_state) - { - sz = routine->init_shared_state(p); - used_size += MAXALIGN(sz); - p += MAXALIGN(sz); - Assert(used_size <= required_shmem_size); - } - } - /* Create DSA area */ - dsa_area_size = required_shmem_size - used_size; - Assert(dsa_area_size > 0); - tdeState->rawDsaArea = p; - - ereport(LOG, (errmsg("creating DSA area of size %lu", dsa_area_size))); - dsa = dsa_create_in_place(tdeState->rawDsaArea, - dsa_area_size, - LWLockNewTrancheId(), 0); - dsa_pin(dsa); - dsa_set_size_limit(dsa, dsa_area_size); - - /* Initialize all DSA area objects */ - foreach(lc, registeredShmemRequests) - { - TDEShmemSetupRoutine *routine = (TDEShmemSetupRoutine *) lfirst(lc); - - if (routine->init_dsa_area_objects) - routine->init_dsa_area_objects(dsa, tdeState->rawDsaArea); - } - ereport(LOG, (errmsg("setting no limit to DSA area of size %lu", dsa_area_size))); - - dsa_set_size_limit(dsa, -1); /* Let it grow outside the shared - * memory */ - - shmemInited = true; - } - LWLockRelease(AddinShmemInitLock); - on_shmem_exit(tde_shmem_shutdown, (Datum) 0); -} - -static void -tde_shmem_shutdown(int code, Datum arg) -{ - ListCell *lc; - - foreach(lc, registeredShmemRequests) - { - TDEShmemSetupRoutine *routine = (TDEShmemSetupRoutine *) lfirst(lc); - - if (routine->shmem_kill) - routine->shmem_kill(code, arg); - } -} diff --git a/contrib/pg_tde/src/common/pg_tde_utils.c b/contrib/pg_tde/src/common/pg_tde_utils.c index 598c33d2ff6af..ce2beaf3a9ad8 100644 --- a/contrib/pg_tde/src/common/pg_tde_utils.c +++ b/contrib/pg_tde/src/common/pg_tde_utils.c @@ -1,33 +1,13 @@ -/*------------------------------------------------------------------------- - * - * pg_tde_utils.c - * Utility functions. - * - * IDENTIFICATION - * contrib/pg_tde/src/pg_tde_utils.c - * - *------------------------------------------------------------------------- - */ - #include "postgres.h" -#include "utils/snapmgr.h" -#include "commands/defrem.h" #include "common/pg_tde_utils.h" -#include "miscadmin.h" -#include "catalog/tde_principal_key.h" -#include "access/pg_tde_tdemap.h" #include "pg_tde.h" #ifndef FRONTEND -#include "access/genam.h" -#include "access/heapam.h" - -static Oid -get_tde_table_am_oid(void) -{ - return get_table_am_oid("tde_heap", false); -} +#include "access/relation.h" +#include "fmgr.h" +#include "utils/rel.h" +#include "smgr/pg_tde_smgr.h" PG_FUNCTION_INFO_V1(pg_tde_is_encrypted); Datum @@ -36,8 +16,7 @@ pg_tde_is_encrypted(PG_FUNCTION_ARGS) Oid relationOid = PG_GETARG_OID(0); LOCKMODE lockmode = AccessShareLock; Relation rel = relation_open(relationOid, lockmode); - RelFileLocatorBackend rlocator = {.locator = rel->rd_locator,.backend = rel->rd_backend}; - InternalKey *key; + bool result; if (!RELKIND_HAS_STORAGE(rel->rd_rel->relkind)) { @@ -45,53 +24,16 @@ pg_tde_is_encrypted(PG_FUNCTION_ARGS) PG_RETURN_NULL(); } - if (RelFileLocatorBackendIsTemp(rlocator) && !rel->rd_islocaltemp) + if (RELATION_IS_OTHER_TEMP(rel)) ereport(ERROR, - (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("we cannot check if temporary relations from other backends are encrypted"))); + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("we cannot check if temporary relations from other backends are encrypted")); - key = GetSMGRRelationKey(rlocator); + result = tde_smgr_rel_is_encrypted(RelationGetSmgr(rel)); relation_close(rel, lockmode); - PG_RETURN_BOOL(key != NULL); -} - -/* - * Returns the number of TDE tables in a database - */ -int -get_tde_tables_count(void) -{ - Relation pg_class; - SysScanDesc scan; - HeapTuple tuple; - int count = 0; - Oid am_oid = get_tde_table_am_oid(); - - /* Open the pg_class table */ - pg_class = table_open(RelationRelationId, AccessShareLock); - - /* Start a scan */ - scan = systable_beginscan(pg_class, ClassOidIndexId, true, - SnapshotSelf, 0, NULL); - - /* Iterate over all tuples in the table */ - while ((tuple = systable_getnext(scan)) != NULL) - { - Form_pg_class classForm = (Form_pg_class) GETSTRUCT(tuple); - - /* Check if the table uses the specified access method */ - if (classForm->relam == am_oid) - count++; - } - - /* End the scan */ - systable_endscan(scan); - - /* Close the pg_class table */ - table_close(pg_class, AccessShareLock); - return count; + PG_RETURN_BOOL(result); } #endif /* !FRONTEND */ @@ -105,9 +47,8 @@ pg_tde_set_data_dir(const char *dir) strlcpy(tde_data_dir, dir, sizeof(tde_data_dir)); } -/* returns the palloc'd string */ -char * -pg_tde_get_tde_data_dir(void) +const char * +pg_tde_get_data_dir(void) { return tde_data_dir; } diff --git a/contrib/pg_tde/src/encryption/enc_aes.c b/contrib/pg_tde/src/encryption/enc_aes.c index f450c317057f9..8c98a3750741a 100644 --- a/contrib/pg_tde/src/encryption/enc_aes.c +++ b/contrib/pg_tde/src/encryption/enc_aes.c @@ -1,22 +1,13 @@ #include "postgres.h" -#ifdef FRONTEND -#include "pg_tde_fe.h" -#endif +#include +#include #include "encryption/enc_aes.h" -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include +#ifdef FRONTEND +#include "pg_tde_fe.h" +#endif /* Implementation notes * ===================== @@ -41,48 +32,43 @@ * 16 byte blocks. */ -static const EVP_CIPHER *cipher_cbc; -static const EVP_CIPHER *cipher_gcm; -static const EVP_CIPHER *cipher_ctr_ecb; +static const EVP_CIPHER *cipher_cbc = NULL; +static const EVP_CIPHER *cipher_gcm = NULL; +static const EVP_CIPHER *cipher_ctr_ecb = NULL; void AesInit(void) { - static int initialized = 0; - - if (!initialized) - { - OpenSSL_add_all_algorithms(); - ERR_load_crypto_strings(); - - cipher_cbc = EVP_aes_128_cbc(); - cipher_gcm = EVP_aes_128_gcm(); - cipher_ctr_ecb = EVP_aes_128_ecb(); + OpenSSL_add_all_algorithms(); + ERR_load_crypto_strings(); - initialized = 1; - } + cipher_cbc = EVP_aes_128_cbc(); + cipher_gcm = EVP_aes_128_gcm(); + cipher_ctr_ecb = EVP_aes_128_ecb(); } static void -AesRunCtr(EVP_CIPHER_CTX **ctxPtr, int enc, const unsigned char *key, const unsigned char *iv, const unsigned char *in, int in_len, unsigned char *out) +AesEcbEncrypt(EVP_CIPHER_CTX **ctxPtr, const unsigned char *key, const unsigned char *in, int in_len, unsigned char *out) { int out_len; if (*ctxPtr == NULL) { + Assert(cipher_ctr_ecb != NULL); + *ctxPtr = EVP_CIPHER_CTX_new(); EVP_CIPHER_CTX_init(*ctxPtr); - if (EVP_CipherInit_ex(*ctxPtr, cipher_ctr_ecb, NULL, key, iv, enc) == 0) + if (EVP_CipherInit_ex(*ctxPtr, cipher_ctr_ecb, NULL, key, NULL, 1) == 0) ereport(ERROR, - (errmsg("EVP_CipherInit_ex failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_CipherInit_ex failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); EVP_CIPHER_CTX_set_padding(*ctxPtr, 0); } if (EVP_CipherUpdate(*ctxPtr, out, &out_len, in, in_len) == 0) ereport(ERROR, - (errmsg("EVP_CipherUpdate failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_CipherUpdate failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); Assert(out_len == in_len); } @@ -94,6 +80,7 @@ AesRunCbc(int enc, const unsigned char *key, const unsigned char *iv, const unsi int out_len_final; EVP_CIPHER_CTX *ctx = NULL; + Assert(cipher_cbc != NULL); Assert(in_len % EVP_CIPHER_block_size(cipher_cbc) == 0); ctx = EVP_CIPHER_CTX_new(); @@ -101,17 +88,17 @@ AesRunCbc(int enc, const unsigned char *key, const unsigned char *iv, const unsi if (EVP_CipherInit_ex(ctx, cipher_cbc, NULL, key, iv, enc) == 0) ereport(ERROR, - (errmsg("EVP_CipherInit_ex failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_CipherInit_ex failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); EVP_CIPHER_CTX_set_padding(ctx, 0); if (EVP_CipherUpdate(ctx, out, &out_len, in, in_len) == 0) ereport(ERROR, - (errmsg("EVP_CipherUpdate failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_CipherUpdate failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); if (EVP_CipherFinal_ex(ctx, out + out_len, &out_len_final) == 0) ereport(ERROR, - (errmsg("EVP_CipherFinal_ex failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_CipherFinal_ex failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); /* * We encrypt one block (16 bytes) Our expectation is that the result @@ -137,12 +124,13 @@ AesDecrypt(const unsigned char *key, const unsigned char *iv, const unsigned cha } void -AesGcmEncrypt(const unsigned char *key, const unsigned char *iv, const unsigned char *aad, int aad_len, const unsigned char *in, int in_len, unsigned char *out, unsigned char *tag) +AesGcmEncrypt(const unsigned char *key, const unsigned char *iv, int iv_len, const unsigned char *aad, int aad_len, const unsigned char *in, int in_len, unsigned char *out, unsigned char *tag, int tag_len) { int out_len; int out_len_final; EVP_CIPHER_CTX *ctx; + Assert(cipher_gcm != NULL); Assert(in_len % EVP_CIPHER_block_size(cipher_gcm) == 0); ctx = EVP_CIPHER_CTX_new(); @@ -150,35 +138,35 @@ AesGcmEncrypt(const unsigned char *key, const unsigned char *iv, const unsigned if (EVP_EncryptInit_ex(ctx, cipher_gcm, NULL, NULL, NULL) == 0) ereport(ERROR, - (errmsg("EVP_EncryptInit_ex failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_EncryptInit_ex failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); if (EVP_CIPHER_CTX_set_padding(ctx, 0) == 0) ereport(ERROR, - (errmsg("EVP_CIPHER_CTX_set_padding failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_CIPHER_CTX_set_padding failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); - if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, 16, NULL) == 0) + if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, iv_len, NULL) == 0) ereport(ERROR, - (errmsg("EVP_CTRL_GCM_SET_IVLEN failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_CTRL_GCM_SET_IVLEN failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); if (EVP_EncryptInit_ex(ctx, NULL, NULL, key, iv) == 0) ereport(ERROR, - (errmsg("EVP_EncryptInit_ex failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_EncryptInit_ex failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); if (EVP_EncryptUpdate(ctx, NULL, &out_len, (unsigned char *) aad, aad_len) == 0) ereport(ERROR, - (errmsg("EVP_CipherUpdate failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_CipherUpdate failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); if (EVP_EncryptUpdate(ctx, out, &out_len, in, in_len) == 0) ereport(ERROR, - (errmsg("EVP_CipherUpdate failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_CipherUpdate failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); if (EVP_EncryptFinal_ex(ctx, out + out_len, &out_len_final) == 0) ereport(ERROR, - (errmsg("EVP_CipherFinal_ex failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_CipherFinal_ex failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); - if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, 16, tag) == 0) + if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_GET_TAG, tag_len, tag) == 0) ereport(ERROR, - (errmsg("EVP_CTRL_GCM_GET_TAG failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_CTRL_GCM_GET_TAG failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); /* * We encrypt one block (16 bytes) Our expectation is that the result @@ -192,7 +180,7 @@ AesGcmEncrypt(const unsigned char *key, const unsigned char *iv, const unsigned } bool -AesGcmDecrypt(const unsigned char *key, const unsigned char *iv, const unsigned char *aad, int aad_len, const unsigned char *in, int in_len, unsigned char *out, unsigned char *tag) +AesGcmDecrypt(const unsigned char *key, const unsigned char *iv, int iv_len, const unsigned char *aad, int aad_len, const unsigned char *in, int in_len, unsigned char *out, unsigned char *tag, int tag_len) { int out_len; int out_len_final; @@ -205,31 +193,31 @@ AesGcmDecrypt(const unsigned char *key, const unsigned char *iv, const unsigned if (EVP_DecryptInit_ex(ctx, cipher_gcm, NULL, NULL, NULL) == 0) ereport(ERROR, - (errmsg("EVP_EncryptInit_ex failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_EncryptInit_ex failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); if (EVP_CIPHER_CTX_set_padding(ctx, 0) == 0) ereport(ERROR, - (errmsg("EVP_CIPHER_CTX_set_padding failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_CIPHER_CTX_set_padding failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); - if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, 16, NULL) == 0) + if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_IVLEN, iv_len, NULL) == 0) ereport(ERROR, - (errmsg("EVP_CTRL_GCM_SET_IVLEN failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_CTRL_GCM_SET_IVLEN failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); if (EVP_DecryptInit_ex(ctx, NULL, NULL, key, iv) == 0) ereport(ERROR, - (errmsg("EVP_EncryptInit_ex failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_EncryptInit_ex failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); - if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, 16, tag) == 0) + if (EVP_CIPHER_CTX_ctrl(ctx, EVP_CTRL_GCM_SET_TAG, tag_len, tag) == 0) ereport(ERROR, - (errmsg("EVP_CTRL_GCM_SET_TAG failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_CTRL_GCM_SET_TAG failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); if (EVP_DecryptUpdate(ctx, NULL, &out_len, aad, aad_len) == 0) ereport(ERROR, - (errmsg("EVP_CipherUpdate failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_CipherUpdate failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); if (EVP_DecryptUpdate(ctx, out, &out_len, in, in_len) == 0) ereport(ERROR, - (errmsg("EVP_CipherUpdate failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL)))); + errmsg("EVP_CipherUpdate failed. OpenSSL error: %s", ERR_error_string(ERR_get_error(), NULL))); if (EVP_DecryptFinal_ex(ctx, out + out_len, &out_len_final) == 0) { @@ -251,12 +239,12 @@ AesGcmDecrypt(const unsigned char *key, const unsigned char *iv, const unsigned return true; } -/* This function assumes that the out buffer is big enough: at least (blockNumber2 - blockNumber1) * 16 bytes +/* + * This function assumes that the out buffer is big enough: at least (blockNumber2 - blockNumber1) * 16 bytes */ void -Aes128EncryptedZeroBlocks(void *ctxPtr, const unsigned char *key, const char *iv_prefix, uint64_t blockNumber1, uint64_t blockNumber2, unsigned char *out) +AesCtrEncryptedZeroBlocks(void *ctxPtr, const unsigned char *key, const char *iv_prefix, uint64_t blockNumber1, uint64_t blockNumber2, unsigned char *out) { - const unsigned char iv[16] = {0,}; unsigned char *p; Assert(blockNumber2 >= blockNumber1); @@ -277,5 +265,5 @@ Aes128EncryptedZeroBlocks(void *ctxPtr, const unsigned char *key, const char *iv p += sizeof(j); } - AesRunCtr(ctxPtr, 1, key, iv, out, p - out, out); + AesEcbEncrypt(ctxPtr, key, out, p - out, out); } diff --git a/contrib/pg_tde/src/encryption/enc_tde.c b/contrib/pg_tde/src/encryption/enc_tde.c index f4779037a207d..bceaaf7cf8b52 100644 --- a/contrib/pg_tde/src/encryption/enc_tde.c +++ b/contrib/pg_tde/src/encryption/enc_tde.c @@ -1,11 +1,14 @@ -#include "pg_tde_defines.h" - #include "postgres.h" -#include "access/pg_tde_tdemap.h" +#include +#include + #include "encryption/enc_tde.h" #include "encryption/enc_aes.h" -#include "storage/bufmgr.h" + +#ifdef FRONTEND +#include "pg_tde_fe.h" +#endif #define AES_BLOCK_SIZE 16 #define NUM_AES_BLOCKS_IN_BATCH 200 @@ -23,56 +26,34 @@ iv_prefix_debug(const char *iv_prefix, char *out_hex) } #endif -/* - * ================================================================ - * ACTUAL ENCRYPTION/DECRYPTION FUNCTIONS - * ================================================================ - */ - -/* - * pg_tde_crypt_simple: - * Encrypts/decrypts `data` with a given `key`. The result is written to `out`. - * start_offset: is the absolute location of start of data in the file. - * This function assumes that everything is in a single block, and has an assertion ensuring this - */ -static void -pg_tde_crypt_simple(const char *iv_prefix, uint32 start_offset, const char *data, uint32 data_len, char *out, InternalKey *key, void **ctxPtr, const char *context) +void +pg_tde_generate_internal_key(InternalKey *int_key) { - const uint64 aes_start_block = start_offset / AES_BLOCK_SIZE; - const uint64 aes_end_block = (start_offset + data_len + (AES_BLOCK_SIZE - 1)) / AES_BLOCK_SIZE; - const uint64 aes_block_no = start_offset % AES_BLOCK_SIZE; - unsigned char enc_key[DATA_BYTES_PER_AES_BATCH + AES_BLOCK_SIZE]; - - Assert(aes_end_block - aes_start_block <= NUM_AES_BLOCKS_IN_BATCH + 1); - - Aes128EncryptedZeroBlocks(ctxPtr, key->key, iv_prefix, aes_start_block, aes_end_block, enc_key); - -#ifdef ENCRYPTION_DEBUG - { - char ivp_debug[33]; - - iv_prefix_debug(iv_prefix, ivp_debug); - ereport(LOG, - (errmsg("%s: Start offset: %lu Data_Len: %u, aes_start_block: %lu, aes_end_block: %lu, IV prefix: %s", - context ? context : "", start_offset, data_len, aes_start_block, aes_end_block, ivp_debug))); - } -#endif - - for (uint32 i = 0; i < data_len; ++i) - { - out[i] = data[i] ^ enc_key[i + aes_block_no]; - } + if (!RAND_bytes(int_key->key, INTERNAL_KEY_LEN)) + ereport(ERROR, + errcode(ERRCODE_INTERNAL_ERROR), + errmsg("could not generate internal key: %s", + ERR_error_string(ERR_get_error(), NULL))); + if (!RAND_bytes(int_key->base_iv, INTERNAL_KEY_IV_LEN)) + ereport(ERROR, + errcode(ERRCODE_INTERNAL_ERROR), + errmsg("could not generate IV: %s", + ERR_error_string(ERR_get_error(), NULL))); } - /* - * pg_tde_crypt_complex: * Encrypts/decrypts `data` with a given `key`. The result is written to `out`. + * * start_offset: is the absolute location of start of data in the file. - * This is a generic function intended for large data, that do not fit into a single block */ -static void -pg_tde_crypt_complex(const char *iv_prefix, uint32 start_offset, const char *data, uint32 data_len, char *out, InternalKey *key, void **ctxPtr, const char *context) +void +pg_tde_stream_crypt(const char *iv_prefix, + uint32 start_offset, + const char *data, + uint32 data_len, + char *out, + const uint8 *key, + void **ctxPtr) { const uint64 aes_start_block = start_offset / AES_BLOCK_SIZE; const uint64 aes_end_block = (start_offset + data_len + (AES_BLOCK_SIZE - 1)) / AES_BLOCK_SIZE; @@ -87,15 +68,16 @@ pg_tde_crypt_complex(const char *iv_prefix, uint32 start_offset, const char *dat uint32 current_batch_bytes; uint64 batch_end_block = Min(batch_start_block + NUM_AES_BLOCKS_IN_BATCH, aes_end_block); - Aes128EncryptedZeroBlocks(ctxPtr, key->key, iv_prefix, batch_start_block, batch_end_block, enc_key); + AesCtrEncryptedZeroBlocks(ctxPtr, key, iv_prefix, batch_start_block, batch_end_block, enc_key); + #ifdef ENCRYPTION_DEBUG { char ivp_debug[33]; iv_prefix_debug(iv_prefix, ivp_debug); ereport(LOG, - (errmsg("%s: Batch-No:%d Start offset: %lu Data_Len: %u, batch_start_block: %lu, batch_end_block: %lu, IV prefix: %s", - context ? context : "", batch_no, start_offset, data_len, batch_start_block, batch_end_block, ivp_debug))); + errmsg("pg_tde_stream_crypt batch_no: %d start_offset: %lu data_len: %u, batch_start_block: %lu, batch_end_block: %lu, iv_prefix: %s", + batch_no, start_offset, data_len, batch_start_block, batch_end_block, ivp_debug)); } #endif @@ -132,22 +114,3 @@ pg_tde_crypt_complex(const char *iv_prefix, uint32 start_offset, const char *dat batch_no++; } } - -/* - * pg_tde_crypt: - * Encrypts/decrypts `data` with a given `key`. The result is written to `out`. - * start_offset: is the absolute location of start of data in the file. - * This function simply selects between the two above variations based on the data length - */ -void -pg_tde_crypt(const char *iv_prefix, uint32 start_offset, const char *data, uint32 data_len, char *out, InternalKey *key, void **ctxPtr, const char *context) -{ - if (data_len >= DATA_BYTES_PER_AES_BATCH) - { - pg_tde_crypt_complex(iv_prefix, start_offset, data, data_len, out, key, ctxPtr, context); - } - else - { - pg_tde_crypt_simple(iv_prefix, start_offset, data, data_len, out, key, ctxPtr, context); - } -} diff --git a/contrib/pg_tde/src/include/access/pg_tde_fe_init.h b/contrib/pg_tde/src/include/access/pg_tde_fe_init.h index 3b2a6f2324b25..784c8952dee84 100644 --- a/contrib/pg_tde/src/include/access/pg_tde_fe_init.h +++ b/contrib/pg_tde/src/include/access/pg_tde_fe_init.h @@ -1,9 +1,5 @@ -/*------------------------------------------------------------------------- - * - * pg_tde_fe.h - * Frontened definitions for encrypted XLog storage manager - * - *------------------------------------------------------------------------- +/* + * Frontened definitions for encrypted XLog storage manager */ #ifndef PG_TDE_FE_INIT_H diff --git a/contrib/pg_tde/src/include/access/pg_tde_keys_common.h b/contrib/pg_tde/src/include/access/pg_tde_keys_common.h new file mode 100644 index 0000000000000..69d7b76484ac1 --- /dev/null +++ b/contrib/pg_tde/src/include/access/pg_tde_keys_common.h @@ -0,0 +1,16 @@ +#ifndef PG_TDE_KEYS_COMMON_H +#define PG_TDE_KEYS_COMMON_H + +#include "catalog/tde_principal_key.h" + +#define MAP_ENTRY_IV_SIZE 16 +#define MAP_ENTRY_AEAD_TAG_SIZE 16 + +typedef struct +{ + TDEPrincipalKeyInfo data; + unsigned char sign_iv[MAP_ENTRY_IV_SIZE]; + unsigned char aead_tag[MAP_ENTRY_AEAD_TAG_SIZE]; +} TDESignedPrincipalKeyInfo; + +#endif /* PG_TDE_KEYS_COMMON_H */ diff --git a/contrib/pg_tde/src/include/access/pg_tde_tdemap.h b/contrib/pg_tde/src/include/access/pg_tde_tdemap.h index 75e19a955d066..40ee9eb9cbc34 100644 --- a/contrib/pg_tde/src/include/access/pg_tde_tdemap.h +++ b/contrib/pg_tde/src/include/access/pg_tde_tdemap.h @@ -1,115 +1,29 @@ -/*------------------------------------------------------------------------- - * - * pg_tde_tdemap.h - * TDE relation fork manapulation. - * - *------------------------------------------------------------------------- - */ #ifndef PG_TDE_MAP_H #define PG_TDE_MAP_H -#include "access/xlog_internal.h" #include "storage/relfilelocator.h" -#include "catalog/tde_principal_key.h" -#include "common/pg_tde_utils.h" -/* Map entry flags */ -#define MAP_ENTRY_EMPTY 0x00 -#define TDE_KEY_TYPE_SMGR 0x02 -#define TDE_KEY_TYPE_GLOBAL 0x04 -#define TDE_KEY_TYPE_WAL_UNENCRYPTED 0x08 -#define TDE_KEY_TYPE_WAL_ENCRYPTED 0x10 -#define MAP_ENTRY_VALID (TDE_KEY_TYPE_SMGR | TDE_KEY_TYPE_GLOBAL) +#include "access/pg_tde_keys_common.h" +#include "encryption/enc_tde.h" -typedef struct InternalKey -{ - /* - * DO NOT re-arrange fields! Any changes should be aligned with - * pg_tde_read/write_one_keydata() - */ - uint8 key[INTERNAL_KEY_LEN]; - uint32 rel_type; +extern void pg_tde_save_smgr_key(RelFileLocator rel, const InternalKey *key); +extern bool pg_tde_has_smgr_key(RelFileLocator rel); +extern InternalKey *pg_tde_get_smgr_key(RelFileLocator rel); +extern void pg_tde_free_key_map_entry(RelFileLocator rel); - XLogRecPtr start_lsn; -} InternalKey; - -#define WALKeySetInvalid(key) \ - ((key)->rel_type &= ~(TDE_KEY_TYPE_WAL_ENCRYPTED | TDE_KEY_TYPE_WAL_UNENCRYPTED)) -#define WALKeyIsValid(key) \ - (((key)->rel_type & TDE_KEY_TYPE_WAL_UNENCRYPTED) != 0 || \ - ((key)->rel_type & TDE_KEY_TYPE_WAL_ENCRYPTED) != 0) - -#define MAP_ENTRY_EMPTY_IV_SIZE 16 -#define MAP_ENTRY_EMPTY_AEAD_TAG_SIZE 16 - -/* We do not need the dbOid since the entries are stored in a file per db */ -typedef struct TDEMapEntry -{ - Oid spcOid; - RelFileNumber relNumber; - uint32 flags; - InternalKey enc_key; - /* IV and tag used when encrypting the key itself */ - unsigned char entry_iv[MAP_ENTRY_EMPTY_IV_SIZE]; - unsigned char aead_tag[MAP_ENTRY_EMPTY_AEAD_TAG_SIZE]; -} TDEMapEntry; - -typedef struct XLogRelKey -{ - TDEMapEntry mapEntry; - TDEPrincipalKeyInfo pkInfo; -} XLogRelKey; - -/* - * WALKeyCacheRec is built on top of the InternalKeys cache. We still don't - * want to key data be swapped out to the disk (implemented in the InternalKeys - * cache) but we need extra information and the ability to have and reference - * a sequence of keys. - * - * TODO: For now it's a simple linked list which is no good. So consider having - * dedicated WAL keys cache inside some proper data structure. - */ -typedef struct WALKeyCacheRec -{ - XLogRecPtr start_lsn; - XLogRecPtr end_lsn; - - InternalKey *key; - void *crypt_ctx; - - struct WALKeyCacheRec *next; -} WALKeyCacheRec; - - -extern InternalKey *pg_tde_read_last_wal_key(void); - -extern WALKeyCacheRec *pg_tde_get_last_wal_key(void); -extern WALKeyCacheRec *pg_tde_fetch_wal_keys(XLogRecPtr start_lsn); -extern WALKeyCacheRec *pg_tde_get_wal_cache_keys(void); -extern void pg_tde_wal_last_key_set_lsn(XLogRecPtr lsn, const char *keyfile_path); - -extern InternalKey *pg_tde_create_smgr_key(const RelFileLocatorBackend *newrlocator); -extern void pg_tde_create_wal_key(InternalKey *rel_key_data, const RelFileLocator *newrlocator, uint32 flags); -extern void pg_tde_free_key_map_entry(const RelFileLocator *rlocator, off_t offset); -extern void pg_tde_write_key_map_entry_redo(const TDEMapEntry *write_map_entry, TDEPrincipalKeyInfo *principal_key_info); - -#define PG_TDE_MAP_FILENAME "pg_tde_%d_map" - -static inline void -pg_tde_set_db_file_path(Oid dbOid, char *path) -{ - join_path_components(path, pg_tde_get_tde_data_dir(), psprintf(PG_TDE_MAP_FILENAME, dbOid)); -} - -extern InternalKey *GetSMGRRelationKey(RelFileLocatorBackend rel); +extern int pg_tde_count_encryption_keys(Oid dbOid); extern void pg_tde_delete_tde_files(Oid dbOid); -extern TDEPrincipalKeyInfo *pg_tde_get_principal_key_info(Oid dbOid); -extern void pg_tde_save_principal_key(TDEPrincipalKeyInfo *principal_key_info); -extern void pg_tde_save_principal_key_redo(TDEPrincipalKeyInfo *principal_key_info); -extern void pg_tde_perform_rotate_key(TDEPrincipalKey *principal_key, TDEPrincipalKey *new_principal_key); -extern void pg_tde_write_map_keydata_file(off_t size, char *file_data); +extern TDESignedPrincipalKeyInfo *pg_tde_get_principal_key_info(Oid dbOid); +extern bool pg_tde_verify_principal_key_info(TDESignedPrincipalKeyInfo *signed_key_info, const KeyData *principal_key_data); +extern void pg_tde_save_principal_key(const TDEPrincipalKey *principal_key, bool write_xlog); +extern void pg_tde_save_principal_key_redo(const TDESignedPrincipalKeyInfo *signed_key_info); +extern void pg_tde_perform_rotate_key(const TDEPrincipalKey *principal_key, const TDEPrincipalKey *new_principal_key, bool write_xlog); +extern void pg_tde_delete_principal_key(Oid dbOid); +extern void pg_tde_delete_principal_key_redo(Oid dbOid); + +extern void pg_tde_sign_principal_key_info(TDESignedPrincipalKeyInfo *signed_key_info, const TDEPrincipalKey *principal_key); const char *tde_sprint_key(InternalKey *k); diff --git a/contrib/pg_tde/src/include/access/pg_tde_xlog.h b/contrib/pg_tde/src/include/access/pg_tde_xlog.h index 22b8bd9116039..eba8319ab096c 100644 --- a/contrib/pg_tde/src/include/access/pg_tde_xlog.h +++ b/contrib/pg_tde/src/include/access/pg_tde_xlog.h @@ -1,9 +1,5 @@ -/*------------------------------------------------------------------------- - * - * tdeheap_xlog.h - * TDE XLog resource manager - * - *------------------------------------------------------------------------- +/* + * TDE XLog resource manager */ #ifndef PG_TDE_XLOG_H @@ -11,19 +7,23 @@ #ifndef FRONTEND -#include "postgres.h" - -/* TDE XLOG resource manager */ -#define XLOG_TDE_ADD_RELATION_KEY 0x00 +/* TDE XLOG record types */ +#define XLOG_TDE_CREATE_RELATION_KEY 0x00 #define XLOG_TDE_ADD_PRINCIPAL_KEY 0x10 -#define XLOG_TDE_EXTENSION_INSTALL_KEY 0x20 -#define XLOG_TDE_ROTATE_KEY 0x30 -#define XLOG_TDE_ADD_KEY_PROVIDER_KEY 0x40 -#define XLOG_TDE_FREE_MAP_ENTRY 0x50 +#define XLOG_TDE_ROTATE_PRINCIPAL_KEY 0x20 +#define XLOG_TDE_WRITE_KEY_PROVIDER 0x30 +#define XLOG_TDE_INSTALL_EXTENSION 0x40 +#define XLOG_TDE_DELETE_RELATION_KEY 0x50 +#define XLOG_TDE_DELETE_PRINCIPAL_KEY 0x60 /* ID 140 is registered for Percona TDE extension: https://wiki.postgresql.org/wiki/CustomWALResourceManagers */ #define RM_TDERMGR_ID 140 +typedef struct XLogRelKey +{ + RelFileLocator rlocator; +} XLogRelKey; + extern void RegisterTdeRmgr(void); #endif /* !FRONTEND */ diff --git a/contrib/pg_tde/src/include/access/pg_tde_xlog_encrypt.h b/contrib/pg_tde/src/include/access/pg_tde_xlog_encrypt.h deleted file mode 100644 index c501bb637253d..0000000000000 --- a/contrib/pg_tde/src/include/access/pg_tde_xlog_encrypt.h +++ /dev/null @@ -1,18 +0,0 @@ -/*------------------------------------------------------------------------- - * - * pg_tde_xlog_encrypt.h - * Encrypted XLog storage manager - * - *------------------------------------------------------------------------- - */ - -#ifndef PG_TDE_XLOGENCRYPT_H -#define PG_TDE_XLOGENCRYPT_H - -#include "postgres.h" - -extern Size TDEXLogEncryptStateSize(void); -extern void TDEXLogShmemInit(void); -extern void TDEXLogSmgrInit(void); - -#endif /* PG_TDE_XLOGENCRYPT_H */ diff --git a/contrib/pg_tde/src/include/access/pg_tde_xlog_keys.h b/contrib/pg_tde/src/include/access/pg_tde_xlog_keys.h new file mode 100644 index 0000000000000..047d76414e962 --- /dev/null +++ b/contrib/pg_tde/src/include/access/pg_tde_xlog_keys.h @@ -0,0 +1,92 @@ +#ifndef PG_TDE_XLOG_KEYS_H +#define PG_TDE_XLOG_KEYS_H + +#include "access/xlog_internal.h" + +#include "access/pg_tde_keys_common.h" +#include "access/pg_tde_tdemap.h" +#include "encryption/enc_tde.h" + +typedef enum +{ + WAL_ENCRYPTION_RANGE_INVALID = 0, + WAL_ENCRYPTION_RANGE_UNENCRYPTED = 1, + WAL_ENCRYPTION_RANGE_ENCRYPTED = 2, +} WalEncryptionRangeType; + +typedef struct WalLocation +{ + XLogRecPtr lsn; + TimeLineID tli; +} WalLocation; + +/* + * Compares given WAL locations and returns -1 if l1 < l2, 0 if l1 == l2, + * and 1 if l1 > l2 + */ +static inline int +wal_location_cmp(WalLocation l1, WalLocation l2) +{ + if (unlikely(l1.tli < l2.tli)) + return -1; + + if (unlikely(l1.tli > l2.tli)) + return 1; + + if (l1.lsn < l2.lsn) + return -1; + + if (l1.lsn > l2.lsn) + return 1; + + return 0; +} + +static inline bool +wal_location_valid(WalLocation loc) +{ + return loc.tli != 0 && loc.lsn != InvalidXLogRecPtr; +} + +#define MaxXLogRecPtr UINT64_MAX +#define MaxTimeLineID UINT32_MAX + +typedef struct WalEncryptionRange +{ + WalEncryptionRangeType type; + + /* key is only used when type is WAL_ENCRYPTION_RANGE_ENCRYPTED */ + InternalKey key; + + WalLocation start; + WalLocation end; +} WalEncryptionRange; + +/* + * TODO: For now it's a simple linked list which is no good. So consider having + * dedicated WAL keys cache inside some proper data structure. + */ +typedef struct WALKeyCacheRec +{ + WalEncryptionRange range; + void *crypt_ctx; + + struct WALKeyCacheRec *next; +} WALKeyCacheRec; + +extern int pg_tde_count_wal_ranges_in_file(void); +extern void pg_tde_create_wal_range(WalEncryptionRange *range, WalEncryptionRangeType type); +extern void pg_tde_delete_server_key(void); +extern WALKeyCacheRec *pg_tde_fetch_wal_keys(WalLocation start); +extern void pg_tde_free_wal_key_cache(void); +extern WALKeyCacheRec *pg_tde_get_last_wal_key(void); +extern TDESignedPrincipalKeyInfo *pg_tde_get_server_key_info(void); +extern WALKeyCacheRec *pg_tde_get_wal_cache_keys(void); +extern void pg_tde_perform_rotate_server_key(const TDEPrincipalKey *principal_key, const TDEPrincipalKey *new_principal_key, bool write_xlog); +extern WalEncryptionRange *pg_tde_read_last_wal_range(void); +extern void pg_tde_save_server_key(const TDEPrincipalKey *principal_key, bool write_xlog); +extern void pg_tde_save_server_key_redo(const TDESignedPrincipalKeyInfo *signed_key_info); +extern void pg_tde_wal_last_range_set_location(WalLocation loc); +extern void pg_tde_wal_cache_extra_palloc(void); + +#endif /* PG_TDE_XLOG_KEYS_H */ diff --git a/contrib/pg_tde/src/include/access/pg_tde_xlog_smgr.h b/contrib/pg_tde/src/include/access/pg_tde_xlog_smgr.h new file mode 100644 index 0000000000000..8d5ec4bc08b42 --- /dev/null +++ b/contrib/pg_tde/src/include/access/pg_tde_xlog_smgr.h @@ -0,0 +1,23 @@ +/* + * Encrypted XLog storage manager + */ + +#ifndef PG_TDE_XLOGSMGR_H +#define PG_TDE_XLOGSMGR_H + +#include "postgres.h" + +#include "access/pg_tde_xlog_keys.h" + +extern Size TDEXLogEncryptStateSize(void); +extern void TDEXLogShmemInit(void); +extern void TDEXLogSmgrInit(void); +extern void TDEXLogSmgrInitWrite(bool encrypt_xlog); +extern void TDEXLogSmgrInitWriteOldKeys(void); + +extern void TDEXLogCryptBuffer(const void *buf, void *out_buf, size_t count, off_t offset, + TimeLineID tli, XLogSegNo segno, int segSize); + +extern bool tde_ensure_xlog_key_location(WalLocation loc); + +#endif /* PG_TDE_XLOGSMGR_H */ diff --git a/contrib/pg_tde/src/include/catalog/tde_global_space.h b/contrib/pg_tde/src/include/catalog/tde_global_space.h index a1f297ffcd503..3bbec11f41a00 100644 --- a/contrib/pg_tde/src/include/catalog/tde_global_space.h +++ b/contrib/pg_tde/src/include/catalog/tde_global_space.h @@ -1,17 +1,10 @@ -/*------------------------------------------------------------------------- - * - * tde_global_space.h - * Global catalog key management - * - * src/include/catalog/tde_global_space.h - * - *------------------------------------------------------------------------- +/* + * Global catalog key management */ #ifndef TDE_GLOBAL_CATALOG_H #define TDE_GLOBAL_CATALOG_H -#include "postgres.h" #include "catalog/pg_tablespace_d.h" /* @@ -21,18 +14,4 @@ #define GLOBAL_DATA_TDE_OID GLOBALTABLESPACE_OID #define DEFAULT_DATA_TDE_OID DEFAULTTABLESPACE_OID -/* - * This oid can be anything since the database oid is gauranteed to not be a - * real database. - */ -#define XLOG_TDE_OID 1 - -#define GLOBAL_SPACE_RLOCATOR(_obj_oid) (RelFileLocator) { \ - GLOBALTABLESPACE_OID, \ - GLOBAL_DATA_TDE_OID, \ - _obj_oid \ -} - -#define TDEisInGlobalSpace(dbOid) (dbOid == GLOBAL_DATA_TDE_OID) - #endif /* TDE_GLOBAL_CATALOG_H */ diff --git a/contrib/pg_tde/src/include/catalog/tde_keyring.h b/contrib/pg_tde/src/include/catalog/tde_keyring.h index f2d3521fc2df1..9aa7c279bf748 100644 --- a/contrib/pg_tde/src/include/catalog/tde_keyring.h +++ b/contrib/pg_tde/src/include/catalog/tde_keyring.h @@ -1,12 +1,7 @@ -/*------------------------------------------------------------------------- - * - * tde_keyring.h - * TDE catalog handling - * - * src/include/catalog/tde_keyring.h - * - *------------------------------------------------------------------------- +/* + * TDE catalog handling */ + #ifndef TDE_KEYRING_H #define TDE_KEYRING_H @@ -14,34 +9,37 @@ #include "keyring/keyring_api.h" /* This record goes into key provider info file */ -typedef struct KeyringProvideRecord +typedef struct KeyringProviderRecord { int provider_id; char provider_name[MAX_PROVIDER_NAME_LEN]; char options[MAX_KEYRING_OPTION_LEN]; ProviderType provider_type; -} KeyringProvideRecord; +} KeyringProviderRecord; -typedef struct KeyringProviderXLRecord +/* This struct also keeps some context of where the record belongs */ +typedef struct KeyringProviderRecordInFile { Oid database_id; off_t offset_in_file; - KeyringProvideRecord provider; -} KeyringProviderXLRecord; + KeyringProviderRecord provider; +} KeyringProviderRecordInFile; extern GenericKeyring *GetKeyProviderByName(const char *provider_name, Oid dbOid); extern GenericKeyring *GetKeyProviderByID(int provider_id, Oid dbOid); extern ProviderType get_keyring_provider_from_typename(char *provider_type); -extern void InitializeKeyProviderInfo(void); -extern uint32 save_new_key_provider_info(KeyringProvideRecord *provider, - Oid databaseId, bool write_xlog); -extern uint32 modify_key_provider_info(KeyringProvideRecord *provider, - Oid databaseId, bool write_xlog); -extern uint32 delete_key_provider_info(int provider_id, - Oid databaseId, bool write_xlog); -extern uint32 redo_key_provider_info(KeyringProviderXLRecord *xlrec); +extern void KeyProviderShmemInit(void); +extern void key_provider_startup_cleanup(Oid databaseId); +extern bool get_keyring_info_file_record_by_name(char *provider_name, + Oid database_id, + KeyringProviderRecordInFile *record); +extern void write_key_provider_info(KeyringProviderRecordInFile *record, + bool write_xlog); +extern void redo_key_provider_info(KeyringProviderRecordInFile *xlrec); -extern bool ParseKeyringJSONOptions(ProviderType provider_type, void *out_opts, +extern void ParseKeyringJSONOptions(ProviderType provider_type, + GenericKeyring *out_opts, char *in_buf, int buf_len); +extern void free_keyring(GenericKeyring *keyring); #endif /* TDE_KEYRING_H */ diff --git a/contrib/pg_tde/src/include/catalog/tde_principal_key.h b/contrib/pg_tde/src/include/catalog/tde_principal_key.h index 29ea86975ca44..a3294c73b02cb 100644 --- a/contrib/pg_tde/src/include/catalog/tde_principal_key.h +++ b/contrib/pg_tde/src/include/catalog/tde_principal_key.h @@ -1,16 +1,10 @@ -/*------------------------------------------------------------------------- - * - * tde_principal_key.h - * TDE principal key handling - * - * src/include/catalog/tde_principal_key.h - * - *------------------------------------------------------------------------- +/* + * TDE principal key handling */ + #ifndef PG_TDE_PRINCIPAL_KEY_H #define PG_TDE_PRINCIPAL_KEY_H - #include "postgres.h" #include "catalog/tde_keyring.h" #ifndef FRONTEND @@ -37,15 +31,17 @@ typedef struct TDEPrincipalKey typedef struct XLogPrincipalKeyRotate { Oid databaseId; - off_t file_size; - char buff[FLEXIBLE_ARRAY_MEMBER]; + Oid keyringId; + char keyName[PRINCIPAL_KEY_NAME_LEN]; } XLogPrincipalKeyRotate; #define SizeoOfXLogPrincipalKeyRotate offsetof(XLogPrincipalKeyRotate, buff) -extern void InitializePrincipalKeyInfo(void); +extern void PrincipalKeyShmemInit(void); +extern Size PrincipalKeyShmemSize(void); #ifndef FRONTEND +extern void principal_key_startup_cleanup(Oid databaseId); extern LWLock *tde_lwlock_enc_keys(void); extern bool pg_tde_principal_key_configured(Oid databaseId); extern TDEPrincipalKey *GetPrincipalKey(Oid dbOid, LWLockMode lockMode); @@ -54,5 +50,7 @@ extern TDEPrincipalKey *GetPrincipalKey(Oid dbOid, void *lockMode); #endif extern void xl_tde_perform_rotate_key(XLogPrincipalKeyRotate *xlrec); +extern bool pg_tde_is_provider_used(Oid databaseOid, Oid providerId); +extern void pg_tde_verify_provider_keys_in_use(GenericKeyring *proposed_provider); #endif /* PG_TDE_PRINCIPAL_KEY_H */ diff --git a/contrib/pg_tde/src/include/common/pg_tde_shmem.h b/contrib/pg_tde/src/include/common/pg_tde_shmem.h deleted file mode 100644 index 31dfb3a691723..0000000000000 --- a/contrib/pg_tde/src/include/common/pg_tde_shmem.h +++ /dev/null @@ -1,60 +0,0 @@ -/*------------------------------------------------------------------------- - * - * pg_tde_shmem.h - * src/include/common/pg_tde_shmem.h - * - *------------------------------------------------------------------------- - */ -#ifndef PG_TDE_SHMEM_H -#define PG_TDE_SHMEM_H - -#include "postgres.h" -#include "utils/dsa.h" - -#define TDE_TRANCHE_NAME "pg_tde_tranche" - -typedef enum -{ - TDE_LWLOCK_ENC_KEY, - TDE_LWLOCK_PI_FILES, - - /* Must be the last entry in the enum */ - TDE_LWLOCK_COUNT -} TDELockTypes; - -typedef struct TDEShmemSetupRoutine -{ - /* - * init_shared_state gets called at the time of extension load you can - * initialize the data structures required to be placed in shared memory - * in this callback The callback must return the size of the shared memory - * area acquired. The argument to the function is the start of the shared - * memory address that can be used to store the shared data structures. - */ - Size (*init_shared_state) (void *raw_dsa_area); - - /* - * shmem_startup gets called at the time of postmaster shutdown - */ - void (*shmem_kill) (int code, Datum arg); - - /* - * The callback must return the size of the shared memory acquired. - */ - Size (*required_shared_mem_size) (void); - - /* - * Gets called after all shared memory structures are initialized and here - * you can create shared memory hash tables or any other shared objects - * that needs to live in DSA area. - */ - void (*init_dsa_area_objects) (dsa_area *dsa, void *raw_dsa_area); -} TDEShmemSetupRoutine; - -/* Interface to register the shared memory requests */ -extern void RegisterShmemRequest(const TDEShmemSetupRoutine *routine); -extern void TdeShmemInit(void); -extern Size TdeRequiredSharedMemorySize(void); -extern int TdeRequiredLocksCount(void); - -#endif /* PG_TDE_SHMEM_H */ diff --git a/contrib/pg_tde/src/include/common/pg_tde_utils.h b/contrib/pg_tde/src/include/common/pg_tde_utils.h index b8cd7bd11c7aa..f91b53f1caa37 100644 --- a/contrib/pg_tde/src/include/common/pg_tde_utils.h +++ b/contrib/pg_tde/src/include/common/pg_tde_utils.h @@ -1,18 +1,7 @@ -/*------------------------------------------------------------------------- - * - * pg_tde_utils.h - * src/include/common/pg_tde_utils.h - * - *------------------------------------------------------------------------- - */ #ifndef PG_TDE_UTILS_H #define PG_TDE_UTILS_H -#ifndef FRONTEND -extern int get_tde_tables_count(void); -#endif /* !FRONTEND */ - extern void pg_tde_set_data_dir(const char *dir); -extern char *pg_tde_get_tde_data_dir(void); +extern const char *pg_tde_get_data_dir(void); #endif /* PG_TDE_UTILS_H */ diff --git a/contrib/pg_tde/src/include/config.h b/contrib/pg_tde/src/include/config.h deleted file mode 100644 index 393cefbfb7dee..0000000000000 --- a/contrib/pg_tde/src/include/config.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef TDE_CONFIG_H -#define TDE_CONFIG_H - -#define PACKAGE_NAME "pg_tde" -#define PACKAGE_VERSION "1.0.0-rc" - -#define PACKAGE_STRING PACKAGE_NAME" "PACKAGE_VERSION - -#define PACKAGE_TARNAME "pg_tde" -#define PACKAGE_BUGREPORT "https://github.com/percona/pg_tde/issues" - -#endif /* TDE_CONFIG_H */ diff --git a/contrib/pg_tde/src/include/encryption/enc_aes.h b/contrib/pg_tde/src/include/encryption/enc_aes.h index 1cbece5768d55..68b9416972fd6 100644 --- a/contrib/pg_tde/src/include/encryption/enc_aes.h +++ b/contrib/pg_tde/src/include/encryption/enc_aes.h @@ -1,23 +1,17 @@ -/*------------------------------------------------------------------------- - * - * end_aes.h - * AES Encryption / Decryption routines using OpenSSL - * - * src/include/encryption/enc_aes.h - * - *------------------------------------------------------------------------- +/* + * AES Encryption / Decryption routines using OpenSSL */ + #ifndef ENC_AES_H #define ENC_AES_H #include extern void AesInit(void); -extern void Aes128EncryptedZeroBlocks(void *ctxPtr, const unsigned char *key, const char *iv_prefix, uint64_t blockNumber1, uint64_t blockNumber2, unsigned char *out); - extern void AesEncrypt(const unsigned char *key, const unsigned char *iv, const unsigned char *in, int in_len, unsigned char *out); extern void AesDecrypt(const unsigned char *key, const unsigned char *iv, const unsigned char *in, int in_len, unsigned char *out); -extern void AesGcmEncrypt(const unsigned char *key, const unsigned char *iv, const unsigned char *aad, int aad_len, const unsigned char *in, int in_len, unsigned char *out, unsigned char *tag); -extern bool AesGcmDecrypt(const unsigned char *key, const unsigned char *iv, const unsigned char *aad, int aad_len, const unsigned char *in, int in_len, unsigned char *out, unsigned char *tag); +extern void AesGcmEncrypt(const unsigned char *key, const unsigned char *iv, int iv_len, const unsigned char *aad, int aad_len, const unsigned char *in, int in_len, unsigned char *out, unsigned char *tag, int tag_len); +extern bool AesGcmDecrypt(const unsigned char *key, const unsigned char *iv, int iv_len, const unsigned char *aad, int aad_len, const unsigned char *in, int in_len, unsigned char *out, unsigned char *tag, int tag_len); +extern void AesCtrEncryptedZeroBlocks(void *ctxPtr, const unsigned char *key, const char *iv_prefix, uint64_t blockNumber1, uint64_t blockNumber2, unsigned char *out); #endif /* ENC_AES_H */ diff --git a/contrib/pg_tde/src/include/encryption/enc_tde.h b/contrib/pg_tde/src/include/encryption/enc_tde.h index 092cb5df4f5b0..64299c85e33f5 100644 --- a/contrib/pg_tde/src/include/encryption/enc_tde.h +++ b/contrib/pg_tde/src/include/encryption/enc_tde.h @@ -1,25 +1,26 @@ -/*------------------------------------------------------------------------- - * - * enc_tde.h - * Encryption / Decryption of functions for TDE - * - * src/include/encryption/enc_tde.h - * - *------------------------------------------------------------------------- +/* + * Encryption / Decryption of functions for TDE */ + #ifndef ENC_TDE_H #define ENC_TDE_H -#include "access/pg_tde_tdemap.h" - -extern void pg_tde_crypt(const char *iv_prefix, uint32 start_offset, const char *data, uint32 data_len, char *out, InternalKey *key, void **ctxPtr, const char *context); - -/* Function Macros over crypt */ +#define INTERNAL_KEY_LEN 16 +#define INTERNAL_KEY_IV_LEN 16 -#define PG_TDE_ENCRYPT_DATA(_iv_prefix, _start_offset, _data, _data_len, _out, _key, _ctxptr) \ - pg_tde_crypt(_iv_prefix, _start_offset, _data, _data_len, _out, _key, _ctxptr, "ENCRYPT") +typedef struct InternalKey +{ + uint8 key[INTERNAL_KEY_LEN]; + uint8 base_iv[INTERNAL_KEY_IV_LEN]; +} InternalKey; -#define PG_TDE_DECRYPT_DATA(_iv_prefix, _start_offset, _data, _data_len, _out, _key, _ctxptr) \ - pg_tde_crypt(_iv_prefix, _start_offset, _data, _data_len, _out, _key, _ctxptr, "DECRYPT") +extern void pg_tde_generate_internal_key(InternalKey *int_key); +extern void pg_tde_stream_crypt(const char *iv_prefix, + uint32 start_offset, + const char *data, + uint32 data_len, + char *out, + const uint8 *key, + void **ctxPtr); #endif /* ENC_TDE_H */ diff --git a/contrib/pg_tde/src/include/keyring/keyring_api.h b/contrib/pg_tde/src/include/keyring/keyring_api.h index 6848c896bda4a..88941b31c3a1c 100644 --- a/contrib/pg_tde/src/include/keyring/keyring_api.h +++ b/contrib/pg_tde/src/include/keyring/keyring_api.h @@ -1,11 +1,3 @@ -/*------------------------------------------------------------------------- - * - * keyring_api.h - * src/include/keyring/keyring_api.h - * - *------------------------------------------------------------------------- - */ - #ifndef KEYRING_API_H #define KEYRING_API_H @@ -22,8 +14,9 @@ typedef enum ProviderType } ProviderType; #define TDE_KEY_NAME_LEN 256 -#define MAX_KEY_DATA_SIZE 32 /* maximum 256 bit encryption */ -#define INTERNAL_KEY_LEN 16 +#define KEY_DATA_SIZE_128 16 /* 128 bit encryption */ +#define KEY_DATA_SIZE_256 32 /* 256 bit encryption, not yet supported */ +#define MAX_KEY_DATA_SIZE KEY_DATA_SIZE_256 /* maximum 256 bit encryption */ typedef struct KeyData { @@ -37,15 +30,15 @@ typedef struct KeyInfo KeyData data; } KeyInfo; -typedef enum KeyringReturnCodes +typedef enum KeyringReturnCode { KEYRING_CODE_SUCCESS = 0, KEYRING_CODE_INVALID_PROVIDER = 1, KEYRING_CODE_RESOURCE_NOT_AVAILABLE = 2, KEYRING_CODE_INVALID_RESPONSE = 5, - KEYRING_CODE_INVALID_KEY_SIZE = 6, + KEYRING_CODE_INVALID_KEY = 6, KEYRING_CODE_DATA_CORRUPTED = 7, -} KeyringReturnCodes; +} KeyringReturnCode; /* Base type for all keyring */ typedef struct GenericKeyring @@ -59,8 +52,9 @@ typedef struct GenericKeyring typedef struct TDEKeyringRoutine { - KeyInfo *(*keyring_get_key) (GenericKeyring *keyring, const char *key_name, KeyringReturnCodes *returnCode); + KeyInfo *(*keyring_get_key) (GenericKeyring *keyring, const char *key_name, KeyringReturnCode *returnCode); void (*keyring_store_key) (GenericKeyring *keyring, KeyInfo *key); + void (*keyring_validate) (GenericKeyring *keyring); } TDEKeyringRoutine; typedef struct FileKeyring @@ -73,6 +67,7 @@ typedef struct VaultV2Keyring { GenericKeyring keyring; /* Must be the first field */ char *vault_token; + char *vault_token_path; char *vault_url; char *vault_ca_path; char *vault_mount_path; @@ -85,11 +80,15 @@ typedef struct KmipKeyring char *kmip_port; char *kmip_ca_path; char *kmip_cert_path; + char *kmip_key_path; } KmipKeyring; -extern void RegisterKeyProvider(const TDEKeyringRoutine *routine, ProviderType type); +extern void RegisterKeyProviderType(const TDEKeyringRoutine *routine, ProviderType type); -extern KeyInfo *KeyringGetKey(GenericKeyring *keyring, const char *key_name, KeyringReturnCodes *returnCode); +extern KeyInfo *KeyringGetKey(GenericKeyring *keyring, const char *key_name, KeyringReturnCode *returnCode); extern KeyInfo *KeyringGenerateNewKeyAndStore(GenericKeyring *keyring, const char *key_name, unsigned key_len); +extern void KeyringValidate(GenericKeyring *keyring); +extern bool ValidateKey(KeyInfo *key); +extern char *KeyringErrorCodeToString(KeyringReturnCode code); #endif /* KEYRING_API_H */ diff --git a/contrib/pg_tde/src/include/keyring/keyring_curl.h b/contrib/pg_tde/src/include/keyring/keyring_curl.h index 6f985244e9608..a164a39b51d05 100644 --- a/contrib/pg_tde/src/include/keyring/keyring_curl.h +++ b/contrib/pg_tde/src/include/keyring/keyring_curl.h @@ -1,22 +1,11 @@ -/*------------------------------------------------------------------------- - * - * keyring_curl.h - * Contains common curl related methods. - * - * IDENTIFICATION - * src/include/keyring/keyring_curl.h - * - *------------------------------------------------------------------------- +/* + * Contains common curl related methods. */ #ifndef KEYRING_CURL_H #define KEYRING_CURL_H -#include "pg_tde_defines.h" - -#define VAULT_URL_MAX_LEN 512 - -#include +#include "c.h" #include typedef struct CurlString diff --git a/contrib/pg_tde/src/include/keyring/keyring_file.h b/contrib/pg_tde/src/include/keyring/keyring_file.h index a72e643464116..a671070dc28d5 100644 --- a/contrib/pg_tde/src/include/keyring/keyring_file.h +++ b/contrib/pg_tde/src/include/keyring/keyring_file.h @@ -1,11 +1,5 @@ -/*------------------------------------------------------------------------- - * - * keyring_file.h - * File vault implementation - * - * src/include/keyring/keyring_file.h - * - *------------------------------------------------------------------------- +/* + * File vault implementation */ #ifndef KEYRING_FILE_H diff --git a/contrib/pg_tde/src/include/keyring/keyring_kmip.h b/contrib/pg_tde/src/include/keyring/keyring_kmip.h index fc55a5981351b..98b7e7863c815 100644 --- a/contrib/pg_tde/src/include/keyring/keyring_kmip.h +++ b/contrib/pg_tde/src/include/keyring/keyring_kmip.h @@ -1,12 +1,5 @@ -/*------------------------------------------------------------------------- - * - * keyring_kmip.h - * KMIP based keyring provider - * - * IDENTIFICATION - * src/include/keyring/keyring_kmip.h - * - *------------------------------------------------------------------------- +/* + * KMIP based keyring provider */ #ifndef KEYRING_KMIP_H diff --git a/contrib/pg_tde/src/include/keyring/keyring_kmip_impl.h b/contrib/pg_tde/src/include/keyring/keyring_kmip_impl.h index df6f46105054c..357ff6c703e81 100644 --- a/contrib/pg_tde/src/include/keyring/keyring_kmip_impl.h +++ b/contrib/pg_tde/src/include/keyring/keyring_kmip_impl.h @@ -1,12 +1,5 @@ -/*------------------------------------------------------------------------- - * - * keyring_kmip_impl.h - * Intenrals for the KMIP based keyring provider - * - * IDENTIFICATION - * src/include/keyring/keyring_kmip_impl.h - * - *------------------------------------------------------------------------- +/* + * Internals for the KMIP based keyring provider */ #ifndef KEYRING_KMIP_IMPL_H diff --git a/contrib/pg_tde/src/include/keyring/keyring_vault.h b/contrib/pg_tde/src/include/keyring/keyring_vault.h index 13f7b957e7d78..918027882466e 100644 --- a/contrib/pg_tde/src/include/keyring/keyring_vault.h +++ b/contrib/pg_tde/src/include/keyring/keyring_vault.h @@ -1,12 +1,5 @@ -/*------------------------------------------------------------------------- - * - * keyring_vault.h - * HashiCorp Vault 2 based keyring provider - * - * IDENTIFICATION - * src/include/keyring/keyring_vault.h - * - *------------------------------------------------------------------------- +/* + * HashiCorp Vault 2 based keyring provider */ #ifndef KEYRING_VAULT_H diff --git a/contrib/pg_tde/src/include/pg_tde.h b/contrib/pg_tde/src/include/pg_tde.h index 167efea4bfdcf..46e622d26a91c 100644 --- a/contrib/pg_tde/src/include/pg_tde.h +++ b/contrib/pg_tde/src/include/pg_tde.h @@ -1,24 +1,28 @@ -/*------------------------------------------------------------------------- - * - * pg_tde.h - * src/include/pg_tde.h - * - *------------------------------------------------------------------------- - */ #ifndef PG_TDE_H #define PG_TDE_H +#define PG_TDE_NAME "pg_tde" +#define PG_TDE_VERSION "2.0.0" +#define PG_TDE_VERSION_STRING PG_TDE_NAME " " PG_TDE_VERSION + #define PG_TDE_DATA_DIR "pg_tde" +#define TDE_TRANCHE_NAME "pg_tde_tranche" + +typedef enum +{ + TDE_LWLOCK_ENC_KEY, + TDE_LWLOCK_PI_FILES, + + /* Must be the last entry in the enum */ + TDE_LWLOCK_COUNT +} TDELockTypes; + typedef struct XLogExtensionInstall { Oid database_id; } XLogExtensionInstall; -typedef void (*pg_tde_on_ext_install_callback) (int tde_tbl_count, XLogExtensionInstall *ext_info, bool redo, void *arg); - -extern void on_ext_install(pg_tde_on_ext_install_callback function, void *arg); - extern void extension_install_redo(XLogExtensionInstall *xlrec); #endif /* PG_TDE_H */ diff --git a/contrib/pg_tde/src/include/pg_tde_defines.h b/contrib/pg_tde/src/include/pg_tde_defines.h index 5b3aef77353c5..b8daf01e0b7b8 100644 --- a/contrib/pg_tde/src/include/pg_tde_defines.h +++ b/contrib/pg_tde/src/include/pg_tde_defines.h @@ -1,18 +1,12 @@ -/*------------------------------------------------------------------------- - * - * pg_tde_defines.h - * Debug definitions for pg_tde - * - * src/include/pg_tde_defines.h - * - *------------------------------------------------------------------------- +/* + * Debug definitions for pg_tde */ + #ifndef PG_TDE_DEFINES_H #define PG_TDE_DEFINES_H /* #define ENCRYPTION_DEBUG 1 */ /* #define KEYRING_DEBUG 1 */ -/* #define TDE_FORK_DEBUG 1 */ -/* #define TDE_XLOG_DEBUG 1 */ +/* #define TDE_XLOG_DEBUG 1 */ #endif /* PG_TDE_DEFINES_H */ diff --git a/contrib/pg_tde/src/include/pg_tde_defs.h b/contrib/pg_tde/src/include/pg_tde_defs.h deleted file mode 100644 index 1402c6a8fbef5..0000000000000 --- a/contrib/pg_tde/src/include/pg_tde_defs.h +++ /dev/null @@ -1,16 +0,0 @@ -/*------------------------------------------------------------------------- - * - * pg_tde_defs.h - * src/include/pg_tde_defs.h - * - *------------------------------------------------------------------------- - */ -#ifndef PG_TDE_DEFS_H -#define PG_TDE_DEFS_H - - -extern const char *pg_tde_package_string(void); -extern const char *pg_tde_package_name(void); -extern const char *pg_tde_package_version(void); - -#endif /* PG_TDE_DEFS_H */ diff --git a/contrib/pg_tde/src/include/pg_tde_event_capture.h b/contrib/pg_tde/src/include/pg_tde_event_capture.h index 6ddf64e420b09..8a5e1d64bdb29 100644 --- a/contrib/pg_tde/src/include/pg_tde_event_capture.h +++ b/contrib/pg_tde/src/include/pg_tde_event_capture.h @@ -1,33 +1,14 @@ -/*------------------------------------------------------------------------- - * - * pg_tde_event_capture.h - * - *------------------------------------------------------------------------- - */ #ifndef PG_TDE_EVENT_CAPTURE_H #define PG_TDE_EVENT_CAPTURE_H -#include "postgres.h" -#include "nodes/parsenodes.h" -#include "access/transam.h" - -typedef struct TdeCreateEvent +typedef enum { - FullTransactionId tid; /* transaction id of the last event trigger, - * or 0 */ - bool encryptMode; /* true when the table uses encryption */ - Oid baseTableOid; /* Oid of table on which index is being - * created on. For create table statement this - * contains InvalidOid */ - RangeVar *relation; /* Reference to the parsed relation from - * create statement */ - bool alterAccessMethodMode; /* during ALTER ... SET ACCESS METHOD, - * new file permissions shouldn't be - * based on earlier encryption status. */ -} TdeCreateEvent; - -extern TdeCreateEvent *GetCurrentTdeCreateEvent(void); + TDE_ENCRYPT_MODE_RETAIN = 0, + TDE_ENCRYPT_MODE_ENCRYPT, + TDE_ENCRYPT_MODE_PLAIN, +} TDEEncryptMode; -extern void validateCurrentEventTriggerState(bool mightStartTransaction); +extern void TdeEventCaptureInit(void); +extern TDEEncryptMode currentTdeEncryptModeValidated(void); #endif diff --git a/contrib/pg_tde/src/include/pg_tde_fe.h b/contrib/pg_tde/src/include/pg_tde_fe.h index da5631ac75159..7d11d9c6a85ad 100644 --- a/contrib/pg_tde/src/include/pg_tde_fe.h +++ b/contrib/pg_tde/src/include/pg_tde_fe.h @@ -1,21 +1,16 @@ -/*------------------------------------------------------------------------- - * - * pg_tde_fe.h - * TDE redefinitions for frontend included code - * - * src/include/pg_tde_fe.h - * - *------------------------------------------------------------------------- +/* + * TDE redefinitions for frontend included code */ + #ifndef PG_TDE_EREPORT_H #define PG_TDE_EREPORT_H #ifdef FRONTEND #include "postgres_fe.h" -#include "utils/elog.h" #include "common/logging.h" #include "common/file_perm.h" +#include "utils/elog.h" #pragma GCC diagnostic ignored "-Wunused-macros" #pragma GCC diagnostic ignored "-Wunused-value" @@ -72,6 +67,8 @@ static int tde_fe_error_level = 0; +#define data_sync_elevel(elevel) (elevel) + /* * ------------- */ @@ -85,9 +82,14 @@ static int tde_fe_error_level = 0; #define LW_EXCLUSIVE NULL #define tde_lwlock_enc_keys() NULL -#define BasicOpenFile(fileName, fileFlags) open(fileName, fileFlags, PG_FILE_MODE_OWNER) +#define OpenTransientFile(fileName, fileFlags) open(fileName, fileFlags, PG_FILE_MODE_OWNER) +#define CloseTransientFile(fd) close(fd) +#define AllocateFile(name, mode) fopen(name, mode) +#define FreeFile(file) fclose(file) #define pg_fsync(fd) fsync(fd) + +#define pg_read_barrier() NULL #endif /* FRONTEND */ #endif /* PG_TDE_EREPORT_H */ diff --git a/contrib/pg_tde/src/include/pg_tde_guc.h b/contrib/pg_tde/src/include/pg_tde_guc.h index 472a00bb2791e..c4ce064402d6d 100644 --- a/contrib/pg_tde/src/include/pg_tde_guc.h +++ b/contrib/pg_tde/src/include/pg_tde_guc.h @@ -1,20 +1,11 @@ -/*------------------------------------------------------------------------- - * - * pg_tde_guc.h - * GUC variables for pg_tde - * - * src/include/pg_tde_guc.h - * - *------------------------------------------------------------------------- +/* + * GUC variables for pg_tde */ #ifndef TDE_GUC_H #define TDE_GUC_H - -#include "postgres.h" - -#ifndef FRONTEND +#include "c.h" extern bool AllowInheritGlobalProviders; extern bool EncryptXLog; @@ -22,5 +13,4 @@ extern bool EnforceEncryption; extern void TdeGucInit(void); -#endif #endif /* TDE_GUC_H */ diff --git a/contrib/pg_tde/src/include/smgr/pg_tde_smgr.h b/contrib/pg_tde/src/include/smgr/pg_tde_smgr.h index d56c9ac04e138..023542f91d1fc 100644 --- a/contrib/pg_tde/src/include/smgr/pg_tde_smgr.h +++ b/contrib/pg_tde/src/include/smgr/pg_tde_smgr.h @@ -1,15 +1,12 @@ - -/*------------------------------------------------------------------------- - * - * pg_tde_smgr.h - * src/include/smgr/pg_tde_smgr.h - * - *------------------------------------------------------------------------- - */ - #ifndef PG_TDE_SMGR_H #define PG_TDE_SMGR_H +#include "storage/relfilelocator.h" +#include "storage/smgr.h" + extern void RegisterStorageMgr(void); +extern void tde_smgr_create_key_redo(const RelFileLocator *rlocator); +extern void tde_smgr_delete_leftover_key_redo(const RelFileLocator *rlocator); +extern bool tde_smgr_rel_is_encrypted(SMgrRelation reln); #endif /* PG_TDE_SMGR_H */ diff --git a/contrib/pg_tde/src/include/transam/pg_tde_xact_handler.h b/contrib/pg_tde/src/include/transam/pg_tde_xact_handler.h deleted file mode 100644 index 7838423ae9502..0000000000000 --- a/contrib/pg_tde/src/include/transam/pg_tde_xact_handler.h +++ /dev/null @@ -1,18 +0,0 @@ -/*------------------------------------------------------------------------- - * - * pg_tde_xact_handler.h - * TDE transaction handling. - * - *------------------------------------------------------------------------- - */ -#ifndef PG_TDE_XACT_HANDLER_H -#define PG_TDE_XACT_HANDLER_H - -#include "postgres.h" -#include "storage/relfilelocator.h" - -extern void RegisterTdeXactCallbacks(void); -extern void RegisterEntryForDeletion(const RelFileLocator *rlocator, off_t map_entry_offset, bool atCommit); - - -#endif /* PG_TDE_XACT_HANDLER_H */ diff --git a/contrib/pg_tde/src/keyring/keyring_api.c b/contrib/pg_tde/src/keyring/keyring_api.c index 15c9e93b2a83b..11da816681f4d 100644 --- a/contrib/pg_tde/src/keyring/keyring_api.c +++ b/contrib/pg_tde/src/keyring/keyring_api.c @@ -1,41 +1,43 @@ -#include "keyring/keyring_api.h" - #include "postgres.h" + +#include +#include + #include "nodes/pg_list.h" #include "utils/memutils.h" + +#include "keyring/keyring_api.h" + #ifdef FRONTEND #include "fe_utils/simple_list.h" #include "pg_tde_fe.h" #endif -#include -#include - -typedef struct KeyProviders +typedef struct RegisteredKeyProviderType { TDEKeyringRoutine *routine; ProviderType type; -} KeyProviders; +} RegisteredKeyProviderType; #ifndef FRONTEND -static List *registeredKeyProviders = NIL; +static List *registeredKeyProviderTypes = NIL; #else -static SimplePtrList registeredKeyProviders = {NULL, NULL}; +static SimplePtrList registeredKeyProviderTypes = {NULL, NULL}; #endif -static KeyProviders *find_key_provider(ProviderType type); +static RegisteredKeyProviderType *find_key_provider_type(ProviderType type); static void KeyringStoreKey(GenericKeyring *keyring, KeyInfo *key); static KeyInfo *KeyringGenerateNewKey(const char *key_name, unsigned key_len); #ifndef FRONTEND -static KeyProviders * -find_key_provider(ProviderType type) +static RegisteredKeyProviderType * +find_key_provider_type(ProviderType type) { ListCell *lc; - foreach(lc, registeredKeyProviders) + foreach(lc, registeredKeyProviderTypes) { - KeyProviders *kp = (KeyProviders *) lfirst(lc); + RegisteredKeyProviderType *kp = (RegisteredKeyProviderType *) lfirst(lc); if (kp->type == type) { @@ -45,14 +47,14 @@ find_key_provider(ProviderType type) return NULL; } #else -static KeyProviders * -find_key_provider(ProviderType type) +static RegisteredKeyProviderType * +find_key_provider_type(ProviderType type) { SimplePtrListCell *lc; - for (lc = registeredKeyProviders.head; lc; lc = lc->next) + for (lc = registeredKeyProviderTypes.head; lc; lc = lc->next) { - KeyProviders *kp = (KeyProviders *) lc->ptr; + RegisteredKeyProviderType *kp = (RegisteredKeyProviderType *) lc->ptr; if (kp->type == type) { @@ -64,9 +66,9 @@ find_key_provider(ProviderType type) #endif /* !FRONTEND */ void -RegisterKeyProvider(const TDEKeyringRoutine *routine, ProviderType type) +RegisterKeyProviderType(const TDEKeyringRoutine *routine, ProviderType type) { - KeyProviders *kp; + RegisteredKeyProviderType *kp; #ifndef FRONTEND MemoryContext oldcontext; #endif @@ -74,49 +76,91 @@ RegisterKeyProvider(const TDEKeyringRoutine *routine, ProviderType type) Assert(routine != NULL); Assert(routine->keyring_get_key != NULL); Assert(routine->keyring_store_key != NULL); + Assert(routine->keyring_validate != NULL); - kp = find_key_provider(type); + kp = find_key_provider_type(type); if (kp) ereport(ERROR, - (errmsg("Key provider of type %d already registered", type))); + errmsg("Key provider of type %d already registered", type)); #ifndef FRONTEND oldcontext = MemoryContextSwitchTo(TopMemoryContext); #endif - kp = palloc_object(KeyProviders); + kp = palloc_object(RegisteredKeyProviderType); kp->routine = (TDEKeyringRoutine *) routine; kp->type = type; #ifndef FRONTEND - registeredKeyProviders = lappend(registeredKeyProviders, kp); + registeredKeyProviderTypes = lappend(registeredKeyProviderTypes, kp); MemoryContextSwitchTo(oldcontext); #else - simple_ptr_list_append(®isteredKeyProviders, kp); + simple_ptr_list_append(®isteredKeyProviderTypes, kp); #endif } KeyInfo * -KeyringGetKey(GenericKeyring *keyring, const char *key_name, KeyringReturnCodes *returnCode) +KeyringGetKey(GenericKeyring *keyring, const char *key_name, KeyringReturnCode *returnCode) { - KeyProviders *kp = find_key_provider(keyring->type); + KeyInfo *key = NULL; + RegisteredKeyProviderType *kp = find_key_provider_type(keyring->type); if (kp == NULL) { ereport(WARNING, - (errmsg("Key provider of type %d not registered", keyring->type))); + errmsg("key provider of type %d not registered", keyring->type)); *returnCode = KEYRING_CODE_INVALID_PROVIDER; return NULL; } - return kp->routine->keyring_get_key(keyring, key_name, returnCode); + key = kp->routine->keyring_get_key(keyring, key_name, returnCode); + + if (*returnCode != KEYRING_CODE_SUCCESS || key == NULL) + return NULL; + + if (!ValidateKey(key)) + { + *returnCode = KEYRING_CODE_INVALID_KEY; + pfree(key); + return NULL; + } + + return key; +} + +bool +ValidateKey(KeyInfo *key) +{ + Assert(key != NULL); + + if (key->name[0] == '\0') + { + ereport(WARNING, errmsg("invalid key: name is empty")); + return false; + } + + if (key->data.len == 0) + { + ereport(WARNING, errmsg("invalid key: data length is zero")); + return false; + } + + /* For now we only support 128-bit keys */ + if (key->data.len != KEY_DATA_SIZE_128) + { + ereport(WARNING, + errmsg("invalid key: unsupported key length \"%u\"", key->data.len)); + return false; + } + + return true; } static void KeyringStoreKey(GenericKeyring *keyring, KeyInfo *key) { - KeyProviders *kp = find_key_provider(keyring->type); + RegisteredKeyProviderType *kp = find_key_provider_type(keyring->type); if (kp == NULL) ereport(ERROR, - (errmsg("Key provider of type %d not registered", keyring->type))); + errmsg("Key provider of type %d not registered", keyring->type)); kp->routine->keyring_store_key(keyring, key); } @@ -126,15 +170,15 @@ KeyringGenerateNewKey(const char *key_name, unsigned key_len) { KeyInfo *key; - Assert(key_len <= 32); + Assert(key_len <= sizeof(key->data)); /* Struct will be saved to disk so keep clean */ - key = palloc0(sizeof(KeyInfo)); + key = palloc0_object(KeyInfo); key->data.len = key_len; if (!RAND_bytes(key->data.data, key_len)) - { - pfree(key); - return NULL; /* openssl error */ - } + ereport(ERROR, + errcode(ERRCODE_INTERNAL_ERROR), + errmsg("could not generate new principal key: %s", + ERR_error_string(ERR_get_error(), NULL))); strlcpy(key->name, key_name, sizeof(key->name)); return key; } @@ -148,3 +192,37 @@ KeyringGenerateNewKeyAndStore(GenericKeyring *keyring, const char *key_name, uns return key; } + +void +KeyringValidate(GenericKeyring *keyring) +{ + RegisteredKeyProviderType *kp = find_key_provider_type(keyring->type); + + if (kp == NULL) + ereport(ERROR, + errmsg("Key provider of type %d not registered", keyring->type)); + + kp->routine->keyring_validate(keyring); +} + +char * +KeyringErrorCodeToString(KeyringReturnCode code) +{ + switch (code) + { + case KEYRING_CODE_SUCCESS: + return "Success"; + case KEYRING_CODE_INVALID_PROVIDER: + return "Invalid key"; + case KEYRING_CODE_RESOURCE_NOT_AVAILABLE: + return "Resource not available"; + case KEYRING_CODE_INVALID_RESPONSE: + return "Invalid response from keyring provider"; + case KEYRING_CODE_INVALID_KEY: + return "Invalid key"; + case KEYRING_CODE_DATA_CORRUPTED: + return "Data corrupted"; + default: + return "Unknown error code"; + } +} diff --git a/contrib/pg_tde/src/keyring/keyring_curl.c b/contrib/pg_tde/src/keyring/keyring_curl.c index 5c2a58e76c686..1f2966a8833ba 100644 --- a/contrib/pg_tde/src/keyring/keyring_curl.c +++ b/contrib/pg_tde/src/keyring/keyring_curl.c @@ -1,12 +1,5 @@ -/*------------------------------------------------------------------------- - * - * keyring_curl.c - * Contains common curl related methods. - * - * IDENTIFICATION - * contrib/pg_tde/src/keyring/keyring_curl.c - * - *------------------------------------------------------------------------- +/* + * Contains common curl related methods. */ #include "postgres.h" @@ -16,8 +9,7 @@ CURL *keyringCurl = NULL; -static -size_t +static size_t write_func(void *ptr, size_t size, size_t nmemb, struct CurlString *s) { size_t new_len = s->len + size * nmemb; diff --git a/contrib/pg_tde/src/keyring/keyring_file.c b/contrib/pg_tde/src/keyring/keyring_file.c index 1abb93a650f64..f5b84e1881668 100644 --- a/contrib/pg_tde/src/keyring/keyring_file.c +++ b/contrib/pg_tde/src/keyring/keyring_file.c @@ -1,47 +1,39 @@ -/*------------------------------------------------------------------------- - * - * keyring_file.c - * Implements the file provider keyring - * routines. - * - * IDENTIFICATION - * contrib/pg_tde/src/keyring/keyring_file.c - * - *------------------------------------------------------------------------- +/* + * Implements the file provider keyring routines. */ #include "postgres.h" -#include "keyring/keyring_file.h" -#include "catalog/tde_keyring.h" #include "common/file_perm.h" -#include "keyring/keyring_api.h" #include "storage/fd.h" #include "utils/wait_event.h" +#include "catalog/tde_keyring.h" +#include "keyring/keyring_api.h" +#include "keyring/keyring_file.h" + #ifdef FRONTEND #include "pg_tde_fe.h" #endif -#include -#include - -static KeyInfo *get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCodes *return_code); +static KeyInfo *get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCode *return_code); static void set_key_by_name(GenericKeyring *keyring, KeyInfo *key); +static void validate(GenericKeyring *keyring); const TDEKeyringRoutine keyringFileRoutine = { .keyring_get_key = get_key_by_name, - .keyring_store_key = set_key_by_name + .keyring_store_key = set_key_by_name, + .keyring_validate = validate, }; void InstallFileKeyring(void) { - RegisterKeyProvider(&keyringFileRoutine, FILE_KEY_PROVIDER); + RegisterKeyProviderType(&keyringFileRoutine, FILE_KEY_PROVIDER); } static KeyInfo * -get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCodes *return_code) +get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCode *return_code) { KeyInfo *key = NULL; int fd = -1; @@ -51,7 +43,7 @@ get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCode *return_code = KEYRING_CODE_SUCCESS; - fd = BasicOpenFile(file_keyring->file_name, PG_BINARY); + fd = OpenTransientFile(file_keyring->file_name, PG_BINARY); if (fd < 0) return NULL; @@ -67,30 +59,30 @@ get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCode * Empty keyring file is considered as a valid keyring file that * has no keys */ - close(fd); + CloseTransientFile(fd); pfree(key); return NULL; } if (bytes_read != sizeof(KeyInfo)) { - close(fd); + CloseTransientFile(fd); pfree(key); /* Corrupt file */ *return_code = KEYRING_CODE_DATA_CORRUPTED; ereport(WARNING, - (errcode_for_file_access(), - errmsg("keyring file \"%s\" is corrupted: %m", - file_keyring->file_name), - errdetail("invalid key size %lu expected %lu", bytes_read, sizeof(KeyInfo)))); + errcode_for_file_access(), + errmsg("keyring file \"%s\" is corrupted: %m", + file_keyring->file_name), + errdetail("invalid key size %lu expected %lu", bytes_read, sizeof(KeyInfo))); return NULL; } if (strncasecmp(key->name, key_name, sizeof(key->name)) == 0) { - close(fd); + CloseTransientFile(fd); return key; } } - close(fd); + CloseTransientFile(fd); pfree(key); return NULL; } @@ -103,7 +95,7 @@ set_key_by_name(GenericKeyring *keyring, KeyInfo *key) int fd; FileKeyring *file_keyring = (FileKeyring *) keyring; KeyInfo *existing_key; - KeyringReturnCodes return_code = KEYRING_CODE_SUCCESS; + KeyringReturnCode return_code = KEYRING_CODE_SUCCESS; Assert(key != NULL); /* See if the key with same name already exists */ @@ -111,35 +103,49 @@ set_key_by_name(GenericKeyring *keyring, KeyInfo *key) if (existing_key) { ereport(ERROR, - (errmsg("Key with name %s already exists in keyring", key->name))); + errmsg("Key with name %s already exists in keyring", key->name)); } - fd = BasicOpenFile(file_keyring->file_name, O_CREAT | O_RDWR | PG_BINARY); + fd = OpenTransientFile(file_keyring->file_name, O_CREAT | O_RDWR | PG_BINARY); if (fd < 0) { ereport(ERROR, - (errcode_for_file_access(), - errmsg("Failed to open keyring file %s :%m", file_keyring->file_name))); + errcode_for_file_access(), + errmsg("Failed to open keyring file %s: %m", file_keyring->file_name)); } /* Write key to the end of file */ curr_pos = lseek(fd, 0, SEEK_END); bytes_written = pg_pwrite(fd, key, sizeof(KeyInfo), curr_pos); if (bytes_written != sizeof(KeyInfo)) { - close(fd); ereport(ERROR, - (errcode_for_file_access(), - errmsg("keyring file \"%s\" can't be written: %m", - file_keyring->file_name))); + errcode_for_file_access(), + errmsg("keyring file \"%s\" can't be written: %m", + file_keyring->file_name)); } if (pg_fsync(fd) != 0) { - close(fd); ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not fsync file \"%s\": %m", - file_keyring->file_name))); + errcode_for_file_access(), + errmsg("could not fsync file \"%s\": %m", + file_keyring->file_name)); } - close(fd); + CloseTransientFile(fd); +} + +static void +validate(GenericKeyring *keyring) +{ + FileKeyring *file_keyring = (FileKeyring *) keyring; + int fd = OpenTransientFile(file_keyring->file_name, O_CREAT | O_RDWR | PG_BINARY); + + if (fd < 0) + { + ereport(ERROR, + errcode_for_file_access(), + errmsg("Failed to open keyring file %s: %m", file_keyring->file_name)); + } + + CloseTransientFile(fd); } diff --git a/contrib/pg_tde/src/keyring/keyring_kmip.c b/contrib/pg_tde/src/keyring/keyring_kmip.c index fc9a8735cf083..df10fd56ced62 100644 --- a/contrib/pg_tde/src/keyring/keyring_kmip.c +++ b/contrib/pg_tde/src/keyring/keyring_kmip.c @@ -1,12 +1,5 @@ -/*------------------------------------------------------------------------- - * - * keyring_kmip.c - * KMIP based keyring provider - * - * IDENTIFICATION - * contrib/pg_tde/src/keyring/keyring_kmip.c - * - *------------------------------------------------------------------------- +/* + * KMIP based keyring provider */ #include "postgres.h" @@ -14,9 +7,9 @@ #include #include +#include "keyring/keyring_api.h" #include "keyring/keyring_kmip.h" #include "keyring/keyring_kmip_impl.h" -#include "keyring/keyring_api.h" #ifdef FRONTEND #include "pg_tde_fe.h" @@ -25,17 +18,19 @@ #define MAX_LOCATE_LEN 128 static void set_key_by_name(GenericKeyring *keyring, KeyInfo *key); -static KeyInfo *get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCodes *return_code); +static KeyInfo *get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCode *return_code); +static void validate(GenericKeyring *keyring); const TDEKeyringRoutine keyringKmipRoutine = { .keyring_get_key = get_key_by_name, - .keyring_store_key = set_key_by_name + .keyring_store_key = set_key_by_name, + .keyring_validate = validate, }; void InstallKmipKeyring(void) { - RegisterKeyProvider(&keyringKmipRoutine, KMIP_KEY_PROVIDER); + RegisterKeyProviderType(&keyringKmipRoutine, KMIP_KEY_PROVIDER); } typedef struct KmipCtx @@ -55,21 +50,21 @@ kmipSslConnect(KmipCtx *ctx, KmipKeyring *kmip_keyring, bool throw_error) if (SSL_CTX_use_certificate_file(ctx->ssl, kmip_keyring->kmip_cert_path, SSL_FILETYPE_PEM) != 1) { SSL_CTX_free(ctx->ssl); - ereport(level, (errmsg("SSL error: Loading the client certificate failed"))); + ereport(level, errmsg("SSL error: Loading the client certificate failed")); return false; } - if (SSL_CTX_use_PrivateKey_file(ctx->ssl, kmip_keyring->kmip_cert_path, SSL_FILETYPE_PEM) != 1) + if (SSL_CTX_use_PrivateKey_file(ctx->ssl, kmip_keyring->kmip_key_path, SSL_FILETYPE_PEM) != 1) { SSL_CTX_free(ctx->ssl); - ereport(level, (errmsg("SSL error: Loading the client key failed"))); + ereport(level, errmsg("SSL error: Loading the client key failed")); return false; } if (SSL_CTX_load_verify_locations(ctx->ssl, kmip_keyring->kmip_ca_path, NULL) != 1) { SSL_CTX_free(ctx->ssl); - ereport(level, (errmsg("SSL error: Loading the CA certificate failed"))); + ereport(level, errmsg("SSL error: Loading the CA certificate failed")); return false; } @@ -77,7 +72,7 @@ kmipSslConnect(KmipCtx *ctx, KmipKeyring *kmip_keyring, bool throw_error) if (ctx->bio == NULL) { SSL_CTX_free(ctx->ssl); - ereport(level, (errmsg("SSL error: BIO_new_ssl_connect failed"))); + ereport(level, errmsg("SSL error: BIO_new_ssl_connect failed")); return false; } @@ -89,7 +84,7 @@ kmipSslConnect(KmipCtx *ctx, KmipKeyring *kmip_keyring, bool throw_error) { BIO_free_all(ctx->bio); SSL_CTX_free(ctx->ssl); - ereport(level, (errmsg("SSL error: BIO_do_connect failed"))); + ereport(level, errmsg("SSL error: BIO_do_connect failed")); return false; } @@ -101,11 +96,9 @@ set_key_by_name(GenericKeyring *keyring, KeyInfo *key) { KmipCtx ctx; KmipKeyring *kmip_keyring = (KmipKeyring *) keyring; - bool sslresult; int result; - sslresult = kmipSslConnect(&ctx, kmip_keyring, true); - Assert(sslresult); + kmipSslConnect(&ctx, kmip_keyring, true); result = pg_tde_kmip_set_by_name(ctx.bio, key->name, key->data.data, key->data.len); @@ -113,11 +106,11 @@ set_key_by_name(GenericKeyring *keyring, KeyInfo *key) SSL_CTX_free(ctx.ssl); if (result != 0) - ereport(ERROR, (errmsg("KMIP server reported error on register symmetric key: %i", result))); + ereport(ERROR, errmsg("KMIP server reported error on register symmetric key: %i", result)); } static KeyInfo * -get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCodes *return_code) +get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCode *return_code) { KeyInfo *key = NULL; KmipKeyring *kmip_keyring = (KmipKeyring *) keyring; @@ -156,7 +149,7 @@ get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCode if (ids_found > 1) { - ereport(WARNING, (errmsg("KMIP server contains multiple results for key, ignoring"))); + ereport(WARNING, errmsg("KMIP server contains multiple results for key, ignoring")); *return_code = KEYRING_CODE_RESOURCE_NOT_AVAILABLE; BIO_free_all(ctx.bio); SSL_CTX_free(ctx.ssl); @@ -174,7 +167,7 @@ get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCode if (result != 0) { - ereport(WARNING, (errmsg("KMIP server LOCATEd key, but GET failed with %i", result))); + ereport(WARNING, errmsg("KMIP server LOCATEd key, but GET failed with %i", result)); *return_code = KEYRING_CODE_RESOURCE_NOT_AVAILABLE; pfree(key); BIO_free_all(ctx.bio); @@ -184,8 +177,8 @@ get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCode if (key->data.len > sizeof(key->data.data)) { - ereport(WARNING, (errmsg("keyring provider returned invalid key size: %d", key->data.len))); - *return_code = KEYRING_CODE_INVALID_KEY_SIZE; + ereport(WARNING, errmsg("keyring provider returned invalid key size: %d", key->data.len)); + *return_code = KEYRING_CODE_INVALID_KEY; pfree(key); BIO_free_all(ctx.bio); SSL_CTX_free(ctx.ssl); @@ -204,3 +197,15 @@ get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCode return key; } + +static void +validate(GenericKeyring *keyring) +{ + KmipKeyring *kmip_keyring = (KmipKeyring *) keyring; + KmipCtx ctx; + + kmipSslConnect(&ctx, kmip_keyring, true); + + BIO_free_all(ctx.bio); + SSL_CTX_free(ctx.ssl); +} diff --git a/contrib/pg_tde/src/keyring/keyring_kmip_impl.c b/contrib/pg_tde/src/keyring/keyring_kmip_impl.c index 87e4540076fb5..3a5a23b325d20 100644 --- a/contrib/pg_tde/src/keyring/keyring_kmip_impl.c +++ b/contrib/pg_tde/src/keyring/keyring_kmip_impl.c @@ -4,6 +4,7 @@ */ #include +#include #include #include #include @@ -19,7 +20,7 @@ pg_tde_kmip_set_by_name(BIO *bio, char *key_name, const unsigned char *key, unsi int32 mask = KMIP_CRYPTOMASK_ENCRYPT | KMIP_CRYPTOMASK_DECRYPT; Name ts; TextString ts2; - TemplateAttribute ta = {}; + TemplateAttribute ta = {0}; char *idp; int id_size; diff --git a/contrib/pg_tde/src/keyring/keyring_vault.c b/contrib/pg_tde/src/keyring/keyring_vault.c index c2d41323d512a..06790de2e09d1 100644 --- a/contrib/pg_tde/src/keyring/keyring_vault.c +++ b/contrib/pg_tde/src/keyring/keyring_vault.c @@ -1,34 +1,27 @@ -/*------------------------------------------------------------------------- - * - * keyring_vault.c - * HashiCorp Vault 2 based keyring provider - * - * IDENTIFICATION - * contrib/pg_tde/src/keyring/keyring_vault.c - * - *------------------------------------------------------------------------- +/* + * HashiCorp Vault 2 based keyring provider */ #include "postgres.h" -#include "keyring/keyring_vault.h" -#include "keyring/keyring_curl.h" -#include "keyring/keyring_api.h" -#include "pg_tde_defines.h" +#include + +#include "common/base64.h" #include "common/jsonapi.h" #include "mb/pg_wchar.h" #include "utils/builtins.h" -#include - -#include - -#include "common/base64.h" +#include "keyring/keyring_api.h" +#include "keyring/keyring_curl.h" +#include "keyring/keyring_vault.h" +#include "pg_tde_defines.h" #ifdef FRONTEND #include "pg_tde_fe.h" #endif +#define VAULT_URL_MAX_LEN 512 + /* * JSON parser state */ @@ -40,6 +33,15 @@ typedef enum JRESP_EXPECT_KEY } JsonVaultRespSemState; +typedef enum +{ + JRESP_MOUNT_INFO_EXPECT_TOPLEVEL_FIELD, + JRESP_MOUNT_INFO_EXPECT_TYPE_VALUE, + JRESP_MOUNT_INFO_EXPECT_VERSION_VALUE, + JRESP_MOUNT_INFO_EXPECT_OPTIONS_START, + JRESP_MOUNT_INFO_EXPECT_OPTIONS_FIELD, +} JsonVaultRespMountInfoSemState; + typedef enum { JRESP_F_UNUSED, @@ -56,61 +58,53 @@ typedef struct JsonVaultRespState char *key; } JsonVaultRespState; +typedef struct JsonVaultMountInfoState +{ + JsonVaultRespMountInfoSemState state; + int level; + + char *type; + char *version; +} JsonVaultMountInfoState; + static JsonParseErrorType json_resp_object_start(void *state); static JsonParseErrorType json_resp_object_end(void *state); static JsonParseErrorType json_resp_scalar(void *state, char *token, JsonTokenType tokentype); static JsonParseErrorType json_resp_object_field_start(void *state, char *fname, bool isnull); static JsonParseErrorType parse_json_response(JsonVaultRespState *parse, JsonLexContext *lex); -static struct curl_slist *curlList = NULL; +static JsonParseErrorType json_mountinfo_object_start(void *state); +static JsonParseErrorType json_mountinfo_object_end(void *state); +static JsonParseErrorType json_mountinfo_scalar(void *state, char *token, JsonTokenType tokentype); +static JsonParseErrorType json_mountinfo_object_field_start(void *state, char *fname, bool isnull); +static JsonParseErrorType parse_vault_mount_info(JsonVaultMountInfoState *state, JsonLexContext *lex); -static bool curl_setup_token(VaultV2Keyring *keyring); static char *get_keyring_vault_url(VaultV2Keyring *keyring, const char *key_name, char *out, size_t out_size); static bool curl_perform(VaultV2Keyring *keyring, const char *url, CurlString *outStr, long *httpCode, const char *postData); static void set_key_by_name(GenericKeyring *keyring, KeyInfo *key); -static KeyInfo *get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCodes *return_code); +static KeyInfo *get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCode *return_code); +static void validate(GenericKeyring *keyring); const TDEKeyringRoutine keyringVaultV2Routine = { .keyring_get_key = get_key_by_name, - .keyring_store_key = set_key_by_name + .keyring_store_key = set_key_by_name, + .keyring_validate = validate, }; void InstallVaultV2Keyring(void) { - RegisterKeyProvider(&keyringVaultV2Routine, VAULT_V2_KEY_PROVIDER); -} - -static bool -curl_setup_token(VaultV2Keyring *keyring) -{ - if (curlList == NULL) - { - char tokenHeader[256]; - - strcpy(tokenHeader, "X-Vault-Token:"); - strcat(tokenHeader, keyring->vault_token); - - curlList = curl_slist_append(curlList, tokenHeader); - if (curlList == NULL) - return 0; - - curlList = curl_slist_append(curlList, "Content-Type: application/json"); - if (curlList == NULL) - return 0; - } - - if (curl_easy_setopt(keyringCurl, CURLOPT_HTTPHEADER, curlList) != CURLE_OK) - return 0; - - return 1; + RegisterKeyProviderType(&keyringVaultV2Routine, VAULT_V2_KEY_PROVIDER); } static bool curl_perform(VaultV2Keyring *keyring, const char *url, CurlString *outStr, long *httpCode, const char *postData) { CURLcode ret; + struct curl_slist *curlList = NULL; + char tokenHeader[256]; + #if KEYRING_DEBUG elog(DEBUG1, "Performing Vault HTTP [%s] request to '%s'", postData != NULL ? "POST" : "GET", url); if (postData != NULL) @@ -124,29 +118,49 @@ curl_perform(VaultV2Keyring *keyring, const char *url, CurlString *outStr, long if (!curlSetupSession(url, keyring->vault_ca_path, outStr)) return 0; - if (!curl_setup_token(keyring)) - return 0; - if (postData != NULL) { if (curl_easy_setopt(keyringCurl, CURLOPT_POSTFIELDS, postData) != CURLE_OK) return 0; } + pg_snprintf(tokenHeader, sizeof(tokenHeader), + "X-Vault-Token: %s", keyring->vault_token); + curlList = curl_slist_append(curlList, tokenHeader); + if (curlList == NULL) + return 0; + + if (!curl_slist_append(curlList, "Content-Type: application/json")) + { + curl_slist_free_all(curlList); + return 0; + } + + if (curl_easy_setopt(keyringCurl, CURLOPT_HTTPHEADER, curlList) != CURLE_OK) + { + curl_slist_free_all(curlList); + return 0; + } + ret = curl_easy_perform(keyringCurl); if (ret != CURLE_OK) { elog(LOG, "curl_easy_perform failed with return code: %d", ret); + curl_slist_free_all(curlList); return 0; } if (curl_easy_getinfo(keyringCurl, CURLINFO_RESPONSE_CODE, httpCode) != CURLE_OK) + { + curl_slist_free_all(curlList); return 0; + } #if KEYRING_DEBUG elog(DEBUG2, "Vault response [%li] '%s'", *httpCode, outStr->ptr != NULL ? outStr->ptr : ""); #endif + curl_slist_free_all(curlList); return 1; } @@ -197,8 +211,8 @@ set_key_by_name(GenericKeyring *keyring, KeyInfo *key) if (!curl_perform(vault_keyring, url, &str, &httpCode, jsonText)) { ereport(ERROR, - (errmsg("HTTP(S) request to keyring provider \"%s\" failed", - vault_keyring->keyring.provider_name))); + errmsg("HTTP(S) request to keyring provider \"%s\" failed", + vault_keyring->keyring.provider_name)); } if (str.ptr != NULL) @@ -206,12 +220,12 @@ set_key_by_name(GenericKeyring *keyring, KeyInfo *key) if (httpCode / 100 != 2) ereport(ERROR, - (errmsg("Invalid HTTP response from keyring provider \"%s\": %ld", - vault_keyring->keyring.provider_name, httpCode))); + errmsg("Invalid HTTP response from keyring provider \"%s\": %ld", + vault_keyring->keyring.provider_name, httpCode)); } static KeyInfo * -get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCodes *return_code) +get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCode *return_code) { VaultV2Keyring *vault_keyring = (VaultV2Keyring *) keyring; KeyInfo *key = NULL; @@ -230,16 +244,15 @@ get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCode if (!curl_perform(vault_keyring, url, &str, &httpCode, NULL)) { - *return_code = KEYRING_CODE_INVALID_KEY_SIZE; + *return_code = KEYRING_CODE_INVALID_KEY; ereport(WARNING, - (errmsg("HTTP(S) request to keyring provider \"%s\" failed", - vault_keyring->keyring.provider_name))); + errmsg("HTTP(S) request to keyring provider \"%s\" failed", + vault_keyring->keyring.provider_name)); goto cleanup; } if (httpCode == 404) { - *return_code = KEYRING_CODE_RESOURCE_NOT_AVAILABLE; goto cleanup; } @@ -247,24 +260,29 @@ get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCode { *return_code = KEYRING_CODE_INVALID_RESPONSE; ereport(WARNING, - (errmsg("HTTP(S) request to keyring provider \"%s\" returned invalid response %li", - vault_keyring->keyring.provider_name, httpCode))); + errmsg("HTTP(S) request to keyring provider \"%s\" returned invalid response %li", + vault_keyring->keyring.provider_name, httpCode)); goto cleanup; } -#if PG_VERSION_NUM < 170000 - jlex = makeJsonLexContextCstringLen(str.ptr, str.len, PG_UTF8, true); -#else jlex = makeJsonLexContextCstringLen(NULL, str.ptr, str.len, PG_UTF8, true); -#endif json_error = parse_json_response(&parse, jlex); if (json_error != JSON_SUCCESS) { *return_code = KEYRING_CODE_INVALID_RESPONSE; ereport(WARNING, - (errmsg("HTTP(S) request to keyring provider \"%s\" returned incorrect JSON: %s", - vault_keyring->keyring.provider_name, json_errdetail(json_error, jlex)))); + errmsg("HTTP(S) request to keyring provider \"%s\" returned incorrect JSON: %s", + vault_keyring->keyring.provider_name, json_errdetail(json_error, jlex))); + goto cleanup; + } + + if (parse.key == NULL) + { + *return_code = KEYRING_CODE_INVALID_RESPONSE; + ereport(WARNING, + errmsg("HTTP(S) request to keyring provider \"%s\" returned no key", + vault_keyring->keyring.provider_name)); goto cleanup; } @@ -281,10 +299,10 @@ get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCode if (key->data.len > MAX_KEY_DATA_SIZE) { - *return_code = KEYRING_CODE_INVALID_KEY_SIZE; + *return_code = KEYRING_CODE_INVALID_KEY; ereport(WARNING, - (errmsg("keyring provider \"%s\" returned invalid key size: %d", - vault_keyring->keyring.provider_name, key->data.len))); + errmsg("keyring provider \"%s\" returned invalid key size: %d", + vault_keyring->keyring.provider_name, key->data.len)); pfree(key); key = NULL; goto cleanup; @@ -293,15 +311,111 @@ get_key_by_name(GenericKeyring *keyring, const char *key_name, KeyringReturnCode cleanup: if (str.ptr != NULL) pfree(str.ptr); -#if PG_VERSION_NUM >= 170000 + if (jlex != NULL) freeJsonLexContext(jlex); -#endif + return key; } +static void +validate(GenericKeyring *keyring) +{ + VaultV2Keyring *vault_keyring = (VaultV2Keyring *) keyring; + char url[VAULT_URL_MAX_LEN]; + int len = 0; + CurlString str; + long httpCode = 0; + JsonParseErrorType json_error; + JsonLexContext *jlex = NULL; + JsonVaultMountInfoState parse; + + /* + * Validate that the mount has the correct engine type and version. + */ + len = snprintf(url, VAULT_URL_MAX_LEN, "%s/v1/sys/mounts/%s", vault_keyring->vault_url, vault_keyring->vault_mount_path); + if (len >= VAULT_URL_MAX_LEN) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("vault mounts URL is too long")); + + if (!curl_perform(vault_keyring, url, &str, &httpCode, NULL)) + ereport(ERROR, + errmsg("HTTP(S) request to keyring provider \"%s\" failed", + vault_keyring->keyring.provider_name)); + + if (httpCode != 200) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("failed to get mount info for \"%s\" at mountpoint \"%s\" (HTTP %ld)", + vault_keyring->vault_url, vault_keyring->vault_mount_path, httpCode)); + + jlex = makeJsonLexContextCstringLen(NULL, str.ptr, str.len, PG_UTF8, true); + json_error = parse_vault_mount_info(&parse, jlex); + + if (json_error != JSON_SUCCESS) + ereport(ERROR, + errcode(ERRCODE_INVALID_JSON_TEXT), + errmsg("failed to parse mount info for \"%s\" at mountpoint \"%s\": %s", + vault_keyring->vault_url, vault_keyring->vault_mount_path, json_errdetail(json_error, jlex))); + + if (parse.type == NULL) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("failed to parse mount info for \"%s\" at mountpoint \"%s\": missing type field", + vault_keyring->vault_url, vault_keyring->vault_mount_path)); + + if (strcmp(parse.type, "kv") != 0) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("vault mount at \"%s\" has unsupported engine type \"%s\"", + vault_keyring->vault_mount_path, parse.type), + errhint("The only supported vault engine type is Key/Value version \"2\"")); + + if (parse.version == NULL) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("failed to parse mount info for \"%s\" at mountpoint \"%s\": missing version field", + vault_keyring->vault_url, vault_keyring->vault_mount_path)); + + if (strcmp(parse.version, "2") != 0) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("vault mount at \"%s\" has unsupported Key/Value engine version \"%s\"", + vault_keyring->vault_mount_path, parse.version), + errhint("The only supported vault engine type is Key/Value version \"2\"")); + + /* + * Validate that we can read the secrets at the mount point. + */ + len = snprintf(url, VAULT_URL_MAX_LEN, "%s/v1/%s/metadata/?list=true", + vault_keyring->vault_url, vault_keyring->vault_mount_path); + if (len >= VAULT_URL_MAX_LEN) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("vault metadata URL is too long")); + + if (!curl_perform(vault_keyring, url, &str, &httpCode, NULL)) + ereport(ERROR, + errmsg("HTTP(S) request to keyring provider \"%s\" failed", + vault_keyring->keyring.provider_name)); + + /* If the mount point doesn't have any secrets yet, we'll get a 404. */ + if (httpCode != 200 && httpCode != 404) + ereport(ERROR, + errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("Listing secrets of \"%s\" at mountpoint \"%s\" failed", + vault_keyring->vault_url, vault_keyring->vault_mount_path)); + + if (str.ptr != NULL) + pfree(str.ptr); + + if (jlex != NULL) + freeJsonLexContext(jlex); +} + /* - * JSON parser routines + * JSON parser routines for key response * * We expect the response in the form of: * { @@ -416,7 +530,154 @@ json_resp_object_field_start(void *state, char *fname, bool isnull) if (strcmp(fname, "key") == 0 && parse->level == 2) parse->field = JRESP_F_KEY; break; + default: + /* NOP */ + break; + } + + return JSON_SUCCESS; +} + +/* + * JSON parser routines for mount info + * + * We expect the response in the form of: + * { + * ... + * "type": "kv", + * "options": { + * "version": "2" + * } + * ... + * } + * + * the rest fields are ignored + */ + +static JsonParseErrorType +parse_vault_mount_info(JsonVaultMountInfoState *state, JsonLexContext *lex) +{ + JsonSemAction sem; + + state->state = JRESP_MOUNT_INFO_EXPECT_TOPLEVEL_FIELD; + state->type = NULL; + state->version = NULL; + state->level = -1; + + memset(&sem, 0, sizeof(sem)); + sem.semstate = state; + sem.object_start = json_mountinfo_object_start; + sem.object_end = json_mountinfo_object_end; + sem.scalar = json_mountinfo_scalar; + sem.object_field_start = json_mountinfo_object_field_start; + + return pg_parse_json(lex, &sem); +} + +static JsonParseErrorType +json_mountinfo_object_start(void *state) +{ + JsonVaultMountInfoState *parse = (JsonVaultMountInfoState *) state; + + switch (parse->state) + { + case JRESP_MOUNT_INFO_EXPECT_OPTIONS_START: + parse->state = JRESP_MOUNT_INFO_EXPECT_OPTIONS_FIELD; + break; + default: + /* NOP */ + break; + } + + parse->level++; + + return JSON_SUCCESS; +} + +static JsonParseErrorType +json_mountinfo_object_end(void *state) +{ + JsonVaultMountInfoState *parse = (JsonVaultMountInfoState *) state; + + if (parse->state == JRESP_MOUNT_INFO_EXPECT_OPTIONS_FIELD) + parse->state = JRESP_MOUNT_INFO_EXPECT_TOPLEVEL_FIELD; + + parse->level--; + + return JSON_SUCCESS; +} + +static JsonParseErrorType +json_mountinfo_scalar(void *state, char *token, JsonTokenType tokentype) +{ + JsonVaultMountInfoState *parse = (JsonVaultMountInfoState *) state; + + switch (parse->state) + { + case JRESP_MOUNT_INFO_EXPECT_TYPE_VALUE: + parse->type = token; + parse->state = JRESP_MOUNT_INFO_EXPECT_TOPLEVEL_FIELD; + break; + case JRESP_MOUNT_INFO_EXPECT_VERSION_VALUE: + parse->version = token; + parse->state = JRESP_MOUNT_INFO_EXPECT_OPTIONS_FIELD; + break; + case JRESP_MOUNT_INFO_EXPECT_OPTIONS_START: + + /* + * Reset "options" object expectations if we got scalar. Most + * likely just a null. + */ + parse->state = JRESP_MOUNT_INFO_EXPECT_TOPLEVEL_FIELD; + break; + default: + /* NOP */ + break; + } + + return JSON_SUCCESS; +} + +static JsonParseErrorType +json_mountinfo_object_field_start(void *state, char *fname, bool isnull) +{ + JsonVaultMountInfoState *parse = (JsonVaultMountInfoState *) state; + + switch (parse->state) + { + case JRESP_MOUNT_INFO_EXPECT_TOPLEVEL_FIELD: + if (parse->level == 0) + { + if (strcmp(fname, "type") == 0) + { + parse->state = JRESP_MOUNT_INFO_EXPECT_TYPE_VALUE; + break; + } + + if (strcmp(fname, "options") == 0) + { + parse->state = JRESP_MOUNT_INFO_EXPECT_OPTIONS_START; + break; + } + } + break; + + case JRESP_MOUNT_INFO_EXPECT_OPTIONS_FIELD: + if (parse->level == 1) + { + if (strcmp(fname, "version") == 0) + { + parse->state = JRESP_MOUNT_INFO_EXPECT_VERSION_VALUE; + break; + } + } + break; + + default: + /* NOP */ + break; } + pfree(fname); return JSON_SUCCESS; } diff --git a/contrib/pg_tde/src/pg_tde.c b/contrib/pg_tde/src/pg_tde.c index a6db0811449ca..e6f32f099bbe0 100644 --- a/contrib/pg_tde/src/pg_tde.c +++ b/contrib/pg_tde/src/pg_tde.c @@ -1,64 +1,39 @@ -/*------------------------------------------------------------------------- - * - * pg_tde.c - * Main file: setup GUCs, shared memory, hooks and other general-purpose - * routines. - * - * IDENTIFICATION - * contrib/pg_tde/src/pg_tde.c - * - *------------------------------------------------------------------------- +/* + * Main file: setup GUCs, shared memory, hooks and other general-purpose + * routines. */ #include "postgres.h" + +#include "access/tableam.h" +#include "access/xlog.h" +#include "access/xloginsert.h" #include "funcapi.h" -#include "pg_tde.h" -#include "transam/pg_tde_xact_handler.h" #include "miscadmin.h" #include "storage/ipc.h" #include "storage/lwlock.h" #include "storage/shmem.h" +#include "utils/builtins.h" +#include "utils/percona.h" + +#include "access/pg_tde_tdemap.h" #include "access/pg_tde_xlog.h" -#include "access/pg_tde_xlog_encrypt.h" +#include "access/pg_tde_xlog_smgr.h" +#include "catalog/tde_global_space.h" +#include "catalog/tde_principal_key.h" #include "encryption/enc_aes.h" -#include "access/pg_tde_tdemap.h" -#include "access/xlog.h" -#include "access/xloginsert.h" #include "keyring/keyring_api.h" -#include "common/pg_tde_shmem.h" -#include "common/pg_tde_utils.h" -#include "catalog/tde_principal_key.h" #include "keyring/keyring_file.h" -#include "keyring/keyring_vault.h" #include "keyring/keyring_kmip.h" -#include "utils/builtins.h" -#include "pg_tde_defs.h" -#include "smgr/pg_tde_smgr.h" -#include "catalog/tde_global_space.h" -#include "utils/percona.h" +#include "keyring/keyring_vault.h" +#include "pg_tde.h" +#include "pg_tde_event_capture.h" #include "pg_tde_guc.h" -#include "access/tableam.h" - -#include - -#define MAX_ON_INSTALLS 5 +#include "smgr/pg_tde_smgr.h" PG_MODULE_MAGIC; -struct OnExtInstall -{ - pg_tde_on_ext_install_callback function; - void *arg; -}; - -static struct OnExtInstall on_ext_install_list[MAX_ON_INSTALLS]; -static int on_ext_install_index = 0; static void pg_tde_init_data_dir(void); -static void run_extension_install_callbacks(XLogExtensionInstall *xlrec, bool redo); -void _PG_init(void); -Datum pg_tde_extension_initialize(PG_FUNCTION_ARGS); -Datum pg_tde_version(PG_FUNCTION_ARGS); -Datum pg_tdeam_handler(PG_FUNCTION_ARGS); static shmem_startup_hook_type prev_shmem_startup_hook = NULL; static shmem_request_hook_type prev_shmem_request_hook = NULL; @@ -70,16 +45,17 @@ PG_FUNCTION_INFO_V1(pg_tdeam_handler); static void tde_shmem_request(void) { - Size sz = TdeRequiredSharedMemorySize(); - int required_locks = TdeRequiredLocksCount(); + Size sz = 0; + sz = add_size(sz, PrincipalKeyShmemSize()); sz = add_size(sz, TDEXLogEncryptStateSize()); if (prev_shmem_request_hook) prev_shmem_request_hook(); + RequestAddinShmemSpace(sz); - RequestNamedLWLockTranche(TDE_TRANCHE_NAME, required_locks); - ereport(LOG, (errmsg("tde_shmem_request: requested %ld bytes", sz))); + RequestNamedLWLockTranche(TDE_TRANCHE_NAME, TDE_LWLOCK_COUNT); + ereport(LOG, errmsg("tde_shmem_request: requested %ld bytes", sz)); } static void @@ -88,11 +64,15 @@ tde_shmem_startup(void) if (prev_shmem_startup_hook) prev_shmem_startup_hook(); - TdeShmemInit(); - AesInit(); + LWLockAcquire(AddinShmemInitLock, LW_EXCLUSIVE); + KeyProviderShmemInit(); + PrincipalKeyShmemInit(); TDEXLogShmemInit(); TDEXLogSmgrInit(); + TDEXLogSmgrInitWrite(EncryptXLog); + + LWLockRelease(AddinShmemInitLock); } void @@ -112,35 +92,36 @@ _PG_init(void) check_percona_api_version(); + pg_tde_init_data_dir(); + AesInit(); TdeGucInit(); - - InitializePrincipalKeyInfo(); - InitializeKeyProviderInfo(); + TdeEventCaptureInit(); + InstallFileKeyring(); + InstallVaultV2Keyring(); + InstallKmipKeyring(); + RegisterTdeRmgr(); + RegisterStorageMgr(); prev_shmem_request_hook = shmem_request_hook; shmem_request_hook = tde_shmem_request; prev_shmem_startup_hook = shmem_startup_hook; shmem_startup_hook = tde_shmem_startup; +} - RegisterTdeXactCallbacks(); - InstallFileKeyring(); - InstallVaultV2Keyring(); - InstallKmipKeyring(); - RegisterTdeRmgr(); - - RegisterStorageMgr(); +static void +extension_install(Oid databaseId) +{ + key_provider_startup_cleanup(databaseId); + principal_key_startup_cleanup(databaseId); } Datum pg_tde_extension_initialize(PG_FUNCTION_ARGS) { - /* Initialize the TDE map */ XLogExtensionInstall xlrec; - pg_tde_init_data_dir(); - xlrec.database_id = MyDatabaseId; - run_extension_install_callbacks(&xlrec, false); + extension_install(xlrec.database_id); /* * Also put this info in xlog, so we can replicate the same on the other @@ -148,81 +129,36 @@ pg_tde_extension_initialize(PG_FUNCTION_ARGS) */ XLogBeginInsert(); XLogRegisterData((char *) &xlrec, sizeof(XLogExtensionInstall)); - XLogInsert(RM_TDERMGR_ID, XLOG_TDE_EXTENSION_INSTALL_KEY); + XLogInsert(RM_TDERMGR_ID, XLOG_TDE_INSTALL_EXTENSION); - PG_RETURN_NULL(); -} -void -extension_install_redo(XLogExtensionInstall *xlrec) -{ - pg_tde_init_data_dir(); - run_extension_install_callbacks(xlrec, true); + PG_RETURN_VOID(); } -/* ---------------------------------------------------------------- - * on_ext_install - * - * Register ordinary callback to perform initializations - * run at the time of pg_tde extension installs. - * ---------------------------------------------------------------- - */ void -on_ext_install(pg_tde_on_ext_install_callback function, void *arg) +extension_install_redo(XLogExtensionInstall *xlrec) { - if (on_ext_install_index >= MAX_ON_INSTALLS) - ereport(FATAL, - (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED), - errmsg_internal("out of on extension install slots"))); - - on_ext_install_list[on_ext_install_index].function = function; - on_ext_install_list[on_ext_install_index].arg = arg; - - ++on_ext_install_index; + extension_install(xlrec->database_id); } /* Creates a tde directory for internal files if not exists */ static void pg_tde_init_data_dir(void) { - struct stat st; - - if (stat(PG_TDE_DATA_DIR, &st) < 0) + if (access(PG_TDE_DATA_DIR, F_OK) == -1) { if (MakePGDirectory(PG_TDE_DATA_DIR) < 0) ereport(ERROR, - (errcode_for_file_access(), - errmsg("could not create tde directory \"%s\": %m", - PG_TDE_DATA_DIR))); + errcode_for_file_access(), + errmsg("could not create tde directory \"%s\": %m", + PG_TDE_DATA_DIR)); } } -/* ------------------ - * Run all of the on_ext_install routines and execute those one by one - * ------------------ - */ -static void -run_extension_install_callbacks(XLogExtensionInstall *xlrec, bool redo) -{ - int i; - int tde_table_count = 0; - - /* - * Get the number of tde tables in this database should always be zero. - * But still, it prevents the cleanup if someone explicitly calls this - * function. - */ - if (!redo) - tde_table_count = get_tde_tables_count(); - for (i = 0; i < on_ext_install_index; i++) - on_ext_install_list[i] - .function(tde_table_count, xlrec, redo, on_ext_install_list[i].arg); -} - /* Returns package version */ Datum pg_tde_version(PG_FUNCTION_ARGS) { - PG_RETURN_TEXT_P(cstring_to_text(pg_tde_package_string())); + PG_RETURN_TEXT_P(cstring_to_text(PG_TDE_VERSION_STRING)); } Datum diff --git a/contrib/pg_tde/src/pg_tde_change_key_provider.c b/contrib/pg_tde/src/pg_tde_change_key_provider.c deleted file mode 100644 index 0663c381f0a8f..0000000000000 --- a/contrib/pg_tde/src/pg_tde_change_key_provider.c +++ /dev/null @@ -1,266 +0,0 @@ - -#include "postgres_fe.h" - -#include "pg_tde.h" -#include "catalog/tde_keyring.h" -#include "catalog/tde_global_space.h" -#include "common/controldata_utils.h" -#include "common/logging.h" -#include "common/pg_tde_utils.h" - -#include -#include - -/* version string we expect back from pg_tde_change_key_provider */ -#define PROGNAME "pg_tde_change_key_provider (PostgreSQL) " PG_VERSION "\n" - -static void -help(void) -{ - puts("pg_tde_change_key_provider changes the configuration of a pg_tde key provider"); - puts(""); - puts("Usage:"); - puts(""); - puts("pg_tde_change_key_provider [-D ] "); - puts(""); - puts(" Where can be file, vault or kmip"); - puts(""); - puts("Depending on the provider type, the complete parameter list is:"); - puts(""); - puts("pg_tde_change_key_provider [-D ] file "); - puts("pg_tde_change_key_provider [-D ] vault []"); - puts("pg_tde_change_key_provider [-D ] kmip []"); - puts(""); - puts("WARNING:"); - puts(""); - puts("This tool only changes the values, without properly XLogging the changes, or adjusting the configuration in the running postgres processes. Only use it in case the database is inaccessible and can't be started.\n"); -} - -#define BUFFER_SIZE 1024 - -static bool -build_json(char *buffer, int count,...) -{ - va_list args; - char *ptr; - - va_start(args, count); - - ptr = strcat(buffer, "{"); - - for (int i = 0; i < count; ++i) - { - /* TODO: no validation about the paramters at all... */ - /* not much we can do without a proper JSON library */ - /* If the JSON is incorrect, it will fail a bit later when */ - /* we try to backread it */ - const char *key = va_arg(args, const char *); - const char *value = va_arg(args, const char *); - - bool addQuotes = value == NULL || (value[0] != '{' && value[0] != '"'); - - if (i != 0) - { - ptr = strcat(ptr, ","); - } - - - ptr = strcat(ptr, "\""); - ptr = strcat(ptr, key); - ptr = strcat(ptr, "\":"); - - if (addQuotes) - { - ptr = strcat(ptr, "\""); - } - if (value != NULL) - { - ptr = strcat(ptr, value); - } - if (addQuotes) - { - ptr = strcat(ptr, "\""); - } - if (ptr - buffer > BUFFER_SIZE) - { - printf("Error: Configuration too long.\n"); - return false; - } - } - va_end(args); - - ptr = strcat(ptr, "}"); - - if (ptr - buffer > BUFFER_SIZE) - { - printf("Error: Configuration too long.\n"); - return false; - } - - return true; -} - -int -main(int argc, char *argv[]) -{ - char *provider_name; - char *new_provider_type; - char *datadir = getenv("PGDATA"); - - int argstart = 0; - - char json[BUFFER_SIZE * 2] = {0,}; - ControlFileData *controlfile; - bool crc_ok; - char tdedir[MAXPGPATH] = {0,}; - char *cptr = tdedir; - bool provider_found = false; - GenericKeyring *keyring = NULL; - KeyringProvideRecord provider; - - Oid db_oid; - - pg_logging_init(argv[0]); - pg_logging_set_level(PG_LOG_WARNING); - set_pglocale_pgservice(argv[0], PG_TEXTDOMAIN("pg_tde_change_key_provider")); - - if (argc > 1) - { - if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-?") == 0) - { - help(); - exit(0); - } - if (strcmp(argv[1], "--version") == 0 || strcmp(argv[1], "-V") == 0) - { - puts("pg_tde_change_key_provider (PostgreSQL) " PG_VERSION); - exit(0); - } - } - - if (argc > 3) - { - if (strcmp(argv[1], "-D") == 0) - { - datadir = argv[2]; - } - argstart += 2; - } - - - if (datadir == NULL || strlen(datadir) == 0) - { - help(); - puts("\n"); - printf("Error: Data directory missing.\n"); - exit(1); - } - - if (argc - argstart <= 3) - { - help(); - exit(1); - } - - db_oid = atoi(argv[1 + argstart]); - provider_name = argv[2 + argstart]; - new_provider_type = argv[3 + argstart]; - - if (strcmp("file", new_provider_type) == 0) - { - provider_found = true; - - if (argc - argstart != 5) - { - help(); - puts("\n"); - printf("Error: wrong number of arguments.\n"); - exit(1); - } - - if (!build_json(json, 2, "type", "file", "path", argv[4 + argstart])) - { - exit(1); - } - } - - if (strcmp("vault-v2", new_provider_type) == 0) - { - provider_found = true; - - if (argc - argstart != 7 && argc - argstart != 8) - { - help(); - puts("\n"); - printf("Error: wrong number of arguments.\n"); - exit(1); - } - - if (!build_json(json, 5, "type", "vault-v2", "url", argv[4 + argstart], "token", argv[5 + argstart], "mountPath", argv[6 + argstart], "caPath", (argc - argstart > 7 ? argv[7 + argstart] : ""))) - { - exit(1); - } - } - - if (strcmp("kmip", new_provider_type) == 0) - { - provider_found = true; - - if (argc - argstart != 7 && argc - argstart != 8) - { - help(); - puts("\n"); - printf("Error: wrong number of arguments.\n"); - exit(1); - } - - if (!build_json(json, 5, "type", "kmip", "host", argv[4 + argstart], "port", argv[5 + argstart], "caPath", (argc - argstart > 7 ? argv[7 + argstart] : ""), "certPath", argv[6 + argstart])) - { - exit(1); - } - } - - if (!provider_found) - { - help(); - puts("\n"); - printf("Error: Unknown provider type: %s\n.", new_provider_type); - exit(1); - } - - /* - * Check if cluster is running. This way we can be sure we have no - * concurrent modifcations of the key providers. Note that this doesn't - * guard against someone starting the cluster concurrently. - */ - controlfile = get_controlfile(datadir, &crc_ok); - if (!crc_ok) - pg_fatal("pg_control CRC value is incorrect"); - - if (controlfile->state != DB_SHUTDOWNED && - controlfile->state != DB_SHUTDOWNED_IN_RECOVERY) - pg_fatal("cluster must be shut down"); - - cptr = strcat(cptr, datadir); - cptr = strcat(cptr, "/"); - cptr = strcat(cptr, PG_TDE_DATA_DIR); - pg_tde_set_data_dir(tdedir); - - /* reports error if not found */ - keyring = GetKeyProviderByName(provider_name, db_oid); - - if (keyring == NULL) - { - printf("Error: provider not found\n."); - exit(1); - } - - strncpy(provider.options, json, sizeof(provider.options)); - strncpy(provider.provider_name, provider_name, sizeof(provider.provider_name)); - provider.provider_type = get_keyring_provider_from_typename(new_provider_type); - modify_key_provider_info(&provider, db_oid, false); - - printf("Key provider updated successfully!\n"); - - return 0; -} diff --git a/contrib/pg_tde/src/pg_tde_defs.c b/contrib/pg_tde/src/pg_tde_defs.c deleted file mode 100644 index 22d2602cbe56a..0000000000000 --- a/contrib/pg_tde/src/pg_tde_defs.c +++ /dev/null @@ -1,36 +0,0 @@ -/*------------------------------------------------------------------------- - * - * pg_tde_defs.c - * The configure script generates config.h which contains the package_* defs - * and these defines conflicts with the PG defines. - * This file is used to provide the package version string to the extension - * without including the config.h file. - * - * IDENTIFICATION - * contrib/pg_tde/src/pg_tde_defs.c - * - *------------------------------------------------------------------------- - */ - - -#include "config.h" -#include "pg_tde_defs.h" - - -/* Returns package version */ -const char * -pg_tde_package_string(void) -{ - return PACKAGE_STRING; -} - -const char * -pg_tde_package_name(void) -{ - return PACKAGE_NAME; -} -const char * -pg_tde_package_version(void) -{ - return PACKAGE_VERSION; -} diff --git a/contrib/pg_tde/src/pg_tde_event_capture.c b/contrib/pg_tde/src/pg_tde_event_capture.c index 9683d4a56ea97..3dcb787c7dd87 100644 --- a/contrib/pg_tde/src/pg_tde_event_capture.c +++ b/contrib/pg_tde/src/pg_tde_event_capture.c @@ -1,96 +1,232 @@ -/*------------------------------------------------------------------------- - * - * pg_tde_event_capture.c - * event trigger logic to identify if we are creating the encrypted table or not. - * - * IDENTIFICATION - * contrib/pg_tde/src/pg_tde_event_trigger.c - * - *------------------------------------------------------------------------- +/* + * event trigger logic to identify if we are creating the encrypted table or not. */ #include "postgres.h" -#include "funcapi.h" -#include "fmgr.h" -#include "utils/rel.h" -#include "utils/builtins.h" -#include "catalog/pg_class.h" -#include "commands/defrem.h" -#include "access/table.h" + +#include "access/heapam.h" #include "access/relation.h" -#include "catalog/pg_event_trigger.h" +#include "access/table.h" +#include "access/tableam.h" #include "catalog/namespace.h" +#include "catalog/pg_class.h" +#include "catalog/pg_database.h" +#include "catalog/pg_event_trigger.h" +#include "catalog/pg_inherits.h" +#include "commands/defrem.h" #include "commands/event_trigger.h" +#include "commands/sequence.h" +#include "fmgr.h" +#include "funcapi.h" +#include "miscadmin.h" +#include "storage/lmgr.h" +#include "tcop/utility.h" +#include "utils/builtins.h" +#include "utils/fmgroids.h" +#include "utils/lsyscache.h" +#include "utils/rel.h" +#include "utils/syscache.h" + +#include "access/pg_tde_tdemap.h" +#include "catalog/tde_global_space.h" +#include "catalog/tde_principal_key.h" #include "common/pg_tde_utils.h" #include "pg_tde_event_capture.h" #include "pg_tde_guc.h" -#include "catalog/tde_principal_key.h" -#include "miscadmin.h" -#include "access/tableam.h" -#include "catalog/tde_global_space.h" -#include "executor/spi.h" -/* Global variable that gets set at ddl start and cleard out at ddl end*/ -static TdeCreateEvent tdeCurrentCreateEvent = {.tid = {.value = 0},.relation = NULL}; -static bool alterSetAccessMethod = false; +typedef struct +{ + Node *parsetree; + TDEEncryptMode encryptMode; + Oid rebuildSequencesFor; + Oid rebuildSequence; +} TdeDdlEvent; + +static FullTransactionId ddlEventStackTid = {0}; +static List *ddlEventStack = NIL; -static void reset_current_tde_create_event(void); +static Oid get_db_oid(const char *name); static Oid get_tde_table_am_oid(void); PG_FUNCTION_INFO_V1(pg_tde_ddl_command_start_capture); PG_FUNCTION_INFO_V1(pg_tde_ddl_command_end_capture); -TdeCreateEvent * -GetCurrentTdeCreateEvent(void) +static TDEEncryptMode +currentTdeEncryptMode(void) +{ + if (ddlEventStack == NIL) + return TDE_ENCRYPT_MODE_RETAIN; + else + return ((TdeDdlEvent *) llast(ddlEventStack))->encryptMode; +} + +/* + * Make sure that even if a statement failed, and an event trigger end + * trigger didn't fire, we don't accidentaly create encrypted files when + * we don't have to. + */ +TDEEncryptMode +currentTdeEncryptModeValidated(void) +{ + if (!FullTransactionIdEquals(ddlEventStackTid, GetCurrentFullTransactionIdIfAny())) + return TDE_ENCRYPT_MODE_RETAIN; + + return currentTdeEncryptMode(); +} + +static bool +shouldEncryptTable(const char *accessMethod) +{ + if (accessMethod) + return strcmp(accessMethod, "tde_heap") == 0; + else + return strcmp(default_table_access_method, "tde_heap") == 0; +} + +static void +checkPrincipalKeyConfigured(void) { - return &tdeCurrentCreateEvent; + if (!pg_tde_principal_key_configured(MyDatabaseId)) + ereport(ERROR, + errmsg("principal key not configured"), + errhint("Use pg_tde_set_key_using_database_key_provider() or pg_tde_set_key_using_global_key_provider() to configure one.")); } static void -checkEncryptionClause(const char *accessMethod) +checkEncryptionStatus(void) { - if (accessMethod && strcmp(accessMethod, "tde_heap") == 0) + if (currentTdeEncryptMode() == TDE_ENCRYPT_MODE_ENCRYPT) { - tdeCurrentCreateEvent.encryptMode = true; + checkPrincipalKeyConfigured(); } - else if ((accessMethod == NULL || accessMethod[0] == 0) && strcmp(default_table_access_method, "tde_heap") == 0) + else if (EnforceEncryption) { - tdeCurrentCreateEvent.encryptMode = true; + ereport(ERROR, + errmsg("pg_tde.enforce_encryption is ON, only the tde_heap access method is allowed.")); } +} + +static void +verify_event_stack(void) +{ + FullTransactionId tid = GetCurrentFullTransactionId(); - if (tdeCurrentCreateEvent.encryptMode) + if (!FullTransactionIdEquals(ddlEventStackTid, tid)) { - if (!pg_tde_principal_key_configured(MyDatabaseId)) - { - ereport(ERROR, - (errmsg("principal key not configured"), - errhint("create one using pg_tde_set_principal_key before using encrypted tables"))); + ListCell *lc; - } - } + foreach(lc, ddlEventStack) + pfree(lfirst(lc)); - if (EnforceEncryption && !tdeCurrentCreateEvent.encryptMode) - { - ereport(ERROR, - (errmsg("pg_tde.enforce_encryption is ON, only the tde_heap access method is allowed."))); + ddlEventStack = NIL; + ddlEventStackTid = tid; } } -void -validateCurrentEventTriggerState(bool mightStartTransaction) +static void +push_event_stack(const TdeDdlEvent *event) { - FullTransactionId tid = mightStartTransaction ? GetCurrentFullTransactionId() : GetCurrentFullTransactionIdIfAny(); + MemoryContext oldCtx; + TdeDdlEvent *e; - if (RecoveryInProgress()) + verify_event_stack(); + + oldCtx = MemoryContextSwitchTo(TopMemoryContext); + e = palloc_object(TdeDdlEvent); + *e = *event; + ddlEventStack = lappend(ddlEventStack, e); + MemoryContextSwitchTo(oldCtx); +} + +static List * +find_typed_table_dependencies(Oid typeOid) +{ + Relation classRel; + ScanKeyData key[1]; + TableScanDesc scan; + HeapTuple tuple; + List *result = NIL; + + classRel = table_open(RelationRelationId, AccessShareLock); + + ScanKeyInit(&key[0], + Anum_pg_class_reloftype, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(typeOid)); + + scan = table_beginscan_catalog(classRel, 1, key); + + while ((tuple = heap_getnext(scan, ForwardScanDirection)) != NULL) { - reset_current_tde_create_event(); - return; + Form_pg_class classform = (Form_pg_class) GETSTRUCT(tuple); + + LockRelationOid(classform->oid, AccessShareLock); + result = lappend_oid(result, classform->oid); } - if (tdeCurrentCreateEvent.tid.value != InvalidFullTransactionId.value && tid.value != tdeCurrentCreateEvent.tid.value) + + table_endscan(scan); + table_close(classRel, AccessShareLock); + + return result; +} + +typedef enum +{ + ENC_MIX_UNKNOWN, + ENC_MIX_PLAIN, + ENC_MIX_ENCRYPTED, + ENC_MIX_MIXED, +} EncryptionMix; + +/* + * Since ALTER TABLE can modify multiple tables due to inheritance or typed + * tables which can for example result in TOAST tables being created for some + * or all of the modified tables while the event trigger is only fired once we + * cannot rely on the event stack to make sure we get the correct encryption + * status. + * + * Our solution is to be cautious and only modify tables when all tables with + * storage are either encrypted or not encrypted. If there is a mix we will + * throw and error. The result of this is also used to properly inform the + * SMGR of the current encryption status. + */ +static EncryptionMix +alter_table_encryption_mix(Oid relid) +{ + EncryptionMix enc = ENC_MIX_UNKNOWN; + Relation rel; + List *children; + ListCell *lc; + + rel = relation_open(relid, NoLock); + + if (RELKIND_HAS_STORAGE(rel->rd_rel->relkind)) + enc = rel->rd_rel->relam == get_tde_table_am_oid() ? ENC_MIX_ENCRYPTED : ENC_MIX_PLAIN; + + if (rel->rd_rel->relkind == RELKIND_COMPOSITE_TYPE) + children = find_typed_table_dependencies(rel->rd_rel->reltype); + else + children = find_inheritance_children(relid, AccessShareLock); + + relation_close(rel, NoLock); + + foreach(lc, children) { - /* There was a failed query, end event trigger didn't execute */ - reset_current_tde_create_event(); + Oid childid = lfirst_oid(lc); + EncryptionMix childenc; + + childenc = alter_table_encryption_mix(childid); + + if (childenc != ENC_MIX_UNKNOWN) + { + if (enc == ENC_MIX_UNKNOWN) + enc = childenc; + else if (enc != childenc) + return ENC_MIX_MIXED; + } } + + return enc; } /* @@ -114,142 +250,280 @@ pg_tde_ddl_command_start_capture(PG_FUNCTION_ARGS) /* Ensure this function is being called as an event trigger */ if (!CALLED_AS_EVENT_TRIGGER(fcinfo)) /* internal error */ ereport(ERROR, - (errmsg("Function can only be fired by event trigger manager"))); + errmsg("Function can only be fired by event trigger manager")); - trigdata = (EventTriggerData *) fcinfo->context; + trigdata = castNode(EventTriggerData, fcinfo->context); parsetree = trigdata->parsetree; if (IsA(parsetree, IndexStmt)) { - IndexStmt *stmt = (IndexStmt *) parsetree; - Oid relationId = RangeVarGetRelid(stmt->relation, NoLock, true); - - validateCurrentEventTriggerState(true); - tdeCurrentCreateEvent.tid = GetCurrentFullTransactionId(); + IndexStmt *stmt = castNode(IndexStmt, parsetree); + TdeDdlEvent event = {.parsetree = parsetree}; + EncryptionMix encmix; + Oid relid = RangeVarGetRelid(stmt->relation, AccessShareLock, false); + + encmix = alter_table_encryption_mix(relid); + + if (encmix == ENC_MIX_ENCRYPTED) + event.encryptMode = TDE_ENCRYPT_MODE_ENCRYPT; + else if (encmix == ENC_MIX_PLAIN) + event.encryptMode = TDE_ENCRYPT_MODE_PLAIN; + else if (encmix == ENC_MIX_UNKNOWN) + event.encryptMode = TDE_ENCRYPT_MODE_RETAIN; + else + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("Recursive CREATE INDEX on a mix of encrypted and unencrypted relations is not supported")); - tdeCurrentCreateEvent.baseTableOid = relationId; - tdeCurrentCreateEvent.relation = stmt->relation; + push_event_stack(&event); + } + else if (IsA(parsetree, CreateStmt)) + { + CreateStmt *stmt = castNode(CreateStmt, parsetree); + bool foundAccessMethod = false; + TdeDdlEvent event = {.parsetree = parsetree}; - if (relationId != InvalidOid) + if (stmt->accessMethod) + { + foundAccessMethod = true; + if (strcmp(stmt->accessMethod, "tde_heap") == 0) + event.encryptMode = TDE_ENCRYPT_MODE_ENCRYPT; + else + event.encryptMode = TDE_ENCRYPT_MODE_PLAIN; + } + else if (stmt->partbound) { - LOCKMODE lockmode = AccessShareLock; /* TODO. Verify lock mode? */ - Relation rel = table_open(relationId, lockmode); + /* + * If no access method is specified, and this is a partition of a + * parent table, access method can be inherited from the parent + * table if it has one set. + * + * AccessExclusiveLock might seem excessive, but it's what + * DefineRelation() will take on any partitioned parent relation + * in this transaction anyway. + */ + Oid parentOid; + Oid parentAmOid; - if (rel->rd_rel->relam == get_tde_table_am_oid()) - { - /* We are creating the index on encrypted table */ - /* set the global state */ - tdeCurrentCreateEvent.encryptMode = true; - } - table_close(rel, lockmode); + Assert(list_length(stmt->inhRelations) == 1); - if (tdeCurrentCreateEvent.encryptMode) + parentOid = RangeVarGetRelid(linitial(stmt->inhRelations), + AccessExclusiveLock, + false); + parentAmOid = get_rel_relam(parentOid); + foundAccessMethod = parentAmOid != InvalidOid; + + if (foundAccessMethod) { - checkEncryptionClause(""); + if (parentAmOid == get_tde_table_am_oid()) + event.encryptMode = TDE_ENCRYPT_MODE_ENCRYPT; + else + event.encryptMode = TDE_ENCRYPT_MODE_PLAIN; } } - else - ereport(DEBUG1, (errmsg("Failed to get relation Oid for relation:%s", stmt->relation->relname))); - - } - else if (IsA(parsetree, CreateStmt)) - { - CreateStmt *stmt = (CreateStmt *) parsetree; - const char *accessMethod = stmt->accessMethod; - - validateCurrentEventTriggerState(true); - tdeCurrentCreateEvent.tid = GetCurrentFullTransactionId(); - - tdeCurrentCreateEvent.relation = stmt->relation; + if (!foundAccessMethod) + { + if (strcmp(default_table_access_method, "tde_heap") == 0) + event.encryptMode = TDE_ENCRYPT_MODE_ENCRYPT; + else + event.encryptMode = TDE_ENCRYPT_MODE_PLAIN; + } - checkEncryptionClause(accessMethod); + push_event_stack(&event); + checkEncryptionStatus(); } else if (IsA(parsetree, CreateTableAsStmt)) { - CreateTableAsStmt *stmt = (CreateTableAsStmt *) parsetree; - const char *accessMethod = stmt->into->accessMethod; + CreateTableAsStmt *stmt = castNode(CreateTableAsStmt, parsetree); + TdeDdlEvent event = {.parsetree = parsetree}; - validateCurrentEventTriggerState(true); - tdeCurrentCreateEvent.tid = GetCurrentFullTransactionId(); - - tdeCurrentCreateEvent.relation = stmt->into->rel; + if (shouldEncryptTable(stmt->into->accessMethod)) + event.encryptMode = TDE_ENCRYPT_MODE_ENCRYPT; + else + event.encryptMode = TDE_ENCRYPT_MODE_PLAIN; - checkEncryptionClause(accessMethod); + push_event_stack(&event); + checkEncryptionStatus(); } else if (IsA(parsetree, AlterTableStmt)) { - AlterTableStmt *stmt = (AlterTableStmt *) parsetree; - ListCell *lcmd; - Oid relationId = RangeVarGetRelid(stmt->relation, NoLock, true); + AlterTableStmt *stmt = castNode(AlterTableStmt, parsetree); + Oid relid = RangeVarGetRelid(stmt->relation, AccessShareLock, true); - validateCurrentEventTriggerState(true); - tdeCurrentCreateEvent.tid = GetCurrentFullTransactionId(); - - foreach(lcmd, stmt->cmds) + if (relid != InvalidOid) { - AlterTableCmd *cmd = (AlterTableCmd *) lfirst(lcmd); + AlterTableCmd *setAccessMethod = NULL; + ListCell *lcmd; + TdeDdlEvent event = {.parsetree = parsetree}; + EncryptionMix encmix; + Relation rel; - if (cmd->subtype == AT_SetAccessMethod) + foreach(lcmd, stmt->cmds) { - const char *accessMethod = cmd->name; + AlterTableCmd *cmd = lfirst_node(AlterTableCmd, lcmd); + + if (cmd->subtype == AT_SetAccessMethod) + setAccessMethod = cmd; + } - tdeCurrentCreateEvent.relation = stmt->relation; - tdeCurrentCreateEvent.baseTableOid = relationId; - tdeCurrentCreateEvent.alterAccessMethodMode = true; + encmix = alter_table_encryption_mix(relid); - checkEncryptionClause(accessMethod); - alterSetAccessMethod = true; + /* + * This check is very braod and could be limited only to commands + * which recurse to child tables or to those which may create new + * relfilenodes, but this restrictive code is good enough for now. + */ + if (encmix == ENC_MIX_MIXED) + { + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("Recursive ALTER TABLE on a mix of encrypted and unencrypted relations is not supported")); } - } - if (!alterSetAccessMethod) - { + rel = relation_open(relid, NoLock); + /* * With a SET ACCESS METHOD clause, use that as the basis for * decisions. But if it's not present, look up encryption status * of the table. + * + * Since partitioned tables lack storage we do not need to set the + * encryption mode. */ - - tdeCurrentCreateEvent.baseTableOid = relationId; - tdeCurrentCreateEvent.relation = stmt->relation; - - if (relationId != InvalidOid) + if (setAccessMethod && RELKIND_HAS_STORAGE(rel->rd_rel->relkind)) { - LOCKMODE lockmode = AccessShareLock; - Relation rel = relation_open(relationId, lockmode); + event.rebuildSequencesFor = relid; - if (rel->rd_rel->relam == get_tde_table_am_oid()) + if (shouldEncryptTable(setAccessMethod->name)) { - /* - * We are altering an encrypted table ALTER TABLE can - * create possibly new files set the global state - */ - tdeCurrentCreateEvent.encryptMode = true; + event.encryptMode = TDE_ENCRYPT_MODE_ENCRYPT; + checkPrincipalKeyConfigured(); } - relation_close(rel, lockmode); - - if (tdeCurrentCreateEvent.encryptMode) + else + event.encryptMode = TDE_ENCRYPT_MODE_PLAIN; + } + else + { + if (encmix == ENC_MIX_ENCRYPTED) { - checkEncryptionClause(""); + event.encryptMode = TDE_ENCRYPT_MODE_ENCRYPT; + checkPrincipalKeyConfigured(); } + else if (encmix == ENC_MIX_PLAIN) + event.encryptMode = TDE_ENCRYPT_MODE_PLAIN; } + + relation_close(rel, NoLock); + + push_event_stack(&event); + checkEncryptionStatus(); } } - else + else if (IsA(parsetree, CreateSeqStmt)) { - if (!tdeCurrentCreateEvent.alterAccessMethodMode) + CreateSeqStmt *stmt = (CreateSeqStmt *) parsetree; + ListCell *option; + List *owned_by = NIL; + TdeDdlEvent event = {.parsetree = parsetree}; + + foreach(option, stmt->options) { - /* - * Any other type of statement doesn't need TDE mode, except - * during alter access method. To make sure that we have no - * leftover setting from a previous error or something, we just - * reset the status here. - */ - reset_current_tde_create_event(); + DefElem *defel = lfirst_node(DefElem, option); + + if (strcmp(defel->defname, "owned_by") == 0) + { + owned_by = defGetQualifiedName(defel); + break; + } + } + + if (list_length(owned_by) > 1) + { + List *relname; + RangeVar *rel; + Relation tablerel; + + relname = list_copy_head(owned_by, list_length(owned_by) - 1); + + /* Open and lock rel to ensure it won't go away meanwhile */ + rel = makeRangeVarFromNameList(relname); + tablerel = relation_openrv(rel, AccessShareLock); + + if (tablerel->rd_rel->relam == get_tde_table_am_oid()) + { + event.encryptMode = TDE_ENCRYPT_MODE_ENCRYPT; + checkPrincipalKeyConfigured(); + } + else + event.encryptMode = TDE_ENCRYPT_MODE_PLAIN; + + /* Hold lock until end of transaction */ + relation_close(tablerel, NoLock); + } + else + event.encryptMode = TDE_ENCRYPT_MODE_PLAIN; + + push_event_stack(&event); + } + else if (IsA(parsetree, AlterSeqStmt)) + { + AlterSeqStmt *stmt = (AlterSeqStmt *) parsetree; + ListCell *option; + List *owned_by = NIL; + TdeDdlEvent event = {.parsetree = parsetree}; + Oid relid = RangeVarGetRelid(stmt->sequence, AccessShareLock, true); + + if (relid != InvalidOid) + { + foreach(option, stmt->options) + { + DefElem *defel = lfirst_node(DefElem, option); + + if (strcmp(defel->defname, "owned_by") == 0) + { + owned_by = defGetQualifiedName(defel); + break; + } + } + + if (list_length(owned_by) > 1) + { + List *relname; + RangeVar *rel; + Relation tablerel; + + event.rebuildSequence = relid; + + relname = list_copy_head(owned_by, list_length(owned_by) - 1); + + /* Open and lock rel to ensure it won't go away meanwhile */ + rel = makeRangeVarFromNameList(relname); + tablerel = relation_openrv(rel, AccessShareLock); + + if (tablerel->rd_rel->relam == get_tde_table_am_oid()) + { + event.encryptMode = TDE_ENCRYPT_MODE_ENCRYPT; + checkPrincipalKeyConfigured(); + } + else + event.encryptMode = TDE_ENCRYPT_MODE_PLAIN; + + /* Hold lock until end of transaction */ + relation_close(tablerel, NoLock); + } + else if (list_length(owned_by) == 1) + { + event.rebuildSequence = relid; + + event.encryptMode = TDE_ENCRYPT_MODE_PLAIN; + } + + push_event_stack(&event); } } - PG_RETURN_NULL(); + + PG_RETURN_VOID(); } /* @@ -261,76 +535,226 @@ pg_tde_ddl_command_end_capture(PG_FUNCTION_ARGS) { EventTriggerData *trigdata; Node *parsetree; - - trigdata = (EventTriggerData *) fcinfo->context; - parsetree = trigdata->parsetree; + TdeDdlEvent *event; /* Ensure this function is being called as an event trigger */ if (!CALLED_AS_EVENT_TRIGGER(fcinfo)) /* internal error */ ereport(ERROR, - (errmsg("Function can only be fired by event trigger manager"))); + errmsg("Function can only be fired by event trigger manager")); + + trigdata = castNode(EventTriggerData, fcinfo->context); + parsetree = trigdata->parsetree; - if (IsA(parsetree, AlterTableStmt) && tdeCurrentCreateEvent.alterAccessMethodMode) + if (ddlEventStack == NIL || ((TdeDdlEvent *) llast(ddlEventStack))->parsetree != parsetree) + PG_RETURN_VOID(); + + event = (TdeDdlEvent *) llast(ddlEventStack); + + if (event->rebuildSequencesFor != InvalidOid) { /* - * sequences are not updated automatically call a helper function that - * automatically alters all of them, forcing an update on the - * encryption status int ret; + * sequences are not updated automatically so force rewrite by + * updating their persistence to be the same as before. */ - char *sql = "SELECT pg_tde_internal_refresh_sequences($1);"; - Oid argtypes[1]; - SPIPlanPtr plan; - Datum args[1]; - char nulls[1]; - int ret; + List *seqlist = getOwnedSequences(event->rebuildSequencesFor); + ListCell *lc; + Relation rel = relation_open(event->rebuildSequencesFor, NoLock); + char persistence = rel->rd_rel->relpersistence; - SPI_connect(); + relation_close(rel, NoLock); - argtypes[0] = OIDOID; - plan = SPI_prepare(sql, 1, argtypes); - - args[0] = ObjectIdGetDatum(tdeCurrentCreateEvent.baseTableOid); - nulls[0] = ' '; + foreach(lc, seqlist) + { + Oid seq_relid = lfirst_oid(lc); - ret = SPI_execute_plan(plan, args, nulls, false, 0); + SequenceChangePersistence(seq_relid, persistence); + } + } - tdeCurrentCreateEvent.alterAccessMethodMode = false; + if (event->rebuildSequence != InvalidOid) + { + /* + * Seqeunces are not rewritten when just changing owner so force a + * rewrite. There is a small risk of extra overhead if someone changes + * sequence owner and something else at the same time. + */ + Relation rel = relation_open(event->rebuildSequence, NoLock); + char persistence = rel->rd_rel->relpersistence; - SPI_finish(); + relation_close(rel, NoLock); - if (ret != SPI_OK_SELECT) - { - elog(ERROR, "Failed to update encryption status of sequences."); - } + SequenceChangePersistence(event->rebuildSequence, persistence); } - /* - * All we need to do is to clear the event state. Except when we are in - * alter access method mode, because during that, we have multiple nested - * event trigger running. Reset should only be called in the end, when it - * is set to false. - */ - if (!tdeCurrentCreateEvent.alterAccessMethodMode) + ddlEventStack = list_delete_last(ddlEventStack); + pfree(event); + + PG_RETURN_VOID(); +} + +static Oid +get_tde_table_am_oid(void) +{ + return get_table_am_oid("tde_heap", false); +} + +static ProcessUtility_hook_type next_ProcessUtility_hook = NULL; + +/* + * Handles utility commands which we cannot handle in the event trigger. + */ +static void +pg_tde_proccess_utility(PlannedStmt *pstmt, + const char *queryString, + bool readOnlyTree, + ProcessUtilityContext context, + ParamListInfo params, + QueryEnvironment *queryEnv, + DestReceiver *dest, + QueryCompletion *qc) +{ + Node *parsetree = pstmt->utilityStmt; + + switch (nodeTag(parsetree)) { - reset_current_tde_create_event(); + case T_CreatedbStmt: + { + CreatedbStmt *stmt = castNode(CreatedbStmt, parsetree); + ListCell *option; + char *dbtemplate = "template1"; + char *strategy = "wal_log"; + + foreach(option, stmt->options) + { + DefElem *defel = lfirst_node(DefElem, option); + + if (strcmp(defel->defname, "template") == 0) + dbtemplate = defGetString(defel); + else if (strcmp(defel->defname, "strategy") == 0) + strategy = defGetString(defel); + } + + if (pg_strcasecmp(strategy, "file_copy") == 0) + { + Oid dbOid = get_db_oid(dbtemplate); + + if (dbOid != InvalidOid) + { + int count; + + LWLockAcquire(tde_lwlock_enc_keys(), LW_SHARED); + count = pg_tde_count_encryption_keys(dbOid); + LWLockRelease(tde_lwlock_enc_keys()); + + if (count > 0) + ereport(ERROR, + errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("The FILE_COPY strategy cannot be used when there are encrypted objects in the template database: %d objects found", count), + errhint("Use the WAL_LOG strategy instead.")); + } + } + } + break; + default: + break; } - PG_RETURN_NULL(); + if (next_ProcessUtility_hook) + (*next_ProcessUtility_hook) (pstmt, queryString, readOnlyTree, + context, params, queryEnv, + dest, qc); + else + standard_ProcessUtility(pstmt, queryString, readOnlyTree, + context, params, queryEnv, + dest, qc); } -static void -reset_current_tde_create_event(void) +void +TdeEventCaptureInit(void) { - tdeCurrentCreateEvent.encryptMode = false; - tdeCurrentCreateEvent.baseTableOid = InvalidOid; - tdeCurrentCreateEvent.relation = NULL; - tdeCurrentCreateEvent.tid = InvalidFullTransactionId; - alterSetAccessMethod = false; - tdeCurrentCreateEvent.alterAccessMethodMode = false; + next_ProcessUtility_hook = ProcessUtility_hook; + ProcessUtility_hook = pg_tde_proccess_utility; } +/* + * A stripped down version of get_db_info() from src/backend/commands/dbcommands.c + */ static Oid -get_tde_table_am_oid(void) +get_db_oid(const char *name) { - return get_table_am_oid("tde_heap", false); + Oid resDbOid = InvalidOid; + Relation relation; + + Assert(name); + + relation = table_open(DatabaseRelationId, AccessShareLock); + + /* + * Loop covers the rare case where the database is renamed before we can + * lock it. We try again just in case we can find a new one of the same + * name. + */ + for (;;) + { + ScanKeyData scanKey; + SysScanDesc scan; + HeapTuple tuple; + Oid dbOid; + + /* + * there's no syscache for database-indexed-by-name, so must do it the + * hard way + */ + ScanKeyInit(&scanKey, + Anum_pg_database_datname, + BTEqualStrategyNumber, F_NAMEEQ, + CStringGetDatum(name)); + + scan = systable_beginscan(relation, DatabaseNameIndexId, true, + NULL, 1, &scanKey); + + tuple = systable_getnext(scan); + + if (!HeapTupleIsValid(tuple)) + { + /* definitely no database of that name */ + systable_endscan(scan); + break; + } + + dbOid = ((Form_pg_database) GETSTRUCT(tuple))->oid; + + systable_endscan(scan); + + /* + * Now that we have a database OID, we can try to lock the DB. + */ + LockSharedObject(DatabaseRelationId, dbOid, 0, AccessExclusiveLock); + + /* + * And now, re-fetch the tuple by OID. If it's still there and still + * the same name, we win; else, drop the lock and loop back to try + * again. + */ + tuple = SearchSysCache1(DATABASEOID, ObjectIdGetDatum(dbOid)); + if (HeapTupleIsValid(tuple)) + { + Form_pg_database dbform = (Form_pg_database) GETSTRUCT(tuple); + + if (strcmp(name, NameStr(dbform->datname)) == 0) + { + resDbOid = dbOid; + ReleaseSysCache(tuple); + break; + } + /* can only get here if it was just renamed */ + ReleaseSysCache(tuple); + } + + UnlockSharedObject(DatabaseRelationId, dbOid, 0, AccessExclusiveLock); + } + + table_close(relation, AccessShareLock); + + return resDbOid; } diff --git a/contrib/pg_tde/src/pg_tde_guc.c b/contrib/pg_tde/src/pg_tde_guc.c index 5e11c3d21e9a6..912385cc0df75 100644 --- a/contrib/pg_tde/src/pg_tde_guc.c +++ b/contrib/pg_tde/src/pg_tde_guc.c @@ -1,20 +1,12 @@ -/*------------------------------------------------------------------------- - * - * pg_tde_guc.c - * GUC variables for pg_tde - * - * - * IDENTIFICATION - * src/pg_tde_guc.c - * - *------------------------------------------------------------------------- +/* + * GUC variables for pg_tde */ -#include "pg_tde_guc.h" #include "postgres.h" + #include "utils/guc.h" -#ifndef FRONTEND +#include "pg_tde_guc.h" bool AllowInheritGlobalProviders = true; bool EncryptXLog = false; @@ -60,5 +52,3 @@ TdeGucInit(void) ); } - -#endif diff --git a/contrib/pg_tde/src/smgr/pg_tde_smgr.c b/contrib/pg_tde/src/smgr/pg_tde_smgr.c index 2a140c2fd0df2..1f55a57b6e937 100644 --- a/contrib/pg_tde/src/smgr/pg_tde_smgr.c +++ b/contrib/pg_tde/src/smgr/pg_tde_smgr.c @@ -1,14 +1,39 @@ - -#include "smgr/pg_tde_smgr.h" #include "postgres.h" -#include "storage/smgr.h" -#include "storage/md.h" + +#include "access/xloginsert.h" #include "catalog/catalog.h" -#include "encryption/enc_aes.h" +#include "storage/md.h" +#include "storage/smgr.h" +#include "utils/hsearch.h" + #include "access/pg_tde_tdemap.h" +#include "access/pg_tde_xlog.h" +#include "encryption/enc_aes.h" +#include "encryption/enc_tde.h" #include "pg_tde_event_capture.h" +#include "smgr/pg_tde_smgr.h" -typedef struct TDESMgrRelationData +typedef enum TDEMgrRelationEncryptionStatus +{ + /* This is a plaintext relation */ + RELATION_NOT_ENCRYPTED = 0, + + /* This is an encrypted relation, and we have the key available. */ + RELATION_KEY_AVAILABLE = 1, + + /* This is an encrypted relation, but we haven't loaded the key yet. */ + RELATION_KEY_NOT_AVAILABLE = 2, +} TDEMgrRelationEncryptionStatus; + +/* + * TDESMgrRelation is an extended copy of MDSMgrRelationData in md.c + * + * The first fields of this struct must always exactly match + * MDSMgrRelationData since we will pass this structure to the md.c functions. + * + * Any fields specific to the tde smgr must be placed after these fields. + */ +typedef struct TDESMgrRelation { /* parent data */ SMgrRelationData reln; @@ -20,90 +45,196 @@ typedef struct TDESMgrRelationData int md_num_open_segs[MAX_FORKNUM + 1]; struct _MdfdVec *md_seg_fds[MAX_FORKNUM + 1]; - bool encrypted_relation; + TDEMgrRelationEncryptionStatus encryption_status; InternalKey relKey; -} TDESMgrRelationData; +} TDESMgrRelation; + +typedef struct +{ + RelFileLocator rel; + InternalKey key; +} TempRelKeyEntry; + +#define INIT_TEMP_RELS 16 + +/* + * Each backend has a hashtable that stores the keys for all temproary tables. + */ +static HTAB *TempRelKeys = NULL; + +static SMgrId OurSMgrId = MaxSMgrId; -typedef TDESMgrRelationData *TDESMgrRelation; +static void tde_smgr_save_temp_key(const RelFileLocator *newrlocator, const InternalKey *key); +static InternalKey *tde_smgr_get_temp_key(const RelFileLocator *rel); +static bool tde_smgr_has_temp_key(const RelFileLocator *rel); +static void tde_smgr_delete_temp_key(const RelFileLocator *rel); +static void CalcBlockIv(ForkNumber forknum, BlockNumber bn, const unsigned char *base_iv, unsigned char *iv); + +static void +tde_smgr_log_create_key(const RelFileLocator *rlocator) +{ + XLogRelKey xlrec = {.rlocator = *rlocator}; + + XLogBeginInsert(); + XLogRegisterData((char *) &xlrec, sizeof(xlrec)); + XLogInsert(RM_TDERMGR_ID, XLOG_TDE_CREATE_RELATION_KEY); +} + +static void +tde_smgr_log_delete_leftover_key(const RelFileLocator *rlocator) +{ + XLogRelKey xlrec = {.rlocator = *rlocator}; + + XLogBeginInsert(); + XLogRegisterData((char *) &xlrec, sizeof(xlrec)); + XLogInsert(RM_TDERMGR_ID, XLOG_TDE_DELETE_RELATION_KEY); +} static InternalKey * -tde_smgr_get_key(SMgrRelation reln, RelFileLocator *old_locator, bool can_create) +tde_smgr_create_key(const RelFileLocatorBackend *smgr_rlocator) { - TdeCreateEvent *event; - InternalKey *key; + InternalKey *key = palloc_object(InternalKey); - if (IsCatalogRelationOid(reln->smgr_rlocator.locator.relNumber)) - { - /* do not try to encrypt/decrypt catalog tables */ - return NULL; - } + pg_tde_generate_internal_key(key); - /* see if we have a key for the relation, and return if yes */ - key = GetSMGRRelationKey(reln->smgr_rlocator); - if (key != NULL) + if (RelFileLocatorBackendIsTemp(*smgr_rlocator)) + tde_smgr_save_temp_key(&smgr_rlocator->locator, key); + else { - return key; + pg_tde_save_smgr_key(smgr_rlocator->locator, key); + tde_smgr_log_create_key(&smgr_rlocator->locator); } - event = GetCurrentTdeCreateEvent(); + return key; +} - /* - * Can be many things, such as: CREATE TABLE ALTER TABLE SET ACCESS METHOD - * ALTER TABLE something else on an encrypted table CREATE INDEX ... - * - * Every file has its own key, that makes logistics easier. - */ - if (event->encryptMode == true && can_create) +void +tde_smgr_create_key_redo(const RelFileLocator *rlocator) +{ + InternalKey key; + + pg_tde_generate_internal_key(&key); + + pg_tde_save_smgr_key(*rlocator, &key); +} + +static void +tde_smgr_delete_key(const RelFileLocatorBackend *smgr_rlocator) +{ + if (RelFileLocatorBackendIsTemp(*smgr_rlocator)) + tde_smgr_delete_temp_key(&smgr_rlocator->locator); + else + pg_tde_free_key_map_entry(smgr_rlocator->locator); +} + +static void +tde_smgr_delete_leftover_key(const RelFileLocatorBackend *smgr_rlocator) +{ + if (!RelFileLocatorBackendIsTemp(*smgr_rlocator)) { - return pg_tde_create_smgr_key(&reln->smgr_rlocator); + pg_tde_free_key_map_entry(smgr_rlocator->locator); + tde_smgr_log_delete_leftover_key(&smgr_rlocator->locator); } +} - /* check if we had a key for the old locator, if there's one */ - if (old_locator != NULL && can_create) +void +tde_smgr_delete_leftover_key_redo(const RelFileLocator *rlocator) +{ + pg_tde_free_key_map_entry(*rlocator); +} + +static bool +tde_smgr_is_encrypted(const RelFileLocatorBackend *smgr_rlocator) +{ + if (RelFileLocatorBackendIsTemp(*smgr_rlocator)) + return tde_smgr_has_temp_key(&smgr_rlocator->locator); + else + return pg_tde_has_smgr_key(smgr_rlocator->locator); +} + +static InternalKey * +tde_smgr_get_key(const RelFileLocatorBackend *smgr_rlocator) +{ + if (RelFileLocatorBackendIsTemp(*smgr_rlocator)) + return tde_smgr_get_temp_key(&smgr_rlocator->locator); + else + return pg_tde_get_smgr_key(smgr_rlocator->locator); +} + +static bool +tde_smgr_should_encrypt(const RelFileLocatorBackend *smgr_rlocator, RelFileLocator *old_locator) +{ + /* Do not try to encrypt/decrypt catalog tables */ + if (IsCatalogRelationOid(smgr_rlocator->locator.relNumber)) + return false; + + switch (currentTdeEncryptModeValidated()) { - RelFileLocatorBackend rlocator = {.locator = *old_locator,.backend = reln->smgr_rlocator.backend}; - InternalKey *oldkey = GetSMGRRelationKey(rlocator); + case TDE_ENCRYPT_MODE_PLAIN: + return false; + case TDE_ENCRYPT_MODE_ENCRYPT: + return true; + case TDE_ENCRYPT_MODE_RETAIN: + if (old_locator) + { + RelFileLocatorBackend old_smgr_locator = { + .locator = *old_locator, + .backend = smgr_rlocator->backend, + }; - if (oldkey != NULL) - { - /* create a new key for the new file */ - return pg_tde_create_smgr_key(&reln->smgr_rlocator); - } + return tde_smgr_is_encrypted(&old_smgr_locator); + } } - return NULL; + return false; +} + +bool +tde_smgr_rel_is_encrypted(SMgrRelation reln) +{ + TDESMgrRelation *tdereln = (TDESMgrRelation *) reln; + + if (reln->smgr_which != OurSMgrId) + return false; + + return tdereln->encryption_status == RELATION_KEY_AVAILABLE || + tdereln->encryption_status == RELATION_KEY_NOT_AVAILABLE; } static void tde_mdwritev(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, const void **buffers, BlockNumber nblocks, bool skipFsync) { - TDESMgrRelation tdereln = (TDESMgrRelation) reln; - InternalKey *int_key = &tdereln->relKey; + TDESMgrRelation *tdereln = (TDESMgrRelation *) reln; - if (!tdereln->encrypted_relation) + if (tdereln->encryption_status == RELATION_NOT_ENCRYPTED) { mdwritev(reln, forknum, blocknum, buffers, nblocks, skipFsync); } else { - unsigned char *local_blocks = palloc(BLCKSZ * (nblocks + 1)); - unsigned char *local_blocks_aligned = (unsigned char *) TYPEALIGN(PG_IO_ALIGN_SIZE, local_blocks); + unsigned char *local_blocks = palloc_aligned(BLCKSZ * nblocks, PG_IO_ALIGN_SIZE, 0); void **local_buffers = palloc_array(void *, nblocks); - AesInit(); + if (tdereln->encryption_status == RELATION_KEY_NOT_AVAILABLE) + { + InternalKey *int_key = tde_smgr_get_key(&reln->smgr_rlocator); + + tdereln->relKey = *int_key; + tdereln->encryption_status = RELATION_KEY_AVAILABLE; + pfree(int_key); + } for (int i = 0; i < nblocks; ++i) { BlockNumber bn = blocknum + i; - unsigned char iv[16] = {0,}; + unsigned char iv[16]; - local_buffers[i] = &local_blocks_aligned[i * BLCKSZ]; + local_buffers[i] = &local_blocks[i * BLCKSZ]; + CalcBlockIv(forknum, bn, tdereln->relKey.base_iv, iv); - memcpy(iv + 4, &bn, sizeof(BlockNumber)); - - AesEncrypt(int_key->key, iv, ((unsigned char **) buffers)[i], BLCKSZ, local_buffers[i]); + AesEncrypt(tdereln->relKey.key, iv, ((unsigned char **) buffers)[i], BLCKSZ, local_buffers[i]); } mdwritev(reln, forknum, blocknum, @@ -114,31 +245,62 @@ tde_mdwritev(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, } } +/* + * The current transaction might already be commited when this function is + * called, so do not call any code that uses ereport(ERROR) or otherwise tries + * to abort the transaction. + */ +static void +tde_mdunlink(RelFileLocatorBackend rlocator, ForkNumber forknum, bool isRedo) +{ + mdunlink(rlocator, forknum, isRedo); + + /* + * As of PostgreSQL 17 we are called once per forks, no matter if they + * exist or not, from smgrdounlinkall() so deleting the relation key on + * attempting to delete the main fork is safe. Additionally since we + * unlink the files after commit/abort we do not need to care about + * concurrent accesses. + * + * We support InvalidForkNumber to be similar to mdunlink() but it can + * actually never happen. + */ + if (forknum == MAIN_FORKNUM || forknum == InvalidForkNumber) + { + if (tde_smgr_is_encrypted(&rlocator)) + tde_smgr_delete_key(&rlocator); + } +} + static void tde_mdextend(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, const void *buffer, bool skipFsync) { - TDESMgrRelation tdereln = (TDESMgrRelation) reln; - InternalKey *int_key = &tdereln->relKey; + TDESMgrRelation *tdereln = (TDESMgrRelation *) reln; - if (!tdereln->encrypted_relation) + if (tdereln->encryption_status == RELATION_NOT_ENCRYPTED) { mdextend(reln, forknum, blocknum, buffer, skipFsync); } else { - unsigned char *local_blocks = palloc(BLCKSZ * (1 + 1)); - unsigned char *local_blocks_aligned = (unsigned char *) TYPEALIGN(PG_IO_ALIGN_SIZE, local_blocks); - unsigned char iv[16] = { - 0, - }; + unsigned char *local_blocks = palloc_aligned(BLCKSZ, PG_IO_ALIGN_SIZE, 0); + unsigned char iv[16]; - AesInit(); - memcpy(iv + 4, &blocknum, sizeof(BlockNumber)); + if (tdereln->encryption_status == RELATION_KEY_NOT_AVAILABLE) + { + InternalKey *int_key = tde_smgr_get_key(&reln->smgr_rlocator); + + tdereln->relKey = *int_key; + tdereln->encryption_status = RELATION_KEY_AVAILABLE; + pfree(int_key); + } - AesEncrypt(int_key->key, iv, ((unsigned char *) buffer), BLCKSZ, local_blocks_aligned); + CalcBlockIv(forknum, blocknum, tdereln->relKey.base_iv, iv); - mdextend(reln, forknum, blocknum, local_blocks_aligned, skipFsync); + AesEncrypt(tdereln->relKey.key, iv, ((unsigned char *) buffer), BLCKSZ, local_blocks); + + mdextend(reln, forknum, blocknum, local_blocks, skipFsync); pfree(local_blocks); } @@ -148,40 +310,40 @@ static void tde_mdreadv(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, void **buffers, BlockNumber nblocks) { - TDESMgrRelation tdereln = (TDESMgrRelation) reln; - InternalKey *int_key = &tdereln->relKey; + TDESMgrRelation *tdereln = (TDESMgrRelation *) reln; mdreadv(reln, forknum, blocknum, buffers, nblocks); - if (!tdereln->encrypted_relation) + if (tdereln->encryption_status == RELATION_NOT_ENCRYPTED) return; + else if (tdereln->encryption_status == RELATION_KEY_NOT_AVAILABLE) + { + InternalKey *int_key = tde_smgr_get_key(&reln->smgr_rlocator); - AesInit(); + tdereln->relKey = *int_key; + tdereln->encryption_status = RELATION_KEY_AVAILABLE; + pfree(int_key); + } for (int i = 0; i < nblocks; ++i) { bool allZero = true; BlockNumber bn = blocknum + i; - unsigned char iv[16] = {0,}; + unsigned char iv[16]; + /* + * Detect unencrypted all-zero pages written by smgrzeroextend() by + * looking at the first 32 bytes of the page. + * + * Not encrypting all-zero pages is safe because they are only written + * at the end of the file when extending a table on disk so they tend + * to be short lived plus they only leak a slightly more accurate + * table size than one can glean from just the file size. + */ for (int j = 0; j < 32; ++j) { if (((char **) buffers)[i][j] != 0) { - /* - * Postgres creates all zero blocks in an optimized route, - * which we do not try - */ - /* to encrypt. */ - /* - * Instead we detect if a block is all zero at decryption - * time, and - */ - /* leave it as is. */ - /* - * This could be a security issue later, but it is a good - * first prototype - */ allZero = false; break; } @@ -189,81 +351,80 @@ tde_mdreadv(SMgrRelation reln, ForkNumber forknum, BlockNumber blocknum, if (allZero) continue; - memcpy(iv + 4, &bn, sizeof(BlockNumber)); + CalcBlockIv(forknum, bn, tdereln->relKey.base_iv, iv); - AesDecrypt(int_key->key, iv, ((unsigned char **) buffers)[i], BLCKSZ, ((unsigned char **) buffers)[i]); + AesDecrypt(tdereln->relKey.key, iv, ((unsigned char **) buffers)[i], BLCKSZ, ((unsigned char **) buffers)[i]); } } static void tde_mdcreate(RelFileLocator relold, SMgrRelation reln, ForkNumber forknum, bool isRedo) { - TDESMgrRelation tdereln = (TDESMgrRelation) reln; + TDESMgrRelation *tdereln = (TDESMgrRelation *) reln; InternalKey *key; - TdeCreateEvent *event = GetCurrentTdeCreateEvent(); + + mdcreate(relold, reln, forknum, isRedo); /* - * Make sure that even if a statement failed, and an event trigger end - * trigger didn't fire, we don't accidentaly create encrypted files when - * we don't have to. event above is a pointer, so it will reflect the - * correct state even if this changes it. + * Creating the key is handled by a separate WAL record on redo and + * fetching the key can be delayed to when we actually need it like we do + * for other forks anyway. */ - validateCurrentEventTriggerState(false); + if (isRedo) + return; /* - * This is the only function that gets called during actual CREATE - * TABLE/INDEX (EVENT TRIGGER) + * Only create keys when creating the main fork. Other forks are created + * later and use the key which was created when creating the main fork. */ - /* so we create the key here by loading it */ - - mdcreate(relold, reln, forknum, isRedo); + if (forknum != MAIN_FORKNUM) + return; - if (forknum == MAIN_FORKNUM || forknum == INIT_FORKNUM) + if (!tde_smgr_should_encrypt(&reln->smgr_rlocator, &relold)) { /* - * Only create keys when creating the main/init fork. Other forks can - * be created later, even during tde creation events. We definitely do - * not want to create keys then, even later, when we encrypt all - * forks! - */ - - /* - * Later calls then decide to encrypt or not based on the existence of - * the key + * If we have a key for this relation already, we need to remove it. + * This can happen if OID is re-used after a crash left a key for a + * non-existing relation in the key file. + * + * Old keys for encrypted tables are replace when creating the new + * key. */ - key = tde_smgr_get_key(reln, event->alterAccessMethodMode ? NULL : &relold, true); + tde_smgr_delete_leftover_key(&reln->smgr_rlocator); - if (key) - { - tdereln->encrypted_relation = true; - tdereln->relKey = *key; - } - else - { - tdereln->encrypted_relation = false; - } + tdereln->encryption_status = RELATION_NOT_ENCRYPTED; + return; } + + key = tde_smgr_create_key(&reln->smgr_rlocator); + + tdereln->encryption_status = RELATION_KEY_AVAILABLE; + tdereln->relKey = *key; + pfree(key); } /* * mdopen() -- Initialize newly-opened relation. + * + * The current transaction might already be commited when this function is + * called, so do not call any code that uses ereport(ERROR) or otherwise tries + * to abort the transaction. */ static void tde_mdopen(SMgrRelation reln) { - TDESMgrRelation tdereln = (TDESMgrRelation) reln; - InternalKey *key = tde_smgr_get_key(reln, NULL, false); + TDESMgrRelation *tdereln = (TDESMgrRelation *) reln; + + mdopen(reln); - if (key) + if (tde_smgr_is_encrypted(&reln->smgr_rlocator)) { - tdereln->encrypted_relation = true; - tdereln->relKey = *key; + tdereln->encryption_status = RELATION_KEY_NOT_AVAILABLE; } else { - tdereln->encrypted_relation = false; + tdereln->encryption_status = RELATION_NOT_ENCRYPTED; } - mdopen(reln); } static const struct f_smgr tde_smgr = { @@ -274,7 +435,7 @@ static const struct f_smgr tde_smgr = { .smgr_close = mdclose, .smgr_create = tde_mdcreate, .smgr_exists = mdexists, - .smgr_unlink = mdunlink, + .smgr_unlink = tde_mdunlink, .smgr_extend = tde_mdextend, .smgr_zeroextend = mdzeroextend, .smgr_prefetch = mdprefetch, @@ -292,5 +453,88 @@ RegisterStorageMgr(void) { if (storage_manager_id != MdSMgrId) elog(FATAL, "Another storage manager was loaded before pg_tde. Multiple storage managers is unsupported."); - storage_manager_id = smgr_register(&tde_smgr, sizeof(TDESMgrRelationData)); + OurSMgrId = smgr_register(&tde_smgr, sizeof(TDESMgrRelation)); + storage_manager_id = OurSMgrId; +} + +static void +tde_smgr_save_temp_key(const RelFileLocator *newrlocator, const InternalKey *key) +{ + TempRelKeyEntry *entry; + bool found; + + if (TempRelKeys == NULL) + { + HASHCTL ctl; + + ctl.keysize = sizeof(RelFileLocator); + ctl.entrysize = sizeof(TempRelKeyEntry); + TempRelKeys = hash_create("pg_tde temporary relation keys", + INIT_TEMP_RELS, + &ctl, + HASH_ELEM | HASH_BLOBS); + } + + entry = (TempRelKeyEntry *) hash_search(TempRelKeys, + newrlocator, + HASH_ENTER, &found); + Assert(!found); + + entry->key = *key; +} + +static InternalKey * +tde_smgr_get_temp_key(const RelFileLocator *rel) +{ + TempRelKeyEntry *entry; + + if (TempRelKeys == NULL) + return NULL; + + entry = hash_search(TempRelKeys, rel, HASH_FIND, NULL); + + if (entry) + { + InternalKey *key = palloc_object(InternalKey); + + *key = entry->key; + return key; + } + + return NULL; +} + +static bool +tde_smgr_has_temp_key(const RelFileLocator *rel) +{ + return TempRelKeys && hash_search(TempRelKeys, rel, HASH_FIND, NULL); +} + +static void +tde_smgr_delete_temp_key(const RelFileLocator *rel) +{ + Assert(TempRelKeys); + hash_search(TempRelKeys, rel, HASH_REMOVE, NULL); +} + +/* + * The intialization vector of a block is its block number conmverted to a + * 128 bit big endian number plus the forknumber XOR the base IV of the + * relation file. + */ +static void +CalcBlockIv(ForkNumber forknum, BlockNumber bn, const unsigned char *base_iv, unsigned char *iv) +{ + memset(iv, 0, 16); + + /* The init fork is copied to the main fork so we must use the same IV */ + iv[7] = forknum == INIT_FORKNUM ? MAIN_FORKNUM : forknum; + + iv[12] = bn >> 24; + iv[13] = bn >> 16; + iv[14] = bn >> 8; + iv[15] = bn; + + for (int i = 0; i < 16; i++) + iv[i] ^= base_iv[i]; } diff --git a/contrib/pg_tde/src/transam/pg_tde_xact_handler.c b/contrib/pg_tde/src/transam/pg_tde_xact_handler.c deleted file mode 100644 index 3e7a8f2385c3f..0000000000000 --- a/contrib/pg_tde/src/transam/pg_tde_xact_handler.c +++ /dev/null @@ -1,187 +0,0 @@ -/*------------------------------------------------------------------------- - * - * pg_tde_xact_handler.c - * Transaction handling routines for pg_tde - * - * - * IDENTIFICATION - * src/transam/pg_tde_xact_handler.c - * - *------------------------------------------------------------------------- - */ - -#include "postgres.h" -#include "access/xact.h" -#include "utils/memutils.h" -#include "utils/palloc.h" -#include "utils/elog.h" -#include "storage/fd.h" -#include "transam/pg_tde_xact_handler.h" -#include "access/pg_tde_tdemap.h" - -typedef struct PendingMapEntryDelete -{ - off_t map_entry_offset; /* map entry offset */ - RelFileLocator rlocator; /* main for use as relation OID */ - bool atCommit; /* T=delete at commit; F=delete at abort */ - int nestLevel; /* xact nesting level of request */ - struct PendingMapEntryDelete *next; /* linked-list link */ -} PendingMapEntryDelete; - -static PendingMapEntryDelete *pendingDeletes = NULL; /* head of linked list */ - -static void do_pending_deletes(bool isCommit); -static void reassign_pending_deletes_to_parent_xact(void); -static void pending_delete_cleanup(void); - -/* Transaction Callbacks from Backend*/ -static void -pg_tde_xact_callback(XactEvent event, void *arg) -{ - if (event == XACT_EVENT_PARALLEL_ABORT || - event == XACT_EVENT_ABORT) - { - ereport(DEBUG2, - (errmsg("pg_tde_xact_callback: aborting transaction"))); - do_pending_deletes(false); - } - else if (event == XACT_EVENT_COMMIT) - { - do_pending_deletes(true); - pending_delete_cleanup(); - } - else if (event == XACT_EVENT_PREPARE) - { - pending_delete_cleanup(); - } -} - -static void -pg_tde_subxact_callback(SubXactEvent event, SubTransactionId mySubid, - SubTransactionId parentSubid, void *arg) -{ - /* TODO: takle all possible transaction states */ - if (event == SUBXACT_EVENT_ABORT_SUB) - { - ereport(DEBUG2, - (errmsg("pg_tde_subxact_callback: aborting subtransaction"))); - do_pending_deletes(false); - } - else if (event == SUBXACT_EVENT_COMMIT_SUB) - { - ereport(DEBUG2, - (errmsg("pg_tde_subxact_callback: committing subtransaction"))); - reassign_pending_deletes_to_parent_xact(); - } -} - -void -RegisterTdeXactCallbacks(void) -{ - RegisterXactCallback(pg_tde_xact_callback, NULL); - RegisterSubXactCallback(pg_tde_subxact_callback, NULL); -} - -void -RegisterEntryForDeletion(const RelFileLocator *rlocator, off_t map_entry_offset, bool atCommit) -{ - PendingMapEntryDelete *pending; - - pending = (PendingMapEntryDelete *) MemoryContextAlloc(TopMemoryContext, sizeof(PendingMapEntryDelete)); - pending->map_entry_offset = map_entry_offset; - pending->rlocator = *rlocator; - pending->atCommit = atCommit; /* delete if abort */ - pending->nestLevel = GetCurrentTransactionNestLevel(); - pending->next = pendingDeletes; - pendingDeletes = pending; -} - -/* - * do_pending_deletes() -- Take care of file deletes at end of xact. - * - * This also runs when aborting a subxact; we want to clean up a failed - * subxact immediately. - * - */ -static void -do_pending_deletes(bool isCommit) -{ - int nestLevel = GetCurrentTransactionNestLevel(); - PendingMapEntryDelete *pending; - PendingMapEntryDelete *prev; - PendingMapEntryDelete *next; - - prev = NULL; - for (pending = pendingDeletes; pending != NULL; pending = next) - { - next = pending->next; - if (pending->nestLevel != nestLevel) - { - /* outer-level entries should not be processed yet */ - prev = pending; - continue; - } - - /* unlink list entry first, so we don't retry on failure */ - if (prev) - prev->next = next; - else - pendingDeletes = next; - /* do deletion if called for */ - if (pending->atCommit == isCommit) - { - ereport(LOG, - (errmsg("pg_tde_xact_callback: deleting entry at offset %d", - (int) (pending->map_entry_offset)))); - pg_tde_free_key_map_entry(&pending->rlocator, pending->map_entry_offset); - } - pfree(pending); - /* prev does not change */ - - } -} - - -/* - * reassign_pending_deletes_to_parent_xact() -- Adjust nesting level of pending deletes. - * - * There are several cases to consider: - * 1. Only top level transaction can perform on-commit deletes. - * 2. Subtransaction and top level transaction can perform on-abort deletes. - * So we have to decrement the nesting level of pending deletes to reassing them to the parent transaction - * if subtransaction was not self aborted. In other words if subtransaction state is commited all its pending - * deletes are reassigned to the parent transaction. - */ -static void -reassign_pending_deletes_to_parent_xact(void) -{ - PendingMapEntryDelete *pending; - int nestLevel = GetCurrentTransactionNestLevel(); - - for (pending = pendingDeletes; pending != NULL; pending = pending->next) - { - if (pending->nestLevel == nestLevel) - pending->nestLevel--; - } -} - -/* - * pending_delete_cleanup -- Clean up after a successful PREPARE or COMMIT - * - * What we have to do here is throw away the in-memory state about pending - * file deletes. It's all been recorded in the 2PC state file and - * it's no longer our job to worry about it. - */ -static void -pending_delete_cleanup(void) -{ - PendingMapEntryDelete *pending; - PendingMapEntryDelete *next; - - for (pending = pendingDeletes; pending != NULL; pending = next) - { - next = pending->next; - pendingDeletes = next; - pfree(pending); - } -} diff --git a/contrib/pg_tde/t/001_basic.pl b/contrib/pg_tde/t/001_basic.pl deleted file mode 100644 index 8a6cf445f2cae..0000000000000 --- a/contrib/pg_tde/t/001_basic.pl +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; -use File::Basename; -use File::Compare; -use File::Copy; -use Test::More; -use lib 't'; -use pgtde; - -# Get file name and CREATE out file name and dirs WHERE requried -PGTDE::setup_files_dir(basename($0)); - -# CREATE new PostgreSQL node and do initdb -my $node = PGTDE->pgtde_init_pg(); -my $pgdata = $node->data_dir; - -# UPDATE postgresql.conf to include/load pg_tde library -open my $conf, '>>', "$pgdata/postgresql.conf"; -print $conf "shared_preload_libraries = 'pg_tde'\n"; -close $conf; - -# Start server -my $rt_value = $node->start; -ok($rt_value == 1, "Start Server"); - -# CREATE EXTENSION IF NOT EXISTS and change out file permissions -my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS pg_tde;', extra_params => ['-a']); -ok($cmdret == 0, "CREATE PGTDE EXTENSION"); -PGTDE::append_to_file($stdout); - -my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT extname, extversion FROM pg_extension WHERE extname = \'pg_tde\';', extra_params => ['-a']); -ok($cmdret == 0, "SELECT PGTDE VERSION"); -PGTDE::append_to_file($stdout); - -$rt_value = $node->psql('postgres', 'CREATE TABLE test_enc(id SERIAL,k INTEGER,PRIMARY KEY (id)) USING tde_heap;', extra_params => ['-a']); -ok($rt_value == 3, "Failing query"); - - -# Restart the server -PGTDE::append_to_file("-- server restart"); -$node->stop(); - -$rt_value = $node->start(); -ok($rt_value == 1, "Restart Server"); - -$rt_value = $node->psql('postgres', "SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per');", extra_params => ['-a']); -$rt_value = $node->psql('postgres', "SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault');", extra_params => ['-a']); - -$stdout = $node->safe_psql('postgres', 'CREATE TABLE test_enc(id SERIAL,k VARCHAR(32),PRIMARY KEY (id)) USING tde_heap;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'INSERT INTO test_enc (k) VALUES (\'foobar\'),(\'barfoo\');', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Restart the server -PGTDE::append_to_file("-- server restart"); -$rt_value = $node->stop(); -$rt_value = $node->start(); - -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Verify that we can't see the data in the file -my $tablefile = $node->safe_psql('postgres', 'SHOW data_directory;'); -$tablefile .= '/'; -$tablefile .= $node->safe_psql('postgres', 'SELECT pg_relation_filepath(\'test_enc\');'); - -my $strings = 'TABLEFILE FOUND: '; -$strings .= `(ls $tablefile >/dev/null && echo yes) || echo no`; -PGTDE::append_to_file($strings); - -$strings = 'CONTAINS FOO (should be empty): '; -$strings .= `strings $tablefile | grep foo`; -PGTDE::append_to_file($strings); - -$stdout = $node->safe_psql('postgres', 'DROP TABLE test_enc;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# DROP EXTENSION -$stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_tde;', extra_params => ['-a']); -ok($cmdret == 0, "DROP PGTDE EXTENSION"); -PGTDE::append_to_file($stdout); -# Stop the server -$node->stop(); - -# compare the expected and out file -my $compare = PGTDE->compare_results(); - -# Test/check if expected and result/out file match. If Yes, test passes. -is($compare,0,"Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files."); - -# Done testing for this testcase file. -done_testing(); diff --git a/contrib/pg_tde/t/002_rotate_key.pl b/contrib/pg_tde/t/002_rotate_key.pl deleted file mode 100644 index ed744a578d6a1..0000000000000 --- a/contrib/pg_tde/t/002_rotate_key.pl +++ /dev/null @@ -1,201 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; -use File::Basename; -use File::Compare; -use File::Copy; -use Test::More; -use lib 't'; -use pgtde; - -# Get file name and CREATE out file name and dirs WHERE requried -PGTDE::setup_files_dir(basename($0)); - -# CREATE new PostgreSQL node and do initdb -my $node = PGTDE->pgtde_init_pg(); -my $pgdata = $node->data_dir; - -# UPDATE postgresql.conf to include/load pg_tde library -open my $conf, '>>', "$pgdata/postgresql.conf"; -print $conf "shared_preload_libraries = 'pg_tde'\n"; -close $conf; - -# Start server -my $rt_value = $node->start; -ok($rt_value == 1, "Start Server"); - -# CREATE EXTENSION IF NOT EXISTS and change out file permissions -my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS pg_tde;', extra_params => ['-a']); -ok($cmdret == 0, "CREATE PGTDE EXTENSION"); -PGTDE::append_to_file($stdout); - - -$rt_value = $node->psql('postgres', 'CREATE TABLE test_enc(id SERIAL,k INTEGER,PRIMARY KEY (id)) USING tde_heap;', extra_params => ['-a']); -ok($rt_value == 3, "Failing query"); - - -# Restart the server -PGTDE::append_to_file("-- server restart"); -$node->stop(); - -$rt_value = $node->start(); -ok($rt_value == 1, "Restart Server"); - -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_add_key_provider_file('file-2','/tmp/pg_tde_test_keyring_2.per');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_add_global_key_provider_file('file-2','/tmp/pg_tde_test_keyring_2g.per');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_add_global_key_provider_file('file-3','/tmp/pg_tde_test_keyring_3.per');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_list_all_key_providers();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'CREATE TABLE test_enc(id SERIAL,k INTEGER,PRIMARY KEY (id)) USING tde_heap;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'INSERT INTO test_enc (k) VALUES (5),(6);', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -#rotate key -$stdout = $node->psql('postgres', "SELECT pg_tde_set_principal_key('rotated-principal-key1');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Restart the server -PGTDE::append_to_file("-- server restart"); -$rt_value = $node->stop(); -$rt_value = $node->start(); - -$stdout = $node->safe_psql('postgres', "SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_principal_key_info();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_global_principal_key_info();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -PGTDE::append_to_file($stderr); -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - - -#Again rotate key -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_set_principal_key('rotated-principal-key2','file-2');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Restart the server -PGTDE::append_to_file("-- server restart"); -$rt_value = $node->stop(); -$rt_value = $node->start(); - -$stdout = $node->safe_psql('postgres', "SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_principal_key_info();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_global_principal_key_info();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -PGTDE::append_to_file($stderr); -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -#Again rotate key -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_set_global_principal_key('rotated-principal-key', 'file-3', false);", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Restart the server -PGTDE::append_to_file("-- server restart"); -$rt_value = $node->stop(); -$rt_value = $node->start(); - -$stdout = $node->safe_psql('postgres', "SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_principal_key_info();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_global_principal_key_info();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -PGTDE::append_to_file($stderr); -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# TODO: add method to query current info -# And maybe debug tools to show what's in a file keyring? - -#Again rotate key -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_set_global_principal_key('rotated-principal-keyX', 'file-2', false);", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Restart the server -PGTDE::append_to_file("-- server restart"); -$rt_value = $node->stop(); -$rt_value = $node->start(); - -$stdout = $node->safe_psql('postgres', "SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_principal_key_info();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_global_principal_key_info();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -PGTDE::append_to_file($stderr); -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'ALTER SYSTEM SET pg_tde.inherit_global_providers = OFF;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Things still work after a restart -# Restart the server -PGTDE::append_to_file("-- server restart"); -$rt_value = $node->stop(); -$rt_value = $node->start(); - -# But now can't be changed to another global provider -($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT pg_tde_set_global_principal_key('rotated-principal-keyX2', 'file-2', false);", extra_params => ['-a']); -PGTDE::append_to_file($stderr); -$stdout = $node->safe_psql('postgres', "SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_principal_key_info();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_global_principal_key_info();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -PGTDE::append_to_file($stderr); - -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_set_principal_key('rotated-principal-key2','file-2');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', "SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_principal_key_info();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_global_principal_key_info();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -PGTDE::append_to_file($stderr); - - -# end - -$stdout = $node->safe_psql('postgres', 'DROP TABLE test_enc;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'ALTER SYSTEM RESET pg_tde.inherit_global_providers;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$rt_value = $node->stop(); -$rt_value = $node->start(); - -# DROP EXTENSION -($cmdret, $stdout, $stderr) = $node->psql('postgres', 'DROP EXTENSION pg_tde CASCADE;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); -PGTDE::append_to_file($stderr); -# Stop the server -$node->stop(); - -# compare the expected and out file -my $compare = PGTDE->compare_results(); - -# Test/check if expected and result/out file match. If Yes, test passes. -is($compare,0,"Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files."); - -# Done testing for this testcase file. -done_testing(); diff --git a/contrib/pg_tde/t/003_remote_config.pl b/contrib/pg_tde/t/003_remote_config.pl deleted file mode 100644 index 3c2394236e07f..0000000000000 --- a/contrib/pg_tde/t/003_remote_config.pl +++ /dev/null @@ -1,112 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; -use File::Basename; -use File::Compare; -use File::Copy; -use Test::More; -use lib 't'; -use pgtde; - -# Get file name and CREATE out file name and dirs WHERE requried -PGTDE::setup_files_dir(basename($0)); - -# CREATE new PostgreSQL node and do initdb -my $node = PGTDE->pgtde_init_pg(); -my $pgdata = $node->data_dir; - -{ -package MyWebServer; - -use HTTP::Server::Simple::CGI; -use base qw(HTTP::Server::Simple::CGI); - -my %dispatch = ( - '/hello' => \&resp_hello, - # ... -); - -sub handle_request { - my $self = shift; - my $cgi = shift; - - my $path = $cgi->path_info(); - my $handler = $dispatch{$path}; - - if (ref($handler) eq "CODE") { - print "HTTP/1.0 200 OK\r\n"; - $handler->($cgi); - - } else { - print "HTTP/1.0 404 Not found\r\n"; - print $cgi->header, - $cgi->start_html('Not found'), - $cgi->h1('Not found'), - $cgi->end_html; - } -} - -sub resp_hello { - my $cgi = shift; - print $cgi->header, - "/tmp/http_datafile\r\n"; -} - -} -my $pid = MyWebServer->new(8888)->background(); - - -# UPDATE postgresql.conf to include/load pg_tde library -open my $conf, '>>', "$pgdata/postgresql.conf"; -print $conf "shared_preload_libraries = 'pg_tde'\n"; -close $conf; - -my $rt_value = $node->stop(); -$rt_value = $node->start(); -ok($rt_value == 1, "Restart Server"); - -my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS pg_tde;', extra_params => ['-a']); -ok($cmdret == 0, "CREATE PGTDE EXTENSION"); -PGTDE::append_to_file($stdout); - -$rt_value = $node->psql('postgres', "SELECT pg_tde_add_key_provider_file('file-provider', json_object( 'type' VALUE 'remote', 'url' VALUE 'http://localhost:8888/hello' ));", extra_params => ['-a']); -$rt_value = $node->psql('postgres', "SELECT pg_tde_set_principal_key('test-db-principal-key','file-provider');", extra_params => ['-a']); - -$stdout = $node->safe_psql('postgres', 'CREATE TABLE test_enc2(id SERIAL,k INTEGER,PRIMARY KEY (id)) USING tde_heap;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'INSERT INTO test_enc2 (k) VALUES (5),(6);', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc2 ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Restart the server -PGTDE::append_to_file("-- server restart"); -$rt_value = $node->stop(); -$rt_value = $node->start(); - -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc2 ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'DROP TABLE test_enc2;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# DROP EXTENSION -$stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_tde;', extra_params => ['-a']); -ok($cmdret == 0, "DROP PGTDE EXTENSION"); -PGTDE::append_to_file($stdout); -# Stop the server -$node->stop(); - -system("kill $pid"); - -# compare the expected and out file -my $compare = PGTDE->compare_results(); - -# Test/check if expected and result/out file match. If Yes, test passes. -is($compare,0,"Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files."); - -# Done testing for this testcase file. -done_testing(); diff --git a/contrib/pg_tde/t/004_file_config.pl b/contrib/pg_tde/t/004_file_config.pl deleted file mode 100644 index 478d6bd177f4f..0000000000000 --- a/contrib/pg_tde/t/004_file_config.pl +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; -use File::Basename; -use File::Compare; -use File::Copy; -use Test::More; -use lib 't'; -use pgtde; - -# Get file name and CREATE out file name and dirs WHERE requried -PGTDE::setup_files_dir(basename($0)); - -# CREATE new PostgreSQL node and do initdb -my $node = PGTDE->pgtde_init_pg(); -my $pgdata = $node->data_dir; - -copy("$pgdata/postgresql.conf", "$pgdata/postgresql.conf.bak"); - -# UPDATE postgresql.conf to include/load pg_tde library -open my $conf, '>>', "$pgdata/postgresql.conf"; -print $conf "shared_preload_libraries = 'pg_tde'\n"; -close $conf; - -open my $conf2, '>>', "/tmp/datafile-location"; -print $conf2 "/tmp/keyring_data_file\n"; -close $conf2; - -my $rt_value = $node->start(); -ok($rt_value == 1, "Start Server"); - -my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS pg_tde;', extra_params => ['-a']); -ok($cmdret == 0, "CREATE PGTDE EXTENSION"); -PGTDE::append_to_file($stdout); - -$rt_value = $node->psql('postgres', "SELECT pg_tde_add_key_provider_file('file-provider', json_object( 'type' VALUE 'file', 'path' VALUE '/tmp/datafile-location' ));", extra_params => ['-a']); -$rt_value = $node->psql('postgres', "SELECT pg_tde_set_principal_key('test-db-principal-key','file-provider');", extra_params => ['-a']); - -$stdout = $node->safe_psql('postgres', 'CREATE TABLE test_enc1(id SERIAL,k INTEGER,PRIMARY KEY (id)) USING tde_heap;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'INSERT INTO test_enc1 (k) VALUES (5),(6);', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc1 ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Restart the server -PGTDE::append_to_file("-- server restart"); -$rt_value = $node->stop(); -$rt_value = $node->start(); - -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc1 ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'DROP TABLE test_enc1;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# DROP EXTENSION -$stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_tde;', extra_params => ['-a']); -ok($cmdret == 0, "DROP PGTDE EXTENSION"); -PGTDE::append_to_file($stdout); -# Stop the server -$node->stop(); - -# compare the expected and out file -my $compare = PGTDE->compare_results(); - -# Test/check if expected and result/out file match. If Yes, test passes. -is($compare,0,"Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files."); - -# Done testing for this testcase file. -done_testing(); diff --git a/contrib/pg_tde/t/005_multiple_extensions.pl b/contrib/pg_tde/t/005_multiple_extensions.pl deleted file mode 100644 index e9aff281e4466..0000000000000 --- a/contrib/pg_tde/t/005_multiple_extensions.pl +++ /dev/null @@ -1,158 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; -use File::Basename; -use File::Compare; -use File::Copy; -use Test::More; -use lib 't'; -use pgtde; - -# Get file name and CREATE out file name and dirs WHERE requried -PGTDE::setup_files_dir(basename($0)); - -my $PG_VERSION_STRING = `pg_config --version`; - -if (index(lc($PG_VERSION_STRING), lc("Percona Distribution")) == -1) -{ - plan skip_all => "pg_tde test case only for PPG server package install with extensions."; -} - -# CREATE new PostgreSQL node and do initdb -my $node = PGTDE->pgtde_init_pg(); -my $pgdata = $node->data_dir; - -copy("$pgdata/postgresql.conf", "$pgdata/postgresql.conf.bak"); - -# UPDATE postgresql.conf to include/load pg_stat_monitor library -open my $conf, '>>', "$pgdata/postgresql.conf"; -print $conf "shared_preload_libraries = 'pg_tde, pg_stat_monitor, pgaudit, set_user, pg_repack'\n"; -print $conf "pg_stat_monitor.pgsm_bucket_time = 360000\n"; -print $conf "pg_stat_monitor.pgsm_normalized_query = 'yes'\n"; -close $conf; - -open my $conf2, '>>', "/tmp/datafile-location"; -print $conf2 "/tmp/keyring_data_file\n"; -close $conf2; - -# Start server -my $rt_value = $node->start; -ok($rt_value == 1, "Start Server"); - -# Create PGSM extension -my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS pg_stat_monitor;', extra_params => ['-a']); -ok($cmdret == 0, "CREATE PGSM EXTENSION"); -PGTDE::append_to_debug_file($stdout); - -($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT pg_stat_monitor_reset();', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); -ok($cmdret == 0, "Reset PGSM EXTENSION"); -PGTDE::append_to_debug_file($stdout); - -# Create pg_tde extension -($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS pg_tde;', extra_params => ['-a']); -ok($cmdret == 0, "CREATE PGTDE EXTENSION"); -PGTDE::append_to_file($stdout); - -# Create Other extensions -($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS pgaudit;', extra_params => ['-a']); -ok($cmdret == 0, "CREATE pgaudit EXTENSION"); -PGTDE::append_to_debug_file($stdout); -($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS set_user;', extra_params => ['-a']); -ok($cmdret == 0, "CREATE set_user EXTENSION"); -PGTDE::append_to_debug_file($stdout); -($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS pg_repack;', extra_params => ['-a']); -ok($cmdret == 0, "CREATE pg_repack EXTENSION"); -PGTDE::append_to_debug_file($stdout); -($cmdret, $stdout, $stderr) = $node->psql('postgres', "SET pgaudit.log = 'none'; CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS postgis; SET pgaudit.log = 'all';", extra_params => ['-a']); -ok($cmdret == 0, "CREATE postgis EXTENSION"); -PGTDE::append_to_debug_file($stdout); -($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS postgis_raster;', extra_params => ['-a']); -ok($cmdret == 0, "CREATE postgis_raster EXTENSION"); -PGTDE::append_to_debug_file($stdout); -($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS postgis_sfcgal;', extra_params => ['-a']); -ok($cmdret == 0, "CREATE postgis_sfcgal EXTENSION"); -PGTDE::append_to_debug_file($stdout); -($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS fuzzystrmatch;', extra_params => ['-a']); -ok($cmdret == 0, "CREATE fuzzystrmatch EXTENSION"); -PGTDE::append_to_debug_file($stdout); -($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS address_standardizer;', extra_params => ['-a']); -ok($cmdret == 0, "CREATE address_standardizer EXTENSION"); -PGTDE::append_to_debug_file($stdout); -($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS address_standardizer_data_us;', extra_params => ['-a']); -ok($cmdret == 0, "CREATE address_standardizer_data_us EXTENSION"); -PGTDE::append_to_debug_file($stdout); -($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS postgis_tiger_geocoder;', extra_params => ['-a']); -ok($cmdret == 0, "CREATE postgis_tiger_geocoder EXTENSION"); -PGTDE::append_to_debug_file($stdout); - -$rt_value = $node->psql('postgres', "SELECT pg_tde_add_key_provider_file('file-provider', json_object( 'type' VALUE 'file', 'path' VALUE '/tmp/datafile-location' ));", extra_params => ['-a']); -$rt_value = $node->psql('postgres', "SELECT pg_tde_set_principal_key('test-db-principal-key','file-provider');", extra_params => ['-a']); - -$stdout = $node->safe_psql('postgres', 'CREATE TABLE test_enc1(id SERIAL,k INTEGER,PRIMARY KEY (id)) USING tde_heap;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'INSERT INTO test_enc1 (k) VALUES (5),(6);', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc1 ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Restart the server -PGTDE::append_to_file("-- server restart"); -$rt_value = $node->stop(); -$rt_value = $node->start(); - -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc1 ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'DROP TABLE test_enc1;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Print PGSM settings -($cmdret, $stdout, $stderr) = $node->psql('postgres', "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name='pg_stat_monitor.pgsm_query_shared_buffer';", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); -ok($cmdret == 0, "Print PGTDE EXTENSION Settings"); -PGTDE::append_to_debug_file($stdout); - -# Create example database and run pgbench init -($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE database example;', extra_params => ['-a']); -print "cmdret $cmdret\n"; -ok($cmdret == 0, "CREATE Database example"); -PGTDE::append_to_debug_file($stdout); - -my $port = $node->port; -print "port $port \n"; - -my $out = system ("pgbench -i -s 20 -p $port example"); -print " out: $out \n"; -ok($cmdret == 0, "Perform pgbench init"); - -$out = system ("pgbench -c 10 -j 2 -t 5000 -p $port example"); -print " out: $out \n"; -ok($cmdret == 0, "Run pgbench"); - -($cmdret, $stdout, $stderr) = $node->psql('postgres', 'SELECT datname, substr(query,0,150) AS query, SUM(calls) AS calls FROM pg_stat_monitor GROUP BY datname, query ORDER BY datname, query, calls;', extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=off']); -ok($cmdret == 0, "SELECT XXX FROM pg_stat_monitor"); -PGTDE::append_to_debug_file($stdout); - -# DROP EXTENSION -$stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_tde;', extra_params => ['-a']); -ok($cmdret == 0, "DROP PGTDE EXTENSION"); -PGTDE::append_to_file($stdout); - -# DROP EXTENSION -$stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_stat_monitor;', extra_params => ['-a']); -ok($cmdret == 0, "DROP PGTDE EXTENSION"); -PGTDE::append_to_debug_file($stdout); - -# Stop the server -$node->stop(); - -# compare the expected and out file -my $compare = PGTDE->compare_results(); - -# Test/check if expected and result/out file match. If Yes, test passes. -is($compare,0,"Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files."); - -# Done testing for this testcase file. -done_testing(); diff --git a/contrib/pg_tde/t/006_remote_vault_config.pl b/contrib/pg_tde/t/006_remote_vault_config.pl deleted file mode 100644 index 336f4fd67691b..0000000000000 --- a/contrib/pg_tde/t/006_remote_vault_config.pl +++ /dev/null @@ -1,120 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; -use File::Basename; -use File::Compare; -use File::Copy; -use Test::More; -use lib 't'; -use pgtde; -use Env; - -# Get file name and CREATE out file name and dirs WHERE requried -PGTDE::setup_files_dir(basename($0)); - -# CREATE new PostgreSQL node and do initdb -my $node = PGTDE->pgtde_init_pg(); -my $pgdata = $node->data_dir; - -{ -package MyWebServer; - -use HTTP::Server::Simple::CGI; -use base qw(HTTP::Server::Simple::CGI); - -my %dispatch = ( - '/token' => \&resp_token, - '/url' => \&resp_url, - # ... -); - -sub handle_request { - my $self = shift; - my $cgi = shift; - - my $path = $cgi->path_info(); - my $handler = $dispatch{$path}; - - if (ref($handler) eq "CODE") { - print "HTTP/1.0 200 OK\r\n"; - $handler->($cgi); - - } else { - print "HTTP/1.0 404 Not found\r\n"; - print $cgi->header, - $cgi->start_html('Not found'), - $cgi->h1('Not found'), - $cgi->end_html; - } -} - -sub resp_token { - my $cgi = shift; - print $cgi->header, - "$ENV{'ROOT_TOKEN'}\r\n"; -} - -sub resp_url { - my $cgi = shift; - print $cgi->header, - "http://127.0.0.1:8200\r\n"; -} - -} -my $pid = MyWebServer->new(8889)->background(); - - -# UPDATE postgresql.conf to include/load pg_tde library -open my $conf, '>>', "$pgdata/postgresql.conf"; -print $conf "shared_preload_libraries = 'pg_tde'\n"; -close $conf; - -my $rt_value = $node->stop(); -$rt_value = $node->start(); -ok($rt_value == 1, "Restart Server"); - -my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS pg_tde;', extra_params => ['-a']); -ok($cmdret == 0, "CREATE PGTDE EXTENSION"); -PGTDE::append_to_file($stdout); - -$rt_value = $node->psql('postgres', "SELECT pg_tde_add_key_provider_vault_v2('vault-provider', json_object( 'type' VALUE 'remote', 'url' VALUE 'http://localhost:8889/token' ), json_object( 'type' VALUE 'remote', 'url' VALUE 'http://localhost:8889/url' ), to_json('secret'::text), NULL);", extra_params => ['-a']); -$rt_value = $node->psql('postgres', "SELECT pg_tde_set_principal_key('test-db-principal-key','vault-provider');", extra_params => ['-a']); - -$stdout = $node->safe_psql('postgres', 'CREATE TABLE test_enc2(id SERIAL,k INTEGER,PRIMARY KEY (id)) USING tde_heap;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'INSERT INTO test_enc2 (k) VALUES (5),(6);', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc2 ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Restart the server -PGTDE::append_to_file("-- server restart"); -$rt_value = $node->stop(); -$rt_value = $node->start(); - -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc2 ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'DROP TABLE test_enc2;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# DROP EXTENSION -$stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_tde;', extra_params => ['-a']); -ok($cmdret == 0, "DROP PGTDE EXTENSION"); -PGTDE::append_to_file($stdout); -# Stop the server -$node->stop(); - -system("kill -9 $pid"); - -# compare the expected and out file -my $compare = PGTDE->compare_results(); - -# Test/check if expected and result/out file match. If Yes, test passes. -is($compare,0,"Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files."); - -# Done testing for this testcase file. -done_testing(); diff --git a/contrib/pg_tde/t/007_tde_heap.pl b/contrib/pg_tde/t/007_tde_heap.pl deleted file mode 100644 index 77b7098bcbb47..0000000000000 --- a/contrib/pg_tde/t/007_tde_heap.pl +++ /dev/null @@ -1,235 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; -use File::Basename; -use File::Compare; -use File::Copy; -use Test::More; -use lib 't'; -use pgtde; - -# Get file name and CREATE out file name and dirs WHERE requried -PGTDE::setup_files_dir(basename($0)); - -my $PG_VERSION_STRING = `pg_config --version`; - -if (index(lc($PG_VERSION_STRING), lc("Percona Server")) == -1) -{ - plan skip_all => "pg_tde test case only for Percona Server for PostgreSQL"; -} - -# CREATE new PostgreSQL node and do initdb -my $node = PGTDE->pgtde_init_pg(); -my $pgdata = $node->data_dir; - -# UPDATE postgresql.conf to include/load pg_tde library -open my $conf, '>>', "$pgdata/postgresql.conf"; -print $conf "shared_preload_libraries = 'pg_tde'\n"; -close $conf; - -# Start server -my $rt_value = $node->start; -ok($rt_value == 1, "Start Server"); - -# CREATE EXTENSION IF NOT EXISTS and change out file permissions -my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS pg_tde;', extra_params => ['-a']); -ok($cmdret == 0, "CREATE PGTDE EXTENSION"); -PGTDE::append_to_file($stdout); - - -$rt_value = $node->psql('postgres', 'CREATE TABLE test_enc(id SERIAL,k INTEGER,PRIMARY KEY (id)) USING tde_heap;', extra_params => ['-a']); -ok($rt_value == 3, "Failing query"); - - -# Restart the server -PGTDE::append_to_file("-- server restart"); -$node->stop(); - -$rt_value = $node->start(); -ok($rt_value == 1, "Restart Server"); - -$rt_value = $node->psql('postgres', "SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per');", extra_params => ['-a']); -$rt_value = $node->psql('postgres', "SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault');", extra_params => ['-a']); - - - -######################### test_enc1 (simple create table w tde_heap) - - -$stdout = $node->safe_psql('postgres', 'CREATE TABLE test_enc1(id SERIAL,k VARCHAR(32),PRIMARY KEY (id)) USING tde_heap;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'INSERT INTO test_enc1 (k) VALUES (\'foobar\'),(\'barfoo\');', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc1 ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -######################### test_enc2 (create heap + alter to tde_heap) - -$stdout = $node->safe_psql('postgres', 'CREATE TABLE test_enc2(id SERIAL,k VARCHAR(32),PRIMARY KEY (id));', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'INSERT INTO test_enc2 (k) VALUES (\'foobar\'),(\'barfoo\');', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'ALTER TABLE test_enc2 SET ACCESS METHOD tde_heap;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc2 ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -######################### test_enc3 (default_table_access_method) - -$stdout = $node->safe_psql('postgres', 'SET default_table_access_method = "tde_heap"; CREATE TABLE test_enc3(id SERIAL,k VARCHAR(32),PRIMARY KEY (id));', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'INSERT INTO test_enc3 (k) VALUES (\'foobar\'),(\'barfoo\');', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc3 ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -######################### test_enc4 (create heap + alter default) - -$stdout = $node->safe_psql('postgres', 'CREATE TABLE test_enc4(id SERIAL,k VARCHAR(32),PRIMARY KEY (id)) USING heap;', extra_params => ['-a']); - -$stdout = $node->safe_psql('postgres', 'INSERT INTO test_enc4 (k) VALUES (\'foobar\'),(\'barfoo\');', extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', 'SET default_table_access_method = "tde_heap"; ALTER TABLE test_enc4 SET ACCESS METHOD DEFAULT;', extra_params => ['-a']); - -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc4 ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - - -######################### test_enc5 (create tde_heap + truncate) - -$stdout = $node->safe_psql('postgres', 'CREATE TABLE test_enc5(id SERIAL,k VARCHAR(32),PRIMARY KEY (id)) USING tde_heap;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'INSERT INTO test_enc5 (k) VALUES (\'foobar\'),(\'barfoo\');', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'CHECKPOINT;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'TRUNCATE test_enc5;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'INSERT INTO test_enc5 (k) VALUES (\'foobar\'),(\'barfoo\');', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc5 ORDER BY id ASC;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Restart the server -PGTDE::append_to_file("-- server restart"); -$rt_value = $node->stop(); -$rt_value = $node->start(); - -sub verify_table -{ - PGTDE::append_to_file('###########################'); - - my ($table) = @_; - - my $tablefile = $node->safe_psql('postgres', 'SHOW data_directory;'); - $tablefile .= '/'; - $tablefile .= $node->safe_psql('postgres', 'SELECT pg_relation_filepath(\''.$table.'\');'); - - $stdout = $node->safe_psql('postgres', 'SELECT * FROM ' . $table . ' ORDER BY id ASC;', extra_params => ['-a']); - PGTDE::append_to_file($stdout); - - my $strings = 'TABLEFILE FOR ' . $table . ' FOUND: '; - $strings .= `(ls $tablefile >/dev/null && echo -n yes) || echo -n no`; - PGTDE::append_to_file($strings); - - $strings = 'CONTAINS FOO (should be empty): '; - $strings .= `strings $tablefile | grep foo`; - PGTDE::append_to_file($strings); -} - -verify_table('test_enc1'); -verify_table('test_enc2'); -verify_table('test_enc3'); -verify_table('test_enc4'); -verify_table('test_enc5'); - -# Verify that we can't see the data in the file -my $tablefile2 = $node->safe_psql('postgres', 'SHOW data_directory;'); -$tablefile2 .= '/'; -$tablefile2 .= $node->safe_psql('postgres', 'SELECT pg_relation_filepath(\'test_enc2\');'); - -my $strings = 'TABLEFILE2 FOUND: '; -$strings .= `(ls $tablefile2 >/dev/null && echo yes) || echo no`; -PGTDE::append_to_file($strings); - -$strings = 'CONTAINS FOO (should be empty): '; -$strings .= `strings $tablefile2 | grep foo`; -PGTDE::append_to_file($strings); - - - - -# Verify that we can't see the data in the file -my $tablefile3 = $node->safe_psql('postgres', 'SHOW data_directory;'); -$tablefile3 .= '/'; -$tablefile3 .= $node->safe_psql('postgres', 'SELECT pg_relation_filepath(\'test_enc3\');'); - -$strings = 'TABLEFILE3 FOUND: '; -$strings .= `(ls $tablefile3 >/dev/null && echo yes) || echo no`; -PGTDE::append_to_file($strings); - -$strings = 'CONTAINS FOO (should be empty): '; -$strings .= `strings $tablefile3 | grep foo`; -PGTDE::append_to_file($strings); - - - - -# Verify that we can't see the data in the file -my $tablefile4 = $node->safe_psql('postgres', 'SHOW data_directory;'); -$tablefile4 .= '/'; -$tablefile4 .= $node->safe_psql('postgres', 'SELECT pg_relation_filepath(\'test_enc4\');'); - -$strings = 'TABLEFILE4 FOUND: '; -$strings .= `(ls $tablefile4 >/dev/null && echo yes) || echo no`; -PGTDE::append_to_file($strings); - -$strings = 'CONTAINS FOO (should be empty): '; -$strings .= `strings $tablefile4 | grep foo`; -PGTDE::append_to_file($strings); - - - -$stdout = $node->safe_psql('postgres', 'DROP TABLE test_enc1;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'DROP TABLE test_enc2;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'DROP TABLE test_enc3;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'DROP TABLE test_enc4;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'DROP TABLE test_enc5;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# DROP EXTENSION -$stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_tde;', extra_params => ['-a']); -ok($cmdret == 0, "DROP PGTDE EXTENSION"); -PGTDE::append_to_file($stdout); -# Stop the server -$node->stop(); - -# compare the expected and out file -my $compare = PGTDE->compare_results(); - -# Test/check if expected and result/out file match. If Yes, test passes. -is($compare,0,"Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files."); - -# Done testing for this testcase file. -done_testing(); diff --git a/contrib/pg_tde/t/008_key_rotate_tablespace.pl b/contrib/pg_tde/t/008_key_rotate_tablespace.pl deleted file mode 100644 index c540276985b6a..0000000000000 --- a/contrib/pg_tde/t/008_key_rotate_tablespace.pl +++ /dev/null @@ -1,96 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; -use File::Basename; -use File::Compare; -use File::Copy; -use Test::More; -use lib 't'; -use pgtde; - -# Get file name and CREATE out file name and dirs WHERE requried -PGTDE::setup_files_dir(basename($0)); - -my ($cmdret, $stdout); - -# CREATE new PostgreSQL node and do initdb -my $node = PGTDE->pgtde_init_pg(); -my $pgdata = $node->data_dir; - -# UPDATE postgresql.conf to include/load pg_tde library -open my $conf, '>>', "$pgdata/postgresql.conf"; -print $conf "shared_preload_libraries = 'pg_tde'\n"; -close $conf; - -# Start server -my $rt_value = $node->start; -ok($rt_value == 1, "Start Server"); - -$node->safe_psql('postgres', - q{ -SET allow_in_place_tablespaces = true; -CREATE TABLESPACE test_tblspace LOCATION ''; -CREATE DATABASE tbc TABLESPACE = test_tblspace; -}); - -$stdout = $node->safe_psql('tbc', - q{ -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); - -CREATE TABLE country_table ( - country_id serial primary key, - country_name text unique not null, - continent text not null -) USING tde_heap; - -INSERT INTO country_table (country_name, continent) - VALUES ('Japan', 'Asia'), - ('UK', 'Europe'), - ('USA', 'North America'); - -SELECT * FROM country_table; - -}, extra_params => ['-a']); -PGTDE::append_to_file($stdout); - - -$cmdret = $node->psql('tbc', "SELECT pg_tde_set_principal_key('new-k', 'file-vault');", extra_params => ['-a']); -ok($cmdret == 0, "ROTATE KEY"); -PGTDE::append_to_file($stdout); - -# Restart the server -PGTDE::append_to_file("-- server restart"); -$node->stop(); - -$rt_value = $node->start(); -ok($rt_value == 1, "Restart Server"); - -$stdout = $node->safe_psql('tbc', 'SELECT * FROM country_table;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - - -# DROP EXTENSION -$stdout = $node->safe_psql('tbc', 'DROP EXTENSION pg_tde CASCADE;', extra_params => ['-a']); -ok($cmdret == 0, "DROP PGTDE EXTENSION"); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', q{ -DROP DATABASE tbc; -DROP TABLESPACE test_tblspace; -}, extra_params => ['-a']); -ok($cmdret == 0, "DROP DATABSE"); -PGTDE::append_to_file($stdout); -# Stop the server -$node->stop(); - -# compare the expected and out file -my $compare = PGTDE->compare_results(); - -# Test/check if expected and result/out file match. If Yes, test passes. -is($compare,0,"Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files."); - -# Done testing for this testcase file. -done_testing(); diff --git a/contrib/pg_tde/t/009_wal_encrypt.pl b/contrib/pg_tde/t/009_wal_encrypt.pl deleted file mode 100644 index 77e9633ca41f5..0000000000000 --- a/contrib/pg_tde/t/009_wal_encrypt.pl +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; -use File::Basename; -use File::Compare; -use File::Copy; -use Test::More; -use lib 't'; -use pgtde; - -# Get file name and CREATE out file name and dirs WHERE requried -PGTDE::setup_files_dir(basename($0)); - -# CREATE new PostgreSQL node and do initdb -my $node = PGTDE->pgtde_init_pg(); -my $pgdata = $node->data_dir; - -# UPDATE postgresql.conf to include/load pg_tde library -open my $conf, '>>', "$pgdata/postgresql.conf"; -print $conf "shared_preload_libraries = 'pg_tde'\n"; -# NOT testing that it can't start: the test framework doesn't have an easy way to do this -# print $conf "pg_tde.wal_encrypt = 1\n"; -close $conf; - -my $rt_value = $node->start; -ok($rt_value == 1, "Start Server"); - -my $stdout = $node->safe_psql('postgres', "CREATE EXTENSION IF NOT EXISTS pg_tde;", extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_add_global_key_provider_file('file-keyring-010','/tmp/pg_tde_test_keyring010.per');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_set_server_principal_key('global-db-principal-key', 'file-keyring-010');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Restart the server, it should work with encryption now -PGTDE::append_to_file("-- server restart with wal encryption"); -$node->stop(); - -open $conf, '>>', "$pgdata/postgresql.conf"; -print $conf "pg_tde.wal_encrypt = 1\n"; -close $conf; - -$rt_value = $node->start(); -ok($rt_value == 1, "Restart Server"); - -$stdout = $node->safe_psql('postgres', "SHOW pg_tde.wal_encrypt;", extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'CREATE TABLE test_wal(id SERIAL,k INTEGER,PRIMARY KEY (id));', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'CHECKPOINT;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# TODO: add WAL content testing after the wal rework - -# DROP EXTENSION -$stdout = $node->safe_psql('postgres', 'DROP EXTENSION pg_tde;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); -# Stop the server -$node->stop(); - -# compare the expected and out file -my $compare = PGTDE->compare_results(); - -# Test/check if expected and result/out file match. If Yes, test passes. -is($compare,0,"Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files."); - -# Done testing for this testcase file. -done_testing(); diff --git a/contrib/pg_tde/t/010_change_key_provider.pl b/contrib/pg_tde/t/010_change_key_provider.pl deleted file mode 100644 index c7add5bb551bf..0000000000000 --- a/contrib/pg_tde/t/010_change_key_provider.pl +++ /dev/null @@ -1,209 +0,0 @@ -#!/usr/bin/perl - -use strict; -use warnings; -use File::Basename; -use File::Compare; -use File::Copy; -use Test::More; -use lib 't'; -use pgtde; - -# Get file name and CREATE out file name and dirs WHERE requried -PGTDE::setup_files_dir(basename($0)); - -# CREATE new PostgreSQL node and do initdb -my $node = PGTDE->pgtde_init_pg(); -my $pgdata = $node->data_dir; - -# UPDATE postgresql.conf to include/load pg_tde library -open my $conf, '>>', "$pgdata/postgresql.conf"; -print $conf "shared_preload_libraries = 'pg_tde'\n"; -close $conf; - -unlink('/tmp/change_key_provider_1.per'); -unlink('/tmp/change_key_provider_2.per'); -unlink('/tmp/change_key_provider_3.per'); -unlink('/tmp/change_key_provider_4.per'); - -# Start server -my $rt_value = $node->start; -ok($rt_value == 1, "Start Server"); - -# CREATE EXTENSION IF NOT EXISTS and change out file permissions -my ($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS pg_tde;', extra_params => ['-a']); -ok($cmdret == 0, "CREATE PGTDE EXTENSION"); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_add_key_provider_file('file-vault', '/tmp/change_key_provider_1.per');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_list_all_key_providers();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_set_principal_key('test-key', 'file-vault');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'CREATE TABLE test_enc (id serial, k integer, PRIMARY KEY (id)) USING tde_heap;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', 'INSERT INTO test_enc (k) VALUES (5), (6);', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_verify_principal_key();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_is_encrypted('test_enc');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc ORDER BY id;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Change provider and move file -PGTDE::append_to_file("-- mv /tmp/change_key_provider_1.per /tmp/change_key_provider_2.per"); -move('/tmp/change_key_provider_1.per', '/tmp/change_key_provider_2.per'); -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_change_key_provider_file('file-vault', '/tmp/change_key_provider_2.per');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_list_all_key_providers();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_verify_principal_key();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_is_encrypted('test_enc');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc ORDER BY id;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Restart the server -PGTDE::append_to_file("-- server restart"); -$rt_value = $node->stop(); -$rt_value = $node->start(); - -# Verify -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_verify_principal_key();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_is_encrypted('test_enc');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc ORDER BY id;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Change provider and do not move file -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_change_key_provider_file('file-vault', '/tmp/change_key_provider_3.per');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_list_all_key_providers();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -(undef, $stdout, $stderr) = $node->psql('postgres', "SELECT pg_tde_verify_principal_key();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -PGTDE::append_to_file($stderr); -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_is_encrypted('test_enc');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc ORDER BY id;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Restart the server -PGTDE::append_to_file("-- server restart"); -$rt_value = $node->stop(); -$rt_value = $node->start(); - -# Verify -(undef, $stdout, $stderr) = $node->psql('postgres', "SELECT pg_tde_verify_principal_key();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -PGTDE::append_to_file($stderr); -(undef, $stdout, $stderr) = $node->psql('postgres', "SELECT pg_tde_is_encrypted('test_enc');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -PGTDE::append_to_file($stderr); -(undef, $stdout, $stderr) = $node->psql('postgres', 'SELECT * FROM test_enc ORDER BY id;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); -PGTDE::append_to_file($stderr); - -PGTDE::append_to_file("-- mv /tmp/change_key_provider_2.per /tmp/change_key_provider_3.per"); -move('/tmp/change_key_provider_2.per', '/tmp/change_key_provider_3.per'); - -# Restart the server -PGTDE::append_to_file("-- server restart"); -$rt_value = $node->stop(); -$rt_value = $node->start(); - -# Verify -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_verify_principal_key();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_is_encrypted('test_enc');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc ORDER BY id;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# DROP EXTENSION -(undef, $stdout, $stderr) = $node->psql('postgres', 'DROP EXTENSION pg_tde CASCADE;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); -PGTDE::append_to_file($stderr); - -# CREATE EXTENSION -($cmdret, $stdout, $stderr) = $node->psql('postgres', 'CREATE EXTENSION IF NOT EXISTS pg_tde;', extra_params => ['-a']); -ok($cmdret == 0, "CREATE PGTDE EXTENSION"); -PGTDE::append_to_file($stdout); - -# Change provider and generate a new principal key -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_add_key_provider_file('file-vault', '/tmp/change_key_provider_4.per');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->psql('postgres', "SELECT pg_tde_set_principal_key('test-key', 'file-vault');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', 'CREATE TABLE test_enc (id serial, k integer, PRIMARY KEY (id)) USING tde_heap;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', 'INSERT INTO test_enc (k) VALUES (5), (6);', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_verify_principal_key();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_is_encrypted('test_enc');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc ORDER BY id;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_change_key_provider_file('file-vault', '/tmp/change_key_provider_3.per');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Restart the server -PGTDE::append_to_file("-- server restart"); -$rt_value = $node->stop(); -$rt_value = $node->start(); - -# Verify -(undef, $stdout, $stderr) = $node->psql('postgres', "SELECT pg_tde_verify_principal_key();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -PGTDE::append_to_file($stderr); -(undef, $stdout, $stderr) = $node->psql('postgres', "SELECT pg_tde_is_encrypted('test_enc');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -PGTDE::append_to_file($stderr); -(undef, $stdout, $stderr) = $node->psql('postgres', 'SELECT * FROM test_enc ORDER BY id;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); -PGTDE::append_to_file($stderr); - -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_change_key_provider_file('file-vault', '/tmp/change_key_provider_4.per');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# Restart the server -PGTDE::append_to_file("-- server restart"); -$rt_value = $node->stop(); -$rt_value = $node->start(); - -# Verify -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_verify_principal_key();", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', "SELECT pg_tde_is_encrypted('test_enc');", extra_params => ['-a']); -PGTDE::append_to_file($stdout); -$stdout = $node->safe_psql('postgres', 'SELECT * FROM test_enc ORDER BY id;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); - -# DROP EXTENSION -(undef, $stdout, $stderr) = $node->psql('postgres', 'DROP EXTENSION pg_tde CASCADE;', extra_params => ['-a']); -PGTDE::append_to_file($stdout); -PGTDE::append_to_file($stderr); - -# Stop the server -$node->stop(); - -# compare the expected and out file -my $compare = PGTDE->compare_results(); - -# Test/check if expected and result/out file match. If Yes, test passes. -is($compare, 0, "Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files."); - -# Done testing for this testcase file. -done_testing(); diff --git a/contrib/pg_tde/t/2pc_replication.pl b/contrib/pg_tde/t/2pc_replication.pl new file mode 100644 index 0000000000000..aaaee5ad2f71d --- /dev/null +++ b/contrib/pg_tde/t/2pc_replication.pl @@ -0,0 +1,640 @@ + +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +# Tests dedicated to two-phase commit in recovery +use strict; +use warnings FATAL => 'all'; + +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +my $psql_out = ''; +my $psql_rc = ''; + +sub configure_and_reload +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + + my ($node, $parameter) = @_; + my $name = $node->name; + + $node->append_conf( + 'postgresql.conf', qq( + $parameter + )); + $node->psql('postgres', "SELECT pg_reload_conf()", stdout => \$psql_out); + is($psql_out, 't', "reload node $name with $parameter"); + return; +} + +unlink('/tmp/pg_global_keyring.file'); +unlink('/tmp/pg_local_keyring.file'); + +# Set up two nodes, which will alternately be primary and replication standby. + +# Setup london node +my $node_london = PostgreSQL::Test::Cluster->new("london"); +$node_london->init(allows_streaming => 1); +$node_london->append_conf( + 'postgresql.conf', qq( + max_prepared_transactions = 10 + log_checkpoints = true +)); +$node_london->append_conf('postgresql.conf', + "shared_preload_libraries = 'pg_tde'"); +$node_london->append_conf('postgresql.conf', + "default_table_access_method = 'tde_heap'"); +$node_london->start; + +# Create and enable tde extension +$node_london->safe_psql('postgres', 'CREATE EXTENSION IF NOT EXISTS pg_tde;'); +$node_london->safe_psql('postgres', + "SELECT pg_tde_add_global_key_provider_file('global_key_provider', '/tmp/pg_global_keyring.file');" +); +$node_london->safe_psql('postgres', + "SELECT pg_tde_create_key_using_global_key_provider('global_test_key', 'global_key_provider');" +); +$node_london->safe_psql('postgres', + "SELECT pg_tde_set_server_key_using_global_key_provider('global_test_key', 'global_key_provider');" +); +$node_london->safe_psql('postgres', + "SELECT pg_tde_add_database_key_provider_file('local_key_provider', '/tmp/pg_local_keyring.file');" +); +$node_london->safe_psql('postgres', + "SELECT pg_tde_create_key_using_database_key_provider('local_test_key', 'local_key_provider');" +); +$node_london->safe_psql('postgres', + "SELECT pg_tde_set_key_using_database_key_provider('local_test_key', 'local_key_provider');" +); + +$node_london->append_conf( + 'postgresql.conf', qq( + pg_tde.wal_encrypt = on + log_min_messages = DEBUG2 + )); + +$node_london->restart; + +# if ($WAL_ENCRYPTION eq 'on'){ +# enable_wal_encryption($node_london); +# } + +# $node_london->safe_psql('postgres', 'ALTER SYSTEM SET pg_tde.wal_encrypt = on;'); +$node_london->restart; + +my $backup_dir = $node_london->backup_dir . '/london_backup'; +mkdir $backup_dir or die "mkdir($backup_dir) failed: $!"; +PostgreSQL::Test::RecursiveCopy::copypath($node_london->data_dir . '/pg_tde', + $backup_dir . '/pg_tde'); + +$node_london->backup('london_backup'); + +# Setup paris node +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 + pg_tde.wal_encrypt = on +)); +$node_paris->start; + +# Switch to synchronous replication in both directions +configure_and_reload($node_london, "synchronous_standby_names = 'paris'"); +configure_and_reload($node_paris, "synchronous_standby_names = 'london'"); + +# Set up nonce names for current primary and standby nodes +note "Initially, london is primary and paris is standby"; +my ($cur_primary, $cur_standby) = ($node_london, $node_paris); +my $cur_primary_name = $cur_primary->name; + +# Create table we'll use in the test transactions +$cur_primary->psql('postgres', "CREATE TABLE t_009_tbl (id int, msg text)"); + +############################################################################### +# Check that we can commit and abort transaction after soft restart. +# Here checkpoint happens before shutdown and no WAL replay will occur at next +# startup. In this case postgres re-creates shared-memory state from twophase +# files. +############################################################################### + +$cur_primary->psql( + 'postgres', " + BEGIN; + INSERT INTO t_009_tbl VALUES (1, 'issued to ${cur_primary_name}'); + SAVEPOINT s1; + INSERT INTO t_009_tbl VALUES (2, 'issued to ${cur_primary_name}'); + PREPARE TRANSACTION 'xact_009_1'; + BEGIN; + INSERT INTO t_009_tbl VALUES (3, 'issued to ${cur_primary_name}'); + SAVEPOINT s1; + INSERT INTO t_009_tbl VALUES (4, 'issued to ${cur_primary_name}'); + PREPARE TRANSACTION 'xact_009_2';"); +$cur_primary->stop; +$cur_primary->start; + +$psql_rc = $cur_primary->psql('postgres', "COMMIT PREPARED 'xact_009_1'"); +is($psql_rc, '0', 'Commit prepared transaction after restart'); + +$psql_rc = $cur_primary->psql('postgres', "ROLLBACK PREPARED 'xact_009_2'"); +is($psql_rc, '0', 'Rollback prepared transaction after restart'); + +is( $cur_primary->safe_psql( + 'postgres', "SELECT pg_tde_is_encrypted('t_009_tbl');"), + 't', + "Table t_009_tbl is encrypted on primary"); + +############################################################################### +# Check that we can commit and abort after a hard restart. +# At next startup, WAL replay will re-create shared memory state for prepared +# transaction using dedicated WAL records. +############################################################################### + +$cur_primary->psql( + 'postgres', " + CHECKPOINT; + BEGIN; + INSERT INTO t_009_tbl VALUES (5, 'issued to ${cur_primary_name}'); + SAVEPOINT s1; + INSERT INTO t_009_tbl VALUES (6, 'issued to ${cur_primary_name}'); + PREPARE TRANSACTION 'xact_009_3'; + BEGIN; + INSERT INTO t_009_tbl VALUES (7, 'issued to ${cur_primary_name}'); + SAVEPOINT s1; + INSERT INTO t_009_tbl VALUES (8, 'issued to ${cur_primary_name}'); + PREPARE TRANSACTION 'xact_009_4';"); +$cur_primary->teardown_node; +$cur_primary->start; + +$psql_rc = $cur_primary->psql('postgres', "COMMIT PREPARED 'xact_009_3'"); +is($psql_rc, '0', 'Commit prepared transaction after teardown'); + +$psql_rc = $cur_primary->psql('postgres', "ROLLBACK PREPARED 'xact_009_4'"); +is($psql_rc, '0', 'Rollback prepared transaction after teardown'); + +is( $cur_primary->safe_psql( + 'postgres', "SELECT pg_tde_is_encrypted('t_009_tbl');"), + 't', + "Table t_009_tbl is encrypted on primary"); + +############################################################################### +# Check that WAL replay can handle several transactions with same GID name. +############################################################################### + +$cur_primary->psql( + 'postgres', " + CHECKPOINT; + BEGIN; + INSERT INTO t_009_tbl VALUES (9, 'issued to ${cur_primary_name}'); + SAVEPOINT s1; + INSERT INTO t_009_tbl VALUES (10, 'issued to ${cur_primary_name}'); + PREPARE TRANSACTION 'xact_009_5'; + COMMIT PREPARED 'xact_009_5'; + BEGIN; + INSERT INTO t_009_tbl VALUES (11, 'issued to ${cur_primary_name}'); + SAVEPOINT s1; + INSERT INTO t_009_tbl VALUES (12, 'issued to ${cur_primary_name}'); + PREPARE TRANSACTION 'xact_009_5';"); +$cur_primary->teardown_node; +$cur_primary->start; + +$psql_rc = $cur_primary->psql('postgres', "COMMIT PREPARED 'xact_009_5'"); +is($psql_rc, '0', 'Replay several transactions with same GID'); + +is( $cur_primary->safe_psql( + 'postgres', "SELECT pg_tde_is_encrypted('t_009_tbl');"), + 't', + "Table t_009_tbl is encrypted on primary"); + +############################################################################### +# Check that WAL replay cleans up its shared memory state and releases locks +# while replaying transaction commits. +############################################################################### + +$cur_primary->psql( + 'postgres', " + BEGIN; + INSERT INTO t_009_tbl VALUES (13, 'issued to ${cur_primary_name}'); + SAVEPOINT s1; + INSERT INTO t_009_tbl VALUES (14, 'issued to ${cur_primary_name}'); + PREPARE TRANSACTION 'xact_009_6'; + COMMIT PREPARED 'xact_009_6';"); +$cur_primary->teardown_node; +$cur_primary->start; +$psql_rc = $cur_primary->psql( + 'postgres', " + BEGIN; + INSERT INTO t_009_tbl VALUES (15, 'issued to ${cur_primary_name}'); + SAVEPOINT s1; + INSERT INTO t_009_tbl VALUES (16, 'issued to ${cur_primary_name}'); + -- This prepare can fail due to conflicting GID or locks conflicts if + -- replay did not fully cleanup its state on previous commit. + PREPARE TRANSACTION 'xact_009_7';"); +is($psql_rc, '0', "Cleanup of shared memory state for 2PC commit"); + +$cur_primary->psql('postgres', "COMMIT PREPARED 'xact_009_7'"); + +############################################################################### +# Check that WAL replay will cleanup its shared memory state on running standby. +############################################################################### + +$cur_primary->psql( + 'postgres', " + BEGIN; + INSERT INTO t_009_tbl VALUES (17, 'issued to ${cur_primary_name}'); + SAVEPOINT s1; + INSERT INTO t_009_tbl VALUES (18, 'issued to ${cur_primary_name}'); + PREPARE TRANSACTION 'xact_009_8'; + COMMIT PREPARED 'xact_009_8';"); +$cur_standby->psql( + 'postgres', + "SELECT count(*) FROM pg_prepared_xacts", + stdout => \$psql_out); +is($psql_out, '0', + "Cleanup of shared memory state on running standby without checkpoint"); + +############################################################################### +# Same as in previous case, but let's force checkpoint on standby between +# prepare and commit to use on-disk twophase files. +############################################################################### + +$cur_primary->psql( + 'postgres', " + BEGIN; + INSERT INTO t_009_tbl VALUES (19, 'issued to ${cur_primary_name}'); + SAVEPOINT s1; + INSERT INTO t_009_tbl VALUES (20, 'issued to ${cur_primary_name}'); + PREPARE TRANSACTION 'xact_009_9';"); +$cur_standby->psql('postgres', "CHECKPOINT"); +$cur_primary->psql('postgres', "COMMIT PREPARED 'xact_009_9'"); +$cur_standby->psql( + 'postgres', + "SELECT count(*) FROM pg_prepared_xacts", + stdout => \$psql_out); +is($psql_out, '0', + "Cleanup of shared memory state on running standby after checkpoint"); + +############################################################################### +# Check that prepared transactions can be committed on promoted standby. +############################################################################### + +$cur_primary->psql( + 'postgres', " + BEGIN; + INSERT INTO t_009_tbl VALUES (21, 'issued to ${cur_primary_name}'); + SAVEPOINT s1; + INSERT INTO t_009_tbl VALUES (22, 'issued to ${cur_primary_name}'); + PREPARE TRANSACTION 'xact_009_10';"); +$cur_primary->teardown_node; +$cur_standby->promote; + +# change roles +note "Now paris is primary and london is standby"; +($cur_primary, $cur_standby) = ($node_paris, $node_london); +$cur_primary_name = $cur_primary->name; + +# because london is not running at this point, we can't use syncrep commit +# on this command +$psql_rc = $cur_primary->psql('postgres', + "SET synchronous_commit = off; COMMIT PREPARED 'xact_009_10'"); +is($psql_rc, '0', "Restore of prepared transaction on promoted standby"); + +# restart old primary as new standby +$cur_standby->enable_streaming($cur_primary); +$cur_standby->start; + +############################################################################### +# Check that prepared transactions are replayed after soft restart of standby +# while primary is down. Since standby knows that primary is down it uses a +# different code path on startup to ensure that the status of transactions is +# consistent. +############################################################################### + +$cur_primary->psql( + 'postgres', " + BEGIN; + INSERT INTO t_009_tbl VALUES (23, 'issued to ${cur_primary_name}'); + SAVEPOINT s1; + INSERT INTO t_009_tbl VALUES (24, 'issued to ${cur_primary_name}'); + PREPARE TRANSACTION 'xact_009_11';"); +$cur_primary->stop; +$cur_standby->restart; +$cur_standby->promote; + +# change roles +note "Now london is primary and paris is standby"; +($cur_primary, $cur_standby) = ($node_london, $node_paris); +$cur_primary_name = $cur_primary->name; + +$cur_primary->psql( + 'postgres', + "SELECT count(*) FROM pg_prepared_xacts", + stdout => \$psql_out); +is($psql_out, '1', + "Restore prepared transactions from files with primary down"); + +# restart old primary as new standby +$cur_standby->enable_streaming($cur_primary); +$cur_standby->start; + +$cur_primary->psql('postgres', "COMMIT PREPARED 'xact_009_11'"); + +############################################################################### +# Check that prepared transactions are correctly replayed after standby hard +# restart while primary is down. +############################################################################### + +$cur_primary->psql( + 'postgres', " + BEGIN; + INSERT INTO t_009_tbl VALUES (25, 'issued to ${cur_primary_name}'); + SAVEPOINT s1; + INSERT INTO t_009_tbl VALUES (26, 'issued to ${cur_primary_name}'); + PREPARE TRANSACTION 'xact_009_12'; + "); +$cur_primary->stop; +$cur_standby->teardown_node; +$cur_standby->start; +$cur_standby->promote; + +# change roles +note "Now paris is primary and london is standby"; +($cur_primary, $cur_standby) = ($node_paris, $node_london); +$cur_primary_name = $cur_primary->name; + +$cur_primary->psql( + 'postgres', + "SELECT count(*) FROM pg_prepared_xacts", + stdout => \$psql_out); +is($psql_out, '1', + "Restore prepared transactions from records with primary down"); + +# restart old primary as new standby +$cur_standby->enable_streaming($cur_primary); +$cur_standby->start; + +$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. +############################################################################### + +$cur_primary->psql( + 'postgres', " + BEGIN; + CREATE TABLE t_009_tbl2 (id int, msg text); + SAVEPOINT s1; + INSERT INTO t_009_tbl2 VALUES (27, 'issued to ${cur_primary_name}'); + PREPARE TRANSACTION 'xact_009_13'; + -- checkpoint will issue XLOG_STANDBY_LOCK that can conflict with lock + -- held by 'create table' statement + CHECKPOINT; + COMMIT PREPARED 'xact_009_13';"); + +# Ensure that last transaction is replayed on standby. +my $cur_primary_lsn = + $cur_primary->safe_psql('postgres', "SELECT pg_current_wal_lsn()"); +my $caughtup_query = + "SELECT '$cur_primary_lsn'::pg_lsn <= pg_last_wal_replay_lsn()"; +$cur_standby->poll_query_until('postgres', $caughtup_query) + or die "Timed out while waiting for standby to catch up"; + +$cur_standby->psql( + 'postgres', + "SELECT count(*) FROM t_009_tbl2", + stdout => \$psql_out); +is($psql_out, '1', "Replay prepared transaction with DDL"); + +############################################################################### +# Check recovery of prepared transaction with DDL inside after a hard restart +# of the primary. +############################################################################### + +$cur_primary->psql( + 'postgres', " + BEGIN; + CREATE TABLE t_009_tbl3 (id int, msg text); + SAVEPOINT s1; + INSERT INTO t_009_tbl3 VALUES (28, 'issued to ${cur_primary_name}'); + PREPARE TRANSACTION 'xact_009_14'; + BEGIN; + CREATE TABLE t_009_tbl4 (id int, msg text); + SAVEPOINT s1; + INSERT INTO t_009_tbl4 VALUES (29, 'issued to ${cur_primary_name}'); + PREPARE TRANSACTION 'xact_009_15';"); + +$cur_primary->teardown_node; +$cur_primary->start; + +$psql_rc = $cur_primary->psql('postgres', "COMMIT PREPARED 'xact_009_14'"); +is($psql_rc, '0', 'Commit prepared transaction after teardown'); + +$psql_rc = $cur_primary->psql('postgres', "ROLLBACK PREPARED 'xact_009_15'"); +is($psql_rc, '0', 'Rollback prepared transaction after teardown'); + +############################################################################### +# Check recovery of prepared transaction with DDL inside after a soft restart +# of the primary. +############################################################################### + +$cur_primary->psql( + 'postgres', " + BEGIN; + CREATE TABLE t_009_tbl5 (id int, msg text); + SAVEPOINT s1; + INSERT INTO t_009_tbl5 VALUES (30, 'issued to ${cur_primary_name}'); + PREPARE TRANSACTION 'xact_009_16'; + BEGIN; + CREATE TABLE t_009_tbl6 (id int, msg text); + SAVEPOINT s1; + INSERT INTO t_009_tbl6 VALUES (31, 'issued to ${cur_primary_name}'); + PREPARE TRANSACTION 'xact_009_17';"); + +$cur_primary->stop; +$cur_primary->start; + +$psql_rc = $cur_primary->psql('postgres', "COMMIT PREPARED 'xact_009_16'"); +is($psql_rc, '0', 'Commit prepared transaction after restart'); + +$psql_rc = $cur_primary->psql('postgres', "ROLLBACK PREPARED 'xact_009_17'"); +is($psql_rc, '0', 'Rollback prepared transaction after restart'); + +############################################################################### +# Verify expected data appears on both servers. +############################################################################### + +$cur_primary->psql( + 'postgres', + "SELECT count(*) FROM pg_prepared_xacts", + stdout => \$psql_out); +is($psql_out, '0', "No uncommitted prepared transactions on primary"); + +$cur_primary->psql( + 'postgres', + "SELECT * FROM t_009_tbl ORDER BY id", + stdout => \$psql_out); +is( $psql_out, qq{1|issued to london +2|issued to london +5|issued to london +6|issued to london +9|issued to london +10|issued to london +11|issued to london +12|issued to london +13|issued to london +14|issued to london +15|issued to london +16|issued to london +17|issued to london +18|issued to london +19|issued to london +20|issued to london +21|issued to london +22|issued to london +23|issued to paris +24|issued to paris +25|issued to london +26|issued to london}, + "Check expected t_009_tbl data on primary"); + +$cur_primary->psql( + 'postgres', + "SELECT * FROM t_009_tbl2", + stdout => \$psql_out); +is( $psql_out, + qq{27|issued to paris}, + "Check expected t_009_tbl2 data on primary"); + +$cur_standby->psql( + 'postgres', + "SELECT count(*) FROM pg_prepared_xacts", + stdout => \$psql_out); +is($psql_out, '0', "No uncommitted prepared transactions on standby"); + +$cur_standby->psql( + 'postgres', + "SELECT * FROM t_009_tbl ORDER BY id", + stdout => \$psql_out); +is( $psql_out, qq{1|issued to london +2|issued to london +5|issued to london +6|issued to london +9|issued to london +10|issued to london +11|issued to london +12|issued to london +13|issued to london +14|issued to london +15|issued to london +16|issued to london +17|issued to london +18|issued to london +19|issued to london +20|issued to london +21|issued to london +22|issued to london +23|issued to paris +24|issued to paris +25|issued to london +26|issued to london}, + "Check expected t_009_tbl data on standby"); + +$cur_standby->psql( + 'postgres', + "SELECT * FROM t_009_tbl2", + stdout => \$psql_out); +is( $psql_out, + 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/contrib/pg_tde/t/RewindTest.pm b/contrib/pg_tde/t/RewindTest.pm new file mode 100644 index 0000000000000..2ddc013e9ed95 --- /dev/null +++ b/contrib/pg_tde/t/RewindTest.pm @@ -0,0 +1,419 @@ + +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +package RewindTest; + +# Test driver for pg_rewind. Each test consists of a cycle where a new cluster +# is first created with initdb, and a streaming replication standby is set up +# to follow the primary. Then the primary is shut down and the standby is +# promoted, and finally pg_rewind is used to rewind the old primary, using the +# standby as the source. +# +# To run a test, the test script (in t/ subdirectory) calls the functions +# in this module. These functions should be called in this sequence: +# +# 1. setup_cluster - creates a PostgreSQL cluster that runs as the primary +# +# 2. start_primary - starts the primary server +# +# 3. create_standby - runs pg_basebackup to initialize a standby server, and +# sets it up to follow the primary. +# +# 4. promote_standby - runs "pg_ctl promote" to promote the standby server. +# The old primary keeps running. +# +# 5. run_pg_rewind - stops the old primary (if it's still running) and runs +# pg_rewind to synchronize it with the now-promoted standby server. +# +# 6. clean_rewind_test - stops both servers used in the test, if they're +# still running. +# +# The test script can use the helper functions primary_psql and standby_psql +# to run psql against the primary and standby servers, respectively. + +use strict; +use warnings FATAL => 'all'; + +use Carp; +use Exporter 'import'; +use File::Basename; +use File::Copy; +use File::Path qw(rmtree); +use IPC::Run qw(run); +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::RecursiveCopy; +use PostgreSQL::Test::Utils; +use Test::More; +use pgtde; + +our @EXPORT = qw( + $node_primary + $node_standby + + primary_psql + standby_psql + check_query + + setup_cluster + start_primary + create_standby + promote_standby + run_pg_rewind + clean_rewind_test +); + +# Our nodes. +our $node_primary; +our $node_standby; + +sub primary_psql +{ + my $cmd = shift; + my $dbname = shift || 'postgres'; + + system_or_bail 'psql', '-q', '--no-psqlrc', '-d', + $node_primary->connstr($dbname), '-c', "$cmd"; + return; +} + +sub standby_psql +{ + my $cmd = shift; + my $dbname = shift || 'postgres'; + + system_or_bail 'psql', '-q', '--no-psqlrc', '-d', + $node_standby->connstr($dbname), '-c', "$cmd"; + return; +} + +# Run a query against the primary, and check that the output matches what's +# expected +sub check_query +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + + my ($query, $expected_stdout, $test_name) = @_; + my ($stdout, $stderr); + + # we want just the output, no formatting + my $result = run [ + 'psql', '-q', '-A', '-t', '--no-psqlrc', '-d', + $node_primary->connstr('postgres'), + '-c', $query + ], + '>', \$stdout, '2>', \$stderr; + + is($result, 1, "$test_name: psql exit code"); + is($stderr, '', "$test_name: psql no stderr"); + is($stdout, $expected_stdout, "$test_name: query result matches"); + + return; +} + +sub setup_cluster +{ + my $extra_name = shift; # Used to differentiate clusters + my $extra = shift; # Extra params for initdb + + my ($test_name) = basename($0) =~ /([^.]*)/; + my ($test_mode) = $extra_name //= 'default'; + my $tde_keyring_file = + "/tmp/pg_tde_rewind_test_${test_name}_${test_mode}.per"; + + unlink($tde_keyring_file); + + # Initialize primary, data checksums are mandatory + $node_primary = + PostgreSQL::Test::Cluster->new( + 'primary' . ($extra_name ? "_${extra_name}" : '')); + + # Set up pg_hba.conf and pg_ident.conf for the role running + # pg_rewind. This role is used for all the tests, and has + # minimal permissions enough to rewind from an online source. + $node_primary->init( + allows_streaming => 1, + extra => $extra, + auth_extra => [ '--create-role', 'rewind_user' ]); + + # Set wal_keep_size to prevent WAL segment recycling after enforced + # checkpoints in the tests. + $node_primary->append_conf( + 'postgresql.conf', qq( +wal_keep_size = 320MB +allow_in_place_tablespaces = on + +shared_preload_libraries = 'pg_tde' +)); + + $node_primary->start; + + $node_primary->safe_psql('postgres', + "CREATE EXTENSION IF NOT EXISTS pg_tde;"); + $node_primary->safe_psql('postgres', + "SELECT pg_tde_add_global_key_provider_file('file-keyring-wal','${tde_keyring_file}');" + ); + $node_primary->safe_psql('postgres', + "SELECT pg_tde_create_key_using_global_key_provider('global-db-principal-key', 'file-keyring-wal');" + ); + $node_primary->safe_psql('postgres', + "SELECT pg_tde_set_server_key_using_global_key_provider('global-db-principal-key', 'file-keyring-wal');" + ); + + $node_primary->append_conf( + 'postgresql.conf', q{ +pg_tde.wal_encrypt = on +}); + + $node_primary->stop; + + return; +} + +sub start_primary +{ + $node_primary->start; + + # Create custom role which is used to run pg_rewind, and adjust its + # permissions to the minimum necessary. + $node_primary->safe_psql( + 'postgres', " + CREATE ROLE rewind_user LOGIN; + GRANT EXECUTE ON function pg_catalog.pg_ls_dir(text, boolean, boolean) + TO rewind_user; + GRANT EXECUTE ON function pg_catalog.pg_stat_file(text, boolean) + TO rewind_user; + GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text) + TO rewind_user; + GRANT EXECUTE ON function pg_catalog.pg_read_binary_file(text, bigint, bigint, boolean) + TO rewind_user;"); + + #### Now run the test-specific parts to initialize the primary before setting + # up standby + + return; +} + +sub create_standby +{ + my $extra_name = shift; + + $node_standby = + PostgreSQL::Test::Cluster->new( + 'standby' . ($extra_name ? "_${extra_name}" : '')); + PGTDE::backup($node_primary, 'my_backup'); + $node_standby->init_from_backup($node_primary, 'my_backup'); + my $connstr_primary = $node_primary->connstr(); + + $node_standby->append_conf( + "postgresql.conf", qq( +primary_conninfo='$connstr_primary' +)); + + $node_standby->set_standby_mode(); + + # Start standby + $node_standby->start; + + # The standby may have WAL to apply before it matches the primary. That + # is fine, because no test examines the standby before promotion. + + return; +} + +sub promote_standby +{ + #### Now run the test-specific parts to run after standby has been started + # up standby + + # Wait for the standby to receive and write all WAL. + $node_primary->wait_for_catchup($node_standby, 'write'); + + # Now promote standby and insert some new data on primary, this will put + # the primary out-of-sync with the standby. + $node_standby->promote; + + return; +} + +sub run_pg_rewind +{ + my $test_mode = shift; + my $primary_pgdata = $node_primary->data_dir; + my $standby_pgdata = $node_standby->data_dir; + my $standby_connstr = $node_standby->connstr('postgres'); + my $tmp_folder = PostgreSQL::Test::Utils::tempdir; + + # Append the rewind-specific role to the connection string. + $standby_connstr = "$standby_connstr user=rewind_user"; + + if ($test_mode eq 'archive') + { + # pg_rewind is tested with --restore-target-wal by moving all + # WAL files to a secondary location. Note that this leads to + # a failure in ensureCleanShutdown(), forcing to the use of + # --no-ensure-shutdown in this mode as the initial set of WAL + # files needed to ensure a clean restart is gone. This could + # be improved by keeping around only a minimum set of WAL + # segments but that would just make the test more costly, + # without improving the coverage. Hence, instead, stop + # gracefully the primary here. + $node_primary->stop; + } + else + { + # Stop the primary and be ready to perform the rewind. The cluster + # needs recovery to finish once, and pg_rewind makes sure that it + # happens automatically. + $node_primary->stop('immediate'); + } + + # At this point, the rewind processing is ready to run. + # We now have a very simple scenario with a few diverged WAL record. + # The real testing begins really now with a bifurcation of the possible + # scenarios that pg_rewind supports. + + # Keep a temporary postgresql.conf for primary node or it would be + # overwritten during the rewind. + copy( + "$primary_pgdata/postgresql.conf", + "$tmp_folder/primary-postgresql.conf.tmp"); + + # Now run pg_rewind + if ($test_mode eq "local") + { + + # Do rewind using a local pgdata as source + # Stop the primary and be ready to perform the rewind + $node_standby->stop; + command_ok( + [ + 'pg_rewind', + "--debug", + "--source-pgdata=$standby_pgdata", + "--target-pgdata=$primary_pgdata", + "--no-sync", + "--config-file", + "$tmp_folder/primary-postgresql.conf.tmp" + ], + 'pg_rewind local'); + } + elsif ($test_mode eq "remote") + { + # Do rewind using a remote connection as source, generating + # recovery configuration automatically. + command_ok( + [ + 'pg_rewind', "--debug", + "--source-server", $standby_connstr, + "--target-pgdata=$primary_pgdata", "--no-sync", + "--write-recovery-conf", "--config-file", + "$tmp_folder/primary-postgresql.conf.tmp" + ], + 'pg_rewind remote'); + + # Check that standby.signal is here as recovery configuration + # was requested. + ok( -e "$primary_pgdata/standby.signal", + 'standby.signal created after pg_rewind'); + + # Now, when pg_rewind apparently succeeded with minimal permissions, + # add REPLICATION privilege. So we could test that new standby + # is able to connect to the new primary with generated config. + $node_standby->safe_psql('postgres', + "ALTER ROLE rewind_user WITH REPLICATION;"); + } + elsif ($test_mode eq "archive") + { + + # Do rewind using a local pgdata as source and specified + # directory with target WAL archive. The old primary has + # to be stopped at this point. + + # Remove the existing archive directory and move all WAL + # segments from the old primary to the archives. These + # will be used by pg_rewind. + rmtree($node_primary->archive_dir); + PostgreSQL::Test::RecursiveCopy::copypath( + $node_primary->data_dir . "/pg_wal", + $node_primary->archive_dir); + + # Fast way to remove entire directory content + rmtree($node_primary->data_dir . "/pg_wal"); + mkdir($node_primary->data_dir . "/pg_wal"); + + # Make sure that directories have the right umask as this is + # required by a follow-up check on permissions, and better + # safe than sorry. + chmod(0700, $node_primary->archive_dir) 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); + + # Stop the new primary and be ready to perform the rewind. + $node_standby->stop; + + # Note the use of --no-ensure-shutdown here. WAL files are + # gone in this mode and the primary has been stopped + # gracefully already. --config-file reuses the original + # postgresql.conf as restore_command has been enabled above. + command_ok( + [ + 'pg_rewind', + "--debug", + "--source-pgdata=$standby_pgdata", + "--target-pgdata=$primary_pgdata", + "--no-sync", + "--no-ensure-shutdown", + "--restore-target-wal", + "--config-file", + "$primary_pgdata/postgresql.conf" + ], + 'pg_rewind archive'); + } + else + { + + # Cannot come here normally + croak("Incorrect test mode specified"); + } + + # Now move back postgresql.conf with old settings + move( + "$tmp_folder/primary-postgresql.conf.tmp", + "$primary_pgdata/postgresql.conf"); + + chmod( + $node_primary->group_access() ? 0640 : 0600, + "$primary_pgdata/postgresql.conf") + or BAIL_OUT( + "unable to set permissions for $primary_pgdata/postgresql.conf"); + + # Plug-in rewound node to the now-promoted standby node + if ($test_mode ne "remote") + { + my $port_standby = $node_standby->port; + $node_primary->append_conf( + 'postgresql.conf', qq( +primary_conninfo='port=$port_standby')); + + $node_primary->set_standby_mode(); + } + + # Restart the primary to check that rewind went correctly + $node_primary->start; + + #### Now run the test-specific parts to check the result + + return; +} + +# Clean up after the test. Stop both servers, if they're still running. +sub clean_rewind_test +{ + $node_primary->teardown_node if defined $node_primary; + $node_standby->teardown_node if defined $node_standby; + return; +} + +1; diff --git a/contrib/pg_tde/t/basic.pl b/contrib/pg_tde/t/basic.pl new file mode 100644 index 0000000000000..54d19e43f179e --- /dev/null +++ b/contrib/pg_tde/t/basic.pl @@ -0,0 +1,101 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use File::Basename; +use Test::More; +use lib 't'; +use pgtde; + +PGTDE::setup_files_dir(basename($0)); + +unlink('/tmp/pg_tde_test_001_basic.per'); + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->append_conf('postgresql.conf', "shared_preload_libraries = 'pg_tde'"); +$node->start; + +PGTDE::psql($node, 'postgres', 'CREATE EXTENSION pg_tde;'); + +# Only whitelisted C or security definer functions are granted to public by default +PGTDE::psql( + $node, 'postgres', + q{ + SELECT + pg_proc.oid::regprocedure + FROM + pg_catalog.pg_proc + JOIN pg_catalog.pg_language ON prolang = pg_language.oid + LEFT JOIN LATERAL aclexplode(proacl) ON TRUE + WHERE + proname LIKE 'pg_tde%' AND + (lanname = 'c' OR prosecdef) AND + (grantee IS NULL OR grantee = 0) + ORDER BY pg_proc.oid::regprocedure::text; + }); + +PGTDE::psql($node, 'postgres', + "SELECT extname, extversion FROM pg_extension WHERE extname = 'pg_tde';"); + +PGTDE::psql($node, 'postgres', + 'CREATE TABLE test_enc (id SERIAL, k INTEGER, PRIMARY KEY (id)) USING tde_heap;' +); + +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_add_database_key_provider_file('file-vault', '/tmp/pg_tde_test_001_basic.per');" +); + +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_create_key_using_database_key_provider('test-db-key', 'file-vault');" +); + +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_key_using_database_key_provider('test-db-key', 'file-vault');" +); + +PGTDE::psql($node, 'postgres', + 'CREATE TABLE test_enc (id SERIAL, k VARCHAR(32), PRIMARY KEY (id)) USING tde_heap;' +); + +PGTDE::psql($node, 'postgres', + "INSERT INTO test_enc (k) VALUES ('foobar'), ('barfoo');"); + +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc ORDER BY id;'); + +PGTDE::append_to_result_file("-- server restart"); +$node->restart; + +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc ORDER BY id;'); + +# Verify that we can't see the data in the file +my $tablefile = $node->data_dir . '/' + . $node->safe_psql('postgres', "SELECT pg_relation_filepath('test_enc');"); + +PGTDE::append_to_result_file( + 'TABLEFILE FOUND: ' . (-f $tablefile ? 'yes' : 'no')); + +my $strings = 'CONTAINS FOO (should be empty): '; +$strings .= `strings $tablefile | grep foo`; +PGTDE::append_to_result_file($strings); + + +# An encrypted table can be dropped even if we don't have access to the principal key. +$node->stop; +unlink('/tmp/pg_tde_test_001_basic.per'); +$node->start; +PGTDE::psql($node, 'postgres', 'SELECT pg_tde_verify_key()'); +PGTDE::psql($node, 'postgres', 'DROP TABLE test_enc;'); + +PGTDE::psql($node, 'postgres', 'DROP EXTENSION pg_tde;'); + +$node->stop; + +# Compare the expected and out file +my $compare = PGTDE->compare_results(); + +is($compare, 0, + "Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files." +); + +done_testing(); diff --git a/contrib/pg_tde/t/change_key_provider.pl b/contrib/pg_tde/t/change_key_provider.pl new file mode 100644 index 0000000000000..1ffff0483efbe --- /dev/null +++ b/contrib/pg_tde/t/change_key_provider.pl @@ -0,0 +1,98 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use File::Basename; +use File::Copy; +use Test::More; +use lib 't'; +use pgtde; + +PGTDE::setup_files_dir(basename($0)); + +unlink('/tmp/change_key_provider_1.per'); +unlink('/tmp/change_key_provider_2.per'); + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->append_conf('postgresql.conf', "shared_preload_libraries = 'pg_tde'"); +$node->start; + +PGTDE::psql($node, 'postgres', 'CREATE EXTENSION pg_tde;'); + +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_add_database_key_provider_file('file-vault', '/tmp/change_key_provider_1.per');" +); +PGTDE::psql($node, 'postgres', + "SELECT * FROM pg_tde_list_all_database_key_providers();"); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_create_key_using_database_key_provider('test-key', 'file-vault');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_key_using_database_key_provider('test-key', 'file-vault');" +); + +PGTDE::psql($node, 'postgres', + 'CREATE TABLE test_enc (id serial, k integer, PRIMARY KEY (id)) USING tde_heap;' +); +PGTDE::psql($node, 'postgres', 'INSERT INTO test_enc (k) VALUES (5), (6);'); + +PGTDE::psql($node, 'postgres', "SELECT pg_tde_verify_key();"); +PGTDE::psql($node, 'postgres', "SELECT pg_tde_is_encrypted('test_enc');"); +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc ORDER BY id;'); + +# Change provider and move file +PGTDE::append_to_result_file( + "-- mv /tmp/change_key_provider_1.per /tmp/change_key_provider_2.per"); +move('/tmp/change_key_provider_1.per', '/tmp/change_key_provider_2.per'); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_change_database_key_provider_file('file-vault', '/tmp/change_key_provider_2.per');" +); +PGTDE::psql($node, 'postgres', + "SELECT * FROM pg_tde_list_all_database_key_providers();"); + +PGTDE::psql($node, 'postgres', "SELECT pg_tde_verify_key();"); +PGTDE::psql($node, 'postgres', "SELECT pg_tde_is_encrypted('test_enc');"); +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc ORDER BY id;'); + +PGTDE::append_to_result_file("-- server restart"); +$node->restart; + +PGTDE::psql($node, 'postgres', "SELECT pg_tde_verify_key();"); +PGTDE::psql($node, 'postgres', "SELECT pg_tde_is_encrypted('test_enc');"); +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc ORDER BY id;'); + +# Move file, restart and then change provider +PGTDE::append_to_result_file( + "-- mv /tmp/change_key_provider_2.per /tmp/change_key_provider_1.per"); +move('/tmp/change_key_provider_2.per', '/tmp/change_key_provider_1.per'); + +PGTDE::append_to_result_file("-- server restart"); +$node->restart; + +PGTDE::psql($node, 'postgres', "SELECT pg_tde_verify_key();"); +PGTDE::psql($node, 'postgres', "SELECT pg_tde_is_encrypted('test_enc');"); +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc ORDER BY id;'); + +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_change_database_key_provider_file('file-vault', '/tmp/change_key_provider_1.per');" +); +PGTDE::psql($node, 'postgres', + "SELECT * FROM pg_tde_list_all_database_key_providers();"); + +PGTDE::psql($node, 'postgres', "SELECT pg_tde_verify_key();"); +PGTDE::psql($node, 'postgres', "SELECT pg_tde_is_encrypted('test_enc');"); +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc ORDER BY id;'); + +PGTDE::psql($node, 'postgres', 'DROP EXTENSION pg_tde CASCADE;'); + +$node->stop; + +# Compare the expected and out file +my $compare = PGTDE->compare_results(); + +is($compare, 0, + "Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files." +); + +done_testing(); diff --git a/contrib/pg_tde/t/crash_recovery.pl b/contrib/pg_tde/t/crash_recovery.pl new file mode 100644 index 0000000000000..4fa2ea2d3ef3f --- /dev/null +++ b/contrib/pg_tde/t/crash_recovery.pl @@ -0,0 +1,124 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use File::Basename; +use Test::More; +use lib 't'; +use pgtde; + +PGTDE::setup_files_dir(basename($0)); + +unlink('/tmp/crash_recovery.per'); + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->append_conf( + 'postgresql.conf', q{ +checkpoint_timeout = 1h +shared_preload_libraries = 'pg_tde' +}); +$node->start; + +PGTDE::psql($node, 'postgres', 'CREATE EXTENSION pg_tde;'); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_add_global_key_provider_file('global_keyring', '/tmp/crash_recovery.per');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_create_key_using_global_key_provider('wal_encryption_key', 'global_keyring');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_server_key_using_global_key_provider('wal_encryption_key', 'global_keyring');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_add_database_key_provider_file('db_keyring', '/tmp/crash_recovery.per');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_create_key_using_database_key_provider('db_key', 'db_keyring');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_key_using_database_key_provider('db_key', 'db_keyring');" +); + +PGTDE::psql($node, 'postgres', + "CREATE TABLE test_enc (x int PRIMARY KEY) USING tde_heap;"); +PGTDE::psql($node, 'postgres', "INSERT INTO test_enc (x) VALUES (1), (2);"); + +PGTDE::psql($node, 'postgres', + "CREATE TABLE test_plain (x int PRIMARY KEY) USING heap;"); +PGTDE::psql($node, 'postgres', "INSERT INTO test_plain (x) VALUES (3), (4);"); + +PGTDE::psql($node, 'postgres', "ALTER SYSTEM SET pg_tde.wal_encrypt = 'on';"); + +PGTDE::append_to_result_file("-- kill -9"); +$node->kill9; + +PGTDE::append_to_result_file("-- server start"); +PGTDE::poll_start($node); + +PGTDE::append_to_result_file("-- rotate wal key"); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_create_key_using_global_key_provider('wal_encryption_key_1', 'global_keyring');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_server_key_using_global_key_provider('wal_encryption_key_1', 'global_keyring');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_create_key_using_database_key_provider('db_key_1', 'db_keyring');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_key_using_database_key_provider('db_key_1', 'db_keyring');" +); +PGTDE::psql($node, 'postgres', "INSERT INTO test_enc (x) VALUES (3), (4);"); +PGTDE::append_to_result_file("-- kill -9"); +$node->kill9; +PGTDE::append_to_result_file("-- server start"); +PGTDE::append_to_result_file( + "-- check that pg_tde_save_principal_key_redo hasn't destroyed a WAL key created during the server start" +); +PGTDE::poll_start($node); + +PGTDE::append_to_result_file("-- rotate wal key"); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_create_key_using_global_key_provider('wal_encryption_key_2', 'global_keyring');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_server_key_using_global_key_provider('wal_encryption_key_2', 'global_keyring');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_create_key_using_database_key_provider('db_key_2', 'db_keyring');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_key_using_database_key_provider('db_key_2', 'db_keyring');" +); +PGTDE::psql($node, 'postgres', "INSERT INTO test_enc (x) VALUES (5), (6);"); +PGTDE::append_to_result_file("-- kill -9"); +$node->kill9; +PGTDE::append_to_result_file("-- server start"); +PGTDE::append_to_result_file( + "-- check that the key rotation hasn't destroyed a WAL key created during the server start" +); +PGTDE::poll_start($node); + +PGTDE::psql($node, 'postgres', "TABLE test_enc;"); + +PGTDE::psql($node, 'postgres', + "CREATE TABLE test_enc2 (x int PRIMARY KEY) USING tde_heap;"); +PGTDE::append_to_result_file("-- kill -9"); +$node->kill9; +PGTDE::append_to_result_file("-- server start"); +PGTDE::append_to_result_file( + "-- check redo of the smgr internal key creation when the key is on disk" +); +PGTDE::poll_start($node); + +$node->stop; + +# Compare the expected and out file +my $compare = PGTDE->compare_results(); + +is($compare, 0, + "Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files." +); + +done_testing(); diff --git a/contrib/pg_tde/t/expected/001_basic.out b/contrib/pg_tde/t/expected/001_basic.out deleted file mode 100644 index 0ea866e83ebc8..0000000000000 --- a/contrib/pg_tde/t/expected/001_basic.out +++ /dev/null @@ -1,18 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT extname, extversion FROM pg_extension WHERE extname = 'pg_tde'; -pg_tde|1.0-rc --- server restart -CREATE TABLE test_enc(id SERIAL,k VARCHAR(32),PRIMARY KEY (id)) USING tde_heap; -INSERT INTO test_enc (k) VALUES ('foobar'),('barfoo'); -SELECT * FROM test_enc ORDER BY id ASC; -1|foobar -2|barfoo --- server restart -SELECT * FROM test_enc ORDER BY id ASC; -1|foobar -2|barfoo -TABLEFILE FOUND: yes - -CONTAINS FOO (should be empty): -DROP TABLE test_enc; -DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/t/expected/002_rotate_key.out b/contrib/pg_tde/t/expected/002_rotate_key.out deleted file mode 100644 index 86b9646088a09..0000000000000 --- a/contrib/pg_tde/t/expected/002_rotate_key.out +++ /dev/null @@ -1,94 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; --- server restart -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); -1 -SELECT pg_tde_add_key_provider_file('file-2','/tmp/pg_tde_test_keyring_2.per'); -2 -SELECT pg_tde_add_global_key_provider_file('file-2','/tmp/pg_tde_test_keyring_2g.per'); --1 -SELECT pg_tde_add_global_key_provider_file('file-3','/tmp/pg_tde_test_keyring_3.per'); --2 -SELECT pg_tde_list_all_key_providers(); -(1,file-vault,file,"{""type"" : ""file"", ""path"" : ""/tmp/pg_tde_test_keyring.per""}") -(2,file-2,file,"{""type"" : ""file"", ""path"" : ""/tmp/pg_tde_test_keyring_2.per""}") -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); - -CREATE TABLE test_enc(id SERIAL,k INTEGER,PRIMARY KEY (id)) USING tde_heap; -INSERT INTO test_enc (k) VALUES (5),(6); -SELECT * FROM test_enc ORDER BY id ASC; -1|5 -2|6 -0 -SELECT * FROM test_enc ORDER BY id ASC; -1|5 -2|6 --- server restart -SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_principal_key_info(); -1|file-vault|rotated-principal-key1 -SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_global_principal_key_info(); -psql::1: ERROR: Principal key does not exists for the database -HINT: Use set_principal_key interface to set the principal key -SELECT * FROM test_enc ORDER BY id ASC; -1|5 -2|6 -SELECT pg_tde_set_principal_key('rotated-principal-key2','file-2'); - -SELECT * FROM test_enc ORDER BY id ASC; -1|5 -2|6 --- server restart -SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_principal_key_info(); -2|file-2|rotated-principal-key2 -SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_global_principal_key_info(); -psql::1: ERROR: Principal key does not exists for the database -HINT: Use set_principal_key interface to set the principal key -SELECT * FROM test_enc ORDER BY id ASC; -1|5 -2|6 -SELECT pg_tde_set_global_principal_key('rotated-principal-key', 'file-3', false); - -SELECT * FROM test_enc ORDER BY id ASC; -1|5 -2|6 --- server restart -SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_principal_key_info(); --2|file-3|rotated-principal-key -SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_global_principal_key_info(); -psql::1: ERROR: Principal key does not exists for the database -HINT: Use set_principal_key interface to set the principal key -SELECT * FROM test_enc ORDER BY id ASC; -1|5 -2|6 -SELECT pg_tde_set_global_principal_key('rotated-principal-keyX', 'file-2', false); - -SELECT * FROM test_enc ORDER BY id ASC; -1|5 -2|6 --- server restart -SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_principal_key_info(); --1|file-2|rotated-principal-keyX -SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_global_principal_key_info(); -psql::1: ERROR: Principal key does not exists for the database -HINT: Use set_principal_key interface to set the principal key -SELECT * FROM test_enc ORDER BY id ASC; -1|5 -2|6 -ALTER SYSTEM SET pg_tde.inherit_global_providers = OFF; --- server restart -psql::1: ERROR: Usage of global key providers is disabled. Enable it with pg_tde.inherit_global_providers = ON -SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_principal_key_info(); --1|file-2|rotated-principal-keyX -SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_global_principal_key_info(); -psql::1: ERROR: Principal key does not exists for the database -HINT: Use set_principal_key interface to set the principal key -SELECT pg_tde_set_principal_key('rotated-principal-key2','file-2'); - -SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_principal_key_info(); -2|file-2|rotated-principal-key2 -SELECT key_provider_id, key_provider_name, principal_key_name FROM pg_tde_global_principal_key_info(); -psql::1: ERROR: Principal key does not exists for the database -HINT: Use set_principal_key interface to set the principal key -DROP TABLE test_enc; -ALTER SYSTEM RESET pg_tde.inherit_global_providers; -DROP EXTENSION pg_tde CASCADE; - diff --git a/contrib/pg_tde/t/expected/003_remote_config.out b/contrib/pg_tde/t/expected/003_remote_config.out deleted file mode 100644 index 35bcd3f49651a..0000000000000 --- a/contrib/pg_tde/t/expected/003_remote_config.out +++ /dev/null @@ -1,12 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -CREATE TABLE test_enc2(id SERIAL,k INTEGER,PRIMARY KEY (id)) USING tde_heap; -INSERT INTO test_enc2 (k) VALUES (5),(6); -SELECT * FROM test_enc2 ORDER BY id ASC; -1|5 -2|6 --- server restart -SELECT * FROM test_enc2 ORDER BY id ASC; -1|5 -2|6 -DROP TABLE test_enc2; -DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/t/expected/004_file_config.out b/contrib/pg_tde/t/expected/004_file_config.out deleted file mode 100644 index e5f705d3137c3..0000000000000 --- a/contrib/pg_tde/t/expected/004_file_config.out +++ /dev/null @@ -1,12 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -CREATE TABLE test_enc1(id SERIAL,k INTEGER,PRIMARY KEY (id)) USING tde_heap; -INSERT INTO test_enc1 (k) VALUES (5),(6); -SELECT * FROM test_enc1 ORDER BY id ASC; -1|5 -2|6 --- server restart -SELECT * FROM test_enc1 ORDER BY id ASC; -1|5 -2|6 -DROP TABLE test_enc1; -DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/t/expected/005_multiple_extensions.out b/contrib/pg_tde/t/expected/005_multiple_extensions.out deleted file mode 100644 index e5f705d3137c3..0000000000000 --- a/contrib/pg_tde/t/expected/005_multiple_extensions.out +++ /dev/null @@ -1,12 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -CREATE TABLE test_enc1(id SERIAL,k INTEGER,PRIMARY KEY (id)) USING tde_heap; -INSERT INTO test_enc1 (k) VALUES (5),(6); -SELECT * FROM test_enc1 ORDER BY id ASC; -1|5 -2|6 --- server restart -SELECT * FROM test_enc1 ORDER BY id ASC; -1|5 -2|6 -DROP TABLE test_enc1; -DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/t/expected/006_remote_vault_config.out b/contrib/pg_tde/t/expected/006_remote_vault_config.out deleted file mode 100644 index 35bcd3f49651a..0000000000000 --- a/contrib/pg_tde/t/expected/006_remote_vault_config.out +++ /dev/null @@ -1,12 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -CREATE TABLE test_enc2(id SERIAL,k INTEGER,PRIMARY KEY (id)) USING tde_heap; -INSERT INTO test_enc2 (k) VALUES (5),(6); -SELECT * FROM test_enc2 ORDER BY id ASC; -1|5 -2|6 --- server restart -SELECT * FROM test_enc2 ORDER BY id ASC; -1|5 -2|6 -DROP TABLE test_enc2; -DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/t/expected/007_tde_heap.out b/contrib/pg_tde/t/expected/007_tde_heap.out deleted file mode 100644 index 867f714c9fb16..0000000000000 --- a/contrib/pg_tde/t/expected/007_tde_heap.out +++ /dev/null @@ -1,76 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; --- server restart -CREATE TABLE test_enc1(id SERIAL,k VARCHAR(32),PRIMARY KEY (id)) USING tde_heap; -INSERT INTO test_enc1 (k) VALUES ('foobar'),('barfoo'); -SELECT * FROM test_enc1 ORDER BY id ASC; -1|foobar -2|barfoo -CREATE TABLE test_enc2(id SERIAL,k VARCHAR(32),PRIMARY KEY (id)); -INSERT INTO test_enc2 (k) VALUES ('foobar'),('barfoo'); -ALTER TABLE test_enc2 SET ACCESS METHOD tde_heap; -SELECT * FROM test_enc2 ORDER BY id ASC; -1|foobar -2|barfoo -SET default_table_access_method = "tde_heap"; CREATE TABLE test_enc3(id SERIAL,k VARCHAR(32),PRIMARY KEY (id)); -INSERT INTO test_enc3 (k) VALUES ('foobar'),('barfoo'); -SELECT * FROM test_enc3 ORDER BY id ASC; -1|foobar -2|barfoo -INSERT INTO test_enc4 (k) VALUES ('foobar'),('barfoo'); -SELECT * FROM test_enc4 ORDER BY id ASC; -1|foobar -2|barfoo -CREATE TABLE test_enc5(id SERIAL,k VARCHAR(32),PRIMARY KEY (id)) USING tde_heap; -INSERT INTO test_enc5 (k) VALUES ('foobar'),('barfoo'); -CHECKPOINT; -TRUNCATE test_enc5; -INSERT INTO test_enc5 (k) VALUES ('foobar'),('barfoo'); -SELECT * FROM test_enc5 ORDER BY id ASC; -3|foobar -4|barfoo --- server restart -########################### -SELECT * FROM test_enc1 ORDER BY id ASC; -1|foobar -2|barfoo -TABLEFILE FOR test_enc1 FOUND: yes -CONTAINS FOO (should be empty): -########################### -SELECT * FROM test_enc2 ORDER BY id ASC; -1|foobar -2|barfoo -TABLEFILE FOR test_enc2 FOUND: yes -CONTAINS FOO (should be empty): -########################### -SELECT * FROM test_enc3 ORDER BY id ASC; -1|foobar -2|barfoo -TABLEFILE FOR test_enc3 FOUND: yes -CONTAINS FOO (should be empty): -########################### -SELECT * FROM test_enc4 ORDER BY id ASC; -1|foobar -2|barfoo -TABLEFILE FOR test_enc4 FOUND: yes -CONTAINS FOO (should be empty): -########################### -SELECT * FROM test_enc5 ORDER BY id ASC; -3|foobar -4|barfoo -TABLEFILE FOR test_enc5 FOUND: yes -CONTAINS FOO (should be empty): -TABLEFILE2 FOUND: yes - -CONTAINS FOO (should be empty): -TABLEFILE3 FOUND: yes - -CONTAINS FOO (should be empty): -TABLEFILE4 FOUND: yes - -CONTAINS FOO (should be empty): -DROP TABLE test_enc1; -DROP TABLE test_enc2; -DROP TABLE test_enc3; -DROP TABLE test_enc4; -DROP TABLE test_enc5; -DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/t/expected/008_key_rotate_tablespace.out b/contrib/pg_tde/t/expected/008_key_rotate_tablespace.out deleted file mode 100644 index 5ed45191455e8..0000000000000 --- a/contrib/pg_tde/t/expected/008_key_rotate_tablespace.out +++ /dev/null @@ -1,44 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); -1 -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); - -CREATE TABLE country_table ( - country_id serial primary key, - country_name text unique not null, - continent text not null -) USING tde_heap; -INSERT INTO country_table (country_name, continent) - VALUES ('Japan', 'Asia'), - ('UK', 'Europe'), - ('USA', 'North America'); -SELECT * FROM country_table; -1|Japan|Asia -2|UK|Europe -3|USA|North America -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT pg_tde_add_key_provider_file('file-vault','/tmp/pg_tde_test_keyring.per'); -1 -SELECT pg_tde_set_principal_key('test-db-principal-key','file-vault'); - -CREATE TABLE country_table ( - country_id serial primary key, - country_name text unique not null, - continent text not null -) USING tde_heap; -INSERT INTO country_table (country_name, continent) - VALUES ('Japan', 'Asia'), - ('UK', 'Europe'), - ('USA', 'North America'); -SELECT * FROM country_table; -1|Japan|Asia -2|UK|Europe -3|USA|North America --- server restart -SELECT * FROM country_table; -1|Japan|Asia -2|UK|Europe -3|USA|North America -DROP EXTENSION pg_tde CASCADE; -DROP DATABASE tbc; -DROP TABLESPACE test_tblspace; diff --git a/contrib/pg_tde/t/expected/009_wal_encrypt.out b/contrib/pg_tde/t/expected/009_wal_encrypt.out deleted file mode 100644 index 67b4e5e56d94e..0000000000000 --- a/contrib/pg_tde/t/expected/009_wal_encrypt.out +++ /dev/null @@ -1,11 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT pg_tde_add_global_key_provider_file('file-keyring-010','/tmp/pg_tde_test_keyring010.per'); --1 -SELECT pg_tde_set_server_principal_key('global-db-principal-key', 'file-keyring-010'); - --- server restart with wal encryption -SHOW pg_tde.wal_encrypt; -on -CREATE TABLE test_wal(id SERIAL,k INTEGER,PRIMARY KEY (id)); -CHECKPOINT; -DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/t/expected/010_change_key_provider.out b/contrib/pg_tde/t/expected/010_change_key_provider.out deleted file mode 100644 index 507b8799177da..0000000000000 --- a/contrib/pg_tde/t/expected/010_change_key_provider.out +++ /dev/null @@ -1,100 +0,0 @@ -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT pg_tde_add_key_provider_file('file-vault', '/tmp/change_key_provider_1.per'); -1 -SELECT pg_tde_list_all_key_providers(); -(1,file-vault,file,"{""type"" : ""file"", ""path"" : ""/tmp/change_key_provider_1.per""}") -SELECT pg_tde_set_principal_key('test-key', 'file-vault'); - -CREATE TABLE test_enc (id serial, k integer, PRIMARY KEY (id)) USING tde_heap; -INSERT INTO test_enc (k) VALUES (5), (6); -SELECT pg_tde_verify_principal_key(); - -SELECT pg_tde_is_encrypted('test_enc'); -t -SELECT * FROM test_enc ORDER BY id; -1|5 -2|6 --- mv /tmp/change_key_provider_1.per /tmp/change_key_provider_2.per -SELECT pg_tde_change_key_provider_file('file-vault', '/tmp/change_key_provider_2.per'); -1 -SELECT pg_tde_list_all_key_providers(); -(1,file-vault,file,"{""type"" : ""file"", ""path"" : ""/tmp/change_key_provider_2.per""}") -SELECT pg_tde_verify_principal_key(); - -SELECT pg_tde_is_encrypted('test_enc'); -t -SELECT * FROM test_enc ORDER BY id; -1|5 -2|6 --- server restart -SELECT pg_tde_verify_principal_key(); - -SELECT pg_tde_is_encrypted('test_enc'); -t -SELECT * FROM test_enc ORDER BY id; -1|5 -2|6 -SELECT pg_tde_change_key_provider_file('file-vault', '/tmp/change_key_provider_3.per'); -1 -SELECT pg_tde_list_all_key_providers(); -(1,file-vault,file,"{""type"" : ""file"", ""path"" : ""/tmp/change_key_provider_3.per""}") -SELECT pg_tde_verify_principal_key(); -psql::1: ERROR: failed to retrieve principal key test-key from keyring with ID 1 -SELECT pg_tde_is_encrypted('test_enc'); -t -SELECT * FROM test_enc ORDER BY id; -1|5 -2|6 --- server restart -SELECT pg_tde_verify_principal_key(); -psql::1: ERROR: failed to retrieve principal key test-key from keyring with ID 1 -SELECT pg_tde_is_encrypted('test_enc'); -psql::1: ERROR: failed to retrieve principal key test-key from keyring with ID 1 -SELECT * FROM test_enc ORDER BY id; -psql::1: ERROR: failed to retrieve principal key test-key from keyring with ID 1 --- mv /tmp/change_key_provider_2.per /tmp/change_key_provider_3.per --- server restart -SELECT pg_tde_verify_principal_key(); - -SELECT pg_tde_is_encrypted('test_enc'); -t -SELECT * FROM test_enc ORDER BY id; -1|5 -2|6 -DROP EXTENSION pg_tde CASCADE; -psql::1: NOTICE: drop cascades to table test_enc -CREATE EXTENSION IF NOT EXISTS pg_tde; -SELECT pg_tde_add_key_provider_file('file-vault', '/tmp/change_key_provider_4.per'); -1 -0 -CREATE TABLE test_enc (id serial, k integer, PRIMARY KEY (id)) USING tde_heap; -INSERT INTO test_enc (k) VALUES (5), (6); -SELECT pg_tde_verify_principal_key(); - -SELECT pg_tde_is_encrypted('test_enc'); -t -SELECT * FROM test_enc ORDER BY id; -1|5 -2|6 -SELECT pg_tde_change_key_provider_file('file-vault', '/tmp/change_key_provider_3.per'); -1 --- server restart -SELECT pg_tde_verify_principal_key(); - - -SELECT pg_tde_is_encrypted('test_enc'); -psql::1: ERROR: Failed to decrypt key, incorrect principal key or corrupted key file -SELECT * FROM test_enc ORDER BY id; -psql::1: ERROR: Failed to decrypt key, incorrect principal key or corrupted key file -SELECT pg_tde_change_key_provider_file('file-vault', '/tmp/change_key_provider_4.per'); -1 --- server restart -SELECT pg_tde_verify_principal_key(); - -SELECT pg_tde_is_encrypted('test_enc'); -t -SELECT * FROM test_enc ORDER BY id; -1|5 -2|6 -DROP EXTENSION pg_tde CASCADE; -psql::1: NOTICE: drop cascades to table test_enc diff --git a/contrib/pg_tde/t/expected/basic.out b/contrib/pg_tde/t/expected/basic.out new file mode 100644 index 0000000000000..abeba5d06e232 --- /dev/null +++ b/contrib/pg_tde/t/expected/basic.out @@ -0,0 +1,69 @@ +CREATE EXTENSION pg_tde; + SELECT + pg_proc.oid::regprocedure + FROM + pg_catalog.pg_proc + JOIN pg_catalog.pg_language ON prolang = pg_language.oid + LEFT JOIN LATERAL aclexplode(proacl) ON TRUE + WHERE + proname LIKE 'pg_tde%' AND + (lanname = 'c' OR prosecdef) AND + (grantee IS NULL OR grantee = 0) + ORDER BY pg_proc.oid::regprocedure::text; + oid +------------------------------- + pg_tde_is_encrypted(regclass) + pg_tde_version() +(2 rows) + + +SELECT extname, extversion FROM pg_extension WHERE extname = 'pg_tde'; + extname | extversion +---------+------------ + pg_tde | 2.0 +(1 row) + +CREATE TABLE test_enc (id SERIAL, k INTEGER, PRIMARY KEY (id)) USING tde_heap; +psql::1: ERROR: principal key not configured +HINT: Use pg_tde_set_key_using_database_key_provider() or pg_tde_set_key_using_global_key_provider() to configure one. +SELECT pg_tde_add_database_key_provider_file('file-vault', '/tmp/pg_tde_test_001_basic.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('test-db-key', 'file-vault'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('test-db-key', 'file-vault'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- + +(1 row) + +CREATE TABLE test_enc (id SERIAL, k VARCHAR(32), PRIMARY KEY (id)) USING tde_heap; +INSERT INTO test_enc (k) VALUES ('foobar'), ('barfoo'); +SELECT * FROM test_enc ORDER BY id; + id | k +----+-------- + 1 | foobar + 2 | barfoo +(2 rows) + +-- server restart +SELECT * FROM test_enc ORDER BY id; + id | k +----+-------- + 1 | foobar + 2 | barfoo +(2 rows) + +TABLEFILE FOUND: yes +CONTAINS FOO (should be empty): +SELECT pg_tde_verify_key() +psql::1: ERROR: key "test-db-key" not found in key provider "file-vault" +DROP TABLE test_enc; +DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/t/expected/change_key_provider.out b/contrib/pg_tde/t/expected/change_key_provider.out new file mode 100644 index 0000000000000..59de1281ae1a3 --- /dev/null +++ b/contrib/pg_tde/t/expected/change_key_provider.out @@ -0,0 +1,143 @@ +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('file-vault', '/tmp/change_key_provider_1.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + +(1 row) + +SELECT * FROM pg_tde_list_all_database_key_providers(); + id | name | type | options +----+------------+------+--------------------------------------------- + 1 | file-vault | file | {"path" : "/tmp/change_key_provider_1.per"} +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('test-key', 'file-vault'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('test-key', 'file-vault'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- + +(1 row) + +CREATE TABLE test_enc (id serial, k integer, PRIMARY KEY (id)) USING tde_heap; +INSERT INTO test_enc (k) VALUES (5), (6); +SELECT pg_tde_verify_key(); + pg_tde_verify_key +------------------- + +(1 row) + +SELECT pg_tde_is_encrypted('test_enc'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +SELECT * FROM test_enc ORDER BY id; + id | k +----+--- + 1 | 5 + 2 | 6 +(2 rows) + +-- mv /tmp/change_key_provider_1.per /tmp/change_key_provider_2.per +SELECT pg_tde_change_database_key_provider_file('file-vault', '/tmp/change_key_provider_2.per'); + pg_tde_change_database_key_provider_file +------------------------------------------ + +(1 row) + +SELECT * FROM pg_tde_list_all_database_key_providers(); + id | name | type | options +----+------------+------+--------------------------------------------- + 1 | file-vault | file | {"path" : "/tmp/change_key_provider_2.per"} +(1 row) + +SELECT pg_tde_verify_key(); + pg_tde_verify_key +------------------- + +(1 row) + +SELECT pg_tde_is_encrypted('test_enc'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +SELECT * FROM test_enc ORDER BY id; + id | k +----+--- + 1 | 5 + 2 | 6 +(2 rows) + +-- server restart +SELECT pg_tde_verify_key(); + pg_tde_verify_key +------------------- + +(1 row) + +SELECT pg_tde_is_encrypted('test_enc'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +SELECT * FROM test_enc ORDER BY id; + id | k +----+--- + 1 | 5 + 2 | 6 +(2 rows) + +-- mv /tmp/change_key_provider_2.per /tmp/change_key_provider_1.per +-- server restart +SELECT pg_tde_verify_key(); +psql::1: ERROR: key "test-key" not found in key provider "file-vault" +SELECT pg_tde_is_encrypted('test_enc'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +SELECT * FROM test_enc ORDER BY id; +psql::1: ERROR: key "test-key" not found in key provider "file-vault" +SELECT pg_tde_change_database_key_provider_file('file-vault', '/tmp/change_key_provider_1.per'); + pg_tde_change_database_key_provider_file +------------------------------------------ + +(1 row) + +SELECT * FROM pg_tde_list_all_database_key_providers(); + id | name | type | options +----+------------+------+--------------------------------------------- + 1 | file-vault | file | {"path" : "/tmp/change_key_provider_1.per"} +(1 row) + +SELECT pg_tde_verify_key(); + pg_tde_verify_key +------------------- + +(1 row) + +SELECT pg_tde_is_encrypted('test_enc'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +SELECT * FROM test_enc ORDER BY id; + id | k +----+--- + 1 | 5 + 2 | 6 +(2 rows) + +DROP EXTENSION pg_tde CASCADE; +psql::1: NOTICE: drop cascades to table test_enc diff --git a/contrib/pg_tde/t/expected/crash_recovery.out b/contrib/pg_tde/t/expected/crash_recovery.out new file mode 100644 index 0000000000000..15604704fe92b --- /dev/null +++ b/contrib/pg_tde/t/expected/crash_recovery.out @@ -0,0 +1,117 @@ +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_global_key_provider_file('global_keyring', '/tmp/crash_recovery.per'); + pg_tde_add_global_key_provider_file +------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_global_key_provider('wal_encryption_key', 'global_keyring'); + pg_tde_create_key_using_global_key_provider +--------------------------------------------- + +(1 row) + +SELECT pg_tde_set_server_key_using_global_key_provider('wal_encryption_key', 'global_keyring'); + pg_tde_set_server_key_using_global_key_provider +------------------------------------------------- + +(1 row) + +SELECT pg_tde_add_database_key_provider_file('db_keyring', '/tmp/crash_recovery.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('db_key', 'db_keyring'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('db_key', 'db_keyring'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- + +(1 row) + +CREATE TABLE test_enc (x int PRIMARY KEY) USING tde_heap; +INSERT INTO test_enc (x) VALUES (1), (2); +CREATE TABLE test_plain (x int PRIMARY KEY) USING heap; +INSERT INTO test_plain (x) VALUES (3), (4); +ALTER SYSTEM SET pg_tde.wal_encrypt = 'on'; +-- kill -9 +-- server start +-- rotate wal key +SELECT pg_tde_create_key_using_global_key_provider('wal_encryption_key_1', 'global_keyring'); + pg_tde_create_key_using_global_key_provider +--------------------------------------------- + +(1 row) + +SELECT pg_tde_set_server_key_using_global_key_provider('wal_encryption_key_1', 'global_keyring'); + pg_tde_set_server_key_using_global_key_provider +------------------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('db_key_1', 'db_keyring'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('db_key_1', 'db_keyring'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- + +(1 row) + +INSERT INTO test_enc (x) VALUES (3), (4); +-- kill -9 +-- server start +-- check that pg_tde_save_principal_key_redo hasn't destroyed a WAL key created during the server start +-- rotate wal key +SELECT pg_tde_create_key_using_global_key_provider('wal_encryption_key_2', 'global_keyring'); + pg_tde_create_key_using_global_key_provider +--------------------------------------------- + +(1 row) + +SELECT pg_tde_set_server_key_using_global_key_provider('wal_encryption_key_2', 'global_keyring'); + pg_tde_set_server_key_using_global_key_provider +------------------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('db_key_2', 'db_keyring'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('db_key_2', 'db_keyring'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- + +(1 row) + +INSERT INTO test_enc (x) VALUES (5), (6); +-- kill -9 +-- server start +-- check that the key rotation hasn't destroyed a WAL key created during the server start +TABLE test_enc; + x +--- + 1 + 2 + 3 + 4 + 5 + 6 +(6 rows) + +CREATE TABLE test_enc2 (x int PRIMARY KEY) USING tde_heap; +-- kill -9 +-- server start +-- check redo of the smgr internal key creation when the key is on disk diff --git a/contrib/pg_tde/t/expected/key_rotate_tablespace.out b/contrib/pg_tde/t/expected/key_rotate_tablespace.out new file mode 100644 index 0000000000000..0fa6c53b4d074 --- /dev/null +++ b/contrib/pg_tde/t/expected/key_rotate_tablespace.out @@ -0,0 +1,63 @@ +SET allow_in_place_tablespaces = true; CREATE TABLESPACE test_tblspace LOCATION ''; +CREATE DATABASE tbc TABLESPACE = test_tblspace; +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('file-vault', '/tmp/key_rotate_tablespace.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('test-db-key', 'file-vault'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('test-db-key', 'file-vault'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- + +(1 row) + +CREATE TABLE country_table ( + country_id serial primary key, + country_name text unique not null, + continent text not null +) USING tde_heap; +INSERT INTO country_table (country_name, continent) + VALUES ('Japan', 'Asia'), + ('UK', 'Europe'), + ('USA', 'North America'); +SELECT * FROM country_table; + country_id | country_name | continent +------------+--------------+--------------- + 1 | Japan | Asia + 2 | UK | Europe + 3 | USA | North America +(3 rows) + +SELECT pg_tde_create_key_using_database_key_provider('new-k', 'file-vault'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('new-k', 'file-vault'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- + +(1 row) + +-- server restart +SELECT * FROM country_table; + country_id | country_name | continent +------------+--------------+--------------- + 1 | Japan | Asia + 2 | UK | Europe + 3 | USA | North America +(3 rows) + +DROP EXTENSION pg_tde CASCADE; +psql::1: NOTICE: drop cascades to table country_table +DROP DATABASE tbc; +DROP TABLESPACE test_tblspace; diff --git a/contrib/pg_tde/t/expected/key_validation.out b/contrib/pg_tde/t/expected/key_validation.out new file mode 100644 index 0000000000000..fe700ec77295e --- /dev/null +++ b/contrib/pg_tde/t/expected/key_validation.out @@ -0,0 +1,27 @@ +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('test-file-provider', '/tmp/pg_tde_test_key_validation.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('key1', 'test-file-provider'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('key2', 'test-file-provider'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('key1', 'test-file-provider'); +psql::1: WARNING: invalid key: data length is zero +psql::1: ERROR: failed to retrieve principal key "key1" from key provider "test-file-provider" +DETAIL: Invalid key +SELECT pg_tde_set_key_using_database_key_provider('key2', 'test-file-provider'); +psql::1: WARNING: invalid key: unsupported key length "4294967295" +psql::1: ERROR: failed to retrieve principal key "key2" from key provider "test-file-provider" +DETAIL: Invalid key diff --git a/contrib/pg_tde/t/expected/multiple_extensions.out b/contrib/pg_tde/t/expected/multiple_extensions.out new file mode 100644 index 0000000000000..e5903d1bd401d --- /dev/null +++ b/contrib/pg_tde/t/expected/multiple_extensions.out @@ -0,0 +1,12 @@ +CREATE EXTENSION pg_tde; +CREATE TABLE test_enc1 (id SERIAL, k INTEGER, PRIMARY KEY (id)) USING tde_heap; +INSERT INTO test_enc1 (k) VALUES (5), (6); +SELECT * FROM test_enc1 ORDER BY id; +1|5 +2|6 +-- server restart +SELECT * FROM test_enc1 ORDER BY id; +1|5 +2|6 +DROP TABLE test_enc1; +DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/t/expected/replication.out b/contrib/pg_tde/t/expected/replication.out new file mode 100644 index 0000000000000..292409cf99195 --- /dev/null +++ b/contrib/pg_tde/t/expected/replication.out @@ -0,0 +1,93 @@ +-- At primary +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('file-vault', '/tmp/replication.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('test-key', 'file-vault'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('test-key', 'file-vault'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- + +(1 row) + +CREATE TABLE test_enc (x int PRIMARY KEY) USING tde_heap; +INSERT INTO test_enc (x) VALUES (1), (2); +CREATE TABLE test_plain (x int PRIMARY KEY) USING heap; +INSERT INTO test_plain (x) VALUES (3), (4); +-- At replica +SELECT pg_tde_is_encrypted('test_enc'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +SELECT pg_tde_is_encrypted('test_enc_pkey'); + pg_tde_is_encrypted +--------------------- + t +(1 row) + +SELECT * FROM test_enc ORDER BY x; + x +--- + 1 + 2 +(2 rows) + +SELECT pg_tde_is_encrypted('test_plain'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +SELECT pg_tde_is_encrypted('test_plain_pkey'); + pg_tde_is_encrypted +--------------------- + f +(1 row) + +SELECT * FROM test_plain ORDER BY x; + x +--- + 3 + 4 +(2 rows) + +-- check primary crash with WAL encryption +SELECT pg_tde_add_global_key_provider_file('file-vault', '/tmp/replication.per'); + pg_tde_add_global_key_provider_file +------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_global_key_provider('test-global-key', 'file-vault'); + pg_tde_create_key_using_global_key_provider +--------------------------------------------- + +(1 row) + +SELECT pg_tde_set_server_key_using_global_key_provider('test-global-key', 'file-vault'); + pg_tde_set_server_key_using_global_key_provider +------------------------------------------------- + +(1 row) + +CREATE TABLE test_enc2 (x int PRIMARY KEY) USING tde_heap; +INSERT INTO test_enc2 (x) VALUES (1), (2); +ALTER SYSTEM SET pg_tde.wal_encrypt = 'on'; +-- primary start +SELECT * FROM test_enc2 ORDER BY x; + x +--- + 1 + 2 +(2 rows) + diff --git a/contrib/pg_tde/t/expected/rotate_key.out b/contrib/pg_tde/t/expected/rotate_key.out new file mode 100644 index 0000000000000..65d542eeaf408 --- /dev/null +++ b/contrib/pg_tde/t/expected/rotate_key.out @@ -0,0 +1,251 @@ +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('file-vault', '/tmp/rotate_key.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + +(1 row) + +SELECT pg_tde_add_database_key_provider_file('file-2', '/tmp/rotate_key_2.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + +(1 row) + +SELECT pg_tde_add_global_key_provider_file('file-2', '/tmp/rotate_key_2g.per'); + pg_tde_add_global_key_provider_file +------------------------------------- + +(1 row) + +SELECT pg_tde_add_global_key_provider_file('file-3', '/tmp/rotate_key_3.per'); + pg_tde_add_global_key_provider_file +------------------------------------- + +(1 row) + +SELECT pg_tde_list_all_database_key_providers(); + pg_tde_list_all_database_key_providers +------------------------------------------------------------ + (1,file-vault,file,"{""path"" : ""/tmp/rotate_key.per""}") + (2,file-2,file,"{""path"" : ""/tmp/rotate_key_2.per""}") +(2 rows) + +SELECT pg_tde_create_key_using_database_key_provider('test-db-key', 'file-vault'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('test-db-key', 'file-vault'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- + +(1 row) + +CREATE TABLE test_enc (id SERIAL, k INTEGER, PRIMARY KEY (id)) USING tde_heap; +INSERT INTO test_enc (k) VALUES (5), (6); +SELECT * FROM test_enc ORDER BY id; + id | k +----+--- + 1 | 5 + 2 | 6 +(2 rows) + +SELECT pg_tde_create_key_using_database_key_provider('rotated-key1', 'file-vault'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('rotated-key1', 'file-vault'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- + +(1 row) + +SELECT * FROM test_enc ORDER BY id; + id | k +----+--- + 1 | 5 + 2 | 6 +(2 rows) + +-- server restart +SELECT provider_id, provider_name, key_name FROM pg_tde_key_info(); + provider_id | provider_name | key_name +-------------+---------------+-------------- + 1 | file-vault | rotated-key1 +(1 row) + +SELECT provider_id, provider_name, key_name FROM pg_tde_server_key_info(); + provider_id | provider_name | key_name +-------------+---------------+---------- + | | +(1 row) + +SELECT * FROM test_enc ORDER BY id; + id | k +----+--- + 1 | 5 + 2 | 6 +(2 rows) + +SELECT pg_tde_create_key_using_database_key_provider('rotated-key2', 'file-2'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('rotated-key2', 'file-2'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- + +(1 row) + +SELECT * FROM test_enc ORDER BY id; + id | k +----+--- + 1 | 5 + 2 | 6 +(2 rows) + +-- server restart +SELECT provider_id, provider_name, key_name FROM pg_tde_key_info(); + provider_id | provider_name | key_name +-------------+---------------+-------------- + 2 | file-2 | rotated-key2 +(1 row) + +SELECT provider_id, provider_name, key_name FROM pg_tde_server_key_info(); + provider_id | provider_name | key_name +-------------+---------------+---------- + | | +(1 row) + +SELECT * FROM test_enc ORDER BY id; + id | k +----+--- + 1 | 5 + 2 | 6 +(2 rows) + +SELECT pg_tde_create_key_using_global_key_provider('rotated-key', 'file-3'); + pg_tde_create_key_using_global_key_provider +--------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_global_key_provider('rotated-key', 'file-3'); + pg_tde_set_key_using_global_key_provider +------------------------------------------ + +(1 row) + +SELECT * FROM test_enc ORDER BY id; + id | k +----+--- + 1 | 5 + 2 | 6 +(2 rows) + +-- server restart +SELECT provider_id, provider_name, key_name FROM pg_tde_key_info(); + provider_id | provider_name | key_name +-------------+---------------+------------- + -2 | file-3 | rotated-key +(1 row) + +SELECT provider_id, provider_name, key_name FROM pg_tde_server_key_info(); + provider_id | provider_name | key_name +-------------+---------------+---------- + | | +(1 row) + +SELECT * FROM test_enc ORDER BY id; + id | k +----+--- + 1 | 5 + 2 | 6 +(2 rows) + +SELECT pg_tde_create_key_using_global_key_provider('rotated-keyX', 'file-2'); + pg_tde_create_key_using_global_key_provider +--------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_global_key_provider('rotated-keyX', 'file-2'); + pg_tde_set_key_using_global_key_provider +------------------------------------------ + +(1 row) + +SELECT * FROM test_enc ORDER BY id; + id | k +----+--- + 1 | 5 + 2 | 6 +(2 rows) + +-- server restart +SELECT provider_id, provider_name, key_name FROM pg_tde_key_info(); + provider_id | provider_name | key_name +-------------+---------------+-------------- + -1 | file-2 | rotated-keyX +(1 row) + +SELECT provider_id, provider_name, key_name FROM pg_tde_server_key_info(); + provider_id | provider_name | key_name +-------------+---------------+---------- + | | +(1 row) + +SELECT * FROM test_enc ORDER BY id; + id | k +----+--- + 1 | 5 + 2 | 6 +(2 rows) + +ALTER SYSTEM SET pg_tde.inherit_global_providers = off; +-- server restart +SELECT pg_tde_create_key_using_global_key_provider('rotated-keyX2', 'file-2'); +psql::1: ERROR: usage of global key providers is disabled +HINT: Set "pg_tde.inherit_global_providers = on" in postgresql.conf. +SELECT pg_tde_set_key_using_global_key_provider('rotated-keyX2', 'file-2'); +psql::1: ERROR: usage of global key providers is disabled +HINT: Set "pg_tde.inherit_global_providers = on" in postgresql.conf. +SELECT provider_id, provider_name, key_name FROM pg_tde_key_info(); + provider_id | provider_name | key_name +-------------+---------------+-------------- + -1 | file-2 | rotated-keyX +(1 row) + +SELECT provider_id, provider_name, key_name FROM pg_tde_server_key_info(); + provider_id | provider_name | key_name +-------------+---------------+---------- + | | +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('rotated-key2', 'file-2'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- + +(1 row) + +SELECT provider_id, provider_name, key_name FROM pg_tde_key_info(); + provider_id | provider_name | key_name +-------------+---------------+-------------- + 2 | file-2 | rotated-key2 +(1 row) + +SELECT provider_id, provider_name, key_name FROM pg_tde_server_key_info(); + provider_id | provider_name | key_name +-------------+---------------+---------- + | | +(1 row) + +DROP TABLE test_enc; +ALTER SYSTEM RESET pg_tde.inherit_global_providers; +-- server restart +DROP EXTENSION pg_tde CASCADE; diff --git a/contrib/pg_tde/t/expected/tde_heap.out b/contrib/pg_tde/t/expected/tde_heap.out new file mode 100644 index 0000000000000..a5f7e3ee04feb --- /dev/null +++ b/contrib/pg_tde/t/expected/tde_heap.out @@ -0,0 +1,126 @@ +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('file-vault', '/tmp/tde_heap.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('test-db-key', 'file-vault'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('test-db-key', 'file-vault'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- + +(1 row) + +CREATE TABLE test_enc1 (id SERIAL, k VARCHAR(32), PRIMARY KEY (id)) USING tde_heap; +INSERT INTO test_enc1 (k) VALUES ('foobar'), ('barfoo'); +SELECT * FROM test_enc1 ORDER BY id; + id | k +----+-------- + 1 | foobar + 2 | barfoo +(2 rows) + +CREATE TABLE test_enc2 (id SERIAL, k VARCHAR(32), PRIMARY KEY (id)); +INSERT INTO test_enc2 (k) VALUES ('foobar'), ('barfoo'); +ALTER TABLE test_enc2 SET ACCESS METHOD tde_heap; +SELECT * FROM test_enc2 ORDER BY id; + id | k +----+-------- + 1 | foobar + 2 | barfoo +(2 rows) + +SET default_table_access_method = "tde_heap"; CREATE TABLE test_enc3 (id SERIAL, k VARCHAR(32), PRIMARY KEY (id)); +INSERT INTO test_enc3 (k) VALUES ('foobar'), ('barfoo'); +SELECT * FROM test_enc3 ORDER BY id; + id | k +----+-------- + 1 | foobar + 2 | barfoo +(2 rows) + +CREATE TABLE test_enc4 (id SERIAL, k VARCHAR(32), PRIMARY KEY (id)) USING heap; +INSERT INTO test_enc4 (k) VALUES ('foobar'), ('barfoo'); +SET default_table_access_method = "tde_heap"; ALTER TABLE test_enc4 SET ACCESS METHOD DEFAULT; +SELECT * FROM test_enc4 ORDER BY id; + id | k +----+-------- + 1 | foobar + 2 | barfoo +(2 rows) + +CREATE TABLE test_enc5 (id SERIAL, k VARCHAR(32), PRIMARY KEY (id)) USING tde_heap; +INSERT INTO test_enc5 (k) VALUES ('foobar'), ('barfoo'); +CHECKPOINT; +TRUNCATE test_enc5; +INSERT INTO test_enc5 (k) VALUES ('foobar'), ('barfoo'); +SELECT * FROM test_enc5 ORDER BY id; + id | k +----+-------- + 3 | foobar + 4 | barfoo +(2 rows) + +-- server restart +########################### +SELECT * FROM test_enc1 ORDER BY id; + id | k +----+-------- + 1 | foobar + 2 | barfoo +(2 rows) + +TABLEFILE FOR test_enc1 FOUND: yes +CONTAINS FOO (should be empty): +########################### +SELECT * FROM test_enc2 ORDER BY id; + id | k +----+-------- + 1 | foobar + 2 | barfoo +(2 rows) + +TABLEFILE FOR test_enc2 FOUND: yes +CONTAINS FOO (should be empty): +########################### +SELECT * FROM test_enc3 ORDER BY id; + id | k +----+-------- + 1 | foobar + 2 | barfoo +(2 rows) + +TABLEFILE FOR test_enc3 FOUND: yes +CONTAINS FOO (should be empty): +########################### +SELECT * FROM test_enc4 ORDER BY id; + id | k +----+-------- + 1 | foobar + 2 | barfoo +(2 rows) + +TABLEFILE FOR test_enc4 FOUND: yes +CONTAINS FOO (should be empty): +########################### +SELECT * FROM test_enc5 ORDER BY id; + id | k +----+-------- + 3 | foobar + 4 | barfoo +(2 rows) + +TABLEFILE FOR test_enc5 FOUND: yes +CONTAINS FOO (should be empty): +DROP TABLE test_enc1; +DROP TABLE test_enc2; +DROP TABLE test_enc3; +DROP TABLE test_enc4; +DROP TABLE test_enc5; +DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/t/expected/unlogged_tables.out b/contrib/pg_tde/t/expected/unlogged_tables.out new file mode 100644 index 0000000000000..09532ce5ffeec --- /dev/null +++ b/contrib/pg_tde/t/expected/unlogged_tables.out @@ -0,0 +1,30 @@ +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_database_key_provider_file('file-vault', '/tmp/unlogged_tables.per'); + pg_tde_add_database_key_provider_file +--------------------------------------- + +(1 row) + +SELECT pg_tde_create_key_using_database_key_provider('test-key', 'file-vault'); + pg_tde_create_key_using_database_key_provider +----------------------------------------------- + +(1 row) + +SELECT pg_tde_set_key_using_database_key_provider('test-key', 'file-vault'); + pg_tde_set_key_using_database_key_provider +-------------------------------------------- + +(1 row) + +CREATE UNLOGGED TABLE t (x int PRIMARY KEY) USING tde_heap; +INSERT INTO t SELECT generate_series(1, 4); +CHECKPOINT; +-- kill -9 +-- server start +TABLE t; + x +--- +(0 rows) + +INSERT INTO t SELECT generate_series(1, 4); diff --git a/contrib/pg_tde/t/expected/wal_encrypt.out b/contrib/pg_tde/t/expected/wal_encrypt.out new file mode 100644 index 0000000000000..5f374e9fbb9a2 --- /dev/null +++ b/contrib/pg_tde/t/expected/wal_encrypt.out @@ -0,0 +1,111 @@ +CREATE EXTENSION pg_tde; +SELECT pg_tde_add_global_key_provider_file('file-keyring-010', '/tmp/wal_encrypt.per'); + pg_tde_add_global_key_provider_file +------------------------------------- + +(1 row) + +SELECT pg_tde_verify_server_key(); +psql::1: ERROR: principal key not configured for current database +SELECT key_name, provider_name, provider_id FROM pg_tde_server_key_info(); + key_name | provider_name | provider_id +----------+---------------+------------- + | | +(1 row) + +SELECT pg_tde_create_key_using_global_key_provider('server-key', 'file-keyring-010'); + pg_tde_create_key_using_global_key_provider +--------------------------------------------- + +(1 row) + +SELECT pg_tde_set_server_key_using_global_key_provider('server-key', 'file-keyring-010'); + pg_tde_set_server_key_using_global_key_provider +------------------------------------------------- + +(1 row) + +SELECT pg_tde_verify_server_key(); + pg_tde_verify_server_key +-------------------------- + +(1 row) + +SELECT key_name, provider_name, provider_id FROM pg_tde_server_key_info(); + key_name | provider_name | provider_id +------------+------------------+------------- + server-key | file-keyring-010 | -1 +(1 row) + +ALTER SYSTEM SET pg_tde.wal_encrypt = on; +-- server restart with wal encryption +SHOW pg_tde.wal_encrypt; + pg_tde.wal_encrypt +-------------------- + on +(1 row) + +SELECT slot_name FROM pg_create_logical_replication_slot('tde_slot', 'test_decoding'); + slot_name +----------- + tde_slot +(1 row) + +CREATE TABLE test_wal (id SERIAL, k INTEGER, PRIMARY KEY (id)); +INSERT INTO test_wal (k) VALUES (1), (2); +ALTER SYSTEM SET pg_tde.wal_encrypt = off; +-- server restart without wal encryption +SHOW pg_tde.wal_encrypt; + pg_tde.wal_encrypt +-------------------- + off +(1 row) + +INSERT INTO test_wal (k) VALUES (3), (4); +ALTER SYSTEM SET pg_tde.wal_encrypt = on; +-- server restart with wal encryption +SHOW pg_tde.wal_encrypt; + pg_tde.wal_encrypt +-------------------- + on +(1 row) + +INSERT INTO test_wal (k) VALUES (5), (6); +-- server restart with still wal encryption +SHOW pg_tde.wal_encrypt; + pg_tde.wal_encrypt +-------------------- + on +(1 row) + +INSERT INTO test_wal (k) VALUES (7), (8); +SELECT data FROM pg_logical_slot_get_changes('tde_slot', NULL, NULL); + data +----------------------------------------------------------- + BEGIN 739 + COMMIT 739 + BEGIN 740 + table public.test_wal: INSERT: id[integer]:1 k[integer]:1 + table public.test_wal: INSERT: id[integer]:2 k[integer]:2 + COMMIT 740 + BEGIN 741 + table public.test_wal: INSERT: id[integer]:3 k[integer]:3 + table public.test_wal: INSERT: id[integer]:4 k[integer]:4 + COMMIT 741 + BEGIN 742 + table public.test_wal: INSERT: id[integer]:5 k[integer]:5 + table public.test_wal: INSERT: id[integer]:6 k[integer]:6 + COMMIT 742 + BEGIN 743 + table public.test_wal: INSERT: id[integer]:7 k[integer]:7 + table public.test_wal: INSERT: id[integer]:8 k[integer]:8 + COMMIT 743 +(18 rows) + +SELECT pg_drop_replication_slot('tde_slot'); + pg_drop_replication_slot +-------------------------- + +(1 row) + +DROP EXTENSION pg_tde; diff --git a/contrib/pg_tde/t/key_rotate_tablespace.pl b/contrib/pg_tde/t/key_rotate_tablespace.pl new file mode 100644 index 0000000000000..c1c85431cacb8 --- /dev/null +++ b/contrib/pg_tde/t/key_rotate_tablespace.pl @@ -0,0 +1,80 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use File::Basename; +use Test::More; +use lib 't'; +use pgtde; + +PGTDE::setup_files_dir(basename($0)); + +unlink('/tmp/key_rotate_tablespace.per'); + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->append_conf('postgresql.conf', "shared_preload_libraries = 'pg_tde'"); +$node->start; + +PGTDE::psql($node, 'postgres', + "SET allow_in_place_tablespaces = true; CREATE TABLESPACE test_tblspace LOCATION '';" +); +PGTDE::psql($node, 'postgres', + 'CREATE DATABASE tbc TABLESPACE = test_tblspace;'); + +PGTDE::psql($node, 'tbc', 'CREATE EXTENSION pg_tde;'); +PGTDE::psql($node, 'tbc', + "SELECT pg_tde_add_database_key_provider_file('file-vault', '/tmp/key_rotate_tablespace.per');" +); +PGTDE::psql($node, 'tbc', + "SELECT pg_tde_create_key_using_database_key_provider('test-db-key', 'file-vault');" +); +PGTDE::psql($node, 'tbc', + "SELECT pg_tde_set_key_using_database_key_provider('test-db-key', 'file-vault');" +); + +PGTDE::psql( + $node, 'tbc', " +CREATE TABLE country_table ( + country_id serial primary key, + country_name text unique not null, + continent text not null +) USING tde_heap; +"); + +PGTDE::psql( + $node, 'tbc', " +INSERT INTO country_table (country_name, continent) + VALUES ('Japan', 'Asia'), + ('UK', 'Europe'), + ('USA', 'North America'); +"); + +PGTDE::psql($node, 'tbc', 'SELECT * FROM country_table;'); +PGTDE::psql($node, 'tbc', + "SELECT pg_tde_create_key_using_database_key_provider('new-k', 'file-vault');" +); +PGTDE::psql($node, 'tbc', + "SELECT pg_tde_set_key_using_database_key_provider('new-k', 'file-vault');" +); + +PGTDE::append_to_result_file("-- server restart"); +$node->restart; + +PGTDE::psql($node, 'tbc', 'SELECT * FROM country_table;'); + +PGTDE::psql($node, 'tbc', 'DROP EXTENSION pg_tde CASCADE;'); + +PGTDE::psql($node, 'postgres', 'DROP DATABASE tbc;'); +PGTDE::psql($node, 'postgres', 'DROP TABLESPACE test_tblspace;'); + +$node->stop; + +# Compare the expected and out file +my $compare = PGTDE->compare_results(); + +is($compare, 0, + "Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files." +); + +done_testing(); diff --git a/contrib/pg_tde/t/key_validation.pl b/contrib/pg_tde/t/key_validation.pl new file mode 100644 index 0000000000000..915d2e7bf5357 --- /dev/null +++ b/contrib/pg_tde/t/key_validation.pl @@ -0,0 +1,77 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use File::Basename; +use Fcntl 'SEEK_CUR'; +use Test::More; +use lib 't'; +use pgtde; + +PGTDE::setup_files_dir(basename($0)); + +unlink('/tmp/pg_tde_test_key_validation.per'); + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->append_conf('postgresql.conf', "shared_preload_libraries = 'pg_tde'"); +$node->start; + +PGTDE::psql($node, 'postgres', 'CREATE EXTENSION pg_tde;'); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_add_database_key_provider_file('test-file-provider', '/tmp/pg_tde_test_key_validation.per');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_create_key_using_database_key_provider('key1', 'test-file-provider');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_create_key_using_database_key_provider('key2', 'test-file-provider');" +); + + +corrupt_key_file('/tmp/pg_tde_test_key_validation.per'); + + +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_key_using_database_key_provider('key1', 'test-file-provider');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_key_using_database_key_provider('key2', 'test-file-provider');" +); + +sub corrupt_key_file +{ + my ($keyfile) = @_; + + my $fh; + open($fh, '+<', $keyfile) + or BAIL_OUT("open failed: $!"); + binmode $fh; + + # Corrupt the first page of the key file by zeroing key data length. + # Offset is TDE_KEY_NAME_LEN + MAX_KEY_DATA_SIZE. See keyring_api.h for details. + sysseek($fh, 256 + 32, 0) + or BAIL_OUT("sysseek failed: $!"); + syswrite($fh, pack("L*", 0x00000000)) or BAIL_OUT("syswrite failed: $!"); + + # Corrupt the second page of the key file by setting incorrect key length. + # Offset is TDE_KEY_NAME_LEN + MAX_KEY_DATA_SIZE. See keyring_api.h for details. + sysseek($fh, 256 + 32, SEEK_CUR) + or BAIL_OUT("sysseek failed: $!"); + syswrite($fh, pack("L*", 0xFFFFFFFF)) or BAIL_OUT("syswrite failed: $!"); + + + close($fh) + or BAIL_OUT("close failed: $!"); +} + +$node->stop; + +# Compare the expected and out file +my $compare = PGTDE->compare_results(); + +is($compare, 0, + "Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files." +); + +done_testing(); diff --git a/contrib/pg_tde/t/multiple_extensions.pl b/contrib/pg_tde/t/multiple_extensions.pl new file mode 100644 index 0000000000000..1a16c2d5cc502 --- /dev/null +++ b/contrib/pg_tde/t/multiple_extensions.pl @@ -0,0 +1,222 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use File::Basename; +use Test::More; +use lib 't'; +use pgtde; + +PGTDE::setup_files_dir(basename($0)); + +my $PG_VERSION_STRING = `pg_config --version`; + +if (index(lc($PG_VERSION_STRING), lc("Percona Distribution")) == -1) +{ + plan skip_all => + "pg_tde test case only for PPG server package install with extensions."; +} + +unlink('/tmp/keyring_data_file'); + +open my $conf2, '>>', "/tmp/datafile-location"; +print $conf2 "/tmp/keyring_data_file\n"; +close $conf2; + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->append_conf('postgresql.conf', + "shared_preload_libraries = 'pg_tde, pg_stat_monitor, pgaudit, set_user, pg_repack'" +); +$node->append_conf('postgresql.conf', + "pg_stat_monitor.pgsm_bucket_time = 360000"); +$node->append_conf('postgresql.conf', + "pg_stat_monitor.pgsm_normalized_query = 'yes'"); +$node->start; + +# Create PGSM extension +my ($cmdret, $stdout, $stderr) = $node->psql( + 'postgres', + 'CREATE EXTENSION IF NOT EXISTS pg_stat_monitor;', + extra_params => ['-a']); +ok($cmdret == 0, "CREATE PGSM EXTENSION"); +PGTDE::append_to_debug_file($stdout); + +($cmdret, $stdout, $stderr) = $node->psql( + 'postgres', + 'SELECT pg_stat_monitor_reset();', + extra_params => [ '-a', '-Pformat=aligned', '-Ptuples_only=off' ]); +ok($cmdret == 0, "Reset PGSM EXTENSION"); +PGTDE::append_to_debug_file($stdout); + +# Create pg_tde extension +($cmdret, $stdout, $stderr) = + $node->psql('postgres', 'CREATE EXTENSION pg_tde;', extra_params => ['-a']); +ok($cmdret == 0, "CREATE PGTDE EXTENSION"); +PGTDE::append_to_result_file($stdout); + +# Create Other extensions +($cmdret, $stdout, $stderr) = $node->psql( + 'postgres', + 'CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS pgaudit;', + extra_params => ['-a']); +ok($cmdret == 0, "CREATE pgaudit EXTENSION"); +PGTDE::append_to_debug_file($stdout); +($cmdret, $stdout, $stderr) = $node->psql( + 'postgres', + 'CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS set_user;', + extra_params => ['-a']); +ok($cmdret == 0, "CREATE set_user EXTENSION"); +PGTDE::append_to_debug_file($stdout); +($cmdret, $stdout, $stderr) = $node->psql( + 'postgres', + 'CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS pg_repack;', + extra_params => ['-a']); +ok($cmdret == 0, "CREATE pg_repack EXTENSION"); +PGTDE::append_to_debug_file($stdout); +($cmdret, $stdout, $stderr) = $node->psql( + 'postgres', + "SET pgaudit.log = 'none'; CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS postgis; SET pgaudit.log = 'all';", + extra_params => ['-a']); +ok($cmdret == 0, "CREATE postgis EXTENSION"); +PGTDE::append_to_debug_file($stdout); +($cmdret, $stdout, $stderr) = $node->psql( + 'postgres', + 'CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS postgis_raster;', + extra_params => ['-a']); +ok($cmdret == 0, "CREATE postgis_raster EXTENSION"); +PGTDE::append_to_debug_file($stdout); +($cmdret, $stdout, $stderr) = $node->psql( + 'postgres', + 'CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS postgis_sfcgal;', + extra_params => ['-a']); +ok($cmdret == 0, "CREATE postgis_sfcgal EXTENSION"); +PGTDE::append_to_debug_file($stdout); +($cmdret, $stdout, $stderr) = $node->psql( + 'postgres', + 'CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS fuzzystrmatch;', + extra_params => ['-a']); +ok($cmdret == 0, "CREATE fuzzystrmatch EXTENSION"); +PGTDE::append_to_debug_file($stdout); +($cmdret, $stdout, $stderr) = $node->psql( + 'postgres', + 'CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS address_standardizer;', + extra_params => ['-a']); +ok($cmdret == 0, "CREATE address_standardizer EXTENSION"); +PGTDE::append_to_debug_file($stdout); +($cmdret, $stdout, $stderr) = $node->psql( + 'postgres', + 'CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS address_standardizer_data_us;', + extra_params => ['-a']); +ok($cmdret == 0, "CREATE address_standardizer_data_us EXTENSION"); +PGTDE::append_to_debug_file($stdout); +($cmdret, $stdout, $stderr) = $node->psql( + 'postgres', + 'CREATE EXTENSION IF NOT EXISTS IF NOT EXISTS postgis_tiger_geocoder;', + extra_params => ['-a']); +ok($cmdret == 0, "CREATE postgis_tiger_geocoder EXTENSION"); +PGTDE::append_to_debug_file($stdout); + +$node->psql( + 'postgres', + "SELECT pg_tde_add_database_key_provider_file('file-provider', json_object('type' VALUE 'file', 'path' VALUE '/tmp/datafile-location'));", + extra_params => ['-a']); +$node->psql( + 'postgres', + "SELECT pg_tde_create_key_using_database_key_provider('test-db-key', 'file-provider');", + extra_params => ['-a']); +$node->psql( + 'postgres', + "SELECT pg_tde_set_key_using_database_key_provider('test-db-key', 'file-provider');", + extra_params => ['-a']); + +$stdout = $node->safe_psql( + 'postgres', + 'CREATE TABLE test_enc1 (id SERIAL, k INTEGER, PRIMARY KEY (id)) USING tde_heap;', + extra_params => ['-a']); +PGTDE::append_to_result_file($stdout); + +$stdout = $node->safe_psql( + 'postgres', + 'INSERT INTO test_enc1 (k) VALUES (5), (6);', + extra_params => ['-a']); +PGTDE::append_to_result_file($stdout); + +$stdout = $node->safe_psql( + 'postgres', + 'SELECT * FROM test_enc1 ORDER BY id;', + extra_params => ['-a']); +PGTDE::append_to_result_file($stdout); + +PGTDE::append_to_result_file("-- server restart"); +$node->restart; + +$stdout = $node->safe_psql( + 'postgres', + 'SELECT * FROM test_enc1 ORDER BY id;', + extra_params => ['-a']); +PGTDE::append_to_result_file($stdout); + +$stdout = $node->safe_psql( + 'postgres', + 'DROP TABLE test_enc1;', + extra_params => ['-a']); +PGTDE::append_to_result_file($stdout); + +# Print PGSM settings +($cmdret, $stdout, $stderr) = $node->psql( + 'postgres', + "SELECT name, setting, unit, context, vartype, source, min_val, max_val, enumvals, boot_val, reset_val, pending_restart FROM pg_settings WHERE name = 'pg_stat_monitor.pgsm_query_shared_buffer';", + extra_params => [ '-a', '-Pformat=aligned', '-Ptuples_only=off' ]); +ok($cmdret == 0, "Print PGTDE EXTENSION Settings"); +PGTDE::append_to_debug_file($stdout); + +# Create example database and run pgbench init +($cmdret, $stdout, $stderr) = + $node->psql('postgres', 'CREATE database example;', extra_params => ['-a']); +print "cmdret $cmdret\n"; +ok($cmdret == 0, "CREATE Database example"); +PGTDE::append_to_debug_file($stdout); + +my $port = $node->port; +print "port $port \n"; + +my $out = system("pgbench -i -s 20 -p $port example"); +print " out: $out \n"; +ok($cmdret == 0, "Perform pgbench init"); + +$out = system("pgbench -c 10 -j 2 -t 5000 -p $port example"); +print " out: $out \n"; +ok($cmdret == 0, "Run pgbench"); + +($cmdret, $stdout, $stderr) = $node->psql( + 'postgres', + 'SELECT datname, substr(query, 0, 150) AS query, SUM(calls) AS calls FROM pg_stat_monitor GROUP BY datname, query ORDER BY datname, query, calls;', + extra_params => [ '-a', '-Pformat=aligned', '-Ptuples_only=off' ]); +ok($cmdret == 0, "SELECT XXX FROM pg_stat_monitor"); +PGTDE::append_to_debug_file($stdout); + +$stdout = $node->safe_psql( + 'postgres', + 'DROP EXTENSION pg_tde;', + extra_params => ['-a']); +ok($cmdret == 0, "DROP PGTDE EXTENSION"); +PGTDE::append_to_result_file($stdout); + +$stdout = $node->safe_psql( + 'postgres', + 'DROP EXTENSION pg_stat_monitor;', + extra_params => ['-a']); +ok($cmdret == 0, "DROP PGTDE EXTENSION"); +PGTDE::append_to_debug_file($stdout); + +$node->stop; + +# Compare the expected and out file +my $compare = PGTDE->compare_results(); + +is($compare, 0, + "Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files." +); + +done_testing(); diff --git a/contrib/pg_tde/t/pg_basebackup.pl b/contrib/pg_tde/t/pg_basebackup.pl new file mode 100644 index 0000000000000..22a55b5be3f57 --- /dev/null +++ b/contrib/pg_tde/t/pg_basebackup.pl @@ -0,0 +1,49 @@ +use strict; +use warnings FATAL => 'all'; +use Config; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +program_help_ok('pg_basebackup'); +program_version_ok('pg_basebackup'); +program_options_handling_ok('pg_basebackup'); + +my $tempdir = PostgreSQL::Test::Utils::tempdir; + +my $node = PostgreSQL::Test::Cluster->new('main'); + +# Initialize node without replication settings +$node->init( + allows_streaming => 1, + extra => ['--data-checksums'], + auth_extra => [ '--create-role', 'backupuser' ]); +$node->start; + +# Sanity checks for options with WAL encryption +$node->command_fails_like( + [ 'pg_basebackup', '-D', "$tempdir/backup", '-E', '-Ft' ], + qr/can not encrypt WAL in tar mode/, + 'encryption in tar mode'); + +$node->command_fails_like( + [ 'pg_basebackup', '-D', "$tempdir/backup", '-E', '-X', 'fetch' ], + qr/WAL encryption can only be used with WAL streaming/, + 'encryption with WAL fetch'); + +$node->command_fails_like( + [ 'pg_basebackup', '-D', "$tempdir/backup", '-E', '-X', 'none' ], + qr/WAL encryption can only be used with WAL streaming/, + 'encryption with WAL none'); + +$node->command_fails_like( + [ 'pg_basebackup', '-D', "$tempdir/backup", '-E' ], + qr/could not find server principal key/, + 'encryption with no pg_tde dir'); + +$node->command_fails_like( + [ 'pg_basebackup', '-D', "$tempdir/backup", '--encrypt-wal' ], + qr/could not find server principal key/, + 'encryption with no pg_tde dir long flag'); + +done_testing(); diff --git a/contrib/pg_tde/t/pg_resetwal_basic.pl b/contrib/pg_tde/t/pg_resetwal_basic.pl new file mode 100644 index 0000000000000..78890f633cf83 --- /dev/null +++ b/contrib/pg_tde/t/pg_resetwal_basic.pl @@ -0,0 +1,150 @@ + +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; + +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +unlink('/tmp/pg_resetwal_basic.per'); + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->append_conf( + 'postgresql.conf', q{ +track_commit_timestamp = on + +# WAL Encryption +shared_preload_libraries = 'pg_tde' +}); + +$node->start; +$node->safe_psql('postgres', "CREATE EXTENSION pg_tde;"); +$node->safe_psql('postgres', + "SELECT pg_tde_add_global_key_provider_file('file-keyring-wal', '/tmp/pg_resetwal_basic.per');" +); +$node->safe_psql('postgres', + "SELECT pg_tde_create_key_using_global_key_provider('server-key', 'file-keyring-wal');" +); +$node->safe_psql('postgres', + "SELECT pg_tde_set_server_key_using_global_key_provider('server-key', 'file-keyring-wal');" +); + +$node->append_conf( + 'postgresql.conf', q{ +pg_tde.wal_encrypt = on +}); +$node->stop; + + +command_like([ 'pg_resetwal', '-n', $node->data_dir ], + qr/checkpoint/, 'pg_resetwal -n produces output'); + + +# Permissions on PGDATA should be default +SKIP: +{ + skip "unix-style permissions not supported on Windows", 1 + if ($windows_os); + + ok(check_mode_recursive($node->data_dir, 0700, 0600), + 'check PGDATA permissions'); +} + +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. + + +# 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/contrib/pg_tde/t/pg_resetwal_corrupted.pl b/contrib/pg_tde/t/pg_resetwal_corrupted.pl new file mode 100644 index 0000000000000..74cc66a2c8030 --- /dev/null +++ b/contrib/pg_tde/t/pg_resetwal_corrupted.pl @@ -0,0 +1,92 @@ + +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +# Tests for handling a corrupted pg_control + +use strict; +use warnings FATAL => 'all'; + +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +unlink('/tmp/pg_resetwal_corrupted.per'); + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->append_conf( + 'postgresql.conf', q{ + +# WAL Encryption +shared_preload_libraries = 'pg_tde' +}); + +$node->start; +$node->safe_psql('postgres', "CREATE EXTENSION pg_tde;"); +$node->safe_psql('postgres', + "SELECT pg_tde_add_global_key_provider_file('file-keyring-wal', '/tmp/pg_waldump_corrupted.per');" +); +$node->safe_psql('postgres', + "SELECT pg_tde_create_key_using_global_key_provider('server-key', 'file-keyring-wal');" +); +$node->safe_psql('postgres', + "SELECT pg_tde_set_server_key_using_global_key_provider('server-key', 'file-keyring-wal');" +); + +$node->append_conf( + 'postgresql.conf', q{ +pg_tde.wal_encrypt = on +}); +$node->stop; + +my $pg_control = $node->data_dir . '/global/pg_control'; +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 or die $!; +close $fh; + +# Fill pg_control with zeros +open $fh, '>', $pg_control or BAIL_OUT($!); +binmode $fh; +print $fh pack("x[$size]"); +close $fh; + +command_checks_all( + [ 'pg_resetwal', '-n', $node->data_dir ], + 0, + [qr/pg_control version number/], + [ + qr/pg_resetwal: warning: pg_control exists but is broken or wrong version; ignoring it/ + ], + 'processes corrupted pg_control all zeroes'); + +# Put in the previously saved header data. This uses a different code +# path internally, allowing us to process a zero WAL segment size. +open $fh, '>', $pg_control or BAIL_OUT($!); +binmode $fh; +print $fh $data, pack("x[" . ($size - 16) . "]"); +close $fh; + +command_checks_all( + [ 'pg_resetwal', '-n', $node->data_dir ], + 0, + [qr/pg_control version number/], + [ + qr/\Qpg_resetwal: warning: pg_control specifies invalid WAL segment size (0 bytes); proceed with caution\E/ + ], + 'processes zero WAL segment size'); + +# 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/contrib/pg_tde/t/pg_rewind_basic.pl b/contrib/pg_tde/t/pg_rewind_basic.pl new file mode 100644 index 0000000000000..d2cc4d22f0ed4 --- /dev/null +++ b/contrib/pg_tde/t/pg_rewind_basic.pl @@ -0,0 +1,214 @@ + +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Utils; +use Test::More; + +use FindBin; +use lib $FindBin::RealBin; + +use RewindTest; + +sub run_test +{ + my $test_mode = shift; + + RewindTest::setup_cluster($test_mode); + RewindTest::start_primary(); + + # Create 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')"); + + # This test table will be used to test truncation, i.e. the table + # is extended in the old primary after promotion + primary_psql("CREATE TABLE trunc_tbl (d text)"); + primary_psql("INSERT INTO trunc_tbl VALUES ('in primary')"); + + # This test table will be used to test the "copy-tail" case, i.e. the + # table is truncated in the old primary after promotion + primary_psql("CREATE TABLE tail_tbl (id integer, d text)"); + primary_psql("INSERT INTO tail_tbl VALUES (0, 'in primary')"); + + # This test table is dropped in the old primary after promotion. + primary_psql("CREATE TABLE drop_tbl (d text)"); + primary_psql("INSERT INTO drop_tbl VALUES ('in primary')"); + + primary_psql("CHECKPOINT"); + + RewindTest::create_standby($test_mode); + + # Insert additional data on primary that will be replicated to standby + primary_psql("INSERT INTO tbl1 values ('in primary, before promotion')"); + primary_psql( + "INSERT INTO trunc_tbl values ('in primary, before promotion')"); + primary_psql( + "INSERT INTO tail_tbl SELECT g, 'in primary, before promotion: ' || g FROM generate_series(1, 10000) g" + ); + + primary_psql('CHECKPOINT'); + + RewindTest::promote_standby(); + + # Insert a row in the old primary. This causes the primary and standby + # to have "diverged", it's no longer possible to just apply the + # 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 + # old primary. + standby_psql("INSERT INTO tbl1 VALUES ('in standby, after promotion')"); + + # Insert enough rows to trunc_tbl to extend the file. pg_rewind should + # truncate it back to the old size. + primary_psql( + "INSERT INTO trunc_tbl SELECT 'in primary, after promotion: ' || g FROM generate_series(1, 10000) g" + ); + + # Truncate tail_tbl. pg_rewind should copy back the truncated part + # (We cannot use an actual TRUNCATE command here, as that creates a + # whole new relfilenode) + primary_psql("DELETE FROM tail_tbl WHERE id > 10"); + primary_psql("VACUUM tail_tbl"); + + # Drop drop_tbl. pg_rewind should copy it back. + primary_psql( + "insert into drop_tbl values ('in primary, after promotion')"); + primary_psql("DROP TABLE drop_tbl"); + + # 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 + # in "local" mode for simplicity's sake. + if ($test_mode eq 'local') + { + my $primary_pgdata = $node_primary->data_dir; + my $standby_pgdata = $node_standby->data_dir; + + # First check that pg_rewind fails if the target cluster is + # not stopped as it fails to start up for the forced recovery + # step. + command_fails( + [ + 'pg_rewind', '--debug', + '--source-pgdata', $standby_pgdata, + '--target-pgdata', $primary_pgdata, + '--no-sync' + ], + 'pg_rewind with running target'); + + # Again with --no-ensure-shutdown, which should equally fail. + # This time pg_rewind complains without attempting to perform + # recovery once. + command_fails( + [ + 'pg_rewind', '--debug', + '--source-pgdata', $standby_pgdata, + '--target-pgdata', $primary_pgdata, + '--no-sync', '--no-ensure-shutdown' + ], + 'pg_rewind --no-ensure-shutdown with running target'); + + # Stop the target, and attempt to run with a local source + # still running. This fails as pg_rewind requires to have + # a source cleanly stopped. + $node_primary->stop; + command_fails( + [ + 'pg_rewind', '--debug', + '--source-pgdata', $standby_pgdata, + '--target-pgdata', $primary_pgdata, + '--no-sync', '--no-ensure-shutdown' + ], + 'pg_rewind with unexpected running source'); + + # Stop the target cluster cleanly, and run again pg_rewind + # with --dry-run mode. If anything gets generated in the data + # folder, the follow-up run of pg_rewind will most likely fail, + # so keep this test as the last one of this subset. + $node_standby->stop; + command_ok( + [ + 'pg_rewind', '--debug', + '--source-pgdata', $standby_pgdata, + '--target-pgdata', $primary_pgdata, + '--no-sync', '--dry-run' + ], + 'pg_rewind --dry-run'); + + # Both clusters need to be alive moving forward. + $node_standby->start; + $node_primary->start; + } + + RewindTest::run_pg_rewind($test_mode); + + check_query( + 'SELECT * FROM space_tbl ORDER BY d', + qq(in primary, before promotion +in standby, after promotion +), + 'table content'); + + check_query( + 'SELECT * FROM tbl1', + qq(in primary +in primary, before promotion +in standby, after promotion +), + 'table content'); + + check_query( + 'SELECT * FROM trunc_tbl', + qq(in primary +in primary, before promotion +), + 'truncation'); + + check_query( + 'SELECT count(*) FROM tail_tbl', + qq(10001 +), + 'tail-copy'); + + check_query( + 'SELECT * FROM drop_tbl', + qq(in primary +), + 'drop'); + + # Permissions on PGDATA should be default + SKIP: + { + skip "unix-style permissions not supported on Windows", 1 + if ($windows_os); + + ok(check_mode_recursive($node_primary->data_dir(), 0700, 0600), + 'check PGDATA permissions'); + } + + RewindTest::clean_rewind_test(); + return; +} + +# Run the test in both modes +run_test('local'); +run_test('remote'); +run_test('archive'); + +done_testing(); diff --git a/contrib/pg_tde/t/pg_rewind_databases.pl b/contrib/pg_tde/t/pg_rewind_databases.pl new file mode 100644 index 0000000000000..755ea80e332f9 --- /dev/null +++ b/contrib/pg_tde/t/pg_rewind_databases.pl @@ -0,0 +1,77 @@ + +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Utils; +use Test::More; + +use FindBin; +use lib $FindBin::RealBin; + +use RewindTest; + +sub run_test +{ + my $test_mode = shift; + + RewindTest::setup_cluster($test_mode, ['-g']); + RewindTest::start_primary(); + + # Create a database in primary with a table. + primary_psql('CREATE DATABASE inprimary'); + primary_psql('CREATE TABLE inprimary_tab (a int)', 'inprimary'); + + RewindTest::create_standby($test_mode); + + # Create another database with another table, the creation is + # replicated to the standby. + primary_psql('CREATE DATABASE beforepromotion'); + primary_psql('CREATE TABLE beforepromotion_tab (a int)', + 'beforepromotion'); + + RewindTest::promote_standby(); + + # Create databases in the old primary and the new promoted standby. + primary_psql('CREATE DATABASE primary_afterpromotion'); + primary_psql('CREATE TABLE primary_promotion_tab (a int)', + 'primary_afterpromotion'); + standby_psql('CREATE DATABASE standby_afterpromotion'); + standby_psql('CREATE TABLE standby_promotion_tab (a int)', + 'standby_afterpromotion'); + + # The clusters are now diverged. + + RewindTest::run_pg_rewind($test_mode); + + # Check that the correct databases are present after pg_rewind. + check_query( + 'SELECT datname FROM pg_database ORDER BY 1', + qq(beforepromotion +inprimary +postgres +standby_afterpromotion +template0 +template1 +), + 'database names'); + + # Permissions on PGDATA should have group permissions + SKIP: + { + skip "unix-style permissions not supported on Windows", 1 + if ($windows_os || $Config::Config{osname} eq 'cygwin'); + + ok(check_mode_recursive($node_primary->data_dir(), 0750, 0640), + 'check PGDATA permissions'); + } + + RewindTest::clean_rewind_test(); + return; +} + +# Run the test in both modes. +run_test('local'); +run_test('remote'); + +done_testing(); diff --git a/contrib/pg_tde/t/pg_rewind_extrafiles.pl b/contrib/pg_tde/t/pg_rewind_extrafiles.pl new file mode 100644 index 0000000000000..097b0fde9d90a --- /dev/null +++ b/contrib/pg_tde/t/pg_rewind_extrafiles.pl @@ -0,0 +1,124 @@ + +# 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 FATAL => 'all'; +use Config; +use PostgreSQL::Test::Utils; +use Test::More; + +use File::Find; + +use FindBin; +use lib $FindBin::RealBin; + +use RewindTest; + + +sub run_test +{ + my $test_mode = shift; + + RewindTest::setup_cluster($test_mode); + RewindTest::start_primary(); + + my $test_primary_datadir = $node_primary->data_dir; + + # Create a subdir and files that will be present in both + mkdir "$test_primary_datadir/tst_both_dir"; + append_to_file "$test_primary_datadir/tst_both_dir/both_file1", + "in both1"; + append_to_file "$test_primary_datadir/tst_both_dir/both_file2", + "in both2"; + mkdir "$test_primary_datadir/tst_both_dir/both_subdir/"; + append_to_file + "$test_primary_datadir/tst_both_dir/both_subdir/both_file3", + "in both3"; + + RewindTest::create_standby($test_mode); + + # Create different subdirs and files in primary and standby + my $test_standby_datadir = $node_standby->data_dir; + + mkdir "$test_standby_datadir/tst_standby_dir"; + append_to_file "$test_standby_datadir/tst_standby_dir/standby_file1", + "in standby1"; + append_to_file "$test_standby_datadir/tst_standby_dir/standby_file2", + "in standby2"; + append_to_file + "$test_standby_datadir/tst_standby_dir/standby_file3 with 'quotes'", + "in standby3"; + mkdir "$test_standby_datadir/tst_standby_dir/standby_subdir/"; + append_to_file + "$test_standby_datadir/tst_standby_dir/standby_subdir/standby_file4", + "in standby4"; + # 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", + "in primary1"; + append_to_file "$test_primary_datadir/tst_primary_dir/primary_file2", + "in primary2"; + mkdir "$test_primary_datadir/tst_primary_dir/primary_subdir/"; + append_to_file + "$test_primary_datadir/tst_primary_dir/primary_subdir/primary_file3", + "in primary3"; + + RewindTest::promote_standby(); + RewindTest::run_pg_rewind($test_mode); + + # List files in the data directory after rewind. All the files that + # were present in the standby should be present after rewind, and + # all the files that were added on the primary should be removed. + my @paths; + find( + sub { + push @paths, $File::Find::name + if $File::Find::name =~ m/.*tst_.*/; + }, + $test_primary_datadir); + @paths = sort @paths; + + # 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, + [ + "$test_primary_datadir/tst_both_dir", + "$test_primary_datadir/tst_both_dir/both_file1", + "$test_primary_datadir/tst_both_dir/both_file2", + "$test_primary_datadir/tst_both_dir/both_subdir", + "$test_primary_datadir/tst_both_dir/both_subdir/both_file3", + "$test_primary_datadir/tst_standby_dir", + "$test_primary_datadir/tst_standby_dir/standby_file1", + "$test_primary_datadir/tst_standby_dir/standby_file2", + "$test_primary_datadir/tst_standby_dir/standby_file3 with 'quotes'", + "$test_primary_datadir/tst_standby_dir/standby_subdir", + "$test_primary_datadir/tst_standby_dir/standby_subdir/standby_file4" + ], + "file lists match"); + + RewindTest::clean_rewind_test(); + return; +} + +# Run the test in both modes. +run_test('local'); +run_test('remote'); + +done_testing(); diff --git a/contrib/pg_tde/t/pg_rewind_growing_files.pl b/contrib/pg_tde/t/pg_rewind_growing_files.pl new file mode 100644 index 0000000000000..8e59ad6996168 --- /dev/null +++ b/contrib/pg_tde/t/pg_rewind_growing_files.pl @@ -0,0 +1,77 @@ + +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Utils; +use Test::More; + +use FindBin; +use lib $FindBin::RealBin; + +use RewindTest; + +RewindTest::setup_cluster("local"); +RewindTest::start_primary(); + +# Create a test table and insert a row in primary. +primary_psql("CREATE TABLE tbl1 (d text)"); +primary_psql("INSERT INTO tbl1 VALUES ('in primary')"); +primary_psql("CHECKPOINT"); + +RewindTest::create_standby("local"); + +# Insert additional data on primary that will be replicated to standby +primary_psql("INSERT INTO tbl1 values ('in primary, before promotion')"); +primary_psql('CHECKPOINT'); + +RewindTest::promote_standby(); + +# Insert a row in the old primary. This causes the primary and standby to have +# "diverged", it's no longer possible to just apply the 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')"); +standby_psql("INSERT INTO tbl1 VALUES ('in standby, after promotion')"); + +# Stop the nodes before running pg_rewind +$node_standby->stop; +$node_primary->stop; + +my $primary_pgdata = $node_primary->data_dir; +my $standby_pgdata = $node_standby->data_dir; + +# Add an extra file that we can tamper with without interfering with the data +# directory data files. +mkdir "$standby_pgdata/tst_both_dir"; +append_to_file "$standby_pgdata/tst_both_dir/file1", 'a'; + +# Run pg_rewind and pipe the output from the run into the extra file we want +# to copy. This will ensure that the file is continuously growing during the +# copy operation and the result will be an error. +my $ret = run_log( + [ + 'pg_rewind', '--debug', + '--source-pgdata', $standby_pgdata, + '--target-pgdata', $primary_pgdata, + '--no-sync', + ], + '2>>', + "$standby_pgdata/tst_both_dir/file1"); +ok(!$ret, 'Error out on copying growing file'); + +# Ensure that the files are of different size, the final error message should +# only be in one of them making them guaranteed to be different +my $primary_size = -s "$primary_pgdata/tst_both_dir/file1"; +my $standby_size = -s "$standby_pgdata/tst_both_dir/file1"; +isnt($standby_size, $primary_size, "File sizes should differ"); + +# Extract the last line from the verbose output as that should have the error +# message for the unexpected file size +my $last; +open my $f, '<', "$standby_pgdata/tst_both_dir/file1" or die $!; +$last = $_ while (<$f>); +close $f; +like($last, qr/error: size of source file/, "Check error message"); + +done_testing(); diff --git a/contrib/pg_tde/t/pg_rewind_keep_recycled_wals.pl b/contrib/pg_tde/t/pg_rewind_keep_recycled_wals.pl new file mode 100644 index 0000000000000..bf0084d3bc358 --- /dev/null +++ b/contrib/pg_tde/t/pg_rewind_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/contrib/pg_tde/t/pg_rewind_min_recovery_point.pl b/contrib/pg_tde/t/pg_rewind_min_recovery_point.pl new file mode 100644 index 0000000000000..65b66df6333e7 --- /dev/null +++ b/contrib/pg_tde/t/pg_rewind_min_recovery_point.pl @@ -0,0 +1,168 @@ + +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +# +# Test situation where a target data directory contains +# WAL records beyond both the last checkpoint and the divergence +# point: +# +# Target WAL (TLI 2): +# +# backup ... Checkpoint A ... INSERT 'rewind this' +# (TLI 1 -> 2) +# +# ^ last common ^ minRecoveryPoint +# checkpoint +# +# Source WAL (TLI 3): +# +# backup ... Checkpoint A ... Checkpoint B ... INSERT 'keep this' +# (TLI 1 -> 2) (TLI 2 -> 3) +# +# +# The last common checkpoint is Checkpoint A. But there is WAL on TLI 2 +# after the last common checkpoint that needs to be rewound. We used to +# have a bug where minRecoveryPoint was ignored, and pg_rewind concluded +# that the target doesn't need rewinding in this scenario, because the +# last checkpoint on the target TLI was an ancestor of the source TLI. +# +# +# This test does not make use of RewindTest as it requires three +# nodes. + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +use File::Copy; + +my $tmp_folder = PostgreSQL::Test::Utils::tempdir; + +my $node_1 = PostgreSQL::Test::Cluster->new('node_1'); +$node_1->init(allows_streaming => 1); +$node_1->append_conf( + 'postgresql.conf', qq( +wal_keep_size='100 MB' +)); + +$node_1->start; + +# Create a couple of test tables +$node_1->safe_psql('postgres', 'CREATE TABLE public.foo (t TEXT)'); +$node_1->safe_psql('postgres', 'CREATE TABLE public.bar (t TEXT)'); +$node_1->safe_psql('postgres', "INSERT INTO public.bar VALUES ('in both')"); + +# +# Create node_2 and node_3 as standbys following node_1 +# +my $backup_name = 'my_backup'; +$node_1->backup($backup_name); + +my $node_2 = PostgreSQL::Test::Cluster->new('node_2'); +$node_2->init_from_backup($node_1, $backup_name, has_streaming => 1); +$node_2->start; + +my $node_3 = PostgreSQL::Test::Cluster->new('node_3'); +$node_3->init_from_backup($node_1, $backup_name, has_streaming => 1); +$node_3->start; + +# Wait until node 3 has connected and caught up +$node_1->wait_for_catchup('node_3'); + +# +# Swap the roles of node_1 and node_3, so that node_1 follows node_3. +# +$node_1->stop('fast'); +$node_3->promote; + +# reconfigure node_1 as a standby following node_3 +my $node_3_connstr = $node_3->connstr; +$node_1->append_conf( + 'postgresql.conf', qq( +primary_conninfo='$node_3_connstr' +)); +$node_1->set_standby_mode(); +$node_1->start(); + +# also reconfigure node_2 to follow node_3 +$node_2->append_conf( + 'postgresql.conf', qq( +primary_conninfo='$node_3_connstr' +)); +$node_2->restart(); + +# +# Promote node_1, to create a split-brain scenario. +# + +# make sure node_1 is full caught up with node_3 first +$node_3->wait_for_catchup('node_1'); + +$node_1->promote; + +# +# We now have a split-brain with two primaries. Insert a row on both to +# demonstratively create a split brain. After the rewind, we should only +# see the insert on 1, as the insert on node 3 is rewound away. +# +$node_1->safe_psql('postgres', + "INSERT INTO public.foo (t) VALUES ('keep this')"); +# 'bar' is unmodified in node 1, so it won't be overwritten by replaying the +# WAL from node 1. +$node_3->safe_psql('postgres', + "INSERT INTO public.bar (t) VALUES ('rewind this')"); + +# Insert more rows in node 1, to bump up the XID counter. Otherwise, if +# rewind doesn't correctly rewind the changes made on the other node, +# we might fail to notice if the inserts are invisible because the XIDs +# are not marked as committed. +$node_1->safe_psql('postgres', + "INSERT INTO public.foo (t) VALUES ('and this')"); +$node_1->safe_psql('postgres', + "INSERT INTO public.foo (t) VALUES ('and this too')"); + +# Wait for node 2 to catch up +$node_2->poll_query_until('postgres', + q|SELECT COUNT(*) > 1 FROM public.bar|, 't'); + +# At this point node_2 will shut down without a shutdown checkpoint, +# but with WAL entries beyond the preceding shutdown checkpoint. +$node_2->stop('fast'); +$node_3->stop('fast'); + +my $node_2_pgdata = $node_2->data_dir; +my $node_1_connstr = $node_1->connstr; + +# Keep a temporary postgresql.conf or it would be overwritten during the rewind. +copy( + "$node_2_pgdata/postgresql.conf", + "$tmp_folder/node_2-postgresql.conf.tmp"); + +command_ok( + [ + 'pg_rewind', "--source-server=$node_1_connstr", + "--target-pgdata=$node_2_pgdata", "--debug" + ], + 'run pg_rewind'); + +# Now move back postgresql.conf with old settings +move( + "$tmp_folder/node_2-postgresql.conf.tmp", + "$node_2_pgdata/postgresql.conf"); + +$node_2->start; + +# Check contents of the test tables after rewind. The rows inserted in node 3 +# before rewind should've been overwritten with the data from node 1. +my $result; +$result = $node_2->safe_psql('postgres', 'SELECT * FROM public.foo'); +is( $result, qq(keep this +and this +and this too), 'table foo after rewind'); + +$result = $node_2->safe_psql('postgres', 'SELECT * FROM public.bar'); +is($result, qq(in both), 'table bar after rewind'); + +done_testing(); diff --git a/contrib/pg_tde/t/pg_rewind_options.pl b/contrib/pg_tde/t/pg_rewind_options.pl new file mode 100644 index 0000000000000..5917bb741d510 --- /dev/null +++ b/contrib/pg_tde/t/pg_rewind_options.pl @@ -0,0 +1,45 @@ + +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +# +# Test checking options of pg_rewind. +# +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Utils; +use Test::More; + +program_help_ok('pg_rewind'); +program_version_ok('pg_rewind'); +program_options_handling_ok('pg_rewind'); + +my $primary_pgdata = PostgreSQL::Test::Utils::tempdir; +my $standby_pgdata = PostgreSQL::Test::Utils::tempdir; +command_fails( + [ + 'pg_rewind', '--debug', + '--target-pgdata', $primary_pgdata, + '--source-pgdata', $standby_pgdata, + 'extra_arg1' + ], + 'too many arguments'); +command_fails([ 'pg_rewind', '--target-pgdata', $primary_pgdata ], + 'no source specified'); +command_fails( + [ + 'pg_rewind', '--debug', + '--target-pgdata', $primary_pgdata, + '--source-pgdata', $standby_pgdata, + '--source-server', 'incorrect_source' + ], + 'both remote and local sources specified'); +command_fails( + [ + 'pg_rewind', '--debug', + '--target-pgdata', $primary_pgdata, + '--source-pgdata', $standby_pgdata, + '--write-recovery-conf' + ], + 'no local source with --write-recovery-conf'); + +done_testing(); diff --git a/contrib/pg_tde/t/pg_rewind_pg_xlog_symlink.pl b/contrib/pg_tde/t/pg_rewind_pg_xlog_symlink.pl new file mode 100644 index 0000000000000..8f63b3707ee07 --- /dev/null +++ b/contrib/pg_tde/t/pg_rewind_pg_xlog_symlink.pl @@ -0,0 +1,80 @@ + +# 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 FATAL => 'all'; +use File::Copy; +use File::Path qw(rmtree); +use PostgreSQL::Test::Utils; +use Test::More; + +use FindBin; +use lib $FindBin::RealBin; + +use RewindTest; + +sub run_test +{ + my $test_mode = shift; + + my $primary_xlogdir = + "${PostgreSQL::Test::Utils::tmp_check}/xlog_primary"; + + rmtree($primary_xlogdir); + RewindTest::setup_cluster($test_mode); + + my $test_primary_datadir = $node_primary->data_dir; + + # turn pg_wal into a symlink + print("moving $test_primary_datadir/pg_wal to $primary_xlogdir\n"); + move("$test_primary_datadir/pg_wal", $primary_xlogdir) or die; + dir_symlink($primary_xlogdir, "$test_primary_datadir/pg_wal") or die; + + RewindTest::start_primary(); + + # Create a test table and insert a row in primary. + primary_psql("CREATE TABLE tbl1 (d text)"); + primary_psql("INSERT INTO tbl1 VALUES ('in primary')"); + + primary_psql("CHECKPOINT"); + + RewindTest::create_standby($test_mode); + + # Insert additional data on primary that will be replicated to standby + primary_psql("INSERT INTO tbl1 values ('in primary, before promotion')"); + + primary_psql('CHECKPOINT'); + + RewindTest::promote_standby(); + + # Insert a row in the old primary. This causes the primary and standby + # to have "diverged", it's no longer possible to just apply the + # 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 + # old primary. + standby_psql("INSERT INTO tbl1 VALUES ('in standby, after promotion')"); + + RewindTest::run_pg_rewind($test_mode); + + check_query( + 'SELECT * FROM tbl1', + qq(in primary +in primary, before promotion +in standby, after promotion +), + 'table content'); + + RewindTest::clean_rewind_test(); + return; +} + +# Run the test in both modes +run_test('local'); +run_test('remote'); + +done_testing(); diff --git a/contrib/pg_tde/t/pg_rewind_same_timeline.pl b/contrib/pg_tde/t/pg_rewind_same_timeline.pl new file mode 100644 index 0000000000000..c8f5365ee7b0c --- /dev/null +++ b/contrib/pg_tde/t/pg_rewind_same_timeline.pl @@ -0,0 +1,24 @@ + +# 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 FATAL => 'all'; +use PostgreSQL::Test::Utils; +use Test::More; + +use FindBin; +use lib $FindBin::RealBin; + +use RewindTest; + +RewindTest::setup_cluster(); +RewindTest::start_primary(); +RewindTest::create_standby(); +RewindTest::run_pg_rewind('local'); +RewindTest::clean_rewind_test(); + +done_testing(); diff --git a/contrib/pg_tde/t/pg_tde_change_key_provider.pl b/contrib/pg_tde/t/pg_tde_change_key_provider.pl new file mode 100644 index 0000000000000..561a899c167f4 --- /dev/null +++ b/contrib/pg_tde/t/pg_tde_change_key_provider.pl @@ -0,0 +1,321 @@ +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; + +use JSON; + +command_like([ 'pg_tde_change_key_provider', '--help' ], + qr/Usage:/, 'displays help'); + +command_like( + [ 'pg_tde_change_key_provider', '--version' ], + qr/pg_tde_change_key_provider \(PostgreSQL\) /, + 'displays version'); + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->append_conf('postgresql.conf', q{shared_preload_libraries = 'pg_tde'}); +$node->start; + +$node->safe_psql('postgres', q{CREATE EXTENSION pg_tde}); +$node->safe_psql('postgres', + q{SELECT pg_tde_add_global_key_provider_file('global-provider', '/tmp/pg_tde_change_key_provider-global')} +); +$node->safe_psql('postgres', + q{SELECT pg_tde_add_database_key_provider_file('database-provider', '/tmp/pg_tde_change_key_provider-database')} +); +my $db_oid = $node->safe_psql('postgres', + q{SELECT oid FROM pg_catalog.pg_database WHERE datname = 'postgres'}); +my $options; + +my $token_file = "${PostgreSQL::Test::Utils::tmp_check}/vault_token"; +append_to_file($token_file, 'DUMMY'); + +$node->stop; + +command_like( + [ + 'pg_tde_change_key_provider', + '-D' => $node->data_dir, + $db_oid, + 'database-provider', + 'file', + '/tmp/pg_tde_change_key_provider-database-2', + ], + qr/Key provider updated successfully!/, + 'updates key provider to file type'); + +$node->start; + +is( $node->safe_psql( + 'postgres', + q{SELECT type FROM pg_tde_list_all_database_key_providers() WHERE name = 'database-provider'} + ), + 'file', + 'provider type is set to file'); + +$options = decode_json( + $node->safe_psql( + 'postgres', + q{SELECT options FROM pg_tde_list_all_database_key_providers() WHERE name = 'database-provider'} + )); +is( $options->{path}, + '/tmp/pg_tde_change_key_provider-database-2', + 'path is set correctly for file provider'); + +$node->stop; + +command_like( + [ + 'pg_tde_change_key_provider', + '-D' => $node->data_dir, + $db_oid, + 'database-provider', + 'vault-v2', + 'https://vault-server.example:8200/', + 'mount-path', + $token_file, + '/tmp/ca_path', + ], + qr/Key provider updated successfully!/, + 'updates key provider to vault-v2 type with https'); + +$node->start; + +is( $node->safe_psql( + 'postgres', + q{SELECT type FROM pg_tde_list_all_database_key_providers() WHERE name = 'database-provider'} + ), + 'vault-v2', + 'provider type is set to vault-v2'); + +$options = decode_json( + $node->safe_psql( + 'postgres', + q{SELECT options FROM pg_tde_list_all_database_key_providers() WHERE name = 'database-provider'} + )); +is( $options->{url}, + 'https://vault-server.example:8200/', + 'url is set correctly for vault-v2 provider'); +is($options->{mountPath}, 'mount-path', + 'mount path is set correctly for vault-v2 provider'); +is($options->{tokenPath}, $token_file, + 'tokenPath is set correctly for vault-v2 provider'); +is($options->{caPath}, '/tmp/ca_path', + 'CA path is set correctly for vault-v2 provider'); + +$node->stop; + +command_like( + [ + 'pg_tde_change_key_provider', + '-D' => $node->data_dir, + $db_oid, + 'database-provider', + 'vault-v2', + 'http://vault-server.example:8200/', + 'mount-path-2', + $token_file, + ], + qr/Key provider updated successfully!/, + 'updates key provider to vault-v2 type with http'); + +$node->start; + +is( $node->safe_psql( + 'postgres', + q{SELECT type FROM pg_tde_list_all_database_key_providers() WHERE name = 'database-provider'} + ), + 'vault-v2', + 'provider type is set to vault-v2'); + +$options = decode_json( + $node->safe_psql( + 'postgres', + q{SELECT options FROM pg_tde_list_all_database_key_providers() WHERE name = 'database-provider'} + )); +is( $options->{url}, + 'http://vault-server.example:8200/', + 'url is set correctly for vault-v2 provider'); +is($options->{mountPath}, 'mount-path-2', + 'mount path is set correctly for vault-v2 provider'); +is($options->{tokenPath}, $token_file, + 'tokenPath is set correctly for vault-v2 provider'); +is($options->{caPath}, '', 'CA path is set correctly for vault-v2 provider'); + +$node->stop; + +command_like( + [ + 'pg_tde_change_key_provider', + '-D' => $node->data_dir, + $db_oid, + 'database-provider', + 'kmip', + 'kmip-server.example', + '12345', + '/tmp/cert_path', + '/tmp/key_path', + '/tmp/ca_path', + ], + qr/Key provider updated successfully!/, + 'updates key provider to kmip type'); + +$node->start; + +is( $node->safe_psql( + 'postgres', + q{SELECT type FROM pg_tde_list_all_database_key_providers() WHERE name = 'database-provider'} + ), + 'kmip', + 'provider type is set to kmip'); + +$options = decode_json( + $node->safe_psql( + 'postgres', + q{SELECT options FROM pg_tde_list_all_database_key_providers() WHERE name = 'database-provider'} + )); +is($options->{host}, 'kmip-server.example', + 'host is set correctly for kmip provider'); +is($options->{port}, '12345', 'port is set correctly for kmip provider'); +is($options->{certPath}, '/tmp/cert_path', + 'client cert path is set correctly for kmip provider'); +is($options->{keyPath}, '/tmp/key_path', + 'client cert key path is set correctly for kmip provider'); +is($options->{caPath}, '/tmp/ca_path', + 'CA path is set correctly for kmip provider'); + +$node->stop; + +command_like( + [ + 'pg_tde_change_key_provider', + '-D' => $node->data_dir, + '1664', + 'global-provider', + 'vault-v2', + 'http://vault-server.example:8200/', + 'mount-path', + $token_file, + '/tmp/ca_path', + ], + qr/Key provider updated successfully!/, + 'updates key provider to vault-v2 type for global provider'); + +$node->start; + +is( $node->safe_psql( + 'postgres', + q{SELECT type FROM pg_tde_list_all_global_key_providers() WHERE name = 'global-provider'} + ), + 'vault-v2', + 'provider type is set to vault-v2 for global provider'); + +$options = decode_json( + $node->safe_psql( + 'postgres', + q{SELECT options FROM pg_tde_list_all_global_key_providers() WHERE name = 'global-provider'} + )); +is( $options->{url}, + 'http://vault-server.example:8200/', + 'options are updated for global provider'); + +$node->stop; + +command_fails_like( + [ + 'pg_tde_change_key_provider', + '-D' => '/non/existing/path', + '1664', + 'global-provider', + 'file', + '/tmp/file', + ], + qr{pg_tde_change_key_provider: error: could not open file "/non/existing/path/global/pg_control" for reading: No such file or directory}, + 'gives error on incorrect data dir'); + +$node->start; +command_fails_like( + [ + 'pg_tde_change_key_provider', + '-D' => $node->data_dir, + '1664', + 'global-provider', + 'file', + '/tmp/file', + ], + qr/pg_tde_change_key_provider: error: cluster must be shut down/, + 'gives error on if cluster is running'); +$node->stop; + +command_fails_like( + [ + 'pg_tde_change_key_provider', + '-D' => $node->data_dir, + '12345678', + 'global-provider', + 'file', + '/tmp/file', + ], + qr/error: could not open tde file "[^"]+": No such file or directory/, + 'gives error on unknown database oid'); + +command_fails_like( + [ + 'pg_tde_change_key_provider', + '-D' => $node->data_dir, + '1664', + 'incorrect-global-provider', + 'file', + '/tmp/file', + ], + qr/error: provder "incorrect-global-provider" not found for database 1664/, + 'gives error on unknown key provider'); + +command_fails_like( + [ + 'pg_tde_change_key_provider', + '-D' => $node->data_dir, + '1664', + 'global-provider', + 'incorrect-provider-type', + ], + qr/error: unknown provider type "incorrect-provider-type"/, + 'gives error on unknown provider type'); + +command_fails_like( + [ + 'pg_tde_change_key_provider', + '-D' => $node->data_dir, + '1664', + 'global-provider', + 'file', + ], + qr/error: wrong number of arguments for "file"/, + 'gives error on missing arguments for file provider'); + +command_fails_like( + [ + 'pg_tde_change_key_provider', + '-D' => $node->data_dir, + '1664', + 'global-provider', + 'kmip', + ], + qr/error: wrong number of arguments for "kmip"/, + 'gives error on missing arguments for kmip provider'); + +command_fails_like( + [ + 'pg_tde_change_key_provider', + '-D' => $node->data_dir, + '1664', + 'global-provider', + 'vault-v2', + ], + qr/error: wrong number of arguments for "vault-v2"/, + 'gives error on missing arguments for vault-v2 provider'); + +done_testing(); diff --git a/src/bin/pg_waldump/t/003_basic_encrypted.pl b/contrib/pg_tde/t/pg_waldump_basic.pl similarity index 81% rename from src/bin/pg_waldump/t/003_basic_encrypted.pl rename to contrib/pg_tde/t/pg_waldump_basic.pl index 1fd4fad129ad9..57bc28cb38368 100644 --- a/src/bin/pg_waldump/t/003_basic_encrypted.pl +++ b/contrib/pg_tde/t/pg_waldump_basic.pl @@ -7,6 +7,8 @@ use PostgreSQL::Test::Utils; use Test::More; +unlink('/tmp/pg_waldump_basic.per'); + my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; $node->append_conf( @@ -26,9 +28,16 @@ }); $node->start; -$node->safe_psql('postgres', "CREATE EXTENSION IF NOT EXISTS pg_tde;"); -$node->safe_psql('postgres', "SELECT pg_tde_add_global_key_provider_file('file-keyring-wal','/tmp/pg_tde_test_keyring-wal.per');");; -$node->safe_psql('postgres', "SELECT pg_tde_set_server_principal_key('global-db-principal-key', 'file-keyring-wal');"); +$node->safe_psql('postgres', "CREATE EXTENSION pg_tde;"); +$node->safe_psql('postgres', + "SELECT pg_tde_add_global_key_provider_file('file-keyring-wal', '/tmp/pg_waldump_basic.per');" +); +$node->safe_psql('postgres', + "SELECT pg_tde_create_key_using_global_key_provider('server-key', 'file-keyring-wal');" +); +$node->safe_psql('postgres', + "SELECT pg_tde_set_server_key_using_global_key_provider('server-key', 'file-keyring-wal');" +); $node->append_conf( 'postgresql.conf', q{ @@ -36,7 +45,6 @@ }); $node->restart; - 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())} @@ -128,48 +136,74 @@ [ 'pg_waldump', 'foo', 'bar' ], qr/error: could not locate WAL file "foo"/, 'start file not found'); -command_like([ 'pg_waldump', '-k', $node->data_dir. '/pg_tde', $node->data_dir . '/pg_wal/' . $start_walfile ], - qr/./, 'runs with start segment specified'); +command_like( + [ + 'pg_waldump', '-k', + $node->data_dir . '/pg_tde', + $node->data_dir . '/pg_wal/' . $start_walfile + ], + qr/./, + 'runs with start segment specified'); command_fails_like( - [ 'pg_waldump', '-k', $node->data_dir. '/pg_tde', $node->data_dir . '/pg_wal/' . $start_walfile, 'bar' ], + [ + 'pg_waldump', '-k', + $node->data_dir . '/pg_tde', + $node->data_dir . '/pg_wal/' . $start_walfile, 'bar' + ], qr/error: could not open file "bar"/, 'end file not found'); command_like( [ 'pg_waldump', - '-k', $node->data_dir. '/pg_tde', + '-k', + $node->data_dir . '/pg_tde', $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, '-k', $node->data_dir. '/pg_tde' ], + [ + 'pg_waldump', '-p', $node->data_dir, '-k', + $node->data_dir . '/pg_tde' + ], 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, - '-k', $node->data_dir. '/pg_tde' + 'pg_waldump', '-p', + $node->data_dir, '--start', + $start_lsn, '--end', + $end_lsn, '-k', + $node->data_dir . '/pg_tde' ], qr/./, 'runs with path option and start and end locations'); command_fails_like( - [ 'pg_waldump', '-k', $node->data_dir. '/pg_tde', '-p', $node->data_dir, '--start', $start_lsn ], + [ + 'pg_waldump', '-k', + $node->data_dir . '/pg_tde', '-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', - '-k', $node->data_dir. '/pg_tde', + 'pg_waldump', '--quiet', '-k', + $node->data_dir . '/pg_tde', $node->data_dir . '/pg_wal/' . $start_walfile ], qr/^$/, 'no output with --quiet option'); command_fails_like( - [ 'pg_waldump', '--quiet', '-k', $node->data_dir. '/pg_tde', '-p', $node->data_dir, '--start', $start_lsn ], + [ + 'pg_waldump', '--quiet', + '-k', $node->data_dir . '/pg_tde', + '-p', $node->data_dir, + '--start', $start_lsn + ], qr/error: error in WAL record at/, 'errors are shown with --quiet'); @@ -187,9 +221,8 @@ my (@cmd, $stdout, $stderr, $result); @cmd = ( - 'pg_waldump', '-k', $node->data_dir. '/pg_tde', - '--start', $new_start, - $node->data_dir . '/pg_wal/' . $start_walfile); + 'pg_waldump', '-k', $node->data_dir . '/pg_tde', + '--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'); @@ -206,8 +239,11 @@ sub test_pg_waldump my (@cmd, $stdout, $stderr, $result, @lines); @cmd = ( - 'pg_waldump', '-k', $node->data_dir. '/pg_tde', '-p', $node->data_dir, - '--start', $start_lsn, '--end', $end_lsn); + 'pg_waldump', '-k', + $node->data_dir . '/pg_tde', '-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"); diff --git a/src/bin/pg_waldump/t/004_save_fullpage_encrypted.pl b/contrib/pg_tde/t/pg_waldump_fullpage.pl similarity index 86% rename from src/bin/pg_waldump/t/004_save_fullpage_encrypted.pl rename to contrib/pg_tde/t/pg_waldump_fullpage.pl index 9b88ec89a9b1b..5d5fe24c7e4a6 100644 --- a/src/bin/pg_waldump/t/004_save_fullpage_encrypted.pl +++ b/contrib/pg_tde/t/pg_waldump_fullpage.pl @@ -29,6 +29,8 @@ sub get_block_lsn return ($lsn_hi, $lsn_lo); } +unlink('/tmp/pg_waldump_fullpage.per'); + my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; $node->append_conf( @@ -40,9 +42,16 @@ sub get_block_lsn }); $node->start; -$node->safe_psql('postgres', "CREATE EXTENSION IF NOT EXISTS pg_tde;"); -$node->safe_psql('postgres', "SELECT pg_tde_add_global_key_provider_file('file-keyring-wal','/tmp/pg_tde_test_keyring-wal.per');");; -$node->safe_psql('postgres', "SELECT pg_tde_set_server_principal_key('global-db-principal-key', 'file-keyring-wal');"); +$node->safe_psql('postgres', "CREATE EXTENSION pg_tde;"); +$node->safe_psql('postgres', + "SELECT pg_tde_add_global_key_provider_file('file-keyring-wal', '/tmp/pg_waldump_fullpage.per');" +); +$node->safe_psql('postgres', + "SELECT pg_tde_create_key_using_global_key_provider('server-key', 'file-keyring-wal');" +); +$node->safe_psql('postgres', + "SELECT pg_tde_set_server_key_using_global_key_provider('server-key', 'file-keyring-wal');" +); $node->append_conf( 'postgresql.conf', q{ @@ -84,7 +93,7 @@ sub get_block_lsn $node->command_ok( [ 'pg_waldump', '--quiet', - '-k', $node->data_dir. '/pg_tde', + '-k', $node->data_dir . '/pg_tde', '--save-fullpage', "$tmp_folder/raw", '--relation', $relation, $walfile diff --git a/contrib/pg_tde/t/pgtde.pm b/contrib/pg_tde/t/pgtde.pm index 67b1709aad749..2117134108432 100644 --- a/contrib/pg_tde/t/pgtde.pm +++ b/contrib/pg_tde/t/pgtde.pm @@ -1,146 +1,127 @@ package PGTDE; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; + use File::Basename; use File::Compare; use Test::More; - -our @ISA= qw( Exporter ); - -# These CAN be exported. -our @EXPORT = qw( pgtde_init_pg pgtde_start_pg pgtde_stop_pg pgtde_psql_cmd pgtde_setup_pg_tde pgtde_create_extension pgtde_drop_extension ); - -# Instance of pg server that would be spanwed by TAP testing. A new server will be created for each TAP test. -our $pg_node; +use Time::HiRes qw(usleep); # Expected .out filename of TAP testcase being executed. These are already part of repo under t/expected/*. our $expected_filename_with_path; -# Major version of PG Server that we are using. -our $PG_MAJOR_VERSION; - # Result .out filename of TAP testcase being executed. Where needed, a new *.out will be created for each TAP test. our $out_filename_with_path; # Runtime output file that is used only for debugging purposes for comparison to PGSS, blocks and timings. our $debug_out_filename_with_path; -BEGIN { - # Get PG Server Major version from pg_config - $PG_MAJOR_VERSION = `pg_config --version | awk {'print \$2'} | cut -f1 -d"." | sed -e 's/[^0-9].*\$//g'`; - $PG_MAJOR_VERSION =~ s/^\s+|\s+$//g; - - # Depending upon PG server version load the required module at runtime when pgtde.pm is loaded. - my $node_module = $PG_MAJOR_VERSION > 14 ? "PostgreSQL::Test::Cluster" : "PostgresNode"; - my $node_module_file = $node_module; - $node_module_file =~ s[::][/]g; - $node_module_file .= '.pm'; - require $node_module_file; - $node_module->import; -} +my $expected_folder = "t/expected"; +my $results_folder = "t/results"; -sub pgtde_init_pg +sub psql { - print "Postgres major version: $PG_MAJOR_VERSION \n"; - - # For Server version 15 & above, spawn the server using PostgreSQL::Test::Cluster - if ($PG_MAJOR_VERSION > 14) { - $pg_node = PostgreSQL::Test::Cluster->new('pgtde_regression'); - } - # For Server version 14 & below, spawn the server using PostgresNode - elsif ($PG_MAJOR_VERSION < 15) { - $pg_node = PostgresNode->get_new_node('pgtde_regression'); - } - - $pg_node->dump_info; - $pg_node->init; - return $pg_node; -} + my ($node, $dbname, $sql) = @_; -sub append_to_file -{ - my ($str) = @_; - - # For Server version 15 & above, use PostgreSQL::Test::Utils to write to files - if ($PG_MAJOR_VERSION > 14) { - PostgreSQL::Test::Utils::append_to_file($out_filename_with_path, $str . "\n"); - } - # For Server version 14 & below, use PostgresNode to write to files - elsif ($PG_MAJOR_VERSION < 15) { - TestLib::append_to_file($out_filename_with_path, $str . "\n"); - } - chmod(0640 , $out_filename_with_path) - or die("unable to set permissions for $out_filename_with_path"); - - return; -} + my (undef, $stdout, $stderr) = $node->psql($dbname, $sql, + extra_params => [ '-a', '-Pformat=aligned', '-Ptuples_only=off' ]); -sub append_to_debug_file -{ - my ($str) = @_; - - # For Server version 15 & above, use PostgreSQL::Test::Utils to write to files - if ($PG_MAJOR_VERSION > 14) { - PostgreSQL::Test::Utils::append_to_file($debug_out_filename_with_path, $str . "\n"); - } - # For Server version 14 & below, use PostgresNode to write to files - elsif ($PG_MAJOR_VERSION < 15) { - TestLib::append_to_file($debug_out_filename_with_path, $str . "\n"); - } - chmod(0640 , $debug_out_filename_with_path) - or die("unable to set permissions for $debug_out_filename_with_path"); - - return; + if ($stdout ne '') + { + append_to_result_file($stdout); + } + + if ($stderr ne '') + { + append_to_result_file($stderr); + } } -sub setup_files_dir +# Copied from src/test/recovery/t/017_shm.pl +sub poll_start { - my ($perlfilename) = @_; + my ($node) = @_; - # Expected folder where expected output will be present - my $expected_folder = "t/expected"; + my $max_attempts = 10 * $PostgreSQL::Test::Utils::timeout_default; + my $attempts = 0; - # Results/out folder where generated results files will be placed - my $results_folder = "t/results"; + while ($attempts < $max_attempts) + { + $node->start(fail_ok => 1) && return 1; - # Check if results folder exists or not, create if it doesn't - unless (-d $results_folder) - { - mkdir $results_folder or die "Can't create folder $results_folder: $!\n"; - } + # Wait 0.1 second before retrying. + usleep(100_000); - # Check if expected folder exists or not, bail out if it doesn't - unless (-d $expected_folder) - { - BAIL_OUT "Expected files folder $expected_folder doesn't exist: \n"; - } + # Clean up in case the start attempt just timed out or some such. + $node->stop('fast', fail_ok => 1); - #Remove .pl from filename and store in a variable - my @split_arr = split /\./, $perlfilename; + $attempts++; + } - my $filename_without_extension = $split_arr[0]; + # Try one last time without fail_ok, which will BAIL_OUT unless it + # succeeds. + $node->start && return 1; + return 0; +} - # Create expected filename with path - my $expected_filename = "${filename_without_extension}.out"; +sub append_to_result_file +{ + my ($str) = @_; - $expected_filename_with_path = "${expected_folder}/${expected_filename}"; + append_to_file($out_filename_with_path, $str . "\n"); +} - # Create results filename with path - my $out_filename = "${filename_without_extension}.out"; - $out_filename_with_path = "${results_folder}/${out_filename}"; +sub append_to_debug_file +{ + my ($str) = @_; - # Delete already existing result out file, if it exists. - if ( -f $out_filename_with_path) - { - unlink($out_filename_with_path) or die "Can't delete already existing $out_filename_with_path: $!\n"; - } + append_to_file($debug_out_filename_with_path, $str . "\n"); +} - $debug_out_filename_with_path = "${results_folder}/${out_filename}.debug"; +sub setup_files_dir +{ + my ($test_filename) = @_; + + unless (-d $results_folder) + { + mkdir $results_folder + or die "Can't create folder $results_folder: $!\n"; + } + + my ($test_name) = $test_filename =~ /([^.]*)/; + + $expected_filename_with_path = "${expected_folder}/${test_name}.out"; + $out_filename_with_path = "${results_folder}/${test_name}.out"; + $debug_out_filename_with_path = + "${results_folder}/${test_name}.out.debug"; + + if (-f $out_filename_with_path) + { + unlink($out_filename_with_path) + or die + "Can't delete already existing $out_filename_with_path: $!\n"; + } } sub compare_results { - # Compare expected and results files and return the result - return compare($expected_filename_with_path, $out_filename_with_path); + return compare($expected_filename_with_path, $out_filename_with_path); +} + +sub backup +{ + my ($node, $backup_name, %params) = @_; + my $backup_dir = $node->backup_dir . '/' . $backup_name; + + mkdir $backup_dir or die "mkdir($backup_dir) failed: $!"; + + PostgreSQL::Test::RecursiveCopy::copypath($node->data_dir . '/pg_tde', + $backup_dir . '/pg_tde'); + + push @{ $params{backup_options} }, "-E"; + + $node->backup($backup_name, %params); } 1; diff --git a/contrib/pg_tde/t/replication.pl b/contrib/pg_tde/t/replication.pl new file mode 100644 index 0000000000000..3545ee9111fb8 --- /dev/null +++ b/contrib/pg_tde/t/replication.pl @@ -0,0 +1,103 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use File::Basename; +use Test::More; +use lib 't'; +use pgtde; + +PGTDE::setup_files_dir(basename($0)); + +unlink('/tmp/replication.per'); + +my $primary = PostgreSQL::Test::Cluster->new('primary'); +$primary->init(allows_streaming => 1); +$primary->append_conf( + 'postgresql.conf', q{ +checkpoint_timeout = 1h +shared_preload_libraries = 'pg_tde' +}); +$primary->start; + +$primary->backup('backup'); +my $replica = PostgreSQL::Test::Cluster->new('replica'); +$replica->init_from_backup($primary, 'backup', has_streaming => 1); +$replica->set_standby_mode(); +$replica->start; + +PGTDE::append_to_result_file("-- At primary"); + +PGTDE::psql($primary, 'postgres', 'CREATE EXTENSION pg_tde;'); +PGTDE::psql($primary, 'postgres', + "SELECT pg_tde_add_database_key_provider_file('file-vault', '/tmp/replication.per');" +); +PGTDE::psql($primary, 'postgres', + "SELECT pg_tde_create_key_using_database_key_provider('test-key', 'file-vault');" +); +PGTDE::psql($primary, 'postgres', + "SELECT pg_tde_set_key_using_database_key_provider('test-key', 'file-vault');" +); + +PGTDE::psql($primary, 'postgres', + "CREATE TABLE test_enc (x int PRIMARY KEY) USING tde_heap;"); +PGTDE::psql($primary, 'postgres', + "INSERT INTO test_enc (x) VALUES (1), (2);"); + +PGTDE::psql($primary, 'postgres', + "CREATE TABLE test_plain (x int PRIMARY KEY) USING heap;"); +PGTDE::psql($primary, 'postgres', + "INSERT INTO test_plain (x) VALUES (3), (4);"); + +$primary->wait_for_catchup('replica'); + +PGTDE::append_to_result_file("-- At replica"); + +PGTDE::psql($replica, 'postgres', "SELECT pg_tde_is_encrypted('test_enc');"); +PGTDE::psql($replica, 'postgres', + "SELECT pg_tde_is_encrypted('test_enc_pkey');"); +PGTDE::psql($replica, 'postgres', "SELECT * FROM test_enc ORDER BY x;"); + +PGTDE::psql($replica, 'postgres', + "SELECT pg_tde_is_encrypted('test_plain');"); +PGTDE::psql($replica, 'postgres', + "SELECT pg_tde_is_encrypted('test_plain_pkey');"); +PGTDE::psql($replica, 'postgres', "SELECT * FROM test_plain ORDER BY x;"); + +PGTDE::append_to_result_file("-- check primary crash with WAL encryption"); +PGTDE::psql($primary, 'postgres', + "SELECT pg_tde_add_global_key_provider_file('file-vault', '/tmp/replication.per');" +); +PGTDE::psql($primary, 'postgres', + "SELECT pg_tde_create_key_using_global_key_provider('test-global-key', 'file-vault');" +); +PGTDE::psql($primary, 'postgres', + "SELECT pg_tde_set_server_key_using_global_key_provider('test-global-key', 'file-vault');" +); + +PGTDE::psql($primary, 'postgres', + "CREATE TABLE test_enc2 (x int PRIMARY KEY) USING tde_heap;"); +PGTDE::psql($primary, 'postgres', + "INSERT INTO test_enc2 (x) VALUES (1), (2);"); + +PGTDE::psql($primary, 'postgres', + "ALTER SYSTEM SET pg_tde.wal_encrypt = 'on';"); +$primary->kill9; + +PGTDE::append_to_result_file("-- primary start"); +PGTDE::poll_start($primary); +$primary->wait_for_catchup('replica'); + +PGTDE::psql($replica, 'postgres', "SELECT * FROM test_enc2 ORDER BY x;"); + +$replica->stop; +$primary->stop; + +# Compare the expected and out file +my $compare = PGTDE->compare_results(); + +is($compare, 0, + "Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files." +); + +done_testing(); diff --git a/contrib/pg_tde/t/rotate_key.pl b/contrib/pg_tde/t/rotate_key.pl new file mode 100644 index 0000000000000..8b65e5fb224dc --- /dev/null +++ b/contrib/pg_tde/t/rotate_key.pl @@ -0,0 +1,181 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use File::Basename; +use Test::More; +use lib 't'; +use pgtde; + +PGTDE::setup_files_dir(basename($0)); + +unlink('/tmp/rotate_key.per'); +unlink('/tmp/rotate_key_2.per'); +unlink('/tmp/rotate_key_2g.per'); +unlink('/tmp/rotate_key_3.per'); + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->append_conf('postgresql.conf', "shared_preload_libraries = 'pg_tde'"); +$node->start; + +PGTDE::psql($node, 'postgres', 'CREATE EXTENSION pg_tde;'); + +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_add_database_key_provider_file('file-vault', '/tmp/rotate_key.per');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_add_database_key_provider_file('file-2', '/tmp/rotate_key_2.per');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_add_global_key_provider_file('file-2', '/tmp/rotate_key_2g.per');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_add_global_key_provider_file('file-3', '/tmp/rotate_key_3.per');" +); + +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_list_all_database_key_providers();"); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_create_key_using_database_key_provider('test-db-key', 'file-vault');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_key_using_database_key_provider('test-db-key', 'file-vault');" +); + +PGTDE::psql($node, 'postgres', + 'CREATE TABLE test_enc (id SERIAL, k INTEGER, PRIMARY KEY (id)) USING tde_heap;' +); + +PGTDE::psql($node, 'postgres', 'INSERT INTO test_enc (k) VALUES (5), (6);'); + +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc ORDER BY id;'); + +# Rotate key +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_create_key_using_database_key_provider('rotated-key1', 'file-vault');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_key_using_database_key_provider('rotated-key1', 'file-vault');" +); +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc ORDER BY id;'); + +PGTDE::append_to_result_file("-- server restart"); +$node->restart; + +PGTDE::psql($node, 'postgres', + "SELECT provider_id, provider_name, key_name FROM pg_tde_key_info();"); +PGTDE::psql($node, 'postgres', + "SELECT provider_id, provider_name, key_name FROM pg_tde_server_key_info();" +); +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc ORDER BY id;'); + +# Again rotate key +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_create_key_using_database_key_provider('rotated-key2', 'file-2');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_key_using_database_key_provider('rotated-key2', 'file-2');" +); +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc ORDER BY id;'); + +PGTDE::append_to_result_file("-- server restart"); +$node->restart; + +PGTDE::psql($node, 'postgres', + "SELECT provider_id, provider_name, key_name FROM pg_tde_key_info();"); +PGTDE::psql($node, 'postgres', + "SELECT provider_id, provider_name, key_name FROM pg_tde_server_key_info();" +); +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc ORDER BY id;'); + +# Again rotate key +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_create_key_using_global_key_provider('rotated-key', 'file-3');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_key_using_global_key_provider('rotated-key', 'file-3');" +); +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc ORDER BY id;'); + +PGTDE::append_to_result_file("-- server restart"); +$node->restart; + +PGTDE::psql($node, 'postgres', + "SELECT provider_id, provider_name, key_name FROM pg_tde_key_info();"); +PGTDE::psql($node, 'postgres', + "SELECT provider_id, provider_name, key_name FROM pg_tde_server_key_info();" +); +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc ORDER BY id;'); + +# TODO: add method to query current info +# And maybe debug tools to show what's in a file keyring? + +# Again rotate key +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_create_key_using_global_key_provider('rotated-keyX', 'file-2');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_key_using_global_key_provider('rotated-keyX', 'file-2');" +); +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc ORDER BY id;'); + +PGTDE::append_to_result_file("-- server restart"); +$node->restart; + +PGTDE::psql($node, 'postgres', + "SELECT provider_id, provider_name, key_name FROM pg_tde_key_info();"); +PGTDE::psql($node, 'postgres', + "SELECT provider_id, provider_name, key_name FROM pg_tde_server_key_info();" +); +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc ORDER BY id;'); + +PGTDE::psql($node, 'postgres', + 'ALTER SYSTEM SET pg_tde.inherit_global_providers = off;'); + +# Things still work after a restart +PGTDE::append_to_result_file("-- server restart"); +$node->restart; + +# But now can't be changed to another global provider +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_create_key_using_global_key_provider('rotated-keyX2', 'file-2');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_key_using_global_key_provider('rotated-keyX2', 'file-2');" +); +PGTDE::psql($node, 'postgres', + "SELECT provider_id, provider_name, key_name FROM pg_tde_key_info();"); +PGTDE::psql($node, 'postgres', + "SELECT provider_id, provider_name, key_name FROM pg_tde_server_key_info();" +); + +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_key_using_database_key_provider('rotated-key2', 'file-2');" +); +PGTDE::psql($node, 'postgres', + "SELECT provider_id, provider_name, key_name FROM pg_tde_key_info();"); +PGTDE::psql($node, 'postgres', + "SELECT provider_id, provider_name, key_name FROM pg_tde_server_key_info();" +); + +PGTDE::psql($node, 'postgres', 'DROP TABLE test_enc;'); + +PGTDE::psql($node, 'postgres', + 'ALTER SYSTEM RESET pg_tde.inherit_global_providers;'); + +PGTDE::append_to_result_file("-- server restart"); +$node->restart; + +PGTDE::psql($node, 'postgres', 'DROP EXTENSION pg_tde CASCADE;'); + +$node->stop; + +# Compare the expected and out file +my $compare = PGTDE->compare_results(); + +is($compare, 0, + "Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files." +); + +done_testing(); diff --git a/contrib/pg_tde/t/stream_rep.pl b/contrib/pg_tde/t/stream_rep.pl new file mode 100644 index 0000000000000..b58ce3c322194 --- /dev/null +++ b/contrib/pg_tde/t/stream_rep.pl @@ -0,0 +1,659 @@ +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +# Minimal test testing streaming replication +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; +use lib 't'; +use pgtde; + +# Initialize primary node +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); +# A specific role is created to perform some tests related to replication, +# and it needs proper authentication configuration. +$node_primary->init( + allows_streaming => 1, + auth_extra => [ '--create-role', 'repl_role' ]); +$node_primary->append_conf('postgresql.conf', + "shared_preload_libraries = 'pg_tde'"); +$node_primary->append_conf('postgresql.conf', + "default_table_access_method = 'tde_heap'"); +$node_primary->start; +my $backup_name = 'my_backup'; + +unlink('/tmp/global_keyring.file'); +unlink('/tmp/local_keyring.file'); +# Create and enable tde extension +$node_primary->safe_psql('postgres', + 'CREATE EXTENSION IF NOT EXISTS pg_tde;'); +$node_primary->safe_psql('postgres', + "SELECT pg_tde_add_global_key_provider_file('global_key_provider', '/tmp/global_keyring.file');" +); +$node_primary->safe_psql('postgres', + "SELECT pg_tde_create_key_using_global_key_provider('global_test_key_stream', 'global_key_provider');" +); +$node_primary->safe_psql('postgres', + "SELECT pg_tde_set_server_key_using_global_key_provider('global_test_key_stream', 'global_key_provider');" +); +$node_primary->safe_psql('postgres', + "SELECT pg_tde_add_database_key_provider_file('local_key_provider', '/tmp/local_keyring.file');" +); +$node_primary->safe_psql('postgres', + "SELECT pg_tde_create_key_using_database_key_provider('local_test_key_stream', 'local_key_provider');" +); +$node_primary->safe_psql('postgres', + "SELECT pg_tde_set_key_using_database_key_provider('local_test_key_stream', 'local_key_provider');" +); + +my $WAL_ENCRYPTION = $ENV{WAL_ENCRYPTION} // 'off'; + +if ($WAL_ENCRYPTION eq 'on') +{ + $node_primary->append_conf( + 'postgresql.conf', qq( + pg_tde.wal_encrypt = on + )); +} + +$node_primary->restart; + +# Take backup +PGTDE::backup($node_primary, $backup_name); + +# Create streaming standby linking to primary +my $node_standby_1 = PostgreSQL::Test::Cluster->new('standby_1'); +$node_standby_1->init_from_backup($node_primary, $backup_name, + has_streaming => 1); +$node_standby_1->start; + +# Take backup of standby 1 (not mandatory, but useful to check if +# pg_basebackup works on a standby). +PGTDE::backup($node_standby_1, $backup_name); + +# Take a second backup of the standby while the primary is offline. +$node_primary->stop; +PGTDE::backup($node_standby_1, 'my_backup_2'); +$node_primary->start; + +# Create second standby node linking to standby 1 +my $node_standby_2 = PostgreSQL::Test::Cluster->new('standby_2'); +$node_standby_2->init_from_backup($node_standby_1, $backup_name, + has_streaming => 1); +$node_standby_2->start; + +# Create some content on primary and check its presence in standby nodes +$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); + +my $result = + $node_standby_1->safe_psql('postgres', "SELECT count(*) FROM tab_int"); +print "standby 1: $result\n"; +is($result, qq(1002), 'check streamed content on standby 1'); + +$result = + $node_standby_2->safe_psql('postgres', "SELECT count(*) FROM tab_int"); +print "standby 2: $result\n"; +is($result, qq(1002), 'check streamed content on standby 2'); + +# Likewise, but for a sequence +$node_primary->safe_psql('postgres', + "CREATE SEQUENCE seq1; SELECT nextval('seq1')"); + +# 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); + +$result = $node_standby_1->safe_psql('postgres', "SELECT * FROM seq1"); +print "standby 1: $result\n"; +is($result, qq(33|0|t), 'check streamed sequence content on standby 1'); + +$result = $node_standby_2->safe_psql('postgres', "SELECT * FROM seq1"); +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'); +is($node_standby_2->psql('postgres', 'INSERT INTO tab_int VALUES (1)'), + 3, 'read-only queries on standby 2'); + +# Tests for connection parameter target_session_attrs +note "testing connection parameter \"target_session_attrs\""; + +# Attempt to connect to $node1, then $node2, using target_session_attrs=$mode. +# Expect to connect to $target_node (undef for failure) with given $status. +sub test_target_session_attrs +{ + local $Test::Builder::Level = $Test::Builder::Level + 1; + + my $node1 = shift; + my $node2 = shift; + my $target_node = shift; + my $mode = shift; + my $status = shift; + + my $node1_host = $node1->host; + my $node1_port = $node1->port; + my $node1_name = $node1->name; + my $node2_host = $node2->host; + my $node2_port = $node2->port; + my $node2_name = $node2->name; + my $target_port = undef; + $target_port = $target_node->port if (defined $target_node); + my $target_name = undef; + $target_name = $target_node->name if (defined $target_node); + + # Build connection string for connection attempt. + my $connstr = "host=$node1_host,$node2_host "; + $connstr .= "port=$node1_port,$node2_port "; + $connstr .= "target_session_attrs=$mode"; + + # Attempt to connect, and if successful, get the server port number + # we connected to. Note we must pass the SQL command via the command + # line not stdin, else Perl may spit up trying to write to stdin of + # an already-failed psql process. + my ($ret, $stdout, $stderr) = + $node1->psql('postgres', undef, + extra_params => [ '-d', $connstr, '-c', 'SHOW port;' ]); + if ($status == 0) + { + is( $status == $ret && $stdout eq $target_port, + 1, + "connect to node $target_name with mode \"$mode\" and $node1_name,$node2_name listed" + ); + } + else + { + print "status = $status\n"; + print "ret = $ret\n"; + print "stdout = $stdout\n"; + print "stderr = $stderr\n"; + + is( $status == $ret && !defined $target_node, + 1, + "fail to connect with mode \"$mode\" and $node1_name,$node2_name listed" + ); + } + + return; +} + +# Connect to primary in "read-write" mode with primary,standby1 list. +test_target_session_attrs($node_primary, $node_standby_1, $node_primary, + "read-write", 0); + +# Connect to primary in "read-write" mode with standby1,primary list. +test_target_session_attrs($node_standby_1, $node_primary, $node_primary, + "read-write", 0); + +# Connect to primary in "any" mode with primary,standby1 list. +test_target_session_attrs($node_primary, $node_standby_1, $node_primary, + "any", 0); + +# Connect to standby1 in "any" mode with standby1,primary list. +test_target_session_attrs($node_standby_1, $node_primary, $node_standby_1, + "any", 0); + +# Connect to primary in "primary" mode with primary,standby1 list. +test_target_session_attrs($node_primary, $node_standby_1, $node_primary, + "primary", 0); + +# Connect to primary in "primary" mode with standby1,primary list. +test_target_session_attrs($node_standby_1, $node_primary, $node_primary, + "primary", 0); + +# Connect to standby1 in "read-only" mode with primary,standby1 list. +test_target_session_attrs($node_primary, $node_standby_1, $node_standby_1, + "read-only", 0); + +# Connect to standby1 in "read-only" mode with standby1,primary list. +test_target_session_attrs($node_standby_1, $node_primary, $node_standby_1, + "read-only", 0); + +# Connect to primary in "prefer-standby" mode with primary,primary list. +test_target_session_attrs($node_primary, $node_primary, $node_primary, + "prefer-standby", 0); + +# Connect to standby1 in "prefer-standby" mode with primary,standby1 list. +test_target_session_attrs($node_primary, $node_standby_1, $node_standby_1, + "prefer-standby", 0); + +# Connect to standby1 in "prefer-standby" mode with standby1,primary list. +test_target_session_attrs($node_standby_1, $node_primary, $node_standby_1, + "prefer-standby", 0); + +# Connect to standby1 in "standby" mode with primary,standby1 list. +test_target_session_attrs($node_primary, $node_standby_1, $node_standby_1, + "standby", 0); + +# Connect to standby1 in "standby" mode with standby1,primary list. +test_target_session_attrs($node_standby_1, $node_primary, $node_standby_1, + "standby", 0); + +# Fail to connect in "read-write" mode with standby1,standby2 list. +test_target_session_attrs($node_standby_1, $node_standby_2, undef, + "read-write", 2); + +# Fail to connect in "primary" mode with standby1,standby2 list. +test_target_session_attrs($node_standby_1, $node_standby_2, undef, + "primary", 2); + +# Fail to connect in "read-only" mode with primary,primary list. +test_target_session_attrs($node_primary, $node_primary, undef, + "read-only", 2); + +# Fail to connect in "standby" mode with primary,primary list. +test_target_session_attrs($node_primary, $node_primary, undef, "standby", 2); + +# Test for SHOW commands using a WAL sender connection with a replication +# role. +note "testing SHOW commands for replication connection"; + +$node_primary->psql( + 'postgres', " +CREATE ROLE repl_role REPLICATION LOGIN; +GRANT pg_read_all_settings TO repl_role;"); +my $primary_host = $node_primary->host; +my $primary_port = $node_primary->port; +my $connstr_common = "host=$primary_host port=$primary_port user=repl_role"; +my $connstr_rep = "$connstr_common replication=1"; +my $connstr_db = "$connstr_common replication=database dbname=postgres"; + +# Test SHOW ALL +my ($ret, $stdout, $stderr) = $node_primary->psql( + 'postgres', 'SHOW ALL;', + on_error_die => 1, + extra_params => [ '-d', $connstr_rep ]); +ok($ret == 0, "SHOW ALL with replication role and physical replication"); +($ret, $stdout, $stderr) = $node_primary->psql( + 'postgres', 'SHOW ALL;', + on_error_die => 1, + extra_params => [ '-d', $connstr_db ]); +ok($ret == 0, "SHOW ALL with replication role and logical replication"); + +# Test SHOW with a user-settable parameter +($ret, $stdout, $stderr) = $node_primary->psql( + 'postgres', 'SHOW work_mem;', + on_error_die => 1, + extra_params => [ '-d', $connstr_rep ]); +ok( $ret == 0, + "SHOW with user-settable parameter, replication role and physical replication" +); +($ret, $stdout, $stderr) = $node_primary->psql( + 'postgres', 'SHOW work_mem;', + on_error_die => 1, + extra_params => [ '-d', $connstr_db ]); +ok( $ret == 0, + "SHOW with user-settable parameter, replication role and logical replication" +); + +# Test SHOW with a superuser-settable parameter +($ret, $stdout, $stderr) = $node_primary->psql( + 'postgres', 'SHOW primary_conninfo;', + on_error_die => 1, + extra_params => [ '-d', $connstr_rep ]); +ok( $ret == 0, + "SHOW with superuser-settable parameter, replication role and physical replication" +); +($ret, $stdout, $stderr) = $node_primary->psql( + 'postgres', 'SHOW primary_conninfo;', + on_error_die => 1, + extra_params => [ '-d', $connstr_db ]); +ok( $ret == 0, + "SHOW with superuser-settable parameter, replication role and logical replication" +); + +note "testing READ_REPLICATION_SLOT command for replication connection"; + +my $slotname = 'test_read_replication_slot_physical'; + +($ret, $stdout, $stderr) = $node_primary->psql( + 'postgres', + 'READ_REPLICATION_SLOT non_existent_slot;', + extra_params => [ '-d', $connstr_rep ]); +ok($ret == 0, "READ_REPLICATION_SLOT exit code 0 on success"); +like($stdout, qr/^\|\|$/, + "READ_REPLICATION_SLOT returns NULL values if slot does not exist"); + +$node_primary->psql( + 'postgres', + "CREATE_REPLICATION_SLOT $slotname PHYSICAL RESERVE_WAL;", + extra_params => [ '-d', $connstr_rep ]); + +($ret, $stdout, $stderr) = $node_primary->psql( + 'postgres', + "READ_REPLICATION_SLOT $slotname;", + extra_params => [ '-d', $connstr_rep ]); +ok($ret == 0, "READ_REPLICATION_SLOT success with existing slot"); +like($stdout, qr/^physical\|[^|]*\|1$/, + "READ_REPLICATION_SLOT returns tuple with slot information"); + +$node_primary->psql( + 'postgres', + "DROP_REPLICATION_SLOT $slotname;", + extra_params => [ '-d', $connstr_rep ]); + +note "switching to physical replication slot"; + +# Switch to using a physical replication slot. We can do this without a new +# backup since physical slots can go backwards if needed. Do so on both +# standbys. Since we're going to be testing things that affect the slot state, +# also increase the standby feedback interval to ensure timely updates. +my ($slotname_1, $slotname_2) = ('standby_1', 'standby_2'); +$node_primary->append_conf('postgresql.conf', "max_replication_slots = 4"); +$node_primary->restart; +is( $node_primary->psql( + 'postgres', + qq[SELECT pg_create_physical_replication_slot('$slotname_1');]), + 0, + 'physical slot created on primary'); +$node_standby_1->append_conf('postgresql.conf', + "primary_slot_name = $slotname_1"); +$node_standby_1->append_conf('postgresql.conf', + "wal_receiver_status_interval = 1"); +$node_standby_1->append_conf('postgresql.conf', "max_replication_slots = 4"); +$node_standby_1->restart; +is( $node_standby_1->psql( + 'postgres', + qq[SELECT pg_create_physical_replication_slot('$slotname_2');]), + 0, + 'physical slot created on intermediate replica'); +$node_standby_2->append_conf('postgresql.conf', + "primary_slot_name = $slotname_2"); +$node_standby_2->append_conf('postgresql.conf', + "wal_receiver_status_interval = 1"); +# should be able change primary_slot_name without restart +# will wait effect in get_slot_xmins above +$node_standby_2->reload; + +# Fetch xmin columns from slot's pg_replication_slots row, after waiting for +# given boolean condition to be true to ensure we've reached a quiescent state +sub get_slot_xmins +{ + my ($node, $slotname, $check_expr) = @_; + + $node->poll_query_until( + 'postgres', qq[ + SELECT $check_expr + FROM pg_catalog.pg_replication_slots + WHERE slot_name = '$slotname'; + ]) or die "Timed out waiting for slot xmins to advance"; + + my $slotinfo = $node->slot($slotname); + return ($slotinfo->{'xmin'}, $slotinfo->{'catalog_xmin'}); +} + +# There's no hot standby feedback and there are no logical slots on either peer +# so xmin and catalog_xmin should be null on both slots. +my ($xmin, $catalog_xmin) = get_slot_xmins($node_primary, $slotname_1, + "xmin IS NULL AND catalog_xmin IS NULL"); +is($xmin, '', 'xmin of non-cascaded slot null with no hs_feedback'); +is($catalog_xmin, '', + 'catalog xmin of non-cascaded slot null with no hs_feedback'); + +($xmin, $catalog_xmin) = get_slot_xmins($node_standby_1, $slotname_2, + "xmin IS NULL AND catalog_xmin IS NULL"); +is($xmin, '', 'xmin of cascaded slot null with no hs_feedback'); +is($catalog_xmin, '', + 'catalog xmin of cascaded slot null with no hs_feedback'); + +# Replication still works? +$node_primary->safe_psql('postgres', 'CREATE TABLE replayed(val integer);'); + +sub replay_check +{ + my $newval = $node_primary->safe_psql('postgres', + 'INSERT INTO replayed(val) SELECT coalesce(max(val),0) + 1 AS newval FROM replayed RETURNING val' + ); + $node_primary->wait_for_replay_catchup($node_standby_1); + $node_standby_1->wait_for_replay_catchup($node_standby_2, $node_primary); + + $node_standby_1->safe_psql('postgres', + qq[SELECT 1 FROM replayed WHERE val = $newval]) + or die "standby_1 didn't replay primary value $newval"; + $node_standby_2->safe_psql('postgres', + qq[SELECT 1 FROM replayed WHERE val = $newval]) + or die "standby_2 didn't replay standby_1 value $newval"; + return; +} + +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 +# so we'll see the results promptly. +$node_standby_1->safe_psql('postgres', + 'ALTER SYSTEM SET hot_standby_feedback = on;'); +$node_standby_1->reload; +$node_standby_2->safe_psql('postgres', + 'ALTER SYSTEM SET hot_standby_feedback = on;'); +$node_standby_2->reload; +replay_check(); + +($xmin, $catalog_xmin) = get_slot_xmins($node_primary, $slotname_1, + "xmin IS NOT NULL AND catalog_xmin IS NULL"); +isnt($xmin, '', 'xmin of non-cascaded slot non-null with hs feedback'); +is($catalog_xmin, '', + 'catalog xmin of non-cascaded slot still null with hs_feedback'); + +my ($xmin1, $catalog_xmin1) = get_slot_xmins($node_standby_1, $slotname_2, + "xmin IS NOT NULL AND catalog_xmin IS NULL"); +isnt($xmin1, '', 'xmin of cascaded slot non-null with hs feedback'); +is($catalog_xmin1, '', + 'catalog xmin of cascaded slot still null with hs_feedback'); + +note "doing some work to advance xmin"; +$node_primary->safe_psql( + 'postgres', q{ +do $$ +begin + for i in 10000..11000 loop + -- use an exception block so that each iteration eats an XID + begin + insert into tab_int values (i); + exception + when division_by_zero then null; + end; + end loop; +end$$; +}); + +$node_primary->safe_psql('postgres', 'VACUUM;'); +$node_primary->safe_psql('postgres', 'CHECKPOINT;'); + +my ($xmin2, $catalog_xmin2) = + get_slot_xmins($node_primary, $slotname_1, "xmin <> '$xmin'"); +note "primary slot's new xmin $xmin2, old xmin $xmin"; +isnt($xmin2, $xmin, 'xmin of non-cascaded slot with hs feedback has changed'); +is($catalog_xmin2, '', + 'catalog xmin of non-cascaded slot still null with hs_feedback unchanged' +); + +($xmin2, $catalog_xmin2) = + get_slot_xmins($node_standby_1, $slotname_2, "xmin <> '$xmin1'"); +note "standby_1 slot's new xmin $xmin2, old xmin $xmin1"; +isnt($xmin2, $xmin1, 'xmin of cascaded slot with hs feedback has changed'); +is($catalog_xmin2, '', + 'catalog xmin of cascaded slot still null with hs_feedback unchanged'); + +note "disabling hot_standby_feedback"; + +# Disable hs_feedback. Xmin should be cleared. +$node_standby_1->safe_psql('postgres', + 'ALTER SYSTEM SET hot_standby_feedback = off;'); +$node_standby_1->reload; +$node_standby_2->safe_psql('postgres', + 'ALTER SYSTEM SET hot_standby_feedback = off;'); +$node_standby_2->reload; +replay_check(); + +($xmin, $catalog_xmin) = get_slot_xmins($node_primary, $slotname_1, + "xmin IS NULL AND catalog_xmin IS NULL"); +is($xmin, '', 'xmin of non-cascaded slot null with hs feedback reset'); +is($catalog_xmin, '', + 'catalog xmin of non-cascaded slot still null with hs_feedback reset'); + +($xmin, $catalog_xmin) = get_slot_xmins($node_standby_1, $slotname_2, + "xmin IS NULL AND catalog_xmin IS NULL"); +is($xmin, '', 'xmin of cascaded slot null with hs feedback reset'); +is($catalog_xmin, '', + 'catalog xmin of cascaded slot still null with hs_feedback reset'); + +note "check change primary_conninfo without restart"; +$node_standby_2->append_conf('postgresql.conf', "primary_slot_name = ''"); +$node_standby_2->enable_streaming($node_primary); +$node_standby_2->reload; + +# be sure do not streaming from cascade +$node_standby_1->stop; + +my $newval = $node_primary->safe_psql('postgres', + 'INSERT INTO replayed(val) SELECT coalesce(max(val),0) + 1 AS newval FROM replayed RETURNING val' +); +$node_primary->wait_for_catchup($node_standby_2); +my $is_replayed = $node_standby_2->safe_psql('postgres', + qq[SELECT 1 FROM replayed WHERE val = $newval]); +is($is_replayed, qq(1), "standby_2 didn't replay primary value $newval"); + +# Drop any existing slots on the primary, for the follow-up tests. +$node_primary->safe_psql('postgres', + "SELECT pg_drop_replication_slot(slot_name) FROM pg_replication_slots;"); + +# Test physical slot advancing and its durability. Create a new slot on +# the primary, not used by any of the standbys. This reserves WAL at creation. +my $phys_slot = 'phys_slot'; +$node_primary->safe_psql('postgres', + "SELECT pg_create_physical_replication_slot('$phys_slot', true);"); +# Generate some WAL, and switch to a new segment, used to check that +# the previous segment is correctly getting recycled as the slot advancing +# would recompute the minimum LSN calculated across all slots. +my $segment_removed = $node_primary->safe_psql('postgres', + 'SELECT pg_walfile_name(pg_current_wal_lsn())'); +chomp($segment_removed); +$node_primary->advance_wal(1); +my $current_lsn = + $node_primary->safe_psql('postgres', "SELECT pg_current_wal_lsn();"); +chomp($current_lsn); +my $psql_rc = $node_primary->psql('postgres', + "SELECT pg_replication_slot_advance('$phys_slot', '$current_lsn'::pg_lsn);" +); +is($psql_rc, '0', 'slot advancing with physical slot'); +my $phys_restart_lsn_pre = $node_primary->safe_psql('postgres', + "SELECT restart_lsn from pg_replication_slots WHERE slot_name = '$phys_slot';" +); +chomp($phys_restart_lsn_pre); +# Slot advance should persist across clean restarts. +$node_primary->restart; +my $phys_restart_lsn_post = $node_primary->safe_psql('postgres', + "SELECT restart_lsn from pg_replication_slots WHERE slot_name = '$phys_slot';" +); +chomp($phys_restart_lsn_post); +ok( ($phys_restart_lsn_pre cmp $phys_restart_lsn_post) == 0, + "physical slot advance persists across restarts"); + +# Check if the previous segment gets correctly recycled after the +# server stopped cleanly, causing a shutdown checkpoint to be generated. +my $primary_data = $node_primary->data_dir; +ok(!-f "$primary_data/pg_wal/$segment_removed", + "WAL segment $segment_removed recycled after physical slot advancing"); + +note "testing pg_backup_start() followed by BASE_BACKUP"; +my $connstr = $node_primary->connstr('postgres') . " replication=database"; + +# This test requires a replication connection with a database, as it mixes +# a replication command and a SQL command. +$node_primary->command_fails_like( + [ + 'psql', '-X', '-c', "SELECT pg_backup_start('backup', true)", + '-c', 'BASE_BACKUP', '-d', $connstr + ], + qr/a backup is already in progress in this session/, + 'BASE_BACKUP cannot run in session already running backup'); + +note "testing BASE_BACKUP cancellation"; + +my $sigchld_bb_timeout = + IPC::Run::timer($PostgreSQL::Test::Utils::timeout_default); + +# This test requires a replication connection with a database, as it mixes +# a replication command and a SQL command. The first BASE_BACKUP is throttled +# to give enough room for the cancellation running below. The second command +# for pg_backup_stop() should fail. +my ($sigchld_bb_stdin, $sigchld_bb_stdout, $sigchld_bb_stderr) = ('', '', ''); +my $sigchld_bb = IPC::Run::start( + [ + 'psql', '-X', '-c', "BASE_BACKUP (CHECKPOINT 'fast', MAX_RATE 32);", + '-c', 'SELECT pg_backup_stop()', + '-d', $connstr + ], + '<', + \$sigchld_bb_stdin, + '>', + \$sigchld_bb_stdout, + '2>', + \$sigchld_bb_stderr, + $sigchld_bb_timeout); + +# The cancellation is issued once the database files are streamed and +# the checkpoint issued at backup start completes. +is( $node_primary->poll_query_until( + 'postgres', + "SELECT pg_cancel_backend(a.pid) FROM " + . "pg_stat_activity a, pg_stat_progress_basebackup b WHERE " + . "a.pid = b.pid AND a.query ~ 'BASE_BACKUP' AND " + . "b.phase = 'streaming database files';"), + "1", + "WAL sender sending base backup killed"); + +# The psql command should fail on pg_backup_stop(). +ok( pump_until( + $sigchld_bb, $sigchld_bb_timeout, + \$sigchld_bb_stderr, qr/backup is not in progress/), + 'base backup cleanly canceled'); +$sigchld_bb->finish(); + +done_testing(); + diff --git a/contrib/pg_tde/t/tde_heap.pl b/contrib/pg_tde/t/tde_heap.pl new file mode 100644 index 0000000000000..a8fecc3d7df4f --- /dev/null +++ b/contrib/pg_tde/t/tde_heap.pl @@ -0,0 +1,150 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use File::Basename; +use Test::More; +use lib 't'; +use pgtde; + +PGTDE::setup_files_dir(basename($0)); + +unlink('/tmp/tde_heap.per'); + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->append_conf('postgresql.conf', "shared_preload_libraries = 'pg_tde'"); +$node->start; + +PGTDE::psql($node, 'postgres', 'CREATE EXTENSION pg_tde;'); + +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_add_database_key_provider_file('file-vault', '/tmp/tde_heap.per');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_create_key_using_database_key_provider('test-db-key', 'file-vault');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_key_using_database_key_provider('test-db-key', 'file-vault');" +); + +######################### test_enc1 (simple create table w tde_heap) + +PGTDE::psql($node, 'postgres', + 'CREATE TABLE test_enc1 (id SERIAL, k VARCHAR(32), PRIMARY KEY (id)) USING tde_heap;' +); + +PGTDE::psql($node, 'postgres', + "INSERT INTO test_enc1 (k) VALUES ('foobar'), ('barfoo');"); + +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc1 ORDER BY id;'); + +######################### test_enc2 (create heap + alter to tde_heap) + +PGTDE::psql($node, 'postgres', + 'CREATE TABLE test_enc2 (id SERIAL, k VARCHAR(32), PRIMARY KEY (id));'); + +PGTDE::psql($node, 'postgres', + "INSERT INTO test_enc2 (k) VALUES ('foobar'), ('barfoo');"); + +PGTDE::psql($node, 'postgres', + 'ALTER TABLE test_enc2 SET ACCESS METHOD tde_heap;'); + +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc2 ORDER BY id;'); + +######################### test_enc3 (default_table_access_method) + +PGTDE::psql($node, 'postgres', + 'SET default_table_access_method = "tde_heap"; CREATE TABLE test_enc3 (id SERIAL, k VARCHAR(32), PRIMARY KEY (id));' +); + +PGTDE::psql($node, 'postgres', + "INSERT INTO test_enc3 (k) VALUES ('foobar'), ('barfoo');"); + +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc3 ORDER BY id;'); + +######################### test_enc4 (create heap + alter default) + +PGTDE::psql($node, 'postgres', + 'CREATE TABLE test_enc4 (id SERIAL, k VARCHAR(32), PRIMARY KEY (id)) USING heap;' +); + +PGTDE::psql($node, 'postgres', + "INSERT INTO test_enc4 (k) VALUES ('foobar'), ('barfoo');"); + +PGTDE::psql($node, 'postgres', + 'SET default_table_access_method = "tde_heap"; ALTER TABLE test_enc4 SET ACCESS METHOD DEFAULT;' +); + +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc4 ORDER BY id;'); + +######################### test_enc5 (create tde_heap + truncate) + +PGTDE::psql($node, 'postgres', + 'CREATE TABLE test_enc5 (id SERIAL, k VARCHAR(32), PRIMARY KEY (id)) USING tde_heap;' +); + +PGTDE::psql($node, 'postgres', + "INSERT INTO test_enc5 (k) VALUES ('foobar'), ('barfoo');"); + +PGTDE::psql($node, 'postgres', 'CHECKPOINT;'); + +PGTDE::psql($node, 'postgres', 'TRUNCATE test_enc5;'); + +PGTDE::psql($node, 'postgres', + "INSERT INTO test_enc5 (k) VALUES ('foobar'), ('barfoo');"); + +PGTDE::psql($node, 'postgres', 'SELECT * FROM test_enc5 ORDER BY id;'); + +PGTDE::append_to_result_file("-- server restart"); +$node->restart; + +sub verify_table +{ + PGTDE::append_to_result_file('###########################'); + + my ($table) = @_; + + my $tablefile = + $node->data_dir . '/' + . $node->safe_psql('postgres', + "SELECT pg_relation_filepath('" . $table . "');"); + + PGTDE::psql($node, 'postgres', + 'SELECT * FROM ' . $table . ' ORDER BY id;'); + + PGTDE::append_to_result_file('TABLEFILE FOR ' + . $table + . ' FOUND: ' + . (-f $tablefile ? 'yes' : 'no')); + + my $strings = 'CONTAINS FOO (should be empty): '; + $strings .= `strings $tablefile | grep foo`; + PGTDE::append_to_result_file($strings); +} + +# Verify that we can't see the data in the files +verify_table('test_enc1'); +verify_table('test_enc2'); +verify_table('test_enc3'); +verify_table('test_enc4'); +verify_table('test_enc5'); + +PGTDE::psql($node, 'postgres', 'DROP TABLE test_enc1;'); +PGTDE::psql($node, 'postgres', 'DROP TABLE test_enc2;'); +PGTDE::psql($node, 'postgres', 'DROP TABLE test_enc3;'); +PGTDE::psql($node, 'postgres', 'DROP TABLE test_enc4;'); +PGTDE::psql($node, 'postgres', 'DROP TABLE test_enc5;'); + +PGTDE::psql($node, 'postgres', 'DROP EXTENSION pg_tde;'); + +$node->stop; + +# Compare the expected and out file +my $compare = PGTDE->compare_results(); + +is($compare, 0, + "Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files." +); + +done_testing(); diff --git a/contrib/pg_tde/t/unlogged_tables.pl b/contrib/pg_tde/t/unlogged_tables.pl new file mode 100644 index 0000000000000..e348ebaef5466 --- /dev/null +++ b/contrib/pg_tde/t/unlogged_tables.pl @@ -0,0 +1,56 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use File::Basename; +use Test::More; +use lib 't'; +use pgtde; + +PGTDE::setup_files_dir(basename($0)); + +unlink('/tmp/unlogged_tables.per'); + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->append_conf('postgresql.conf', "shared_preload_libraries = 'pg_tde'"); +$node->start; + +PGTDE::psql($node, 'postgres', 'CREATE EXTENSION pg_tde;'); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_add_database_key_provider_file('file-vault', '/tmp/unlogged_tables.per');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_create_key_using_database_key_provider('test-key', 'file-vault');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_key_using_database_key_provider('test-key', 'file-vault');" +); + +PGTDE::psql($node, 'postgres', + "CREATE UNLOGGED TABLE t (x int PRIMARY KEY) USING tde_heap;"); + +PGTDE::psql($node, 'postgres', "INSERT INTO t SELECT generate_series(1, 4);"); + +PGTDE::psql($node, 'postgres', "CHECKPOINT;"); + +PGTDE::append_to_result_file("-- kill -9"); +$node->kill9; + +PGTDE::append_to_result_file("-- server start"); +PGTDE::poll_start($node); + +PGTDE::psql($node, 'postgres', "TABLE t;"); + +PGTDE::psql($node, 'postgres', "INSERT INTO t SELECT generate_series(1, 4);"); + +$node->stop; + +# Compare the expected and out file +my $compare = PGTDE->compare_results(); + +is($compare, 0, + "Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files." +); + +done_testing(); diff --git a/contrib/pg_tde/t/wal_archiving.pl b/contrib/pg_tde/t/wal_archiving.pl new file mode 100644 index 0000000000000..05c74df4d3486 --- /dev/null +++ b/contrib/pg_tde/t/wal_archiving.pl @@ -0,0 +1,227 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use File::Basename; +use Test::More; +use lib 't'; +use pgtde; +use PostgreSQL::Test::Utils; + +unlink('/tmp/wal_archiving.per'); + +# Test CLI tools directly + +command_like( + [ 'pg_tde_archive_decrypt', '--help' ], + qr/wraps an archive command to give the command unencrypted WAL/, + 'pg_tde_archive_decrypt displays help'); + +command_like( + [ 'pg_tde_restore_encrypt', '--help' ], + qr/wraps a restore command to encrypt its returned WAL/, + 'pg_tde_restore_encrypt displays help'); + +command_like( + [ 'pg_tde_archive_decrypt', '--version' ], + qr/pg_tde_archive_decrypt \(PostgreSQL\) /, + 'pg_tde_archive_decrypt displays version'); + +command_like( + [ 'pg_tde_restore_encrypt', '--version' ], + qr/pg_tde_restore_encrypt \(PostgreSQL\) /, + 'pg_tde_restore_encrypt displays version'); + +command_fails_like( + [ 'pg_tde_archive_decrypt', 'a', 'b' ], + qr/error: wrong number of arguments, 3 expected/, + 'pg_tde_archive_decrypt checks for number of arguments'); + +command_fails_like( + [ 'pg_tde_restore_encrypt', 'a', 'b' ], + qr/error: wrong number of arguments, 3 expected/, + 'pg_tde_restore_encrypt checks for number of arguments'); + +command_fails_like( + [ 'pg_tde_archive_decrypt', 'file', 'pg_wal/file', 'false %q' ], + qr/error: invalid value for parameter "ARCHIVE-COMMAND": "false %q"\n.*?detail: String contains unexpected placeholder "%q"/, + 'pg_tde_archive_decrypt gives error if command not found'); + +command_fails_like( + [ 'pg_tde_restore_encrypt', 'file', 'pg_wal/file', 'false %q' ], + qr/error: invalid value for parameter "RESTORE-COMMAND": "false %q"\n.*?detail: String contains unexpected placeholder "%q"/, + 'pg_tde_restore_encrypt gives error if command not found'); + +command_fails_like( + [ 'pg_tde_archive_decrypt', 'file', 'pg_wal/file', 'unknown_command_42' ], + qr/error: ARCHIVE-COMMAND "unknown_command_42" failed with exit code 127/, + 'pg_tde_archive_decrypt gives error if command not found'); + +command_fails_like( + [ 'pg_tde_restore_encrypt', 'file', 'pg_wal/file', 'unknown_command_42' ], + qr/error: RESTORE-COMMAND "unknown_command_42" failed with exit code 127/, + 'pg_tde_restore_encrypt gives error if command not found'); + +command_fails_like( + [ 'pg_tde_archive_decrypt', 'file', 'pg_wal/file', 'false' ], + qr/error: ARCHIVE-COMMAND "false" failed with exit code 1/, + 'pg_tde_archive_decrypt prints return code of failed command'); + +command_fails_like( + [ 'pg_tde_restore_encrypt', 'file', 'pg_wal/file', 'false' ], + qr/error: RESTORE-COMMAND "false" failed with exit code 1/, + 'pg_tde_restore_encrypt prints return code of failed command'); + +command_fails_like( + [ 'pg_tde_archive_decrypt', 'file', 'pg_wal/file', 'kill $$; sleep' ], + qr/error: ARCHIVE-COMMAND "kill \$\$; sleep" was terminated by signal 15: Terminated/, + 'pg_tde_archive_decrypt prints which signal killed the command'); + +command_fails_like( + [ 'pg_tde_restore_encrypt', 'file', 'pg_wal/file', 'kill $$; sleep' ], + qr/error: RESTORE-COMMAND "kill \$\$; sleep" was terminated by signal 15: Terminated/, + 'pg_tde_restore_encrypt prints which signal killed the command'); + +# Test archive_command + +my $primary = PostgreSQL::Test::Cluster->new('primary'); +my $archive_dir = $primary->archive_dir; +$primary->init(allows_streaming => 1); +$primary->append_conf('postgresql.conf', + "shared_preload_libraries = 'pg_tde'"); +$primary->append_conf('postgresql.conf', "wal_level = 'replica'"); +$primary->append_conf('postgresql.conf', "autovacuum = off"); +$primary->append_conf('postgresql.conf', "checkpoint_timeout = 1h"); +$primary->append_conf('postgresql.conf', "archive_mode = on"); +$primary->append_conf('postgresql.conf', + "archive_command = 'pg_tde_archive_decrypt %f %p \"cp %%p $archive_dir/%%f\"'" +); +$primary->start; + +$primary->safe_psql('postgres', "CREATE EXTENSION pg_tde;"); + +$primary->safe_psql('postgres', + "SELECT pg_tde_add_global_key_provider_file('keyring', '/tmp/wal_archiving.per');" +); +$primary->safe_psql('postgres', + "SELECT pg_tde_create_key_using_global_key_provider('server-key', 'keyring');" +); +$primary->safe_psql('postgres', + "SELECT pg_tde_set_server_key_using_global_key_provider('server-key', 'keyring');" +); + +# This is a quite ugly dance to make sure we have a replica starting in a stats +# with encrypted WAL and without. We do this by taking a base backup while +# encryption is disabled and one where it is enabled. +# +# We also generate some plaintext WAL and some ecrnypted WAL. + +$primary->backup('plain_wal', backup_options => [ '-X', 'none' ]); + +$primary->append_conf('postgresql.conf', "pg_tde.wal_encrypt = on"); + +$primary->restart; + +$primary->backup('enc_wal', backup_options => [ '-X', 'none' ]); + +$primary->append_conf('postgresql.conf', "pg_tde.wal_encrypt = off"); + +$primary->restart; + +$primary->append_conf('postgresql.conf', "pg_tde.wal_encrypt = on"); + +$primary->safe_psql('postgres', + "CREATE TABLE t1 AS SELECT 'foobar_plain' AS x"); + +$primary->restart; + +$primary->safe_psql('postgres', + "CREATE TABLE t2 AS SELECT 'foobar_enc' AS x"); + +my $data_dir = $primary->data_dir; + +like( + `strings $data_dir/pg_wal/0000000100000000000000??`, + qr/foobar_plain/, + 'should find foobar_plain in WAL'); +unlike( + `strings $data_dir/pg_wal/0000000100000000000000??`, + qr/foobar_enc/, + 'should not find foobar_enc in WAL since it is encrypted'); + +$primary->stop; + +like( + `strings $archive_dir/0000000100000000000000??`, + qr/foobar_plain/, + 'should find foobar_plain in archive'); +like( + `strings $archive_dir/0000000100000000000000??`, + qr/foobar_enc/, + 'should find foobar_enc in archive'); + +# Test restore_command with encrypted WAL + +my $replica_enc = PostgreSQL::Test::Cluster->new('replica_enc'); +$replica_enc->init_from_backup($primary, 'enc_wal'); +$replica_enc->append_conf('postgresql.conf', + "restore_command = 'pg_tde_restore_encrypt %f %p \"cp $archive_dir/%%f %%p\"'" +); +$replica_enc->set_standby_mode; +$replica_enc->start; + +$replica_enc->wait_for_log("waiting for WAL to become available"); + +$data_dir = $replica_enc->data_dir; + +unlike( + `strings $data_dir/pg_wal/0000000100000000000000??`, + qr/foobar_plain/, + 'should not find foobar_plain in WAL since it is encrypted'); +unlike( + `strings $data_dir/pg_wal/0000000100000000000000??`, + qr/foobar_enc/, + 'should not find foobar_enc in WAL since it is encrypted'); + +$replica_enc->promote; + +my $result = $replica_enc->safe_psql('postgres', + 'SELECT * FROM t1 UNION ALL SELECT * FROM t2'); + +is($result, "foobar_plain\nfoobar_enc", 'b'); + +$replica_enc->stop; + +# Test restore_command with plain WAL + +my $replica_plain = PostgreSQL::Test::Cluster->new('replica_plain'); +$replica_plain->init_from_backup($primary, 'plain_wal'); +$replica_plain->append_conf('postgresql.conf', + "restore_command = 'pg_tde_restore_encrypt %f %p \"cp $archive_dir/%%f %%p\"'" +); +$replica_plain->set_standby_mode; +$replica_plain->start; + +$replica_plain->wait_for_log("waiting for WAL to become available"); + +$data_dir = $replica_plain->data_dir; + +like( + `strings $data_dir/pg_wal/0000000100000000000000??`, + qr/foobar_plain/, + 'should find foobar_plain in WAL since it is not encrypted'); +like( + `strings $data_dir/pg_wal/0000000100000000000000??`, + qr/foobar_enc/, + 'should find foobar_enc in WAL since it is not encrypted'); + +$replica_plain->promote; + +$result = $replica_plain->safe_psql('postgres', + 'SELECT * FROM t1 UNION ALL SELECT * FROM t2'); + +is($result, "foobar_plain\nfoobar_enc", 'b'); + +$replica_plain->stop; + +done_testing(); diff --git a/contrib/pg_tde/t/wal_encrypt.pl b/contrib/pg_tde/t/wal_encrypt.pl new file mode 100644 index 0000000000000..2c23d75808a52 --- /dev/null +++ b/contrib/pg_tde/t/wal_encrypt.pl @@ -0,0 +1,105 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use File::Basename; +use Test::More; +use lib 't'; +use pgtde; + +PGTDE::setup_files_dir(basename($0)); + +unlink('/tmp/wal_encrypt.per'); + +my $node = PostgreSQL::Test::Cluster->new('main'); +$node->init; +$node->append_conf('postgresql.conf', "shared_preload_libraries = 'pg_tde'"); +$node->append_conf('postgresql.conf', "wal_level = 'logical'"); +# We don't test that it can't start: the test framework doesn't have an easy way to do this +#$node->append_conf('postgresql.conf', "pg_tde.wal_encrypt = 1"); +$node->start; + +PGTDE::psql($node, 'postgres', "CREATE EXTENSION pg_tde;"); + +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_add_global_key_provider_file('file-keyring-010', '/tmp/wal_encrypt.per');" +); + +PGTDE::psql($node, 'postgres', 'SELECT pg_tde_verify_server_key();'); + +PGTDE::psql($node, 'postgres', + 'SELECT key_name, provider_name, provider_id FROM pg_tde_server_key_info();' +); + +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_create_key_using_global_key_provider('server-key', 'file-keyring-010');" +); +PGTDE::psql($node, 'postgres', + "SELECT pg_tde_set_server_key_using_global_key_provider('server-key', 'file-keyring-010');" +); + +PGTDE::psql($node, 'postgres', 'SELECT pg_tde_verify_server_key();'); + +PGTDE::psql($node, 'postgres', + 'SELECT key_name, provider_name, provider_id FROM pg_tde_server_key_info();' +); + +PGTDE::psql($node, 'postgres', 'ALTER SYSTEM SET pg_tde.wal_encrypt = on;'); + +PGTDE::append_to_result_file("-- server restart with wal encryption"); +$node->restart; + +PGTDE::psql($node, 'postgres', "SHOW pg_tde.wal_encrypt;"); + +PGTDE::psql($node, 'postgres', + "SELECT slot_name FROM pg_create_logical_replication_slot('tde_slot', 'test_decoding');" +); + +PGTDE::psql($node, 'postgres', + 'CREATE TABLE test_wal (id SERIAL, k INTEGER, PRIMARY KEY (id));'); + +PGTDE::psql($node, 'postgres', 'INSERT INTO test_wal (k) VALUES (1), (2);'); + +PGTDE::psql($node, 'postgres', 'ALTER SYSTEM SET pg_tde.wal_encrypt = off;'); + +PGTDE::append_to_result_file("-- server restart without wal encryption"); +$node->restart; + +PGTDE::psql($node, 'postgres', "SHOW pg_tde.wal_encrypt;"); + +PGTDE::psql($node, 'postgres', 'INSERT INTO test_wal (k) VALUES (3), (4);'); + +PGTDE::psql($node, 'postgres', 'ALTER SYSTEM SET pg_tde.wal_encrypt = on;'); + +PGTDE::append_to_result_file("-- server restart with wal encryption"); +$node->restart; + +PGTDE::psql($node, 'postgres', "SHOW pg_tde.wal_encrypt;"); + +PGTDE::psql($node, 'postgres', 'INSERT INTO test_wal (k) VALUES (5), (6);'); + +PGTDE::append_to_result_file("-- server restart with still wal encryption"); +$node->restart; + +PGTDE::psql($node, 'postgres', "SHOW pg_tde.wal_encrypt;"); + +PGTDE::psql($node, 'postgres', 'INSERT INTO test_wal (k) VALUES (7), (8);'); + +PGTDE::psql($node, 'postgres', + "SELECT data FROM pg_logical_slot_get_changes('tde_slot', NULL, NULL);"); + +PGTDE::psql($node, 'postgres', + "SELECT pg_drop_replication_slot('tde_slot');"); + +PGTDE::psql($node, 'postgres', 'DROP EXTENSION pg_tde;'); + +$node->stop; + +# Compare the expected and out file +my $compare = PGTDE->compare_results(); + +is($compare, 0, + "Compare Files: $PGTDE::expected_filename_with_path and $PGTDE::out_filename_with_path files." +); + +done_testing(); diff --git a/contrib/pg_tde/t/wal_key_tli.pl b/contrib/pg_tde/t/wal_key_tli.pl new file mode 100644 index 0000000000000..c9ba707983176 --- /dev/null +++ b/contrib/pg_tde/t/wal_key_tli.pl @@ -0,0 +1,83 @@ + +# Copyright (c) 2021-2024, PostgreSQL Global Development Group + +# A copy pg_rewind_databases with added restart of the standby, which forces two +# WAL keys with the same LSN but different TLI on the primary after pg_rewind. + +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Utils; +use Test::More; + +use FindBin; +use lib $FindBin::RealBin; + +use RewindTest; + +sub run_test +{ + my $test_mode = shift; + + RewindTest::setup_cluster($test_mode, ['-g']); + RewindTest::start_primary(); + + # Create a database in primary with a table. + primary_psql('CREATE DATABASE inprimary'); + primary_psql('CREATE TABLE inprimary_tab (a int)', 'inprimary'); + + RewindTest::create_standby($test_mode); + + # Generates a new WAL key with the start LSN 0/300000. After running + # pg_rewind, the primary will end up with that key and another one with the + # same LSN 0/300000, but different TLI. + $node_standby->restart; + + # Create another database with another table, the creation is + # replicated to the standby. + primary_psql('CREATE DATABASE beforepromotion'); + primary_psql('CREATE TABLE beforepromotion_tab (a int)', + 'beforepromotion'); + + RewindTest::promote_standby(); + + # Create databases in the old primary and the new promoted standby. + primary_psql('CREATE DATABASE primary_afterpromotion'); + primary_psql('CREATE TABLE primary_promotion_tab (a int)', + 'primary_afterpromotion'); + standby_psql('CREATE DATABASE standby_afterpromotion'); + standby_psql('CREATE TABLE standby_promotion_tab (a int)', + 'standby_afterpromotion'); + + # The clusters are now diverged. + + RewindTest::run_pg_rewind($test_mode); + + # Check that the correct databases are present after pg_rewind. + check_query( + 'SELECT datname FROM pg_database ORDER BY 1', + qq(beforepromotion +inprimary +postgres +standby_afterpromotion +template0 +template1 +), + 'database names'); + + # Permissions on PGDATA should have group permissions + SKIP: + { + skip "unix-style permissions not supported on Windows", 1 + if ($windows_os || $Config::Config{osname} eq 'cygwin'); + + ok(check_mode_recursive($node_primary->data_dir(), 0750, 0640), + 'check PGDATA permissions'); + } + + RewindTest::clean_rewind_test(); + return; +} + +run_test('remote'); + +done_testing(); diff --git a/contrib/pg_tde/typedefs.list b/contrib/pg_tde/typedefs.list deleted file mode 100644 index 7ff41d54e5fd9..0000000000000 --- a/contrib/pg_tde/typedefs.list +++ /dev/null @@ -1,110 +0,0 @@ -BulkInsertStateData -BulkInsertStateData -BulkInsertStateData -BulkInsertStateData -CurlString -FileKeyring -GenericKeyring -HeapPageFreeze -HeapPageFreeze -HeapScanDescData -HeapScanDescData -HeapScanDescData -HeapScanDescData -HeapTupleFreeze -HeapTupleFreeze -IndexDeleteCounts -IndexDeleteCounts -IndexFetchHeapData -IndexFetchHeapData -InternalKey -JsonKeringSemState -JsonKeyringField -JsonKeyringState -JsonVaultRespField -JsonVaultRespSemState -JsonVaultRespState -Keydata -KeyInfo -KeyProviders -KeyringProvideRecord -KeyringProviderXLRecord -KeyringReturnCode -LVPagePruneState -LVRelState -LVRelState -LVSavedErrInfo -LVSavedErrInfo -LogicalRewriteMappingData -LogicalRewriteMappingData -PendingMapEntryDelete -ProviderScanType -PruneFreezeResult -RelKeyCache -RelKeyCacheRec -RewriteMappingDataEntry -RewriteMappingDataEntry -RewriteMappingFile -RewriteMappingFile -RewriteStateData -RewriteStateData -RewriteStateData -RewriteStateData *RewriteState; -TDEBufferHeapTupleTableSlot -TDEFileHeader -TDEKeyringRoutine -TDELocalState -TDELockTypes -TDEMapEntry -TDEMapFilePath -TDEPrincipalKey -TDEPrincipalKeyInfo -TDEShmemSetupRoutine -TdeCreateEvent -TdeCreateEventType -TdeKeyProviderInfoSharedState -TdePrincipalKeySharedState -TdePrincipalKeylocalState -TdeSharedState -VaultV2Keyring -XLogExtensionInstall -XLogPrincipalKeyRotate -XLogRelKey -itemIdCompactData -itemIdCompactData -xl_multi_insert_tuple -xl_multi_insert_tuple -xl_tdeheap_confirm -xl_tdeheap_confirm -xl_tdeheap_delete -xl_tdeheap_delete -xl_tdeheap_freeze_page -xl_tdeheap_freeze_plan -xl_tdeheap_header -xl_tdeheap_header -xl_tdeheap_inplace -xl_tdeheap_inplace -xl_tdeheap_insert -xl_tdeheap_insert -xl_tdeheap_lock -xl_tdeheap_lock -xl_tdeheap_lock_updated -xl_tdeheap_lock_updated -xl_tdeheap_multi_insert -xl_tdeheap_multi_insert -xl_tdeheap_new_cid -xl_tdeheap_new_cid -xl_tdeheap_prune -xl_tdeheap_prune -xl_tdeheap_rewrite_mapping -xl_tdeheap_rewrite_mapping -xl_tdeheap_truncate -xl_tdeheap_truncate -xl_tdeheap_update -xl_tdeheap_update -xl_tdeheap_vacuum -xl_tdeheap_visible -xl_tdeheap_visible -xlhp_freeze_plan -xlhp_freeze_plans -xlhp_prune_items \ No newline at end of file diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out index 9f75fed3f5d30..81e752877cebd 100644 --- a/contrib/postgres_fdw/expected/postgres_fdw.out +++ b/contrib/postgres_fdw/expected/postgres_fdw.out @@ -4926,6 +4926,44 @@ SELECT ft2.*, ft4.* FROM ft2 INNER JOIN ----+----+----+----+----+----+----+----+----+----+---- (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 @@ -7974,6 +8012,119 @@ DELETE FROM rem1; -- can't be pushed down (5 rows) DROP TRIGGER trig_row_after_delete ON rem1; +-- We are allowed to create transition-table triggers on both kinds of +-- inheritance even if they contain foreign tables as children, but currently +-- collecting transition tuples from such foreign tables is not supported. +CREATE TABLE local_tbl (a text, b int); +CREATE FOREIGN TABLE foreign_tbl (a text, b int) + SERVER loopback OPTIONS (table_name 'local_tbl'); +INSERT INTO foreign_tbl VALUES ('AAA', 42); +-- Test case for partition hierarchy +CREATE TABLE parent_tbl (a text, b int) PARTITION BY LIST (a); +ALTER TABLE parent_tbl ATTACH PARTITION foreign_tbl FOR VALUES IN ('AAA'); +CREATE TRIGGER parent_tbl_insert_trig + AFTER INSERT ON parent_tbl REFERENCING NEW TABLE AS new_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); +CREATE TRIGGER parent_tbl_update_trig + AFTER UPDATE ON parent_tbl REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); +CREATE TRIGGER parent_tbl_delete_trig + AFTER DELETE ON parent_tbl REFERENCING OLD TABLE AS old_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); +INSERT INTO parent_tbl VALUES ('AAA', 42); +ERROR: cannot collect transition tuples from child foreign tables +COPY parent_tbl (a, b) FROM stdin; +ERROR: cannot collect transition tuples from child foreign tables +CONTEXT: COPY parent_tbl, line 1: "AAA 42" +ALTER SERVER loopback OPTIONS (ADD batch_size '10'); +INSERT INTO parent_tbl VALUES ('AAA', 42); +ERROR: cannot collect transition tuples from child foreign tables +COPY parent_tbl (a, b) FROM stdin; +ERROR: cannot collect transition tuples from child foreign tables +CONTEXT: COPY parent_tbl, line 1: "AAA 42" +ALTER SERVER loopback OPTIONS (DROP batch_size); +EXPLAIN (VERBOSE, COSTS OFF) +UPDATE parent_tbl SET b = b + 1; + QUERY PLAN +------------------------------------------------------------------------------------------------ + Update on public.parent_tbl + Foreign Update on public.foreign_tbl parent_tbl_1 + Remote SQL: UPDATE public.local_tbl SET b = $2 WHERE ctid = $1 + -> Foreign Scan on public.foreign_tbl parent_tbl_1 + Output: (parent_tbl_1.b + 1), parent_tbl_1.tableoid, parent_tbl_1.ctid, parent_tbl_1.* + Remote SQL: SELECT a, b, ctid FROM public.local_tbl FOR UPDATE +(6 rows) + +UPDATE parent_tbl SET b = b + 1; +ERROR: cannot collect transition tuples from child foreign tables +EXPLAIN (VERBOSE, COSTS OFF) +DELETE FROM parent_tbl; + QUERY PLAN +------------------------------------------------------------------ + Delete on public.parent_tbl + Foreign Delete on public.foreign_tbl parent_tbl_1 + Remote SQL: DELETE FROM public.local_tbl WHERE ctid = $1 + -> Foreign Scan on public.foreign_tbl parent_tbl_1 + Output: parent_tbl_1.tableoid, parent_tbl_1.ctid + Remote SQL: SELECT ctid FROM public.local_tbl FOR UPDATE +(6 rows) + +DELETE FROM parent_tbl; +ERROR: cannot collect transition tuples from child foreign tables +ALTER TABLE parent_tbl DETACH PARTITION foreign_tbl; +DROP TABLE parent_tbl; +-- Test case for non-partition hierarchy +CREATE TABLE parent_tbl (a text, b int); +ALTER FOREIGN TABLE foreign_tbl INHERIT parent_tbl; +CREATE TRIGGER parent_tbl_update_trig + AFTER UPDATE ON parent_tbl REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); +CREATE TRIGGER parent_tbl_delete_trig + AFTER DELETE ON parent_tbl REFERENCING OLD TABLE AS old_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); +EXPLAIN (VERBOSE, COSTS OFF) +UPDATE parent_tbl SET b = b + 1; + QUERY PLAN +------------------------------------------------------------------------------------------------------ + Update on public.parent_tbl + Update on public.parent_tbl parent_tbl_1 + Foreign Update on public.foreign_tbl parent_tbl_2 + Remote SQL: UPDATE public.local_tbl SET b = $2 WHERE ctid = $1 + -> Result + Output: (parent_tbl.b + 1), parent_tbl.tableoid, parent_tbl.ctid, (NULL::record) + -> Append + -> Seq Scan on public.parent_tbl parent_tbl_1 + Output: parent_tbl_1.b, parent_tbl_1.tableoid, parent_tbl_1.ctid, NULL::record + -> Foreign Scan on public.foreign_tbl parent_tbl_2 + Output: parent_tbl_2.b, parent_tbl_2.tableoid, parent_tbl_2.ctid, parent_tbl_2.* + Remote SQL: SELECT a, b, ctid FROM public.local_tbl FOR UPDATE +(12 rows) + +UPDATE parent_tbl SET b = b + 1; +ERROR: cannot collect transition tuples from child foreign tables +EXPLAIN (VERBOSE, COSTS OFF) +DELETE FROM parent_tbl; + QUERY PLAN +------------------------------------------------------------------------ + Delete on public.parent_tbl + Delete on public.parent_tbl parent_tbl_1 + Foreign Delete on public.foreign_tbl parent_tbl_2 + Remote SQL: DELETE FROM public.local_tbl WHERE ctid = $1 + -> Append + -> Seq Scan on public.parent_tbl parent_tbl_1 + Output: parent_tbl_1.tableoid, parent_tbl_1.ctid + -> Foreign Scan on public.foreign_tbl parent_tbl_2 + Output: parent_tbl_2.tableoid, parent_tbl_2.ctid + Remote SQL: SELECT ctid FROM public.local_tbl FOR UPDATE +(10 rows) + +DELETE FROM parent_tbl; +ERROR: cannot collect transition tuples from child foreign tables +ALTER FOREIGN TABLE foreign_tbl NO INHERIT parent_tbl; +DROP TABLE parent_tbl; +-- Cleanup +DROP FOREIGN TABLE foreign_tbl; +DROP TABLE local_tbl; -- =================================================================== -- test inheritance features -- =================================================================== diff --git a/contrib/postgres_fdw/postgres_fdw.c b/contrib/postgres_fdw/postgres_fdw.c index fc65d81e2177a..353a4e6a2a3eb 100644 --- a/contrib/postgres_fdw/postgres_fdw.c +++ b/contrib/postgres_fdw/postgres_fdw.c @@ -239,6 +239,7 @@ typedef struct PgFdwDirectModifyState PGresult *result; /* result for query */ int num_tuples; /* # of result tuples */ int next_tuple; /* index of next one to return */ + MemoryContextCallback result_cb; /* ensures result will get freed */ Relation resultRel; /* relcache entry for the target relation */ AttrNumber *attnoMap; /* array of attnums of input user columns */ AttrNumber ctidAttno; /* attnum of input ctid column */ @@ -2662,6 +2663,17 @@ postgresBeginDirectModify(ForeignScanState *node, int eflags) dmstate = (PgFdwDirectModifyState *) palloc0(sizeof(PgFdwDirectModifyState)); node->fdw_state = (void *) dmstate; + /* + * We use a memory context callback to ensure that the dmstate's PGresult + * (if any) will be released, even if the query fails somewhere that's + * outside our control. The callback is always armed for the duration of + * the query; this relies on PQclear(NULL) being a no-op. + */ + dmstate->result_cb.func = (MemoryContextCallbackFunction) PQclear; + dmstate->result_cb.arg = NULL; + MemoryContextRegisterResetCallback(CurrentMemoryContext, + &dmstate->result_cb); + /* * Identify which user to do the remote access as. This should match what * ExecCheckPermissions() does. @@ -2809,7 +2821,13 @@ postgresEndDirectModify(ForeignScanState *node) return; /* Release PGresult */ - PQclear(dmstate->result); + if (dmstate->result) + { + PQclear(dmstate->result); + dmstate->result = NULL; + /* ... and don't forget to disable the callback */ + dmstate->result_cb.arg = NULL; + } /* Release remote connection */ ReleaseConnection(dmstate->conn); @@ -4578,13 +4596,17 @@ execute_dml_stmt(ForeignScanState *node) /* * Get the result, and check for success. * - * We don't use a PG_TRY block here, so be careful not to throw error - * without releasing the PGresult. + * We use a memory context callback to ensure that the PGresult will be + * released, even if the query fails somewhere that's outside our control. + * The callback is already registered, just need to fill in its arg. */ + Assert(dmstate->result == NULL); dmstate->result = pgfdw_get_result(dmstate->conn); + dmstate->result_cb.arg = dmstate->result; + if (PQresultStatus(dmstate->result) != (dmstate->has_returning ? PGRES_TUPLES_OK : PGRES_COMMAND_OK)) - pgfdw_report_error(ERROR, dmstate->result, dmstate->conn, true, + pgfdw_report_error(ERROR, dmstate->result, dmstate->conn, false, dmstate->query); /* Get the number of rows affected. */ @@ -4628,30 +4650,16 @@ get_returning_data(ForeignScanState *node) } else { - /* - * On error, be sure to release the PGresult on the way out. Callers - * do not have PG_TRY blocks to ensure this happens. - */ - PG_TRY(); - { - HeapTuple newtup; - - newtup = make_tuple_from_result_row(dmstate->result, - dmstate->next_tuple, - dmstate->rel, - dmstate->attinmeta, - dmstate->retrieved_attrs, - node, - dmstate->temp_cxt); - ExecStoreHeapTuple(newtup, slot, false); - } - PG_CATCH(); - { - PQclear(dmstate->result); - PG_RE_THROW(); - } - PG_END_TRY(); + HeapTuple newtup; + newtup = make_tuple_from_result_row(dmstate->result, + dmstate->next_tuple, + dmstate->rel, + dmstate->attinmeta, + dmstate->retrieved_attrs, + node, + dmstate->temp_cxt); + ExecStoreHeapTuple(newtup, slot, false); /* Get the updated/deleted tuple. */ if (dmstate->rel) resultSlot = slot; @@ -5758,8 +5766,7 @@ semijoin_target_ok(PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, if (!IsA(var, Var)) continue; - if (bms_is_member(var->varno, innerrel->relids) && - !bms_is_member(var->varno, outerrel->relids)) + if (bms_is_member(var->varno, innerrel->relids)) { /* * The planner can create semi-join, which refers to inner rel @@ -5767,6 +5774,7 @@ semijoin_target_ok(PlannerInfo *root, RelOptInfo *joinrel, RelOptInfo *outerrel, * 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; } @@ -5953,17 +5961,33 @@ 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: - fpinfo->joinclauses = list_concat(fpinfo->joinclauses, - fpinfo_o->remote_conds); - fpinfo->remote_conds = list_concat(fpinfo->remote_conds, - fpinfo_i->remote_conds); + + /* + * 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: diff --git a/contrib/postgres_fdw/sql/postgres_fdw.sql b/contrib/postgres_fdw/sql/postgres_fdw.sql index db69434188581..12c2940412555 100644 --- a/contrib/postgres_fdw/sql/postgres_fdw.sql +++ b/contrib/postgres_fdw/sql/postgres_fdw.sql @@ -1455,6 +1455,23 @@ SELECT ft2.*, ft4.* FROM ft2 INNER JOIN 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 @@ -2216,6 +2233,84 @@ EXPLAIN (verbose, costs off) DELETE FROM rem1; -- can't be pushed down DROP TRIGGER trig_row_after_delete ON rem1; + +-- We are allowed to create transition-table triggers on both kinds of +-- inheritance even if they contain foreign tables as children, but currently +-- collecting transition tuples from such foreign tables is not supported. + +CREATE TABLE local_tbl (a text, b int); +CREATE FOREIGN TABLE foreign_tbl (a text, b int) + SERVER loopback OPTIONS (table_name 'local_tbl'); + +INSERT INTO foreign_tbl VALUES ('AAA', 42); + +-- Test case for partition hierarchy +CREATE TABLE parent_tbl (a text, b int) PARTITION BY LIST (a); +ALTER TABLE parent_tbl ATTACH PARTITION foreign_tbl FOR VALUES IN ('AAA'); + +CREATE TRIGGER parent_tbl_insert_trig + AFTER INSERT ON parent_tbl REFERENCING NEW TABLE AS new_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); +CREATE TRIGGER parent_tbl_update_trig + AFTER UPDATE ON parent_tbl REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); +CREATE TRIGGER parent_tbl_delete_trig + AFTER DELETE ON parent_tbl REFERENCING OLD TABLE AS old_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); + +INSERT INTO parent_tbl VALUES ('AAA', 42); + +COPY parent_tbl (a, b) FROM stdin; +AAA 42 +\. + +ALTER SERVER loopback OPTIONS (ADD batch_size '10'); + +INSERT INTO parent_tbl VALUES ('AAA', 42); + +COPY parent_tbl (a, b) FROM stdin; +AAA 42 +\. + +ALTER SERVER loopback OPTIONS (DROP batch_size); + +EXPLAIN (VERBOSE, COSTS OFF) +UPDATE parent_tbl SET b = b + 1; +UPDATE parent_tbl SET b = b + 1; + +EXPLAIN (VERBOSE, COSTS OFF) +DELETE FROM parent_tbl; +DELETE FROM parent_tbl; + +ALTER TABLE parent_tbl DETACH PARTITION foreign_tbl; +DROP TABLE parent_tbl; + +-- Test case for non-partition hierarchy +CREATE TABLE parent_tbl (a text, b int); +ALTER FOREIGN TABLE foreign_tbl INHERIT parent_tbl; + +CREATE TRIGGER parent_tbl_update_trig + AFTER UPDATE ON parent_tbl REFERENCING OLD TABLE AS old_table NEW TABLE AS new_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); +CREATE TRIGGER parent_tbl_delete_trig + AFTER DELETE ON parent_tbl REFERENCING OLD TABLE AS old_table + FOR EACH STATEMENT EXECUTE PROCEDURE trigger_func(); + +EXPLAIN (VERBOSE, COSTS OFF) +UPDATE parent_tbl SET b = b + 1; +UPDATE parent_tbl SET b = b + 1; + +EXPLAIN (VERBOSE, COSTS OFF) +DELETE FROM parent_tbl; +DELETE FROM parent_tbl; + +ALTER FOREIGN TABLE foreign_tbl NO INHERIT parent_tbl; +DROP TABLE parent_tbl; + +-- Cleanup +DROP FOREIGN TABLE foreign_tbl; +DROP TABLE local_tbl; + -- =================================================================== -- test inheritance features -- =================================================================== diff --git a/contrib/test_decoding/Makefile b/contrib/test_decoding/Makefile index a4ba1a509aec2..02e961f4d3144 100644 --- a/contrib/test_decoding/Makefile +++ b/contrib/test_decoding/Makefile @@ -9,7 +9,7 @@ REGRESS = ddl xact rewrite toast permissions decoding_in_xact \ 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 \ - skip_snapshot_restore + 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/invalidation_distribution.out b/contrib/test_decoding/expected/invalidation_distribution.out new file mode 100644 index 0000000000000..ae53b1e61de3e --- /dev/null +++ b/contrib/test_decoding/expected/invalidation_distribution.out @@ -0,0 +1,41 @@ +Parsed test spec with 3 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) + + +starting permutation: s1_begin s1_insert_tbl1 s3_begin s3_insert_tbl1 s2_alter_pub_add_tbl s1_insert_tbl1 s1_commit s3_commit s2_get_binary_changes +step s1_begin: BEGIN; +step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1); +step s3_begin: BEGIN; +step s3_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (2, 2); +step s2_alter_pub_add_tbl: ALTER PUBLICATION pub ADD TABLE tbl1; +step s1_insert_tbl1: INSERT INTO tbl1 (val1, val2) VALUES (1, 1); +step s1_commit: COMMIT; +step s3_commit: COMMIT; +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/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/meson.build b/contrib/test_decoding/meson.build index f643dc81a2c84..03dd80b7f1967 100644 --- a/contrib/test_decoding/meson.build +++ b/contrib/test_decoding/meson.build @@ -63,6 +63,7 @@ tests += { 'twophase_snapshot', 'slot_creation_error', 'skip_snapshot_restore', + 'invalidation_distribution', ], 'regress_args': [ '--temp-config', files('logical.conf'), diff --git a/contrib/test_decoding/specs/invalidation_distribution.spec b/contrib/test_decoding/specs/invalidation_distribution.spec new file mode 100644 index 0000000000000..67d41969ac1d6 --- /dev/null +++ b/contrib/test_decoding/specs/invalidation_distribution.spec @@ -0,0 +1,43 @@ +# 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; } + +session "s3" +setup { SET synchronous_commit=on; } +step "s3_begin" { BEGIN; } +step "s3_insert_tbl1" { INSERT INTO tbl1 (val1, val2) VALUES (2, 2); } +step "s3_commit" { COMMIT; } + +# 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" + +# Expect to get one insert change with LOGICAL_REP_MSG_INSERT = 'I' from +# the second "s1_insert_tbl1" executed after adding the table tbl1 to the +# publication in "s2_alter_pub_add_tbl". +permutation "s1_begin" "s1_insert_tbl1" "s3_begin" "s3_insert_tbl1" "s2_alter_pub_add_tbl" "s1_insert_tbl1" "s1_commit" "s3_commit" "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/xml2/xpath.c b/contrib/xml2/xpath.c index 212cb74aa220b..94bb31434c89b 100644 --- a/contrib/xml2/xpath.c +++ b/contrib/xml2/xpath.c @@ -174,7 +174,7 @@ pgxmlNodeSetToText(xmlNodeSetPtr nodeset, xmlBufferWriteCHAR(buf, toptagname); xmlBufferWriteChar(buf, ">"); } - result = xmlStrdup(buf->content); + result = xmlStrdup(xmlBufferContent(buf)); xmlBufferFree(buf); return result; } diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index a63cc71efa2f1..9f237a1a6f54e 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -1590,7 +1590,7 @@ rolpassword text - Password (possibly encrypted); null if none. The format depends + Encrypted password; null if none. The format depends on the form of encryption used. @@ -1626,11 +1626,6 @@ SCRAM-SHA-256$<iteration count>:&l ServerKey are in Base64 encoded format. This format is the same as that specified by RFC 5803. - - - A password that does not follow either of those formats is assumed to be - unencrypted. - diff --git a/doc/src/sgml/client-auth.sgml b/doc/src/sgml/client-auth.sgml index f1eb3b279ed42..3e5514fd436ad 100644 --- a/doc/src/sgml/client-auth.sgml +++ b/doc/src/sgml/client-auth.sgml @@ -984,8 +984,9 @@ local db1,db2,@demodbs all md5 the remainder of the field is treated as a regular expression. (See for details of PostgreSQL's regular expression syntax.) The regular - expression can include a single capture, or parenthesized subexpression, - which can then be referenced in the database-username + expression can include a single capture, or parenthesized subexpression. + The portion of the system user name that matched the capture can then + be referenced in the database-username field as \1 (backslash-one). This allows the mapping of multiple user names in a single line, which is particularly useful for simple syntax substitutions. For example, these entries @@ -1003,12 +1004,11 @@ mymap /^(.*)@otherdomain\.com$ guest If the database-username field starts with 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 - to use a capture from regular expression on - system-username for a regular expression - on database-username. + as a regular expression. + When the database-username field is a regular + expression, it is not possible to use \1 within it to + refer to a capture from the system-username + field. diff --git a/doc/src/sgml/datatype.sgml b/doc/src/sgml/datatype.sgml index cd82c1c17e0a4..621a1d903197b 100644 --- a/doc/src/sgml/datatype.sgml +++ b/doc/src/sgml/datatype.sgml @@ -117,7 +117,7 @@ double precision - float8 + float, float8 double precision floating-point number (8 bytes) diff --git a/doc/src/sgml/ddl.sgml b/doc/src/sgml/ddl.sgml index c150dd217f9e2..44578e51a8288 100644 --- a/doc/src/sgml/ddl.sgml +++ b/doc/src/sgml/ddl.sgml @@ -1681,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.) @@ -4986,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. diff --git a/doc/src/sgml/docguide.sgml b/doc/src/sgml/docguide.sgml index db4bcce56eac6..7b61b4841aa03 100644 --- a/doc/src/sgml/docguide.sgml +++ b/doc/src/sgml/docguide.sgml @@ -60,9 +60,7 @@ maintained by the OASIS group. The official DocBook site has good introductory and reference documentation and - a complete O'Reilly book for your online reading pleasure. The - - NewbieDoc Docbook Guide is very helpful for beginners. + a complete O'Reilly book for your online reading pleasure. The FreeBSD Documentation Project also uses DocBook and has some good information, including a number of style guidelines that might be 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/func.sgml b/doc/src/sgml/func.sgml index cb9a6e2c91084..fc4b95378715e 100644 --- a/doc/src/sgml/func.sgml +++ b/doc/src/sgml/func.sgml @@ -1786,13 +1786,23 @@ SELECT NOT(ROW(table.*) IS NOT NULL) FROM TABLE; -- detect at least one null in which operand falls in a histogram having count equal-width buckets spanning the range low to high. - Returns 0 + The buckets have inclusive lower bounds and exclusive upper bounds. + Returns 0 for an input less + than low, or count+1 for an input - outside that range. + greater than or equal to high. + If low > high, + the behavior is mirror-reversed, with bucket 1 + now being the one just below low, and the + inclusive bounds now being on the upper side. width_bucket(5.35, 0.024, 10.06, 5) 3 + + + width_bucket(9, 10, 0, 10) + 2 @@ -1804,8 +1814,8 @@ SELECT NOT(ROW(table.*) IS NOT NULL) FROM TABLE; -- detect at least one null in Returns the number of the bucket in which operand falls given an array listing the - lower bounds of the buckets. Returns 0 for an - input less than the first lower + inclusive lower bounds of the buckets. + Returns 0 for an input less than the first lower bound. operand and the array elements can be of any type having standard comparison operators. The thresholds array must be @@ -10687,7 +10697,7 @@ SELECT date_bin('15 minutes', TIMESTAMP '2020-02-11 15:44:17', TIMESTAMP '2001-0 - <literal>AT TIME ZONE and AT LOCAL</literal> + <literal>AT TIME ZONE</literal> and <literal>AT LOCAL</literal> time zone @@ -11014,10 +11024,10 @@ now() statement (more specifically, the time of receipt of the latest command message from the client). statement_timestamp() and transaction_timestamp() - return the same value during the first command of a transaction, but might - differ during subsequent commands. + return the same value during the first statement of a transaction, but might + differ during subsequent statements. clock_timestamp() returns the actual current time, and - therefore its value changes even within a single SQL command. + therefore its value changes even within a single SQL statement. timeofday() is a historical PostgreSQL function. Like clock_timestamp(), it returns the actual current time, @@ -14151,7 +14161,7 @@ CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow', 'green', 'blue', 'purple UUID Functions - + UUID generating @@ -19308,7 +19318,7 @@ SELECT jt.* FROM SELECT jt.* FROM my_films, JSON_TABLE (js, '$.favorites[*] ? (@.films[*].director == $filter)' - PASSING 'Alfred Hitchcock' AS filter, 'Vertigo' AS filter2 + PASSING 'Alfred Hitchcock' AS filter COLUMNS ( id FOR ORDINALITY, kind text PATH '$.kind', @@ -19395,13 +19405,13 @@ SELECT jt.* FROM SELECT * FROM JSON_TABLE ( '{"favorites": - {"movies": + [{"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[*]' +}]}'::json, '$.favorites[*]' COLUMNS ( user_id FOR ORDINALITY, NESTED '$.movies[*]' @@ -27174,6 +27184,31 @@ SELECT currval(pg_get_serial_sequence('sometable', 'id')); details. + + + + + pg_get_multixact_members + + pg_get_multixact_members ( multixid xid ) + setof record + ( xid xid, + mode text ) + + + Returns the transaction ID and lock mode for each member of the + specified multixact ID. The lock modes forupd, + fornokeyupd, sh, and + keysh correspond to the row-level locks + FOR UPDATE, FOR NO KEY UPDATE, + FOR SHARE, and FOR KEY SHARE, + respectively, as described in . Two + additional modes are specific to multixacts: + nokeyupd, used by updates that do not modify key + columns, and upd, used by updates or deletes that + modify key columns. + + @@ -27182,7 +27217,8 @@ SELECT currval(pg_get_serial_sequence('sometable', 'id')); The internal transaction ID type xid is 32 bits wide and wraps around every 4 billion transactions. However, the functions shown in , except - age and mxid_age, use a + age, mxid_age, and + pg_get_multixact_members, 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. @@ -29045,8 +29081,7 @@ 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. @@ -29096,7 +29131,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. @@ -29118,6 +29154,11 @@ 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. @@ -29172,7 +29213,7 @@ postgres=# SELECT '0/0'::pg_lsn + pd.segment_number * ps.setting::int + :offset - + pg_logical_slot_get_binary_changes @@ -29443,7 +29484,9 @@ postgres=# SELECT '0/0'::pg_lsn + pd.segment_number * ps.setting::int + :offset 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 + Note that this function is primarily intended for testing and + debugging purposes and should be used with caution. Additionally, + this function cannot be executed if sync_replication_slots is enabled and the slotsync worker is already running to perform the synchronization of slots. diff --git a/doc/src/sgml/history.sgml b/doc/src/sgml/history.sgml index 3bf60fc563b09..070cfb8c94bec 100644 --- a/doc/src/sgml/history.sgml +++ b/doc/src/sgml/history.sgml @@ -197,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 e3c1539a1e3bc..d0dbf017a9e1f 100644 --- a/doc/src/sgml/indexam.sgml +++ b/doc/src/sgml/indexam.sgml @@ -141,7 +141,7 @@ typedef struct IndexAmRoutine ambuild_function ambuild; ambuildempty_function ambuildempty; aminsert_function aminsert; - aminsertcleanup_function aminsertcleanup; + aminsertcleanup_function aminsertcleanup; /* can be NULL */ ambulkdelete_function ambulkdelete; amvacuumcleanup_function amvacuumcleanup; amcanreturn_function amcanreturn; /* can be NULL */ diff --git a/doc/src/sgml/installation.sgml b/doc/src/sgml/installation.sgml index 649b74aac1888..ba5c07685716a 100644 --- a/doc/src/sgml/installation.sgml +++ b/doc/src/sgml/installation.sgml @@ -2725,7 +2725,7 @@ ninja install - + Setting this option allows you to override the value of all diff --git a/doc/src/sgml/legal.sgml b/doc/src/sgml/legal.sgml index af13bf2e055b1..75c1309cf7326 100644 --- a/doc/src/sgml/legal.sgml +++ b/doc/src/sgml/legal.sgml @@ -11,13 +11,15 @@ Legal Notice - PostgreSQL is Copyright © 1996–2025 - by the PostgreSQL Global Development Group. + PostgreSQL Database Management System + (also known as Postgres, formerly known as Postgres95) - Postgres95 is Copyright © 1994–5 - by the Regents of the University of California. + Portions Copyright © 1996-2025, PostgreSQL Global Development Group + + + Portions Copyright © 1994, The Regents of the University of California diff --git a/doc/src/sgml/libpq.sgml b/doc/src/sgml/libpq.sgml index e3b74af96a64b..ab296b6f87b72 100644 --- a/doc/src/sgml/libpq.sgml +++ b/doc/src/sgml/libpq.sgml @@ -1999,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 @@ -5070,7 +5070,7 @@ unsigned char *PQunescapeBytea(const unsigned char *from, size_t *to_length); , , , - + , , and respectively. diff --git a/doc/src/sgml/logical-replication.sgml b/doc/src/sgml/logical-replication.sgml index 88b2491e09b3e..db68cc6ec1dd6 100644 --- a/doc/src/sgml/logical-replication.sgml +++ b/doc/src/sgml/logical-replication.sgml @@ -714,8 +714,8 @@ ALTER SUBSCRIPTION - To confirm that the standby server is indeed ready for failover, follow these - steps to verify that all necessary logical replication slots have been + To confirm that the standby server is indeed ready for failover for a given subscriber, follow these + steps to verify that all the logical replication slots required by that subscriber have been synchronized to the standby server: @@ -769,7 +769,7 @@ test_sub=# SELECT 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 +test_standby=# SELECT slot_name, (synced AND NOT temporary AND invalidation_reason IS NULL) AS failover_ready FROM pg_replication_slots WHERE slot_name IN ('sub1','sub2','sub3', 'pg_16394_sync_16385_7394666715149055164'); @@ -787,10 +787,42 @@ test_standby=# SELECT slot_name, (synced AND NOT temporary AND NOT conflicting) 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. + existing subscriptions can continue subscribing to publications on the new + primary server. + + + + The first two steps in the above procedure are meant for a + PostgreSQL subscriber. It is recommended to run + these steps on each subscriber node, that will be served by the designated + standby after failover, to obtain the complete list of replication + slots. This list can then be verified in Step 3 to ensure failover readiness. + Non-PostgreSQL subscribers, on the other hand, may + use their own methods to identify the replication slots used by their + respective subscriptions. + + + + In some cases, such as during a planned failover, it is necessary to confirm + that all subscribers, whether PostgreSQL or + non-PostgreSQL, will be able to continue + replication after failover to a given standby server. In such cases, use the + following SQL, instead of performing the first two steps above, to identify + which replication slots on the primary need to be synced to the standby that + is intended for promotion. This query returns the relevant replication slots + associated with all the failover-enabled subscriptions. + + +/* primary # */ SELECT array_agg(quote_literal(r.slot_name)) AS slots + FROM pg_replication_slots r + WHERE r.failover AND NOT r.temporary; + slots +------- + {'sub1','sub2','sub3', 'pg_16394_sync_16385_7394666715149055164'} +(1 row) + diff --git a/doc/src/sgml/logicaldecoding.sgml b/doc/src/sgml/logicaldecoding.sgml index 1c4ae38f1b992..c5ce77658b1ee 100644 --- a/doc/src/sgml/logicaldecoding.sgml +++ b/doc/src/sgml/logicaldecoding.sgml @@ -290,7 +290,7 @@ postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NU A logical slot will emit each change just once in normal operation. The current position of each slot is persisted only at checkpoint, so in - the case of a crash the slot may return to an earlier LSN, which will + the case of a crash the slot might return to an earlier LSN, which will then cause recent changes to be sent again when the server restarts. Logical decoding clients are responsible for avoiding ill effects from handling the same message more than once. Clients may wish to record @@ -370,10 +370,10 @@ postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NU 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 + CREATE SUBSCRIPTION during slot creation. + Additionally, enabling + sync_replication_slots on the standby + is required. By enabling 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 @@ -398,6 +398,52 @@ postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NU receiving the WAL up to the latest flushed position on the primary server. + + + While enabling + sync_replication_slots allows for automatic + periodic synchronization of failover slots, they can also be manually + synchronized using the + pg_sync_replication_slots function on the standby. + However, this function is primarily intended for testing and debugging and + should be used with caution. Unlike automatic synchronization, it does not + include cyclic retries, making it more prone to synchronization failures, + particularly during initial sync scenarios where the required WAL files + or catalog rows for the slot might have already been removed or are at risk + of being removed on the standby. In contrast, automatic synchronization + via sync_replication_slots provides continuous slot + updates, enabling seamless failover and supporting high availability. + Therefore, it is the recommended method for synchronizing slots. + + + + + When slot synchronization is configured as recommended, + and the initial synchronization is performed either automatically or + manually via pg_sync_replication_slot, the standby can persist the + synchronized slot only if the following condition is met: The logical + replication slot on the primary must retain WALs and system catalog + rows that are still available on the standby. This ensures data + integrity and allows logical replication to continue smoothly after + promotion. + If the required WALs or catalog rows have already been purged from the + standby, the slot will not be persisted to avoid data loss. In such + cases, the following log message may appear: + +LOG: could not synchronize replication slot "failover_slot" +DETAIL: Synchronization could lead to data loss, because the remote slot needs WAL at LSN 0/3003F28 and catalog xmin 754, but the standby has LSN 0/3003F28 and catalog xmin 756. + + If the logical replication slot is actively used by a consumer, no + manual intervention is needed; the slot will advance automatically, + and synchronization will resume in the next cycle. However, if no + consumer is configured, it is advisable to manually advance the slot + on the primary using + pg_logical_slot_get_changes or + + pg_logical_slot_get_binary_changes, + allowing synchronization to proceed. + + The ability to resume logical replication after failover depends upon the pg_replication_slots.synced @@ -455,9 +501,8 @@ postgres=# select * from pg_logical_slot_get_changes('regression_slot', NULL, NU using the slot's contents without losing any changes. - Creation of a snapshot is not always possible. In particular, it will - fail when connected to a hot standby. Applications that do not require - snapshot export may suppress it with the NOEXPORT_SNAPSHOT + Applications that do not require + snapshot export may suppress it with the SNAPSHOT 'nothing' option. diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml index 0be90bdc7efe1..b81a5806eb6d3 100644 --- a/doc/src/sgml/maintenance.sgml +++ b/doc/src/sgml/maintenance.sgml @@ -761,7 +761,10 @@ HINT: Execute a database-wide VACUUM in that database. careful aging management, storage cleanup, and wraparound handling. There is a separate storage area which holds the list of members in each multixact, which also uses a 32-bit counter and which must also - be managed. + be managed. The system function + pg_get_multixact_members() described in + can be used to examine the + transaction IDs associated with a multixact ID. @@ -793,10 +796,11 @@ HINT: Execute a database-wide VACUUM in that database. 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. diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index eabc4f5d172ed..d73c627382ace 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -1148,7 +1148,7 @@ description | Waiting for a newly initialized WAL file to reach durable storage Extensions can add Extension, - InjectionPoint. and LWLock events + 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 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/protocol.sgml b/doc/src/sgml/protocol.sgml index 5a3d6fdb5a34a..e19d1e4c6e92f 100644 --- a/doc/src/sgml/protocol.sgml +++ b/doc/src/sgml/protocol.sgml @@ -800,6 +800,16 @@ SELCT 1/0; Errors detected at semantic analysis or later, such as a misspelled table or column name, do not have this effect. + + + Lastly, note that all the statements within the Query message will + observe the same value of statement_timestamp(), + since that timestamp is updated only upon receipt of the Query + message. This will result in them all observing the same + value of transaction_timestamp() as well, + except in cases where the query string ends a previously-started + transaction and begins a new one. + @@ -2660,8 +2670,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. @@ -3286,11 +3294,13 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" - 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. + Option to enable streaming of in-progress transactions. Valid values are + off (the default), on and + parallel. The setting parallel + enables sending extra information with some messages to be used for + parallelization. Minimum protocol version 2 is required to turn it + on. Minimum protocol version 4 is required for the + parallel value. @@ -7054,8 +7064,8 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" Int64 (XLogRecPtr) - The LSN of the abort. This field is available since protocol version - 4. + The LSN of the abort operation, present only when streaming is set to parallel. + This field is available since protocol version 4. @@ -7064,9 +7074,9 @@ psql "dbname=postgres replication=database" -c "IDENTIFY_SYSTEM;" Int64 (TimestampTz) - Abort timestamp of the transaction. The value is in number - of microseconds since PostgreSQL epoch (2000-01-01). This field is - available since protocol version 4. + Abort timestamp of the transaction, present only when streaming is set to + parallel. The value is in number of microseconds since PostgreSQL epoch (2000-01-01). + This field is available since protocol version 4. diff --git a/doc/src/sgml/queries.sgml b/doc/src/sgml/queries.sgml index 372cce1a487e3..a326960ff4dfb 100644 --- a/doc/src/sgml/queries.sgml +++ b/doc/src/sgml/queries.sgml @@ -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 diff --git a/doc/src/sgml/query.sgml b/doc/src/sgml/query.sgml index 59962d6e85633..bec8a52a58943 100644 --- a/doc/src/sgml/query.sgml +++ b/doc/src/sgml/query.sgml @@ -264,8 +264,18 @@ COPY weather FROM '/home/user/weather.txt'; where the file name for the source file must be available on the machine running the backend process, not the client, since the backend process - reads the file directly. You can read more about the - COPY command in . + reads the file directly. The data inserted above into the weather table + could also be inserted from a file containing (values are separated by a + tab character): + + +San Francisco 46 50 0.25 1994-11-27 +San Francisco 43 57 0.0 1994-11-29 +Hayward 37 54 \N 1994-11-29 + + + You can read more about the COPY command in + . diff --git a/doc/src/sgml/ref/alter_table.sgml b/doc/src/sgml/ref/alter_table.sgml index c6ab432df1483..029ddb391ec8d 100644 --- a/doc/src/sgml/ref/alter_table.sgml +++ b/doc/src/sgml/ref/alter_table.sgml @@ -238,9 +238,10 @@ WITH ( MODULUS numeric_literal, REM provided none of the records in the table contain a NULL value for the column. Ordinarily this is checked during the ALTER TABLE by scanning the - entire table; however, if a valid CHECK constraint is - found which proves no NULL can exist, then the - table scan is skipped. + entire table; + however, if a valid CHECK constraint exists + (and is not dropped in the same command) which proves no + NULL can exist, then the table scan is skipped. @@ -264,6 +265,12 @@ WITH ( MODULUS numeric_literal, REM in the column is rewritten and all the future changes will apply the new generation expression. + + + When this form is used, the column's statistics are removed, + so running ANALYZE + on the table afterwards is recommended. + diff --git a/doc/src/sgml/ref/clusterdb.sgml b/doc/src/sgml/ref/clusterdb.sgml index d3145318b361f..0d2051bf6f188 100644 --- a/doc/src/sgml/ref/clusterdb.sgml +++ b/doc/src/sgml/ref/clusterdb.sgml @@ -248,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/create_domain.sgml b/doc/src/sgml/ref/create_domain.sgml index ce55520348620..c111285a69c6d 100644 --- a/doc/src/sgml/ref/create_domain.sgml +++ b/doc/src/sgml/ref/create_domain.sgml @@ -283,7 +283,8 @@ CREATE TABLE us_snail_addy ( The syntax NOT NULL in this command is a PostgreSQL extension. (A standard-conforming - way to write the same would be CHECK (VALUE IS NOT + 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 diff --git a/doc/src/sgml/ref/create_subscription.sgml b/doc/src/sgml/ref/create_subscription.sgml index 740b7d9421041..c9c8dd440dc7e 100644 --- a/doc/src/sgml/ref/create_subscription.sgml +++ b/doc/src/sgml/ref/create_subscription.sgml @@ -526,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 38be1a5a710e1..a664b7fd02473 100644 --- a/doc/src/sgml/ref/create_table.sgml +++ b/doc/src/sgml/ref/create_table.sgml @@ -442,11 +442,6 @@ WITH ( MODULUS numeric_literal, REM the values in the new row, an error will be reported. - - Partitioned tables do not support EXCLUDE constraints; - however, you can define these constraints on individual partitions. - - See for more discussion on table partitioning. @@ -1125,6 +1120,18 @@ WITH ( MODULUS numeric_literal, REM exclusion constraint on a subset of the table; internally this creates a partial index. Note that parentheses are required around the predicate. + + + When establishing an exclusion constraint for a multi-level partition + hierarchy, all the columns in the partition key of the target + partitioned table, as well as those of all its descendant partitioned + tables, must be included in the constraint definition. Additionally, + those columns must be compared using the equality operator. These + restrictions ensure that potentially-conflicting rows will exist in the + same partition. The constraint may also refer to other columns which + are not a part of any partition key, which can be compared using any + appropriate operator. + diff --git a/doc/src/sgml/ref/create_trigger.sgml b/doc/src/sgml/ref/create_trigger.sgml index 982ab6f3ee450..71869c996e3dc 100644 --- a/doc/src/sgml/ref/create_trigger.sgml +++ b/doc/src/sgml/ref/create_trigger.sgml @@ -197,9 +197,11 @@ CREATE [ OR REPLACE ] [ CONSTRAINT ] TRIGGER name of the rows inserted, deleted, or modified by the current SQL statement. This feature lets the trigger see a global view of what the statement did, not just one row at a time. This option is only allowed for - an AFTER trigger that is not a constraint trigger; also, if - the trigger is an UPDATE trigger, it must not specify - a column_name list. + an AFTER trigger on a plain table (not a foreign table). + The trigger should not be a constraint trigger. Also, if the trigger is + an UPDATE trigger, it must not specify + a column_name list when using + this option. OLD TABLE may only be specified once, and only for a trigger that can fire on UPDATE or DELETE; it creates a transition relation containing the before-images of all rows diff --git a/doc/src/sgml/ref/merge.sgml b/doc/src/sgml/ref/merge.sgml index 97b34b9fcaf7a..5d49d91e67a8d 100644 --- a/doc/src/sgml/ref/merge.sgml +++ b/doc/src/sgml/ref/merge.sgml @@ -23,36 +23,36 @@ PostgreSQL documentation [ WITH with_query [, ...] ] MERGE INTO [ ONLY ] target_table_name [ * ] [ [ AS ] target_alias ] -USING data_source ON join_condition -when_clause [...] -[ RETURNING { * | output_expression [ [ AS ] output_name ] } [, ...] ] + USING data_source ON join_condition + when_clause [...] + [ RETURNING { * | output_expression [ [ AS ] output_name ] } [, ...] ] where data_source is: -{ [ ONLY ] source_table_name [ * ] | ( source_query ) } [ [ AS ] source_alias ] + { [ ONLY ] source_table_name [ * ] | ( source_query ) } [ [ AS ] source_alias ] and when_clause is: -{ WHEN MATCHED [ AND condition ] THEN { merge_update | merge_delete | 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 } } + { WHEN MATCHED [ AND condition ] THEN { merge_update | merge_delete | 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: -INSERT [( column_name [, ...] )] -[ OVERRIDING { SYSTEM | USER } VALUE ] -{ VALUES ( { expression | DEFAULT } [, ...] ) | DEFAULT VALUES } + INSERT [( column_name [, ...] )] + [ OVERRIDING { SYSTEM | USER } VALUE ] + { VALUES ( { expression | DEFAULT } [, ...] ) | DEFAULT VALUES } and merge_update is: -UPDATE SET { column_name = { expression | DEFAULT } | - ( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) | - ( column_name [, ...] ) = ( sub-SELECT ) - } [, ...] + UPDATE SET { column_name = { expression | DEFAULT } | + ( column_name [, ...] ) = [ ROW ] ( { expression | DEFAULT } [, ...] ) | + ( column_name [, ...] ) = ( sub-SELECT ) + } [, ...] and merge_delete is: -DELETE + DELETE diff --git a/doc/src/sgml/ref/pg_basebackup.sgml b/doc/src/sgml/ref/pg_basebackup.sgml index ad36166c6850e..95b9b302e950e 100644 --- a/doc/src/sgml/ref/pg_basebackup.sgml +++ b/doc/src/sgml/ref/pg_basebackup.sgml @@ -1005,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. diff --git a/doc/src/sgml/ref/pg_dump.sgml b/doc/src/sgml/ref/pg_dump.sgml index cfc74ca6d694a..5ba167b33e722 100644 --- a/doc/src/sgml/ref/pg_dump.sgml +++ b/doc/src/sgml/ref/pg_dump.sgml @@ -92,6 +92,18 @@ PostgreSQL documentation light of the limitations listed below. + + + Restoring a dump causes the destination to execute arbitrary code of the + source superusers' choice. Partial dumps and partial restores do not limit + that. If the source superusers are not trusted, the dumped SQL statements + must be inspected before restoring. Non-plain-text dumps can be inspected + by using pg_restore's + option. Note that the client running the dump and restore need not trust + the source or destination superusers. + + + @@ -1207,6 +1219,29 @@ PostgreSQL documentation + + + + + Use the provided string as the psql + \restrict key in the dump output. This can only be + specified for plain-text dumps, i.e., when is + set to plain or the option + is omitted. If no restrict key is specified, + pg_dump will generate a random one as + needed. Keys may contain only alphanumeric characters. + + + This option is primarily intended for testing purposes and other + scenarios that require repeatable output (e.g., comparing dump files). + It is not recommended for general use, as a malicious server with + advance knowledge of the key may be able to inject arbitrary code that + will be executed on the machine that runs + psql with the dump output. + + + + diff --git a/doc/src/sgml/ref/pg_dumpall.sgml b/doc/src/sgml/ref/pg_dumpall.sgml index 9624144c1f4a2..84e38ef211574 100644 --- a/doc/src/sgml/ref/pg_dumpall.sgml +++ b/doc/src/sgml/ref/pg_dumpall.sgml @@ -66,6 +66,16 @@ PostgreSQL documentation linkend="libpq-pgpass"/> for more information. + + + Restoring a dump causes the destination to execute arbitrary code of the + source superusers' choice. Partial dumps and partial restores do not limit + that. If the source superusers are not trusted, the dumped SQL statements + must be inspected before restoring. Note that the client running the dump + and restore need not trust the source or destination superusers. + + + @@ -555,6 +565,26 @@ exclude database PATTERN + + + + + Use the provided string as the psql + \restrict key in the dump output. If no restrict + key is specified, pg_dumpall will generate a + random one as needed. Keys may contain only alphanumeric characters. + + + This option is primarily intended for testing purposes and other + scenarios that require repeatable output (e.g., comparing dump files). + It is not recommended for general use, as a malicious server with + advance knowledge of the key may be able to inject arbitrary code that + will be executed on the machine that runs + psql with the dump output. + + + + diff --git a/doc/src/sgml/ref/pg_recvlogical.sgml b/doc/src/sgml/ref/pg_recvlogical.sgml index 95eb14b6352e2..d38dc0b286e1d 100644 --- a/doc/src/sgml/ref/pg_recvlogical.sgml +++ b/doc/src/sgml/ref/pg_recvlogical.sgml @@ -53,6 +53,16 @@ PostgreSQL documentation (ControlC) or SIGTERM signal. + + + When pg_recvlogical receives + a SIGHUP signal, it closes the current output file + and opens a new one using the filename specified by + the option. This allows us to rotate + the output file by first renaming the current file and then sending + a SIGHUP signal to + pg_recvlogical. + diff --git a/doc/src/sgml/ref/pg_restore.sgml b/doc/src/sgml/ref/pg_restore.sgml index 2e3ba80258177..8e221d89d283b 100644 --- a/doc/src/sgml/ref/pg_restore.sgml +++ b/doc/src/sgml/ref/pg_restore.sgml @@ -68,6 +68,18 @@ PostgreSQL documentation pg_restore will not be able to load the data using COPY statements. + + + + Restoring a dump causes the destination to execute arbitrary code of the + source superusers' choice. Partial dumps and partial restores do not limit + that. If the source superusers are not trusted, the dumped SQL statements + must be inspected before restoring. Non-plain-text dumps can be inspected + by using pg_restore's + option. Note that the client running the dump and restore need not trust + the source or destination superusers. + + @@ -198,7 +210,7 @@ PostgreSQL documentation 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 excluding objects in schemas, / for restoring named functions, / for restoring named indexes, / for restoring named tables @@ -755,6 +767,28 @@ PostgreSQL documentation + + + + + Use the provided string as the psql + \restrict key in the dump output. This can only be + specified for SQL script output, i.e., when the + option is used. If no restrict key is specified, + pg_restore will generate a random one as + needed. Keys may contain only alphanumeric characters. + + + This option is primarily intended for testing purposes and other + scenarios that require repeatable output (e.g., comparing dump files). + It is not recommended for general use, as a malicious server with + advance knowledge of the key may be able to inject arbitrary code that + will be executed on the machine that runs + psql with the dump output. + + + + diff --git a/doc/src/sgml/ref/pgupgrade.sgml b/doc/src/sgml/ref/pgupgrade.sgml index 9877f2f01c691..cdc37e91abe11 100644 --- a/doc/src/sgml/ref/pgupgrade.sgml +++ b/doc/src/sgml/ref/pgupgrade.sgml @@ -70,6 +70,14 @@ PostgreSQL documentation pg_upgrade supports upgrades from 9.2.X and later to the current major release of PostgreSQL, including snapshot and beta releases. + + + + Upgrading a cluster causes the destination to execute arbitrary code of the + source superusers' choice. Ensure that the source superusers are trusted + before upgrading. + + diff --git a/doc/src/sgml/ref/psql-ref.sgml b/doc/src/sgml/ref/psql-ref.sgml index 830306ea1e202..475b84ef54a66 100644 --- a/doc/src/sgml/ref/psql-ref.sgml +++ b/doc/src/sgml/ref/psql-ref.sgml @@ -3340,6 +3340,24 @@ lo_import 152801 + + \restrict restrict_key + + + Enter "restricted" mode with the provided key. In this mode, the only + allowed meta-command is \unrestrict, to exit + restricted mode. The key may contain only alphanumeric characters. + + + This command is primarily intended for use in plain-text dumps + generated by pg_dump, + pg_dumpall, and + pg_restore, but it may be useful elsewhere. + + + + + \s [ filename ] @@ -3514,6 +3532,24 @@ testdb=> \setenv LESS -imx4F + + \unrestrict restrict_key + + + Exit "restricted" mode (i.e., where all other meta-commands are + blocked), provided the specified key matches the one given to + \restrict when restricted mode was entered. + + + This command is primarily intended for use in plain-text dumps + generated by pg_dump, + pg_dumpall, and + pg_restore, but it may be useful elsewhere. + + + + + \unset name diff --git a/doc/src/sgml/ref/reindex.sgml b/doc/src/sgml/ref/reindex.sgml index 2942dccf1e2e1..748eec2e20d7e 100644 --- a/doc/src/sgml/ref/reindex.sgml +++ b/doc/src/sgml/ref/reindex.sgml @@ -464,14 +464,17 @@ Indexes: If the index marked INVALID is suffixed - ccnew, then it corresponds to the transient + _ccnew, then it corresponds to the transient index created during the concurrent operation, and the recommended recovery method is to drop it using DROP INDEX, then attempt REINDEX CONCURRENTLY again. - If the invalid index is instead suffixed ccold, + If the invalid index is instead suffixed _ccold, it corresponds to the original index which could not be dropped; the recommended recovery method is to just drop said index, since the rebuild proper has been successful. + A nonzero number may be appended to the suffix of the invalid index + names to keep them unique, like _ccnew1, + _ccold2, etc. diff --git a/doc/src/sgml/ref/reindexdb.sgml b/doc/src/sgml/ref/reindexdb.sgml index 98c3333228fb9..abcb041179bb9 100644 --- a/doc/src/sgml/ref/reindexdb.sgml +++ b/doc/src/sgml/ref/reindexdb.sgml @@ -352,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 diff --git a/doc/src/sgml/ref/security_label.sgml b/doc/src/sgml/ref/security_label.sgml index e5e5fb483e94e..aa45c0af2487b 100644 --- a/doc/src/sgml/ref/security_label.sgml +++ b/doc/src/sgml/ref/security_label.sgml @@ -84,6 +84,10 @@ SECURITY LABEL [ FOR provider ] ON based on object labels, rather than traditional discretionary access control (DAC) concepts such as users and groups. + + + You must own the database object to use SECURITY LABEL. + diff --git a/doc/src/sgml/ref/vacuumdb.sgml b/doc/src/sgml/ref/vacuumdb.sgml index 66fccb30a2d26..80c04919a4bf3 100644 --- a/doc/src/sgml/ref/vacuumdb.sgml +++ b/doc/src/sgml/ref/vacuumdb.sgml @@ -544,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 diff --git a/doc/src/sgml/release-17.sgml b/doc/src/sgml/release-17.sgml index 2f1bed2e290fe..b0014e782df0e 100644 --- a/doc/src/sgml/release-17.sgml +++ b/doc/src/sgml/release-17.sgml @@ -1,6 +1,3115 @@ + + Release 17.6 + + + Release date: + 2025-08-14 + + + + This release contains a variety of fixes from 17.5. + For information about new features in major release 17, see + . + + + + Migration to Version 17.6 + + + A dump/restore is not required for those running 17.X. + + + + However, if you have any + BRIN numeric_minmax_multi_ops indexes, it is + advisable to reindex them after updating. See the fourth changelog + entry below. + + + + Also, if you are upgrading from a version earlier than 17.5, + see . + + + + + Changes + + + + + + + Tighten security checks in planner estimation functions + (Dean Rasheed) + § + + + + The fix for CVE-2017-7484, plus followup fixes, intended to prevent + leaky functions from being applied to statistics data for columns + that the calling user does not have permission to read. Two gaps in + that protection have been found. One gap applies to partitioning + and inheritance hierarchies where RLS policies on the tables should + restrict access to statistics data, but did not. + + + + The other gap applies to cases where the query accesses a table via + a view, and the view owner has permissions to read the underlying + table but the calling user does not have permissions on the view. + The view owner's permissions satisfied the security checks, and the + leaky function would get applied to the underlying table's + statistics before we check the calling user's permissions on the + view. This has been fixed by making security checks on views occur + at the start of planning. That might cause permissions failures to + occur earlier than before. + + + + The PostgreSQL Project thanks + Dean Rasheed for reporting this problem. + (CVE-2025-8713) + + + + + + + Prevent pg_dump scripts from being used + to attack the user running the restore (Nathan Bossart) + § + + + + Since dump/restore operations typically involve running SQL commands + as superuser, the target database installation must trust the source + server. However, it does not follow that the operating system user + who executes psql to perform the restore + should have to trust the source server. The risk here is that an + attacker who has gained superuser-level control over the source + server might be able to cause it to emit text that would be + interpreted as psql meta-commands. + That would provide shell-level access to the restoring user's own + account, independently of access to the target database. + + + + To provide a positive guarantee that this can't happen, + extend psql with + a \restrict command that prevents execution of + further meta-commands, and teach pg_dump + to issue that before any data coming from the source server. + + + + The PostgreSQL Project thanks Martin Rakhmanov, Matthieu Denais, and + RyotaK for reporting this problem. + (CVE-2025-8714) + + + + + + + Convert newlines to spaces in names included in comments + in pg_dump output + (Noah Misch) + § + + + + Object names containing newlines offered the ability to inject + arbitrary SQL commands into the output script. (Without the + preceding fix, injection of psql + meta-commands would also be possible this way.) + CVE-2012-0868 fixed this class of problem at the time, but later + work reintroduced several cases. + + + + The PostgreSQL Project thanks + Noah Misch for reporting this problem. + (CVE-2025-8715) + + + + + + + Fix incorrect distance calculation in + BRIN numeric_minmax_multi_ops support function + (Peter Eisentraut, Tom Lane) + § + + + + The results were sometimes wrong on 64-bit platforms, and wildly + wrong on 32-bit platforms. This did not produce obvious failures + because the logic is only used to choose how to merge values into + ranges; at worst the index would become inefficient and bloated. + Nonetheless it's recommended to reindex any BRIN indexes that use + the numeric_minmax_multi_ops operator class. + + + + + + + Avoid regression in the size of XML input that we will accept + (Michael Paquier, Erik Wienhold) + § + § + + + + Our workaround for a bug in early 2.13.x releases + of libxml2 made use of a code path that + rejects text chunks exceeding 10MB, whereas the previous coding did + not. Those early releases are presumably extinct in the wild by + now, so revert to the previous coding. + + + + + + + Fix MERGE problems with concurrent updates + (Dean Rasheed) + § + + + + If a MERGE + inside a CTE attempts an update or delete on a table with + BEFORE ROW triggers, and a + concurrent UPDATE or DELETE + changes the target row, the MERGE command would + fail (crashing in the case of an update action, and potentially + executing the wrong action in the case of a delete action). + + + + + + + Fix MERGE into a plain-inheritance parent table + (Dean Rasheed) + § + + + + Insertions into such a target table could crash or produce incorrect + query results due to failing to handle WITH CHECK + OPTION and RETURNING actions. + + + + + + + Allow tables with statement-level triggers to become partitions or + inheritance children (Etsuro Fujita) + § + + + + We do not allow partitions or inheritance child tables to have + row-level triggers with transition tables, because an operation on + the whole inheritance tree would need to maintain a separate + transition table for each such child table. But that problem does + not apply for statement-level triggers, because only the parent's + statement-level triggers will be fired. The code that checks + whether an existing table can become a partition or inheritance + child nonetheless rejected both kinds of trigger. + + + + + + + Disallow collecting transition tuples from child foreign tables + (Etsuro Fujita) + § + + + + We do not support triggers with transition tables on foreign tables. + However, the case of a partition or inheritance child that is a + foreign table was overlooked. If the parent has such a trigger, + incorrect transition tuples were collected from the foreign child. + Instead throw an error, reporting that the case is not supported. + + + + + + + Allow resetting unknown custom parameters with reserved prefixes + (Nathan Bossart) + § + + + + Previously, if a parameter setting had been stored + using ALTER DATABASE/ROLE/SYSTEM, the stored + setting could not be removed if the parameter was unknown but had a + reserved prefix. This case could arise if an extension used to have + a parameter, but that parameter had been removed in an upgrade. + + + + + + + Fix a potential deadlock during ALTER SUBSCRIPTION ... DROP + PUBLICATION (Ajin Cherian) + § + + + + Ensure that server processes acquire catalog locks in a consistent + order during replication origin drops. + + + + + + + Shorten the race condition window for creating indexes with + conflicting names (Tom Lane) + § + + + + When choosing an auto-generated name for an index, avoid conflicting + with not-yet-committed pg_class rows as + well as fully-valid ones. This avoids possibly choosing the same + name as some concurrent CREATE INDEX did, + when that command is still in process of filling its index, or is + done but is part of a not-yet-committed transaction. There's still + a window for trouble, but it's only as long as the time needed to + validate a new index's parameters and insert + its pg_class row. + + + + + + + Prevent usage of incorrect VACUUM options in some + cases where multiple tables are vacuumed in a single command (Nathan + Bossart, Michael Paquier) + § + + + + The TRUNCATE and INDEX_CLEANUP + options of one table could be applied to others. + + + + + + + Ensure that the table's free-space map is updated in a timely way + when vacuuming a table that has no indexes (Masahiko Sawada) + § + + + + A previous optimization caused FSM vacuuming to sometimes be skipped + for such tables. + + + + + + + Fix processing of character classes within SIMILAR + TO regular expressions (Laurenz Albe) + § + § + + + + The code that translates SIMILAR TO pattern + matching expressions to POSIX-style regular expressions did not + consider that square brackets can be nested. For example, in a + pattern like [[:alpha:]%_], the code treated + the % and _ characters as + metacharacters when they should be literals. + + + + + + + When deparsing queries, always add parentheses around the expression + in FETCH FIRST expression ROWS + WITH TIES clauses (Heikki Linnakangas) + § + § + + + + This avoids some cases where the deparsed result wasn't + syntactically valid. + + + + + + + Limit the checkpointer process's fsync request queue size (Alexander + Korotkov, Xuneng Zhou) + § + § + + + + With very large shared_buffers settings, it was + possible for the checkpointer to attempt to allocate more than 1GB + for fsync requests, leading to failure and an infinite loop. Clamp + the queue size to prevent this scenario. + + + + + + + Avoid infinite wait in logical decoding when reading a + partially-written WAL record (Vignesh C) + § + + + + If the server crashes after writing the first part of a WAL record + that would span multiple pages, subsequent logical decoding of the + WAL stream would wait for data to arrive on the next WAL page. + That might never happen if the server is now idle. + + + + + + + Fix inconsistent spelling of LWLock names + for MultiXactOffsetSLRU + and MultiXactMemberSLRU (Bertrand Drouvot) + § + + + + This resulted in different wait-event names being displayed + in pg_wait_events + and pg_stat_activity, potentially breaking + monitoring queries that join those views. + + + + + + + Fix inconsistent quoting of role names in ACL strings (Tom Lane) + § + + + + The previous quoting rule was locale-sensitive, which could lead to + portability problems when transferring aclitem values + across installations. (pg_dump does not + do that, but other tools might.) To ensure consistency, always quote + non-ASCII characters in aclitem output; but to preserve + backward compatibility, never require that they be quoted + during aclitem input. + + + + + + + Reject equal signs (=) in the names of relation + options and foreign-data options (Tom Lane) + § + + + + There's no evident use-case for option names like this, and allowing + them creates ambiguity in the stored representation. + + + + + + + Fix potentially-incorrect decompression of LZ4-compressed archive + data (Mikhail Gribkov) + § + + + + This error seems to manifest only with not-very-compressible input + data, which may explain why it escaped detection. + + + + + + + Avoid a rare scenario where a btree index scan could mark the wrong + index entries as dead (Peter Geoghegan) + § + + + + + + + Avoid re-distributing cache invalidation messages from other + transactions during logical replication (vignesh C) + § + + + + Our previous round of minor releases included a bug fix to ensure + that replication receiver processes would respond to cross-process + cache invalidation messages, preventing them from using stale + catalog data while performing replication updates. However, the fix + unintentionally made them also redistribute those messages again, + leading to an exponential increase in the number of invalidation + messages, which would often end in a memory allocation failure. + Fix by not redistributing received messages. + + + + + + + Avoid unexpected server shutdown when replication slot + synchronization is misconfigured (Fujii Masao) + § + + + + The postmaster process would report an error (and then stop) + if sync_replication_slots was set + to true while wal_level was + less than logical. The desired behavior is just + that slot synchronization should be disabled, so reduce this error + message's level to avoid postmaster shutdown. + + + + + + + Avoid premature removal of old WAL during checkpoints (Vitaly Davydov) + § + + + + If a replication slot's restart point is advanced while a checkpoint + is in progress, no-longer-needed WAL segments could get removed too + soon, leading to recovery failure if the database crashes + immediately afterwards. Fix by keeping them for one additional + checkpoint cycle. + + + + + + + Never move a replication slot's confirmed-flush position backwards + (Shveta Malik) + § + + + + In some cases a replication client could acknowledge an LSN that's + past what it has stored persistently, and then perhaps send an older + LSN after a restart. We consider this not-a-bug so long as the + client did not have anything it needed to do for the WAL between the + two points. However, we should not re-send that WAL for fear of + data duplication, so make sure we always believe the latest + confirmed LSN for a given slot. + + + + + + + Prevent excessive delays before launching new logical replication + workers (Tom Lane) + § + + + + In some cases the logical replication launcher could sleep + considerably longer than the + configured wal_retrieve_retry_interval before + launching a new worker. + + + + + + + Fix use-after-free during logical replication of INSERT + ... ON CONFLICT (Ethan Mertz, Michael Paquier) + § + + + + This could result in incorrect progress reporting, or with very bad + luck it could result in a crash of the WAL sender process. + + + + + + + Allow waiting for a transaction on a standby server to be + interrupted (Kevin K Biju) + § + + + + Creation of a replication slot on a standby server may require waiting + for some active transaction(s) to finish on the primary and then be + replayed on the standby. Since that could be an indefinite wait, + it's desirable to allow the operation to be cancelled, but there was + no check for query cancel in the loop. + + + + + + + Do not let cascading logical WAL senders try to send data that's + beyond what has been replayed on their standby server (Alexey + Makhmutov) + § + + + + This avoids a situation where such WAL senders could get stuck at + standby server shutdown, waiting for replay work that will not + happen because the server's startup process is already shut down. + + + + + + + Fix per-relation memory leakage in autovacuum (Tom Lane) + § + + + + + + + Fix session-lifespan memory leaks + in XMLSERIALIZE(... INDENT) + (Dmitry Kovalenko, Tom Lane) + § + § + + + + + + + Fix possible crash after out-of-memory when allocating large chunks + with the bump allocator (Tom Lane) + § + + + + + + + Fix some places that might try to fetch toasted fields of system + catalogs without any snapshot (Nathan Bossart) + § + + + + This could result in an assertion failure or cannot fetch + toast data without an active snapshot error. + + + + + + + Avoid assertion failure during cross-table constraint updates + (Tom Lane, Jian He) + § + § + + + + + + + Remove faulty assertion that a command tag must have been determined + by the end of PortalRunMulti() (Álvaro Herrera) + § + + + + This failed in edge cases such as an empty prepared statement. + + + + + + + Fix assertion failure in XMLTABLE parsing + (Richard Guo) + § + + + + + + + Restore the ability to run PL/pgSQL expressions in parallel + (Dipesh Dhameliya) + § + + + + PL/pgSQL's notion of an expression is very broad, + encompassing any SQL SELECT query that returns a + single column and no more than one row. So there are cases, for + example evaluation of an aggregate function, where the query + involves significant work and it'd be useful to run it with parallel + workers. This used to be possible, but a previous bug fix + unintentionally disabled it. + + + + + + + Fix edge-case resource leaks in PL/Python error reporting (Tom Lane) + § + § + + + + An out-of-memory failure while reporting an error from Python could + result in failure to drop reference counts on Python objects, + leading to session-lifespan memory leakage. + + + + + + + Fix libpq's + PQcancelCreate() function for the case where + the server's address was specified using hostaddr + (Sergei Kornilov) + § + + + + libpq would crash if the resulting cancel + object was actually used. + + + + + + + Fix libpq's PQport() + function to never return NULL unless the passed connection is NULL + (Daniele Varrazzo) + § + + + + This is the documented behavior, but + recent libpq versions would return NULL + in some cases where the user had not provided a port specification. + Revert to our historical behavior of returning an empty string in + such cases. (v18 and later will return the compiled-in default port + number, typically "5432", instead.) + + + + + + + Avoid failure when GSSAPI authentication requires packets larger + than 16kB (Jacob Champion, Tom Lane) + § + + + + Larger authentication packets are needed for Active Directory users + who belong to many AD groups. This limitation manifested in + connection failures with unintelligible error messages, + typically GSSAPI context establishment error: The routine + must be called again to complete its function: Unknown + error. + + + + + + + Fix timing-dependent failures in SSL and GSSAPI data transmission + (Tom Lane) + § + + + + When using SSL or GSSAPI encryption in non-blocking + mode, libpq sometimes failed + with SSL error: bad length or GSSAPI caller + failed to retransmit all data needing to be retried. + + + + + + + Avoid null-pointer dereference during connection lookup + in ecpg applications (Aleksander + Alekseev) + § + + + + The case could occur only if the application has some connections + that are named and some that are not. + + + + + + + Improve psql's tab completion + for COPY and \copy options + (Atsushi Torikoshi) + § + + + + The same completions were offered for both COPY + FROM and COPY TO, although some options + are only valid for one case or the other. Distinguish these cases + to provide more accurate suggestions. + + + + + + + Avoid assertion failure in pgbench when + multiple pipeline sync messages are received (Fujii Masao) + § + + + + + + + Fix duplicate transaction replay when initializing a subscription + with pg_createsubscriber (Shlok Kyal) + § + + + + It was possible for the last transaction processed during subscriber + recovery to be sent again once normal replication begins. + + + + + + + Ensure that pg_dump dumps comments on + not-null constraints on domain types (Jian He, Álvaro Herrera) + § + + + + + + + Ensure that pg_dump dumps comments on + domain constraints in a valid order (Jian He) + § + + + + In some cases the comment command could appear before creation of + the constraint. + + + + + + + Ensure stable sort ordering in pg_dump + for all types of database objects (Noah Misch, Andreas Karlsson) + § + § + § + + + + pg_dump sorts objects by their logical + names before performing dependency-driven reordering. This sort did + not account for the full unique key identifying certain object types + such as rules and constraints, and thus it could produce dissimilar + sort orders for logically-identical databases. That made it + difficult to compare databases by + diff'ing pg_dump output, so improve the + logic to ensure stable sort ordering in all cases. + + + + + + + Fix incorrect parsing of object types + in pg_dump filter files (Fujii Masao) + § + + + + Treat keywords as extending to the next whitespace, rather than + stopping at the first non-alphanumeric character as before. + This makes no difference for valid keywords, but it allows some + error cases to be recognized properly. For + example, table-data will now be rejected, whereas + previously it was misinterpreted as table. + + + + + + + pg_restore failed to restore large + objects (BLOBs) from directory-format dumps made + by pg_dump versions + before PostgreSQL v12 (Pavel Stehule) + § + + + + + + + In pg_upgrade, check for inconsistent + inherited not-null constraints (Ali Akbar) + § + § + § + + + + PostgreSQL versions before 18 allow an + inherited column not-null constraint to be dropped. However, this + results in a schema that cannot be restored, leading to failure + in pg_upgrade. Detect such cases + during pg_upgrade's preflight checks to + allow users to fix them before initiating the upgrade. + + + + + + + Don't require that the target installation + have max_slot_wal_keep_size set to its default + during pg_upgrade (Dilip Kumar) + § + + + + + + + Avoid assertion failure if track_commit_timestamp + is enabled during initdb (Hayato Kuroda, + Andy Fan) + § + + + + + + + Fix pg_waldump to show information about + dropped statistics in PREPARE TRANSACTION WAL + records (Daniil Davydov) + § + + + + + + + Avoid possible leak of the open connection + during contrib/dblink connection establishment + (Tom Lane) + § + + + + In the rare scenario where we hit out-of-memory while inserting the + new connection object into dblink's hashtable, the open connection + would be leaked until end of session, leaving an idle session + sitting on the remote server. + + + + + + + Make contrib/pg_prewarm cope with very + large shared_buffers settings (Daria Shanina) + § + + + + Autoprewarm failed with a memory allocation error + if shared_buffers was larger than about 50 + million buffers (400GB). + + + + + + + Prevent assertion failure + in contrib/pg_prewarm (Masahiro Ikeda) + § + + + + Applying pg_prewarm() 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/pg_stat_statements, avoid leaving + gaps in the set of parameter numbers used in a normalized query + (Sami Imseih) + § + + + + + + + Fix memory leakage in contrib/postgres_fdw's + DirectModify methods (Tom Lane) + § + + + + The PGresult holding the results of the + remote modify command would be leaked for the rest of the session if + the query fails between invocations of the DirectModify methods, + which could happen when there's RETURNING data to + process. + + + + + + + Ensure that directories listed + in configure's + + and options are searched before + system-supplied directories (Tom Lane) + § + + + + A common reason for using these options is to allow a user-built + version of some library to override the system-supplied version. + However, that failed to work in some environments because of + careless ordering of switches in the commands issued by the makefiles. + + + + + + + Fix configure's checks + for __cpuid() + and __cpuidex() (Lukas Fittl, Michael Paquier) + § + + + + configure failed to detect these + Windows-specific functions, so that they would not be used, + leading to slower-than-necessary CRC computations since the + availability of hardware instructions could not be verified. + The practical impact of this error was limited, because production + builds for Windows typically do not use the Autoconf toolchain. + + + + + + + Fix build failure with option on + Solaris-based platforms (Tom Lane) + § + + + + Solaris is inconsistent with other Unix platforms about the API for + PAM authentication. This manifested as an inconsistent + pointer compiler warning, which we never did anything about. + But as of GCC 14 it's an error not warning by default, so fix it. + + + + + + + Make our code portable to GNU Hurd (Michael Banck, Christoph Berg, + Samuel Thibault) + § + § + + + + Fix assumptions about IOV_MAX + and O_RDONLY that don't hold on Hurd. + + + + + + + Make our usage of memset_s() conform strictly + to the C11 standard (Tom Lane) + § + + + + This avoids compile failures on some platforms. + + + + + + + Silence compatibility warning when using Meson to build with MSVC + (Peter Eisentraut) + § + + + + + + + Prevent uninitialized-value compiler warnings in JSONB comparison + code (Tom Lane) + § + + + + + + + Avoid deprecation warnings when building + with libxml2 2.14 and later + (Michael Paquier) + § + + + + + + + Avoid problems when compiling pg_locale.h under + C++ (John Naylor) + § + + + + PostgreSQL header files generally need to + be wrapped in extern "C" { ... } in order to be + included in extensions written in C++. This failed + for pg_locale.h because of its use + of libicu headers, but we can work around + that by suppressing C++-only declarations in those headers. C++ + extensions that want to use libicu's C++ + APIs can do so by including the libicu + headers ahead of pg_locale.h. + + + + + + + + + + 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 @@ -2258,10 +5367,14 @@ 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 + ((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)); + WHERE partrelid = i.inhparent)) + + CASE WHEN pg_catalog.pg_partition_root(conrelid) = confrelid THEN + (SELECT count(*) FROM pg_catalog.pg_partition_tree(confrelid) + WHERE level = 1) + ELSE 0 END); Since it is possible that one or more of the ADD CONSTRAINT steps will fail, you should save the query's diff --git a/doc/src/sgml/runtime.sgml b/doc/src/sgml/runtime.sgml index 893b30eb31a94..25ee5be5b1b64 100644 --- a/doc/src/sgml/runtime.sgml +++ b/doc/src/sgml/runtime.sgml @@ -1986,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/system-views.sgml b/doc/src/sgml/system-views.sgml index a852bdb99a31f..560e95caec4c9 100644 --- a/doc/src/sgml/system-views.sgml +++ b/doc/src/sgml/system-views.sgml @@ -2482,21 +2482,18 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx unreserved means that the slot no longer retains the required WAL files and some of them are to be removed at - the next checkpoint. This state can return + the next checkpoint. This typically occurs when + is set to + a non-negative value. This state can return to reserved or extended. - lost means that some required WAL files have - been removed and this slot is no longer usable. + lost means that this slot is no longer usable. - The last two states are seen only when - is - non-negative. If restart_lsn is NULL, this - field is null. @@ -3578,7 +3575,7 @@ SELECT * FROM pg_locks pl LEFT JOIN pg_prepared_xacts ppx passwd text - Password (possibly encrypted); null if none. See + Encrypted password; null if none. See pg_authid for details of how encrypted passwords are stored. diff --git a/doc/src/sgml/textsearch.sgml b/doc/src/sgml/textsearch.sgml index bde5f391e5c06..bf91c23bd11ee 100644 --- a/doc/src/sgml/textsearch.sgml +++ b/doc/src/sgml/textsearch.sgml @@ -1342,7 +1342,7 @@ ts_headline( config <b> and </b>, which can be suitable - for HTML output. + for HTML output (but see the warning below). @@ -1354,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. @@ -2225,6 +2240,18 @@ LIMIT 10; 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/wal.sgml b/doc/src/sgml/wal.sgml index e7f409ddd6430..dc3c061256d4a 100644 --- a/doc/src/sgml/wal.sgml +++ b/doc/src/sgml/wal.sgml @@ -246,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 diff --git a/doc/src/sgml/xfunc.sgml b/doc/src/sgml/xfunc.sgml index f3a3e4e2f8f60..a8aa871918a72 100644 --- a/doc/src/sgml/xfunc.sgml +++ b/doc/src/sgml/xfunc.sgml @@ -3615,7 +3615,8 @@ INJECTION_POINT(name); 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. + their own code using the same macro. The injection point names should + use lower-case characters, with terms separated by dashes. diff --git a/meson.build b/meson.build index 0e26f322d958d..0540cfa58e279 100644 --- a/meson.build +++ b/meson.build @@ -8,7 +8,7 @@ project('postgresql', ['c'], - version: '17.4', + version: '17.6', license: 'PostgreSQL', # We want < 0.56 for python 3.5 compatibility on old platforms. EPEL for @@ -1059,7 +1059,7 @@ if not perlopt.disabled() if cc.get_id() == 'msvc' # prevent binary mismatch between MSVC built plperl and Strawberry or # msys ucrt perl libraries - perl_v = run_command(perl, '-V').stdout() + perl_v = run_command(perl, '-V', check: false).stdout() if not perl_v.contains('USE_THREAD_SAFE_LOCALE') perl_ccflags += ['-DNO_THREAD_SAFE_LOCALE'] endif @@ -1897,10 +1897,7 @@ if cc.links(''' cdata.set('HAVE__BUILTIN_OP_OVERFLOW', 1) endif - -# XXX: The configure.ac check for __cpuid() is broken, we don't copy that -# here. To prevent problems due to two detection methods working, stop -# checking after one. +# Check for __get_cpuid() and __cpuid(). if cc.links(''' #include int main(int arg, char **argv) @@ -2478,6 +2475,8 @@ decl_checks = [ decl_checks += [ ['preadv', 'sys/uio.h'], ['pwritev', 'sys/uio.h'], + ['strchrnul', 'string.h'], + ['memset_s', 'string.h', '#define __STDC_WANT_LIB_EXT1__ 1'], ] # Check presence of some optional LLVM functions. @@ -2491,11 +2490,28 @@ endif foreach c : decl_checks func = c.get(0) header = c.get(1) - args = c.get(2, {}) + prologue = c.get(2, '') + args = c.get(3, {}) 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(''' +@0@ +#include <@1@> + +int main() +{ +#ifndef @2@ + (void) @2@; +#endif + +return 0; +} +'''.format(prologue, 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 @@ -2719,7 +2735,6 @@ func_checks = [ ['inet_pton'], ['kqueue'], ['mbstowcs_l'], - ['memset_s'], ['mkdtemp'], ['posix_fadvise'], ['posix_fallocate'], @@ -2733,7 +2748,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'], @@ -3386,6 +3400,8 @@ 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. @@ -3428,6 +3444,48 @@ sys.exit(sp.returncode) env: test_env, suite: ['setup']) +test_tde_template_dir = test_install_destdir / 'pg_tde_template' +test_env.set('TDE_TEMPLATE_DIR', test_tde_template_dir) + +test('init_tde_files', + find_program('sh', required: true, native: true), + args: [ + '-c', ''' +set -e + +if [ -z "$TDE_MODE" ]; then + exit; +fi + +set -e + +PATH="$1":$PATH +TMP_DATA_DIR=$(mktemp -d) + +rm -rf "$2" +mkdir "$2" + +pg_ctl -D "$TMP_DATA_DIR" init -o '--set shared_preload_libraries=pg_tde' + +postgres --single -F -j -D "$TMP_DATA_DIR" postgres << SQL + CREATE EXTENSION pg_tde; + SELECT pg_tde_add_global_key_provider_file('global_test_provider', '$2/pg_tde_test_keys'); + SELECT pg_tde_create_key_using_global_key_provider('test_default_key', 'global_test_provider'); + SELECT pg_tde_set_default_key_using_global_key_provider('test_default_key', 'global_test_provider'); +SQL + +cp -RPp "$TMP_DATA_DIR/pg_tde" "$2/pg_tde" +rm -rf "$TMP_DATA_DIR" +''', + 'init_tde_files', + temp_install_bindir, + test_tde_template_dir + ], + priority: setup_tests_priority - 2, + timeout: 300, + is_parallel: false, + env: test_env, + suite: ['setup']) ############################################################### diff --git a/src/Makefile.global.in b/src/Makefile.global.in index ca305b5664d65..e14466ae57f46 100644 --- a/src/Makefile.global.in +++ b/src/Makefile.global.in @@ -241,7 +241,7 @@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ PG_SYSROOT = @PG_SYSROOT@ -override CPPFLAGS := $(ICU_CFLAGS) $(CPPFLAGS) +override CPPFLAGS += $(ICU_CFLAGS) ifdef PGXS override CPPFLAGS := -I$(includedir_server) -I$(includedir_internal) $(CPPFLAGS) diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c index 92cb72ebba6ed..6cbd31f0a3d8b 100644 --- a/src/backend/access/brin/brin.c +++ b/src/backend/access/brin/brin.c @@ -505,16 +505,18 @@ brininsertcleanup(Relation index, IndexInfo *indexInfo) BrinInsertState *bistate = (BrinInsertState *) indexInfo->ii_AmCache; /* bail out if cache not initialized */ - if (indexInfo->ii_AmCache == NULL) + 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); - bistate->bis_rmAccess = NULL; - bistate->bis_desc = NULL; + pfree(bistate); } /* diff --git a/src/backend/access/brin/brin_bloom.c b/src/backend/access/brin/brin_bloom.c index f94e2b0bfbd95..354cc545843a9 100644 --- a/src/backend/access/brin/brin_bloom.c +++ b/src/backend/access/brin/brin_bloom.c @@ -439,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, @@ -694,6 +693,17 @@ brin_bloom_union(PG_FUNCTION_ARGS) /* 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(); } @@ -715,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]; diff --git a/src/backend/access/brin/brin_inclusion.c b/src/backend/access/brin/brin_inclusion.c index 750276998c5a1..c09dad28ef985 100644 --- a/src/backend/access/brin/brin_inclusion.c +++ b/src/backend/access/brin/brin_inclusion.c @@ -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_multi.c b/src/backend/access/brin/brin_minmax_multi.c index e5d95de5d84a7..b88e9b2d7cc93 100644 --- a/src/backend/access/brin/brin_minmax_multi.c +++ b/src/backend/access/brin/brin_minmax_multi.c @@ -111,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; @@ -2033,7 +2032,7 @@ brin_minmax_multi_distance_numeric(PG_FUNCTION_ARGS) d = DirectFunctionCall2(numeric_sub, a2, a1); /* a2 - a1 */ - PG_RETURN_FLOAT8(DirectFunctionCall1(numeric_float8, d)); + PG_RETURN_DATUM(DirectFunctionCall1(numeric_float8, d)); } /* @@ -2872,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]; diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index d6eb5d8559939..c6a2d13be8d3f 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -1232,8 +1232,9 @@ transformRelOptions(Datum oldOptions, List *defList, const char *namspace, } else { - text *t; + const char *name; const char *value; + text *t; Size len; /* @@ -1280,11 +1281,19 @@ transformRelOptions(Datum oldOptions, List *defList, const char *namspace, * have just "name", assume "name=true" is meant. Note: the * namespace is not output. */ + name = def->defname; if (def->arg != NULL) value = defGetString(def); else value = "true"; + /* Insist that name not contain "=", else "a=b=c" is ambiguous */ + if (strchr(name, '=') != NULL) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid option name \"%s\": must not contain \"=\"", + name))); + /* * This is not a great place for this test, but there's no other * convenient place to filter the option out. As WITH (oids = @@ -1292,7 +1301,7 @@ transformRelOptions(Datum oldOptions, List *defList, const char *namspace, * amount of ugly. */ if (acceptOidsOff && def->defnamespace == NULL && - strcmp(def->defname, "oids") == 0) + strcmp(name, "oids") == 0) { if (defGetBoolean(def)) ereport(ERROR, @@ -1302,11 +1311,11 @@ transformRelOptions(Datum oldOptions, List *defList, const char *namspace, continue; } - len = VARHDRSZ + strlen(def->defname) + 1 + strlen(value); + len = VARHDRSZ + strlen(name) + 1 + strlen(value); /* +1 leaves room for sprintf's trailing null */ t = (text *) palloc(len + 1); SET_VARSIZE(t, len); - sprintf(VARDATA(t), "%s=%s", def->defname, value); + sprintf(VARDATA(t), "%s=%s", name, value); astate = accumArrayResult(astate, PointerGetDatum(t), false, TEXTOID, diff --git a/src/backend/access/gin/ginget.c b/src/backend/access/gin/ginget.c index 0b4f2ebadb6c8..17601bb56b270 100644 --- a/src/backend/access/gin/ginget.c +++ b/src/backend/access/gin/ginget.c @@ -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. */ diff --git a/src/backend/access/gin/ginlogic.c b/src/backend/access/gin/ginlogic.c index 28caf91f85736..aab0ebd566b33 100644 --- a/src/backend/access/gin/ginlogic.c +++ b/src/backend/access/gin/ginlogic.c @@ -140,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) @@ -149,7 +151,7 @@ shimTriConsistentFn(GinScanKey key) int maybeEntries[MAX_MAYBE_ENTRIES]; int i; bool boolResult; - bool recheck = false; + bool recheck; GinTernaryValue curResult; /* @@ -169,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); @@ -179,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 (;;) { @@ -200,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/ginscan.c b/src/backend/access/gin/ginscan.c index af24d38544eb9..d832f2707fb79 100644 --- a/src/backend/access/gin/ginscan.c +++ b/src/backend/access/gin/ginscan.c @@ -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++) { diff --git a/src/backend/access/gist/gist.c b/src/backend/access/gist/gist.c index ed4ffa63a7720..e49abbcb18afa 100644 --- a/src/backend/access/gist/gist.c +++ b/src/backend/access/gist/gist.c @@ -1043,12 +1043,19 @@ gistFindCorrectParent(Relation r, GISTInsertStack *child, bool is_build) /* * 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. + * 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); + 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 diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 95e3be524a7f8..cce38f482bd69 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -53,6 +53,7 @@ #include "catalog/catalog.h" #include "catalog/pg_database.h" #include "catalog/pg_database_d.h" +#include "catalog/pg_replication_origin.h" #include "commands/vacuum.h" #include "miscadmin.h" #include "pgstat.h" @@ -230,6 +231,38 @@ static const int MultiXactStatusLock[MaxMultiXactStatus + 1] = #define TUPLOCK_from_mxstatus(status) \ (MultiXactStatusLock[(status)]) +/* + * Check that we have a valid snapshot if we might need TOAST access. + */ +static inline void +AssertHasSnapshotForToast(Relation rel) +{ +#ifdef USE_ASSERT_CHECKING + + /* bootstrap mode in particular breaks this rule */ + if (!IsNormalProcessingMode()) + return; + + /* if the relation doesn't have a TOAST table, we are good */ + if (!OidIsValid(rel->rd_rel->reltoastrelid)) + return; + + /* + * Commit 16bf24e fixed accesses to pg_replication_origin without a + * an active snapshot by removing its TOAST table. On older branches, + * these bugs are left in place. Its only varlena column is roname (the + * replication origin name), so this is only a problem if the name + * requires out-of-line storage, which seems unlikely. In any case, + * fixing it doesn't seem worth extra code churn on the back-branches. + */ + if (RelationGetRelid(rel) == ReplicationOriginRelationId) + return; + + Assert(HaveRegisteredOrActiveSnapshot()); + +#endif /* USE_ASSERT_CHECKING */ +} + /* ---------------------------------------------------------------- * heap support routines * ---------------------------------------------------------------- @@ -2015,6 +2048,8 @@ heap_insert(Relation relation, HeapTuple tup, CommandId cid, Assert(HeapTupleHeaderGetNatts(tup->t_data) <= RelationGetNumberOfAttributes(relation)); + AssertHasSnapshotForToast(relation); + /* * Fill in tuple header fields and toast the tuple if necessary. * @@ -2292,6 +2327,8 @@ heap_multi_insert(Relation relation, TupleTableSlot **slots, int ntuples, /* currently not needed (thus unsupported) for heap_multi_insert() */ Assert(!(options & HEAP_INSERT_NO_LOGICAL)); + AssertHasSnapshotForToast(relation); + needwal = RelationNeedsWAL(relation); saveFreeSpace = RelationGetTargetPageFreeSpace(relation, HEAP_DEFAULT_FILLFACTOR); @@ -2714,6 +2751,8 @@ heap_delete(Relation relation, ItemPointer tid, Assert(ItemPointerIsValid(tid)); + AssertHasSnapshotForToast(relation); + /* * Forbid this during a parallel operation, lest it allocate a combo CID. * Other workers might need that combo CID for visibility checks, and we @@ -3209,6 +3248,8 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup, Assert(HeapTupleHeaderGetNatts(newtup->t_data) <= RelationGetNumberOfAttributes(relation)); + AssertHasSnapshotForToast(relation); + /* * Forbid this during a parallel operation, lest it allocate a combo CID. * Other workers might need that combo CID for visibility checks, and we @@ -9572,6 +9613,9 @@ heap_xlog_insert(XLogReaderState *record) ItemPointerSetBlockNumber(&target_tid, blkno); ItemPointerSetOffsetNumber(&target_tid, xlrec->offnum); + /* No freezing in the heap_insert() code path */ + Assert(!(xlrec->flags & XLH_INSERT_ALL_FROZEN_SET)); + /* * The visibility map may need to be fixed even if the heap page is * already up-to-date. @@ -9642,10 +9686,6 @@ heap_xlog_insert(XLogReaderState *record) if (xlrec->flags & XLH_INSERT_ALL_VISIBLE_CLEARED) PageClearAllVisible(page); - /* XLH_INSERT_ALL_FROZEN_SET implies that all tuples are visible */ - if (xlrec->flags & XLH_INSERT_ALL_FROZEN_SET) - PageSetAllVisible(page); - MarkBufferDirty(buffer); } if (BufferIsValid(buffer)) diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index f2d25987120bf..ef03d1acc545b 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -235,7 +235,7 @@ 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, +static int lazy_scan_prune(LVRelState *vacrel, Buffer buf, BlockNumber blkno, Page page, Buffer vmbuffer, bool all_visible_according_to_vm, bool *has_lpdead_items); @@ -844,6 +844,7 @@ lazy_scan_heap(LVRelState *vacrel) { Buffer buf; Page page; + int ndeleted = 0; bool has_lpdead_items; bool got_cleanup_lock = false; @@ -872,9 +873,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. */ - if (TidStoreMemoryUsage(vacrel->dead_items) > vacrel->dead_items_info->max_bytes) + 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 @@ -970,9 +974,9 @@ lazy_scan_heap(LVRelState *vacrel) * line pointers previously marked LP_DEAD. */ if (got_cleanup_lock) - lazy_scan_prune(vacrel, buf, blkno, page, - vmbuffer, all_visible_according_to_vm, - &has_lpdead_items); + ndeleted = lazy_scan_prune(vacrel, buf, blkno, page, + vmbuffer, all_visible_according_to_vm, + &has_lpdead_items); /* * Now drop the buffer lock and, potentially, update the FSM. @@ -1008,7 +1012,7 @@ lazy_scan_heap(LVRelState *vacrel) * table has indexes. There will only be newly-freed space if we * held the cleanup lock and lazy_scan_prune() was called. */ - if (got_cleanup_lock && vacrel->nindexes == 0 && has_lpdead_items && + if (got_cleanup_lock && vacrel->nindexes == 0 && ndeleted > 0 && blkno - next_fsm_block_to_vacuum >= VACUUM_FSM_EVERY_PAGES) { FreeSpaceMapVacuumRange(vacrel->rel, next_fsm_block_to_vacuum, @@ -1399,8 +1403,10 @@ cmpOffsetNumbers(const void *a, const void *b) * * *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. + * + * Returns the number of tuples deleted from the page during HOT pruning. */ -static void +static int lazy_scan_prune(LVRelState *vacrel, Buffer buf, BlockNumber blkno, @@ -1620,6 +1626,8 @@ lazy_scan_prune(LVRelState *vacrel, VISIBILITYMAP_ALL_VISIBLE | VISIBILITYMAP_ALL_FROZEN); } + + return presult.ndeleted; } /* diff --git a/src/backend/access/nbtree/nbtutils.c b/src/backend/access/nbtree/nbtutils.c index 878f4b2e7b843..a448a5470822d 100644 --- a/src/backend/access/nbtree/nbtutils.c +++ b/src/backend/access/nbtree/nbtutils.c @@ -4144,9 +4144,9 @@ _bt_checkkeys_look_ahead(IndexScanDesc scan, BTReadPageState *pstate, * current page and killed tuples thereon (generally, this should only be * called if so->numKilled > 0). * - * The caller does not have a lock on the page and may or may not have the - * page pinned in a buffer. Note that read-lock is sufficient for setting - * LP_DEAD status (which is only a hint). + * Caller should not have a lock on the so->currPos page, but may hold a + * buffer pin. When we return, it still won't be locked. It'll continue to + * hold whatever pins were held before calling here. * * We match items by heap TID before assuming they are the right ones to * delete. We cope with cases where items have moved right due to insertions. @@ -4178,7 +4178,8 @@ _bt_killitems(IndexScanDesc scan) int i; int numKilled = so->numKilled; bool killedsomething = false; - bool droppedpin PG_USED_FOR_ASSERTS_ONLY; + bool droppedpin; + Buffer buf; Assert(BTScanPosIsValid(so->currPos)); @@ -4197,29 +4198,31 @@ _bt_killitems(IndexScanDesc scan) * LSN. */ droppedpin = false; - _bt_lockbuf(scan->indexRelation, so->currPos.buf, BT_READ); - - page = BufferGetPage(so->currPos.buf); + buf = so->currPos.buf; + _bt_lockbuf(scan->indexRelation, buf, BT_READ); } else { - Buffer buf; + XLogRecPtr latestlsn; droppedpin = true; /* Attempt to re-read the buffer, getting pin and lock. */ buf = _bt_getbuf(scan->indexRelation, so->currPos.currPage, BT_READ); - page = BufferGetPage(buf); - if (BufferGetLSNAtomic(buf) == so->currPos.lsn) - so->currPos.buf = buf; - else + latestlsn = BufferGetLSNAtomic(buf); + Assert(!XLogRecPtrIsInvalid(so->currPos.lsn)); + Assert(so->currPos.lsn <= latestlsn); + if (so->currPos.lsn != latestlsn) { /* Modified while not pinned means hinting is not safe. */ _bt_relbuf(scan->indexRelation, buf); return; } + + /* Unmodified, hinting is safe */ } + page = BufferGetPage(buf); opaque = BTPageGetOpaque(page); minoff = P_FIRSTDATAKEY(opaque); maxoff = PageGetMaxOffsetNumber(page); @@ -4336,10 +4339,13 @@ _bt_killitems(IndexScanDesc scan) if (killedsomething) { opaque->btpo_flags |= BTP_HAS_GARBAGE; - MarkBufferDirtyHint(so->currPos.buf, true); + MarkBufferDirtyHint(buf, true); } - _bt_unlockbuf(scan->indexRelation, so->currPos.buf); + if (!droppedpin) + _bt_unlockbuf(scan->indexRelation, buf); + else + _bt_relbuf(scan->indexRelation, buf); } diff --git a/src/backend/access/rmgrdesc/xactdesc.c b/src/backend/access/rmgrdesc/xactdesc.c index dccca201e05c0..2836112282e4d 100644 --- a/src/backend/access/rmgrdesc/xactdesc.c +++ b/src/backend/access/rmgrdesc/xactdesc.c @@ -252,6 +252,8 @@ ParsePrepareRecord(uint8 info, xl_xact_prepare *xlrec, xl_xact_parsed_prepare *p parsed->nsubxacts = xlrec->nsubxacts; parsed->nrels = xlrec->ncommitrels; parsed->nabortrels = xlrec->nabortrels; + parsed->nstats = xlrec->ncommitstats; + parsed->nabortstats = xlrec->nabortstats; parsed->nmsgs = xlrec->ninvalmsgs; strncpy(parsed->twophase_gid, bufptr, xlrec->gidlen); diff --git a/src/backend/access/table/tableam.c b/src/backend/access/table/tableam.c index 9e0fae5194afd..01e96ea8a1d88 100644 --- a/src/backend/access/table/tableam.c +++ b/src/backend/access/table/tableam.c @@ -25,6 +25,7 @@ #include "access/tableam.h" #include "access/xact.h" #include "commands/defrem.h" +#include "optimizer/optimizer.h" #include "optimizer/plancat.h" #include "port/pg_bitutils.h" #include "storage/bufmgr.h" @@ -741,6 +742,8 @@ table_block_relation_estimate_size(Relation rel, int32 *attr_widths, tuple_width += overhead_bytes_per_tuple; /* note: integer division is intentional here */ 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/transam/commit_ts.c b/src/backend/access/transam/commit_ts.c index 77e1899d7ad21..86a295ca9b195 100644 --- a/src/backend/access/transam/commit_ts.c +++ b/src/backend/access/transam/commit_ts.c @@ -707,6 +707,13 @@ ActivateCommitTs(void) TransactionId xid; int64 pageno; + /* + * During bootstrap, we should not register commit timestamps so skip the + * activation in this case. + */ + if (IsBootstrapProcessingMode()) + return; + /* If we've done this already, there's nothing to do */ LWLockAcquire(CommitTsLock, LW_EXCLUSIVE); if (commitTsShared->commitTsActive) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 631deea344da7..f45a43acb54af 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -670,7 +670,8 @@ static XLogRecPtr CreateOverwriteContrecordRecord(XLogRecPtr aborted_lsn, XLogRecPtr pagePtr, TimeLineID newTLI); static void CheckPointGuts(XLogRecPtr checkPointRedo, int flags); -static void KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo); +static void KeepLogSeg(XLogRecPtr recptr, XLogRecPtr slotsMinLSN, + XLogSegNo *logSegNo); static XLogRecPtr XLogGetReplicationSlotMinimumLSN(void); static void AdvanceXLInsertBuffer(XLogRecPtr upto, TimeLineID tli, @@ -2217,25 +2218,6 @@ check_wal_segment_size(int *newval, void **extra, GucSource source) 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. @@ -2446,7 +2428,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) INSTR_TIME_SET_ZERO(start); pgstat_report_wait_start(WAIT_EVENT_WAL_WRITE); - written = xlog_smgr->seg_write(openLogFile, from, nleft, startoffset, tli, openLogSegNo); + written = xlog_smgr->seg_write(openLogFile, from, nleft, startoffset, tli, openLogSegNo, wal_segment_size); pgstat_report_wait_end(); /* @@ -3423,6 +3405,7 @@ XLogFileCopy(TimeLineID destTLI, XLogSegNo destsegno, int srcfd; int fd; int nbytes; + off_t offset = 0; /* * Open the source file @@ -3471,7 +3454,8 @@ XLogFileCopy(TimeLineID destTLI, XLogSegNo destsegno, if (nread > sizeof(buffer)) nread = sizeof(buffer); pgstat_report_wait_start(WAIT_EVENT_WAL_COPY_READ); - r = read(srcfd, buffer.data, nread); + r = xlog_smgr->seg_read(srcfd, buffer.data, nread, offset, + srcTLI, srcsegno, wal_segment_size); if (r != nread) { if (r < 0) @@ -3489,7 +3473,7 @@ XLogFileCopy(TimeLineID destTLI, XLogSegNo destsegno, } errno = 0; pgstat_report_wait_start(WAIT_EVENT_WAL_COPY_WRITE); - if ((int) write(fd, buffer.data, sizeof(buffer)) != (int) sizeof(buffer)) + if ((int) xlog_smgr->seg_write(fd, buffer.data, sizeof(buffer), offset, destTLI, destsegno, wal_segment_size) != (int) sizeof(buffer)) { int save_errno = errno; @@ -3505,6 +3489,7 @@ XLogFileCopy(TimeLineID destTLI, XLogSegNo destsegno, errmsg("could not write to file \"%s\": %m", tmppath))); } pgstat_report_wait_end(); + offset += sizeof(buffer); } pgstat_report_wait_start(WAIT_EVENT_WAL_COPY_SYNC); @@ -6894,6 +6879,7 @@ CreateCheckPoint(int flags) VirtualTransactionId *vxids; int nvxids; int oldXLogAllowed = 0; + XLogRecPtr slotsMinReqLSN; /* * An end-of-recovery checkpoint is really a shutdown checkpoint, just @@ -7125,6 +7111,15 @@ CreateCheckPoint(int flags) if (checkpoint_create_hook != NULL) checkpoint_create_hook(&checkPoint); + /* + * Get the current minimum LSN to be used later in the WAL segment + * cleanup. We may clean up only WAL segments, which are not needed + * according to synchronized LSNs of replication slots. The slot's LSN + * might be advanced concurrently, so we call this before + * CheckPointReplicationSlots() synchronizes replication slots. + */ + slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN(); + /* * In some cases there are groups of actions that must all occur on one * side or the other of a checkpoint record. Before flushing the @@ -7308,22 +7303,34 @@ CreateCheckPoint(int flags) if (PriorRedoPtr != InvalidXLogRecPtr) UpdateCheckPointDistanceEstimate(RedoRecPtr - PriorRedoPtr); +#ifdef USE_INJECTION_POINTS + INJECTION_POINT("checkpoint-before-old-wal-removal"); +#endif + /* * Delete old log files, those no longer needed for last checkpoint to * prevent the disk holding the xlog from growing full. */ XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size); - KeepLogSeg(recptr, &_logSegNo); + KeepLogSeg(recptr, slotsMinReqLSN, &_logSegNo); if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED, _logSegNo, InvalidOid, InvalidTransactionId)) { + /* + * Recalculate the current minimum LSN to be used in the WAL segment + * cleanup. Then, we must synchronize the replication slots again in + * order to make this LSN safe to use. + */ + slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN(); + CheckPointReplicationSlots(shutdown); + /* * Some slots have been invalidated; recalculate the old-segment * horizon, starting again from RedoRecPtr. */ XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size); - KeepLogSeg(recptr, &_logSegNo); + KeepLogSeg(recptr, slotsMinReqLSN, &_logSegNo); } _logSegNo--; RemoveOldXlogFiles(_logSegNo, RedoRecPtr, recptr, @@ -7596,6 +7603,7 @@ CreateRestartPoint(int flags) XLogRecPtr endptr; XLogSegNo _logSegNo; TimestampTz xtime; + XLogRecPtr slotsMinReqLSN; /* Concurrent checkpoint/restartpoint cannot happen */ Assert(!IsUnderPostmaster || MyBackendType == B_CHECKPOINTER); @@ -7678,6 +7686,15 @@ CreateRestartPoint(int flags) MemSet(&CheckpointStats, 0, sizeof(CheckpointStats)); CheckpointStats.ckpt_start_t = GetCurrentTimestamp(); + /* + * Get the current minimum LSN to be used later in the WAL segment + * cleanup. We may clean up only WAL segments, which are not needed + * according to synchronized LSNs of replication slots. The slot's LSN + * might be advanced concurrently, so we call this before + * CheckPointReplicationSlots() synchronizes replication slots. + */ + slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN(); + if (log_checkpoints) LogCheckpointStart(flags, true); @@ -7766,17 +7783,25 @@ CreateRestartPoint(int flags) receivePtr = GetWalRcvFlushRecPtr(NULL, NULL); replayPtr = GetXLogReplayRecPtr(&replayTLI); endptr = (receivePtr < replayPtr) ? replayPtr : receivePtr; - KeepLogSeg(endptr, &_logSegNo); + KeepLogSeg(endptr, slotsMinReqLSN, &_logSegNo); if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED, _logSegNo, InvalidOid, InvalidTransactionId)) { + /* + * Recalculate the current minimum LSN to be used in the WAL segment + * cleanup. Then, we must synchronize the replication slots again in + * order to make this LSN safe to use. + */ + slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN(); + CheckPointReplicationSlots(flags & CHECKPOINT_IS_SHUTDOWN); + /* * Some slots have been invalidated; recalculate the old-segment * horizon, starting again from RedoRecPtr. */ XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size); - KeepLogSeg(endptr, &_logSegNo); + KeepLogSeg(endptr, slotsMinReqLSN, &_logSegNo); } _logSegNo--; @@ -7871,6 +7896,7 @@ GetWALAvailability(XLogRecPtr targetLSN) XLogSegNo oldestSegMaxWalSize; /* oldest segid kept by max_wal_size */ XLogSegNo oldestSlotSeg; /* oldest segid kept by slot */ uint64 keepSegs; + XLogRecPtr slotsMinReqLSN; /* * slot does not reserve WAL. Either deactivated, or has never been active @@ -7884,8 +7910,9 @@ GetWALAvailability(XLogRecPtr targetLSN) * oldestSlotSeg to the current segment. */ currpos = GetXLogWriteRecPtr(); + slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN(); XLByteToSeg(currpos, oldestSlotSeg, wal_segment_size); - KeepLogSeg(currpos, &oldestSlotSeg); + KeepLogSeg(currpos, slotsMinReqLSN, &oldestSlotSeg); /* * Find the oldest extant segment file. We get 1 until checkpoint removes @@ -7946,7 +7973,7 @@ GetWALAvailability(XLogRecPtr targetLSN) * invalidation is optionally done here, instead. */ static void -KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo) +KeepLogSeg(XLogRecPtr recptr, XLogRecPtr slotsMinReqLSN, XLogSegNo *logSegNo) { XLogSegNo currSegNo; XLogSegNo segno; @@ -7955,17 +7982,19 @@ KeepLogSeg(XLogRecPtr recptr, XLogSegNo *logSegNo) XLByteToSeg(recptr, currSegNo, wal_segment_size); segno = currSegNo; - /* - * Calculate how many segments are kept by slots first, adjusting for - * max_slot_wal_keep_size. - */ - keep = XLogGetReplicationSlotMinimumLSN(); + /* Calculate how many segments are kept by slots. */ + keep = slotsMinReqLSN; if (keep != InvalidXLogRecPtr && keep < recptr) { XLByteToSeg(keep, segno, wal_segment_size); - /* Cap by max_slot_wal_keep_size ... */ - if (max_slot_wal_keep_size_mb >= 0) + /* + * Account for max_slot_wal_keep_size to avoid keeping more than + * configured. However, don't do that during a binary upgrade: if + * slots were to be invalidated because of this, it would not be + * possible to preserve logical ones during the upgrade. + */ + if (max_slot_wal_keep_size_mb >= 0 && !IsBinaryUpgrade) { uint64 slot_keep_segs; diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index d7892ae5c625d..efe082b98c7e2 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -738,11 +738,12 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) /* Calculate pointer to beginning of next page */ targetPagePtr += XLOG_BLCKSZ; - /* Wait for the next page to become available */ - readOff = ReadPageInternal(state, targetPagePtr, - Min(total_len - gotlen + SizeOfXLogShortPHD, - XLOG_BLCKSZ)); - + /* + * Read the page header before processing the record data, so we + * can handle the case where the previous record ended as being a + * partial one. + */ + readOff = ReadPageInternal(state, targetPagePtr, SizeOfXLogShortPHD); if (readOff == XLREAD_WOULDBLOCK) return XLREAD_WOULDBLOCK; else if (readOff < 0) @@ -791,6 +792,15 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) goto err; } + /* Wait for the next page to become available */ + readOff = ReadPageInternal(state, targetPagePtr, + Min(total_len - gotlen + SizeOfXLogShortPHD, + XLOG_BLCKSZ)); + if (readOff == XLREAD_WOULDBLOCK) + return XLREAD_WOULDBLOCK; + else if (readOff < 0) + goto err; + /* Append the continuation from this page to the buffer */ pageHeaderSize = XLogPageHeaderSize(pageHeader); diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c index 104687b9cd762..8becf0420b515 100644 --- a/src/backend/access/transam/xlogrecovery.c +++ b/src/backend/access/transam/xlogrecovery.c @@ -845,13 +845,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)))); } diff --git a/src/backend/catalog/heap.c b/src/backend/catalog/heap.c index 794bf3dc6364a..71eb3b2432c48 100644 --- a/src/backend/catalog/heap.c +++ b/src/backend/catalog/heap.c @@ -69,6 +69,7 @@ #include "pgstat.h" #include "storage/lmgr.h" #include "storage/predicate.h" +#include "utils/array.h" #include "utils/builtins.h" #include "utils/fmgroids.h" #include "utils/inval.h" @@ -2033,6 +2034,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 * @@ -2360,13 +2415,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_after_planning((Expr *) expr)) - colDef->missingMode = false; - defOid = StoreAttrDefault(rel, colDef->attnum, expr, is_internal, - colDef->missingMode); + false); cooked = (CookedConstraint *) palloc(sizeof(CookedConstraint)); cooked->contype = CONSTR_DEFAULT; diff --git a/src/backend/catalog/pg_attrdef.c b/src/backend/catalog/pg_attrdef.c index 003ae70b4d255..65296bd9e0555 100644 --- a/src/backend/catalog/pg_attrdef.c +++ b/src/backend/catalog/pg_attrdef.c @@ -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_constraint.c b/src/backend/catalog/pg_constraint.c index 3baf9231ed0c8..b6fd46b019fee 100644 --- a/src/backend/catalog/pg_constraint.c +++ b/src/backend/catalog/pg_constraint.c @@ -118,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); diff --git a/src/backend/catalog/pg_subscription.c b/src/backend/catalog/pg_subscription.c index 9efc9159f2c22..68e32c42cb092 100644 --- a/src/backend/catalog/pg_subscription.c +++ b/src/backend/catalog/pg_subscription.c @@ -287,8 +287,8 @@ AddSubscriptionRelState(Oid subid, Oid relid, char state, * Update the state of a subscription table. */ void -UpdateSubscriptionRelState(Oid subid, Oid relid, char state, - XLogRecPtr sublsn) +UpdateSubscriptionRelStateEx(Oid subid, Oid relid, char state, + XLogRecPtr sublsn, bool already_locked) { Relation rel; HeapTuple tup; @@ -296,9 +296,24 @@ UpdateSubscriptionRelState(Oid subid, Oid relid, char state, Datum values[Natts_pg_subscription_rel]; bool replaces[Natts_pg_subscription_rel]; - LockSharedObject(SubscriptionRelationId, subid, 0, AccessShareLock); + if (already_locked) + { +#ifdef USE_ASSERT_CHECKING + LOCKTAG tag; - rel = table_open(SubscriptionRelRelationId, RowExclusiveLock); + Assert(CheckRelationOidLockedByMe(SubscriptionRelRelationId, + RowExclusiveLock, true)); + SET_LOCKTAG_OBJECT(tag, InvalidOid, SubscriptionRelationId, subid, 0); + Assert(LockHeldByMe(&tag, AccessShareLock, true)); +#endif + + rel = table_open(SubscriptionRelRelationId, NoLock); + } + else + { + LockSharedObject(SubscriptionRelationId, subid, 0, AccessShareLock); + rel = table_open(SubscriptionRelRelationId, RowExclusiveLock); + } /* Try finding existing mapping. */ tup = SearchSysCacheCopy2(SUBSCRIPTIONRELMAP, @@ -332,6 +347,16 @@ UpdateSubscriptionRelState(Oid subid, Oid relid, char state, table_close(rel, NoLock); } +/* + * Update the state of a subscription table. + */ +void +UpdateSubscriptionRelState(Oid subid, Oid relid, char state, + XLogRecPtr sublsn) +{ + UpdateSubscriptionRelStateEx(subid, relid, state, sublsn, false); +} + /* * Get state of subscription table. * diff --git a/src/backend/commands/foreigncmds.c b/src/backend/commands/foreigncmds.c index cf61bbac1fa10..17f40599d269f 100644 --- a/src/backend/commands/foreigncmds.c +++ b/src/backend/commands/foreigncmds.c @@ -71,15 +71,26 @@ optionListToArray(List *options) foreach(cell, options) { DefElem *def = lfirst(cell); + const char *name; const char *value; Size len; text *t; + name = def->defname; value = defGetString(def); - len = VARHDRSZ + strlen(def->defname) + 1 + strlen(value); + + /* Insist that name not contain "=", else "a=b=c" is ambiguous */ + if (strchr(name, '=') != NULL) + ereport(ERROR, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("invalid option name \"%s\": must not contain \"=\"", + name))); + + len = VARHDRSZ + strlen(name) + 1 + strlen(value); + /* +1 leaves room for sprintf's trailing null */ t = palloc(len + 1); SET_VARSIZE(t, len); - sprintf(VARDATA(t), "%s=%s", def->defname, value); + sprintf(VARDATA(t), "%s=%s", name, value); astate = accumArrayResult(astate, PointerGetDatum(t), false, TEXTOID, diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index ff96a56c9e9b9..b3f0917015196 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -2461,7 +2461,9 @@ makeObjectName(const char *name1, const char *name2, const char *label) * constraint names.) * * Note: it is theoretically possible to get a collision anyway, if someone - * else chooses the same name concurrently. This is fairly unlikely to be + * else chooses the same name concurrently. We shorten the race condition + * window by checking for conflicting relations using SnapshotDirty, but + * that doesn't close the window entirely. This is fairly unlikely to be * a problem in practice, especially if one is holding an exclusive lock on * the relation identified by name1. However, if choosing multiple names * within a single command, you'd better create the new object and do @@ -2477,15 +2479,45 @@ ChooseRelationName(const char *name1, const char *name2, int pass = 0; char *relname = NULL; char modlabel[NAMEDATALEN]; + SnapshotData SnapshotDirty; + Relation pgclassrel; + + /* prepare to search pg_class with a dirty snapshot */ + InitDirtySnapshot(SnapshotDirty); + pgclassrel = table_open(RelationRelationId, AccessShareLock); /* try the unmodified label first */ strlcpy(modlabel, label, sizeof(modlabel)); for (;;) { + ScanKeyData key[2]; + SysScanDesc scan; + bool collides; + relname = makeObjectName(name1, name2, modlabel); - if (!OidIsValid(get_relname_relid(relname, namespaceid))) + /* is there any conflicting relation name? */ + ScanKeyInit(&key[0], + Anum_pg_class_relname, + BTEqualStrategyNumber, F_NAMEEQ, + CStringGetDatum(relname)); + ScanKeyInit(&key[1], + Anum_pg_class_relnamespace, + BTEqualStrategyNumber, F_OIDEQ, + ObjectIdGetDatum(namespaceid)); + + scan = systable_beginscan(pgclassrel, ClassNameNspIndexId, + true /* indexOK */ , + &SnapshotDirty, + 2, key); + + collides = HeapTupleIsValid(systable_getnext(scan)); + + systable_endscan(scan); + + /* break out of loop if no conflict */ + if (!collides) { if (!isconstraint || !ConstraintNameExists(relname, namespaceid)) @@ -2497,6 +2529,8 @@ ChooseRelationName(const char *name1, const char *name2, snprintf(modlabel, sizeof(modlabel), "%s%d", label, ++pass); } + table_close(pgclassrel, AccessShareLock); + return relname; } @@ -4094,12 +4128,20 @@ ReindexRelationConcurrently(const ReindexStmt *stmt, Oid relationOid, const Rein get_rel_namespace(oldidx->tableId), false); + /* + * Swapping the indexes might involve TOAST table access, so ensure we + * have a valid snapshot. + */ + PushActiveSnapshot(GetTransactionSnapshot()); + /* * Swap old index with the new one. This also marks the new one as * valid and the old one as not valid. */ index_concurrently_swap(newidx->indexId, oldidx->indexId, oldName); + PopActiveSnapshot(); + /* * Invalidate the relcache for the table, so that after this commit * all sessions will refresh any cached plans that might reference the diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c index 8ecb6e0bb87ad..9467f58a23df3 100644 --- a/src/backend/commands/subscriptioncmds.c +++ b/src/backend/commands/subscriptioncmds.c @@ -2012,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 @@ -2046,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); diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 507f6c17d6ae2..2ab9d90fb8ac9 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -512,8 +512,8 @@ static ObjectAddress ATAddForeignKeyConstraint(List **wqueue, AlteredTableInfo * Relation rel, Constraint *fkconstraint, bool recurse, bool recursing, LOCKMODE lockmode); -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, @@ -7209,14 +7209,7 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, rawEnt = (RawColumnDefault *) palloc(sizeof(RawColumnDefault)); 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; /* @@ -7228,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; } /* @@ -7251,9 +7237,9 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, * 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 @@ -7272,6 +7258,9 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, */ 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. @@ -7284,14 +7273,13 @@ ATExecAddColumn(List **wqueue, AlteredTableInfo *tab, Relation rel, 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); - if (!defval && DomainHasConstraints(attribute->atttypid)) + /* Build CoerceToDomain(NULL) expression if needed */ + has_domain_constraints = DomainHasConstraints(attribute->atttypid); + if (!defval && has_domain_constraints) { Oid baseTypeId; int32 baseTypeMod; @@ -7317,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->expr = defval; newval->is_generated = (colDef->generated != '\0'); tab->newvals = lappend(tab->newvals, newval); - } - if (DomainHasConstraints(attribute->atttypid)) - 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, @@ -9683,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 @@ -10006,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) @@ -10034,7 +10074,21 @@ 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; } /* @@ -10554,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); } /* @@ -10572,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. */ @@ -10664,17 +10716,6 @@ 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; - } - /* We need the same lock level that CreateTrigger will acquire */ fkRel = table_open(constrForm->conrelid, ShareRowExclusiveLock); @@ -13813,9 +13854,12 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) /* * Re-parse the index and constraint definitions, and attach them to the * appropriate work queue entries. We do this before dropping because in - * the case of a FOREIGN KEY constraint, we might not yet have exclusive - * lock on the table the constraint is attached to, and we need to get - * that before reparsing/dropping. + * the case of a constraint on another table, we might not yet have + * exclusive lock on the table the constraint is attached to, and we need + * to get that before reparsing/dropping. (That's possible at least for + * FOREIGN KEY, CHECK, and EXCLUSION constraints; in non-FK cases it + * requires a dependency on the target table's composite type in the other + * table's constraint expressions.) * * We can't rely on the output of deparsing to tell us which relation to * operate on, because concurrent activity might have made the name @@ -13831,7 +13875,6 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) Form_pg_constraint con; Oid relid; Oid confrelid; - char contype; bool conislocal; tup = SearchSysCache1(CONSTROID, ObjectIdGetDatum(oldId)); @@ -13848,7 +13891,6 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) elog(ERROR, "could not identify relation associated with constraint %u", oldId); } confrelid = con->confrelid; - contype = con->contype; conislocal = con->conislocal; ReleaseSysCache(tup); @@ -13865,12 +13907,12 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) continue; /* - * When rebuilding an FK constraint that references the table we're - * modifying, we might not yet have any lock on the FK's table, so get - * one now. We'll need AccessExclusiveLock for the DROP CONSTRAINT - * step, so there's no value in asking for anything weaker. + * When rebuilding another table's constraint that references the + * table we're modifying, we might not yet have any lock on the other + * table, so get one now. We'll need AccessExclusiveLock for the DROP + * CONSTRAINT step, so there's no value in asking for anything weaker. */ - if (relid != tab->relid && contype == CONSTRAINT_FOREIGN) + if (relid != tab->relid) LockRelationOid(relid, AccessExclusiveLock); ATPostAlterTypeParse(oldId, relid, confrelid, @@ -13884,6 +13926,14 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) Oid relid; relid = IndexGetRelation(oldId, false); + + /* + * As above, make sure we have lock on the index's table if it's not + * the same table. + */ + if (relid != tab->relid) + LockRelationOid(relid, AccessExclusiveLock); + ATPostAlterTypeParse(oldId, relid, InvalidOid, (char *) lfirst(def_item), wqueue, lockmode, tab->rewrite); @@ -13900,6 +13950,20 @@ ATPostAlterTypeCleanup(List **wqueue, AlteredTableInfo *tab, LOCKMODE lockmode) Oid relid; relid = StatisticsGetRelation(oldId, false); + + /* + * As above, make sure we have lock on the statistics object's table + * if it's not the same table. However, we take + * ShareUpdateExclusiveLock here, aligning with the lock level used in + * CreateStatistics and RemoveStatisticsById. + * + * CAUTION: this should be done after all cases that grab + * AccessExclusiveLock, else we risk causing deadlock due to needing + * to promote our table lock. + */ + if (relid != tab->relid) + LockRelationOid(relid, ShareUpdateExclusiveLock); + ATPostAlterTypeParse(oldId, relid, InvalidOid, (char *) lfirst(def_item), wqueue, lockmode, tab->rewrite); @@ -19227,9 +19291,17 @@ ATExecDetachPartition(List **wqueue, AlteredTableInfo *tab, Relation rel, tab->rel = rel; } + /* + * Detaching the partition might involve TOAST table access, so ensure we + * have a valid snapshot. + */ + PushActiveSnapshot(GetTransactionSnapshot()); + /* Do the final part of detaching */ DetachPartitionFinalize(rel, partRel, concurrent, defaultPartOid); + PopActiveSnapshot(); + ObjectAddressSet(address, RelationRelationId, RelationGetRelid(partRel)); /* keep our lock until commit */ diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index ea5cc10919d9c..c89763440c982 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -79,6 +79,7 @@ static bool GetTupleForTrigger(EState *estate, ItemPointer tid, LockTupleMode lockmode, TupleTableSlot *oldslot, + bool do_epq_recheck, TupleTableSlot **epqslot, TM_Result *tmresultp, TM_FailureData *tmfdp); @@ -2278,6 +2279,8 @@ FindTriggerIncompatibleWithInheritance(TriggerDesc *trigdesc) { Trigger *trigger = &trigdesc->triggers[i]; + if (!TRIGGER_FOR_ROW(trigger->tgtype)) + continue; if (trigger->tgoldtable != NULL || trigger->tgnewtable != NULL) return trigger->tgname; } @@ -2536,6 +2539,15 @@ ExecARInsertTriggers(EState *estate, ResultRelInfo *relinfo, { TriggerDesc *trigdesc = relinfo->ri_TrigDesc; + if (relinfo->ri_FdwRoutine && transition_capture && + transition_capture->tcs_insert_new_table) + { + Assert(relinfo->ri_RootResultRelInfo); + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot collect transition tuples from child foreign tables"))); + } + if ((trigdesc && trigdesc->trig_insert_after_row) || (transition_capture && transition_capture->tcs_insert_new_table)) AfterTriggerSaveEvent(estate, relinfo, NULL, NULL, @@ -2679,13 +2691,14 @@ ExecASDeleteTriggers(EState *estate, ResultRelInfo *relinfo, * back the concurrently updated tuple if any. */ bool -ExecBRDeleteTriggers(EState *estate, EPQState *epqstate, - ResultRelInfo *relinfo, - ItemPointer tupleid, - HeapTuple fdw_trigtuple, - TupleTableSlot **epqslot, - TM_Result *tmresult, - TM_FailureData *tmfd) +ExecBRDeleteTriggersNew(EState *estate, EPQState *epqstate, + ResultRelInfo *relinfo, + ItemPointer tupleid, + HeapTuple fdw_trigtuple, + TupleTableSlot **epqslot, + TM_Result *tmresult, + TM_FailureData *tmfd, + bool is_merge_delete) { TupleTableSlot *slot = ExecGetTriggerOldSlot(estate, relinfo); TriggerDesc *trigdesc = relinfo->ri_TrigDesc; @@ -2700,9 +2713,17 @@ ExecBRDeleteTriggers(EState *estate, EPQState *epqstate, { TupleTableSlot *epqslot_candidate = NULL; + /* + * Get a copy of the on-disk tuple we are planning to delete. In + * general, if the tuple has been concurrently updated, we should + * recheck it using EPQ. However, if this is a MERGE DELETE action, + * we skip this EPQ recheck and leave it to the caller (it must do + * additional rechecking, and might end up executing a different + * action entirely). + */ if (!GetTupleForTrigger(estate, epqstate, relinfo, tupleid, - LockTupleExclusive, slot, &epqslot_candidate, - tmresult, tmfd)) + LockTupleExclusive, slot, !is_merge_delete, + &epqslot_candidate, tmresult, tmfd)) return false; /* @@ -2765,6 +2786,24 @@ ExecBRDeleteTriggers(EState *estate, EPQState *epqstate, return result; } +/* + * ABI-compatible wrapper to emulate old version of the above function. + * Do not call this version in new code. + */ +bool +ExecBRDeleteTriggers(EState *estate, EPQState *epqstate, + ResultRelInfo *relinfo, + ItemPointer tupleid, + HeapTuple fdw_trigtuple, + TupleTableSlot **epqslot, + TM_Result *tmresult, + TM_FailureData *tmfd) +{ + return ExecBRDeleteTriggersNew(estate, epqstate, relinfo, tupleid, + fdw_trigtuple, epqslot, tmresult, tmfd, + false); +} + /* * Note: is_crosspart_update must be true if the DELETE is being performed * as part of a cross-partition update. @@ -2779,6 +2818,15 @@ ExecARDeleteTriggers(EState *estate, { TriggerDesc *trigdesc = relinfo->ri_TrigDesc; + if (relinfo->ri_FdwRoutine && transition_capture && + transition_capture->tcs_delete_old_table) + { + Assert(relinfo->ri_RootResultRelInfo); + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot collect transition tuples from child foreign tables"))); + } + if ((trigdesc && trigdesc->trig_delete_after_row) || (transition_capture && transition_capture->tcs_delete_old_table)) { @@ -2792,6 +2840,7 @@ ExecARDeleteTriggers(EState *estate, tupleid, LockTupleExclusive, slot, + false, NULL, NULL, NULL); @@ -2930,13 +2979,14 @@ ExecASUpdateTriggers(EState *estate, ResultRelInfo *relinfo, } bool -ExecBRUpdateTriggers(EState *estate, EPQState *epqstate, - ResultRelInfo *relinfo, - ItemPointer tupleid, - HeapTuple fdw_trigtuple, - TupleTableSlot *newslot, - TM_Result *tmresult, - TM_FailureData *tmfd) +ExecBRUpdateTriggersNew(EState *estate, EPQState *epqstate, + ResultRelInfo *relinfo, + ItemPointer tupleid, + HeapTuple fdw_trigtuple, + TupleTableSlot *newslot, + TM_Result *tmresult, + TM_FailureData *tmfd, + bool is_merge_update) { TriggerDesc *trigdesc = relinfo->ri_TrigDesc; TupleTableSlot *oldslot = ExecGetTriggerOldSlot(estate, relinfo); @@ -2957,10 +3007,17 @@ ExecBRUpdateTriggers(EState *estate, EPQState *epqstate, { TupleTableSlot *epqslot_candidate = NULL; - /* get a copy of the on-disk tuple we are planning to update */ + /* + * Get a copy of the on-disk tuple we are planning to update. In + * general, if the tuple has been concurrently updated, we should + * recheck it using EPQ. However, if this is a MERGE UPDATE action, + * we skip this EPQ recheck and leave it to the caller (it must do + * additional rechecking, and might end up executing a different + * action entirely). + */ if (!GetTupleForTrigger(estate, epqstate, relinfo, tupleid, - lockmode, oldslot, &epqslot_candidate, - tmresult, tmfd)) + lockmode, oldslot, !is_merge_update, + &epqslot_candidate, tmresult, tmfd)) return false; /* cancel the update action */ /* @@ -3082,6 +3139,24 @@ ExecBRUpdateTriggers(EState *estate, EPQState *epqstate, return true; } +/* + * ABI-compatible wrapper to emulate old version of the above function. + * Do not call this version in new code. + */ +bool +ExecBRUpdateTriggers(EState *estate, EPQState *epqstate, + ResultRelInfo *relinfo, + ItemPointer tupleid, + HeapTuple fdw_trigtuple, + TupleTableSlot *newslot, + TM_Result *tmresult, + TM_FailureData *tmfd) +{ + return ExecBRUpdateTriggersNew(estate, epqstate, relinfo, tupleid, + fdw_trigtuple, newslot, tmresult, tmfd, + false); +} + /* * Note: 'src_partinfo' and 'dst_partinfo', when non-NULL, refer to the source * and destination partitions, respectively, of a cross-partition update of @@ -3105,6 +3180,16 @@ ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo, { TriggerDesc *trigdesc = relinfo->ri_TrigDesc; + if (relinfo->ri_FdwRoutine && transition_capture && + (transition_capture->tcs_update_old_table || + transition_capture->tcs_update_new_table)) + { + Assert(relinfo->ri_RootResultRelInfo); + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot collect transition tuples from child foreign tables"))); + } + if ((trigdesc && trigdesc->trig_update_after_row) || (transition_capture && (transition_capture->tcs_update_old_table || @@ -3132,6 +3217,7 @@ ExecARUpdateTriggers(EState *estate, ResultRelInfo *relinfo, tupleid, LockTupleExclusive, oldslot, + false, NULL, NULL, NULL); @@ -3288,6 +3374,7 @@ GetTupleForTrigger(EState *estate, ItemPointer tid, LockTupleMode lockmode, TupleTableSlot *oldslot, + bool do_epq_recheck, TupleTableSlot **epqslot, TM_Result *tmresultp, TM_FailureData *tmfdp) @@ -3347,29 +3434,30 @@ GetTupleForTrigger(EState *estate, if (tmfd.traversed) { /* - * Recheck the tuple using EPQ. For MERGE, we leave this - * to the caller (it must do additional rechecking, and - * might end up executing a different action entirely). + * Recheck the tuple using EPQ, if requested. Otherwise, + * just return that it was concurrently updated. */ - if (estate->es_plannedstmt->commandType == CMD_MERGE) + if (do_epq_recheck) { - if (tmresultp) - *tmresultp = TM_Updated; - return false; + *epqslot = EvalPlanQual(epqstate, + relation, + relinfo->ri_RangeTableIndex, + oldslot); + + /* + * If PlanQual failed for updated tuple - we must not + * process this tuple! + */ + if (TupIsNull(*epqslot)) + { + *epqslot = NULL; + return false; + } } - - *epqslot = EvalPlanQual(epqstate, - relation, - relinfo->ri_RangeTableIndex, - oldslot); - - /* - * If PlanQual failed for updated tuple - we must not - * process this tuple! - */ - if (TupIsNull(*epqslot)) + else { - *epqslot = NULL; + if (tmresultp) + *tmresultp = TM_Updated; return false; } } diff --git a/src/backend/commands/user.c b/src/backend/commands/user.c index e204eb5e5d145..aed01cf4cae9e 100644 --- a/src/backend/commands/user.c +++ b/src/backend/commands/user.c @@ -2553,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 79fe26a932550..a2132ecedaf85 100644 --- a/src/backend/commands/vacuum.c +++ b/src/backend/commands/vacuum.c @@ -56,6 +56,7 @@ #include "utils/fmgroids.h" #include "utils/guc.h" #include "utils/guc_hooks.h" +#include "utils/injection_point.h" #include "utils/memutils.h" #include "utils/snapmgr.h" #include "utils/syscache.h" @@ -619,7 +620,15 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (params->options & VACOPT_VACUUM) { - if (!vacuum_rel(vrel->oid, vrel->relation, params, bstrategy)) + VacuumParams params_copy; + + /* + * vacuum_rel() scribbles on the parameters, so give it a copy + * to avoid affecting other relations. + */ + memcpy(¶ms_copy, params, sizeof(VacuumParams)); + + if (!vacuum_rel(vrel->oid, vrel->relation, ¶ms_copy, bstrategy)) continue; } @@ -642,6 +651,8 @@ vacuum(List *relations, VacuumParams *params, BufferAccessStrategy bstrategy, if (use_own_xacts) { PopActiveSnapshot(); + /* standard_ProcessUtility() does CCI if !use_own_xacts */ + CommandCounterIncrement(); CommitTransactionCommand(); } else @@ -1970,9 +1981,16 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, Oid save_userid; int save_sec_context; int save_nestlevel; + VacuumParams toast_vacuum_params; Assert(params != NULL); + /* + * This function scribbles on the parameters, so make a copy early to + * avoid affecting the TOAST table (if we do end up recursing to it). + */ + memcpy(&toast_vacuum_params, params, sizeof(VacuumParams)); + /* Begin a transaction for vacuuming this relation */ StartTransactionCommand(); @@ -2153,6 +2171,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, } } +#ifdef USE_INJECTION_POINTS + if (params->index_cleanup == VACOPTVALUE_AUTO) + INJECTION_POINT("vacuum-index-cleanup-auto"); + else if (params->index_cleanup == VACOPTVALUE_DISABLED) + INJECTION_POINT("vacuum-index-cleanup-disabled"); + else if (params->index_cleanup == VACOPTVALUE_ENABLED) + INJECTION_POINT("vacuum-index-cleanup-enabled"); +#endif + /* * Set truncate option based on truncate reloption if it wasn't specified * in VACUUM command, or when running in an autovacuum worker @@ -2166,6 +2193,15 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, params->truncate = VACOPTVALUE_DISABLED; } +#ifdef USE_INJECTION_POINTS + if (params->truncate == VACOPTVALUE_AUTO) + INJECTION_POINT("vacuum-truncate-auto"); + else if (params->truncate == VACOPTVALUE_DISABLED) + INJECTION_POINT("vacuum-truncate-disabled"); + else if (params->truncate == VACOPTVALUE_ENABLED) + INJECTION_POINT("vacuum-truncate-enabled"); +#endif + /* * Remember the relation's TOAST relation for later, if the caller asked * us to process it. In VACUUM FULL, though, the toast table is @@ -2245,15 +2281,12 @@ vacuum_rel(Oid relid, RangeVar *relation, VacuumParams *params, */ if (toast_relid != InvalidOid) { - VacuumParams toast_vacuum_params; - /* * Force VACOPT_PROCESS_MAIN so vacuum_rel() processes it. Likewise, * 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.toast_parent = relid; diff --git a/src/backend/executor/execExprInterp.c b/src/backend/executor/execExprInterp.c index a55ad77256629..366975dad68f0 100644 --- a/src/backend/executor/execExprInterp.c +++ b/src/backend/executor/execExprInterp.c @@ -4672,7 +4672,6 @@ ExecEvalJsonCoercionFinish(ExprState *state, ExprEvalStep *op) * JsonBehavior expression. */ jsestate->escontext.error_occurred = false; - jsestate->escontext.error_occurred = false; jsestate->escontext.details_wanted = true; } } diff --git a/src/backend/executor/execIndexing.c b/src/backend/executor/execIndexing.c index 9f05b3654c186..dded5e793740a 100644 --- a/src/backend/executor/execIndexing.c +++ b/src/backend/executor/execIndexing.c @@ -268,7 +268,7 @@ ExecCloseIndices(ResultRelInfo *resultRelInfo) * executor is performing an UPDATE that could not use an * optimization like heapam's HOT (in more general terms a * call to table_tuple_update() took place and set - * 'update_indexes' to TUUI_All). Receiving this hint makes + * 'update_indexes' to TU_All). Receiving this hint makes * us consider if we should pass down the 'indexUnchanged' * hint in turn. That's something that we figure out for * each index_insert() call iff 'update' is true. @@ -279,7 +279,7 @@ ExecCloseIndices(ResultRelInfo *resultRelInfo) * HOT has been applied and any updated columns are indexed * only by summarizing indexes (or in more general terms a * call to table_tuple_update() took place and set - * 'update_indexes' to TUUI_Summarizing). We can (and must) + * 'update_indexes' to TU_Summarizing). We can (and must) * therefore only update the indexes that have * 'amsummarizing' = true. * diff --git a/src/backend/executor/execMain.c b/src/backend/executor/execMain.c index 8048b810e51e5..e35ddd0e898df 100644 --- a/src/backend/executor/execMain.c +++ b/src/backend/executor/execMain.c @@ -81,7 +81,6 @@ static void ExecutePlan(QueryDesc *queryDesc, uint64 numberTuples, ScanDirection direction, DestReceiver *dest); -static bool ExecCheckOneRelPerms(RTEPermissionInfo *perminfo); static bool ExecCheckPermissionsModified(Oid relOid, Oid userid, Bitmapset *modifiedCols, AclMode requiredPerms); @@ -633,7 +632,7 @@ ExecCheckPermissions(List *rangeTable, List *rteperminfos, * ExecCheckOneRelPerms * Check access permissions for a single relation. */ -static bool +bool ExecCheckOneRelPerms(RTEPermissionInfo *perminfo) { AclMode requiredPerms; diff --git a/src/backend/executor/execPartition.c b/src/backend/executor/execPartition.c index 7651886229114..a3602b816871e 100644 --- a/src/backend/executor/execPartition.c +++ b/src/backend/executor/execPartition.c @@ -872,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) @@ -952,6 +952,8 @@ ExecInitPartitionInfo(ModifyTableState *mtstate, EState *estate, NULL); break; case CMD_DELETE: + case CMD_NOTHING: + /* Nothing to do */ break; default: diff --git a/src/backend/executor/execReplication.c b/src/backend/executor/execReplication.c index f18efdb6f2649..cb1202e450678 100644 --- a/src/backend/executor/execReplication.c +++ b/src/backend/executor/execReplication.c @@ -250,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, @@ -434,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, diff --git a/src/backend/executor/nodeAppend.c b/src/backend/executor/nodeAppend.c index ca0f54d676f4a..6d5bee668c437 100644 --- a/src/backend/executor/nodeAppend.c +++ b/src/backend/executor/nodeAppend.c @@ -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; @@ -1041,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) { @@ -1051,6 +1051,21 @@ ExecAppendAsyncEventWait(AppendState *node) return; } + /* + * 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; @@ -1092,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/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index 6b48a6d8350fb..3d26d96cadd71 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -185,8 +185,21 @@ BitmapHeapNext(BitmapHeapScanState *node) */ if (!scan) { - bool need_tuples = false; + 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 @@ -197,6 +210,7 @@ BitmapHeapNext(BitmapHeapScanState *node) */ 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, diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c index 02be41845accd..c230b666706e3 100644 --- a/src/backend/executor/nodeModifyTable.c +++ b/src/backend/executor/nodeModifyTable.c @@ -64,6 +64,7 @@ #include "nodes/nodeFuncs.h" #include "optimizer/optimizer.h" #include "rewrite/rewriteHandler.h" +#include "rewrite/rewriteManip.h" #include "storage/lmgr.h" #include "utils/builtins.h" #include "utils/datum.h" @@ -205,33 +206,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, @@ -1328,9 +1349,10 @@ ExecDeletePrologue(ModifyTableContext *context, ResultRelInfo *resultRelInfo, if (context->estate->es_insert_pending_result_relations != NIL) ExecPendingInserts(context->estate); - return ExecBRDeleteTriggers(context->estate, context->epqstate, - resultRelInfo, tupleid, oldtuple, - epqreturnslot, result, &context->tmfd); + return ExecBRDeleteTriggersNew(context->estate, context->epqstate, + resultRelInfo, tupleid, oldtuple, + epqreturnslot, result, &context->tmfd, + context->mtstate->operation == CMD_MERGE); } return true; @@ -1926,9 +1948,10 @@ ExecUpdatePrologue(ModifyTableContext *context, ResultRelInfo *resultRelInfo, if (context->estate->es_insert_pending_result_relations != NIL) ExecPendingInserts(context->estate); - return ExecBRUpdateTriggers(context->estate, context->epqstate, - resultRelInfo, tupleid, oldtuple, slot, - result, &context->tmfd); + return ExecBRUpdateTriggersNew(context->estate, context->epqstate, + resultRelInfo, tupleid, oldtuple, slot, + result, &context->tmfd, + context->mtstate->operation == CMD_MERGE); } return true; @@ -3531,6 +3554,7 @@ ExecInitMerge(ModifyTableState *mtstate, EState *estate) switch (action->commandType) { case CMD_INSERT: + /* INSERT actions always use rootRelInfo */ ExecCheckPlanOutput(rootRelInfo->ri_RelationDesc, action->targetList); @@ -3570,9 +3594,23 @@ ExecInitMerge(ModifyTableState *mtstate, EState *estate) } else { - /* not partitioned? use the stock relation and slot */ - tgtslot = resultRelInfo->ri_newTupleSlot; - tgtdesc = RelationGetDescr(resultRelInfo->ri_RelationDesc); + /* + * If the MERGE targets an inherited table, we insert + * into the root table, so we must initialize its + * "new" tuple slot, if not already done, and use its + * relation descriptor for the projection. + * + * For non-inherited tables, rootRelInfo and + * resultRelInfo are the same, and the "new" tuple + * slot will already have been initialized. + */ + if (rootRelInfo->ri_newTupleSlot == NULL) + rootRelInfo->ri_newTupleSlot = + table_slot_create(rootRelInfo->ri_RelationDesc, + &estate->es_tupleTable); + + tgtslot = rootRelInfo->ri_newTupleSlot; + tgtdesc = RelationGetDescr(rootRelInfo->ri_RelationDesc); } action_state->mas_proj = @@ -3600,11 +3638,118 @@ ExecInitMerge(ModifyTableState *mtstate, EState *estate) case CMD_NOTHING: break; default: - elog(ERROR, "unknown operation"); + elog(ERROR, "unknown action in MERGE WHEN clause"); break; } } } + + /* + * If the MERGE targets an inherited table, any INSERT actions will use + * rootRelInfo, and rootRelInfo will not be in the resultRelInfo array. + * Therefore we must initialize its WITH CHECK OPTION constraints and + * RETURNING projection, as ExecInitModifyTable did for the resultRelInfo + * entries. + * + * Note that the planner does not build a withCheckOptionList or + * returningList for the root relation, but as in ExecInitPartitionInfo, + * we can use the first resultRelInfo entry as a reference to calculate + * the attno's for the root table. + */ + if (rootRelInfo != mtstate->resultRelInfo && + rootRelInfo->ri_RelationDesc->rd_rel->relkind != RELKIND_PARTITIONED_TABLE && + (mtstate->mt_merge_subcommands & MERGE_INSERT) != 0) + { + Relation rootRelation = rootRelInfo->ri_RelationDesc; + Relation firstResultRel = mtstate->resultRelInfo[0].ri_RelationDesc; + int firstVarno = mtstate->resultRelInfo[0].ri_RangeTableIndex; + AttrMap *part_attmap = NULL; + bool found_whole_row; + + if (node->withCheckOptionLists != NIL) + { + List *wcoList; + List *wcoExprs = NIL; + + /* There should be as many WCO lists as result rels */ + Assert(list_length(node->withCheckOptionLists) == + list_length(node->resultRelations)); + + /* + * Use the first WCO list as a reference. In the most common case, + * this will be for the same relation as rootRelInfo, and so there + * will be no need to adjust its attno's. + */ + wcoList = linitial(node->withCheckOptionLists); + if (rootRelation != firstResultRel) + { + /* Convert any Vars in it to contain the root's attno's */ + part_attmap = + build_attrmap_by_name(RelationGetDescr(rootRelation), + RelationGetDescr(firstResultRel), + false); + + wcoList = (List *) + map_variable_attnos((Node *) wcoList, + firstVarno, 0, + part_attmap, + RelationGetForm(rootRelation)->reltype, + &found_whole_row); + } + + foreach(lc, wcoList) + { + WithCheckOption *wco = lfirst_node(WithCheckOption, lc); + ExprState *wcoExpr = ExecInitQual(castNode(List, wco->qual), + &mtstate->ps); + + wcoExprs = lappend(wcoExprs, wcoExpr); + } + + rootRelInfo->ri_WithCheckOptions = wcoList; + rootRelInfo->ri_WithCheckOptionExprs = wcoExprs; + } + + if (node->returningLists != NIL) + { + List *returningList; + + /* There should be as many returning lists as result rels */ + Assert(list_length(node->returningLists) == + list_length(node->resultRelations)); + + /* + * Use the first returning list as a reference. In the most common + * case, this will be for the same relation as rootRelInfo, and so + * there will be no need to adjust its attno's. + */ + returningList = linitial(node->returningLists); + if (rootRelation != firstResultRel) + { + /* Convert any Vars in it to contain the root's attno's */ + if (part_attmap == NULL) + part_attmap = + build_attrmap_by_name(RelationGetDescr(rootRelation), + RelationGetDescr(firstResultRel), + false); + + returningList = (List *) + map_variable_attnos((Node *) returningList, + firstVarno, 0, + part_attmap, + RelationGetForm(rootRelation)->reltype, + &found_whole_row); + } + rootRelInfo->ri_returningList = returningList; + + /* Initialize the RETURNING projection */ + rootRelInfo->ri_projectReturning = + ExecBuildProjectionInfo(returningList, econtext, + mtstate->ps.ps_ResultTupleSlot, + &mtstate->ps, + RelationGetDescr(rootRelation)); + } + } } /* diff --git a/src/backend/jit/llvm/Makefile b/src/backend/jit/llvm/Makefile index e9fd195cc227c..10c7d719902c9 100644 --- a/src/backend/jit/llvm/Makefile +++ b/src/backend/jit/llvm/Makefile @@ -31,7 +31,7 @@ endif # All files in this directory use LLVM. CFLAGS += $(LLVM_CFLAGS) CXXFLAGS += $(LLVM_CXXFLAGS) -override CPPFLAGS := $(LLVM_CPPFLAGS) $(CPPFLAGS) +override CPPFLAGS += $(LLVM_CPPFLAGS) SHLIB_LINK += $(LLVM_LIBS) # Because this module includes C++ files, we need to use a C++ diff --git a/src/backend/libpq/auth.c b/src/backend/libpq/auth.c index 2b607c52704ca..e0576f801d85d 100644 --- a/src/backend/libpq/auth.c +++ b/src/backend/libpq/auth.c @@ -93,8 +93,16 @@ static int auth_peer(hbaPort *port); #define PGSQL_PAM_SERVICE "postgresql" /* Service name passed to PAM */ +/* Work around original Solaris' lack of "const" in the conv_proc signature */ +#ifdef _PAM_LEGACY_NONCONST +#define PG_PAM_CONST +#else +#define PG_PAM_CONST const +#endif + static int CheckPAMAuth(Port *port, const char *user, const char *password); -static int pam_passwd_conv_proc(int num_msg, const struct pam_message **msg, +static int pam_passwd_conv_proc(int num_msg, + PG_PAM_CONST struct pam_message **msg, struct pam_response **resp, void *appdata_ptr); static struct pam_conv pam_passw_conv = { @@ -1919,7 +1927,7 @@ auth_peer(hbaPort *port) */ static int -pam_passwd_conv_proc(int num_msg, const struct pam_message **msg, +pam_passwd_conv_proc(int num_msg, PG_PAM_CONST struct pam_message **msg, struct pam_response **resp, void *appdata_ptr) { const char *passwd; diff --git a/src/backend/libpq/be-secure-gssapi.c b/src/backend/libpq/be-secure-gssapi.c index bc04e78abba14..dfc1b756d253f 100644 --- a/src/backend/libpq/be-secure-gssapi.c +++ b/src/backend/libpq/be-secure-gssapi.c @@ -45,11 +45,18 @@ * don't want the other side to send arbitrarily huge packets as we * would have to allocate memory for them to then pass them to GSSAPI. * - * Therefore, these two #define's are effectively part of the protocol + * Therefore, this #define is effectively part of the protocol * spec and can't ever be changed. */ -#define PQ_GSS_SEND_BUFFER_SIZE 16384 -#define PQ_GSS_RECV_BUFFER_SIZE 16384 +#define PQ_GSS_MAX_PACKET_SIZE 16384 /* includes uint32 header word */ + +/* + * However, during the authentication exchange we must cope with whatever + * message size the GSSAPI library wants to send (because our protocol + * doesn't support splitting those messages). Depending on configuration + * those messages might be as much as 64kB. + */ +#define PQ_GSS_AUTH_BUFFER_SIZE 65536 /* includes uint32 header word */ /* * Since we manage at most one GSS-encrypted connection per backend, @@ -113,9 +120,9 @@ be_gssapi_write(Port *port, void *ptr, size_t len) * 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, + * we've successfully sent any encrypted packets. However, doing that + * expands the state space of this processing and has been responsible for + * bugs in the past (cf. commit d053a879b). We won't save much, * typically, by letting callers discard data early, so don't risk it. */ if (len < PqGSSSendConsumed) @@ -209,12 +216,12 @@ be_gssapi_write(Port *port, void *ptr, size_t len) errno = ECONNRESET; return -1; } - if (output.length > PQ_GSS_SEND_BUFFER_SIZE - sizeof(uint32)) + if (output.length > PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32)) { ereport(COMMERROR, (errmsg("server tried to send oversize GSSAPI packet (%zu > %zu)", (size_t) output.length, - PQ_GSS_SEND_BUFFER_SIZE - sizeof(uint32)))); + PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32)))); errno = ECONNRESET; return -1; } @@ -345,12 +352,12 @@ be_gssapi_read(Port *port, void *ptr, size_t len) /* Decode the packet length and check for overlength packet */ input.length = pg_ntoh32(*(uint32 *) PqGSSRecvBuffer); - if (input.length > PQ_GSS_RECV_BUFFER_SIZE - sizeof(uint32)) + if (input.length > PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32)) { ereport(COMMERROR, (errmsg("oversize GSSAPI packet sent by the client (%zu > %zu)", (size_t) input.length, - PQ_GSS_RECV_BUFFER_SIZE - sizeof(uint32)))); + PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32)))); errno = ECONNRESET; return -1; } @@ -514,10 +521,13 @@ secure_open_gssapi(Port *port) * that will never use them, and we ensure that the buffers are * sufficiently aligned for the length-word accesses that we do in some * places in this file. + * + * We'll use PQ_GSS_AUTH_BUFFER_SIZE-sized buffers until transport + * negotiation is complete, then switch to PQ_GSS_MAX_PACKET_SIZE. */ - PqGSSSendBuffer = malloc(PQ_GSS_SEND_BUFFER_SIZE); - PqGSSRecvBuffer = malloc(PQ_GSS_RECV_BUFFER_SIZE); - PqGSSResultBuffer = malloc(PQ_GSS_RECV_BUFFER_SIZE); + PqGSSSendBuffer = malloc(PQ_GSS_AUTH_BUFFER_SIZE); + PqGSSRecvBuffer = malloc(PQ_GSS_AUTH_BUFFER_SIZE); + PqGSSResultBuffer = malloc(PQ_GSS_AUTH_BUFFER_SIZE); if (!PqGSSSendBuffer || !PqGSSRecvBuffer || !PqGSSResultBuffer) ereport(FATAL, (errcode(ERRCODE_OUT_OF_MEMORY), @@ -565,16 +575,16 @@ secure_open_gssapi(Port *port) /* * During initialization, packets are always fully consumed and - * shouldn't ever be over PQ_GSS_RECV_BUFFER_SIZE in length. + * shouldn't ever be over PQ_GSS_AUTH_BUFFER_SIZE in total length. * * Verify on our side that the client doesn't do something funny. */ - if (input.length > PQ_GSS_RECV_BUFFER_SIZE) + if (input.length > PQ_GSS_AUTH_BUFFER_SIZE - sizeof(uint32)) { ereport(COMMERROR, - (errmsg("oversize GSSAPI packet sent by the client (%zu > %d)", + (errmsg("oversize GSSAPI packet sent by the client (%zu > %zu)", (size_t) input.length, - PQ_GSS_RECV_BUFFER_SIZE))); + PQ_GSS_AUTH_BUFFER_SIZE - sizeof(uint32)))); return -1; } @@ -628,12 +638,12 @@ secure_open_gssapi(Port *port) { uint32 netlen = pg_hton32(output.length); - if (output.length > PQ_GSS_SEND_BUFFER_SIZE - sizeof(uint32)) + if (output.length > PQ_GSS_AUTH_BUFFER_SIZE - sizeof(uint32)) { ereport(COMMERROR, (errmsg("server tried to send oversize GSSAPI packet (%zu > %zu)", (size_t) output.length, - PQ_GSS_SEND_BUFFER_SIZE - sizeof(uint32)))); + PQ_GSS_AUTH_BUFFER_SIZE - sizeof(uint32)))); gss_release_buffer(&minor, &output); return -1; } @@ -688,12 +698,29 @@ secure_open_gssapi(Port *port) break; } + /* + * Release the large authentication buffers and allocate the ones we want + * for normal operation. + */ + free(PqGSSSendBuffer); + free(PqGSSRecvBuffer); + free(PqGSSResultBuffer); + PqGSSSendBuffer = malloc(PQ_GSS_MAX_PACKET_SIZE); + PqGSSRecvBuffer = malloc(PQ_GSS_MAX_PACKET_SIZE); + PqGSSResultBuffer = malloc(PQ_GSS_MAX_PACKET_SIZE); + if (!PqGSSSendBuffer || !PqGSSRecvBuffer || !PqGSSResultBuffer) + ereport(FATAL, + (errcode(ERRCODE_OUT_OF_MEMORY), + errmsg("out of memory"))); + PqGSSSendLength = PqGSSSendNext = PqGSSSendConsumed = 0; + PqGSSRecvLength = PqGSSResultLength = PqGSSResultNext = 0; + /* * Determine the max packet size which will fit in our buffer, after * accounting for the length. be_gssapi_write will need this. */ major = gss_wrap_size_limit(&minor, port->gss->ctx, 1, GSS_C_QOP_DEFAULT, - PQ_GSS_SEND_BUFFER_SIZE - sizeof(uint32), + PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32), &PqGSSMaxPktSize); if (GSS_ERROR(major)) diff --git a/src/backend/nodes/makefuncs.c b/src/backend/nodes/makefuncs.c index 61ac172a85748..9f3b4f200fb0c 100644 --- a/src/backend/nodes/makefuncs.c +++ b/src/backend/nodes/makefuncs.c @@ -159,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: /* @@ -215,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.) */ diff --git a/src/backend/optimizer/path/joinrels.c b/src/backend/optimizer/path/joinrels.c index db475e25b15b6..d4c5738e965a0 100644 --- a/src/backend/optimizer/path/joinrels.c +++ b/src/backend/optimizer/path/joinrels.c @@ -45,7 +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 *sjinfo); +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, @@ -1677,7 +1678,7 @@ try_partitionwise_join(PlannerInfo *root, RelOptInfo *rel1, RelOptInfo *rel2, child_restrictlist); pfree(appinfos); - free_child_join_sjinfo(child_sjinfo); + free_child_join_sjinfo(child_sjinfo, parent_sjinfo); } } @@ -1744,18 +1745,33 @@ build_child_join_sjinfo(PlannerInfo *root, SpecialJoinInfo *parent_sjinfo, * SpecialJoinInfo are freed here. */ static void -free_child_join_sjinfo(SpecialJoinInfo *sjinfo) +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 (sjinfo->jointype != JOIN_INNER) + if (child_sjinfo->jointype != JOIN_INNER) { - bms_free(sjinfo->min_lefthand); - bms_free(sjinfo->min_righthand); - bms_free(sjinfo->syn_lefthand); - bms_free(sjinfo->syn_righthand); + 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 @@ -1763,7 +1779,7 @@ free_child_join_sjinfo(SpecialJoinInfo *sjinfo) */ } - pfree(sjinfo); + pfree(child_sjinfo); } /* diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index c0af10ebd34c3..25e126d1c3963 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -7038,6 +7038,8 @@ make_modifytable(PlannerInfo *root, Plan *subplan, int epqParam) { ModifyTable *node = makeNode(ModifyTable); + bool transition_tables = false; + bool transition_tables_valid = false; List *fdw_private_list; Bitmapset *direct_modify_plans; ListCell *lc; @@ -7182,7 +7184,7 @@ make_modifytable(PlannerInfo *root, Plan *subplan, * callback functions needed for that and (2) there are no local * structures that need to be run for each modified row: row-level * triggers on the foreign table, stored generated columns, WITH CHECK - * OPTIONs from parent views. + * OPTIONs from parent views, transition tables on the named relation. */ direct_modify = false; if (fdwroutine != NULL && @@ -7193,7 +7195,19 @@ make_modifytable(PlannerInfo *root, Plan *subplan, withCheckOptionLists == NIL && !has_row_triggers(root, rti, operation) && !has_stored_generated_columns(root, rti)) - direct_modify = fdwroutine->PlanDirectModify(root, node, rti, i); + { + /* transition_tables is the same for all result relations */ + if (!transition_tables_valid) + { + transition_tables = has_transition_tables(root, + nominalRelation, + operation); + transition_tables_valid = true; + } + if (!transition_tables) + direct_modify = fdwroutine->PlanDirectModify(root, node, + rti, i); + } if (direct_modify) direct_modify_plans = bms_add_member(direct_modify_plans, i); diff --git a/src/backend/optimizer/plan/initsplan.c b/src/backend/optimizer/plan/initsplan.c index cd0ce25bd8694..0d748973a4eb2 100644 --- a/src/backend/optimizer/plan/initsplan.c +++ b/src/backend/optimizer/plan/initsplan.c @@ -2740,6 +2740,15 @@ 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)) { @@ -2749,6 +2758,13 @@ restriction_is_always_true(PlannerInfo *root, 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); } @@ -2789,6 +2805,15 @@ 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)) { @@ -2798,6 +2823,13 @@ restriction_is_always_false(PlannerInfo *root, 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); } diff --git a/src/backend/optimizer/plan/planner.c b/src/backend/optimizer/plan/planner.c index 6eeeb0e1d03c6..5e2af9808f694 100644 --- a/src/backend/optimizer/plan/planner.c +++ b/src/backend/optimizer/plan/planner.c @@ -58,6 +58,7 @@ #include "parser/parse_relation.h" #include "parser/parsetree.h" #include "partitioning/partdesc.h" +#include "utils/acl.h" #include "utils/lsyscache.h" #include "utils/rel.h" #include "utils/selfuncs.h" @@ -813,6 +814,38 @@ subquery_planner(PlannerGlobal *glob, Query *parse, PlannerInfo *parent_root, bms_make_singleton(parse->resultRelation); } + /* + * This would be a convenient time to check access permissions for all + * relations mentioned in the query, since it would be better to fail now, + * before doing any detailed planning. However, for historical reasons, + * we leave this to be done at executor startup. + * + * Note, however, that we do need to check access permissions for any view + * relations mentioned in the query, in order to prevent information being + * leaked by selectivity estimation functions, which only check view owner + * permissions on underlying tables (see all_rows_selectable() and its + * callers). This is a little ugly, because it means that access + * permissions for views will be checked twice, which is another reason + * why it would be better to do all the ACL checks here. + */ + foreach(l, parse->rtable) + { + RangeTblEntry *rte = lfirst_node(RangeTblEntry, l); + + if (rte->perminfoindex != 0 && + rte->relkind == RELKIND_VIEW) + { + RTEPermissionInfo *perminfo; + bool result; + + perminfo = getRTEPermissionInfo(parse->rteperminfos, rte); + result = ExecCheckOneRelPerms(perminfo); + if (!result) + aclcheck_error(ACLCHECK_NO_PRIV, OBJECT_VIEW, + get_rel_name(perminfo->relid)); + } + } + /* * Preprocess RowMark information. We need to do this after subquery * pullup, so that all base relations are present. @@ -3280,10 +3313,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)); } /* diff --git a/src/backend/optimizer/prep/prepjointree.c b/src/backend/optimizer/prep/prepjointree.c index e7e8c1499f297..2c6faad4daefe 100644 --- a/src/backend/optimizer/prep/prepjointree.c +++ b/src/backend/optimizer/prep/prepjointree.c @@ -908,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; } } diff --git a/src/backend/optimizer/prep/preptlist.c b/src/backend/optimizer/prep/preptlist.c index 72426765d3fe0..35358b085d506 100644 --- a/src/backend/optimizer/prep/preptlist.c +++ b/src/backend/optimizer/prep/preptlist.c @@ -44,6 +44,7 @@ #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(PlannerInfo *root, List *tlist, @@ -419,9 +420,8 @@ expand_insert_targetlist(PlannerInfo *root, 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 @@ -431,21 +431,17 @@ expand_insert_targetlist(PlannerInfo *root, 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. */ Node *new_expr; - if (!att_tup->attisdropped) - { - 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); - } - else + if (att_tup->attisdropped) { /* Insert NULL for dropped column */ new_expr = (Node *) makeConst(INT4OID, @@ -456,6 +452,33 @@ expand_insert_targetlist(PlannerInfo *root, 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/util/clauses.c b/src/backend/optimizer/util/clauses.c index 8e39795e24509..2a599f84086fc 100644 --- a/src/backend/optimizer/util/clauses.c +++ b/src/backend/optimizer/util/clauses.c @@ -2326,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 */ @@ -2364,7 +2364,7 @@ convert_saop_to_hashed_saop_walker(Node *node, void *context) */ saop->negfuncid = get_opcode(negator); } - return true; + return false; } } } diff --git a/src/backend/optimizer/util/plancat.c b/src/backend/optimizer/util/plancat.c index 86655f05dc8d6..ac82a021e977c 100644 --- a/src/backend/optimizer/util/plancat.c +++ b/src/backend/optimizer/util/plancat.c @@ -2281,6 +2281,60 @@ has_row_triggers(PlannerInfo *root, Index rti, CmdType event) return result; } +/* + * has_transition_tables + * + * Detect whether the specified relation has any transition tables for event. + */ +bool +has_transition_tables(PlannerInfo *root, Index rti, CmdType event) +{ + RangeTblEntry *rte = planner_rt_fetch(rti, root); + Relation relation; + TriggerDesc *trigDesc; + bool result = false; + + Assert(rte->rtekind == RTE_RELATION); + + /* Currently foreign tables cannot have transition tables */ + if (rte->relkind == RELKIND_FOREIGN_TABLE) + return result; + + /* Assume we already have adequate lock */ + relation = table_open(rte->relid, NoLock); + + trigDesc = relation->trigdesc; + switch (event) + { + case CMD_INSERT: + if (trigDesc && + trigDesc->trig_insert_new_table) + result = true; + break; + case CMD_UPDATE: + if (trigDesc && + (trigDesc->trig_update_old_table || + trigDesc->trig_update_new_table)) + result = true; + break; + case CMD_DELETE: + if (trigDesc && + trigDesc->trig_delete_old_table) + result = true; + break; + /* There is no separate event for MERGE, only INSERT/UPDATE/DELETE */ + case CMD_MERGE: + result = false; + break; + default: + elog(ERROR, "unrecognized CmdType: %d", (int) event); + break; + } + + table_close(relation, NoLock); + return result; +} + /* * has_stored_generated_columns * diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index bca627c5463e2..f230c5ff9e76c 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -2649,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); @@ -14048,7 +14048,7 @@ xmltable_column_el: parser_errposition(defel->location))); fc->colexpr = defel->arg; } - else if (strcmp(defel->defname, "is_not_null") == 0) + else if (strcmp(defel->defname, "__pg__is_not_null") == 0) { if (nullability_seen) ereport(ERROR, @@ -14091,13 +14091,20 @@ xmltable_column_option_list: xmltable_column_option_el: IDENT b_expr - { $$ = makeDefElem($1, $2, @1); } + { + if (strcmp($1, "__pg__is_not_null") == 0) + ereport(ERROR, + (errcode(ERRCODE_SYNTAX_ERROR), + errmsg("option name \"%s\" cannot be used in XMLTABLE", $1), + parser_errposition(@1))); + $$ = makeDefElem($1, $2, @1); + } | DEFAULT b_expr { $$ = makeDefElem("default", $2, @1); } | NOT NULL_P - { $$ = makeDefElem("is_not_null", (Node *) makeBoolean(true), @1); } + { $$ = makeDefElem("__pg__is_not_null", (Node *) makeBoolean(true), @1); } | NULL_P - { $$ = makeDefElem("is_not_null", (Node *) makeBoolean(false), @1); } + { $$ = makeDefElem("__pg__is_not_null", (Node *) makeBoolean(false), @1); } | PATH b_expr { $$ = makeDefElem("path", $2, @1); } ; diff --git a/src/backend/parser/parse_agg.c b/src/backend/parser/parse_agg.c index b15d9b152ef0f..be88909da222d 100644 --- a/src/backend/parser/parse_agg.c +++ b/src/backend/parser/parse_agg.c @@ -1961,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 @@ -1976,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_cte.c b/src/backend/parser/parse_cte.c index de9ae9b48348d..6ad9259823dd0 100644 --- a/src/backend/parser/parse_cte.c +++ b/src/backend/parser/parse_cte.c @@ -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 */ @@ -725,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 @@ -790,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 */ diff --git a/src/backend/parser/parse_expr.c b/src/backend/parser/parse_expr.c index 3905dd36340e0..8423542021f30 100644 --- a/src/backend/parser/parse_expr.c +++ b/src/backend/parser/parse_expr.c @@ -2055,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); @@ -3756,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, diff --git a/src/backend/po/de.po b/src/backend/po/de.po index 45cb4b8564e2e..06d6a4cd14e66 100644 --- a/src/backend/po/de.po +++ b/src/backend/po/de.po @@ -1,5 +1,5 @@ # German message translation file for PostgreSQL server -# Peter Eisentraut , 2001 - 2024. +# Peter Eisentraut , 2001 - 2025. # # Use these quotes: »%s« # @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-02-06 20:11+0000\n" -"PO-Revision-Date: 2025-02-07 09:07+0100\n" +"POT-Creation-Date: 2025-08-08 02:00+0000\n" +"PO-Revision-Date: 2025-08-08 08:29+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -88,15 +88,15 @@ msgstr "konnte Datei »%s« nicht zum Lesen öffnen: %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:1353 access/transam/xlog.c:3477 -#: access/transam/xlog.c:4341 access/transam/xlogrecovery.c:1238 +#: access/transam/twophase.c:1353 access/transam/xlog.c:3459 +#: access/transam/xlog.c:4323 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 +#: replication/logical/reorderbuffer.c:5243 +#: replication/logical/snapbuild.c:2099 replication/slot.c:2232 +#: replication/slot.c:2273 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 @@ -104,10 +104,10 @@ msgid "could not read file \"%s\": %m" msgstr "konnte Datei »%s« nicht lesen: %m" #: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 -#: access/transam/xlog.c:3482 access/transam/xlog.c:4346 +#: access/transam/xlog.c:3464 access/transam/xlog.c:4328 #: 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 +#: replication/logical/snapbuild.c:2104 replication/slot.c:2236 +#: replication/slot.c:2277 replication/walsender.c:664 #: utils/cache/relmapper.c:833 #, c-format msgid "could not read file \"%s\": read %d of %zu" @@ -118,17 +118,17 @@ msgstr "konnte Datei »%s« nicht lesen: %d von %zu gelesen" #: 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 +#: access/transam/twophase.c:1784 access/transam/xlog.c:3305 +#: access/transam/xlog.c:3499 access/transam/xlog.c:3504 +#: access/transam/xlog.c:3640 access/transam/xlog.c:4293 +#: access/transam/xlog.c:5228 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 +#: replication/logical/reorderbuffer.c:5295 +#: replication/logical/snapbuild.c:1866 replication/logical/snapbuild.c:1990 +#: replication/slot.c:2122 replication/slot.c:2284 replication/walsender.c:674 +#: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:825 +#: storage/file/fd.c:3750 storage/file/fd.c:3856 utils/cache/relmapper.c:841 #: utils/cache/relmapper.c:956 #, c-format msgid "could not close file \"%s\": %m" @@ -157,31 +157,31 @@ msgstr "" #: ../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/twophase.c:1309 access/transam/xlog.c:3212 +#: access/transam/xlog.c:3375 access/transam/xlog.c:3414 +#: access/transam/xlog.c:3607 access/transam/xlog.c:4313 #: 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 +#: replication/logical/reorderbuffer.c:3896 +#: replication/logical/reorderbuffer.c:4450 +#: replication/logical/reorderbuffer.c:5223 +#: replication/logical/snapbuild.c:1821 replication/logical/snapbuild.c:1931 +#: replication/slot.c:2204 replication/walsender.c:632 +#: replication/walsender.c:3085 storage/file/copydir.c:151 +#: storage/file/fd.c:800 storage/file/fd.c:3507 storage/file/fd.c:3737 +#: storage/file/fd.c:3827 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 +#: utils/init/miscinit.c:1791 utils/misc/guc.c:4782 utils/misc/guc.c:4832 #, c-format msgid "could not open file \"%s\": %m" msgstr "konnte Datei »%s« nicht öffnen: %m" #: ../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 +#: access/transam/xlog.c:9306 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 @@ -195,12 +195,12 @@ msgstr "konnte Datei »%s« nicht schreiben: %m" #: 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 +#: access/transam/xlog.c:3298 access/transam/xlog.c:3493 +#: access/transam/xlog.c:4286 access/transam/xlog.c:8681 +#: access/transam/xlog.c:8726 backup/basebackup_server.c:207 +#: commands/dbcommands.c:514 replication/logical/snapbuild.c:1859 +#: replication/slot.c:2108 replication/slot.c:2214 storage/file/fd.c:817 +#: storage/file/fd.c:3848 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" @@ -214,21 +214,22 @@ msgstr "konnte Datei »%s« nicht fsyncen: %m" #: ../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 +#: access/transam/xlogrecovery.c:564 lib/dshash.c:253 libpq/auth.c:1360 +#: libpq/auth.c:1404 libpq/auth.c:1961 libpq/be-secure-gssapi.c:534 +#: libpq/be-secure-gssapi.c:714 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 +#: replication/logical/logical.c:212 replication/walsender.c:839 +#: storage/buffer/localbuf.c:606 storage/file/fd.c:909 storage/file/fd.c:1440 +#: storage/file/fd.c:1601 storage/file/fd.c:2528 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/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 @@ -312,7 +313,7 @@ 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 storage/file/fd.c:3516 +#: ../common/file_utils.c:76 storage/file/fd.c:3513 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" @@ -324,8 +325,8 @@ msgstr "konnte Dateisystem für Datei »%s« nicht synchronisieren: %m" #: 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 +#: replication/logical/snapbuild.c:1717 replication/logical/snapbuild.c:2220 +#: storage/file/fd.c:1965 storage/file/fd.c:2051 storage/file/fd.c:3561 #: 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 @@ -340,22 +341,22 @@ 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 +#: storage/file/fd.c:2930 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:169 ../common/file_utils.c:315 -#: ../common/pgfnames.c:69 ../common/rmtree.c:106 storage/file/fd.c:2945 +#: ../common/pgfnames.c:69 ../common/rmtree.c:106 storage/file/fd.c:2942 #, c-format msgid "could not read directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht lesen: %m" #: ../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 +#: replication/logical/snapbuild.c:1878 replication/slot.c:936 +#: replication/slot.c:1994 replication/slot.c:2136 storage/file/fd.c:835 #: utils/time/snapmgr.c:1255 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" @@ -365,101 +366,101 @@ msgstr "konnte Datei »%s« nicht in »%s« umbenennen: %m" msgid "internal error" msgstr "interner Fehler" -#: ../common/jsonapi.c:2121 +#: ../common/jsonapi.c:2124 msgid "Recursive descent parser cannot use incremental lexer." msgstr "Parser mit rekursivem Abstieg kann inkrementellen Lexer nicht benutzen." -#: ../common/jsonapi.c:2123 +#: ../common/jsonapi.c:2126 msgid "Incremental parser requires incremental lexer." msgstr "Inkrementeller Parser benötigt inkrementellen Lexer." -#: ../common/jsonapi.c:2125 +#: ../common/jsonapi.c:2128 msgid "JSON nested too deep, maximum permitted depth is 6400." msgstr "JSON zu tief geschachtelt, maximale erlaubte Tiefe ist 6400." -#: ../common/jsonapi.c:2127 +#: ../common/jsonapi.c:2130 #, c-format msgid "Escape sequence \"\\%.*s\" is invalid." msgstr "Escape-Sequenz »\\%.*s« ist nicht gültig." -#: ../common/jsonapi.c:2131 +#: ../common/jsonapi.c:2134 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Zeichen mit Wert 0x%02x muss escapt werden." -#: ../common/jsonapi.c:2135 +#: ../common/jsonapi.c:2138 #, c-format msgid "Expected end of input, but found \"%.*s\"." msgstr "Ende der Eingabe erwartet, aber »%.*s« gefunden." -#: ../common/jsonapi.c:2138 +#: ../common/jsonapi.c:2141 #, c-format msgid "Expected array element or \"]\", but found \"%.*s\"." msgstr "Array-Element oder »]« erwartet, aber »%.*s« gefunden." -#: ../common/jsonapi.c:2141 +#: ../common/jsonapi.c:2144 #, c-format msgid "Expected \",\" or \"]\", but found \"%.*s\"." msgstr "»,« oder »]« erwartet, aber »%.*s« gefunden." -#: ../common/jsonapi.c:2144 +#: ../common/jsonapi.c:2147 #, c-format msgid "Expected \":\", but found \"%.*s\"." msgstr "»:« erwartet, aber »%.*s« gefunden." -#: ../common/jsonapi.c:2147 +#: ../common/jsonapi.c:2150 #, c-format msgid "Expected JSON value, but found \"%.*s\"." msgstr "JSON-Wert erwartet, aber »%.*s« gefunden." -#: ../common/jsonapi.c:2150 +#: ../common/jsonapi.c:2153 msgid "The input string ended unexpectedly." msgstr "Die Eingabezeichenkette endete unerwartet." -#: ../common/jsonapi.c:2152 +#: ../common/jsonapi.c:2155 #, c-format msgid "Expected string or \"}\", but found \"%.*s\"." msgstr "Zeichenkette oder »}« erwartet, aber »%.*s« gefunden." -#: ../common/jsonapi.c:2155 +#: ../common/jsonapi.c:2158 #, c-format msgid "Expected \",\" or \"}\", but found \"%.*s\"." msgstr "»,« oder »}« erwartet, aber »%.*s« gefunden." -#: ../common/jsonapi.c:2158 +#: ../common/jsonapi.c:2161 #, c-format msgid "Expected string, but found \"%.*s\"." msgstr "Zeichenkette erwartet, aber »%.*s« gefunden." -#: ../common/jsonapi.c:2161 +#: ../common/jsonapi.c:2164 #, c-format msgid "Token \"%.*s\" is invalid." msgstr "Token »%.*s« ist ungültig." -#: ../common/jsonapi.c:2164 jsonpath_scan.l:608 +#: ../common/jsonapi.c:2167 jsonpath_scan.l:608 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 kann nicht in »text« umgewandelt werden." -#: ../common/jsonapi.c:2166 +#: ../common/jsonapi.c:2169 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "Nach »\\u« müssen vier Hexadezimalziffern folgen." -#: ../common/jsonapi.c:2169 +#: ../common/jsonapi.c:2172 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 +#: ../common/jsonapi.c:2181 #, 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 jsonpath_scan.l:641 +#: ../common/jsonapi.c:2188 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:2187 jsonpath_scan.l:652 jsonpath_scan.l:662 +#: ../common/jsonapi.c:2190 jsonpath_scan.l:652 jsonpath_scan.l:662 #: jsonpath_scan.l:713 #, c-format msgid "Unicode low surrogate must follow a high surrogate." @@ -645,8 +646,8 @@ msgstr "konnte Backup-Manifest nicht parsen: %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 +#: utils/misc/guc.c:3283 utils/misc/guc.c:4712 utils/misc/guc.c:6942 +#: utils/misc/guc.c:6983 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "ungültiger Wert für Parameter »%s«: »%s«" @@ -710,10 +711,10 @@ msgstr "konnte Statuscode des Subprozesses nicht ermitteln: Fehlercode %lu" #: 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 +#: replication/logical/reorderbuffer.c:4719 +#: replication/logical/snapbuild.c:1759 replication/logical/snapbuild.c:2193 +#: replication/slot.c:2188 storage/file/fd.c:875 storage/file/fd.c:3375 +#: storage/file/fd.c:3437 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 @@ -721,8 +722,8 @@ msgid "could not remove file \"%s\": %m" msgstr "konnte Datei »%s« nicht löschen: %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 +#: commands/tablespace.c:815 commands/tablespace.c:905 storage/file/fd.c:3367 +#: storage/file/fd.c:3776 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "konnte Verzeichnis »%s« nicht löschen: %m" @@ -760,7 +761,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:1888 +#: ../common/username.c:45 libpq/auth.c:1896 msgid "user does not exist" msgstr "Benutzer existiert nicht" @@ -892,7 +893,7 @@ msgstr "konnte Access-Token-Mitgliedschaft nicht prüfen: Fehlercode %lu\n" 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:1385 access/brin/brin.c:1493 access/gin/ginfast.c:1040 +#: 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 @@ -901,34 +902,34 @@ msgstr "Aufforderung für BRIN-Range-Summarization für Index »%s« Seite %u wu msgid "recovery is in progress" msgstr "Wiederherstellung läuft" -#: access/brin/brin.c:1386 access/brin/brin.c:1494 +#: 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:1391 access/brin/brin.c:1499 +#: 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:1436 access/brin/brin.c:1525 +#: 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:1452 access/brin/brin.c:1541 +#: 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.c:1461 access/brin/brin.c:1557 access/gin/ginfast.c:1085 +#: access/brin/brin.c:1463 access/brin/brin.c:1559 access/gin/ginfast.c:1085 #: parser/parse_utilcmd.c:2277 #, c-format msgid "index \"%s\" is not valid" msgstr "Index »%s« ist nicht gültig" -#: 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 +#: 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 @@ -939,7 +940,7 @@ msgstr "kann keinen Wert vom Typ %s annehmen" #: 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/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\"" @@ -1077,67 +1078,72 @@ msgstr "Wertebereich des Typs für benutzerdefinierte Relationsparameter übersc msgid "RESET must not include values for parameters" msgstr "RESET darf keinen Parameterwert enthalten" -#: access/common/reloptions.c:1263 +#: access/common/reloptions.c:1264 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "unbekannter Parameter-Namensraum »%s«" -#: access/common/reloptions.c:1300 commands/variable.c:1214 +#: access/common/reloptions.c:1294 commands/foreigncmds.c:86 +#, c-format +msgid "invalid option name \"%s\": must not contain \"=\"" +msgstr "ungültiger Optionsname »%s«: darf nicht »=« enthalten" + +#: access/common/reloptions.c:1309 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:1468 +#: access/common/reloptions.c:1477 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "unbekannter Parameter »%s«" -#: access/common/reloptions.c:1580 +#: access/common/reloptions.c:1589 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "Parameter »%s« mehrmals angegeben" -#: access/common/reloptions.c:1596 +#: access/common/reloptions.c:1605 #, 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:1608 +#: access/common/reloptions.c:1617 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "ungültiger Wert für ganzzahlige Option »%s«: »%s«" -#: access/common/reloptions.c:1614 access/common/reloptions.c:1634 +#: access/common/reloptions.c:1623 access/common/reloptions.c:1643 #, 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:1616 +#: access/common/reloptions.c:1625 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "Gültige Werte sind zwischen »%d« und »%d«." -#: access/common/reloptions.c:1628 +#: access/common/reloptions.c:1637 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "ungültiger Wert für Gleitkommaoption »%s«: »%s«" -#: access/common/reloptions.c:1636 +#: access/common/reloptions.c:1645 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "Gültige Werte sind zwischen »%f« und »%f«." -#: access/common/reloptions.c:1658 +#: access/common/reloptions.c:1667 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "ungültiger Wert für Enum-Option »%s«: »%s«" -#: access/common/reloptions.c:1989 +#: access/common/reloptions.c:1998 #, 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:1990 +#: access/common/reloptions.c:1999 #, c-format msgid "Specify storage parameters for its leaf partitions instead." msgstr "Geben Sie Storage-Parameter stattdessen für ihre Blattpartitionen an." @@ -1182,18 +1188,18 @@ 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:147 executor/execExpr.c:2200 -#: utils/adt/arrayfuncs.c:4016 utils/adt/arrayfuncs.c:6712 +#: 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" @@ -1235,7 +1241,7 @@ msgstr "Das kommt von einem unvollständigen Page-Split bei der Crash-Recovery v msgid "Please REINDEX it." msgstr "Bitte führen Sie REINDEX für den Index aus." -#: access/gist/gist.c:1196 +#: 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" @@ -1278,9 +1284,9 @@ msgstr "Operatorfamilie »%s« für Zugriffsmethode %s enthält ungültige ORDER 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: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 +#: 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:18242 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 @@ -1335,39 +1341,39 @@ 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:2206 +#: access/heap/heapam.c:2241 #, 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:2725 +#: access/heap/heapam.c:2764 #, 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:2772 +#: access/heap/heapam.c:2811 #, c-format msgid "attempted to delete invisible tuple" msgstr "Versuch ein unsichtbares Tupel zu löschen" -#: access/heap/heapam.c:3220 access/heap/heapam.c:6501 access/index/genam.c:818 +#: access/heap/heapam.c:3261 access/heap/heapam.c:6542 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:3397 +#: access/heap/heapam.c:3438 #, c-format msgid "attempted to update invisible tuple" msgstr "Versuch ein unsichtbares Tupel zu aktualisieren" -#: access/heap/heapam.c:4908 access/heap/heapam.c:4946 -#: access/heap/heapam.c:5211 access/heap/heapam_handler.c:468 +#: access/heap/heapam.c:4949 access/heap/heapam.c:4987 +#: access/heap/heapam.c:5252 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.c:6314 commands/trigger.c:3340 -#: executor/nodeModifyTable.c:2376 executor/nodeModifyTable.c:2467 +#: access/heap/heapam.c:6355 commands/trigger.c:3425 +#: executor/nodeModifyTable.c:2399 executor/nodeModifyTable.c:2490 #, 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" @@ -1389,13 +1395,13 @@ msgstr "konnte nicht in Datei »%s« schreiben, %d von %d geschrieben: %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:3255 access/transam/xlog.c:3446 -#: access/transam/xlog.c:4283 access/transam/xlog.c:9269 +#: access/transam/xlog.c:3237 access/transam/xlog.c:3428 +#: access/transam/xlog.c:4265 access/transam/xlog.c:9295 #: 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 +#: replication/slot.c:2055 storage/file/copydir.c:157 storage/smgr/md.c:230 #: utils/time/snapmgr.c:1234 #, c-format msgid "could not create file \"%s\": %m" @@ -1408,15 +1414,15 @@ msgstr "konnte Datei »%s« nicht auf %u kürzen: %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:3305 access/transam/xlog.c:3502 -#: access/transam/xlog.c:4295 commands/dbcommands.c:506 +#: access/transam/xlog.c:3287 access/transam/xlog.c:3484 +#: access/transam/xlog.c:4277 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 +#: replication/logical/origin.c:676 replication/logical/snapbuild.c:1835 +#: replication/slot.c:2090 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/misc/guc.c:4522 utils/misc/guc.c:5680 utils/misc/guc.c:5698 #: utils/time/snapmgr.c:1239 utils/time/snapmgr.c:1246 #, c-format msgid "could not write to file \"%s\": %m" @@ -1548,22 +1554,22 @@ msgstr "WAL-Benutzung: %lld Einträge, %lld Full Page Images, %llu Bytes\n" msgid "system usage: %s" msgstr "Systembenutzung: %s" -#: access/heap/vacuumlazy.c:2170 +#: access/heap/vacuumlazy.c:2178 #, 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:2324 +#: access/heap/vacuumlazy.c:2332 #, 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:2327 +#: access/heap/vacuumlazy.c:2335 #, 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:2328 +#: access/heap/vacuumlazy.c:2336 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" @@ -1572,67 +1578,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:2590 +#: access/heap/vacuumlazy.c:2598 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "»%s«: Truncate wird gestoppt wegen Sperrkonflikt" -#: access/heap/vacuumlazy.c:2660 +#: access/heap/vacuumlazy.c:2668 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "Tabelle »%s«: von %u auf %u Seiten verkürzt" -#: access/heap/vacuumlazy.c:2722 +#: access/heap/vacuumlazy.c:2730 #, c-format msgid "table \"%s\": suspending truncate due to conflicting lock request" msgstr "Tabelle »%s«: Truncate wird ausgesetzt wegen Sperrkonflikt" -#: access/heap/vacuumlazy.c:2841 +#: access/heap/vacuumlazy.c:2849 #, 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:3108 +#: access/heap/vacuumlazy.c:3116 #, 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:3111 +#: access/heap/vacuumlazy.c:3119 #, 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:3115 +#: access/heap/vacuumlazy.c:3123 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "beim Scannen von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:3123 +#: access/heap/vacuumlazy.c:3131 #, 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:3126 +#: access/heap/vacuumlazy.c:3134 #, 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:3130 +#: access/heap/vacuumlazy.c:3138 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "beim Vacuum von Relation »%s.%s«" -#: access/heap/vacuumlazy.c:3135 commands/vacuumparallel.c:1112 +#: access/heap/vacuumlazy.c:3143 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:3140 commands/vacuumparallel.c:1118 +#: access/heap/vacuumlazy.c:3148 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:3146 +#: access/heap/vacuumlazy.c:3154 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "beim Trunkieren von Relation »%s.%s« auf %u Blöcke" @@ -1658,8 +1664,8 @@ 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:17873 commands/tablecmds.c:19762 +#: commands/indexcmds.c:2885 commands/tablecmds.c:281 commands/tablecmds.c:305 +#: commands/tablecmds.c:17937 commands/tablecmds.c:19834 #, c-format msgid "\"%s\" is not an index" msgstr "»%s« ist kein Index" @@ -1705,17 +1711,17 @@ msgstr "Index »%s« enthält eine halbtote interne Seite" 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:5108 +#: access/nbtree/nbtutils.c:5114 #, 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:5114 +#: access/nbtree/nbtutils.c:5120 #, 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:5118 +#: access/nbtree/nbtutils.c:5124 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1755,7 +1761,7 @@ 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/tableam.c:255 +#: 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«" @@ -2204,8 +2210,8 @@ 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:1419 access/transam/xlogrecovery.c:565 -#: postmaster/walsummarizer.c:936 replication/logical/logical.c:211 -#: replication/walsender.c:836 +#: postmaster/walsummarizer.c:936 replication/logical/logical.c:213 +#: replication/walsender.c:840 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Fehlgeschlagen beim Anlegen eines WAL-Leseprozessors." @@ -2282,7 +2288,7 @@ msgstr "konnte Zweiphasen-Statusdatei für Transaktion %u nicht wiederherstellen 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 +#: access/transam/twophase.c:2524 storage/file/fd.c:511 utils/fmgr/dfmgr.c:209 #, c-format msgid "could not access file \"%s\": %m" msgstr "konnte nicht auf Datei »%s« zugreifen: %m" @@ -2446,464 +2452,459 @@ msgstr "während einer parallelen Operation kann nicht auf einen Sicherungspunkt 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:1542 +#: access/transam/xlog.c:1543 #, 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 +#: access/transam/xlog.c:1770 #, 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 +#: access/transam/xlog.c:2211 access/transam/xlog.c:4483 #, 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 "\"%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 +#: access/transam/xlog.c:2459 #, 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:3739 access/transam/xlogutils.c:831 -#: replication/walsender.c:3045 +#: access/transam/xlog.c:3721 access/transam/xlogutils.c:831 +#: replication/walsender.c:3079 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "das angeforderte WAL-Segment %s wurde schon entfernt" -#: access/transam/xlog.c:4061 +#: access/transam/xlog.c:4043 #, c-format msgid "could not rename file \"%s\": %m" msgstr "konnte Datei »%s« nicht umbenennen: %m" -#: access/transam/xlog.c:4104 access/transam/xlog.c:4115 -#: access/transam/xlog.c:4136 +#: access/transam/xlog.c:4086 access/transam/xlog.c:4097 +#: access/transam/xlog.c:4118 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "benötigtes WAL-Verzeichnis »%s« existiert nicht" -#: access/transam/xlog.c:4121 access/transam/xlog.c:4142 +#: access/transam/xlog.c:4103 access/transam/xlog.c:4124 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "erzeuge fehlendes WAL-Verzeichnis »%s«" -#: access/transam/xlog.c:4125 access/transam/xlog.c:4145 +#: access/transam/xlog.c:4107 access/transam/xlog.c:4127 #: 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:4212 +#: access/transam/xlog.c:4194 #, c-format msgid "could not generate secret authorization token" msgstr "konnte geheimes Autorisierungstoken nicht erzeugen" -#: 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:4345 access/transam/xlog.c:4355 +#: access/transam/xlog.c:4381 access/transam/xlog.c:4389 +#: access/transam/xlog.c:4397 access/transam/xlog.c:4403 +#: access/transam/xlog.c:4411 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: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:4364 +#: access/transam/xlog.c:4346 #, 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:4368 +#: access/transam/xlog.c:4350 #, 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:4374 +#: access/transam/xlog.c:4356 #, 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:4377 access/transam/xlog.c:4403 -#: access/transam/xlog.c:4411 access/transam/xlog.c:4417 +#: access/transam/xlog.c:4359 access/transam/xlog.c:4385 +#: access/transam/xlog.c:4393 access/transam/xlog.c:4399 #, 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:4389 +#: access/transam/xlog.c:4371 #, c-format msgid "incorrect checksum in control file" msgstr "falsche Prüfsumme in Kontrolldatei" -#: access/transam/xlog.c:4400 +#: access/transam/xlog.c:4382 #, 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:4408 +#: access/transam/xlog.c:4390 #, 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:4416 +#: access/transam/xlog.c:4398 #, 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:4422 +#: access/transam/xlog.c:4404 #, 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: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 +#: access/transam/xlog.c:4407 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:4464 +#: access/transam/xlog.c:4472 #, 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:4430 +#: access/transam/xlog.c:4412 #, 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:4438 +#: access/transam/xlog.c:4420 #, 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:4446 +#: access/transam/xlog.c:4428 #, 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:4454 +#: access/transam/xlog.c:4436 #, 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:4462 +#: access/transam/xlog.c:4444 #, 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:4470 +#: access/transam/xlog.c:4452 #, 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:4480 +#: access/transam/xlog.c:4462 #, 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:4488 +#: access/transam/xlog.c:4470 #, 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:4497 +#: access/transam/xlog.c:4479 #, 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] "ungültige WAL-Segmentgröße in Kontrolldatei (%d Byte)" msgstr[1] "ungültige WAL-Segmentgröße in Kontrolldatei (%d Bytes)" -#: access/transam/xlog.c:4510 +#: access/transam/xlog.c:4492 #, 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:4514 +#: access/transam/xlog.c:4496 #, 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:4662 catalog/namespace.c:4696 +#: access/transam/xlog.c:4644 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 +#: replication/slot.c:2442 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:4708 commands/user.c:2545 commands/variable.c:173 +#: access/transam/xlog.c:4690 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:5129 +#: access/transam/xlog.c:5111 #, 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:5137 +#: access/transam/xlog.c:5119 #, 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:5143 +#: access/transam/xlog.c:5125 #, 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:5368 +#: access/transam/xlog.c:5350 #, 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" -#: access/transam/xlog.c:5369 +#: access/transam/xlog.c:5351 #, 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." -#: access/transam/xlog.c:5370 +#: access/transam/xlog.c:5352 #, 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." -#: access/transam/xlog.c:5435 +#: access/transam/xlog.c:5417 #, c-format msgid "control file contains invalid checkpoint location" msgstr "Kontrolldatei enthält ungültige Checkpoint-Position" -#: access/transam/xlog.c:5446 +#: access/transam/xlog.c:5428 #, c-format msgid "database system was shut down at %s" msgstr "Datenbanksystem wurde am %s heruntergefahren" -#: access/transam/xlog.c:5452 +#: access/transam/xlog.c:5434 #, 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:5458 +#: access/transam/xlog.c:5440 #, 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:5464 +#: access/transam/xlog.c:5446 #, 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:5466 +#: access/transam/xlog.c:5448 #, 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:5472 +#: access/transam/xlog.c:5454 #, 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:5474 +#: access/transam/xlog.c:5456 #, 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:5480 +#: access/transam/xlog.c:5462 #, 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:5487 +#: access/transam/xlog.c:5469 #, c-format msgid "control file contains invalid database cluster state" msgstr "Kontrolldatei enthält ungültigen Datenbankclusterstatus" -#: access/transam/xlog.c:5875 +#: access/transam/xlog.c:5857 #, c-format msgid "WAL ends before end of online backup" msgstr "WAL endet vor dem Ende der Online-Sicherung" -#: access/transam/xlog.c:5876 +#: access/transam/xlog.c:5858 #, 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:5880 +#: access/transam/xlog.c:5862 #, c-format msgid "WAL ends before consistent recovery point" msgstr "WAL endet vor einem konsistenten Wiederherstellungspunkt" -#: access/transam/xlog.c:5926 +#: access/transam/xlog.c:5908 #, c-format msgid "selected new timeline ID: %u" msgstr "gewählte neue Zeitleisten-ID: %u" -#: access/transam/xlog.c:5959 +#: access/transam/xlog.c:5941 #, c-format msgid "archive recovery complete" msgstr "Wiederherstellung aus Archiv abgeschlossen" -#: access/transam/xlog.c:6612 +#: access/transam/xlog.c:6594 #, c-format msgid "shutting down" msgstr "fahre herunter" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6651 +#: access/transam/xlog.c:6633 #, 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:6663 +#: access/transam/xlog.c:6645 #, 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:6728 +#: access/transam/xlog.c:6710 #, 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:6751 +#: access/transam/xlog.c:6733 #, 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:7233 +#: access/transam/xlog.c:7225 #, 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:7818 +#: access/transam/xlog.c:7840 #, c-format msgid "recovery restart point at %X/%X" msgstr "Recovery-Restart-Punkt bei %X/%X" -#: access/transam/xlog.c:7820 +#: access/transam/xlog.c:7842 #, 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:8082 +#: access/transam/xlog.c:8108 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "Restore-Punkt »%s« erzeugt bei %X/%X" -#: access/transam/xlog.c:8289 +#: access/transam/xlog.c:8315 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "Online-Sicherung wurde storniert, Wiederherstellung kann nicht fortgesetzt werden" -#: access/transam/xlog.c:8347 +#: access/transam/xlog.c:8373 #, 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:8405 +#: access/transam/xlog.c:8431 #, 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:8434 +#: access/transam/xlog.c:8460 #, 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:8705 +#: access/transam/xlog.c:8731 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "konnte Write-Through-Logdatei »%s« nicht fsyncen: %m" -#: access/transam/xlog.c:8710 +#: access/transam/xlog.c:8736 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "konnte Datei »%s« nicht fdatasyncen: %m" -#: access/transam/xlog.c:8797 access/transam/xlog.c:9133 +#: access/transam/xlog.c:8823 access/transam/xlog.c:9159 #, 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:8798 access/transam/xlogfuncs.c:248 +#: access/transam/xlog.c:8824 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." -#: access/transam/xlog.c:8803 +#: access/transam/xlog.c:8829 #, c-format msgid "backup label too long (max %d bytes)" msgstr "Backup-Label zu lang (maximal %d Bytes)" -#: access/transam/xlog.c:8924 +#: access/transam/xlog.c:8950 #, 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" -#: access/transam/xlog.c:8926 access/transam/xlog.c:9222 +#: access/transam/xlog.c:8952 access/transam/xlog.c:9248 #, 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." -#: access/transam/xlog.c:9006 backup/basebackup.c:1417 utils/adt/misc.c:354 +#: access/transam/xlog.c:9032 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:9013 backup/basebackup.c:1422 utils/adt/misc.c:359 +#: access/transam/xlog.c:9039 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:9134 +#: access/transam/xlog.c:9160 #, 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 +#: access/transam/xlog.c:9198 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:9173 backup/basebackup.c:1282 +#: access/transam/xlog.c:9199 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:9220 +#: access/transam/xlog.c:9246 #, 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" -#: access/transam/xlog.c:9336 +#: access/transam/xlog.c:9362 #, 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:9350 +#: access/transam/xlog.c:9376 #, 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:9352 +#: access/transam/xlog.c:9378 #, 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." -#: access/transam/xlog.c:9359 +#: access/transam/xlog.c:9385 #, c-format msgid "all required WAL segments have been archived" msgstr "alle benötigten WAL-Segmente wurden archiviert" -#: access/transam/xlog.c:9363 +#: access/transam/xlog.c:9389 #, 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:9402 +#: access/transam/xlog.c:9428 #, 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" @@ -3060,147 +3061,147 @@ msgstr "ungültiger Datensatz-Offset bei %X/%X: mindestens %u erwartet, %u erhal msgid "contrecord is requested by %X/%X" msgstr "Contrecord angefordert von %X/%X" -#: access/transam/xlogreader.c:669 access/transam/xlogreader.c:1134 +#: access/transam/xlogreader.c:669 access/transam/xlogreader.c:1144 #, 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:758 +#: access/transam/xlogreader.c:759 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "keine Contrecord-Flag bei %X/%X" -#: access/transam/xlogreader.c:771 +#: access/transam/xlogreader.c:772 #, 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:1142 +#: access/transam/xlogreader.c:1152 #, 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:1155 access/transam/xlogreader.c:1171 +#: access/transam/xlogreader.c:1165 access/transam/xlogreader.c:1181 #, 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:1209 +#: access/transam/xlogreader.c:1219 #, 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:1243 +#: access/transam/xlogreader.c:1253 #, 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:1258 access/transam/xlogreader.c:1300 +#: access/transam/xlogreader.c:1268 access/transam/xlogreader.c:1310 #, 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:1274 +#: access/transam/xlogreader.c:1284 #, 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:1282 +#: access/transam/xlogreader.c:1292 #, 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:1288 +#: access/transam/xlogreader.c:1298 #, 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:1320 +#: access/transam/xlogreader.c:1330 #, 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:1346 +#: access/transam/xlogreader.c:1356 #, 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:1749 +#: access/transam/xlogreader.c:1759 #, 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:1773 +#: access/transam/xlogreader.c:1783 #, 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:1780 +#: access/transam/xlogreader.c:1790 #, 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:1816 +#: access/transam/xlogreader.c:1826 #, 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:1832 +#: access/transam/xlogreader.c:1842 #, 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:1846 +#: access/transam/xlogreader.c:1856 #, 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:1861 +#: access/transam/xlogreader.c:1871 #, 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:1877 +#: access/transam/xlogreader.c:1887 #, 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:1889 +#: access/transam/xlogreader.c:1899 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "ungültige block_id %u bei %X/%X" -#: access/transam/xlogreader.c:1956 +#: access/transam/xlogreader.c:1966 #, c-format msgid "record with invalid length at %X/%X" msgstr "Datensatz mit ungültiger Länge bei %X/%X" -#: access/transam/xlogreader.c:1982 +#: access/transam/xlogreader.c:1992 #, 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:2066 +#: access/transam/xlogreader.c:2076 #, 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:2073 +#: access/transam/xlogreader.c:2083 #, 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:2100 access/transam/xlogreader.c:2117 +#: access/transam/xlogreader.c:2110 access/transam/xlogreader.c:2127 #, 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:2126 +#: access/transam/xlogreader.c:2136 #, 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:2134 +#: access/transam/xlogreader.c:2144 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "konnte Abbild bei %X/%X nicht dekomprimieren, Block %d" @@ -3977,7 +3978,7 @@ msgstr "relativer Pfad nicht erlaubt für auf dem Server abgelegtes Backup" #: 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 +#: commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:1982 #: storage/file/copydir.c:47 #, c-format msgid "could not create directory \"%s\": %m" @@ -4211,19 +4212,19 @@ msgstr "Klausel IN SCHEMA kann nicht verwendet werden, wenn GRANT/REVOKE ON SCHE #: 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 +#: 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:14403 commands/tablecmds.c:17030 commands/trigger.c:943 #: 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 +#: parser/parse_utilcmd.c:3449 parser/parse_utilcmd.c:3491 utils/adt/acl.c:2940 #: utils/adt/ruleutils.c:2812 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" @@ -4234,15 +4235,15 @@ msgstr "Spalte »%s« von Relation »%s« existiert nicht" msgid "\"%s\" is an index" msgstr "»%s« ist ein Index" -#: catalog/aclchk.c:1869 commands/tablecmds.c:14496 commands/tablecmds.c:17882 +#: catalog/aclchk.c:1869 commands/tablecmds.c:14560 commands/tablecmds.c:17946 #, c-format msgid "\"%s\" is a composite type" msgstr "»%s« ist ein zusammengesetzter 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 +#: commands/tablecmds.c:17910 utils/adt/acl.c:2124 utils/adt/acl.c:2154 +#: utils/adt/acl.c:2187 utils/adt/acl.c:2223 utils/adt/acl.c:2254 +#: utils/adt/acl.c:2285 #, c-format msgid "\"%s\" is not a sequence" msgstr "»%s« ist keine Sequenz" @@ -4767,14 +4768,14 @@ msgstr "kann %s nicht löschen, weil andere Objekte davon abhängen" #: 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 +#: commands/tablecmds.c:15152 commands/tablespace.c:460 commands/user.c:1302 +#: commands/vacuum.c:212 commands/view.c:441 executor/execExprInterp.c:4655 +#: executor/execExprInterp.c:4663 libpq/auth.c:332 +#: 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 +#: utils/misc/guc.c:3210 utils/misc/guc.c:3285 utils/misc/guc.c:6836 +#: utils/misc/guc.c:6870 utils/misc/guc.c:6904 utils/misc/guc.c:6947 +#: utils/misc/guc.c:6989 #, c-format msgid "%s" msgstr "%s" @@ -4807,66 +4808,66 @@ msgstr "Konstante vom Typ %s kann hier nicht verwendet werden" msgid "column %d of relation \"%s\" does not exist" msgstr "Spalte %d von Relation »%s« existiert nicht" -#: catalog/heap.c:325 +#: catalog/heap.c:326 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "keine Berechtigung, um »%s.%s« zu erzeugen" -#: catalog/heap.c:327 +#: 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:467 commands/tablecmds.c:2495 commands/tablecmds.c:2917 +#: 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:485 commands/tablecmds.c:7432 +#: 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:501 +#: 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:579 +#: 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:584 +#: catalog/heap.c:585 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "Spalte »%s« hat Pseudotyp %s" -#: catalog/heap.c:615 +#: 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:670 +#: 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:676 commands/createas.c:198 commands/createas.c:505 +#: 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:1161 catalog/index.c:899 commands/createas.c:401 +#: 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:1177 catalog/pg_type.c:434 catalog/pg_type.c:805 +#: 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 @@ -4874,132 +4875,132 @@ msgstr "Relation »%s« existiert bereits" msgid "type \"%s\" already exists" msgstr "Typ »%s« existiert bereits" -#: catalog/heap.c:1178 +#: 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:1218 +#: 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:1229 +#: 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:1239 +#: 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:2130 +#: 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:2402 +#: catalog/heap.c:2452 #, c-format msgid "check constraint \"%s\" already exists" msgstr "Check-Constraint »%s« existiert bereits" -#: catalog/heap.c:2574 catalog/index.c:913 catalog/pg_constraint.c:724 -#: commands/tablecmds.c:9356 +#: 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:2581 +#: 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:2592 +#: 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:2602 +#: 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:2607 +#: 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:2633 catalog/pg_constraint.c:853 commands/tablecmds.c:3074 +#: catalog/heap.c:2683 catalog/pg_constraint.c:854 commands/tablecmds.c:3074 #: commands/tablecmds.c:3377 commands/tablecmds.c:7089 -#: commands/tablecmds.c:15907 commands/tablecmds.c:16038 +#: commands/tablecmds.c:15971 commands/tablecmds.c:16102 #, c-format msgid "too many inheritance parents" msgstr "zu viele Elterntabellen" -#: catalog/heap.c:2717 +#: 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:2719 +#: 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:2725 +#: 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:2726 +#: 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:2781 +#: catalog/heap.c:2831 #, c-format msgid "generation expression is not immutable" msgstr "Generierungsausdruck ist nicht »immutable«" -#: catalog/heap.c:2809 rewrite/rewriteHandler.c:1276 +#: 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:2814 commands/prepare.c:331 parser/analyze.c:2758 +#: 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:2861 +#: 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:3167 +#: 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:3168 +#: 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:3173 +#: 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:3174 +#: catalog/heap.c:3224 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Tabelle »%s« verweist auf »%s«." -#: catalog/heap.c:3176 +#: 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." @@ -5075,12 +5076,12 @@ msgstr "DROP INDEX CONCURRENTLY muss die erste Aktion in einer Transaktion sein" msgid "cannot reindex temporary tables of other sessions" msgstr "kann temporäre Tabellen anderer Sitzungen nicht reindizieren" -#: catalog/index.c:3679 commands/indexcmds.c:3626 +#: catalog/index.c:3679 commands/indexcmds.c:3660 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "ungültiger Index einer TOAST-Tabelle kann nicht reindiziert werden" -#: catalog/index.c:3695 commands/indexcmds.c:3504 commands/indexcmds.c:3650 +#: catalog/index.c:3695 commands/indexcmds.c:3538 commands/indexcmds.c:3684 #: commands/tablecmds.c:3581 #, c-format msgid "cannot move system relation \"%s\"" @@ -5097,7 +5098,7 @@ 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:462 catalog/namespace.c:666 catalog/namespace.c:758 -#: commands/trigger.c:5729 +#: commands/trigger.c:5815 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "Verweise auf andere Datenbanken sind nicht implementiert: »%s.%s.%s«" @@ -5180,7 +5181,7 @@ msgstr "Textsuchekonfiguration »%s« existiert nicht" msgid "cross-database references are not implemented: %s" msgstr "Verweise auf andere Datenbanken sind nicht implementiert: %s" -#: catalog/namespace.c:3335 gram.y:19181 gram.y:19221 parser/parse_expr.c:875 +#: catalog/namespace.c:3335 gram.y:19188 gram.y:19228 parser/parse_expr.c:875 #: parser/parse_target.c:1266 #, c-format msgid "improper qualified name (too many dotted names): %s" @@ -5234,25 +5235,25 @@ msgstr "während einer parallelen Operation können keine temporären Tabellen e #: 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 +#: commands/tablecmds.c:12966 #, c-format msgid "\"%s\" is not a table" msgstr "»%s« ist keine Tabelle" #: catalog/objectaddress.c:1378 commands/tablecmds.c:269 -#: commands/tablecmds.c:17851 commands/view.c:114 +#: commands/tablecmds.c:17915 commands/view.c:114 #, c-format msgid "\"%s\" is not a view" msgstr "»%s« ist keine Sicht" #: catalog/objectaddress.c:1385 commands/matview.c:199 commands/tablecmds.c:275 -#: commands/tablecmds.c:17856 +#: commands/tablecmds.c:17920 #, c-format msgid "\"%s\" is not a materialized view" msgstr "»%s« ist keine materialisierte Sicht" #: catalog/objectaddress.c:1392 commands/tablecmds.c:293 -#: commands/tablecmds.c:17861 +#: commands/tablecmds.c:17925 #, c-format msgid "\"%s\" is not a foreign table" msgstr "»%s« ist keine Fremdtabelle" @@ -5275,7 +5276,7 @@ msgstr "Vorgabewert für Spalte »%s« von Relation »%s« existiert nicht" #: 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 +#: utils/adt/acl.c:4577 #, c-format msgid "type \"%s\" does not exist" msgstr "Typ »%s« existiert nicht" @@ -5295,8 +5296,9 @@ msgstr "Funktion %d (%s, %s) von %s existiert nicht" 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:1834 commands/foreigncmds.c:430 -#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:713 +#: catalog/objectaddress.c:1834 commands/foreigncmds.c:441 +#: commands/foreigncmds.c:1004 commands/foreigncmds.c:1367 +#: foreign/foreign.c:713 #, c-format msgid "server \"%s\" does not exist" msgstr "Server »%s« existiert nicht" @@ -5933,17 +5935,17 @@ msgstr "Sortierfolge »%s« existiert bereits" msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "Sortierfolge »%s« für Kodierung »%s« existiert bereits" -#: catalog/pg_constraint.c:732 +#: 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:932 catalog/pg_constraint.c:1025 +#: 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:1125 +#: 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" @@ -6029,7 +6031,7 @@ 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:595 commands/tablecmds.c:4800 -#: commands/tablecmds.c:16153 +#: commands/tablecmds.c:16217 #, 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." @@ -6360,12 +6362,12 @@ msgstr "kann Objekte, die %s gehören, nicht löschen, weil sie vom Datenbanksys 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:438 +#: catalog/pg_subscription.c:463 #, 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:440 +#: catalog/pg_subscription.c:465 #, 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«." @@ -6373,7 +6375,7 @@ 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:447 +#: catalog/pg_subscription.c:472 #, 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." @@ -6519,12 +6521,12 @@ msgstr "Parameter »%s« muss READ_ONLY, SHAREABLE oder READ_WRITE sein" msgid "event trigger \"%s\" already exists" msgstr "Ereignistrigger »%s« existiert bereits" -#: commands/alter.c:86 commands/foreigncmds.c:593 +#: commands/alter.c:86 commands/foreigncmds.c:604 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "Fremddaten-Wrapper »%s« existiert bereits" -#: commands/alter.c:89 commands/foreigncmds.c:884 +#: commands/alter.c:89 commands/foreigncmds.c:895 #, c-format msgid "server \"%s\" already exists" msgstr "Server »%s« existiert bereits" @@ -6625,7 +6627,7 @@ msgid "handler function is not specified" msgstr "keine Handler-Funktion angegeben" #: commands/amcmds.c:264 commands/event_trigger.c:200 -#: commands/foreigncmds.c:489 commands/proclang.c:78 commands/trigger.c:702 +#: commands/foreigncmds.c:500 commands/proclang.c:78 commands/trigger.c:703 #: parser/parse_clause.c:943 #, c-format msgid "function %s must return type %s" @@ -6731,7 +6733,7 @@ msgstr "kann temporäre Tabellen anderer Sitzungen nicht clustern" msgid "there is no previously clustered index for table \"%s\"" msgstr "es gibt keinen bereits geclusterten Index für Tabelle »%s«" -#: commands/cluster.c:191 commands/tablecmds.c:14797 commands/tablecmds.c:16729 +#: commands/cluster.c:191 commands/tablecmds.c:14861 commands/tablecmds.c:16793 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "Index »%s« für Tabelle »%s« existiert nicht" @@ -6746,7 +6748,7 @@ msgstr "globaler Katalog kann nicht geclustert werden" msgid "cannot vacuum temporary tables of other sessions" msgstr "temporäre Tabellen anderer Sitzungen können nicht gevacuumt werden" -#: commands/cluster.c:513 commands/tablecmds.c:16739 +#: commands/cluster.c:513 commands/tablecmds.c:16803 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "»%s« ist kein Index für Tabelle »%s«" @@ -6811,13 +6813,13 @@ msgid "collation attribute \"%s\" not recognized" msgstr "Attribut »%s« für Sortierfolge unbekannt" #: commands/collationcmds.c:123 commands/collationcmds.c:129 -#: commands/define.c:388 commands/tablecmds.c:8129 +#: 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 +#: 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" @@ -6886,9 +6888,9 @@ msgstr "Version der Standardsortierfolge kann nicht aufgefrischt werden" #. 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/tablecmds.c:7938 commands/tablecmds.c:7948 +#: commands/tablecmds.c:7950 commands/tablecmds.c:14563 +#: commands/tablecmds.c:17948 commands/tablecmds.c:17969 #: commands/typecmds.c:3787 commands/typecmds.c:3872 commands/typecmds.c:4226 #, c-format msgid "Use %s instead." @@ -7165,7 +7167,7 @@ msgstr "Generierte Spalten können nicht in COPY verwendet werden." msgid "column \"%s\" does not exist" msgstr "Spalte »%s« existiert nicht" -#: commands/copy.c:963 commands/tablecmds.c:2552 commands/trigger.c:951 +#: commands/copy.c:963 commands/tablecmds.c:2552 commands/trigger.c:952 #: parser/parse_target.c:1083 parser/parse_target.c:1094 #, c-format msgid "column \"%s\" specified more than once" @@ -7316,17 +7318,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 -#: replication/walsender.c:756 replication/walsender.c:782 tcop/postgres.c:381 +#: 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 replication/walsender.c:772 +#: 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 replication/walsender.c:803 +#: commands/copyfromparse.c:317 replication/walsender.c:807 #, c-format msgid "COPY from stdin failed: %s" msgstr "COPY FROM STDIN fehlgeschlagen: %s" @@ -7997,7 +7999,7 @@ msgstr "Verwenden Sie DROP AGGREGATE, um Aggregatfunktionen zu löschen." #: 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 +#: commands/tablecmds.c:17225 tcop/utility.c:1325 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "Relation »%s« existiert nicht, wird übersprungen" @@ -8122,7 +8124,7 @@ msgstr "Regel »%s« für Relation »%s« existiert nicht, wird übersprungen" msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "Fremddaten-Wrapper »%s« existiert nicht, wird übersprungen" -#: commands/dropcmds.c:448 commands/foreigncmds.c:1360 +#: commands/dropcmds.c:448 commands/foreigncmds.c:1371 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "Server »%s« existiert nicht, wird übersprungen" @@ -8532,112 +8534,112 @@ msgstr "konnte Multirange-Typ für Datentyp %s nicht finden" msgid "file \"%s\" is too large" msgstr "Datei »%s« ist zu groß" -#: commands/foreigncmds.c:148 commands/foreigncmds.c:157 +#: commands/foreigncmds.c:159 commands/foreigncmds.c:168 #, c-format msgid "option \"%s\" not found" msgstr "Option »%s« nicht gefunden" -#: commands/foreigncmds.c:167 +#: commands/foreigncmds.c:178 #, c-format msgid "option \"%s\" provided more than once" msgstr "Option »%s« mehrmals angegeben" -#: commands/foreigncmds.c:221 commands/foreigncmds.c:229 +#: commands/foreigncmds.c:232 commands/foreigncmds.c:240 #, c-format msgid "permission denied to change owner of foreign-data wrapper \"%s\"" msgstr "keine Berechtigung, um Eigentümer des Fremddaten-Wrappers »%s« zu ändern" -#: commands/foreigncmds.c:223 +#: commands/foreigncmds.c:234 #, c-format msgid "Must be superuser to change owner of a foreign-data wrapper." msgstr "Nur Superuser können den Eigentümer eines Fremddaten-Wrappers ändern." -#: commands/foreigncmds.c:231 +#: commands/foreigncmds.c:242 #, c-format 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:691 +#: commands/foreigncmds.c:302 commands/foreigncmds.c:718 foreign/foreign.c:691 #, c-format msgid "foreign-data wrapper \"%s\" does not exist" msgstr "Fremddaten-Wrapper »%s« existiert nicht" -#: commands/foreigncmds.c:325 +#: commands/foreigncmds.c:336 #, c-format msgid "foreign-data wrapper with OID %u does not exist" msgstr "Fremddaten-Wrapper mit OID %u existiert nicht" -#: commands/foreigncmds.c:462 +#: commands/foreigncmds.c:473 #, c-format msgid "foreign server with OID %u does not exist" msgstr "Fremdserver mit OID %u existiert nicht" -#: commands/foreigncmds.c:580 +#: commands/foreigncmds.c:591 #, c-format msgid "permission denied to create foreign-data wrapper \"%s\"" msgstr "keine Berechtigung, um Fremddaten-Wrapper »%s« zu erzeugen" -#: commands/foreigncmds.c:582 +#: commands/foreigncmds.c:593 #, c-format msgid "Must be superuser to create a foreign-data wrapper." msgstr "Nur Superuser können Fremddaten-Wrapper anlegen." -#: commands/foreigncmds.c:697 +#: commands/foreigncmds.c:708 #, c-format msgid "permission denied to alter foreign-data wrapper \"%s\"" msgstr "keine Berechtigung, um Fremddaten-Wrapper »%s« zu ändern" -#: commands/foreigncmds.c:699 +#: commands/foreigncmds.c:710 #, c-format msgid "Must be superuser to alter a foreign-data wrapper." msgstr "Nur Superuser können Fremddaten-Wrapper ändern." -#: commands/foreigncmds.c:730 +#: commands/foreigncmds.c:741 #, c-format msgid "changing the foreign-data wrapper handler can change behavior of existing foreign tables" msgstr "das Ändern des Handlers des Fremddaten-Wrappers kann das Verhalten von bestehenden Fremdtabellen verändern" -#: commands/foreigncmds.c:745 +#: commands/foreigncmds.c:756 #, c-format msgid "changing the foreign-data wrapper validator can cause the options for dependent objects to become invalid" msgstr "durch Ändern des Validators des Fremddaten-Wrappers können die Optionen von abhängigen Objekten ungültig werden" -#: commands/foreigncmds.c:876 +#: commands/foreigncmds.c:887 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "Server »%s« existiert bereits, wird übersprungen" -#: commands/foreigncmds.c:1144 +#: commands/foreigncmds.c:1155 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "Benutzerabbildung für »%s« existiert bereits für Server »%s«, wird übersprungen" -#: commands/foreigncmds.c:1154 +#: commands/foreigncmds.c:1165 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "Benutzerabbildung für »%s« existiert bereits für Server »%s«" -#: commands/foreigncmds.c:1254 commands/foreigncmds.c:1374 +#: commands/foreigncmds.c:1265 commands/foreigncmds.c:1385 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "Benutzerabbildung für »%s« existiert nicht für Server »%s«" -#: commands/foreigncmds.c:1379 +#: commands/foreigncmds.c:1390 #, c-format 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:404 +#: commands/foreigncmds.c:1518 foreign/foreign.c:404 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "Fremddaten-Wrapper »%s« hat keinen Handler" -#: commands/foreigncmds.c:1513 +#: commands/foreigncmds.c:1524 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "Fremddaten-Wrapper »%s« unterstützt IMPORT FOREIGN SCHEMA nicht" -#: commands/foreigncmds.c:1615 +#: commands/foreigncmds.c:1626 #, c-format msgid "importing foreign table \"%s\"" msgstr "importiere Fremdtabelle »%s«" @@ -9161,8 +9163,8 @@ msgstr "inkludierte Spalte unterstützt die Optionen NULLS FIRST/LAST nicht" 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:2028 commands/tablecmds.c:18185 commands/typecmds.c:811 -#: parser/parse_expr.c:2785 parser/parse_type.c:568 parser/parse_utilcmd.c:3771 +#: commands/indexcmds.c:2028 commands/tablecmds.c:18249 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" @@ -9198,8 +9200,8 @@ 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:2210 commands/tablecmds.c:18210 -#: commands/tablecmds.c:18216 commands/typecmds.c:2311 +#: commands/indexcmds.c:2210 commands/tablecmds.c:18274 +#: commands/tablecmds.c:18280 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«" @@ -9225,88 +9227,88 @@ msgstr "Operatorklasse »%s« akzeptiert Datentyp %s nicht" msgid "there are multiple default operator classes for data type %s" msgstr "es gibt mehrere Standardoperatorklassen für Datentyp %s" -#: commands/indexcmds.c:2681 +#: commands/indexcmds.c:2715 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "unbekannte REINDEX-Option »%s«" -#: commands/indexcmds.c:2913 +#: commands/indexcmds.c:2947 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "Tabelle »%s« hat keine Indexe, die nebenläufig reindiziert werden können" -#: commands/indexcmds.c:2927 +#: commands/indexcmds.c:2961 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "Tabelle »%s« hat keine zu reindizierenden Indexe" -#: commands/indexcmds.c:2974 commands/indexcmds.c:3485 -#: commands/indexcmds.c:3615 +#: commands/indexcmds.c:3008 commands/indexcmds.c:3519 +#: commands/indexcmds.c:3649 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "Systemkataloge können nicht nebenläufig reindiziert werden" -#: commands/indexcmds.c:2998 +#: commands/indexcmds.c:3032 #, c-format msgid "can only reindex the currently open database" msgstr "nur die aktuell geöffnete Datenbank kann reindiziert werden" -#: commands/indexcmds.c:3090 +#: commands/indexcmds.c:3124 #, 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:3123 +#: commands/indexcmds.c:3157 #, c-format msgid "cannot move system relations, skipping all" msgstr "Systemrelationen können nicht verschoben werden, werden alle übersprungen" -#: commands/indexcmds.c:3169 +#: commands/indexcmds.c:3203 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "beim Reindizieren der partitionierten Tabelle »%s.%s«" -#: commands/indexcmds.c:3172 +#: commands/indexcmds.c:3206 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "beim Reindizieren des partitionierten Index »%s.%s«" -#: commands/indexcmds.c:3365 commands/indexcmds.c:4241 +#: commands/indexcmds.c:3399 commands/indexcmds.c:4283 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "Tabelle »%s.%s« wurde neu indiziert" -#: commands/indexcmds.c:3517 commands/indexcmds.c:3570 +#: commands/indexcmds.c:3551 commands/indexcmds.c:3604 #, 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 +#: commands/indexcmds.c:3554 commands/indexcmds.c:3607 #, c-format msgid "Use DROP INDEX or REINDEX INDEX." msgstr "Verwenden Sie DROP INDEX oder REINDEX INDEX." -#: commands/indexcmds.c:3524 +#: commands/indexcmds.c:3558 #, 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:3680 +#: commands/indexcmds.c:3714 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "diese Art Relation kann nicht nebenläufig reindiziert werden" -#: commands/indexcmds.c:3698 +#: commands/indexcmds.c:3732 #, 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:4222 commands/indexcmds.c:4234 +#: commands/indexcmds.c:4264 commands/indexcmds.c:4276 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "Index »%s.%s« wurde neu indiziert" -#: commands/indexcmds.c:4224 commands/indexcmds.c:4243 +#: commands/indexcmds.c:4266 commands/indexcmds.c:4285 #, c-format msgid "%s." msgstr "%s." @@ -9321,7 +9323,7 @@ msgstr "kann Relation »%s« nicht sperren" 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:212 gram.y:18918 +#: commands/matview.c:212 gram.y:18925 #, c-format msgid "%s and %s options cannot be used together" msgstr "Optionen %s und %s können nicht zusammen verwendet werden" @@ -9638,9 +9640,9 @@ msgstr "Operator-Attribut »%s« kann nicht geändert werden, wenn es schon gese #: 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 +#: commands/tablecmds.c:9670 commands/tablecmds.c:17836 +#: commands/tablecmds.c:17871 commands/trigger.c:317 commands/trigger.c:1333 +#: commands/trigger.c:1443 rewrite/rewriteDefine.c:268 #: rewrite/rewriteDefine.c:779 rewrite/rewriteRemove.c:74 #, c-format msgid "permission denied: \"%s\" is a system catalog" @@ -9692,7 +9694,7 @@ 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:2936 utils/adt/xml.c:3106 +#: executor/execCurrent.c:70 utils/adt/xml.c:2938 utils/adt/xml.c:3108 #, c-format msgid "cursor \"%s\" does not exist" msgstr "Cursor »%s« existiert nicht" @@ -10089,8 +10091,8 @@ msgstr "Sequenz muss im selben Schema wie die verknüpfte Tabelle sein" msgid "cannot change ownership of identity sequence" msgstr "kann Eigentümer einer Identitätssequenz nicht ändern" -#: commands/sequence.c:1671 commands/tablecmds.c:14486 -#: commands/tablecmds.c:17181 +#: commands/sequence.c:1671 commands/tablecmds.c:14550 +#: commands/tablecmds.c:17245 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "Sequenz »%s« ist mit Tabelle »%s« verknüpft." @@ -10160,12 +10162,12 @@ msgstr "doppelter Spaltenname in Statistikdefinition" msgid "duplicate expression in statistics definition" msgstr "doppelter Ausdruck in Statistikdefinition" -#: commands/statscmds.c:628 commands/tablecmds.c:8620 +#: 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:636 commands/tablecmds.c:8628 +#: commands/statscmds.c:636 commands/tablecmds.c:8661 #, c-format msgid "lowering statistics target to %d" msgstr "setze Statistikziel auf %d herab" @@ -10227,8 +10229,8 @@ 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:758 commands/subscriptioncmds.c:891 -#: commands/subscriptioncmds.c:1524 replication/logical/tablesync.c:1345 -#: replication/logical/worker.c:4503 +#: commands/subscriptioncmds.c:1524 replication/logical/tablesync.c:1371 +#: replication/logical/worker.c:4524 #, c-format msgid "could not connect to the publisher: %s" msgstr "konnte nicht mit dem Publikationsserver verbinden: %s" @@ -10335,66 +10337,66 @@ msgstr "konnte Replikations-Slot »%s« auf dem Publikationsserver nicht lösche msgid "subscription with OID %u does not exist" msgstr "Subskription mit OID %u existiert nicht" -#: commands/subscriptioncmds.c:2076 commands/subscriptioncmds.c:2201 +#: 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:2112 +#: 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 "Subskription »%s« verlangte copy_data mit origin = NONE, aber könnte Daten kopieren, die einen anderen Origin hatten" -#: commands/subscriptioncmds.c:2114 +#: 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:2117 +#: commands/subscriptioncmds.c:2120 #, c-format msgid "Verify that initial data copied from the publisher tables did not come from other origins." msgstr "Überprüfen Sie, dass die von den publizierten Tabellen kopierten initialen Daten nicht von anderen Origins kamen." -#: commands/subscriptioncmds.c:2223 replication/logical/tablesync.c:906 +#: commands/subscriptioncmds.c:2226 replication/logical/tablesync.c:932 #: 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:2273 +#: 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:2276 +#: 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 zu deaktivieren, und dann %s, um sie vom Slot zu trennen." -#: commands/subscriptioncmds.c:2307 +#: commands/subscriptioncmds.c:2310 #, c-format msgid "publication name \"%s\" used more than once" msgstr "Publikationsname »%s« mehrmals angegeben" -#: commands/subscriptioncmds.c:2351 +#: 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:2365 +#: 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:2376 +#: 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:2433 +#: commands/subscriptioncmds.c:2436 #, c-format msgid "%s requires a Boolean value or \"parallel\"" msgstr "%s erfordert einen Boole’schen Wert oder »parallel«" @@ -10455,7 +10457,7 @@ msgstr "materialisierte Sicht »%s« existiert nicht, wird übersprungen" 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:279 commands/tablecmds.c:303 commands/tablecmds.c:19805 +#: commands/tablecmds.c:279 commands/tablecmds.c:303 commands/tablecmds.c:19877 #: parser/parse_utilcmd.c:2251 #, c-format msgid "index \"%s\" does not exist" @@ -10479,8 +10481,8 @@ msgstr "»%s« ist kein Typ" msgid "Use DROP TYPE to remove a type." msgstr "Verwenden Sie DROP TYPE, um einen Typen zu löschen." -#: commands/tablecmds.c:291 commands/tablecmds.c:14325 -#: commands/tablecmds.c:16886 +#: commands/tablecmds.c:291 commands/tablecmds.c:14389 +#: commands/tablecmds.c:16950 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "Fremdtabelle »%s« existiert nicht" @@ -10504,7 +10506,7 @@ msgstr "ON COMMIT kann nur mit temporären Tabellen verwendet werden" msgid "cannot create temporary table within security-restricted operation" msgstr "kann temporäre Tabelle nicht in einer sicherheitsbeschränkten Operation erzeugen" -#: commands/tablecmds.c:801 commands/tablecmds.c:15745 +#: commands/tablecmds.c:801 commands/tablecmds.c:15809 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "von der Relation »%s« würde mehrmals geerbt werden" @@ -10529,7 +10531,7 @@ msgstr "kann keine Fremdpartition der partitionierten Tabelle »%s« erzeugen" msgid "Table \"%s\" contains indexes that are unique." msgstr "Tabelle »%s« enthält Unique Indexe." -#: commands/tablecmds.c:1338 commands/tablecmds.c:13341 +#: commands/tablecmds.c:1338 commands/tablecmds.c:13382 #, c-format msgid "too many array dimensions" msgstr "zu viele Array-Dimensionen" @@ -10580,7 +10582,7 @@ msgstr "kann Fremdtabelle »%s« nicht leeren" msgid "cannot truncate temporary tables of other sessions" msgstr "kann temporäre Tabellen anderer Sitzungen nicht leeren" -#: commands/tablecmds.c:2606 commands/tablecmds.c:15642 +#: commands/tablecmds.c:2606 commands/tablecmds.c:15706 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "von partitionierter Tabelle »%s« kann nicht geerbt werden" @@ -10601,18 +10603,18 @@ msgstr "geerbte Relation »%s« ist keine Tabelle oder Fremdtabelle" 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:2640 commands/tablecmds.c:15621 +#: commands/tablecmds.c:2640 commands/tablecmds.c:15685 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "von temporärer Relation »%s« kann nicht geerbt werden" -#: commands/tablecmds.c:2650 commands/tablecmds.c:15629 +#: commands/tablecmds.c:2650 commands/tablecmds.c:15693 #, 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:2791 commands/tablecmds.c:2845 -#: commands/tablecmds.c:13024 parser/parse_utilcmd.c:1265 +#: 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 @@ -10906,12 +10908,12 @@ msgstr "zu einer getypten Tabelle kann keine Spalte hinzugefügt werden" msgid "cannot add column to a partition" msgstr "zu einer Partition kann keine Spalte hinzugefügt werden" -#: commands/tablecmds.c:7072 commands/tablecmds.c:15860 +#: commands/tablecmds.c:7072 commands/tablecmds.c:15924 #, 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:7078 commands/tablecmds.c:15866 +#: commands/tablecmds.c:7078 commands/tablecmds.c:15930 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "abgeleitete Tabelle »%s« hat unterschiedliche Sortierfolge für Spalte »%s«" @@ -10926,980 +10928,980 @@ msgstr "Definition von Spalte »%s« für abgeleitete Tabelle »%s« wird zusamm 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:7362 +#: 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:7440 +#: 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:7447 +#: 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:7513 commands/tablecmds.c:12652 +#: commands/tablecmds.c:7546 commands/tablecmds.c:12693 #, 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: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 +#: 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 "Lassen Sie das Schlüsselwort ONLY weg." -#: 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 +#: 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:14412 commands/tablecmds.c:17039 #, c-format msgid "cannot alter system column \"%s\"" msgstr "Systemspalte »%s« kann nicht geändert werden" -#: commands/tablecmds.c:7556 commands/tablecmds.c:7902 +#: 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:7597 +#: 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:7602 +#: 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:7625 +#: 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:7825 commands/tablecmds.c:9533 +#: 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:7826 +#: 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:7911 +#: 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:8005 +#: 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:8011 +#: commands/tablecmds.c:8044 #, c-format 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:8039 +#: 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:8045 +#: 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:8051 +#: 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:8112 +#: 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:8118 +#: 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:8163 commands/tablecmds.c:8259 +#: 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:8229 +#: 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:8235 +#: 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:8264 +#: 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:8358 +#: 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:8456 +#: 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:8478 +#: 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:8517 +#: 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:8522 +#: 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:8600 +#: 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:8652 +#: 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:8671 +#: 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:8676 +#: 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:8678 +#: 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:8924 +#: 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:8987 +#: 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:9000 +#: commands/tablecmds.c:9033 #, c-format msgid "cannot drop system column \"%s\"" msgstr "Systemspalte »%s« kann nicht gelöscht werden" -#: commands/tablecmds.c:9010 +#: commands/tablecmds.c:9043 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "geerbte Spalte »%s« kann nicht gelöscht werden" -#: commands/tablecmds.c:9023 +#: 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:9048 +#: 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:9253 +#: 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:9278 +#: 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:9615 +#: 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:9621 +#: 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:9624 +#: 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:9631 commands/tablecmds.c:10092 +#: 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:9654 +#: 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:9661 +#: 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:9667 +#: 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:9671 +#: 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:9735 commands/tablecmds.c:9741 +#: 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:9757 +#: 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:9864 +#: 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:9866 +#: 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:10035 +#: 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:10392 commands/tablecmds.c:10832 +#: 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 "Fremdschlüssel-Constraints auf Fremdtabellen werden nicht unterstützt" -#: commands/tablecmds.c:10815 +#: commands/tablecmds.c:10856 #, 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:11416 commands/tablecmds.c:11697 -#: commands/tablecmds.c:12609 commands/tablecmds.c:12683 +#: 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 "Constraint »%s« von Relation »%s« existiert nicht" -#: commands/tablecmds.c:11423 +#: commands/tablecmds.c:11464 #, 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:11461 +#: commands/tablecmds.c:11502 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "Constraint »%s« von Relation »%s« kann nicht geändert werden" -#: commands/tablecmds.c:11464 +#: commands/tablecmds.c:11505 #, 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:11466 +#: commands/tablecmds.c:11507 #, c-format 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:11705 +#: commands/tablecmds.c:11746 #, 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:11782 +#: commands/tablecmds.c:11823 #, c-format msgid "constraint must be validated on child tables too" msgstr "Constraint muss ebenso in den abgeleiteten Tabellen validiert werden" -#: commands/tablecmds.c:11869 +#: commands/tablecmds.c:11910 #, 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:11875 +#: commands/tablecmds.c:11916 #, c-format msgid "system columns cannot be used in foreign keys" msgstr "Systemspalten können nicht in Fremdschlüsseln verwendet werden" -#: commands/tablecmds.c:11879 +#: commands/tablecmds.c:11920 #, 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:11944 +#: commands/tablecmds.c:11985 #, 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:11961 +#: commands/tablecmds.c:12002 #, 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:12029 +#: commands/tablecmds.c:12070 #, 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:12121 +#: commands/tablecmds.c:12162 #, 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:12126 +#: commands/tablecmds.c:12167 #, 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:12565 +#: commands/tablecmds.c:12606 #, 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:12615 +#: commands/tablecmds.c:12656 #, 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:12790 +#: commands/tablecmds.c:12831 #, c-format msgid "cannot alter column type of typed table" msgstr "Spaltentyp einer getypten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:12816 +#: commands/tablecmds.c:12857 #, 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:12817 commands/tablecmds.c:18028 -#: commands/tablecmds.c:18118 commands/trigger.c:656 +#: commands/tablecmds.c:12858 commands/tablecmds.c:18092 +#: commands/tablecmds.c:18182 commands/trigger.c:657 #: 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:12827 +#: commands/tablecmds.c:12868 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "kann vererbte Spalte »%s« nicht ändern" -#: commands/tablecmds.c:12836 +#: commands/tablecmds.c:12877 #, 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:12886 +#: commands/tablecmds.c:12927 #, 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:12889 +#: commands/tablecmds.c:12930 #, 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:12893 +#: commands/tablecmds.c:12934 #, 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:12897 +#: commands/tablecmds.c:12938 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Sie müssen möglicherweise »USING %s::%s« angeben." -#: commands/tablecmds.c:12996 +#: commands/tablecmds.c:13037 #, 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:13025 +#: commands/tablecmds.c:13066 #, 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:13036 +#: commands/tablecmds.c:13077 #, 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:13161 +#: commands/tablecmds.c:13202 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "Typ der Spalte »%s« kann nicht zweimal geändert werden" -#: commands/tablecmds.c:13199 +#: commands/tablecmds.c:13240 #, 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:13204 +#: commands/tablecmds.c:13245 #, 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:13508 +#: commands/tablecmds.c:13549 #, c-format 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:13509 commands/tablecmds.c:13524 -#: commands/tablecmds.c:13544 commands/tablecmds.c:13563 -#: commands/tablecmds.c:13622 +#: 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 hängt von Spalte »%s« ab" -#: commands/tablecmds.c:13523 +#: commands/tablecmds.c:13564 #, 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:13543 +#: commands/tablecmds.c:13584 #, 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:13562 +#: commands/tablecmds.c:13603 #, 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:13593 +#: commands/tablecmds.c:13634 #, 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:13594 +#: commands/tablecmds.c:13635 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "Spalte »%s« wird von generierter Spalte »%s« verwendet." -#: commands/tablecmds.c:13621 +#: commands/tablecmds.c:13662 #, 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:14456 commands/tablecmds.c:14468 +#: commands/tablecmds.c:14520 commands/tablecmds.c:14532 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "kann Eigentümer des Index »%s« nicht ändern" -#: commands/tablecmds.c:14458 commands/tablecmds.c:14470 +#: commands/tablecmds.c:14522 commands/tablecmds.c:14534 #, c-format msgid "Change the ownership of the index's table instead." msgstr "Ändern Sie stattdessen den Eigentümer der Tabelle des Index." -#: commands/tablecmds.c:14484 +#: commands/tablecmds.c:14548 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "kann Eigentümer der Sequenz »%s« nicht ändern" -#: commands/tablecmds.c:14509 +#: commands/tablecmds.c:14573 #, c-format msgid "cannot change owner of relation \"%s\"" msgstr "kann Eigentümer der Relation »%s« nicht ändern" -#: commands/tablecmds.c:14976 +#: commands/tablecmds.c:15040 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "mehrere SET TABLESPACE Unterbefehle sind ungültig" -#: commands/tablecmds.c:15053 +#: commands/tablecmds.c:15117 #, c-format msgid "cannot set options for relation \"%s\"" msgstr "für Relation »%s« können keine Optionen gesetzt werden" -#: commands/tablecmds.c:15087 commands/view.c:440 +#: commands/tablecmds.c:15151 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:15338 +#: commands/tablecmds.c:15402 #, 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:15350 +#: commands/tablecmds.c:15414 #, 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:15442 +#: commands/tablecmds.c:15506 #, 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:15458 +#: commands/tablecmds.c:15522 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "keine passenden Relationen in Tablespace »%s« gefunden" -#: commands/tablecmds.c:15580 +#: commands/tablecmds.c:15644 #, c-format msgid "cannot change inheritance of typed table" msgstr "Vererbung einer getypten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:15585 commands/tablecmds.c:16085 +#: commands/tablecmds.c:15649 commands/tablecmds.c:16149 #, c-format msgid "cannot change inheritance of a partition" msgstr "Vererbung einer Partition kann nicht geändert werden" -#: commands/tablecmds.c:15590 +#: commands/tablecmds.c:15654 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "Vererbung einer partitionierten Tabelle kann nicht geändert werden" -#: commands/tablecmds.c:15636 +#: commands/tablecmds.c:15700 #, 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:15649 +#: commands/tablecmds.c:15713 #, c-format msgid "cannot inherit from a partition" msgstr "von einer Partition kann nicht geerbt werden" -#: commands/tablecmds.c:15671 commands/tablecmds.c:18529 +#: commands/tablecmds.c:15735 commands/tablecmds.c:18593 #, c-format msgid "circular inheritance not allowed" msgstr "zirkuläre Vererbung ist nicht erlaubt" -#: commands/tablecmds.c:15672 commands/tablecmds.c:18530 +#: commands/tablecmds.c:15736 commands/tablecmds.c:18594 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "»%s« ist schon von »%s« abgeleitet." -#: commands/tablecmds.c:15685 +#: commands/tablecmds.c:15749 #, 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:15687 +#: commands/tablecmds.c:15751 #, 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:15876 +#: commands/tablecmds.c:15940 #, 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:15885 +#: commands/tablecmds.c:15949 #, 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:15889 +#: commands/tablecmds.c:15953 #, 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:15927 +#: commands/tablecmds.c:15991 #, c-format msgid "child table is missing column \"%s\"" msgstr "Spalte »%s« fehlt in abgeleiteter Tabelle" -#: commands/tablecmds.c:16008 +#: commands/tablecmds.c:16072 #, 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:16015 +#: commands/tablecmds.c:16079 #, 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:16025 +#: commands/tablecmds.c:16089 #, 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:16063 +#: commands/tablecmds.c:16127 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "Constraint »%s« fehlt in abgeleiteter Tabelle" -#: commands/tablecmds.c:16149 +#: commands/tablecmds.c:16213 #, 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:16178 commands/tablecmds.c:16224 +#: commands/tablecmds.c:16242 commands/tablecmds.c:16288 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "Relation »%s« ist keine Partition von Relation »%s«" -#: commands/tablecmds.c:16230 +#: commands/tablecmds.c:16294 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "Relation »%s« ist keine Basisrelation von Relation »%s«" -#: commands/tablecmds.c:16457 +#: commands/tablecmds.c:16521 #, c-format msgid "typed tables cannot inherit" msgstr "getypte Tabellen können nicht erben" -#: commands/tablecmds.c:16487 +#: commands/tablecmds.c:16551 #, c-format msgid "table is missing column \"%s\"" msgstr "Spalte »%s« fehlt in Tabelle" -#: commands/tablecmds.c:16498 +#: commands/tablecmds.c:16562 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "Tabelle hat Spalte »%s«, aber Typ benötigt »%s«" -#: commands/tablecmds.c:16507 +#: commands/tablecmds.c:16571 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "Tabelle »%s« hat unterschiedlichen Typ für Spalte »%s«" -#: commands/tablecmds.c:16521 +#: commands/tablecmds.c:16585 #, c-format msgid "table has extra column \"%s\"" msgstr "Tabelle hat zusätzliche Spalte »%s«" -#: commands/tablecmds.c:16573 +#: commands/tablecmds.c:16637 #, c-format msgid "\"%s\" is not a typed table" msgstr "»%s« ist keine getypte Tabelle" -#: commands/tablecmds.c:16747 +#: commands/tablecmds.c:16811 #, 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:16753 +#: commands/tablecmds.c:16817 #, 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:16759 +#: commands/tablecmds.c:16823 #, 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:16765 +#: commands/tablecmds.c:16829 #, 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:16782 +#: commands/tablecmds.c:16846 #, 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:16789 +#: commands/tablecmds.c:16853 #, 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:17041 +#: commands/tablecmds.c:17105 #, 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:17065 +#: commands/tablecmds.c:17129 #, 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:17067 +#: commands/tablecmds.c:17131 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Ungeloggte Relationen können nicht repliziert werden." -#: commands/tablecmds.c:17112 +#: commands/tablecmds.c:17176 #, 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:17122 +#: commands/tablecmds.c:17186 #, 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:17180 +#: commands/tablecmds.c:17244 #, 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:17288 +#: commands/tablecmds.c:17352 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "Relation »%s« existiert bereits in Schema »%s«" -#: commands/tablecmds.c:17713 +#: commands/tablecmds.c:17777 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "»%s« ist keine Tabelle oder materialisierte Sicht" -#: commands/tablecmds.c:17866 +#: commands/tablecmds.c:17930 #, c-format msgid "\"%s\" is not a composite type" msgstr "»%s« ist kein zusammengesetzter Typ" -#: commands/tablecmds.c:17896 +#: commands/tablecmds.c:17960 #, c-format msgid "cannot change schema of index \"%s\"" msgstr "kann Schema des Index »%s« nicht ändern" -#: commands/tablecmds.c:17898 commands/tablecmds.c:17912 +#: commands/tablecmds.c:17962 commands/tablecmds.c:17976 #, c-format msgid "Change the schema of the table instead." msgstr "Ändern Sie stattdessen das Schema der Tabelle." -#: commands/tablecmds.c:17902 +#: commands/tablecmds.c:17966 #, c-format msgid "cannot change schema of composite type \"%s\"" msgstr "kann Schema des zusammengesetzten Typs »%s« nicht ändern" -#: commands/tablecmds.c:17910 +#: commands/tablecmds.c:17974 #, c-format msgid "cannot change schema of TOAST table \"%s\"" msgstr "kann Schema der TOAST-Tabelle »%s« nicht ändern" -#: commands/tablecmds.c:17942 +#: commands/tablecmds.c:18006 #, 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:18008 +#: commands/tablecmds.c:18072 #, 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:18016 +#: commands/tablecmds.c:18080 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "Systemspalte »%s« kann nicht im Partitionierungsschlüssel verwendet werden" -#: commands/tablecmds.c:18027 commands/tablecmds.c:18117 +#: commands/tablecmds.c:18091 commands/tablecmds.c:18181 #, c-format msgid "cannot use generated column in partition key" msgstr "generierte Spalte kann nicht im Partitionierungsschlüssel verwendet werden" -#: commands/tablecmds.c:18100 +#: commands/tablecmds.c:18164 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "Partitionierungsschlüsselausdruck kann nicht auf Systemspalten verweisen" -#: commands/tablecmds.c:18147 +#: commands/tablecmds.c:18211 #, 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:18156 +#: commands/tablecmds.c:18220 #, c-format msgid "cannot use constant expression as partition key" msgstr "Partitionierungsschlüssel kann kein konstanter Ausdruck sein" -#: commands/tablecmds.c:18177 +#: commands/tablecmds.c:18241 #, 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:18212 +#: commands/tablecmds.c:18276 #, 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:18218 +#: commands/tablecmds.c:18282 #, 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:18469 +#: commands/tablecmds.c:18533 #, c-format msgid "\"%s\" is already a partition" msgstr "»%s« ist bereits eine Partition" -#: commands/tablecmds.c:18475 +#: commands/tablecmds.c:18539 #, c-format msgid "cannot attach a typed table as partition" msgstr "eine getypte Tabelle kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:18491 +#: commands/tablecmds.c:18555 #, c-format msgid "cannot attach inheritance child as partition" msgstr "ein Vererbungskind kann nicht als Partition angefügt werden" -#: commands/tablecmds.c:18505 +#: commands/tablecmds.c:18569 #, 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:18539 +#: commands/tablecmds.c:18603 #, 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:18547 +#: commands/tablecmds.c:18611 #, 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:18555 +#: commands/tablecmds.c:18619 #, 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:18562 +#: commands/tablecmds.c:18626 #, 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:18582 +#: commands/tablecmds.c:18646 #, 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:18584 +#: commands/tablecmds.c:18648 #, c-format msgid "The new partition may not contain an identity column." msgstr "Die neue Partition darf keine Identitätsspalte enthalten." -#: commands/tablecmds.c:18592 +#: commands/tablecmds.c:18656 #, 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:18595 +#: commands/tablecmds.c:18659 #, 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:18607 +#: commands/tablecmds.c:18671 #, 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:18609 +#: commands/tablecmds.c:18673 #, 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:18785 +#: commands/tablecmds.c:18849 #, 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:18788 +#: commands/tablecmds.c:18852 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "Partitionierte Tabelle »%s« enthält Unique-Indexe." -#: commands/tablecmds.c:19110 +#: commands/tablecmds.c:19174 #, 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:19219 +#: commands/tablecmds.c:19283 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "partitionierte Tabelle »%s« wurde nebenläufig entfernt" -#: commands/tablecmds.c:19225 +#: commands/tablecmds.c:19289 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "Partition »%s« wurde nebenläufig entfernt" -#: commands/tablecmds.c:19839 commands/tablecmds.c:19859 -#: commands/tablecmds.c:19880 commands/tablecmds.c:19899 -#: commands/tablecmds.c:19941 +#: commands/tablecmds.c:19911 commands/tablecmds.c:19931 +#: commands/tablecmds.c:19952 commands/tablecmds.c:19971 +#: commands/tablecmds.c:20013 #, 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:19842 +#: commands/tablecmds.c:19914 #, 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:19862 +#: commands/tablecmds.c:19934 #, 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:19883 +#: commands/tablecmds.c:19955 #, c-format msgid "The index definitions do not match." msgstr "Die Indexdefinitionen stimmen nicht überein." -#: commands/tablecmds.c:19902 +#: commands/tablecmds.c:19974 #, 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:19944 +#: commands/tablecmds.c:20016 #, 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:20180 +#: commands/tablecmds.c:20252 #, c-format msgid "column data type %s does not support compression" msgstr "Spaltendatentyp %s unterstützt keine Komprimierung" -#: commands/tablecmds.c:20187 +#: commands/tablecmds.c:20259 #, c-format msgid "invalid compression method \"%s\"" msgstr "ungültige Komprimierungsmethode »%s«" -#: commands/tablecmds.c:20213 +#: commands/tablecmds.c:20285 #, c-format msgid "invalid storage type \"%s\"" msgstr "ungültiger Storage-Typ »%s«" -#: commands/tablecmds.c:20223 +#: commands/tablecmds.c:20295 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "Spaltendatentyp %s kann nur Storage-Typ PLAIN" @@ -12026,281 +12028,286 @@ msgstr "Verzeichnisse für Tablespace %u konnten nicht entfernt werden" msgid "You can remove the directories manually if necessary." msgstr "Sie können die Verzeichnisse falls nötig manuell entfernen." -#: commands/trigger.c:225 commands/trigger.c:236 +#: commands/trigger.c:226 commands/trigger.c:237 #, c-format msgid "\"%s\" is a table" msgstr "»%s« ist eine Tabelle" -#: commands/trigger.c:227 commands/trigger.c:238 +#: commands/trigger.c:228 commands/trigger.c:239 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "Tabellen können keine INSTEAD OF-Trigger haben." -#: commands/trigger.c:259 +#: commands/trigger.c:260 #, c-format msgid "\"%s\" is a partitioned table" msgstr "»%s« ist eine partitionierte Tabelle" -#: commands/trigger.c:261 +#: commands/trigger.c:262 #, 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:273 commands/trigger.c:280 commands/trigger.c:444 +#: commands/trigger.c:274 commands/trigger.c:281 commands/trigger.c:445 #, c-format msgid "\"%s\" is a view" msgstr "»%s« ist eine Sicht" -#: commands/trigger.c:275 +#: commands/trigger.c:276 #, 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:282 +#: commands/trigger.c:283 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "Sichten können keine TRUNCATE-Trigger haben." -#: commands/trigger.c:290 commands/trigger.c:302 commands/trigger.c:437 +#: commands/trigger.c:291 commands/trigger.c:303 commands/trigger.c:438 #, c-format msgid "\"%s\" is a foreign table" msgstr "»%s« ist eine Fremdtabelle" -#: commands/trigger.c:292 +#: commands/trigger.c:293 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "Fremdtabellen können keine INSTEAD OF-Trigger haben." -#: commands/trigger.c:304 +#: commands/trigger.c:305 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "Fremdtabellen können keine Constraint-Trigger haben." -#: commands/trigger.c:309 commands/trigger.c:1325 commands/trigger.c:1432 +#: commands/trigger.c:310 commands/trigger.c:1326 commands/trigger.c:1433 #, c-format msgid "relation \"%s\" cannot have triggers" msgstr "Relation »%s« kann keine Trigger haben" -#: commands/trigger.c:380 +#: commands/trigger.c:381 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "TRUNCATE FOR EACH ROW-Trigger werden nicht unterstützt" -#: commands/trigger.c:388 +#: commands/trigger.c:389 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "INSTEAD OF-Trigger müssen FOR EACH ROW sein" -#: commands/trigger.c:392 +#: commands/trigger.c:393 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "INSTEAD OF-Trigger können keine WHEN-Bedingungen haben" -#: commands/trigger.c:396 +#: commands/trigger.c:397 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "INSTEAD OF-Trigger können keine Spaltenlisten haben" -#: commands/trigger.c:425 +#: commands/trigger.c:426 #, 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:426 +#: commands/trigger.c:427 #, 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:439 +#: commands/trigger.c:440 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "Trigger für Fremdtabellen können keine Übergangstabellen haben." -#: commands/trigger.c:446 +#: commands/trigger.c:447 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "Trigger für Sichten können keine Übergangstabellen haben." -#: commands/trigger.c:462 +#: commands/trigger.c:463 #, 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:466 +#: commands/trigger.c:467 #, 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:472 +#: commands/trigger.c:473 #, 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:477 +#: commands/trigger.c:478 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "TRUNCATE-Trigger mit Übergangstabellen werden nicht unterstützt" -#: commands/trigger.c:494 +#: commands/trigger.c:495 #, 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:505 +#: commands/trigger.c:506 #, 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:522 +#: commands/trigger.c:523 #, 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:527 +#: commands/trigger.c:528 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE kann nicht mehrmals angegeben werden" -#: commands/trigger.c:537 +#: commands/trigger.c:538 #, 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:542 +#: commands/trigger.c:543 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE kann nicht mehrmals angegeben werden" -#: commands/trigger.c:552 +#: commands/trigger.c:553 #, 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:616 commands/trigger.c:629 +#: commands/trigger.c:617 commands/trigger.c:630 #, 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:621 +#: commands/trigger.c:622 #, 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:634 +#: commands/trigger.c:635 #, 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:639 +#: commands/trigger.c:640 #, 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:647 commands/trigger.c:655 +#: commands/trigger.c:648 commands/trigger.c:656 #, 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:648 +#: commands/trigger.c:649 #, 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:763 commands/trigger.c:1607 +#: commands/trigger.c:764 commands/trigger.c:1608 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "Trigger »%s« für Relation »%s« existiert bereits" -#: commands/trigger.c:776 +#: commands/trigger.c:777 #, 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:795 +#: commands/trigger.c:796 #, 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:1397 commands/trigger.c:1550 commands/trigger.c:1831 +#: commands/trigger.c:1398 commands/trigger.c:1551 commands/trigger.c:1832 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "Trigger »%s« für Tabelle »%s« existiert nicht" -#: commands/trigger.c:1522 +#: commands/trigger.c:1523 #, c-format msgid "cannot rename trigger \"%s\" on table \"%s\"" msgstr "Trigger »%s« für Tabelle »%s« kann nicht umbenannt werden" -#: commands/trigger.c:1524 +#: commands/trigger.c:1525 #, 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:1624 +#: commands/trigger.c:1625 #, c-format msgid "renamed trigger \"%s\" on relation \"%s\"" msgstr "Trigger »%s« für Tabelle »%s« wurde umbenannt" -#: commands/trigger.c:1770 +#: commands/trigger.c:1771 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "keine Berechtigung: »%s« ist ein Systemtrigger" -#: commands/trigger.c:2379 +#: commands/trigger.c:2380 #, c-format msgid "trigger function %u returned null value" msgstr "Triggerfunktion %u gab NULL-Wert zurück" -#: commands/trigger.c:2439 commands/trigger.c:2657 commands/trigger.c:2910 -#: commands/trigger.c:3263 +#: commands/trigger.c:2440 commands/trigger.c:2667 commands/trigger.c:2957 +#: commands/trigger.c:3347 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "Trigger für BEFORE STATEMENT kann keinen Wert zurückgeben" -#: commands/trigger.c:2515 +#: commands/trigger.c:2516 #, 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:2516 +#: commands/trigger.c:2517 #, 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: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 +#: commands/trigger.c:2546 commands/trigger.c:2825 commands/trigger.c:3188 +#, c-format +msgid "cannot collect transition tuples from child foreign tables" +msgstr "aus abgeleiteten Fremdtabellen können keine Übergangstupel gesammelt werden" + +#: commands/trigger.c:3426 executor/nodeModifyTable.c:1563 +#: executor/nodeModifyTable.c:1637 executor/nodeModifyTable.c:2400 +#: executor/nodeModifyTable.c:2491 executor/nodeModifyTable.c:3155 +#: executor/nodeModifyTable.c:3325 #, 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: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 +#: commands/trigger.c:3468 executor/nodeLockRows.c:228 +#: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:335 +#: executor/nodeModifyTable.c:1579 executor/nodeModifyTable.c:2417 +#: executor/nodeModifyTable.c:2641 #, c-format msgid "could not serialize access due to concurrent update" msgstr "konnte Zugriff nicht serialisieren wegen gleichzeitiger Aktualisierung" -#: commands/trigger.c:3390 executor/nodeModifyTable.c:1647 -#: executor/nodeModifyTable.c:2485 executor/nodeModifyTable.c:2642 -#: executor/nodeModifyTable.c:3150 +#: commands/trigger.c:3476 executor/nodeModifyTable.c:1669 +#: executor/nodeModifyTable.c:2508 executor/nodeModifyTable.c:2665 +#: executor/nodeModifyTable.c:3173 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "konnte Zugriff nicht serialisieren wegen gleichzeitigem Löschen" -#: commands/trigger.c:4599 +#: commands/trigger.c:4685 #, 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:5780 +#: commands/trigger.c:5866 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "Constraint »%s« ist nicht aufschiebbar" -#: commands/trigger.c:5803 +#: commands/trigger.c:5889 #, c-format msgid "constraint \"%s\" does not exist" msgstr "Constraint »%s« existiert nicht" @@ -12768,8 +12775,8 @@ msgstr "Nur Rollen mit dem %s-Attribut können Rollen erzeugen." 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: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 +#: commands/user.c:354 commands/user.c:1386 commands/user.c:1393 gram.y:17317 +#: gram.y:17363 utils/adt/acl.c:5591 utils/adt/acl.c:5597 #, c-format msgid "role name \"%s\" is reserved" msgstr "Rollenname »%s« ist reserviert" @@ -12864,8 +12871,8 @@ msgstr "in DROP ROLE kann kein Rollenplatzhalter verwendet werden" #: 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/acl.c:382 utils/adt/acl.c:402 utils/adt/acl.c:5446 +#: utils/adt/acl.c:5494 utils/adt/acl.c:5522 utils/adt/acl.c:5541 #: utils/adt/regproc.c:1571 utils/init/miscinit.c:799 #, c-format msgid "role \"%s\" does not exist" @@ -13056,122 +13063,122 @@ msgstr "keine Berechtigung, um von Rolle »%s« gewährte Privilegien zu entzieh msgid "Only roles with privileges of role \"%s\" may revoke privileges granted by this role." msgstr "Nur Rollen mit den Privilegien der Rolle »%s« können von dieser Rolle gewährte Privilegien entziehen." -#: commands/user.c:2491 utils/adt/acl.c:1324 +#: commands/user.c:2491 utils/adt/acl.c:1341 #, c-format msgid "dependent privileges exist" msgstr "abhängige Privilegien existieren" -#: commands/user.c:2492 utils/adt/acl.c:1325 +#: commands/user.c:2492 utils/adt/acl.c:1342 #, c-format msgid "Use CASCADE to revoke them too." msgstr "Verwenden Sie CASCADE, um diese auch zu entziehen." -#: commands/vacuum.c:134 +#: commands/vacuum.c:135 #, 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" -#: commands/vacuum.c:209 +#: commands/vacuum.c:210 #, c-format msgid "BUFFER_USAGE_LIMIT option must be 0 or between %d kB and %d kB" msgstr "Option BUFFER_USAGE_LIMIT muss 0 sein oder zwischen %d kB und %d kB liegen" -#: commands/vacuum.c:219 +#: commands/vacuum.c:220 #, c-format msgid "unrecognized ANALYZE option \"%s\"" msgstr "unbekannte ANALYZE-Option »%s«" -#: commands/vacuum.c:259 +#: commands/vacuum.c:260 #, c-format msgid "parallel option requires a value between 0 and %d" msgstr "Option PARALLEL benötigt einen Wert zwischen 0 und %d" -#: commands/vacuum.c:271 +#: commands/vacuum.c:272 #, c-format msgid "parallel workers for vacuum must be between 0 and %d" msgstr "parallele Arbeitsprozesse für Vacuum müssen zwischen 0 und %d sein" -#: commands/vacuum.c:292 +#: commands/vacuum.c:293 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "unbekannte VACUUM-Option »%s«" -#: commands/vacuum.c:318 +#: commands/vacuum.c:319 #, c-format msgid "VACUUM FULL cannot be performed in parallel" msgstr "VACUUM FULL kann nicht parallel ausgeführt werden" -#: commands/vacuum.c:329 +#: commands/vacuum.c:330 #, c-format msgid "BUFFER_USAGE_LIMIT cannot be specified for VACUUM FULL" msgstr "BUFFER_USAGE_LIMIT kann nicht für VACUUM FULL angegeben werden" -#: commands/vacuum.c:343 +#: commands/vacuum.c:344 #, c-format msgid "ANALYZE option must be specified when a column list is provided" msgstr "Option ANALYZE muss angegeben werden, wenn eine Spaltenliste angegeben ist" -#: commands/vacuum.c:355 +#: commands/vacuum.c:356 #, c-format msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" msgstr "VACUUM-Option DISABLE_PAGE_SKIPPING kann nicht zusammen mit FULL verwendet werden" -#: commands/vacuum.c:362 +#: commands/vacuum.c:363 #, c-format msgid "PROCESS_TOAST required with VACUUM FULL" msgstr "PROCESS_TOAST benötigt VACUUM FULL" -#: commands/vacuum.c:371 +#: commands/vacuum.c:372 #, c-format msgid "ONLY_DATABASE_STATS cannot be specified with a list of tables" msgstr "ONLY_DATABASE_STATS kann nicht mit einer Tabellenliste angegeben werden" -#: commands/vacuum.c:380 +#: commands/vacuum.c:381 #, c-format msgid "ONLY_DATABASE_STATS cannot be specified with other VACUUM options" msgstr "ONLY_DATABASE_STATS kann nicht mit anderen VACUUM-Optionen angegeben werden" -#: commands/vacuum.c:515 +#: commands/vacuum.c:516 #, c-format msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%s kann nicht aus VACUUM oder ANALYZE ausgeführt werden" -#: commands/vacuum.c:730 +#: commands/vacuum.c:741 #, c-format msgid "permission denied to vacuum \"%s\", skipping it" msgstr "keine Berechtigung für Vacuum von »%s«, wird übersprungen" -#: commands/vacuum.c:743 +#: commands/vacuum.c:754 #, c-format msgid "permission denied to analyze \"%s\", skipping it" msgstr "keine Berechtigung für Analyze von »%s«, wird übersprungen" -#: commands/vacuum.c:821 commands/vacuum.c:918 +#: commands/vacuum.c:832 commands/vacuum.c:929 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "überspringe Vacuum von »%s« --- Sperre nicht verfügbar" -#: commands/vacuum.c:826 +#: commands/vacuum.c:837 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "überspringe Vacuum von »%s« --- Relation existiert nicht mehr" -#: commands/vacuum.c:842 commands/vacuum.c:923 +#: commands/vacuum.c:853 commands/vacuum.c:934 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "überspringe Analyze von »%s« --- Sperre nicht verfügbar" -#: commands/vacuum.c:847 +#: commands/vacuum.c:858 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "überspringe Analyze von »%s« --- Relation existiert nicht mehr" -#: commands/vacuum.c:1139 +#: commands/vacuum.c:1150 #, c-format msgid "cutoff for removing and freezing tuples is far in the past" msgstr "Obergrenze für das Entfernen und Einfrieren von Tuples ist weit in der Vergangenheit" -#: commands/vacuum.c:1140 commands/vacuum.c:1145 +#: commands/vacuum.c:1151 commands/vacuum.c:1156 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -13180,37 +13187,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:1144 +#: commands/vacuum.c:1155 #, c-format msgid "cutoff for freezing multixacts is far in the past" msgstr "Obergrenze für das Einfrieren von Multixacts ist weit in der Vergangenheit" -#: commands/vacuum.c:1900 +#: commands/vacuum.c:1911 #, 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:1901 +#: commands/vacuum.c:1912 #, 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:2080 +#: commands/vacuum.c:2098 #, 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:2512 +#: commands/vacuum.c:2545 #, c-format msgid "scanned index \"%s\" to remove %lld row versions" msgstr "Index »%s« gelesen und %lld Zeilenversionen entfernt" -#: commands/vacuum.c:2531 +#: commands/vacuum.c:2564 #, 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:2535 +#: commands/vacuum.c:2568 #, c-format msgid "" "%.0f index row versions were removed.\n" @@ -13462,26 +13469,26 @@ msgid "no value found for parameter %d" msgstr "kein Wert für Parameter %d gefunden" #: 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 +#: executor/execExprInterp.c:4851 executor/execExprInterp.c:4868 +#: executor/execExprInterp.c:4967 executor/nodeModifyTable.c:204 +#: executor/nodeModifyTable.c:223 executor/nodeModifyTable.c:240 +#: executor/nodeModifyTable.c:250 executor/nodeModifyTable.c:260 #, 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:643 executor/nodeModifyTable.c:204 +#: executor/execExpr.c:643 executor/nodeModifyTable.c:205 #, c-format msgid "Query has too many columns." msgstr "Anfrage hat zu viele Spalten." -#: executor/execExpr.c:650 executor/nodeModifyTable.c:232 +#: executor/execExpr.c:650 executor/nodeModifyTable.c:224 #, 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:656 executor/execExprInterp.c:4870 -#: executor/nodeModifyTable.c:215 +#: executor/execExpr.c:656 executor/execExprInterp.c:4869 +#: executor/nodeModifyTable.c:251 #, 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." @@ -13566,7 +13573,7 @@ msgstr "Arrayelement mit Typ %s kann nicht in ARRAY-Konstrukt mit Elementtyp %s #: 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/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)" @@ -13585,7 +13592,7 @@ msgstr "mehrdimensionale Arrays müssen Arraysausdrücke mit gleicher Anzahl Dim #: 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/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 @@ -13623,14 +13630,14 @@ msgstr "kein SQL/JSON-Item für angegebenen Pfad gefunden" 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 +#: executor/execExprInterp.c:4852 #, 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:4969 executor/execSRF.c:977 +#: executor/execExprInterp.c:4968 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." @@ -13740,7 +13747,7 @@ msgstr "kann Zeilen in Sicht »%s« nicht sperren" msgid "cannot lock rows in materialized view \"%s\"" msgstr "kann Zeilen in materialisierter Sicht »%s« nicht sperren" -#: executor/execMain.c:1177 executor/execMain.c:2687 +#: executor/execMain.c:1177 executor/execMain.c:2689 #: executor/nodeLockRows.c:135 #, c-format msgid "cannot lock rows in foreign table \"%s\"" @@ -13832,10 +13839,10 @@ msgstr "gleichzeitige Aktualisierung, versuche erneut" msgid "concurrent delete, retrying" msgstr "gleichzeitiges Löschen, versuche erneut" -#: executor/execReplication.c:352 parser/parse_cte.c:302 +#: 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:6426 +#: 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" @@ -14078,64 +14085,69 @@ 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:240 +#: executor/nodeModifyTable.c:241 +#, 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:261 #, c-format msgid "Query has too few columns." msgstr "Anfrage hat zu wenige Spalten." -#: executor/nodeModifyTable.c:1540 executor/nodeModifyTable.c:1614 +#: executor/nodeModifyTable.c:1562 executor/nodeModifyTable.c:1636 #, 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:1769 +#: executor/nodeModifyTable.c:1791 #, c-format msgid "invalid ON UPDATE specification" msgstr "ungültige ON-UPDATE-Angabe" -#: executor/nodeModifyTable.c:1770 +#: executor/nodeModifyTable.c:1792 #, 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:2226 +#: executor/nodeModifyTable.c:2249 #, 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:2227 +#: executor/nodeModifyTable.c:2250 #, 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:2230 +#: executor/nodeModifyTable.c:2253 #, 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:2596 executor/nodeModifyTable.c:3138 -#: executor/nodeModifyTable.c:3308 +#: executor/nodeModifyTable.c:2619 executor/nodeModifyTable.c:3161 +#: executor/nodeModifyTable.c:3331 #, 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:2598 +#: executor/nodeModifyTable.c:2621 #, 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:3131 executor/nodeModifyTable.c:3301 +#: executor/nodeModifyTable.c:3154 executor/nodeModifyTable.c:3324 #, 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" -#: executor/nodeModifyTable.c:3140 executor/nodeModifyTable.c:3310 +#: executor/nodeModifyTable.c:3163 executor/nodeModifyTable.c:3333 #, 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." -#: executor/nodeModifyTable.c:3209 +#: executor/nodeModifyTable.c:3232 #, c-format 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" @@ -14298,7 +14310,7 @@ msgstr "konnte Tupel nicht an Shared-Memory-Queue senden" msgid "user mapping not found for user \"%s\", server \"%s\"" msgstr "Benutzerabbildung für Benutzer »%s«, Server »%s« nicht gefunden" -#: foreign/foreign.c:336 optimizer/plan/createplan.c:7153 +#: foreign/foreign.c:336 optimizer/plan/createplan.c:7155 #: optimizer/util/plancat.c:540 #, c-format msgid "access to non-system foreign table is restricted" @@ -14513,200 +14525,205 @@ msgstr "widersprüchliche oder überflüssige NULL/NOT NULL-Deklarationen für S msgid "unrecognized column option \"%s\"" msgstr "unbekannte Spaltenoption »%s«" -#: gram.y:14147 +#: gram.y:14098 +#, c-format +msgid "option name \"%s\" cannot be used in XMLTABLE" +msgstr "Optionsname »%s« kann nicht in XMLTABLE verwendet werden" + +#: gram.y:14154 #, 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 +#: gram.y:14476 #, 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:14478 +#: gram.y:14485 #, 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:14995 +#: gram.y:15002 #, 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:15000 +#: gram.y:15007 #, 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:15177 +#: gram.y:15184 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "UNIQUE-Prädikat ist noch nicht implementiert" -#: gram.y:15591 +#: gram.y:15598 #, 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:15596 +#: gram.y:15603 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "DISTINCT kann nicht mit WITHIN GROUP verwendet werden" -#: gram.y:15601 +#: gram.y:15608 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "VARIADIC kann nicht mit WITHIN GROUP verwendet werden" -#: gram.y:16328 gram.y:16352 +#: gram.y:16335 gram.y:16359 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "Frame-Beginn kann nicht UNBOUNDED FOLLOWING sein" -#: gram.y:16333 +#: gram.y:16340 #, 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:16357 +#: gram.y:16364 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "Frame-Ende kann nicht UNBOUNDED PRECEDING sein" -#: gram.y:16363 +#: gram.y:16370 #, 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:16370 +#: gram.y:16377 #, 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:16919 +#: gram.y:16926 #, c-format msgid "unrecognized JSON encoding: %s" msgstr "unbekannte JSON-Kodierung: %s" -#: gram.y:17243 +#: gram.y:17250 #, c-format msgid "type modifier cannot have parameter name" msgstr "Typmodifikator kann keinen Parameternamen haben" -#: gram.y:17249 +#: gram.y:17256 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "Typmodifikator kann kein ORDER BY haben" -#: gram.y:17317 gram.y:17324 gram.y:17331 +#: gram.y:17324 gram.y:17331 gram.y:17338 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s kann hier nicht als Rollenname verwendet werden" -#: gram.y:17421 gram.y:18906 +#: gram.y:17428 gram.y:18913 #, 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:18597 gram.y:18772 +#: gram.y:18604 gram.y:18779 msgid "improper use of \"*\"" msgstr "unzulässige Verwendung von »*«" -#: gram.y:18735 gram.y:18752 tsearch/spell.c:963 tsearch/spell.c:980 -#: tsearch/spell.c:997 tsearch/spell.c:1014 tsearch/spell.c:1079 +#: gram.y:18742 gram.y:18759 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:18836 +#: gram.y:18843 #, 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:18873 +#: gram.y:18880 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "mehrere ORDER-BY-Klauseln sind nicht erlaubt" -#: gram.y:18884 +#: gram.y:18891 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "mehrere OFFSET-Klauseln sind nicht erlaubt" -#: gram.y:18893 +#: gram.y:18900 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "mehrere LIMIT-Klauseln sind nicht erlaubt" -#: gram.y:18902 +#: gram.y:18909 #, c-format msgid "multiple limit options not allowed" msgstr "mehrere Limit-Optionen sind nicht erlaubt" -#: gram.y:18929 +#: gram.y:18936 #, c-format msgid "multiple WITH clauses not allowed" msgstr "mehrere WITH-Klauseln sind nicht erlaubt" -#: gram.y:19122 +#: gram.y:19129 #, 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:19255 +#: gram.y:19262 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "mehrere COLLATE-Klauseln sind nicht erlaubt" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:19293 gram.y:19306 +#: gram.y:19300 gram.y:19313 #, 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:19319 +#: gram.y:19326 #, 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:19332 +#: gram.y:19339 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "%s-Constraints können nicht als NO INHERIT markiert werden" -#: gram.y:19354 +#: gram.y:19361 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "unbekannte Partitionierungsstrategie »%s«" -#: gram.y:19378 +#: gram.y:19385 #, c-format msgid "invalid publication object list" msgstr "ungültige Publikationsobjektliste" -#: gram.y:19379 +#: gram.y:19386 #, 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:19395 +#: gram.y:19402 #, c-format msgid "invalid table name" msgstr "ungültiger Tabellenname" -#: gram.y:19416 +#: gram.y:19423 #, c-format msgid "WHERE clause not allowed for schema" msgstr "für Schemas ist keine WHERE-Klausel erlaubt" -#: gram.y:19423 +#: gram.y:19430 #, c-format msgid "column specification not allowed for schema" msgstr "für Schemas ist keine Spaltenangabe erlaubt" -#: gram.y:19437 +#: gram.y:19444 #, c-format msgid "invalid schema name" msgstr "ungültiger Schemaname" @@ -14769,7 +14786,7 @@ msgstr ".decimal() kann nur optionale Argumente Präzision[,Skala] haben." msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." msgstr "Unbekanntes Flag-Zeichen »%.*s« in LIKE_REGEX-Prädikat." -#: jsonpath_gram.y:629 tsearch/spell.c:749 utils/adt/regexp.c:223 +#: 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" @@ -15004,545 +15021,545 @@ msgstr "Fehlerhafter Proof in »client-final-message«." msgid "Garbage found at the end of client-final-message." msgstr "Müll am Ende der »client-final-message« gefunden." -#: libpq/auth.c:269 +#: libpq/auth.c:277 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "Authentifizierung für Benutzer »%s« fehlgeschlagen: Host abgelehnt" -#: libpq/auth.c:272 +#: libpq/auth.c:280 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "»trust«-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:275 +#: libpq/auth.c:283 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "Ident-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:278 +#: libpq/auth.c:286 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "Peer-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:283 +#: libpq/auth.c:291 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "Passwort-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:288 +#: libpq/auth.c:296 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "GSSAPI-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:291 +#: libpq/auth.c:299 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "SSPI-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:294 +#: libpq/auth.c:302 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "PAM-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:297 +#: libpq/auth.c:305 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "BSD-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:300 +#: libpq/auth.c:308 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "LDAP-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:303 +#: libpq/auth.c:311 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "Zertifikatauthentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:306 +#: libpq/auth.c:314 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "RADIUS-Authentifizierung für Benutzer »%s« fehlgeschlagen" -#: libpq/auth.c:309 +#: libpq/auth.c:317 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "Authentifizierung für Benutzer »%s« fehlgeschlagen: ungültige Authentifizierungsmethode" -#: libpq/auth.c:313 +#: libpq/auth.c:321 #, c-format msgid "Connection matched file \"%s\" line %d: \"%s\"" msgstr "Verbindung stimmte mit Datei »%s« Zeile %d überein: »%s«" -#: libpq/auth.c:357 +#: libpq/auth.c:365 #, c-format msgid "authentication identifier set more than once" msgstr "Authentifizierungsbezeichner mehrmals gesetzt" -#: libpq/auth.c:358 +#: libpq/auth.c:366 #, c-format msgid "previous identifier: \"%s\"; new identifier: \"%s\"" msgstr "vorheriger Bezeichner: »%s«; neuer Bezeichner: »%s«" -#: libpq/auth.c:368 +#: libpq/auth.c:376 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" msgstr "Verbindung authentifiziert: Identität=»%s« Methode=%s (%s:%d)" -#: libpq/auth.c:408 +#: libpq/auth.c:416 #, 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:419 +#: libpq/auth.c:427 #, c-format msgid "connection requires a valid client certificate" msgstr "Verbindung erfordert ein gültiges Client-Zertifikat" -#: libpq/auth.c:450 libpq/auth.c:496 +#: libpq/auth.c:458 libpq/auth.c:504 msgid "GSS encryption" msgstr "GSS-Verschlüsselung" -#: libpq/auth.c:453 libpq/auth.c:499 +#: libpq/auth.c:461 libpq/auth.c:507 msgid "SSL encryption" msgstr "SSL-Verschlüsselung" -#: libpq/auth.c:455 libpq/auth.c:501 +#: libpq/auth.c:463 libpq/auth.c:509 msgid "no encryption" msgstr "keine Verschlüsselung" #. translator: last %s describes encryption state -#: libpq/auth.c:461 +#: libpq/auth.c:469 #, 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:468 +#: libpq/auth.c:476 #, 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:506 +#: libpq/auth.c:514 #, 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:509 +#: libpq/auth.c:517 #, 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:512 +#: libpq/auth.c:520 #, 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:515 +#: libpq/auth.c:523 #, 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:520 +#: libpq/auth.c:528 #, 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:528 +#: libpq/auth.c:536 #, 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:536 +#: libpq/auth.c:544 #, 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:656 +#: libpq/auth.c:664 #, c-format msgid "connection authenticated: user=\"%s\" method=%s (%s:%d)" msgstr "Verbindung authentifiziert: Benutzer=»%s« Methode=%s (%s:%d)" -#: libpq/auth.c:725 +#: libpq/auth.c:733 #, c-format msgid "expected password response, got message type %d" msgstr "Passwort-Antwort erwartet, Message-Typ %d empfangen" -#: libpq/auth.c:746 +#: libpq/auth.c:754 #, c-format msgid "invalid password packet size" msgstr "ungültige Größe des Passwortpakets" -#: libpq/auth.c:764 +#: libpq/auth.c:772 #, c-format msgid "empty password returned by client" msgstr "Client gab leeres Passwort zurück" -#: libpq/auth.c:892 +#: libpq/auth.c:900 #, c-format msgid "could not generate random MD5 salt" msgstr "konnte zufälliges MD5-Salt nicht erzeugen" -#: libpq/auth.c:943 libpq/be-secure-gssapi.c:540 +#: libpq/auth.c:951 libpq/be-secure-gssapi.c:550 #, c-format msgid "could not set environment: %m" msgstr "konnte Umgebung nicht setzen: %m" -#: libpq/auth.c:982 +#: libpq/auth.c:990 #, c-format msgid "expected GSS response, got message type %d" msgstr "GSS-Antwort erwartet, Message-Typ %d empfangen" -#: libpq/auth.c:1048 +#: libpq/auth.c:1056 msgid "accepting GSS security context failed" msgstr "Annahme des GSS-Sicherheitskontexts fehlgeschlagen" -#: libpq/auth.c:1089 +#: libpq/auth.c:1097 msgid "retrieving GSS user name failed" msgstr "Abfrage des GSS-Benutzernamens fehlgeschlagen" -#: libpq/auth.c:1235 +#: libpq/auth.c:1243 msgid "could not acquire SSPI credentials" msgstr "konnte SSPI-Credentials nicht erhalten" -#: libpq/auth.c:1260 +#: libpq/auth.c:1268 #, c-format msgid "expected SSPI response, got message type %d" msgstr "SSPI-Antwort erwartet, Message-Typ %d empfangen" -#: libpq/auth.c:1338 +#: libpq/auth.c:1346 msgid "could not accept SSPI security context" msgstr "konnte SSPI-Sicherheitskontext nicht akzeptieren" -#: libpq/auth.c:1379 +#: libpq/auth.c:1387 msgid "could not get token from SSPI security context" msgstr "konnte kein Token vom SSPI-Sicherheitskontext erhalten" -#: libpq/auth.c:1515 libpq/auth.c:1534 +#: libpq/auth.c:1523 libpq/auth.c:1542 #, c-format msgid "could not translate name" msgstr "konnte Namen nicht umwandeln" -#: libpq/auth.c:1547 +#: libpq/auth.c:1555 #, c-format msgid "realm name too long" msgstr "Realm-Name zu lang" -#: libpq/auth.c:1562 +#: libpq/auth.c:1570 #, c-format msgid "translated account name too long" msgstr "umgewandelter Account-Name zu lang" -#: libpq/auth.c:1741 +#: libpq/auth.c:1749 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "konnte Socket für Ident-Verbindung nicht erzeugen: %m" -#: libpq/auth.c:1756 +#: libpq/auth.c:1764 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "konnte nicht mit lokaler Adresse »%s« verbinden: %m" -#: libpq/auth.c:1768 +#: libpq/auth.c:1776 #, 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:1790 +#: libpq/auth.c:1798 #, 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:1807 +#: libpq/auth.c:1815 #, 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:1817 +#: libpq/auth.c:1825 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "ungültig formatierte Antwort vom Ident-Server: »%s«" -#: libpq/auth.c:1870 +#: libpq/auth.c:1878 #, c-format msgid "peer authentication is not supported on this platform" msgstr "Peer-Authentifizierung wird auf dieser Plattform nicht unterstützt" -#: libpq/auth.c:1874 +#: libpq/auth.c:1882 #, c-format msgid "could not get peer credentials: %m" msgstr "konnte Credentials von Gegenstelle nicht ermitteln: %m" -#: libpq/auth.c:1886 +#: libpq/auth.c:1894 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "konnte lokale Benutzer-ID %ld nicht nachschlagen: %s" -#: libpq/auth.c:1988 +#: libpq/auth.c:1996 #, c-format msgid "error from underlying PAM layer: %s" msgstr "Fehler von der unteren PAM-Ebene: %s" -#: libpq/auth.c:1999 +#: libpq/auth.c:2007 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" msgstr "nicht unterstützte PAM-Conversation: %d/»%s«" -#: libpq/auth.c:2056 +#: libpq/auth.c:2064 #, c-format msgid "could not create PAM authenticator: %s" msgstr "konnte PAM-Authenticator nicht erzeugen: %s" -#: libpq/auth.c:2067 +#: libpq/auth.c:2075 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "pam_set_item(PAM_USER) fehlgeschlagen: %s" -#: libpq/auth.c:2099 +#: libpq/auth.c:2107 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "pam_set_item(PAM_RHOST) fehlgeschlagen: %s" -#: libpq/auth.c:2111 +#: libpq/auth.c:2119 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "pam_set_item(PAM_CONV) fehlgeschlagen: %s" -#: libpq/auth.c:2124 +#: libpq/auth.c:2132 #, c-format msgid "pam_authenticate failed: %s" msgstr "pam_authenticate fehlgeschlagen: %s" -#: libpq/auth.c:2137 +#: libpq/auth.c:2145 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "pam_acct_mgmt fehlgeschlagen: %s" -#: libpq/auth.c:2148 +#: libpq/auth.c:2156 #, c-format msgid "could not release PAM authenticator: %s" msgstr "konnte PAM-Authenticator nicht freigeben: %s" -#: libpq/auth.c:2228 +#: libpq/auth.c:2236 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "konnte LDAP nicht initialisieren: Fehlercode %d" -#: libpq/auth.c:2265 +#: libpq/auth.c:2273 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "konnte keinen Domain-Namen aus ldapbasedn herauslesen" -#: libpq/auth.c:2273 +#: libpq/auth.c:2281 #, 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:2275 +#: libpq/auth.c:2283 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Geben Sie einen LDAP-Servernamen explizit an." -#: libpq/auth.c:2327 +#: libpq/auth.c:2335 #, c-format msgid "could not initialize LDAP: %s" msgstr "konnte LDAP nicht initialisieren: %s" -#: libpq/auth.c:2337 +#: libpq/auth.c:2345 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "ldaps wird mit dieser LDAP-Bibliothek nicht unterstützt" -#: libpq/auth.c:2345 +#: libpq/auth.c:2353 #, c-format msgid "could not initialize LDAP: %m" msgstr "konnte LDAP nicht initialisieren: %m" -#: libpq/auth.c:2355 +#: libpq/auth.c:2363 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "konnte LDAP-Protokollversion nicht setzen: %s" -#: libpq/auth.c:2371 +#: libpq/auth.c:2379 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "konnte LDAP-TLS-Sitzung nicht starten: %s" -#: libpq/auth.c:2448 +#: libpq/auth.c:2456 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "LDAP-Server nicht angegeben, und kein ldapbasedn" -#: libpq/auth.c:2455 +#: libpq/auth.c:2463 #, c-format msgid "LDAP server not specified" msgstr "LDAP-Server nicht angegeben" -#: libpq/auth.c:2517 +#: libpq/auth.c:2525 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "ungültiges Zeichen im Benutzernamen für LDAP-Authentifizierung" -#: libpq/auth.c:2534 +#: libpq/auth.c:2542 #, 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:2564 +#: libpq/auth.c:2572 #, 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:2580 +#: libpq/auth.c:2588 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "LDAP-Benutzer »%s« existiert nicht" -#: libpq/auth.c:2581 +#: libpq/auth.c:2589 #, 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:2585 +#: libpq/auth.c:2593 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "LDAP-Benutzer »%s« ist nicht eindeutig" -#: libpq/auth.c:2586 +#: libpq/auth.c:2594 #, 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:2606 +#: libpq/auth.c:2614 #, 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:2633 +#: libpq/auth.c:2641 #, 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:2665 +#: libpq/auth.c:2673 #, c-format msgid "LDAP diagnostics: %s" msgstr "LDAP-Diagnostik: %s" -#: libpq/auth.c:2703 +#: libpq/auth.c:2711 #, 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:2724 +#: libpq/auth.c:2732 #, 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:2747 +#: libpq/auth.c:2755 #, 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:2752 +#: libpq/auth.c:2760 #, 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:2854 +#: libpq/auth.c:2862 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS-Server nicht angegeben" -#: libpq/auth.c:2861 +#: libpq/auth.c:2869 #, c-format msgid "RADIUS secret not specified" msgstr "RADIUS-Geheimnis nicht angegeben" -#: libpq/auth.c:2875 +#: libpq/auth.c:2883 #, 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:2977 libpq/hba.c:2352 +#: libpq/auth.c:2985 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:2991 +#: libpq/auth.c:2999 #, c-format msgid "could not generate random encryption vector" msgstr "konnte zufälligen Verschlüsselungsvektor nicht erzeugen" -#: libpq/auth.c:3028 +#: libpq/auth.c:3036 #, 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:3055 +#: libpq/auth.c:3063 #, c-format msgid "could not create RADIUS socket: %m" msgstr "konnte RADIUS-Socket nicht erstellen: %m" -#: libpq/auth.c:3071 +#: libpq/auth.c:3079 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "konnte lokales RADIUS-Socket nicht binden: %m" -#: libpq/auth.c:3081 +#: libpq/auth.c:3089 #, c-format msgid "could not send RADIUS packet: %m" msgstr "konnte RADIUS-Paket nicht senden: %m" -#: libpq/auth.c:3115 libpq/auth.c:3141 +#: libpq/auth.c:3123 libpq/auth.c:3149 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "Zeitüberschreitung beim Warten auf RADIUS-Antwort von %s" -#: libpq/auth.c:3134 +#: libpq/auth.c:3142 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "konnte Status des RADIUS-Sockets nicht prüfen: %m" -#: libpq/auth.c:3164 +#: libpq/auth.c:3172 #, c-format msgid "could not read RADIUS response: %m" msgstr "konnte RADIUS-Antwort nicht lesen: %m" -#: libpq/auth.c:3172 +#: libpq/auth.c:3180 #, 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:3180 +#: libpq/auth.c:3188 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "RADIUS-Antwort von %s zu kurz: %d" -#: libpq/auth.c:3187 +#: libpq/auth.c:3195 #, 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:3195 +#: libpq/auth.c:3203 #, 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:3220 +#: libpq/auth.c:3228 #, 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:3230 +#: libpq/auth.c:3238 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "RADIUS-Antwort von %s hat falsche MD5-Signatur" -#: libpq/auth.c:3248 +#: libpq/auth.c:3256 #, 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«" @@ -15634,44 +15651,39 @@ msgstr "private Schlüsseldatei »%s« erlaubt Zugriff von Gruppe oder Welt" 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:201 +#: libpq/be-secure-gssapi.c:208 msgid "GSSAPI wrap error" msgstr "GSSAPI-Wrap-Fehler" -#: libpq/be-secure-gssapi.c:208 +#: libpq/be-secure-gssapi.c:215 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "ausgehende GSSAPI-Nachricht würde keine Vertraulichkeit verwenden" -#: libpq/be-secure-gssapi.c:215 libpq/be-secure-gssapi.c:634 +#: libpq/be-secure-gssapi.c:222 libpq/be-secure-gssapi.c:644 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "Server versuchte übergroßes GSSAPI-Paket zu senden (%zu > %zu)" -#: libpq/be-secure-gssapi.c:351 +#: libpq/be-secure-gssapi.c:358 libpq/be-secure-gssapi.c:585 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %zu)" msgstr "übergroßes GSSAPI-Paket vom Client gesendet (%zu > %zu)" -#: libpq/be-secure-gssapi.c:389 +#: libpq/be-secure-gssapi.c:396 msgid "GSSAPI unwrap error" msgstr "GSSAPI-Unwrap-Fehler" -#: libpq/be-secure-gssapi.c:396 +#: libpq/be-secure-gssapi.c:403 #, c-format msgid "incoming GSSAPI message did not use confidentiality" msgstr "eingehende GSSAPI-Nachricht verwendete keine Vertraulichkeit" -#: libpq/be-secure-gssapi.c:575 -#, c-format -msgid "oversize GSSAPI packet sent by the client (%zu > %d)" -msgstr "übergroßes GSSAPI-Paket vom Client gesendet (%zu > %d)" - -#: libpq/be-secure-gssapi.c:600 +#: libpq/be-secure-gssapi.c:610 msgid "could not accept GSSAPI security context" msgstr "konnte GSSAPI-Sicherheitskontext nicht akzeptieren" -#: libpq/be-secure-gssapi.c:701 +#: libpq/be-secure-gssapi.c:728 msgid "GSSAPI size check error" msgstr "GSSAPI-Fehler bei der Größenprüfung" @@ -16768,14 +16780,14 @@ msgstr "erweiterbarer Knotentyp »%s« existiert bereits" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "ExtensibleNodeMethods »%s« wurde nicht registriert" -#: nodes/makefuncs.c:152 statistics/extended_stats.c:2310 +#: 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/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 +#: 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" @@ -16791,12 +16803,12 @@ msgstr "Portal »%s« mit Parametern: %s" msgid "unnamed portal with parameters: %s" msgstr "unbenanntes Portal mit Parametern: %s" -#: optimizer/path/joinrels.c:972 +#: optimizer/path/joinrels.c:973 #, c-format 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:7175 parser/parse_merge.c:203 +#: optimizer/plan/createplan.c:7177 parser/parse_merge.c:203 #: rewrite/rewriteHandler.c:1680 #, c-format msgid "cannot execute MERGE on relation \"%s\"" @@ -16815,38 +16827,38 @@ msgstr "%s kann nicht auf die nullbare Seite eines äußeren Verbundes angewende msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s ist nicht in UNION/INTERSECT/EXCEPT erlaubt" -#: optimizer/plan/planner.c:2121 optimizer/plan/planner.c:4108 +#: 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:2122 optimizer/plan/planner.c:4109 -#: optimizer/plan/planner.c:4790 optimizer/prep/prepunion.c:1320 +#: 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:4789 +#: optimizer/plan/planner.c:4832 #, c-format msgid "could not implement DISTINCT" msgstr "konnte DISTINCT nicht implementieren" -#: optimizer/plan/planner.c:6134 +#: 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:6135 +#: 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:6139 +#: 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:6140 +#: optimizer/plan/planner.c:6183 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Fenstersortierspalten müssen sortierbare Datentypen haben." @@ -17322,7 +17334,7 @@ msgstr "Aggregatfunktion auf äußerer Ebene kann keine Variable einer unteren E 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:780 parser/parse_expr.c:1762 parser/parse_expr.c:2245 +#: 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." @@ -17719,8 +17731,8 @@ 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:2146 parser/parse_expr.c:2754 parser/parse_expr.c:3405 -#: parser/parse_expr.c:3634 parser/parse_target.c:998 +#: 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" @@ -17915,147 +17927,147 @@ 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:136 +#: 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:308 +#: 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:335 +#: 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:384 +#: 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:390 +#: 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:395 +#: 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:399 +#: 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:420 +#: parser/parse_cte.c:421 #, c-format msgid "WITH query is not recursive" msgstr "WITH-Anfrage ist nicht rekursiv" -#: parser/parse_cte.c:451 +#: 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:456 +#: 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:471 +#: 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:478 +#: 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:487 +#: 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:504 +#: 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:511 +#: parser/parse_cte.c:512 #, c-format msgid "cycle column \"%s\" specified more than once" msgstr "Zyklusspalte »%s« mehrmals angegeben" -#: parser/parse_cte.c:520 +#: 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:527 +#: 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:535 +#: 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:545 +#: 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:552 +#: 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:636 +#: 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:816 +#: 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:868 +#: 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:876 +#: 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:911 +#: 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:917 +#: 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:923 +#: 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:929 +#: 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:1008 +#: 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" @@ -18113,13 +18125,13 @@ msgid "there is no parameter $%d" msgstr "es gibt keinen Parameter $%d" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1103 parser/parse_expr.c:3065 +#: parser/parse_expr.c:1103 parser/parse_expr.c:3073 #, c-format 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:1109 parser/parse_expr.c:3072 +#: 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" @@ -18140,7 +18152,7 @@ msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() ex 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:1760 parser/parse_expr.c:2243 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 "Funktionen mit Ergebnismenge sind in %s nicht erlaubt" @@ -18197,7 +18209,7 @@ msgstr "Unteranfragen können nicht in COPY-FROM-WHERE-Bedingungen verwendet wer msgid "cannot use subquery in column generation expression" msgstr "Unteranfragen können nicht in Spaltengenerierungsausdrücken verwendet werden" -#: parser/parse_expr.c:1914 parser/parse_expr.c:3764 +#: 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" @@ -18212,174 +18224,174 @@ msgstr "Unteranfrage hat zu viele Spalten" msgid "subquery has too few columns" msgstr "Unteranfrage hat zu wenige Spalten" -#: parser/parse_expr.c:2086 +#: 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:2087 +#: 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:2101 +#: 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:2184 +#: 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:2389 +#: 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:2390 +#: 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:2405 +#: 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:2513 +#: 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:2827 parser/parse_expr.c:3023 +#: 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:2837 +#: 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:2862 +#: 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:2869 +#: 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:2928 parser/parse_expr.c:2969 +#: 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:2930 +#: 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:2971 +#: 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:3306 +#: parser/parse_expr.c:3314 #, c-format msgid "JSON ENCODING clause is only allowed for bytea input type" msgstr "JSON-ENCODING-Klausel ist nur für Eingabetyp bytea erlaubt" -#: parser/parse_expr.c:3370 +#: parser/parse_expr.c:3378 #, c-format 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:3371 +#: parser/parse_expr.c:3379 #, c-format 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:3460 +#: parser/parse_expr.c:3468 #, c-format msgid "cannot use JSON format with non-string output types" msgstr "Format JSON kann nicht mit Ausgabetypen verwendet werden, die keine Zeichenketten sind" -#: parser/parse_expr.c:3473 +#: parser/parse_expr.c:3481 #, c-format msgid "cannot set JSON encoding for non-bytea output types" msgstr "JSON-Kodierung kann nur für Ausgabetyp bytea gesetzt werden" -#: parser/parse_expr.c:3478 +#: parser/parse_expr.c:3486 #, c-format msgid "unsupported JSON encoding" msgstr "nicht unterstützte JSON-Kodierung" -#: parser/parse_expr.c:3479 +#: parser/parse_expr.c:3487 #, c-format msgid "Only UTF8 JSON encoding is supported." msgstr "Nur die JSON-Kodierung UTF8 wird unterstützt." -#: parser/parse_expr.c:3516 +#: parser/parse_expr.c:3524 #, c-format msgid "returning SETOF types is not supported in SQL/JSON functions" msgstr "Rückgabe von SETOF-Typen wird in SQL/JSON-Funktionen nicht unterstützt" -#: parser/parse_expr.c:3521 +#: 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:3849 parser/parse_func.c:866 +#: 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:4072 +#: parser/parse_expr.c:4080 #, c-format msgid "cannot use JSON FORMAT ENCODING clause for non-bytea input types" msgstr "JSON-FORMAT-ENCODING-Klausel kann nur für Eingabetyp bytea verwendet werden" -#: parser/parse_expr.c:4092 +#: parser/parse_expr.c:4100 #, c-format msgid "cannot use type %s in IS JSON predicate" msgstr "Typ %s kann nicht im IS-JSON-Prädikat verwendet werden" -#: parser/parse_expr.c:4118 parser/parse_expr.c:4239 +#: 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:4120 +#: 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:4168 +#: 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:4242 +#: 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:4307 +#: 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:4320 +#: 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:4334 parser/parse_expr.c:4363 parser/parse_expr.c:4394 -#: parser/parse_expr.c:4420 parser/parse_expr.c:4446 +#: 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" @@ -18387,7 +18399,7 @@ 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:4337 parser/parse_expr.c:4366 +#: 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." @@ -18395,68 +18407,68 @@ msgstr "Nur ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT oder DEFAULT-Ausdruck sind er #. 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 +#: 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:4347 parser/parse_expr.c:4376 +#: 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:4395 +#: 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:4405 +#: 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:4423 parser/parse_expr.c:4449 +#: 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:4433 parser/parse_expr.c:4459 +#: 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:4489 +#: 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:4707 +#: 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:4712 +#: 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:4717 +#: 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:4793 parser/parse_expr.c:4802 +#: 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:4796 +#: 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." @@ -19793,32 +19805,32 @@ msgstr "Fehlgeschlagener Systemaufruf war MapViewOfFileEx." msgid "autovacuum worker took too long to start; canceled" msgstr "Autovacuum-Worker benötigte zu lange zum Starten; abgebrochen" -#: postmaster/autovacuum.c:2203 +#: postmaster/autovacuum.c:2218 #, 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:2439 +#: postmaster/autovacuum.c:2461 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "automatisches Vacuum der Tabelle »%s.%s.%s«" -#: postmaster/autovacuum.c:2442 +#: postmaster/autovacuum.c:2464 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "automatisches Analysieren der Tabelle »%s.%s.%s«" -#: postmaster/autovacuum.c:2636 +#: postmaster/autovacuum.c:2660 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "verarbeite Arbeitseintrag für Relation »%s.%s.%s«" -#: postmaster/autovacuum.c:3254 +#: postmaster/autovacuum.c:3291 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "Autovacuum wegen Fehlkonfiguration nicht gestartet" -#: postmaster/autovacuum.c:3255 +#: postmaster/autovacuum.c:3292 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Schalten Sie die Option »track_counts« ein." @@ -19875,24 +19887,24 @@ msgid_plural "Up to %d background workers can be registered with the current set 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:931 postmaster/checkpointer.c:445 +#: postmaster/bgworker.c:931 postmaster/checkpointer.c:448 #, c-format msgid "Consider increasing the configuration parameter \"%s\"." msgstr "Erhöhen Sie eventuell den Konfigurationsparameter »%s«." -#: postmaster/checkpointer.c:441 +#: postmaster/checkpointer.c:444 #, 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:1067 +#: postmaster/checkpointer.c:1073 #, c-format msgid "checkpoint request failed" msgstr "Checkpoint-Anforderung fehlgeschlagen" -#: postmaster/checkpointer.c:1068 +#: postmaster/checkpointer.c:1074 #, c-format msgid "Consult recent messages in the server log for details." msgstr "Einzelheiten finden Sie in den letzten Meldungen im Serverlog." @@ -20698,22 +20710,22 @@ msgstr "konnte Daten nicht an Shared-Memory-Queue senden" msgid "logical replication apply worker will serialize the remaining changes of remote transaction %u to a file" msgstr "Apply-Worker für logische Replikation wird die restlichen Änderungen der Remote-Transaktion %u in eine Datei serialisieren" -#: replication/logical/decode.c:177 replication/logical/logical.c:141 +#: replication/logical/decode.c:177 replication/logical/logical.c:143 #, 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:334 +#: replication/logical/launcher.c:347 #, 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:427 +#: replication/logical/launcher.c:440 #, c-format msgid "out of logical replication worker slots" msgstr "alle Slots für Arbeitsprozesse für logische Replikation belegt" -#: replication/logical/launcher.c:428 replication/logical/launcher.c:514 +#: replication/logical/launcher.c:441 replication/logical/launcher.c:527 #: 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 @@ -20722,111 +20734,111 @@ msgstr "alle Slots für Arbeitsprozesse für logische Replikation belegt" msgid "You might need to increase \"%s\"." msgstr "Sie müssen möglicherweise »%s« erhöhen." -#: replication/logical/launcher.c:513 +#: replication/logical/launcher.c:526 #, c-format msgid "out of background worker slots" msgstr "alle Slots für Background-Worker belegt" -#: replication/logical/launcher.c:720 +#: replication/logical/launcher.c:733 #, 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:729 +#: replication/logical/launcher.c:742 #, 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:121 +#: replication/logical/logical.c:123 #, c-format msgid "logical decoding requires \"wal_level\" >= \"logical\"" msgstr "logische Dekodierung erfordert »wal_level« >= »logical«" -#: replication/logical/logical.c:126 +#: replication/logical/logical.c:128 #, c-format msgid "logical decoding requires a database connection" msgstr "logische Dekodierung benötigt eine Datenbankverbindung" -#: replication/logical/logical.c:365 replication/logical/logical.c:519 +#: replication/logical/logical.c:367 replication/logical/logical.c:521 #, 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:370 replication/logical/logical.c:529 +#: replication/logical/logical.c:372 replication/logical/logical.c:531 #, 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:377 +#: replication/logical/logical.c:379 #, 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:540 +#: replication/logical/logical.c:542 #, 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/logical/logical.c:544 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 +#: replication/logical/logical.c:545 #, 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 +#: replication/logical/logical.c:556 replication/logical/logical.c:563 #, 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:556 +#: replication/logical/logical.c:558 #, 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:563 +#: replication/logical/logical.c:565 #, 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:628 +#: replication/logical/logical.c:630 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "starte logisches Dekodieren für Slot »%s«" -#: replication/logical/logical.c:630 +#: replication/logical/logical.c:632 #, 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:778 +#: replication/logical/logical.c:780 #, 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:784 +#: replication/logical/logical.c:786 #, 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:955 replication/logical/logical.c:1000 -#: replication/logical/logical.c:1045 replication/logical/logical.c:1091 +#: replication/logical/logical.c:957 replication/logical/logical.c:1002 +#: replication/logical/logical.c:1047 replication/logical/logical.c:1093 #, 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:1323 replication/logical/logical.c:1372 -#: replication/logical/logical.c:1413 replication/logical/logical.c:1499 -#: replication/logical/logical.c:1548 +#: replication/logical/logical.c:1325 replication/logical/logical.c:1374 +#: replication/logical/logical.c:1415 replication/logical/logical.c:1501 +#: replication/logical/logical.c:1550 #, c-format msgid "logical streaming requires a %s callback" msgstr "logisches Streaming benötigt einen %s-Callback" -#: replication/logical/logical.c:1458 +#: replication/logical/logical.c:1460 #, c-format msgid "logical streaming at prepare time requires a %s callback" msgstr "logisches Streaming bei PREPARE TRANSACTION benötigt einen %s-Callback" @@ -20923,7 +20935,7 @@ msgid "could not find free replication state slot for replication origin with ID msgstr "konnte keinen freien Replication-State-Slot für Replication-Origin mit ID %d finden" #: replication/logical/origin.c:957 replication/logical/origin.c:1158 -#: replication/slot.c:2384 +#: replication/slot.c:2397 #, c-format msgid "Increase \"max_replication_slots\" and try again." msgstr "Erhöhen Sie »max_replication_slots« und versuchen Sie es erneut." @@ -20976,57 +20988,52 @@ msgstr "Zielrelation für logische Replikation »%s.%s« verwendet Systemspalten msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "Zielrelation für logische Replikation »%s.%s« existiert nicht" -#: replication/logical/reorderbuffer.c:3999 +#: replication/logical/reorderbuffer.c:4129 #, 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:4345 -#: replication/logical/reorderbuffer.c:4370 +#: replication/logical/reorderbuffer.c:4475 +#: replication/logical/reorderbuffer.c:4500 #, 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:4349 -#: replication/logical/reorderbuffer.c:4374 +#: replication/logical/reorderbuffer.c:4479 +#: replication/logical/reorderbuffer.c:4504 #, 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:4624 +#: replication/logical/reorderbuffer.c:4754 #, 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:5120 +#: replication/logical/reorderbuffer.c:5250 #, 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/slotsync.c:215 +#: replication/logical/slotsync.c:215 replication/logical/slotsync.c:579 #, 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" +msgid "could not synchronize replication slot \"%s\"" +msgstr "konnte Replikations-Slot »%s« nicht synchronisieren" #: 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." +msgid "Synchronization could lead to data loss, because the remote slot needs WAL at LSN %X/%X and catalog xmin %u, but the standby has LSN %X/%X and catalog xmin %u." +msgstr "Synchronisation könnte zu Datenverlust führen, weil der Remote-Slot WAL bei LSN %X/%X und Katalog-xmin %u benötigt, aber der Standby LSN %X/%X und Katalog-xmin %u hat." #: 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." +msgid "Synchronization could lead to data loss, because the standby could not build a consistent snapshot to decode WALs at LSN %X/%X." +msgstr "Synchronisation könnte zu Datenverlust führen, weil der Standby keinen konsistenten Snapshot zum Dekodieren von WAL bei LSN %X/%X bauen konnte." #: replication/logical/slotsync.c:589 #, c-format @@ -21077,7 +21084,7 @@ msgstr "Replikations-Slot »%s«, der in »%s« angegeben ist, existiert auf dem 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 +#: replication/logical/slotsync.c:1048 #, c-format msgid "replication slot synchronization requires \"wal_level\" >= \"logical\"" msgstr "Replikations-Slot-Synchronisierung erfordert »wal_level« >= »logical«" @@ -21125,7 +21132,7 @@ msgstr "Replikations-Slots können nicht nebenläufig synchronisiert werden" msgid "slot sync worker started" msgstr "Slot-Sync-Arbeitsprozess gestartet" -#: replication/logical/slotsync.c:1466 replication/slotfuncs.c:900 +#: replication/logical/slotsync.c:1466 replication/slotfuncs.c:926 #: replication/walreceiver.c:307 #, c-format msgid "could not connect to the primary server: %s" @@ -21143,58 +21150,58 @@ 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:1404 replication/logical/snapbuild.c:1501 -#: replication/logical/snapbuild.c:2017 +#: replication/logical/snapbuild.c:1451 replication/logical/snapbuild.c:1548 +#: replication/logical/snapbuild.c:2064 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "logisches Dekodieren fand konsistenten Punkt bei %X/%X" -#: replication/logical/snapbuild.c:1406 +#: replication/logical/snapbuild.c:1453 #, c-format msgid "There are no running transactions." msgstr "Keine laufenden Transaktionen." -#: replication/logical/snapbuild.c:1453 +#: replication/logical/snapbuild.c:1500 #, 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:1455 replication/logical/snapbuild.c:1479 +#: replication/logical/snapbuild.c:1502 replication/logical/snapbuild.c:1526 #, 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:1477 +#: replication/logical/snapbuild.c:1524 #, 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:1503 +#: replication/logical/snapbuild.c:1550 #, c-format msgid "There are no old transactions anymore." msgstr "Es laufen keine alten Transaktionen mehr." -#: replication/logical/snapbuild.c:1904 +#: replication/logical/snapbuild.c:1951 #, 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:1910 +#: replication/logical/snapbuild.c:1957 #, 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:1951 +#: replication/logical/snapbuild.c:1998 #, 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:2019 +#: replication/logical/snapbuild.c:2066 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "Logische Dekodierung beginnt mit gespeichertem Snapshot." -#: replication/logical/snapbuild.c:2126 +#: replication/logical/snapbuild.c:2173 #, c-format msgid "could not parse file name \"%s\"" msgstr "konnte Dateinamen »%s« nicht parsen" @@ -21204,207 +21211,207 @@ msgstr "konnte Dateinamen »%s« nicht parsen" 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:641 +#: replication/logical/tablesync.c:667 #, 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:827 replication/logical/tablesync.c:969 +#: replication/logical/tablesync.c:853 replication/logical/tablesync.c:995 #, 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:834 +#: replication/logical/tablesync.c:860 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "Tabelle »%s.%s« nicht auf dem Publikationsserver gefunden" -#: replication/logical/tablesync.c:892 +#: replication/logical/tablesync.c:918 #, 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:1071 +#: replication/logical/tablesync.c:1097 #, 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:1230 +#: replication/logical/tablesync.c:1256 #, 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:1429 +#: replication/logical/tablesync.c:1455 #, 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:1472 +#: replication/logical/tablesync.c:1498 #, c-format msgid "replication origin \"%s\" already exists" msgstr "Replication-Origin »%s« existiert bereits" -#: replication/logical/tablesync.c:1505 replication/logical/worker.c:2361 +#: replication/logical/tablesync.c:1531 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:1518 +#: replication/logical/tablesync.c:1544 #, 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:481 +#: replication/logical/worker.c:483 #, c-format msgid "logical replication parallel apply worker for subscription \"%s\" will stop" msgstr "Parallel-Apply-Worker für logische Replikation für Subskription »%s« wird anhalten" -#: replication/logical/worker.c:483 +#: replication/logical/worker.c:485 #, c-format msgid "Cannot handle streamed replication transactions using parallel apply workers until all tables have been synchronized." msgstr "Gestreamte Replikationstransaktionen können erst mit parallelen Apply-Worker-Prozessen verarbeitet werden, wenn alle Tabellen synchronisiert worden sind." -#: replication/logical/worker.c:852 replication/logical/worker.c:967 +#: 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:2500 +#: 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:2507 +#: 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:3371 +#: replication/logical/worker.c:3384 #, c-format msgid "invalid logical replication message type \"??? (%d)\"" msgstr "ungültiger Nachrichtentyp für logische Replikation »??? (%d)«" -#: replication/logical/worker.c:3543 +#: replication/logical/worker.c:3556 #, c-format msgid "data stream from publisher has ended" msgstr "Datenstrom vom Publikationsserver endete" -#: replication/logical/worker.c:3697 +#: 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" -#: replication/logical/worker.c:3891 +#: 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" -#: replication/logical/worker.c:3905 +#: 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:3936 +#: replication/logical/worker.c:3949 #, c-format msgid "logical replication parallel apply worker for subscription \"%s\" will stop because of a parameter change" msgstr "Parallel-Apply-Worker für logische Replikation für Subskription »%s« wird anhalten wegen einer Parameteränderung" -#: replication/logical/worker.c:3940 +#: replication/logical/worker.c:3953 #, c-format 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" -#: replication/logical/worker.c:3954 +#: 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:3958 +#: 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:4478 +#: 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:4591 +#: replication/logical/worker.c:4620 #, 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:4607 +#: replication/logical/worker.c:4636 #, 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:4631 +#: replication/logical/worker.c:4660 #, 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:4636 +#: replication/logical/worker.c:4665 #, 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:4758 +#: replication/logical/worker.c:4795 #, c-format msgid "subscription \"%s\" has been disabled because of an error" msgstr "Subskription »%s« wurde wegen eines Fehlers deaktiviert" -#: replication/logical/worker.c:4806 +#: replication/logical/worker.c:4843 #, 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:4820 +#: replication/logical/worker.c:4857 #, 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:4902 +#: replication/logical/worker.c:4945 #, c-format msgid "skip-LSN of subscription \"%s\" cleared" msgstr "Skip-LSN von Subskription »%s« gelöscht" -#: replication/logical/worker.c:4903 +#: replication/logical/worker.c:4946 #, 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:4940 +#: replication/logical/worker.c:4974 #, 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:4944 +#: replication/logical/worker.c:4978 #, 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:4949 +#: replication/logical/worker.c:4983 #, 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:4960 +#: replication/logical/worker.c:4994 #, 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:4967 +#: replication/logical/worker.c:5001 #, 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:4978 +#: replication/logical/worker.c:5012 #, 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:4986 +#: replication/logical/worker.c:5020 #, 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" @@ -21509,7 +21516,7 @@ msgstr "alle Replikations-Slots sind in Benutzung" msgid "Free one or increase \"max_replication_slots\"." msgstr "Geben Sie einen frei oder erhöhen Sie »max_replication_slots«." -#: replication/slot.c:560 replication/slot.c:2450 replication/slotfuncs.c:661 +#: replication/slot.c:560 replication/slot.c:2463 replication/slotfuncs.c:661 #: utils/activity/pgstat_replslot.c:56 utils/adt/genfile.c:728 #, c-format msgid "replication slot \"%s\" does not exist" @@ -21560,7 +21567,7 @@ msgstr "Replikations-Slot »%s« kann nicht geändert werden" 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 +#: replication/slot.c:969 replication/slot.c:1923 replication/slot.c:2307 #, c-format msgid "could not remove directory \"%s\"" msgstr "konnte Verzeichnis »%s« nicht löschen" @@ -21611,102 +21618,112 @@ msgstr "Prozess %d wird beendet, um Replikations-Slot »%s« freizugeben" msgid "invalidating obsolete replication slot \"%s\"" msgstr "obsoleter Replikations-Slot »%s« wird ungültig gemacht" -#: replication/slot.c:2249 +#: replication/slot.c:2245 #, 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:2256 +#: replication/slot.c:2252 #, 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:2263 +#: replication/slot.c:2259 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "Replikations-Slot-Datei »%s« hat falsche Länge %u" -#: replication/slot.c:2299 +#: replication/slot.c:2295 #, 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:2333 +#: replication/slot.c:2331 #, 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:2335 +#: replication/slot.c:2333 #, c-format msgid "Change \"wal_level\" to be \"logical\" or higher." msgstr "Ändern Sie »wal_level« in »logical« oder höher." -#: replication/slot.c:2339 +#: replication/slot.c:2345 +#, c-format +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:2347 +#, c-format +msgid "Change \"hot_standby\" to be \"on\"." +msgstr "Ändern Sie »hot_standby« auf »on«." + +#: replication/slot.c:2352 #, c-format msgid "physical replication slot \"%s\" exists, but \"wal_level\" < \"replica\"" msgstr "physischer Replikations-Slot »%s« existiert, aber »wal_level« < »replica«" -#: replication/slot.c:2341 +#: replication/slot.c:2354 #, c-format msgid "Change \"wal_level\" to be \"replica\" or higher." msgstr "Ändern Sie »wal_level« in »replica« oder höher." -#: replication/slot.c:2383 +#: replication/slot.c:2396 #, c-format msgid "too many replication slots active before shutdown" msgstr "zu viele aktive Replikations-Slots vor dem Herunterfahren" -#: replication/slot.c:2458 +#: replication/slot.c:2471 #, c-format msgid "\"%s\" is not a physical replication slot" msgstr "»%s« ist kein physischer Replikations-Slot" -#: replication/slot.c:2635 +#: replication/slot.c:2650 #, 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:2637 replication/slot.c:2671 replication/slot.c:2686 +#: replication/slot.c:2652 replication/slot.c:2686 replication/slot.c:2701 #, 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:2639 +#: replication/slot.c:2654 #, 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:2649 +#: replication/slot.c:2664 #, 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:2651 +#: replication/slot.c:2666 #, 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:2653 +#: replication/slot.c:2668 #, 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:2669 +#: replication/slot.c:2684 #, 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:2673 +#: replication/slot.c:2688 #, 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:2684 +#: replication/slot.c:2699 #, 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:2688 +#: replication/slot.c:2703 #, 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«." @@ -21746,62 +21763,77 @@ msgstr "logischer Replikations-Slot »%s« kann nicht als physischer Replikation 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:768 +#: 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:770 +#: 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:776 +#: 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:778 +#: 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/slotfuncs.c:877 +#: 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:261 +#: 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:262 replication/syncrep.c:279 +#: 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:278 +#: 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:485 +#: replication/syncrep.c:528 #, c-format 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:489 +#: 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:1013 +#: replication/syncrep.c:1080 #, c-format msgid "\"synchronous_standby_names\" parser failed" msgstr "Parser für »synchronous_standby_names« fehlgeschlagen" -#: replication/syncrep.c:1019 +#: 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" @@ -21876,125 +21908,125 @@ msgstr "hole Zeitleisten-History-Datei für Zeitleiste %u vom Primärserver" 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:531 +#: 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:635 storage/smgr/md.c:1735 +#: 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:639 +#: 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:853 +#: 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:919 +#: 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:922 +#: 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:966 +#: 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:1160 +#: 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:1266 +#: 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:1276 +#: 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:1282 +#: 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:1287 +#: replication/walsender.c:1291 #, c-format 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:1293 +#: 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:1299 +#: 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:1472 +#: replication/walsender.c:1476 #, c-format msgid "terminating walsender process after promotion" msgstr "WAL-Sender-Prozess wird nach Beförderung abgebrochen" -#: replication/walsender.c:2000 +#: 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:2035 +#: 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:2068 +#: replication/walsender.c:2083 #, c-format msgid "received replication command: %s" msgstr "Replikationsbefehl empfangen: %s" -#: replication/walsender.c:2076 tcop/fastpath.c:209 tcop/postgres.c:1142 +#: 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:2233 replication/walsender.c:2268 +#: 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:2256 +#: replication/walsender.c:2271 #, c-format msgid "invalid standby message type \"%c\"" msgstr "ungültiger Standby-Message-Typ »%c«" -#: replication/walsender.c:2345 +#: replication/walsender.c:2360 #, c-format msgid "unexpected message type \"%c\"" msgstr "unerwarteter Message-Typ »%c«" -#: replication/walsender.c:2759 +#: replication/walsender.c:2778 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "WAL-Sender-Prozess wird abgebrochen wegen Zeitüberschreitung bei der Replikation" @@ -22640,17 +22672,17 @@ msgstr "unerwartete Daten hinter Dateiende in Block %u von Relation %s" 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:5653 +#: 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:5655 +#: 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:5677 storage/buffer/bufmgr.c:5697 +#: 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" @@ -22700,138 +22732,138 @@ msgstr "konnte Fileset »%s« nicht löschen: %m" msgid "could not truncate file \"%s\": %m" msgstr "kann Datei »%s« nicht kürzen: %m" -#: storage/file/fd.c:583 storage/file/fd.c:655 storage/file/fd.c:691 +#: storage/file/fd.c:580 storage/file/fd.c:652 storage/file/fd.c:688 #, c-format msgid "could not flush dirty data: %m" msgstr "konnte schmutzige Daten nicht flushen: %m" -#: storage/file/fd.c:613 +#: storage/file/fd.c:610 #, c-format msgid "could not determine dirty data size: %m" msgstr "konnte Größe der schmutzigen Daten nicht bestimmen: %m" -#: storage/file/fd.c:665 +#: storage/file/fd.c:662 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "munmap() fehlgeschlagen beim Flushen von Daten: %m" -#: storage/file/fd.c:983 +#: storage/file/fd.c:980 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimit fehlgeschlagen: %m" -#: storage/file/fd.c:1073 +#: storage/file/fd.c:1070 #, 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:1074 +#: storage/file/fd.c:1071 #, c-format msgid "System allows %d, server needs at least %d." msgstr "System erlaubt %d, Server benötigt mindestens %d." -#: storage/file/fd.c:1162 storage/file/fd.c:2618 storage/file/fd.c:2727 -#: storage/file/fd.c:2878 +#: storage/file/fd.c:1159 storage/file/fd.c:2615 storage/file/fd.c:2724 +#: storage/file/fd.c:2875 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "keine Dateideskriptoren mehr: %m; freigeben und nochmal versuchen" -#: storage/file/fd.c:1536 +#: storage/file/fd.c:1533 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "temporäre Datei: Pfad »%s«, Größe %lu" -#: storage/file/fd.c:1675 +#: storage/file/fd.c:1672 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "konnte temporäres Verzeichnis »%s« nicht erzeugen: %m" -#: storage/file/fd.c:1682 +#: storage/file/fd.c:1679 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "konnte temporäres Unterverzeichnis »%s« nicht erzeugen: %m" -#: storage/file/fd.c:1879 +#: storage/file/fd.c:1876 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "konnte temporäre Datei »%s« nicht erzeugen: %m" -#: storage/file/fd.c:1915 +#: storage/file/fd.c:1912 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "konnte temporäre Datei »%s« nicht öffnen: %m" -#: storage/file/fd.c:1956 +#: storage/file/fd.c:1953 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "konnte temporäre Datei »%s« nicht löschen: %m" -#: storage/file/fd.c:2044 +#: storage/file/fd.c:2041 #, c-format msgid "could not delete file \"%s\": %m" msgstr "konnte Datei »%s« nicht löschen: %m" -#: storage/file/fd.c:2234 +#: storage/file/fd.c:2231 #, 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:2594 storage/file/fd.c:2653 +#: storage/file/fd.c:2591 storage/file/fd.c:2650 #, 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:2698 +#: storage/file/fd.c:2695 #, 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:2854 +#: storage/file/fd.c:2851 #, 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:3384 +#: storage/file/fd.c:3381 #, 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:3502 +#: storage/file/fd.c:3499 #, 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:3729 +#: storage/file/fd.c:3726 #, 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:3761 +#: storage/file/fd.c:3758 #, 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:3950 +#: storage/file/fd.c:3947 #, c-format 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:3964 +#: storage/file/fd.c:3961 #, c-format msgid "Invalid list syntax in parameter \"%s\"" msgstr "Ungültige Listensyntax für Parameter »%s«" -#: storage/file/fd.c:3984 +#: storage/file/fd.c:3981 #, c-format msgid "Invalid option \"%s\"" msgstr "Ungültige Option »%s«" -#: storage/file/fd.c:3997 +#: storage/file/fd.c:3994 #, 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" -#: storage/file/fd.c:4004 +#: storage/file/fd.c:4001 #, 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" @@ -22988,7 +23020,7 @@ msgstr "ungültige Nachrichtengröße %zu in Shared-Memory-Queue" #: 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 +#: utils/hash/dynahash.c:1096 #, c-format msgid "out of shared memory" msgstr "Shared Memory aufgebraucht" @@ -23165,107 +23197,107 @@ msgstr "Verklemmung (Deadlock) entdeckt" msgid "See server log for query details." msgstr "Einzelheiten zur Anfrage finden Sie im Serverlog." -#: storage/lmgr/lmgr.c:848 +#: storage/lmgr/lmgr.c:854 #, 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:851 +#: storage/lmgr/lmgr.c:857 #, 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:854 +#: storage/lmgr/lmgr.c:860 #, 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:857 +#: storage/lmgr/lmgr.c:863 #, 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:860 +#: storage/lmgr/lmgr.c:866 #, 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:863 +#: storage/lmgr/lmgr.c:869 #, 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:866 +#: storage/lmgr/lmgr.c:872 #, 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:869 +#: storage/lmgr/lmgr.c:875 #, 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:1239 +#: storage/lmgr/lmgr.c:1245 #, c-format msgid "relation %u of database %u" msgstr "Relation %u der Datenbank %u" -#: storage/lmgr/lmgr.c:1245 +#: storage/lmgr/lmgr.c:1251 #, c-format msgid "extension of relation %u of database %u" msgstr "Erweiterung von Relation %u in Datenbank %u" -#: storage/lmgr/lmgr.c:1251 +#: storage/lmgr/lmgr.c:1257 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid der Datenbank %u" -#: storage/lmgr/lmgr.c:1256 +#: storage/lmgr/lmgr.c:1262 #, c-format msgid "page %u of relation %u of database %u" msgstr "Seite %u von Relation %u von Datenbank %u" -#: storage/lmgr/lmgr.c:1263 +#: storage/lmgr/lmgr.c:1269 #, 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:1271 +#: storage/lmgr/lmgr.c:1277 #, c-format msgid "transaction %u" msgstr "Transaktion %u" -#: storage/lmgr/lmgr.c:1276 +#: storage/lmgr/lmgr.c:1282 #, c-format msgid "virtual transaction %d/%u" msgstr "virtuelle Transaktion %d/%u" -#: storage/lmgr/lmgr.c:1282 +#: storage/lmgr/lmgr.c:1288 #, c-format msgid "speculative token %u of transaction %u" msgstr "spekulatives Token %u von Transaktion %u" -#: storage/lmgr/lmgr.c:1288 +#: storage/lmgr/lmgr.c:1294 #, c-format msgid "object %u of class %u of database %u" msgstr "Objekt %u von Klasse %u von Datenbank %u" -#: storage/lmgr/lmgr.c:1296 +#: storage/lmgr/lmgr.c:1302 #, c-format msgid "user lock [%u,%u,%u]" msgstr "Benutzersperre [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1303 +#: storage/lmgr/lmgr.c:1309 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "Benutzersperre [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1311 +#: storage/lmgr/lmgr.c:1317 #, c-format msgid "remote transaction %u of subscription %u of database %u" msgstr "Remote-Transaktion %u von Subskription %u in Datenbank %u" -#: storage/lmgr/lmgr.c:1318 +#: storage/lmgr/lmgr.c:1324 #, c-format msgid "unrecognized locktag type %d" msgstr "unbekannter Locktag-Typ %d" @@ -23966,12 +23998,12 @@ 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:942 tcop/pquery.c:1696 +#: tcop/pquery.c:942 tcop/pquery.c:1687 #, c-format msgid "cursor can only scan forward" msgstr "Cursor kann nur vorwärts scannen" -#: tcop/pquery.c:943 tcop/pquery.c:1697 +#: tcop/pquery.c:943 tcop/pquery.c:1688 #, 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." @@ -24137,64 +24169,64 @@ 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:194 utils/adt/tsvector.c:277 utils/adt/tsvector_op.c:1126 +#: 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)" @@ -24261,37 +24293,37 @@ msgstr "%s muss >= 0 sein" msgid "could not unlink permanent statistics file \"%s\": %m" msgstr "konnte permanente Statistikdatei »%s« nicht löschen: %m" -#: utils/activity/pgstat.c:1255 +#: utils/activity/pgstat.c:1254 #, c-format msgid "invalid statistics kind: \"%s\"" msgstr "ungültige Statistikart: »%s«" -#: utils/activity/pgstat.c:1335 +#: 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:1455 +#: 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:1464 +#: 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:1472 +#: 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:1521 +#: 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:1683 +#: utils/activity/pgstat.c:1682 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "verfälschte Statistikdatei »%s«" @@ -24316,102 +24348,102 @@ msgstr "Wait-Event »%s« existiert bereits in Typ »%s«" msgid "too many custom wait events" msgstr "zu viele benutzerdefinierte Wait-Events" -#: utils/adt/acl.c:183 utils/adt/name.c:93 +#: utils/adt/acl.c:200 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "Bezeichner zu lang" -#: utils/adt/acl.c:184 utils/adt/name.c:94 +#: utils/adt/acl.c:201 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:272 +#: utils/adt/acl.c:289 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "unbekanntes Schlüsselwort: »%s«" -#: utils/adt/acl.c:273 +#: utils/adt/acl.c:290 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "ACL-Schlüsselwort muss »group« oder »user« sein." -#: utils/adt/acl.c:281 +#: utils/adt/acl.c:298 #, c-format msgid "missing name" msgstr "Name fehlt" -#: utils/adt/acl.c:282 +#: utils/adt/acl.c:299 #, 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:288 +#: utils/adt/acl.c:305 #, c-format msgid "missing \"=\" sign" msgstr "»=«-Zeichen fehlt" -#: utils/adt/acl.c:350 +#: utils/adt/acl.c:367 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "ungültiges Moduszeichen: muss eines aus »%s« sein" -#: utils/adt/acl.c:380 +#: utils/adt/acl.c:397 #, c-format msgid "a name must follow the \"/\" sign" msgstr "auf das »/«-Zeichen muss ein Name folgen" -#: utils/adt/acl.c:392 +#: utils/adt/acl.c:409 #, c-format msgid "defaulting grantor to user ID %u" msgstr "nicht angegebener Grantor wird auf user ID %u gesetzt" -#: utils/adt/acl.c:578 +#: utils/adt/acl.c:595 #, c-format msgid "ACL array contains wrong data type" msgstr "ACL-Array enthält falschen Datentyp" -#: utils/adt/acl.c:582 +#: utils/adt/acl.c:599 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "ACL-Arrays müssen eindimensional sein" -#: utils/adt/acl.c:586 +#: utils/adt/acl.c:603 #, c-format msgid "ACL arrays must not contain null values" msgstr "ACL-Array darf keine NULL-Werte enthalten" -#: utils/adt/acl.c:615 +#: utils/adt/acl.c:632 #, 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:1263 +#: utils/adt/acl.c:1280 #, 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:1579 +#: utils/adt/acl.c:1596 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert wird nicht mehr unterstützt" -#: utils/adt/acl.c:1589 +#: utils/adt/acl.c:1606 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove wird nicht mehr unterstützt" -#: utils/adt/acl.c:1709 +#: utils/adt/acl.c:1726 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "unbekannter Privilegtyp: »%s«" -#: utils/adt/acl.c:3550 utils/adt/regproc.c:100 utils/adt/regproc.c:265 +#: utils/adt/acl.c:3567 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:5196 +#: utils/adt/acl.c:5213 #, c-format msgid "must be able to SET ROLE \"%s\"" msgstr "Berechtigung nur für Rollen, die SET ROLE \"%s\" ausführen können" @@ -24437,7 +24469,7 @@ msgstr "Eingabedatentyp ist kein Array" #: 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/int8.c:1256 utils/adt/numeric.c:1918 utils/adt/numeric.c:4455 #: 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 @@ -24596,7 +24628,7 @@ msgid "Unexpected end of input." msgstr "Unerwartetes Ende der Eingabe." #: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3499 -#: utils/adt/arrayfuncs.c:6106 +#: utils/adt/arrayfuncs.c:6108 #, c-format msgid "invalid number of dimensions: %d" msgstr "ungültige Anzahl Dimensionen: %d" @@ -24635,8 +24667,8 @@ msgstr "Auswählen von Stücken aus Arrays mit fester Länge ist nicht implement #: 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/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 @@ -24713,42 +24745,42 @@ msgstr "Arrays, die NULL sind, können nicht akkumuliert werden" msgid "cannot accumulate empty arrays" msgstr "leere Arrays können nicht akkumuliert werden" -#: utils/adt/arrayfuncs.c:5990 utils/adt/arrayfuncs.c:6030 +#: 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:6093 utils/adt/arrayfuncs.c:6119 +#: 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:6098 utils/adt/arrayfuncs.c:6124 +#: 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:6130 +#: 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:6411 +#: 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:6688 +#: 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:6693 +#: 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:6926 +#: 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" @@ -24797,8 +24829,8 @@ msgstr "Kodierungsumwandlung zwischen %s und ASCII wird nicht unterstützt" #: 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/network.c:99 utils/adt/numeric.c:803 utils/adt/numeric.c:7222 +#: utils/adt/numeric.c:7425 utils/adt/numeric.c:8372 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 @@ -24819,10 +24851,10 @@ msgstr "money ist außerhalb des gültigen Bereichs" #: 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 +#: utils/adt/numeric.c:3192 utils/adt/numeric.c:3215 utils/adt/numeric.c:3300 +#: utils/adt/numeric.c:3318 utils/adt/numeric.c:3414 utils/adt/numeric.c:8921 +#: utils/adt/numeric.c:9234 utils/adt/numeric.c:9582 utils/adt/numeric.c:9698 +#: utils/adt/numeric.c:11209 utils/adt/timestamp.c:3713 #, c-format msgid "division by zero" msgstr "Division durch Null" @@ -24869,7 +24901,7 @@ msgid "date out of range: \"%s\"" msgstr "date ist außerhalb des gültigen Bereichs: »%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:2552 +#: utils/adt/rangetypes.c:1584 utils/adt/rangetypes.c:1599 utils/adt/xml.c:2554 #, c-format msgid "date out of range" msgstr "date ist außerhalb des gültigen Bereichs" @@ -24943,8 +24975,8 @@ msgstr "Einheit »%s« nicht erkannt für Typ %s" #: 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 +#: utils/adt/timestamp.c:6456 utils/adt/timestamp.c:6497 utils/adt/xml.c:2576 +#: utils/adt/xml.c:2583 utils/adt/xml.c:2603 utils/adt/xml.c:2610 #, c-format msgid "timestamp out of range" msgstr "timestamp ist außerhalb des gültigen Bereichs" @@ -24976,7 +25008,7 @@ 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/int.c:717 utils/adt/int8.c:413 utils/adt/numeric.c:2596 #: utils/adt/timestamp.c:3810 utils/adt/timestamp.c:3847 #: utils/adt/timestamp.c:3888 #, c-format @@ -25154,34 +25186,34 @@ msgstr "»%s« ist außerhalb des gültigen Bereichs für Typ 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:4593 utils/adt/numeric.c:4598 +#: utils/adt/int8.c:1277 utils/adt/numeric.c:4594 utils/adt/numeric.c:4599 #, c-format msgid "smallint out of range" msgstr "smallint ist außerhalb des gültigen Bereichs" -#: utils/adt/float.c:1447 utils/adt/numeric.c:3709 utils/adt/numeric.c:10112 +#: utils/adt/float.c:1447 utils/adt/numeric.c:3710 utils/adt/numeric.c:10113 #, c-format msgid "cannot take square root of a negative number" msgstr "Quadratwurzel von negativer Zahl kann nicht ermittelt werden" -#: utils/adt/float.c:1515 utils/adt/numeric.c:3997 utils/adt/numeric.c:4109 +#: utils/adt/float.c:1515 utils/adt/numeric.c:3998 utils/adt/numeric.c:4110 #, c-format msgid "zero raised to a negative power is undefined" msgstr "null hoch eine negative Zahl ist undefiniert" -#: utils/adt/float.c:1519 utils/adt/numeric.c:4001 utils/adt/numeric.c:11003 +#: utils/adt/float.c:1519 utils/adt/numeric.c:4002 utils/adt/numeric.c:11004 #, 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:1695 utils/adt/float.c:1728 utils/adt/numeric.c:3909 -#: utils/adt/numeric.c:10783 +#: utils/adt/float.c:1695 utils/adt/float.c:1728 utils/adt/numeric.c:3910 +#: utils/adt/numeric.c:10784 #, c-format msgid "cannot take logarithm of zero" msgstr "Logarithmus von null kann nicht ermittelt werden" -#: 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 +#: utils/adt/float.c:1699 utils/adt/float.c:1732 utils/adt/numeric.c:3848 +#: utils/adt/numeric.c:3905 utils/adt/numeric.c:10788 #, c-format msgid "cannot take logarithm of a negative number" msgstr "Logarithmus negativer Zahlen kann nicht ermittelt werden" @@ -25195,22 +25227,22 @@ msgstr "Logarithmus negativer Zahlen kann nicht ermittelt werden" msgid "input is out of range" msgstr "Eingabe ist außerhalb des gültigen Bereichs" -#: utils/adt/float.c:4000 utils/adt/numeric.c:1857 +#: utils/adt/float.c:4000 utils/adt/numeric.c:1858 #, c-format msgid "count must be greater than zero" msgstr "Anzahl muss größer als null sein" -#: utils/adt/float.c:4005 utils/adt/numeric.c:1868 +#: utils/adt/float.c:4005 utils/adt/numeric.c:1869 #, 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:4011 utils/adt/numeric.c:1873 +#: utils/adt/float.c:4011 utils/adt/numeric.c:1874 #, c-format msgid "lower and upper bounds must be finite" msgstr "Untergrenze und Obergrenze müssen endlich sein" -#: utils/adt/float.c:4077 utils/adt/numeric.c:1887 +#: utils/adt/float.c:4077 utils/adt/numeric.c:1888 #, c-format msgid "lower bound cannot equal upper bound" msgstr "Untergrenze kann nicht gleich der Obergrenze sein" @@ -25575,7 +25607,7 @@ msgstr "Schrittgröße kann nicht gleich null sein" #: 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/int8.c:1312 utils/adt/int8.c:1347 utils/adt/numeric.c:4543 #: utils/adt/rangetypes.c:1535 utils/adt/rangetypes.c:1548 #: utils/adt/varbit.c:1676 #, c-format @@ -25629,7 +25661,7 @@ msgstr "Array muss zwei Spalten haben" msgid "mismatched array dimensions" msgstr "Array-Dimensionen passen nicht" -#: utils/adt/json.c:1702 utils/adt/jsonb_util.c:1956 +#: utils/adt/json.c:1702 utils/adt/jsonb_util.c:1962 #, c-format msgid "duplicate JSON object key value" msgstr "doppelter JSON-Objekt-Schlüsselwert" @@ -25694,23 +25726,23 @@ msgstr "kann jsonb-Objekt nicht in Typ %s umwandeln" 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:756 +#: utils/adt/jsonb_util.c:753 #, 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:797 +#: utils/adt/jsonb_util.c:794 #, 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:1671 utils/adt/jsonb_util.c:1691 +#: utils/adt/jsonb_util.c:1677 utils/adt/jsonb_util.c:1697 #, 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:1752 utils/adt/jsonb_util.c:1787 -#: utils/adt/jsonb_util.c:1807 +#: utils/adt/jsonb_util.c:1758 utils/adt/jsonb_util.c:1793 +#: utils/adt/jsonb_util.c:1813 #, 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" @@ -26203,12 +26235,12 @@ 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:800 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:803 #, c-format msgid "invalid escape string" msgstr "ungültige ESCAPE-Zeichenkette" -#: utils/adt/like_match.c:294 utils/adt/regexp.c:801 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:804 #, c-format msgid "Escape string must be empty or one character." msgstr "ESCAPE-Zeichenkette muss null oder ein Zeichen lang sein." @@ -26419,10 +26451,10 @@ 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: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 +#: utils/adt/numeric.c:793 utils/adt/numeric.c:3660 utils/adt/numeric.c:7217 +#: utils/adt/numeric.c:7420 utils/adt/numeric.c:7892 utils/adt/numeric.c:10587 +#: utils/adt/numeric.c:11062 utils/adt/numeric.c:11156 +#: utils/adt/numeric.c:11291 #, c-format msgid "value overflows numeric format" msgstr "Wert verursacht Überlauf im »numeric«-Format" @@ -26487,64 +26519,64 @@ msgstr "Schrittgröße kann nicht NaN sein" msgid "step size cannot be infinity" msgstr "Schrittgröße kann nicht unendlich sein" -#: utils/adt/numeric.c:3649 +#: utils/adt/numeric.c:3650 #, c-format msgid "factorial of a negative number is undefined" msgstr "Fakultät einer negativen Zahl ist undefiniert" -#: utils/adt/numeric.c:4256 +#: utils/adt/numeric.c:4257 #, c-format msgid "lower bound cannot be NaN" msgstr "Untergrenze kann nicht NaN sein" -#: utils/adt/numeric.c:4260 +#: utils/adt/numeric.c:4261 #, c-format msgid "lower bound cannot be infinity" msgstr "Untergrenze kann nicht unendlich sein" -#: utils/adt/numeric.c:4267 +#: utils/adt/numeric.c:4268 #, c-format msgid "upper bound cannot be NaN" msgstr "Obergrenze kann nicht NaN sein" -#: utils/adt/numeric.c:4271 +#: utils/adt/numeric.c:4272 #, 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 +#: utils/adt/numeric.c:4433 utils/adt/numeric.c:4521 utils/adt/numeric.c:4581 +#: utils/adt/numeric.c:4777 #, c-format msgid "cannot convert NaN to %s" msgstr "kann NaN nicht in %s umwandeln" -#: utils/adt/numeric.c:4436 utils/adt/numeric.c:4524 utils/adt/numeric.c:4584 -#: utils/adt/numeric.c:4780 +#: utils/adt/numeric.c:4437 utils/adt/numeric.c:4525 utils/adt/numeric.c:4585 +#: utils/adt/numeric.c:4781 #, c-format msgid "cannot convert infinity to %s" msgstr "kann Unendlich nicht in %s umwandeln" -#: utils/adt/numeric.c:4789 +#: utils/adt/numeric.c:4790 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn ist außerhalb des gültigen Bereichs" -#: utils/adt/numeric.c:7981 utils/adt/numeric.c:8032 +#: utils/adt/numeric.c:7982 utils/adt/numeric.c:8033 #, c-format msgid "numeric field overflow" msgstr "Feldüberlauf bei Typ »numeric«" -#: utils/adt/numeric.c:7982 +#: utils/adt/numeric.c:7983 #, 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:8033 +#: utils/adt/numeric.c:8034 #, 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/numeric.c:11359 utils/adt/pseudorandomfuncs.c:135 +#: utils/adt/numeric.c:11360 utils/adt/pseudorandomfuncs.c:135 #: utils/adt/pseudorandomfuncs.c:159 #, c-format msgid "lower bound must be less than or equal to upper bound" @@ -26849,7 +26881,7 @@ msgstr "Zu viele Kommas." msgid "Junk after right parenthesis or bracket." msgstr "Müll nach rechter runder oder eckiger Klammer." -#: utils/adt/regexp.c:304 utils/adt/regexp.c:1996 utils/adt/varlena.c:4273 +#: utils/adt/regexp.c:304 utils/adt/regexp.c:2022 utils/adt/varlena.c:4273 #, c-format msgid "regular expression failed: %s" msgstr "regulärer Ausdruck fehlgeschlagen: %s" @@ -26864,33 +26896,33 @@ msgstr "ungültige Option für regulären Ausdruck: »%.*s«" 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: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 +#: utils/adt/regexp.c:716 utils/adt/regexp.c:725 utils/adt/regexp.c:1108 +#: utils/adt/regexp.c:1172 utils/adt/regexp.c:1181 utils/adt/regexp.c:1190 +#: utils/adt/regexp.c:1199 utils/adt/regexp.c:1879 utils/adt/regexp.c:1888 +#: utils/adt/regexp.c:1897 utils/misc/guc.c:6831 utils/misc/guc.c:6865 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "ungültiger Wert für Parameter »%s«: %d" -#: utils/adt/regexp.c:936 +#: utils/adt/regexp.c:939 #, 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: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 +#: utils/adt/regexp.c:1119 utils/adt/regexp.c:1210 utils/adt/regexp.c:1297 +#: utils/adt/regexp.c:1336 utils/adt/regexp.c:1724 utils/adt/regexp.c:1779 +#: utils/adt/regexp.c:1908 #, c-format msgid "%s does not support the \"global\" option" msgstr "%s unterstützt die »Global«-Option nicht" -#: utils/adt/regexp.c:1312 +#: utils/adt/regexp.c:1338 #, c-format msgid "Use the regexp_matches function instead." msgstr "Verwenden Sie stattdessen die Funktion regexp_matches." -#: utils/adt/regexp.c:1500 +#: utils/adt/regexp.c:1526 #, c-format msgid "too many regular expression matches" msgstr "zu viele Treffer für regulären Ausdruck" @@ -26905,8 +26937,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:2029 utils/adt/ruleutils.c:10509 -#: utils/adt/ruleutils.c:10722 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10526 +#: utils/adt/ruleutils.c:10739 #, c-format msgid "too many arguments" msgstr "zu viele Argumente" @@ -27298,12 +27330,12 @@ 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:216 +#: 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:223 +#: 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)" @@ -27605,136 +27637,136 @@ msgstr "ungültiger XML-Kommentar" msgid "not an XML document" msgstr "kein XML-Dokument" -#: utils/adt/xml.c:1008 utils/adt/xml.c:1031 +#: utils/adt/xml.c:1020 utils/adt/xml.c:1043 #, c-format msgid "invalid XML processing instruction" msgstr "ungültige XML-Verarbeitungsanweisung" -#: utils/adt/xml.c:1009 +#: utils/adt/xml.c:1021 #, 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:1032 +#: utils/adt/xml.c:1044 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "XML-Verarbeitungsanweisung darf nicht »?>« enthalten." -#: utils/adt/xml.c:1111 +#: utils/adt/xml.c:1123 #, c-format msgid "xmlvalidate is not implemented" msgstr "xmlvalidate ist nicht implementiert" -#: utils/adt/xml.c:1167 +#: utils/adt/xml.c:1179 #, c-format msgid "could not initialize XML library" msgstr "konnte XML-Bibliothek nicht initialisieren" -#: utils/adt/xml.c:1168 +#: utils/adt/xml.c:1180 #, 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:1254 +#: utils/adt/xml.c:1266 #, c-format msgid "could not set up XML error handler" msgstr "konnte XML-Fehlerbehandlung nicht einrichten" -#: utils/adt/xml.c:1255 +#: utils/adt/xml.c:1267 #, 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:2281 +#: utils/adt/xml.c:2283 msgid "Invalid character value." msgstr "Ungültiger Zeichenwert." -#: utils/adt/xml.c:2284 +#: utils/adt/xml.c:2286 msgid "Space required." msgstr "Leerzeichen benötigt." -#: utils/adt/xml.c:2287 +#: utils/adt/xml.c:2289 msgid "standalone accepts only 'yes' or 'no'." msgstr "standalone akzeptiert nur »yes« oder »no«." -#: utils/adt/xml.c:2290 +#: utils/adt/xml.c:2292 msgid "Malformed declaration: missing version." msgstr "Fehlerhafte Deklaration: Version fehlt." -#: utils/adt/xml.c:2293 +#: utils/adt/xml.c:2295 msgid "Missing encoding in text declaration." msgstr "Fehlende Kodierung in Textdeklaration." -#: utils/adt/xml.c:2296 +#: utils/adt/xml.c:2298 msgid "Parsing XML declaration: '?>' expected." msgstr "Beim Parsen der XML-Deklaration: »?>« erwartet." -#: utils/adt/xml.c:2299 +#: utils/adt/xml.c:2301 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "Unbekannter Libxml-Fehlercode: %d." -#: utils/adt/xml.c:2553 +#: utils/adt/xml.c:2555 #, c-format msgid "XML does not support infinite date values." msgstr "XML unterstützt keine unendlichen Datumswerte." -#: utils/adt/xml.c:2575 utils/adt/xml.c:2602 +#: utils/adt/xml.c:2577 utils/adt/xml.c:2604 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XML unterstützt keine unendlichen timestamp-Werte." -#: utils/adt/xml.c:3018 +#: utils/adt/xml.c:3020 #, c-format msgid "invalid query" msgstr "ungültige Anfrage" -#: utils/adt/xml.c:3110 +#: utils/adt/xml.c:3112 #, c-format msgid "portal \"%s\" does not return tuples" msgstr "Portal »%s« gibt keine Tupel zurück" -#: utils/adt/xml.c:4362 +#: utils/adt/xml.c:4364 #, c-format msgid "invalid array for XML namespace mapping" msgstr "ungültiges Array for XML-Namensraumabbildung" -#: utils/adt/xml.c:4363 +#: utils/adt/xml.c:4365 #, 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:4387 +#: utils/adt/xml.c:4389 #, c-format msgid "empty XPath expression" msgstr "leerer XPath-Ausdruck" -#: utils/adt/xml.c:4439 +#: utils/adt/xml.c:4441 #, c-format msgid "neither namespace name nor URI may be null" msgstr "weder Namensraumname noch URI dürfen NULL sein" -#: utils/adt/xml.c:4446 +#: utils/adt/xml.c:4448 #, 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:4795 +#: utils/adt/xml.c:4797 #, c-format msgid "DEFAULT namespace is not supported" msgstr "DEFAULT-Namensraum wird nicht unterstützt" -#: utils/adt/xml.c:4824 +#: utils/adt/xml.c:4826 #, c-format msgid "row path filter must not be empty string" msgstr "Zeilenpfadfilter darf nicht leer sein" -#: utils/adt/xml.c:4858 +#: utils/adt/xml.c:4860 #, c-format msgid "column path filter must not be empty string" msgstr "Spaltenpfadfilter darf nicht leer sein" -#: utils/adt/xml.c:5005 +#: utils/adt/xml.c:5007 #, 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" @@ -28204,7 +28236,7 @@ msgstr "Die Datei ist anscheinend aus Versehen übrig geblieben, konnte aber nic msgid "could not write lock file \"%s\": %m" msgstr "konnte Sperrdatei »%s« nicht schreiben: %m" -#: utils/init/miscinit.c:1591 utils/init/miscinit.c:1733 utils/misc/guc.c:5765 +#: utils/init/miscinit.c:1591 utils/init/miscinit.c:1733 utils/misc/guc.c:5770 #, c-format msgid "could not read from file \"%s\": %m" msgstr "konnte nicht aus Datei »%s« lesen: %m" @@ -28474,7 +28506,7 @@ msgstr "bind_textdomain_codeset fehlgeschlagen" msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "ungültige Byte-Sequenz für Kodierung »%s«: %s" -#: utils/mb/mbutils.c:1751 +#: utils/mb/mbutils.c:1759 #, 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«" @@ -28639,7 +28671,7 @@ msgid "parameter \"%s\" cannot be changed now" msgstr "Parameter »%s« kann jetzt nicht geändert werden" #: utils/misc/guc.c:3541 utils/misc/guc.c:3603 utils/misc/guc.c:4671 -#: utils/misc/guc.c:6756 +#: utils/misc/guc.c:6767 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "keine Berechtigung, um Parameter »%s« zu setzen" @@ -28664,12 +28696,12 @@ msgstr "Parameter »%s« kann nicht zurückgesetzt werden" msgid "parameter \"%s\" cannot be set locally in functions" msgstr "Parameter »%s« kann nicht lokal in Funktionen gesetzt werden" -#: utils/misc/guc.c:4370 utils/misc/guc.c:4418 utils/misc/guc.c:5450 +#: utils/misc/guc.c:4370 utils/misc/guc.c:4418 utils/misc/guc.c:5455 #, c-format msgid "permission denied to examine \"%s\"" msgstr "keine Berechtigung, um »%s« zu inspizieren" -#: utils/misc/guc.c:4371 utils/misc/guc.c:4419 utils/misc/guc.c:5451 +#: utils/misc/guc.c:4371 utils/misc/guc.c:4419 utils/misc/guc.c:5456 #, 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." @@ -28684,47 +28716,47 @@ msgstr "ALTER SYSTEM ist in dieser Umgebung nicht erlaubt" msgid "permission denied to perform ALTER SYSTEM RESET ALL" msgstr "keine Berechtigung um ALTER SYSTEM RESET ALL auszuführen" -#: utils/misc/guc.c:4740 +#: utils/misc/guc.c:4745 #, 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:4785 +#: utils/misc/guc.c:4790 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "konnte Inhalt der Datei »%s« nicht parsen" -#: utils/misc/guc.c:4967 +#: utils/misc/guc.c:4972 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "Versuch, den Parameter »%s« zu redefinieren" -#: utils/misc/guc.c:5306 +#: utils/misc/guc.c:5311 #, c-format msgid "invalid configuration parameter name \"%s\", removing it" msgstr "ungültiger Konfigurationsparametername »%s«, wird entfernt" -#: utils/misc/guc.c:5308 +#: utils/misc/guc.c:5313 #, c-format msgid "\"%s\" is now a reserved prefix." msgstr "»%s« ist jetzt ein reservierter Präfix." -#: utils/misc/guc.c:6179 +#: utils/misc/guc.c:6184 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "beim Setzen von Parameter »%s« auf »%s«" -#: utils/misc/guc.c:6348 +#: utils/misc/guc.c:6353 #, c-format msgid "parameter \"%s\" could not be set" msgstr "Parameter »%s« kann nicht gesetzt werden" -#: utils/misc/guc.c:6438 +#: utils/misc/guc.c:6443 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "konnte Wert von Parameter »%s« nicht lesen" -#: utils/misc/guc.c:6888 +#: utils/misc/guc.c:6899 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "ungültiger Wert für Parameter »%s«: %g" diff --git a/src/backend/po/ja.po b/src/backend/po/ja.po index d4a8af21133f4..3350a3aee278a 100644 --- a/src/backend/po/ja.po +++ b/src/backend/po/ja.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: postgres (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-02-07 09:52+0900\n" -"PO-Revision-Date: 2025-02-07 11:52+0900\n" +"POT-Creation-Date: 2025-06-20 13:19+0900\n" +"PO-Revision-Date: 2025-06-20 14:01+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: jpug-doc \n" "Language: ja\n" @@ -82,25 +82,25 @@ msgstr "圧縮アルゴリズム\"%s\"は長距離モードをサポートしま msgid "not recorded" msgstr "記録されていません" -#: ../common/controldata_utils.c:93 ../common/controldata_utils.c:97 commands/copyfrom.c:1760 commands/extension.c:3650 utils/adt/genfile.c:123 utils/time/snapmgr.c:1378 +#: ../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: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:3503 access/transam/xlog.c:4367 access/transam/xlogrecovery.c:1239 access/transam/xlogrecovery.c:1337 access/transam/xlogrecovery.c:1374 access/transam/xlogrecovery.c:1441 backup/basebackup.c:2127 backup/walsummary.c:283 commands/extension.c:3660 libpq/hba.c:767 -#: replication/logical/origin.c:749 replication/logical/origin.c:785 replication/logical/reorderbuffer.c:5113 replication/logical/snapbuild.c:1903 replication/slot.c:2269 replication/slot.c:2310 replication/walsender.c:623 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 +#: ../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:3478 access/transam/xlog.c:4342 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:5243 replication/logical/snapbuild.c:2099 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:116 ../common/controldata_utils.c:119 access/transam/xlog.c:3508 access/transam/xlog.c:4372 replication/logical/origin.c:754 replication/logical/origin.c:793 replication/logical/snapbuild.c:1908 replication/slot.c:2273 replication/slot.c:2314 replication/walsender.c:628 utils/cache/relmapper.c:833 +#: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 access/transam/xlog.c:3483 access/transam/xlog.c:4347 replication/logical/origin.c:750 replication/logical/origin.c:789 replication/logical/snapbuild.c:2104 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 "ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$dバイトを読み込みました" -#: ../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:1783 access/transam/xlog.c:3349 access/transam/xlog.c:3543 access/transam/xlog.c:3548 access/transam/xlog.c:3684 -#: access/transam/xlog.c:4337 access/transam/xlog.c:5294 commands/copyfrom.c:1820 commands/copyto.c:325 libpq/be-fsstubs.c:475 libpq/be-fsstubs.c:545 replication/logical/origin.c:687 replication/logical/origin.c:826 replication/logical/reorderbuffer.c:5165 replication/logical/snapbuild.c:1648 replication/logical/snapbuild.c:1769 replication/slot.c:2158 replication/slot.c:2321 replication/walsender.c:638 storage/file/copydir.c:208 storage/file/copydir.c:213 -#: storage/file/fd.c:827 storage/file/fd.c:3776 storage/file/fd.c:3882 utils/cache/relmapper.c:841 utils/cache/relmapper.c:956 +#: ../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:3324 access/transam/xlog.c:3518 access/transam/xlog.c:3523 access/transam/xlog.c:3659 +#: access/transam/xlog.c:4312 access/transam/xlog.c:5247 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:5295 replication/logical/snapbuild.c:1866 replication/logical/snapbuild.c:1990 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" @@ -122,41 +122,41 @@ msgstr "" "されるものと一致しないようです。この場合以下の結果は不正確になります。また、\n" "PostgreSQLインストレーションはこのデータディレクトリと互換性がなくなります。" -#: ../common/controldata_utils.c:225 ../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 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:3239 access/transam/xlog.c:3419 access/transam/xlog.c:3458 access/transam/xlog.c:3651 access/transam/xlog.c:4357 -#: access/transam/xlogrecovery.c:4277 access/transam/xlogrecovery.c:4378 access/transam/xlogutils.c:836 backup/basebackup.c:549 backup/basebackup.c:1600 backup/walsummary.c:220 libpq/hba.c:624 postmaster/syslogger.c:1512 replication/logical/origin.c:739 replication/logical/reorderbuffer.c:3765 replication/logical/reorderbuffer.c:4319 replication/logical/reorderbuffer.c:5093 replication/logical/snapbuild.c:1603 replication/logical/snapbuild.c:1710 -#: replication/slot.c:2241 replication/walsender.c:596 replication/walsender.c:3022 storage/file/copydir.c:151 storage/file/fd.c:802 storage/file/fd.c:3533 storage/file/fd.c:3763 storage/file/fd.c:3853 storage/smgr/md.c:653 utils/cache/relmapper.c:818 utils/cache/relmapper.c:935 utils/error/elog.c:2127 utils/init/miscinit.c:1582 utils/init/miscinit.c:1716 utils/init/miscinit.c:1793 utils/misc/guc.c:4774 utils/misc/guc.c:4824 +#: ../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:3231 access/transam/xlog.c:3394 access/transam/xlog.c:3433 access/transam/xlog.c:3626 access/transam/xlog.c:4332 +#: 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:3896 replication/logical/reorderbuffer.c:4450 replication/logical/reorderbuffer.c:5223 replication/logical/snapbuild.c:1821 replication/logical/snapbuild.c:1931 +#: replication/slot.c:2208 replication/walsender.c:632 replication/walsender.c:3085 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:246 ../common/controldata_utils.c:249 access/transam/twophase.c:1756 access/transam/twophase.c:1765 access/transam/xlog.c:9314 access/transam/xlogfuncs.c:699 backup/basebackup_server.c:173 backup/basebackup_server.c:266 backup/walsummary.c:304 postmaster/postmaster.c:4030 postmaster/syslogger.c:1523 postmaster/syslogger.c:1536 postmaster/syslogger.c:1549 utils/cache/relmapper.c:947 +#: ../common/controldata_utils.c:246 ../common/controldata_utils.c:249 access/transam/twophase.c:1757 access/transam/twophase.c:1766 access/transam/xlog.c:9323 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:263 ../common/controldata_utils.c:268 ../common/file_utils.c:419 ../common/file_utils.c:489 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:1777 access/transam/xlog.c:3339 access/transam/xlog.c:3537 access/transam/xlog.c:4330 access/transam/xlog.c:8686 access/transam/xlog.c:8731 -#: backup/basebackup_server.c:207 commands/dbcommands.c:514 replication/logical/snapbuild.c:1641 replication/slot.c:2144 replication/slot.c:2251 storage/file/fd.c:819 storage/file/fd.c:3874 storage/smgr/md.c:1344 storage/smgr/md.c:1389 storage/sync/sync.c:446 utils/misc/guc.c:4527 +#: ../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:3317 access/transam/xlog.c:3512 access/transam/xlog.c:4305 access/transam/xlog.c:8698 access/transam/xlog.c:8743 +#: backup/basebackup_server.c:207 commands/dbcommands.c:514 replication/logical/snapbuild.c:1859 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:158 ../common/cryptohash_openssl.c:356 ../common/exec.c:543 ../common/exec.c:588 ../common/exec.c:680 ../common/hmac.c:309 ../common/hmac.c:325 ../common/hmac_openssl.c:151 ../common/hmac_openssl.c:339 ../common/jsonapi.c:2407 ../common/md5_common.c:156 ../common/parse_manifest.c:157 ../common/parse_manifest.c:852 ../common/psprintf.c:140 ../common/scram-common.c:268 ../port/path.c:829 ../port/path.c:866 -#: ../port/path.c:883 access/transam/twophase.c:1418 access/transam/xlogrecovery.c:565 lib/dshash.c:253 libpq/auth.c:1336 libpq/auth.c:1380 libpq/auth.c:1942 libpq/be-secure-gssapi.c:527 postmaster/bgworker.c:355 postmaster/bgworker.c:1022 postmaster/postmaster.c:3507 postmaster/walsummarizer.c:935 replication/libpqwalreceiver/libpqwalreceiver.c:388 replication/logical/logical.c:210 replication/walsender.c:805 storage/buffer/localbuf.c:607 storage/file/fd.c:911 -#: storage/file/fd.c:1442 storage/file/fd.c:1603 storage/file/fd.c:2553 storage/ipc/procarray.c:1465 storage/ipc/procarray.c:2217 storage/ipc/procarray.c:2224 storage/ipc/procarray.c:2727 storage/ipc/procarray.c:3436 utils/adt/pg_locale.c:530 utils/adt/pg_locale.c:694 utils/adt/pg_locale_icu.c:364 utils/adt/pg_locale_libc.c:208 utils/adt/pg_locale_libc.c:303 utils/adt/pg_locale_libc.c:391 utils/fmgr/dfmgr.c:219 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:647 utils/misc/guc.c:672 utils/misc/guc.c:1060 utils/misc/guc.c:4505 utils/misc/tzparser.c:479 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:1155 utils/mmgr/slab.c:370 +#: ../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:534 libpq/be-secure-gssapi.c:714 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:212 +#: 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: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:351 ../common/hmac_openssl.c:359 +#: ../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:353 +#: ../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:355 +#: ../common/cryptohash_openssl.c:372 ../common/hmac_openssl.c:373 msgid "OpenSSL failure" msgstr "OpenSSLのエラー" @@ -180,27 +180,27 @@ msgstr "実行すべき\"%s\"がありませんでした" msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "パス\"%s\"を絶対パス形式に変換できませんでした: %m" -#: ../common/exec.c:363 commands/collationcmds.c:872 commands/copyfrom.c:1744 commands/copyto.c:654 libpq/be-secure-common.c:59 +#: ../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:375 libpq/be-secure-common.c:71 +#: ../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:378 +#: ../common/exec.c:397 #, c-format msgid "no data was returned by command \"%s\"" msgstr "コマンド\"%s\"からデータが返却されませんでした" -#: ../common/exec.c:405 libpq/pqcomm.c:193 storage/ipc/latch.c:1163 storage/ipc/latch.c:1343 storage/ipc/latch.c:1583 storage/ipc/latch.c:1745 storage/ipc/latch.c:1871 +#: ../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:142 ../port/path.c:831 ../port/path.c:868 ../port/path.c:885 utils/misc/ps_status.c:195 utils/misc/ps_status.c:203 utils/misc/ps_status.c:230 utils/misc/ps_status.c:238 +#: ../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" @@ -210,33 +210,33 @@ msgstr "メモリ不足です\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "nullポインタは複製できません(内部エラー)\n" -#: ../common/file_utils.c:77 storage/file/fd.c:3539 +#: ../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:121 ../common/file_utils.c:567 ../common/file_utils.c:571 access/transam/twophase.c:1321 access/transam/xlogarchive.c:111 access/transam/xlogarchive.c:235 backup/basebackup.c:357 backup/basebackup.c:555 backup/basebackup.c:626 backup/walsummary.c:247 backup/walsummary.c:254 commands/copyfrom.c:1770 commands/copyto.c:700 commands/extension.c:3639 commands/tablespace.c:804 commands/tablespace.c:893 postmaster/pgarch.c:680 -#: replication/logical/snapbuild.c:1498 replication/logical/snapbuild.c:2025 storage/file/fd.c:1967 storage/file/fd.c:2053 storage/file/fd.c:3587 utils/adt/dbsize.c:105 utils/adt/dbsize.c:266 utils/adt/dbsize.c:355 utils/adt/genfile.c:437 utils/adt/genfile.c:612 utils/adt/misc.c:340 +#: ../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:1717 replication/logical/snapbuild.c:2220 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:131 ../common/file_utils.c:228 +#: ../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:152 ../common/file_utils.c:282 ../common/pgfnames.c:48 ../common/rmtree.c:63 commands/tablespace.c:728 commands/tablespace.c:738 postmaster/postmaster.c:1482 storage/file/fd.c:2955 storage/file/reinit.c:126 utils/adt/misc.c:256 utils/misc/tzparser.c:340 +#: ../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:170 ../common/file_utils.c:316 ../common/pgfnames.c:69 ../common/rmtree.c:106 storage/file/fd.c:2967 +#: ../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:499 access/transam/xlogarchive.c:389 postmaster/pgarch.c:834 postmaster/syslogger.c:1560 replication/logical/snapbuild.c:1660 replication/slot.c:968 replication/slot.c:2030 replication/slot.c:2172 storage/file/fd.c:837 utils/time/snapmgr.c:1203 +#: ../common/file_utils.c:498 access/transam/xlogarchive.c:389 postmaster/pgarch.c:834 postmaster/syslogger.c:1559 replication/logical/snapbuild.c:1878 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" @@ -245,125 +245,121 @@ msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: % msgid "internal error" msgstr "内部エラー" -#: ../common/jsonapi.c:2432 +#: ../common/jsonapi.c:2124 msgid "Recursive descent parser cannot use incremental lexer." msgstr "再帰降下パーサーは差分字句解析器を使用できません。" -#: ../common/jsonapi.c:2434 +#: ../common/jsonapi.c:2126 msgid "Incremental parser requires incremental lexer." msgstr "差分パーサーは差分字句解析器を必要とします。" -#: ../common/jsonapi.c:2436 +#: ../common/jsonapi.c:2128 msgid "JSON nested too deep, maximum permitted depth is 6400." msgstr "JSONのネストが深すぎます、可能な最大の深さは6400です。" -#: ../common/jsonapi.c:2438 +#: ../common/jsonapi.c:2130 #, c-format msgid "Escape sequence \"\\%.*s\" is invalid." msgstr "エスケープシーケンス\"\\%.*s\"は不正です。" -#: ../common/jsonapi.c:2442 +#: ../common/jsonapi.c:2134 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "0x%02x値を持つ文字はエスケープしなければなりません" -#: ../common/jsonapi.c:2446 +#: ../common/jsonapi.c:2138 #, c-format msgid "Expected end of input, but found \"%.*s\"." msgstr "入力の終端を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2449 +#: ../common/jsonapi.c:2141 #, c-format msgid "Expected array element or \"]\", but found \"%.*s\"." msgstr "配列要素または\"]\"を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2452 +#: ../common/jsonapi.c:2144 #, c-format msgid "Expected \",\" or \"]\", but found \"%.*s\"." msgstr "\",\"または\"]\"を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2455 +#: ../common/jsonapi.c:2147 #, c-format msgid "Expected \":\", but found \"%.*s\"." msgstr "\":\"を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2458 +#: ../common/jsonapi.c:2150 #, c-format msgid "Expected JSON value, but found \"%.*s\"." msgstr "JSON値を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2461 +#: ../common/jsonapi.c:2153 msgid "The input string ended unexpectedly." msgstr "入力文字列が予期せず終了しました。" -#: ../common/jsonapi.c:2463 +#: ../common/jsonapi.c:2155 #, c-format msgid "Expected string or \"}\", but found \"%.*s\"." msgstr "文字列または\"}\"を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2466 +#: ../common/jsonapi.c:2158 #, c-format msgid "Expected \",\" or \"}\", but found \"%.*s\"." msgstr "\",\"または\"}\"を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2469 +#: ../common/jsonapi.c:2161 #, c-format msgid "Expected string, but found \"%.*s\"." msgstr "文字列を想定していましたが、\"%.*s\"でした。" -#: ../common/jsonapi.c:2472 +#: ../common/jsonapi.c:2164 #, c-format msgid "Token \"%.*s\" is invalid." msgstr "トークン\"%.*s\"は不正です。" -#: ../common/jsonapi.c:2478 jsonpath_scan.l:585 +#: ../common/jsonapi.c:2167 jsonpath_scan.l:608 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 はテキストに変換できません。" -#: ../common/jsonapi.c:2480 +#: ../common/jsonapi.c:2169 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\"の後には16進数の4桁が続かなければなりません。" -#: ../common/jsonapi.c:2483 +#: ../common/jsonapi.c:2172 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:2492 +#: ../common/jsonapi.c:2181 #, c-format msgid "Unicode escape value could not be translated to the server's encoding %s." msgstr "Unicodeエスケープの値がサーバーエンコーディング%sに変換できませんでした。" -#: ../common/jsonapi.c:2499 jsonpath_scan.l:618 +#: ../common/jsonapi.c:2188 jsonpath_scan.l:641 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicodeのハイサロゲートはハイサロゲートに続いてはいけません。" -#: ../common/jsonapi.c:2501 jsonpath_scan.l:629 jsonpath_scan.l:639 jsonpath_scan.l:691 +#: ../common/jsonapi.c:2190 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のローサロゲートはハイサロゲートに続かなければなりません。" -#: ../common/jsonapi.c:2523 -msgid "out of memory while constructing error description" -msgstr "エラー記述の構築中のメモリ不足" - -#: ../common/logging.c:279 +#: ../common/logging.c:276 #, c-format msgid "error: " msgstr "エラー: " -#: ../common/logging.c:286 +#: ../common/logging.c:283 #, c-format msgid "warning: " msgstr "警告: " -#: ../common/logging.c:297 +#: ../common/logging.c:294 #, c-format msgid "detail: " msgstr "詳細: " -#: ../common/logging.c:304 +#: ../common/logging.c:301 #, c-format msgid "hint: " msgstr "ヒント: " @@ -458,7 +454,7 @@ msgstr "ファイル名をデコードできませんでした" msgid "file size is not an integer" msgstr "ファイルサイズが整数ではありません" -#: ../common/parse_manifest.c:699 backup/basebackup.c:872 +#: ../common/parse_manifest.c:699 backup/basebackup.c:870 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "認識できないチェックサムアルゴリズム: \"%s\"" @@ -525,7 +521,7 @@ msgstr "目録チェックサムの不一致" 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:766 utils/misc/guc.c:3164 utils/misc/guc.c:3205 utils/misc/guc.c:3280 utils/misc/guc.c:4709 utils/misc/guc.c:6928 utils/misc/guc.c:6969 +#: ../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\"" @@ -585,13 +581,13 @@ msgstr "制限付きトークンで再実行できませんでした: %lu" 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:1716 access/transam/xlogarchive.c:119 access/transam/xlogarchive.c:399 postmaster/postmaster.c:1059 postmaster/syslogger.c:1489 replication/logical/origin.c:595 replication/logical/reorderbuffer.c:4588 replication/logical/snapbuild.c:1541 replication/logical/snapbuild.c:1997 replication/slot.c:2225 storage/file/fd.c:877 storage/file/fd.c:3401 storage/file/fd.c:3463 -#: storage/file/reinit.c:261 storage/ipc/dsm.c:343 storage/smgr/md.c:373 storage/smgr/md.c:432 storage/sync/sync.c:243 utils/time/snapmgr.c:1539 +#: ../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:4719 replication/logical/snapbuild.c:1759 replication/logical/snapbuild.c:2193 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:3393 storage/file/fd.c:3802 +#: ../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" @@ -608,33 +604,28 @@ msgstr "nonceのエンコードに失敗しました" msgid "could not encode server key" msgstr "サーバーキーのエンコードに失敗しました" -#: ../common/stringinfo.c:362 -#, c-format -msgid "string buffer exceeds maximum allowed length (%zu bytes)" -msgstr "文字列バッファの長さが上限値を超えています(%zuバイト)" - -#: ../common/stringinfo.c:363 +#: ../common/stringinfo.c:315 #, c-format msgid "Cannot enlarge string buffer containing %d bytes by %d more bytes." msgstr "%dバイトを持つ文字列バッファを%dバイト多く、大きくすることができません。" -#: ../common/stringinfo.c:367 +#: ../common/stringinfo.c:319 #, c-format msgid "" -"string buffer exceeds maximum allowed length (%zu bytes)\n" +"out of memory\n" "\n" "Cannot enlarge string buffer containing %d bytes by %d more bytes.\n" msgstr "" -"文字列バッファの長さが上限値を超えています(%zuバイト)\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 +#: ../common/username.c:45 libpq/auth.c:1888 msgid "user does not exist" msgstr "ユーザーが存在しません" @@ -673,12 +664,12 @@ msgstr "子プロセスはシグナル%dにより終了しました: %s" msgid "child process exited with unrecognized status %d" msgstr "子プロセスは認識できないステータス%dで終了しました" -#: ../port/chklocale.c:280 +#: ../port/chklocale.c:283 #, c-format msgid "could not determine encoding for codeset \"%s\"" msgstr "コードセット\"%s\"用の符号化方式を特定できませんでした" -#: ../port/chklocale.c:370 ../port/chklocale.c:376 +#: ../port/chklocale.c:404 ../port/chklocale.c:410 #, c-format msgid "could not determine encoding for locale \"%s\": codeset is \"%s\"" msgstr "ロケール\"%s\"用の符号化方式を特定できませんでした: コードセットは\"%s\"です" @@ -726,7 +717,7 @@ msgstr "再試行を30秒間続けます。" msgid "You might have antivirus, backup, or similar software interfering with the database system." msgstr "データベースシステムに干渉するアンチウィルス、バックアップといったソフトウェアが存在する可能性があります。" -#: ../port/path.c:853 +#: ../port/path.c:852 #, c-format msgid "could not get current working directory: %m\n" msgstr "現在の作業ディレクトリを取得できませんでした: %m\n" @@ -736,6 +727,16 @@ msgstr "現在の作業ディレクトリを取得できませんでした: %m\n 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" @@ -751,47 +752,47 @@ msgstr "PowerUsersグループのSIDを取得できませんでした: エラー msgid "could not check access token membership: error code %lu\n" msgstr "アクセストークンのメンバーシップを確認できませんでした: エラーコード %lu\n" -#: access/brin/brin.c:411 +#: 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:1390 access/brin/brin.c:1498 access/gin/ginfast.c:1040 access/transam/xlogfuncs.c:184 access/transam/xlogfuncs.c:209 access/transam/xlogfuncs.c:242 access/transam/xlogfuncs.c:281 access/transam/xlogfuncs.c:302 access/transam/xlogfuncs.c:323 access/transam/xlogfuncs.c:389 access/transam/xlogfuncs.c:447 statistics/attribute_stats.c:161 statistics/attribute_stats.c:884 statistics/relation_stats.c:129 +#: 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:1391 access/brin/brin.c:1499 +#: 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:1396 access/brin/brin.c:1504 +#: 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:1441 access/brin/brin.c:1530 +#: 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:1457 access/brin/brin.c:1546 +#: 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.c:1466 access/brin/brin.c:1562 access/gin/ginfast.c:1085 parser/parse_utilcmd.c:2431 +#: access/brin/brin.c:1463 access/brin/brin.c:1559 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:782 access/brin/brin_bloom.c:824 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 +#: 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 "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:1465 access/spgist/spgdoinsert.c:2001 access/spgist/spgdoinsert.c:2278 +#: 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 "インデックス行サイズ%1$zuはインデックス\"%3$s\"での最大値%2$zuを超えています" @@ -806,47 +807,47 @@ msgstr "BRINインデックスが壊れています: 範囲マップの不整合 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:111 access/gin/ginvalidate.c:142 access/gist/gistvalidate.c:148 access/hash/hashvalidate.c:112 access/nbtree/nbtvalidate.c:112 access/spgist/spgvalidate.c:181 +#: 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:127 access/gin/ginvalidate.c:154 access/gist/gistvalidate.c:160 access/hash/hashvalidate.c:124 access/nbtree/nbtvalidate.c:124 access/spgist/spgvalidate.c:193 +#: 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:149 access/gin/ginvalidate.c:173 access/gist/gistvalidate.c:180 access/hash/hashvalidate.c:150 access/nbtree/nbtvalidate.c:144 access/spgist/spgvalidate.c:213 +#: 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:178 access/gin/ginvalidate.c:186 access/hash/hashvalidate.c:163 access/nbtree/nbtvalidate.c:157 access/spgist/spgvalidate.c:229 +#: 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:191 access/gin/ginvalidate.c:199 access/gist/gistvalidate.c:228 access/hash/hashvalidate.c:176 access/nbtree/nbtvalidate.c:170 access/spgist/spgvalidate.c:245 +#: 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を含んでいます" -#: access/brin/brin_validate.c:229 access/hash/hashvalidate.c:216 access/nbtree/nbtvalidate.c:228 access/spgist/spgvalidate.c:272 +#: 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 "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は%3$sと%4$sの型に対する演算子が含まれていません" -#: access/brin/brin_validate.c:239 +#: 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 "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は型%3$sと%4$sに対するサポート関数を含んでいません" -#: access/brin/brin_validate.c:252 access/hash/hashvalidate.c:230 access/nbtree/nbtvalidate.c:252 access/spgist/spgvalidate.c:307 +#: 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 "アクセスメソッド\"%2$s\"の演算子クラス\"%1$s\"は演算子を含んでいません" -#: access/brin/brin_validate.c:263 access/gin/ginvalidate.c:241 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 "アクセスメソッド\"%2$s\"の演算子クラス\"%1$s\"はサポート関数%3$dを含んでいません" @@ -876,7 +877,7 @@ msgstr "%2$s型の属性\"%1$s\"が%3$s型の対応する属性と合致しま msgid "Attribute \"%s\" of type %s does not exist in type %s." msgstr "%2$s型の属性\"%1$s\"が%3$s型の中に存在しません。" -#: access/common/heaptuple.c:1133 access/common/heaptuple.c:1468 +#: access/common/heaptuple.c:1132 access/common/heaptuple.c:1467 #, c-format msgid "number of columns (%d) exceeds limit (%d)" msgstr "列数(%d)が上限(%d)を超えています" @@ -886,40 +887,45 @@ msgstr "列数(%d)が上限(%d)を超えています" msgid "number of index columns (%d) exceeds limit (%d)" msgstr "インデックス列数(%d)が上限(%d)を超えています" -#: access/common/indextuple.c:209 access/spgist/spgutils.c:975 +#: 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 commands/explain.c:5703 tcop/fastpath.c:106 tcop/fastpath.c:453 tcop/postgres.c:1948 +#: 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:528 access/common/reloptions.c:539 +#: 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:550 +#: access/common/reloptions.c:541 msgid "Valid values are \"local\" and \"cascaded\"." msgstr "有効な値は\"local\"と\"cascaded\"です。" -#: access/common/reloptions.c:698 +#: access/common/reloptions.c:689 #, c-format msgid "user-defined relation parameter types limit exceeded" msgstr "ユーザー定義リレーションのパラメータ型の制限を超えました" -#: access/common/reloptions.c:1240 +#: access/common/reloptions.c:1231 #, c-format msgid "RESET must not include values for parameters" msgstr "RESETにはパラメータの値を含めてはいけません" -#: access/common/reloptions.c:1272 +#: access/common/reloptions.c:1264 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "認識できないパラメータ namaspace \"%s\"" -#: access/common/reloptions.c:1309 commands/variable.c:1226 +#: access/common/reloptions.c:1294 commands/foreigncmds.c:86 +#, c-format +msgid "invalid option name \"%s\": must not contain \"=\"" +msgstr "不正なオプション名\"%s\": \"=\"が含まれていてはなりません" + +#: access/common/reloptions.c:1309 commands/variable.c:1214 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "WITH OIDSと定義されたテーブルはサポートされません" @@ -969,12 +975,12 @@ msgstr "有効な値の範囲は\"%f\"~\"%f\"です。" msgid "invalid value for enum option \"%s\": %s" msgstr "不正な列挙型オプションの値 \"%s\": %s" -#: access/common/reloptions.c:2000 +#: access/common/reloptions.c:1998 #, c-format msgid "cannot specify storage parameters for a partitioned table" msgstr "パーティション親テーブルに対してストレージパラメータは指定できません" -#: access/common/reloptions.c:2001 +#: access/common/reloptions.c:1999 #, c-format msgid "Specify storage parameters for its leaf partitions instead." msgstr "代わりにリーフパーティションに対してストレージパラメータを指定してください。" @@ -1019,52 +1025,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:148 executor/execExpr.c:2244 utils/adt/arrayfuncs.c:4028 utils/adt/arrayfuncs.c:6724 utils/adt/rowtypes.c:974 +#: 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:83 access/gist/gistvalidate.c:84 access/hash/hashvalidate.c:89 access/spgist/spgvalidate.c:94 +#: 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:251 +#: 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:323 access/gist/gistvalidate.c:346 access/spgist/spgvalidate.c:378 +#: 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:762 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:764 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:765 access/gist/gistutil.c:801 access/gist/gistutil.c:812 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 +#: 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:1198 +#: access/gist/gist.c:1203 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" msgstr "インデックス\"%s\"内の不完全な分割を修正します、ブロック%u" @@ -1079,33 +1085,33 @@ 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:223 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:234 access/hash/hashutil.c:246 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:198 +#: 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:209 +#: 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:277 access/hash/hashfunc.c:332 utils/adt/varchar.c:1000 utils/adt/varchar.c:1056 +#: 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:278 access/hash/hashfunc.c:333 catalog/heap.c:667 catalog/heap.c:673 commands/createas.c:201 commands/createas.c:513 commands/indexcmds.c:2065 commands/tablecmds.c:18941 commands/view.c:80 regex/regc_pg_locale.c:245 utils/adt/formatting.c:1655 utils/adt/formatting.c:1719 utils/adt/formatting.c:1783 utils/adt/formatting.c:1847 utils/adt/like.c:163 utils/adt/like.c:194 utils/adt/like_support.c:1020 utils/adt/varchar.c:738 -#: utils/adt/varchar.c:1001 utils/adt/varchar.c:1057 utils/adt/varlena.c:1520 +#: 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 句を使います。" @@ -1115,7 +1121,7 @@ msgstr "照合順序を明示するには COLLATE 句を使います。" 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:1036 +#: 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 "バッファページよりも大きな値をインデックスすることはできません。" @@ -1145,52 +1151,52 @@ msgstr "インデックス\"%s\"はハッシュインデックスではありま msgid "index \"%s\" has wrong hash version" msgstr "インデックス\"%s\"のハッシュバージョンが不正です" -#: access/hash/hashvalidate.c:188 +#: access/hash/hashvalidate.c:198 #, c-format msgid "operator family \"%s\" of access method %s lacks support function for operator %s" msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は演算子%3$sに対するサポート関数を含んでいません" -#: access/hash/hashvalidate.c:246 access/nbtree/nbtvalidate.c:268 +#: 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 "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は異なる型間に対応する演算子を含んでいません" -#: access/heap/heapam.c:2209 +#: access/heap/heapam.c:2241 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "並列ワーカーではタプルの挿入はできません" -#: access/heap/heapam.c:2728 +#: access/heap/heapam.c:2764 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "並列処理中はタプルの削除はできません" -#: access/heap/heapam.c:2775 +#: access/heap/heapam.c:2811 #, c-format msgid "attempted to delete invisible tuple" msgstr "不可視のタプルを削除しようとしました" -#: access/heap/heapam.c:3223 access/index/genam.c:832 +#: access/heap/heapam.c:3261 access/heap/heapam.c:6542 access/index/genam.c:818 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "並列処理中はタプルの更新はできません" -#: access/heap/heapam.c:3400 +#: access/heap/heapam.c:3438 #, c-format msgid "attempted to update invisible tuple" msgstr "不可視のタプルを更新しようとしました" -#: access/heap/heapam.c:4911 access/heap/heapam.c:4949 access/heap/heapam.c:5214 access/heap/heapam_handler.c:466 +#: access/heap/heapam.c:4949 access/heap/heapam.c:4987 access/heap/heapam.c:5252 access/heap/heapam_handler.c:468 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "リレーション\"%s\"の行ロックを取得できませんでした" -#: access/heap/heapam.c:6328 commands/trigger.c:3343 executor/nodeModifyTable.c:2528 executor/nodeModifyTable.c:2618 +#: access/heap/heapam.c:6355 commands/trigger.c:3340 executor/nodeModifyTable.c:2397 executor/nodeModifyTable.c:2488 #, c-format msgid "tuple to be updated was already modified by an operation triggered by the current command" msgstr "更新対象のタプルはすでに現在のコマンドによって起動された操作によって変更されています" -#: access/heap/heapam_handler.c:411 +#: access/heap/heapam_handler.c:413 #, c-format msgid "tuple to be locked was already moved to another partition due to concurrent update" msgstr "ロック対象のタプルは同時に行われた更新によってすでに他の子テーブルに移動されています" @@ -1205,8 +1211,8 @@ msgstr "行が大きすぎます: サイズは%zu、上限は%zu" msgid "could not write to file \"%s\", wrote %d of %d: %m" msgstr "ファイル\"%1$s\"に書き込めませんでした、%3$dバイト中%2$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:3264 access/transam/xlog.c:3472 access/transam/xlog.c:4309 access/transam/xlog.c:9303 access/transam/xlogfuncs.c:693 backup/basebackup_server.c:149 backup/basebackup_server.c:242 commands/dbcommands.c:494 postmaster/launch_backend.c:338 postmaster/postmaster.c:4017 postmaster/walsummarizer.c:1212 -#: replication/logical/origin.c:607 replication/slot.c:2091 storage/file/copydir.c:157 storage/smgr/md.c:222 utils/time/snapmgr.c:1182 +#: access/heap/rewriteheap.c:977 access/heap/rewriteheap.c:1094 access/transam/timeline.c:329 access/transam/timeline.c:481 access/transam/xlog.c:3256 access/transam/xlog.c:3447 access/transam/xlog.c:4284 access/transam/xlog.c:9312 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" @@ -1216,161 +1222,156 @@ msgstr "ファイル\"%s\"を作成できませんでした: %m" 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:3325 access/transam/xlog.c:3528 access/transam/xlog.c:4321 commands/dbcommands.c:506 postmaster/launch_backend.c:349 postmaster/launch_backend.c:361 replication/logical/origin.c:619 replication/logical/origin.c:661 replication/logical/origin.c:680 replication/logical/snapbuild.c:1617 replication/slot.c:2126 -#: storage/file/buffile.c:545 storage/file/copydir.c:197 utils/init/miscinit.c:1657 utils/init/miscinit.c:1668 utils/init/miscinit.c:1676 utils/misc/guc.c:4488 utils/misc/guc.c:4519 utils/misc/guc.c:5672 utils/misc/guc.c:5690 utils/time/snapmgr.c:1187 utils/time/snapmgr.c:1194 +#: access/heap/rewriteheap.c:1122 access/transam/timeline.c:384 access/transam/timeline.c:424 access/transam/timeline.c:498 access/transam/xlog.c:3306 access/transam/xlog.c:3503 access/transam/xlog.c:4296 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:1835 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:546 +#: access/heap/vacuumlazy.c:473 #, c-format msgid "aggressively vacuuming \"%s.%s.%s\"" msgstr "\"%s.%s.%s\"に対して積極的VACUUMを実行しています" -#: access/heap/vacuumlazy.c:551 +#: access/heap/vacuumlazy.c:478 #, c-format msgid "vacuuming \"%s.%s.%s\"" msgstr "\"%s.%s.%s\"に対してVACUUMを実行しています" -#: access/heap/vacuumlazy.c:710 +#: 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:721 +#: 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:723 +#: 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:728 +#: 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:730 +#: 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:737 +#: 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:744 +#: 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:750 +#: 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:756 +#: 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:763 +#: 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:771 +#: 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:774 +#: 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:782 -#, c-format -msgid "visibility map: %u pages set all-visible, %u pages set all-frozen (%u were all-visible)\n" -msgstr "可視性マップ: %uページが全可視 (all-visible)、%uページが全凍結 (all-frozen) (前回は%uページが全可視でした)\n" - -#: access/heap/vacuumlazy.c:790 +#: access/heap/vacuumlazy.c:698 msgid "index scan not needed: " msgstr "インデックススキャンは不要です: " -#: access/heap/vacuumlazy.c:792 +#: access/heap/vacuumlazy.c:700 msgid "index scan needed: " msgstr "インデックススキャンが必要です: " -#: access/heap/vacuumlazy.c:794 +#: 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:799 +#: access/heap/vacuumlazy.c:707 msgid "index scan bypassed: " msgstr "インデックススキャンはスキップされました: " -#: access/heap/vacuumlazy.c:801 +#: access/heap/vacuumlazy.c:709 msgid "index scan bypassed by failsafe: " msgstr "フェイルセーフによりインデックススキャンがスキップされました: " -#: access/heap/vacuumlazy.c:803 +#: 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:818 +#: 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:830 commands/analyze.c:816 +#: 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:840 commands/analyze.c:819 +#: 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:843 commands/analyze.c:821 +#: access/heap/vacuumlazy.c:751 commands/analyze.c:799 #, c-format -msgid "buffer usage: %lld hits, %lld reads, %lld dirtied\n" -msgstr "バッファ使用: ヒット %lld, 読み込み %lld, ダーティ化 %lld\n" +msgid "buffer usage: %lld hits, %lld misses, %lld dirtied\n" +msgstr "バッファ使用: %lldヒット, %lld失敗, %lld ダーティ化\n" -#: access/heap/vacuumlazy.c:848 commands/analyze.c:826 +#: 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:852 commands/analyze.c:830 +#: access/heap/vacuumlazy.c:760 commands/analyze.c:803 #, c-format msgid "system usage: %s" msgstr "システム使用状況: %s" -#: access/heap/vacuumlazy.c:2323 +#: 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:2495 +#: 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:2498 +#: 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:2499 +#: access/heap/vacuumlazy.c:2331 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" @@ -1379,67 +1380,67 @@ msgstr "" "設定パラメータ\"maintenance_work_mem\"または\"autovacuum_work_mem\"を増やすことを検討してください。\n" "VACUUMがトランザクションIDの割り当てに追従できるようにする他の方法を検討する必要があるかもしれません。" -#: access/heap/vacuumlazy.c:2761 +#: access/heap/vacuumlazy.c:2593 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "\"%s\":競合するロックが存在するため切り詰めを中断します" -#: access/heap/vacuumlazy.c:2831 +#: access/heap/vacuumlazy.c:2663 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "テーブル\"%s\": %uページから%uページに切り詰め" -#: access/heap/vacuumlazy.c:2893 +#: access/heap/vacuumlazy.c:2725 #, c-format msgid "table \"%s\": suspending truncate due to conflicting lock request" msgstr "テーブル\"%s\": 競合するロック要求が存在するため、切り詰めを保留します" -#: access/heap/vacuumlazy.c:3012 +#: 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:3279 +#: 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:3282 +#: 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:3286 +#: access/heap/vacuumlazy.c:3118 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "リレーション\"%s.%s\"のスキャン中" -#: access/heap/vacuumlazy.c:3294 +#: 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:3297 +#: 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:3301 +#: access/heap/vacuumlazy.c:3133 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "リレーション\"%s.%s\"のVACUUM処理中" -#: access/heap/vacuumlazy.c:3306 commands/vacuumparallel.c:1121 +#: 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:3311 commands/vacuumparallel.c:1127 +#: 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:3317 +#: access/heap/vacuumlazy.c:3149 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "リレーション \"%s.%s\"を%uブロックに切り詰め中" @@ -1454,22 +1455,22 @@ msgstr "アクセスメソッド\"%s\"のタイプが%sではありません" msgid "index access method \"%s\" does not have a handler" msgstr "インデックスアクセスメソッド\"%s\"はハンドラを持っていません" -#: access/index/genam.c:497 +#: access/index/genam.c:489 #, c-format msgid "transaction aborted during system catalog scan" msgstr "システムカタログのスキャン中にトランザクションがアボートしました" -#: access/index/genam.c:666 access/index/indexam.c:82 +#: 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:1361 commands/indexcmds.c:2957 commands/tablecmds.c:284 commands/tablecmds.c:308 commands/tablecmds.c:18636 commands/tablecmds.c:20541 +#: 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:19811 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\"はインデックスではありません" -#: access/index/indexam.c:1030 +#: access/index/indexam.c:1028 #, c-format msgid "operator class %s has no options" msgstr "演算子クラス%sにはオプションはありません" @@ -1489,7 +1490,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:2482 +#: 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ではありません" @@ -1509,17 +1510,17 @@ msgstr "インデックス\"%s\"に削除処理中の内部ページがありま 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:3270 +#: access/nbtree/nbtutils.c:5114 #, 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:3276 +#: access/nbtree/nbtutils.c:5120 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "インデックス行はリレーション\"%3$s\"のタプル(%1$u,%2$u)を参照しています。" -#: access/nbtree/nbtutils.c:3280 +#: access/nbtree/nbtutils.c:5124 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1528,7 +1529,7 @@ msgstr "" "バッファページの1/3を超える値はインデックス化できません。\n" "MD5ハッシュによる関数インデックスを検討するか、もしくは全文テキストインデックスを使用してください。" -#: access/nbtree/nbtvalidate.c:238 +#: 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 "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は型%3$sと%4$sに対応するサポート関数を含んでいません" @@ -1538,27 +1539,27 @@ msgstr "アクセスメソッド\"%2$s\"の演算子族\"%1$s\"は型%3$sと%4$s msgid "cannot open relation \"%s\"" msgstr "リレーション\"%s\"はopenできません" -#: access/spgist/spgutils.c:248 +#: 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:1033 +#: 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:128 +#: 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:294 +#: access/spgist/spgvalidate.c:302 #, c-format 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/tableam.c:255 +#: access/table/tableam.c:256 #, c-format msgid "tid (%u, %u) is not valid for relation \"%s\"" msgstr "tid (%u, %u) はリレーション\"%s\"に対して妥当ではありません" @@ -1568,7 +1569,7 @@ msgstr "tid (%u, %u) はリレーション\"%s\"に対して妥当ではあり msgid "\"%s\" cannot be empty." msgstr "\"%s\"は空にはできません。" -#: access/table/tableamapi.c:116 access/transam/xlogrecovery.c:4870 +#: access/table/tableamapi.c:116 access/transam/xlogrecovery.c:4859 #, c-format msgid "\"%s\" is too long (maximum %d characters)." msgstr "\"%s\"が長過ぎます(最大%d文字)。" @@ -1608,12 +1609,12 @@ msgstr "プライマリサーバーで設定パラメータ\"%s\"がonに設定 msgid "Make sure the configuration parameter \"%s\" is set." msgstr "設定パラメータ\"%s\"が設定されていることを確認してください。" -#: access/transam/multixact.c:1097 +#: access/transam/multixact.c:1091 #, c-format 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:1099 access/transam/multixact.c:1106 access/transam/multixact.c:1130 access/transam/multixact.c:1139 access/transam/varsup.c:158 access/transam/varsup.c:165 +#: 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" @@ -1622,61 +1623,61 @@ msgstr "" "そのデータベース全体の VACUUM を実行してください。\n" "古い準備済みトランザクションのコミットまたはロールバック、もしくは古いレプリケーションスロットの削除も必要かもしれません。" -#: access/transam/multixact.c:1104 +#: access/transam/multixact.c:1098 #, 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 のデータベースは周回によるデータ損失を防ぐために、新規のMultiXactIdsを割り当てるコマンドを受け付けていません" -#: access/transam/multixact.c:1125 access/transam/multixact.c:2482 +#: 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:1134 access/transam/multixact.c:2491 +#: 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:1195 +#: access/transam/multixact.c:1189 #, c-format msgid "multixact \"members\" limit exceeded" msgstr "マルチトランザクションの\"メンバ\"が制限を超えました" -#: access/transam/multixact.c:1196 +#: 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:1201 +#: 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を実行してください。" -#: access/transam/multixact.c:1232 +#: 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:1237 +#: 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を実行してください。" -#: access/transam/multixact.c:1377 +#: access/transam/multixact.c:1371 #, c-format msgid "MultiXactId %u does no longer exist -- apparent wraparound" msgstr "MultiXactId %uはもう存在しません: 周回しているようです" -#: access/transam/multixact.c:1383 +#: access/transam/multixact.c:1377 #, c-format msgid "MultiXactId %u has not been created yet -- apparent wraparound" msgstr "MultiXactId %uを作成できませんでした: 周回している様子" -#: access/transam/multixact.c:2487 access/transam/multixact.c:2496 +#: access/transam/multixact.c:2479 access/transam/multixact.c:2488 #, c-format msgid "" "To avoid MultiXactId assignment failures, execute a database-wide VACUUM in that database.\n" @@ -1685,27 +1686,27 @@ msgstr "" "MultiXactIdの割り当て失敗を防ぐために、このデータベースでデータベース全体に対するVACUUMを実行してください。\n" "古い準備済みトランザクションのコミットまたはロールバック、もしくは古いレプリケーションスロットの削除も必要かもしれません。" -#: access/transam/multixact.c:2775 +#: 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:2797 +#: access/transam/multixact.c:2789 #, c-format msgid "MultiXact member wraparound protections are now enabled" msgstr "マルチトランザクションメンバーの周回防止機能が有効になりました" -#: access/transam/multixact.c:3188 +#: 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:3206 +#: 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:3525 +#: access/transam/multixact.c:3517 #, c-format msgid "invalid MultiXactId: %u" msgstr "不正なMultiXactId: %u" @@ -1801,60 +1802,60 @@ msgstr "独自リソースマネージャ\"%s\"をID %dで登録しました" #: access/transam/slru.c:361 #, c-format -msgid "\"%s\" must be a multiple of %d." +msgid "\"%s\" must be a multiple of %d" msgstr "\"%s\"は%dの倍数でなければなりません。" -#: access/transam/slru.c:833 +#: access/transam/slru.c:830 #, c-format msgid "file \"%s\" doesn't exist, reading as zeroes" msgstr "ファイル\"%s\"が存在しません。ゼロとして読み込みます" -#: access/transam/slru.c:1062 access/transam/slru.c:1068 access/transam/slru.c:1076 access/transam/slru.c:1081 access/transam/slru.c:1088 access/transam/slru.c:1093 access/transam/slru.c:1100 access/transam/slru.c:1107 +#: 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:1063 +#: access/transam/slru.c:1060 #, c-format msgid "Could not open file \"%s\": %m." msgstr "ファイル\"%s\"をオープンできませんでした: %m。" -#: access/transam/slru.c:1069 +#: 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:1077 +#: 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:1082 +#: 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:1089 +#: 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:1094 +#: 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:1101 +#: access/transam/slru.c:1098 #, c-format msgid "Could not fsync file \"%s\": %m." msgstr "ファイル\"%s\"をfsyncできませんでした: %m。" -#: access/transam/slru.c:1108 +#: access/transam/slru.c:1105 #, c-format msgid "Could not close file \"%s\": %m." msgstr "ファイル\"%s\"をクローズできませんでした: %m。" -#: access/transam/slru.c:1434 +#: access/transam/slru.c:1431 #, c-format msgid "could not truncate directory \"%s\": apparent wraparound" msgstr "ディレクトリ\"%s\"を切り詰めできませんでした: 明らかに周回しています" @@ -1919,12 +1920,12 @@ msgstr "\"max_prepared_transactions\"を0以外の値に設定してください msgid "transaction identifier \"%s\" is already in use" msgstr "トランザクション識別子\"%s\"はすでに存在します" -#: access/transam/twophase.c:404 access/transam/twophase.c:2530 +#: access/transam/twophase.c:404 access/transam/twophase.c:2531 #, c-format msgid "maximum number of prepared transactions reached" msgstr "準備済みのトランザクションの最大数に達しました" -#: access/transam/twophase.c:405 access/transam/twophase.c:2531 +#: access/transam/twophase.c:405 access/transam/twophase.c:2532 #, c-format msgid "Increase \"max_prepared_transactions\" (currently %d)." msgstr "\"max_prepared_transactions\"を大きくしてください(現在は%d)。" @@ -1995,7 +1996,7 @@ msgstr "ファイル\"%s\"内に格納されているサイズが不正です" msgid "calculated CRC checksum does not match value stored in file \"%s\"" msgstr "算出されたCRCチェックサムがファイル\"%s\"に格納されている値と一致しません" -#: access/transam/twophase.c:1419 access/transam/xlogrecovery.c:566 postmaster/walsummarizer.c:936 replication/logical/logical.c:211 replication/walsender.c:806 +#: access/transam/twophase.c:1419 access/transam/xlogrecovery.c:565 postmaster/walsummarizer.c:936 replication/logical/logical.c:213 replication/walsender.c:840 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "WALリーダの割り当てに中に失敗しました。" @@ -2015,63 +2016,63 @@ msgstr "WALの%X/%Xから2相状態を読み取れませんでした" msgid "expected two-phase state data is not present in WAL at %X/%X" msgstr "WALの%X/%Xにあるはずの2相状態のデータがありません" -#: access/transam/twophase.c:1744 +#: access/transam/twophase.c:1745 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "ファイル\"%s\"を再作成できませんでした: %m" -#: access/transam/twophase.c:1871 +#: 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:2106 +#: access/transam/twophase.c:2107 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "共有メモリから準備済みトランザクション%uを復元します" -#: access/transam/twophase.c:2199 +#: access/transam/twophase.c:2200 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "不要になったトランザクション%uの2相状態ファイルを削除します" -#: access/transam/twophase.c:2206 +#: 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:2219 +#: access/transam/twophase.c:2220 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "トランザクション%uの未来の2相状態ファイルを削除します" -#: access/transam/twophase.c:2226 +#: 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:2251 +#: access/transam/twophase.c:2252 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "トランザクション%uの2相状態ファイルが破損しています" -#: access/transam/twophase.c:2256 +#: access/transam/twophase.c:2257 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "メモリ上にあるトランザクション%uの2相状態が破損しています" -#: access/transam/twophase.c:2513 +#: access/transam/twophase.c:2514 #, c-format msgid "could not recover two-phase state file for transaction %u" msgstr "トランザクション%uの2相状態ファイルを復元できませんでした" -#: access/transam/twophase.c:2515 +#: access/transam/twophase.c:2516 #, 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 "2相状態ファイルがWALレコード%X/%Xで見つかりましたが、このトランザクションはすでにディスクから復元済みです。" -#: access/transam/twophase.c:2523 storage/file/fd.c:513 utils/fmgr/dfmgr.c:199 +#: 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" @@ -2114,506 +2115,560 @@ msgstr "" "XIDの割り当て失敗を防ぐために、このデータベースでデータベース全体の VACUUM を実行してください。\n" "古い準備済みトランザクションのコミットまたはロールバック、もしくは古いレプリケーションスロットの削除も必要かもしれません。" -#: access/transam/xact.c:651 +#: access/transam/xact.c:649 #, c-format msgid "cannot assign transaction IDs during a parallel operation" msgstr "並列処理中にトランザクションIDの割り当てはできません" -#: access/transam/xact.c:842 +#: access/transam/xact.c:840 #, c-format msgid "cannot modify data in a parallel worker" msgstr "並列ワーカーではデータの更新はできません" -#: access/transam/xact.c:1117 +#: access/transam/xact.c:1115 #, c-format msgid "cannot start commands during a parallel operation" msgstr "並列処理中にはコマンドは起動できません" -#: access/transam/xact.c:1125 +#: 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:1694 +#: access/transam/xact.c:1664 #, c-format msgid "maximum number of committed subtransactions (%d) exceeded" msgstr "コミットされたサブトランザクション数の最大値(%d)が制限を越えました" -#: access/transam/xact.c:2613 +#: access/transam/xact.c:2561 #, c-format msgid "cannot PREPARE a transaction that has operated on temporary objects" msgstr "一時オブジェクトに対する操作を行ったトランザクションをPREPAREすることはできません" -#: access/transam/xact.c:2623 +#: 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:3649 +#: 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:3659 +#: 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:3669 +#: 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:3740 access/transam/xact.c:4062 access/transam/xact.c:4141 access/transam/xact.c:4264 access/transam/xact.c:4415 access/transam/xact.c:4484 access/transam/xact.c:4595 +#: 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:3948 +#: access/transam/xact.c:3905 #, c-format msgid "there is already a transaction in progress" msgstr "すでにトランザクションが実行中です" -#: access/transam/xact.c:4067 access/transam/xact.c:4146 access/transam/xact.c:4269 +#: 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:4157 +#: access/transam/xact.c:4114 #, c-format msgid "cannot commit during a parallel operation" msgstr "並列処理中にはコミットはできません" -#: access/transam/xact.c:4280 +#: access/transam/xact.c:4237 #, c-format msgid "cannot abort during a parallel operation" msgstr "パラレル処理中にロールバックはできません" -#: access/transam/xact.c:4379 +#: access/transam/xact.c:4336 #, c-format msgid "cannot define savepoints during a parallel operation" msgstr "パラレル処理中にセーブポイントは定義できません" -#: access/transam/xact.c:4466 +#: access/transam/xact.c:4423 #, c-format msgid "cannot release savepoints during a parallel operation" msgstr "並列処理中はセーブポイントの解放はできません" -#: access/transam/xact.c:4476 access/transam/xact.c:4527 access/transam/xact.c:4587 access/transam/xact.c:4636 +#: 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:4533 access/transam/xact.c:4642 +#: 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:4575 +#: access/transam/xact.c:4532 #, c-format msgid "cannot rollback to savepoints during a parallel operation" msgstr "パラレル処理中にセーブポイントのロールバックはできません" -#: access/transam/xact.c:5426 +#: 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:1541 +#: access/transam/xlog.c:1543 #, 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:1768 +#: access/transam/xlog.c:1770 #, 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:2209 access/transam/xlog.c:4545 +#: access/transam/xlog.c:2211 access/transam/xlog.c:4502 #, 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:2227 +#: access/transam/xlog.c:2229 #, c-format msgid "\"%s\" must be set to -1 during binary upgrade mode." msgstr "バイナリアップグレードモード中は\"%s\"は-1に設定されている必要があります。" -#: access/transam/xlog.c:2479 +#: access/transam/xlog.c:2478 #, 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:3765 access/transam/xlogutils.c:831 replication/walsender.c:3016 +#: access/transam/xlog.c:3740 access/transam/xlogutils.c:831 replication/walsender.c:3079 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "要求された WAL セグメント %s はすでに削除されています" -#: access/transam/xlog.c:4087 +#: access/transam/xlog.c:4062 #, c-format msgid "could not rename file \"%s\": %m" msgstr "ファイル\"%s\"の名前を変更できませんでした: %m" -#: access/transam/xlog.c:4130 access/transam/xlog.c:4141 access/transam/xlog.c:4162 +#: access/transam/xlog.c:4105 access/transam/xlog.c:4116 access/transam/xlog.c:4137 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "WALディレクトリ\"%s\"は存在しません" -#: access/transam/xlog.c:4147 access/transam/xlog.c:4168 +#: access/transam/xlog.c:4122 access/transam/xlog.c:4143 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "なかったWALディレクトリ\"%s\"を作成しています" -#: access/transam/xlog.c:4151 access/transam/xlog.c:4171 commands/dbcommands.c:3275 +#: access/transam/xlog.c:4126 access/transam/xlog.c:4146 commands/dbcommands.c:3262 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "なかったディレクトリ\"%s\"の作成に失敗しました: %m" -#: access/transam/xlog.c:4238 +#: access/transam/xlog.c:4213 #, c-format msgid "could not generate secret authorization token" msgstr "秘密の認証トークンを生成できませんでした" -#: access/transam/xlog.c:4389 access/transam/xlog.c:4399 access/transam/xlog.c:4425 access/transam/xlog.c:4435 access/transam/xlog.c:4445 access/transam/xlog.c:4451 access/transam/xlog.c:4461 access/transam/xlog.c:4471 access/transam/xlog.c:4481 access/transam/xlog.c:4491 access/transam/xlog.c:4501 access/transam/xlog.c:4511 access/transam/xlog.c:4523 access/transam/xlog.c:4531 utils/init/miscinit.c:1814 +#: access/transam/xlog.c:4364 access/transam/xlog.c:4374 access/transam/xlog.c:4400 access/transam/xlog.c:4408 access/transam/xlog.c:4416 access/transam/xlog.c:4422 access/transam/xlog.c:4430 access/transam/xlog.c:4438 access/transam/xlog.c:4446 access/transam/xlog.c:4454 access/transam/xlog.c:4462 access/transam/xlog.c:4470 access/transam/xlog.c:4480 access/transam/xlog.c:4488 utils/init/miscinit.c:1812 #, c-format msgid "database files are incompatible with server" msgstr "データベースファイルがサーバーと互換性がありません" -#: access/transam/xlog.c:4390 +#: access/transam/xlog.c:4365 #, 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:4394 +#: access/transam/xlog.c:4369 #, 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:4400 +#: access/transam/xlog.c:4375 #, 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:4403 access/transam/xlog.c:4431 access/transam/xlog.c:4441 access/transam/xlog.c:4447 +#: access/transam/xlog.c:4378 access/transam/xlog.c:4404 access/transam/xlog.c:4412 access/transam/xlog.c:4418 #, c-format msgid "It looks like you need to initdb." msgstr "initdbが必要のようです。" -#: access/transam/xlog.c:4415 +#: access/transam/xlog.c:4390 #, c-format msgid "incorrect checksum in control file" msgstr "制御ファイル内のチェックサムが不正です" -#. translator: %s is a variable name and %d is its value -#: access/transam/xlog.c:4427 access/transam/xlog.c:4437 access/transam/xlog.c:4453 access/transam/xlog.c:4463 access/transam/xlog.c:4473 access/transam/xlog.c:4483 access/transam/xlog.c:4493 access/transam/xlog.c:4503 access/transam/xlog.c:4513 +#: access/transam/xlog.c:4401 +#, 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:4409 #, c-format -msgid "The database cluster was initialized with %s %d, but the server was compiled with %s %d." -msgstr "データベースクラスタは %s %d で初期化されましたが、サーバーは %s %d でコンパイルされています。" +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:4446 +#: access/transam/xlog.c:4417 #, c-format msgid "The database cluster appears to use a different floating-point number format than the server executable." msgstr "データベースクラスタはサーバー実行ファイルと異なる浮動小数点書式を使用しているようです。" -#: access/transam/xlog.c:4457 access/transam/xlog.c:4467 access/transam/xlog.c:4477 access/transam/xlog.c:4487 access/transam/xlog.c:4497 access/transam/xlog.c:4507 access/transam/xlog.c:4517 access/transam/xlog.c:4526 access/transam/xlog.c:4534 +#: access/transam/xlog.c:4423 +#, 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:4426 access/transam/xlog.c:4434 access/transam/xlog.c:4442 access/transam/xlog.c:4450 access/transam/xlog.c:4458 access/transam/xlog.c:4466 access/transam/xlog.c:4474 access/transam/xlog.c:4483 access/transam/xlog.c:4491 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "再コンパイルもしくは initdb が必要そうです。" -#: access/transam/xlog.c:4524 +#: access/transam/xlog.c:4431 +#, 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:4439 +#, 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:4447 +#, 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:4455 +#, 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:4463 +#, 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:4471 +#, 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:4481 #, 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:4532 +#: access/transam/xlog.c:4489 #, 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:4541 +#: access/transam/xlog.c:4498 #, 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バイト)" -#. translator: both %s are GUC names -#: access/transam/xlog.c:4555 access/transam/xlog.c:4561 +#: access/transam/xlog.c:4511 +#, 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:4515 #, c-format -msgid "\"%s\" must be at least twice \"%s\"" -msgstr "\"%s\"は\"%s\"の2倍以上でなければなりません" +msgid "\"max_wal_size\" must be at least twice \"wal_segment_size\"" +msgstr "\"max_wal_size\"は\"wal_segment_size\"の2倍以上でなければなりません" -#: access/transam/xlog.c:4710 catalog/namespace.c:4696 commands/tablespace.c:1210 commands/user.c:2531 commands/variable.c:72 replication/slot.c:2466 tcop/postgres.c:3590 utils/error/elog.c:2250 +#: access/transam/xlog.c:4663 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:4756 commands/user.c:2547 commands/variable.c:173 tcop/postgres.c:3606 utils/error/elog.c:2276 +#: access/transam/xlog.c:4709 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:5177 +#: access/transam/xlog.c:5130 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "ブートストラップの先行書き込みログファイルに書き込めませんでした: %m" -#: access/transam/xlog.c:5185 +#: access/transam/xlog.c:5138 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "ブートストラップの先行書き込みログファイルをfsyncできませんでした: %m" -#: access/transam/xlog.c:5191 +#: access/transam/xlog.c:5144 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "ブートストラップの先行書き込みログファイルをクローズできませんでした: %m" -#: access/transam/xlog.c:5416 +#: access/transam/xlog.c:5369 #, c-format msgid "WAL was generated with \"wal_level=minimal\", cannot continue recovering" msgstr "\"wal_level=minimal\"でWALが生成されました、リカバリは続行不可です" -#: access/transam/xlog.c:5417 +#: access/transam/xlog.c:5370 #, c-format msgid "This happens if you temporarily set \"wal_level=minimal\" on the server." msgstr "これはこのサーバーで一時的に\"wal_level=minimal\"にした場合に起こります。" -#: access/transam/xlog.c:5418 +#: access/transam/xlog.c:5371 #, c-format msgid "Use a backup taken after setting \"wal_level\" to higher than \"minimal\"." msgstr "\"wal_level\"を\"minimal\"より上位に設定したあとに取得したバックアップを使用してください。" -#: access/transam/xlog.c:5483 +#: access/transam/xlog.c:5436 #, c-format msgid "control file contains invalid checkpoint location" msgstr "制御ファイル内のチェックポイント位置が不正です" -#: access/transam/xlog.c:5494 +#: access/transam/xlog.c:5447 #, c-format msgid "database system was shut down at %s" msgstr "データベースシステムは %s にシャットダウンしました" -#: access/transam/xlog.c:5500 +#: access/transam/xlog.c:5453 #, c-format msgid "database system was shut down in recovery at %s" msgstr "データベースシステムはリカバリ中 %s にシャットダウンしました" -#: access/transam/xlog.c:5506 +#: access/transam/xlog.c:5459 #, c-format msgid "database system shutdown was interrupted; last known up at %s" msgstr "データベースシステムはシャットダウン中に中断されました; %s まで動作していたことは確認できます" -#: access/transam/xlog.c:5512 +#: access/transam/xlog.c:5465 #, c-format msgid "database system was interrupted while in recovery at %s" msgstr "データベースシステムはリカバリ中 %s に中断されました" -#: access/transam/xlog.c:5514 +#: access/transam/xlog.c:5467 #, 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:5520 +#: access/transam/xlog.c:5473 #, c-format msgid "database system was interrupted while in recovery at log time %s" msgstr "データベースシステムはリカバリ中ログ時刻 %s に中断されました" -#: access/transam/xlog.c:5522 +#: access/transam/xlog.c:5475 #, 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:5528 +#: access/transam/xlog.c:5481 #, c-format msgid "database system was interrupted; last known up at %s" msgstr "データベースシステムは中断されました: %s まで動作していたことは確認できます" -#: access/transam/xlog.c:5535 +#: access/transam/xlog.c:5488 #, c-format msgid "control file contains invalid database cluster state" msgstr "制御ファイル内のデータベース・クラスタ状態が不正です" -#: access/transam/xlog.c:5923 +#: access/transam/xlog.c:5876 #, c-format msgid "WAL ends before end of online backup" msgstr "オンラインバックアップの終了より前にWALが終了しました" -#: access/transam/xlog.c:5924 +#: access/transam/xlog.c:5877 #, c-format msgid "All WAL generated while online backup was taken must be available at recovery." msgstr "オンラインバックアップ中に生成されたすべてのWALがリカバリで利用可能である必要があります。" -#: access/transam/xlog.c:5928 +#: access/transam/xlog.c:5881 #, c-format msgid "WAL ends before consistent recovery point" msgstr "WALが一貫性があるリカバリポイントより前で終了しました" -#: access/transam/xlog.c:5974 +#: access/transam/xlog.c:5927 #, c-format msgid "selected new timeline ID: %u" msgstr "新しいタイムラインIDを選択: %u" -#: access/transam/xlog.c:6007 +#: access/transam/xlog.c:5960 #, c-format msgid "archive recovery complete" msgstr "アーカイブリカバリが完了しました" -#: access/transam/xlog.c:6636 +#: access/transam/xlog.c:6613 #, c-format msgid "shutting down" msgstr "シャットダウンしています" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6675 +#: access/transam/xlog.c:6652 #, 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:6687 +#: access/transam/xlog.c:6664 #, 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:6752 +#: access/transam/xlog.c:6729 #, c-format -msgid "restartpoint complete: wrote %d buffers (%.1f%%), wrote %d SLRU buffers; %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個のSLRUバッファを出力; %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" +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:6776 +#: access/transam/xlog.c:6752 #, c-format -msgid "checkpoint complete: wrote %d buffers (%.1f%%), wrote %d SLRU buffers; %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個のSLRUバッファを出力; %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" +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:7262 +#: access/transam/xlog.c:7244 #, c-format msgid "concurrent write-ahead log activity while database system is shutting down" msgstr "データベースのシャットダウンに並行して、先行書き込みログが発生しました" -#: access/transam/xlog.c:7849 +#: access/transam/xlog.c:7859 #, c-format msgid "recovery restart point at %X/%X" msgstr "リカバリ再開ポイントは%X/%Xです" -#: access/transam/xlog.c:7851 +#: access/transam/xlog.c:7861 #, c-format msgid "Last completed transaction was at log time %s." msgstr "最後に完了したトランザクションはログ時刻 %s のものです" -#: access/transam/xlog.c:8113 +#: access/transam/xlog.c:8125 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "復帰ポイント\"%s\"が%X/%Xに作成されました" -#: access/transam/xlog.c:8320 +#: access/transam/xlog.c:8332 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "オンラインバックアップはキャンセルされ、リカバリを継続できません" -#: access/transam/xlog.c:8378 +#: access/transam/xlog.c:8390 #, c-format msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" msgstr "シャットダウンチェックポイントレコードにおいて想定外のタイムラインID %u(%uのはず)がありました" -#: access/transam/xlog.c:8436 +#: access/transam/xlog.c:8448 #, c-format msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" msgstr "オンラインチェックポイントレコードにおいて想定外のタイムラインID %u(%uのはず)がありました" -#: access/transam/xlog.c:8465 +#: access/transam/xlog.c:8477 #, c-format msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" msgstr "リカバリ終了チェックポイントレコードにおいて想定外のタイムラインID %u(%uのはず)がありました" -#: access/transam/xlog.c:8736 +#: access/transam/xlog.c:8748 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "ライトスルーファイル\"%s\"をfsyncできませんでした: %m" -#: access/transam/xlog.c:8741 +#: access/transam/xlog.c:8753 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "ファイル\"%s\"をfdatasyncできませんでした: %m" -#: access/transam/xlog.c:8831 access/transam/xlog.c:9167 +#: access/transam/xlog.c:8840 access/transam/xlog.c:9176 #, c-format msgid "WAL level not sufficient for making an online backup" msgstr "オンラインバックアップを行うにはWALレベルが不十分です" -#: access/transam/xlog.c:8832 access/transam/xlog.c:9168 access/transam/xlogfuncs.c:249 +#: access/transam/xlog.c:8841 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:8837 +#: access/transam/xlog.c:8846 #, c-format msgid "backup label too long (max %d bytes)" msgstr "バックアップラベルが長すぎます (最大%dバイト)" -#: access/transam/xlog.c:8958 +#: access/transam/xlog.c:8967 #, c-format msgid "WAL generated with \"full_page_writes=off\" was replayed since last restartpoint" msgstr "\"full_page_writes=off\"で生成されたWALが最終リスタートポイント以降に再生されました" -#: access/transam/xlog.c:8960 access/transam/xlog.c:9256 +#: access/transam/xlog.c:8969 access/transam/xlog.c:9265 #, 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:9040 backup/basebackup.c:1419 utils/adt/misc.c:354 +#: access/transam/xlog.c:9049 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:9047 backup/basebackup.c:1424 utils/adt/misc.c:359 +#: access/transam/xlog.c:9056 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:9206 backup/basebackup.c:1283 +#: access/transam/xlog.c:9177 +#, c-format +msgid "wal_level must be set to \"replica\" or \"logical\" at server start." +msgstr "サーバーの開始時にwal_levelを\"replica\"または \"logical\"に設定する必要があります。" + +#: access/transam/xlog.c:9215 backup/basebackup.c:1281 #, c-format msgid "the standby was promoted during online backup" msgstr "オンラインバックアップ中にスタンバイが昇格しました" -#: access/transam/xlog.c:9207 backup/basebackup.c:1284 +#: access/transam/xlog.c:9216 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:9254 +#: access/transam/xlog.c:9263 #, 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:9370 +#: access/transam/xlog.c:9379 #, c-format msgid "base backup done, waiting for required WAL segments to be archived" msgstr "ベースバックアップ完了、必要な WAL セグメントがアーカイブされるのを待っています" -#: access/transam/xlog.c:9384 +#: access/transam/xlog.c:9393 #, c-format msgid "still waiting for all required WAL segments to be archived (%d seconds elapsed)" msgstr "まだ必要なすべての WAL セグメントがアーカイブされるのを待っています(%d 秒経過)" -#: access/transam/xlog.c:9386 +#: access/transam/xlog.c:9395 #, 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:9393 +#: access/transam/xlog.c:9402 #, c-format msgid "all required WAL segments have been archived" msgstr "必要なすべての WAL セグメントがアーカイブされました" -#: access/transam/xlog.c:9397 +#: access/transam/xlog.c:9406 #, 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:9436 +#: access/transam/xlog.c:9445 #, c-format msgid "aborting backup due to backend exiting before pg_backup_stop was called" msgstr "バックエンドがpg_backup_stopの呼び出し前に終了したため、バックアップは異常終了しました" @@ -2656,268 +2711,268 @@ msgstr "アーカイブステータスファイル\"%s\"を作成できません msgid "could not write archive status file \"%s\": %m" msgstr "アーカイブステータスファイル\"%s\"に書き込めませんでした: %m" -#: access/transam/xlogfuncs.c:70 backup/basebackup.c:999 +#: 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:141 +#: access/transam/xlogfuncs.c:140 #, c-format msgid "backup is not in progress" msgstr "バックアップが進行中ではありません" -#: access/transam/xlogfuncs.c:142 +#: access/transam/xlogfuncs.c:141 #, c-format msgid "Did you call pg_backup_start()?" msgstr "pg_backup_start()を呼び出しましたか?" -#: access/transam/xlogfuncs.c:185 access/transam/xlogfuncs.c:243 access/transam/xlogfuncs.c:282 access/transam/xlogfuncs.c:303 access/transam/xlogfuncs.c:324 +#: 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:210 access/transam/xlogfuncs.c:390 access/transam/xlogfuncs.c:448 +#: 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:216 +#: 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:248 +#: access/transam/xlogfuncs.c:247 #, c-format msgid "WAL level not sufficient for creating a restore point" msgstr "リストアポイントを作るにはWALレベルが不足しています" -#: access/transam/xlogfuncs.c:256 +#: access/transam/xlogfuncs.c:255 #, c-format msgid "value too long for restore point (maximum %d characters)" msgstr "リストアポイントとしては値が長すぎます(最大%d文字)" -#: access/transam/xlogfuncs.c:487 +#: access/transam/xlogfuncs.c:486 #, c-format msgid "invalid WAL file name \"%s\"" msgstr "WALファイル名\"%s\"は不正です" -#: 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 +#: 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:524 access/transam/xlogfuncs.c:554 access/transam/xlogfuncs.c:578 access/transam/xlogfuncs.c:601 access/transam/xlogfuncs.c:681 +#: 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:529 access/transam/xlogfuncs.c:559 +#: access/transam/xlogfuncs.c:528 access/transam/xlogfuncs.c:558 #, c-format msgid "standby promotion is ongoing" msgstr "スタンバイの昇格を実行中です" -#: access/transam/xlogfuncs.c:530 access/transam/xlogfuncs.c:560 +#: 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:686 +#: access/transam/xlogfuncs.c:685 #, c-format msgid "\"wait_seconds\" must not be negative or zero" msgstr "\"wait_seconds\"は負の値もしくはゼロにはできません" -#: access/transam/xlogfuncs.c:708 storage/ipc/signalfuncs.c:293 +#: 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:740 libpq/be-secure.c:241 libpq/be-secure.c:350 +#: 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:741 +#: access/transam/xlogfuncs.c:740 #, c-format msgid "while waiting on promotion" msgstr "昇格の待機中" -#: access/transam/xlogfuncs.c:745 +#: 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:1086 +#: access/transam/xlogprefetcher.c:1088 #, c-format -msgid "\"recovery_prefetch\" is not supported on platforms that lack support for issuing read-ahead advice." -msgstr "\"recovery_prefetch\"は先読み指示の発行をサポートしないプラットフォームではサポートされません。" +msgid "\"recovery_prefetch\" is not supported on platforms that lack posix_fadvise()." +msgstr "recovery_prefetchはposix_fadvise()を持たないプラットフォームではサポートされません。" -#: access/transam/xlogreader.c:620 +#: 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: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:1135 +#: 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:759 +#: access/transam/xlogreader.c:758 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "%X/%Xでcontrecordフラグがありません" -#: access/transam/xlogreader.c:772 +#: 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:1143 +#: 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:1156 access/transam/xlogreader.c:1172 +#: 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:1210 +#: 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:1244 +#: 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:1259 access/transam/xlogreader.c:1301 +#: 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:1275 +#: 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:1283 +#: 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:1289 +#: 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:1321 +#: 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:1347 +#: 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:1759 +#: 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:1783 +#: 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:1790 +#: 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:1826 +#: 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:1842 +#: 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:1856 +#: 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:1871 +#: 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:1887 +#: 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:1899 +#: 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:1966 +#: access/transam/xlogreader.c:1956 #, c-format msgid "record with invalid length at %X/%X" msgstr "%X/%Xのレコードのサイズが不正です" -#: access/transam/xlogreader.c:1992 +#: 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:2076 +#: 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:2083 +#: 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:2110 access/transam/xlogreader.c:2127 +#: 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:2136 +#: 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:2144 +#: 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:618 +#: 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 "タイムラインID %5$u上でREDO LSN %1$X/%2$X、チェックポイントLSN %3$X/%4$Xからのバックアップ・リカバリを開始しました" -#: access/transam/xlogrecovery.c:650 +#: access/transam/xlogrecovery.c:649 #, c-format 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:652 access/transam/xlogrecovery.c:663 +#: 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" @@ -2929,453 +2984,453 @@ msgstr "" " バックアップからの復旧でなければ、\"%s/backup_label\"の削除を試みてください。.\n" "バックアップからの復旧で\"%s/backup_label\"を削除すると、クラスタが破壊されることに注意してください。" -#: access/transam/xlogrecovery.c:661 +#: access/transam/xlogrecovery.c:660 #, c-format msgid "could not locate required checkpoint record at %X/%X" msgstr "必須のチェックポイントが%X/%Xで見つかりませんでした" -#: access/transam/xlogrecovery.c:691 commands/tablespace.c:664 +#: 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:771 +#: access/transam/xlogrecovery.c:770 #, c-format msgid "restarting backup recovery with redo LSN %X/%X" msgstr "REDO LSN %X/%Xのバックアプリカバリを再開しました" -#: access/transam/xlogrecovery.c:796 +#: 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:807 +#: access/transam/xlogrecovery.c:806 #, c-format msgid "entering standby mode" msgstr "スタンバイモードに入ります" -#: access/transam/xlogrecovery.c:810 +#: access/transam/xlogrecovery.c:809 #, c-format msgid "starting point-in-time recovery to XID %u" msgstr "XID%uまでのポイントインタイムリカバリを開始します" -#: access/transam/xlogrecovery.c:814 +#: access/transam/xlogrecovery.c:813 #, c-format msgid "starting point-in-time recovery to %s" msgstr "%sまでのポイントインタイムリカバリを開始します" -#: access/transam/xlogrecovery.c:818 +#: access/transam/xlogrecovery.c:817 #, c-format msgid "starting point-in-time recovery to \"%s\"" msgstr "\"%s\"までのポイントインタイムリカバリを開始します" -#: access/transam/xlogrecovery.c:822 +#: 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:826 +#: access/transam/xlogrecovery.c:825 #, c-format msgid "starting point-in-time recovery to earliest consistent point" msgstr "最も古い一貫性確保点までのポイントインタイムリカバリを開始します" -#: access/transam/xlogrecovery.c:829 +#: access/transam/xlogrecovery.c:828 #, c-format msgid "starting archive recovery" msgstr "アーカイブリカバリを開始しています" -#: access/transam/xlogrecovery.c:850 +#: 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:852 +#: 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:866 +#: 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:894 +#: access/transam/xlogrecovery.c:893 #, c-format msgid "invalid next transaction ID" msgstr "次のトランザクションIDが不正です" -#: access/transam/xlogrecovery.c:899 +#: access/transam/xlogrecovery.c:898 #, c-format msgid "invalid redo in checkpoint record" msgstr "チェックポイントレコード内の不正なREDO" -#: access/transam/xlogrecovery.c:910 +#: access/transam/xlogrecovery.c:909 #, c-format msgid "invalid redo record in shutdown checkpoint" msgstr "シャットダウン・チェックポイントにおける不正なREDOレコード" -#: access/transam/xlogrecovery.c:939 +#: access/transam/xlogrecovery.c:938 #, c-format msgid "database system was not properly shut down; automatic recovery in progress" msgstr "データベースシステムは正しくシャットダウンされていません; 自動リカバリを実行中" -#: access/transam/xlogrecovery.c:943 +#: 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:986 +#: access/transam/xlogrecovery.c:985 #, c-format msgid "backup_label contains data inconsistent with control file" msgstr "backup_labelに制御ファイルと整合しないデータが含まれます" -#: access/transam/xlogrecovery.c:987 +#: 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:1041 +#: access/transam/xlogrecovery.c:1040 #, c-format msgid "using recovery command file \"%s\" is not supported" msgstr "リカバリコマンドファイル \"%s\"の使用はサポートされません" -#: access/transam/xlogrecovery.c:1106 +#: access/transam/xlogrecovery.c:1105 #, c-format msgid "standby mode is not supported by single-user servers" msgstr "スタンバイモードはシングルユーザーサーバーではサポートされません" -#: access/transam/xlogrecovery.c:1123 +#: access/transam/xlogrecovery.c:1122 #, c-format msgid "specified neither \"primary_conninfo\" nor \"restore_command\"" msgstr "\"primary_conninfo\"と\"restore_command\"のどちらも指定されていません" -#: access/transam/xlogrecovery.c:1124 +#: 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:1132 +#: 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:1170 +#: access/transam/xlogrecovery.c:1169 #, c-format msgid "recovery target timeline %u does not exist" msgstr "リカバリ目標タイムライン%uが存在しません" -#: access/transam/xlogrecovery.c:1253 access/transam/xlogrecovery.c:1260 access/transam/xlogrecovery.c:1319 access/transam/xlogrecovery.c:1407 access/transam/xlogrecovery.c:1416 access/transam/xlogrecovery.c:1436 +#: 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:1320 +#: access/transam/xlogrecovery.c:1319 #, c-format msgid "Timeline ID parsed is %u, but expected %u." msgstr "読み取られたタイムラインIDは%uでしたが、%uであるはずです。" -#: access/transam/xlogrecovery.c:1331 +#: access/transam/xlogrecovery.c:1330 #, c-format msgid "this is an incremental backup, not a data directory" msgstr "これはデータディレクトリではなく、差分バックアップです" -#: access/transam/xlogrecovery.c:1332 +#: access/transam/xlogrecovery.c:1331 #, c-format msgid "Use pg_combinebackup to reconstruct a valid data directory." msgstr "有効なデータディレクトリを再構築するにはpg_combinebackupを使ってください。" -#: access/transam/xlogrecovery.c:1718 +#: 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:1741 +#: access/transam/xlogrecovery.c:1740 #, c-format msgid "redo starts at %X/%X" msgstr "REDOを%X/%Xから開始します" -#: access/transam/xlogrecovery.c:1754 +#: 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:1844 +#: access/transam/xlogrecovery.c:1843 #, c-format msgid "requested recovery stop point is before consistent recovery point" msgstr "要求されたリカバリ停止ポイントは、一貫性があるリカバリポイントより前にあります" -#: access/transam/xlogrecovery.c:1876 +#: 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:1882 +#: access/transam/xlogrecovery.c:1881 #, c-format msgid "last completed transaction was at log time %s" msgstr "最後に完了したトランザクションのログ時刻は%sでした" -#: access/transam/xlogrecovery.c:1891 +#: access/transam/xlogrecovery.c:1890 #, c-format msgid "redo is not required" msgstr "REDOは必要ありません" -#: access/transam/xlogrecovery.c:1903 +#: access/transam/xlogrecovery.c:1901 #, c-format msgid "recovery ended before configured recovery target was reached" msgstr "指定したリカバリターゲットに到達する前にリカバリが終了しました" -#: access/transam/xlogrecovery.c:2097 +#: 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:2164 +#: access/transam/xlogrecovery.c:2162 #, c-format msgid "unexpected directory entry \"%s\" found in %s" msgstr "%2$s で想定外のディレクトリエントリ\"%1$s\"が見つかりました" -#: access/transam/xlogrecovery.c:2166 +#: access/transam/xlogrecovery.c:2164 #, c-format -msgid "All directory entries in %s/ should be symbolic links." -msgstr "%s 内のすべてのディレクトリエントリは、シンボリックリンクである必要があります。" +msgid "All directory entries in pg_tblspc/ should be symbolic links." +msgstr "pg_tblspc/ 内のすべてのディレクトリエントリは、シンボリックリンクである必要があります。" -#: access/transam/xlogrecovery.c:2168 +#: 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:2220 +#: 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:2250 +#: 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:2288 +#: access/transam/xlogrecovery.c:2285 #, c-format msgid "WAL redo at %X/%X for %s" msgstr "%X/%Xにある%sのWAL再生" -#: access/transam/xlogrecovery.c:2386 +#: 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:2395 +#: 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:2411 +#: 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:2595 access/transam/xlogrecovery.c:2871 +#: access/transam/xlogrecovery.c:2592 access/transam/xlogrecovery.c:2868 #, c-format msgid "recovery stopping after reaching consistency" msgstr "リカバリ処理は一貫性確保後に停止します" -#: access/transam/xlogrecovery.c:2616 +#: 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:2706 +#: access/transam/xlogrecovery.c:2703 #, c-format msgid "recovery stopping before commit of transaction %u, time %s" msgstr "リカバリ処理はトランザクション%uのコミット、時刻%sの前に停止します" -#: access/transam/xlogrecovery.c:2713 +#: access/transam/xlogrecovery.c:2710 #, c-format msgid "recovery stopping before abort of transaction %u, time %s" msgstr "リカバリ処理はトランザクション%uのアボート、時刻%sの前に停止します" -#: access/transam/xlogrecovery.c:2766 +#: access/transam/xlogrecovery.c:2763 #, c-format msgid "recovery stopping at restore point \"%s\", time %s" msgstr "リカバリ処理は復元ポイント\"%s\"、時刻%s に停止します" -#: access/transam/xlogrecovery.c:2784 +#: 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:2851 +#: access/transam/xlogrecovery.c:2848 #, c-format msgid "recovery stopping after commit of transaction %u, time %s" msgstr "リカバリ処理はトランザクション%uのコミット、時刻%sの後に停止します" -#: access/transam/xlogrecovery.c:2859 +#: access/transam/xlogrecovery.c:2856 #, c-format msgid "recovery stopping after abort of transaction %u, time %s" msgstr "リカバリ処理はトランザクション%uのアボート、時刻%sの後に停止します" -#: access/transam/xlogrecovery.c:2940 +#: access/transam/xlogrecovery.c:2937 #, c-format msgid "pausing at the end of recovery" msgstr "リカバリ完了位置で一時停止しています" -#: access/transam/xlogrecovery.c:2941 +#: access/transam/xlogrecovery.c:2938 #, c-format msgid "Execute pg_wal_replay_resume() to promote." msgstr "再開するには pg_wal_replay_resume() を実行してください" -#: access/transam/xlogrecovery.c:2944 access/transam/xlogrecovery.c:4690 +#: access/transam/xlogrecovery.c:2941 access/transam/xlogrecovery.c:4679 #, c-format msgid "recovery has paused" msgstr "リカバリは一時停止中です" -#: access/transam/xlogrecovery.c:2945 +#: access/transam/xlogrecovery.c:2942 #, c-format msgid "Execute pg_wal_replay_resume() to continue." msgstr "再開するには pg_xlog_replay_resume() を実行してください" -#: access/transam/xlogrecovery.c:3208 +#: 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:3424 +#: 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:3431 +#: 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:4074 +#: access/transam/xlogrecovery.c:4061 #, c-format msgid "invalid checkpoint location" msgstr "不正なチェックポイント位置" -#: access/transam/xlogrecovery.c:4084 +#: access/transam/xlogrecovery.c:4071 #, c-format msgid "invalid checkpoint record" msgstr "チェックポイントレコードが不正です" -#: access/transam/xlogrecovery.c:4090 +#: access/transam/xlogrecovery.c:4077 #, c-format msgid "invalid resource manager ID in checkpoint record" msgstr "チェックポイントレコード内のリソースマネージャIDがで不正です" -#: access/transam/xlogrecovery.c:4098 +#: access/transam/xlogrecovery.c:4085 #, c-format msgid "invalid xl_info in checkpoint record" msgstr "チェックポイントレコード内のxl_infoが不正です" -#: access/transam/xlogrecovery.c:4104 +#: access/transam/xlogrecovery.c:4091 #, c-format msgid "invalid length of checkpoint record" msgstr "チェックポイントレコード長が不正です" -#: access/transam/xlogrecovery.c:4158 +#: 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:4172 +#: 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:4191 +#: access/transam/xlogrecovery.c:4178 #, c-format msgid "new target timeline is %u" msgstr "新しい目標タイムラインは%uです" -#: access/transam/xlogrecovery.c:4392 +#: access/transam/xlogrecovery.c:4381 #, c-format msgid "WAL receiver process shutdown requested" msgstr "wal receiverプロセスのシャットダウンが要求されました" -#: access/transam/xlogrecovery.c:4452 +#: access/transam/xlogrecovery.c:4441 #, c-format msgid "received promote request" msgstr "昇格要求を受信しました" -#: access/transam/xlogrecovery.c:4681 +#: access/transam/xlogrecovery.c:4670 #, c-format msgid "hot standby is not possible because of insufficient parameter settings" msgstr "不十分なパラメータ設定のため、ホットスタンバイを使用できません" -#: access/transam/xlogrecovery.c:4682 access/transam/xlogrecovery.c:4709 access/transam/xlogrecovery.c:4739 +#: 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:4691 +#: access/transam/xlogrecovery.c:4680 #, c-format msgid "If recovery is unpaused, the server will shut down." msgstr "リカバリの一時停止を解除すると、サーバーはシャットダウンします。" -#: access/transam/xlogrecovery.c:4692 +#: 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:4703 +#: access/transam/xlogrecovery.c:4692 #, c-format msgid "promotion is not possible because of insufficient parameter settings" msgstr "不十分なパラメータ設定のため、昇格できません" -#: access/transam/xlogrecovery.c:4713 +#: access/transam/xlogrecovery.c:4702 #, c-format msgid "Restart the server after making the necessary configuration changes." msgstr "必要な設定変更を行ったのち、サーバーを再起動してください。" -#: access/transam/xlogrecovery.c:4737 +#: access/transam/xlogrecovery.c:4726 #, c-format msgid "recovery aborted because of insufficient parameter settings" msgstr "不十分なパラメータ設定値のためリカバリが停止しました" -#: access/transam/xlogrecovery.c:4743 +#: access/transam/xlogrecovery.c:4732 #, c-format msgid "You can restart the server after making the necessary configuration changes." msgstr "必要な設定変更を行うことでサーバーを再起動できます。" -#: access/transam/xlogrecovery.c:4785 +#: access/transam/xlogrecovery.c:4774 #, c-format msgid "multiple recovery targets specified" msgstr "複数のリカバリ目標が指定されています" -#: access/transam/xlogrecovery.c:4786 +#: 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つまで設定可能です。" -#: access/transam/xlogrecovery.c:4797 +#: access/transam/xlogrecovery.c:4786 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "\"immediate\"のみが指定可能です。" -#: access/transam/xlogrecovery.c:4949 +#: 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\"。" +msgid "timestamp out of range: \"%s\"" +msgstr "timestampが範囲外です: \"%s\"" -#: access/transam/xlogrecovery.c:4994 +#: access/transam/xlogrecovery.c:4983 #, c-format msgid "\"recovery_target_timeline\" is not a valid number." msgstr "\"recovery_target_timeline\"が数値として妥当ではありません。" @@ -3405,7 +3460,7 @@ msgstr "失敗したアーカイブコマンドは次のとおりです: %s" msgid "archive command was terminated by exception 0x%X" msgstr "アーカイブコマンドが例外0x%Xで終了しました" -#: archive/shell_archive.c:109 postmaster/postmaster.c:2819 +#: 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\"を参照してください。" @@ -3420,159 +3475,159 @@ msgstr "アーカイブコマンドはシグナル%dにより終了しました: msgid "archive command exited with unrecognized status %d" msgstr "アーカイブコマンドは不明のステータス%dで終了しました" -#: backup/backup_manifest.c:255 +#: backup/backup_manifest.c:254 #, c-format msgid "expected end timeline %u but found timeline %u" msgstr "最終タイムライン%uを期待していましたがタイムライン%uが見つかりました" -#: backup/backup_manifest.c:279 +#: backup/backup_manifest.c:278 #, c-format msgid "expected start timeline %u but found timeline %u" msgstr "開始タイムライン%uを期待していましたがタイムライン%uが見つかりました" -#: backup/backup_manifest.c:306 +#: 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:357 +#: backup/backup_manifest.c:356 #, c-format msgid "could not rewind temporary file" msgstr "一時ファイルを巻き戻しに失敗しました" -#: backup/basebackup.c:481 +#: backup/basebackup.c:479 #, c-format msgid "could not find any WAL files" msgstr "WALファイルが全くありません" -#: backup/basebackup.c:496 backup/basebackup.c:511 backup/basebackup.c:520 +#: 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:562 backup/basebackup.c:587 +#: backup/basebackup.c:560 backup/basebackup.c:585 #, c-format msgid "unexpected WAL file size \"%s\"" msgstr "想定しないWALファイルのサイズ\"%s\"" -#: backup/basebackup.c:658 +#: 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:665 +#: backup/basebackup.c:663 #, c-format msgid "checksum verification failure during base backup" msgstr "ベースバックアップ中にチェックサム確認が失敗しました" -#: backup/basebackup.c:735 backup/basebackup.c:744 backup/basebackup.c:755 backup/basebackup.c:772 backup/basebackup.c:781 backup/basebackup.c:790 backup/basebackup.c:805 backup/basebackup.c:822 backup/basebackup.c:831 backup/basebackup.c:843 backup/basebackup.c:867 backup/basebackup.c:881 backup/basebackup.c:892 backup/basebackup.c:903 backup/basebackup.c:916 +#: 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:763 +#: backup/basebackup.c:761 #, c-format msgid "unrecognized checkpoint type: \"%s\"" msgstr "認識されないチェックポイントタイプ: \"%s\"" -#: backup/basebackup.c:795 +#: backup/basebackup.c:793 #, c-format msgid "incremental backups cannot be taken unless WAL summarization is enabled" msgstr "WAL集約が有効でなければ差分バックアップは取得できません" -#: backup/basebackup.c:811 +#: 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:856 +#: backup/basebackup.c:854 #, c-format msgid "unrecognized manifest option: \"%s\"" msgstr "認識できない目録オプション: \"%s\"" -#: backup/basebackup.c:907 +#: backup/basebackup.c:905 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "認識できない圧縮アルゴリズム: \"%s\"" -#: backup/basebackup.c:923 +#: backup/basebackup.c:921 #, c-format msgid "unrecognized base backup option: \"%s\"" msgstr "認識できないベースバックアップオプション: \"%s\"" -#: backup/basebackup.c:934 +#: backup/basebackup.c:932 #, c-format msgid "manifest checksums require a backup manifest" msgstr "目録のチェックサムにはバックアップ目録が必要です" -#: backup/basebackup.c:943 +#: backup/basebackup.c:941 #, c-format msgid "target detail cannot be used without target" msgstr "ターゲット詳細はターゲットの指定なしでは指定できません" -#: backup/basebackup.c:952 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:963 +#: backup/basebackup.c:961 #, c-format msgid "compression detail cannot be specified unless compression is enabled" msgstr "圧縮詳細は圧縮が有効でない場合は指定できません" -#: backup/basebackup.c:976 +#: backup/basebackup.c:974 #, c-format msgid "invalid compression specification: %s" msgstr "不正な圧縮指定: %s" -#: backup/basebackup.c:1026 +#: backup/basebackup.c:1024 #, c-format msgid "must UPLOAD_MANIFEST before performing an incremental BASE_BACKUP" msgstr "差分のBASE_BACKUPの実行前にUPLOAD_MANIFESTを実行する必要があります" -#: backup/basebackup.c:1159 backup/basebackup.c:1360 +#: 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:1546 +#: backup/basebackup.c:1544 #, c-format msgid "skipping special file \"%s\"" msgstr "スペシャルファイル\"%s\"をスキップしています" -#: backup/basebackup.c:1753 +#: 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:1815 +#: 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:1919 +#: 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:1926 +#: backup/basebackup.c:1924 #, c-format msgid "further checksum verification failures in file \"%s\" will not be reported" msgstr "ファイル\"%s\"における以降のチェックサムエラーは報告されません" -#: backup/basebackup.c:2051 +#: backup/basebackup.c:2048 #, c-format msgid "file name too long for tar format: \"%s\"" msgstr "ファイル名がtarフォーマットに対して長すぎます: \"%s\"" -#: backup/basebackup.c:2057 +#: 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:2131 +#: backup/basebackup.c:2127 #, c-format msgid "could not read file \"%s\": read %zd of %zu" msgstr "ファイル\"%1$s\"を読み込めませんでした: %3$zuバイトのうち%2$zdバイトを読み込みました" @@ -3587,62 +3642,62 @@ msgstr "このビルドではgzip圧縮はサポートされていません" msgid "could not initialize compression library" msgstr "圧縮ライブラリを初期化できませんでした" -#: backup/basebackup_incremental.c:292 +#: backup/basebackup_incremental.c:294 #, c-format msgid "manifest contains no required WAL ranges" msgstr "必要となるWAL範囲がマニフェストに含まれてません" -#: backup/basebackup_incremental.c:347 +#: 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:412 +#: 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:422 +#: 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:433 +#: 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:437 +#: 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:444 +#: 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:525 +#: 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:532 +#: 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:536 +#: 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:936 +#: backup/basebackup_incremental.c:938 #, c-format msgid "backup manifest version 1 does not support incremental backup" msgstr "バックアップ目録のバージョン1は差分バックアップをサポートしていません" -#: backup/basebackup_incremental.c:954 +#: backup/basebackup_incremental.c:956 #, c-format msgid "system identifier in backup manifest is %llu, but database system identifier is %llu" msgstr "バックアップ目録中のシステム識別子が%lluですが、データベースのシステム識別子は%lluです" @@ -3667,7 +3722,7 @@ msgstr "\"%s\"ロールの権限を持つロールのみが、サーバー上に 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:2018 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" @@ -3677,12 +3732,12 @@ msgstr "ディレクトリ\"%s\"を作成できませんでした: %m" msgid "directory \"%s\" exists but is not empty" msgstr "ディレクトリ\"%s\"は存在しますが、空ではありません" -#: backup/basebackup_server.c:123 utils/init/postinit.c:1129 +#: 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:494 storage/smgr/md.c:501 storage/smgr/md.c:583 storage/smgr/md.c:605 storage/smgr/md.c:1012 +#: 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 "ディスクの空き容量をチェックしてください。" @@ -3722,27 +3777,22 @@ msgstr "長距離モードを有効化できませんでした: %s" msgid "invalid timeline %lld" msgstr "不正なタイムライン%lld" -#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:616 tcop/postgres.c:3820 -#, c-format -msgid "--%s must be first argument" -msgstr "--%sは最初の引数でなければなりません" - -#: bootstrap/bootstrap.c:253 postmaster/postmaster.c:630 tcop/postgres.c:3834 +#: bootstrap/bootstrap.c:239 postmaster/postmaster.c:623 tcop/postgres.c:3946 #, c-format msgid "--%s requires a value" msgstr "--%sには値が必要です" -#: bootstrap/bootstrap.c:258 postmaster/postmaster.c:635 tcop/postgres.c:3839 +#: 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:753 postmaster/postmaster.c:766 +#: 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" @@ -3797,12 +3847,12 @@ msgstr "\"%s\"に対して一部の権限が剥奪できませんでした" msgid "grantor must be current user" msgstr "権限付与者は現在のユーザーでなければなりません" -#: catalog/aclchk.c:480 catalog/aclchk.c:982 +#: catalog/aclchk.c:480 catalog/aclchk.c:1055 #, c-format msgid "invalid privilege type %s for relation" msgstr "リレーションに対する不正な権限のタイプ %s" -#: catalog/aclchk.c:484 catalog/aclchk.c:986 +#: catalog/aclchk.c:484 catalog/aclchk.c:1059 #, c-format msgid "invalid privilege type %s for sequence" msgstr "シーケンスに対する不正な権限のタイプ %s" @@ -3817,7 +3867,7 @@ msgstr "データベースに対する不正な権限タイプ %s" msgid "invalid privilege type %s for domain" msgstr "ドメインに対する不正な権限タイプ %s" -#: catalog/aclchk.c:496 catalog/aclchk.c:990 +#: catalog/aclchk.c:496 catalog/aclchk.c:1063 #, c-format msgid "invalid privilege type %s for function" msgstr "関数に対する不正な権限タイプ %s" @@ -3832,17 +3882,17 @@ msgstr "言語に対する不正な権限タイプ %s" msgid "invalid privilege type %s for large object" msgstr "ラージオブジェクトに対する不正な権限タイプ %s" -#: catalog/aclchk.c:508 catalog/aclchk.c:1006 +#: catalog/aclchk.c:508 catalog/aclchk.c:1079 #, c-format msgid "invalid privilege type %s for schema" msgstr "スキーマに対する不正な権限タイプ %s" -#: catalog/aclchk.c:512 catalog/aclchk.c:994 +#: catalog/aclchk.c:512 catalog/aclchk.c:1067 #, c-format msgid "invalid privilege type %s for procedure" msgstr "プロシージャに対する不正な権限タイプ %s" -#: catalog/aclchk.c:516 catalog/aclchk.c:998 +#: catalog/aclchk.c:516 catalog/aclchk.c:1071 #, c-format msgid "invalid privilege type %s for routine" msgstr "ルーチンに対する不正な権限のタイプ %s" @@ -3852,7 +3902,7 @@ msgstr "ルーチンに対する不正な権限のタイプ %s" msgid "invalid privilege type %s for tablespace" msgstr "テーブル空間に対する不正な権限タイプ %s" -#: catalog/aclchk.c:524 catalog/aclchk.c:1002 +#: catalog/aclchk.c:524 catalog/aclchk.c:1075 #, c-format msgid "invalid privilege type %s for type" msgstr "型に対する不正な権限タイプ %s" @@ -3877,501 +3927,511 @@ msgstr "パラメータに対する不正な権限タイプ %s" msgid "column privileges are only valid for relations" msgstr "列権限はリレーションに対してのみ有効です" -#: catalog/aclchk.c:1039 +#: 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:1112 #, c-format msgid "default privileges cannot be set for columns" msgstr "デフォルト権限は列には設定できません" -#: catalog/aclchk.c:1075 +#: catalog/aclchk.c:1148 #, c-format msgid "permission denied to change default privileges" msgstr "デフォルト権限を変更する権限がありません" -#: catalog/aclchk.c:1193 +#: 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:1544 catalog/catalog.c:657 catalog/heap.c:2549 catalog/heap.c:2863 catalog/objectaddress.c:1528 catalog/pg_publication.c:568 commands/analyze.c:388 commands/copy.c:1000 commands/sequence.c:1655 commands/tablecmds.c:7613 commands/tablecmds.c:7778 commands/tablecmds.c:7970 commands/tablecmds.c:8100 commands/tablecmds.c:8229 commands/tablecmds.c:8323 commands/tablecmds.c:8424 commands/tablecmds.c:8551 commands/tablecmds.c:8581 -#: commands/tablecmds.c:8723 commands/tablecmds.c:8816 commands/tablecmds.c:8950 commands/tablecmds.c:9063 commands/tablecmds.c:13410 commands/tablecmds.c:13605 commands/tablecmds.c:13766 commands/tablecmds.c:14971 commands/tablecmds.c:17726 commands/trigger.c:944 parser/analyze.c:2621 parser/parse_relation.c:745 parser/parse_target.c:1070 parser/parse_type.c:144 parser/parse_utilcmd.c:3638 parser/parse_utilcmd.c:3678 parser/parse_utilcmd.c:3720 -#: statistics/attribute_stats.c:180 statistics/attribute_stats.c:902 utils/adt/acl.c:2921 utils/adt/ruleutils.c:2855 +#: 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 "リレーション\"%2$s\"の列\"%1$s\"は存在しません" -#: catalog/aclchk.c:1789 +#: catalog/aclchk.c:1862 #, c-format msgid "\"%s\" is an index" msgstr "\"%s\"はインデックスです" -#: catalog/aclchk.c:1796 commands/tablecmds.c:15128 commands/tablecmds.c:18645 +#: 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:1804 catalog/objectaddress.c:1368 commands/tablecmds.c:266 commands/tablecmds.c:18609 utils/adt/acl.c:2105 utils/adt/acl.c:2135 utils/adt/acl.c:2168 utils/adt/acl.c:2204 utils/adt/acl.c:2235 utils/adt/acl.c:2266 +#: 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:1842 +#: catalog/aclchk.c:1915 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "シーケンス \"%s\"では USAGE, SELECT, UPDATE 権限のみをサポートします" -#: catalog/aclchk.c:1859 +#: catalog/aclchk.c:1932 #, c-format msgid "invalid privilege type %s for table" msgstr "テーブルに対する権限タイプ%sは不正です" -#: catalog/aclchk.c:2024 +#: catalog/aclchk.c:2097 #, c-format msgid "invalid privilege type %s for column" msgstr "列では権限タイプ %s は無効です" -#: catalog/aclchk.c:2037 +#: catalog/aclchk.c:2110 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "シーケンス \"%s\"では USAGE, SELECT, UPDATE のみをサポートします" -#: catalog/aclchk.c:2228 +#: catalog/aclchk.c:2301 #, c-format msgid "language \"%s\" is not trusted" msgstr "言語\"%s\"は信頼されていません" -#: catalog/aclchk.c:2230 +#: 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:2381 +#: catalog/aclchk.c:2454 #, c-format msgid "cannot set privileges of array types" msgstr "配列型の権限を設定できません" -#: catalog/aclchk.c:2382 +#: catalog/aclchk.c:2455 #, c-format msgid "Set the privileges of the element type instead." msgstr "代わりに要素型の権限を設定してください。" -#: catalog/aclchk.c:2386 +#: catalog/aclchk.c:2459 #, c-format msgid "cannot set privileges of multirange types" msgstr "複範囲型の権限を設定できません" -#: catalog/aclchk.c:2387 +#: catalog/aclchk.c:2460 #, c-format msgid "Set the privileges of the range type instead." msgstr "代わりに範囲型の権限を設定してください。" -#: catalog/aclchk.c:2570 +#: catalog/aclchk.c:2467 catalog/objectaddress.c:1629 +#, c-format +msgid "\"%s\" is not a domain" +msgstr "\"%s\"はドメインではありません" + +#: catalog/aclchk.c:2653 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "認識できない権限タイプ\"%s\"" -#: catalog/aclchk.c:2637 +#: catalog/aclchk.c:2720 #, c-format msgid "permission denied for aggregate %s" msgstr "集約 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2640 +#: catalog/aclchk.c:2723 #, c-format msgid "permission denied for collation %s" msgstr "照合順序 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2643 +#: catalog/aclchk.c:2726 #, c-format msgid "permission denied for column %s" msgstr "列 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2646 +#: catalog/aclchk.c:2729 #, c-format msgid "permission denied for conversion %s" msgstr "変換 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2649 +#: catalog/aclchk.c:2732 #, c-format msgid "permission denied for database %s" msgstr "データベース %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2652 +#: catalog/aclchk.c:2735 #, c-format msgid "permission denied for domain %s" msgstr "ドメイン %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2655 +#: catalog/aclchk.c:2738 #, c-format msgid "permission denied for event trigger %s" msgstr "イベントトリガ %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2658 +#: catalog/aclchk.c:2741 #, c-format msgid "permission denied for extension %s" msgstr "機能拡張 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2661 +#: catalog/aclchk.c:2744 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "外部データラッパ %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2664 +#: catalog/aclchk.c:2747 #, c-format msgid "permission denied for foreign server %s" msgstr "外部サーバー %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2667 +#: catalog/aclchk.c:2750 #, c-format msgid "permission denied for foreign table %s" msgstr "外部テーブル %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2670 +#: catalog/aclchk.c:2753 #, c-format msgid "permission denied for function %s" msgstr "関数 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2673 +#: catalog/aclchk.c:2756 #, c-format msgid "permission denied for index %s" msgstr "インデックス %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2676 +#: catalog/aclchk.c:2759 #, c-format msgid "permission denied for language %s" msgstr "言語 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2679 +#: catalog/aclchk.c:2762 #, c-format msgid "permission denied for large object %s" msgstr "ラージオブジェクト %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2682 +#: catalog/aclchk.c:2765 #, c-format msgid "permission denied for materialized view %s" msgstr "実体化ビュー %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2685 +#: catalog/aclchk.c:2768 #, c-format msgid "permission denied for operator class %s" msgstr "演算子クラス %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2688 +#: catalog/aclchk.c:2771 #, c-format msgid "permission denied for operator %s" msgstr "演算子 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2691 +#: catalog/aclchk.c:2774 #, c-format msgid "permission denied for operator family %s" msgstr "演算子族 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2694 +#: catalog/aclchk.c:2777 #, c-format msgid "permission denied for parameter %s" msgstr "パラメータ %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2697 +#: catalog/aclchk.c:2780 #, c-format msgid "permission denied for policy %s" msgstr "ポリシ %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2700 +#: catalog/aclchk.c:2783 #, c-format msgid "permission denied for procedure %s" msgstr "プロシージャ %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2703 +#: catalog/aclchk.c:2786 #, c-format msgid "permission denied for publication %s" msgstr "パブリケーション%sへのアクセスが拒否されました" -#: catalog/aclchk.c:2706 +#: catalog/aclchk.c:2789 #, c-format msgid "permission denied for routine %s" msgstr "ルーチン %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2709 +#: catalog/aclchk.c:2792 #, c-format msgid "permission denied for schema %s" msgstr "スキーマ %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2712 commands/sequence.c:654 commands/sequence.c:880 commands/sequence.c:922 commands/sequence.c:963 commands/sequence.c:1753 +#: 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:2715 +#: catalog/aclchk.c:2798 #, c-format msgid "permission denied for statistics object %s" msgstr "統計情報オブジェクト %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2718 +#: catalog/aclchk.c:2801 #, c-format msgid "permission denied for subscription %s" msgstr "サブスクリプション %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2721 +#: catalog/aclchk.c:2804 #, c-format msgid "permission denied for table %s" msgstr "テーブル %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2724 +#: catalog/aclchk.c:2807 #, c-format msgid "permission denied for tablespace %s" msgstr "テーブル空間 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2727 +#: catalog/aclchk.c:2810 #, c-format msgid "permission denied for text search configuration %s" msgstr "テキスト検索設定 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2730 +#: catalog/aclchk.c:2813 #, c-format msgid "permission denied for text search dictionary %s" msgstr "テキスト検索辞書 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2733 +#: catalog/aclchk.c:2816 #, c-format msgid "permission denied for type %s" msgstr "型 %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2736 +#: catalog/aclchk.c:2819 #, c-format msgid "permission denied for view %s" msgstr "ビュー %s へのアクセスが拒否されました" -#: catalog/aclchk.c:2772 +#: catalog/aclchk.c:2855 #, c-format msgid "must be owner of aggregate %s" msgstr "集約 %s の所有者である必要があります" -#: catalog/aclchk.c:2775 +#: catalog/aclchk.c:2858 #, c-format msgid "must be owner of collation %s" msgstr "照合順序 %s の所有者である必要があります" -#: catalog/aclchk.c:2778 +#: catalog/aclchk.c:2861 #, c-format msgid "must be owner of conversion %s" msgstr "変換 %s の所有者である必要があります" -#: catalog/aclchk.c:2781 +#: catalog/aclchk.c:2864 #, c-format msgid "must be owner of database %s" msgstr "データベース %s の所有者である必要があります" -#: catalog/aclchk.c:2784 +#: catalog/aclchk.c:2867 #, c-format msgid "must be owner of domain %s" msgstr "ドメイン %s の所有者である必要があります" -#: catalog/aclchk.c:2787 +#: catalog/aclchk.c:2870 #, c-format msgid "must be owner of event trigger %s" msgstr "イベントトリガ %s の所有者である必要があります" -#: catalog/aclchk.c:2790 +#: catalog/aclchk.c:2873 #, c-format msgid "must be owner of extension %s" msgstr "機能拡張 %s の所有者である必要があります" -#: catalog/aclchk.c:2793 +#: catalog/aclchk.c:2876 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "外部データラッパー %s の所有者である必要があります" -#: catalog/aclchk.c:2796 +#: catalog/aclchk.c:2879 #, c-format msgid "must be owner of foreign server %s" msgstr "外部サーバー %s の所有者である必要があります" -#: catalog/aclchk.c:2799 +#: catalog/aclchk.c:2882 #, c-format msgid "must be owner of foreign table %s" msgstr "外部テーブル %s の所有者である必要があります" -#: catalog/aclchk.c:2802 +#: catalog/aclchk.c:2885 #, c-format msgid "must be owner of function %s" msgstr "関数 %s の所有者である必要があります" -#: catalog/aclchk.c:2805 +#: catalog/aclchk.c:2888 #, c-format msgid "must be owner of index %s" msgstr "インデックス %s の所有者である必要があります" -#: catalog/aclchk.c:2808 +#: catalog/aclchk.c:2891 #, c-format msgid "must be owner of language %s" msgstr "言語 %s の所有者である必要があります" -#: catalog/aclchk.c:2811 +#: catalog/aclchk.c:2894 #, c-format msgid "must be owner of large object %s" msgstr "ラージオブジェクト %s の所有者である必要があります" -#: catalog/aclchk.c:2814 +#: catalog/aclchk.c:2897 #, c-format msgid "must be owner of materialized view %s" msgstr "実体化ビュー %s の所有者である必要があります" -#: catalog/aclchk.c:2817 +#: catalog/aclchk.c:2900 #, c-format msgid "must be owner of operator class %s" msgstr "演算子クラス %s の所有者である必要があります" -#: catalog/aclchk.c:2820 +#: catalog/aclchk.c:2903 #, c-format msgid "must be owner of operator %s" msgstr "演算子 %s の所有者である必要があります" -#: catalog/aclchk.c:2823 +#: catalog/aclchk.c:2906 #, c-format msgid "must be owner of operator family %s" msgstr "演算子族 %s の所有者である必要があります" -#: catalog/aclchk.c:2826 +#: catalog/aclchk.c:2909 #, c-format msgid "must be owner of procedure %s" msgstr "プロシージャ %s の所有者である必要があります" -#: catalog/aclchk.c:2829 +#: catalog/aclchk.c:2912 #, c-format msgid "must be owner of publication %s" msgstr "パブリケーション %s の所有者である必要があります" -#: catalog/aclchk.c:2832 +#: catalog/aclchk.c:2915 #, c-format msgid "must be owner of routine %s" msgstr "ルーチン %s の所有者である必要があります" -#: catalog/aclchk.c:2835 +#: catalog/aclchk.c:2918 #, c-format msgid "must be owner of sequence %s" msgstr "シーケンス %s の所有者である必要があります" -#: catalog/aclchk.c:2838 +#: catalog/aclchk.c:2921 #, c-format msgid "must be owner of subscription %s" msgstr "サブスクリプション %s の所有者である必要があります" -#: catalog/aclchk.c:2841 +#: catalog/aclchk.c:2924 #, c-format msgid "must be owner of table %s" msgstr "テーブル %s の所有者である必要があります" -#: catalog/aclchk.c:2844 +#: catalog/aclchk.c:2927 #, c-format msgid "must be owner of type %s" msgstr "型 %s の所有者である必要があります" -#: catalog/aclchk.c:2847 +#: catalog/aclchk.c:2930 #, c-format msgid "must be owner of view %s" msgstr "ビュー %s の所有者である必要があります" -#: catalog/aclchk.c:2850 +#: catalog/aclchk.c:2933 #, c-format msgid "must be owner of schema %s" msgstr "スキーマ %s の所有者である必要があります" -#: catalog/aclchk.c:2853 +#: catalog/aclchk.c:2936 #, c-format msgid "must be owner of statistics object %s" msgstr "統計情報オブジェクト %s の所有者である必要があります" -#: catalog/aclchk.c:2856 +#: catalog/aclchk.c:2939 #, c-format msgid "must be owner of tablespace %s" msgstr "テーブル空間 %s の所有者である必要があります" -#: catalog/aclchk.c:2859 +#: catalog/aclchk.c:2942 #, c-format msgid "must be owner of text search configuration %s" msgstr "テキスト検索設定 %s の所有者である必要があります" -#: catalog/aclchk.c:2862 +#: catalog/aclchk.c:2945 #, c-format msgid "must be owner of text search dictionary %s" msgstr "テキスト検索辞書 %s の所有者である必要があります" -#: catalog/aclchk.c:2876 +#: catalog/aclchk.c:2959 #, c-format msgid "must be owner of relation %s" msgstr "リレーション %s の所有者である必要があります" -#: catalog/aclchk.c:2922 +#: catalog/aclchk.c:3005 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"の列\"%1$s\"へのアクセスが拒否されました" -#: catalog/aclchk.c:3156 catalog/aclchk.c:3175 +#: 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: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:3213 catalog/aclchk.c:3276 catalog/aclchk.c:3915 +#: 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:3461 +#: catalog/aclchk.c:3550 #, c-format msgid "parameter ACL with OID %u does not exist" msgstr "OID %uのパラメータACLは存在しません" -#: catalog/aclchk.c:3540 catalog/objectaddress.c:1055 catalog/pg_largeobject.c:111 libpq/be-fsstubs.c:323 storage/large_object/inv_api.c:247 -#, c-format -msgid "large object %u does not exist" -msgstr "ラージオブジェクト%uは存在しません" - -#: catalog/aclchk.c:3634 commands/collationcmds.c:849 commands/publicationcmds.c:1786 +#: 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:3708 catalog/aclchk.c:3735 catalog/aclchk.c:3764 utils/cache/typcache.c:473 utils/cache/typcache.c:527 +#: 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:475 +#: catalog/catalog.c:477 #, c-format msgid "still searching for an unused OID in relation \"%s\"" msgstr "リレーション\"%s\"での未使用のOIDを探索を継続中" -#: catalog/catalog.c:477 +#: 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:502 +#: 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:635 catalog/catalog.c:702 +#: catalog/catalog.c:637 catalog/catalog.c:704 #, c-format msgid "must be superuser to call %s()" msgstr "%s()を呼び出すにはスーパーユーザーである必要があります" -#: catalog/catalog.c:644 +#: catalog/catalog.c:646 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() はシステムカタログでのみ使用できます" -#: catalog/catalog.c:649 parser/parse_utilcmd.c:2424 +#: 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:666 +#: catalog/catalog.c:668 #, c-format msgid "column \"%s\" is not of type oid" msgstr "列\"%s\"はoid型ではありません" -#: catalog/catalog.c:673 +#: catalog/catalog.c:675 #, c-format msgid "index \"%s\" is not the index for column \"%s\"" msgstr "インデックス\"%s\"は列\"%s\"に対するインデックスではありません" @@ -4418,8 +4478,8 @@ msgstr[0] "" 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:1492 commands/tablecmds.c:15720 commands/tablespace.c:460 commands/user.c:1302 commands/vacuum.c:211 commands/view.c:441 executor/execExprInterp.c:5126 executor/execExprInterp.c:5134 libpq/auth.c:308 replication/logical/applyparallelworker.c:1041 replication/syncrep.c:1012 storage/lmgr/deadlock.c:1134 storage/lmgr/proc.c:1474 utils/misc/guc.c:3166 -#: utils/misc/guc.c:3207 utils/misc/guc.c:3282 utils/misc/guc.c:6822 utils/misc/guc.c:6856 utils/misc/guc.c:6890 utils/misc/guc.c:6933 utils/misc/guc.c:6975 +#: 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" @@ -4445,234 +4505,199 @@ msgstr[0] "削除は他の%d個のオブジェクトに対しても行われま msgid "constant of the type %s cannot be used here" msgstr "%s型の定数をここで使用することはできません" -#: catalog/dependency.c:2205 -#, c-format -msgid "transition table \"%s\" cannot be referenced in a persistent object" -msgstr "遷移テーブル\"%s\"は永続オブジェクトからは参照できません" - -#: catalog/dependency.c:2390 parser/parse_relation.c:3509 parser/parse_relation.c:3519 +#: 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:320 +#: catalog/heap.c:326 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "\"%s.%s\"を作成する権限がありません" -#: catalog/heap.c:322 +#: catalog/heap.c:328 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "システムカタログの更新は現在禁止されています" -#: catalog/heap.c:462 commands/tablecmds.c:2535 commands/tablecmds.c:2987 commands/tablecmds.c:7256 +#: 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:480 commands/tablecmds.c:7525 +#: 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:496 +#: 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:574 +#: catalog/heap.c:580 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "パーティションキー列%sは疑似型%sです" -#: catalog/heap.c:579 +#: catalog/heap.c:585 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "列\"%s\"は疑似型%sです" -#: catalog/heap.c:610 +#: 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:665 +#: 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:671 commands/createas.c:198 commands/createas.c:510 +#: 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:1155 catalog/index.c:900 commands/createas.c:406 commands/tablecmds.c:4251 +#: 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:1171 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:1205 commands/typecmds.c:1431 commands/typecmds.c:1611 commands/typecmds.c:2582 +#: 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:1172 +#: 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:1212 +#: catalog/heap.c:1219 #, c-format msgid "toast relfilenumber value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にTOASTのrelfilenumberの値が設定されていません" -#: catalog/heap.c:1223 +#: 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:1233 +#: catalog/heap.c:1240 #, c-format msgid "relfilenumber value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にrelfilenumberの値が設定されていません" -#: catalog/heap.c:2124 +#: catalog/heap.c:2185 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "パーティション親テーブル\"%s\"に NO INHERIT 制約は追加できません" -#: catalog/heap.c:2453 +#: catalog/heap.c:2452 #, c-format msgid "check constraint \"%s\" already exists" msgstr "検査制約\"%s\"はすでに存在します" -#: catalog/heap.c:2554 catalog/heap.c:2869 -#, c-format -msgid "cannot add not-null constraint on system column \"%s\"" -msgstr "システム列\"%s\"に対して非NULL制約を追加することはできません" - -#: catalog/heap.c:2576 catalog/heap.c:2702 catalog/heap.c:2953 catalog/index.c:914 catalog/pg_constraint.c:984 commands/tablecmds.c:9504 +#: 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:2709 +#: catalog/heap.c:2631 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "制約\"%s\"は、リレーション\"%s\"上の継承されていない制約と競合します" -#: catalog/heap.c:2720 +#: catalog/heap.c:2642 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "制約\"%s\"は、リレーション\"%s\"上の継承された制約と競合します" -#: catalog/heap.c:2730 +#: 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:2742 -#, c-format -msgid "constraint \"%s\" conflicts with NOT ENFORCED constraint on relation \"%s\"" -msgstr "制約\"%s\"は、リレーション\"%s\"上の \\NOT ENFORCED制約と競合します" - -#: catalog/heap.c:2747 +#: catalog/heap.c:2657 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "継承された定義により制約\"%s\"をマージしています" -#: catalog/heap.c:2771 catalog/pg_constraint.c:762 catalog/pg_constraint.c:1113 commands/tablecmds.c:3143 commands/tablecmds.c:3454 commands/tablecmds.c:7181 commands/tablecmds.c:7816 commands/tablecmds.c:16553 commands/tablecmds.c:16735 +#: 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:2888 parser/parse_utilcmd.c:2633 -#, c-format -msgid "conflicting NO INHERIT declaration for not-null constraint on column \"%s\"" -msgstr "列\"%s\"に対する非NULL制約にNO INHERIT宣言が競合しています" - -#: catalog/heap.c:2902 -#, c-format -msgid "conflicting not-null constraint names \"%s\" and \"%s\"" -msgstr "非NULL制約の名前\"%s\"と\"%s\"が競合しています" - -#: catalog/heap.c:2932 -#, c-format -msgid "cannot define not-null constraint on column \"%s\" with NO INHERIT" -msgstr "NO INHERIT指定されている列\"%s\"に対して非NULL制約を定義することはできません" - -#: catalog/heap.c:2934 -#, c-format -msgid "The column has an inherited not-null constraint." -msgstr "この列には継承された非NULL制約が存在します。" - -#: catalog/heap.c:3124 +#: catalog/heap.c:2767 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "生成カラム\"%s\"はカラム生成式中では使用できません" -#: catalog/heap.c:3126 +#: catalog/heap.c:2769 #, c-format msgid "A generated column cannot reference another generated column." msgstr "生成カラムは他の生成カラムを参照できません。" -#: catalog/heap.c:3132 +#: catalog/heap.c:2775 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "列生成式内では行全体参照は使用できません" -#: catalog/heap.c:3133 +#: catalog/heap.c:2776 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "これは生成列を自身の値に依存させることにつながります。" -#: catalog/heap.c:3188 +#: catalog/heap.c:2831 #, c-format msgid "generation expression is not immutable" msgstr "生成式は不変ではありません" -#: catalog/heap.c:3216 rewrite/rewriteHandler.c:1282 +#: 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:3221 commands/prepare.c:331 parser/analyze.c:2952 parser/parse_target.c:595 parser/parse_target.c:885 parser/parse_target.c:895 rewrite/rewriteHandler.c:1287 +#: 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:3268 +#: catalog/heap.c:2911 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "検査制約ではテーブル\"%s\"のみを参照することができます" -#: catalog/heap.c:3574 +#: catalog/heap.c:3217 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "ON COMMITと外部キーの組み合わせはサポートされていません" -#: catalog/heap.c:3575 +#: 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:3580 +#: catalog/heap.c:3223 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "外部キー制約で参照されているテーブルを削除できません" -#: catalog/heap.c:3581 +#: catalog/heap.c:3224 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "テーブル\"%s\"は\"%s\"を参照します。" -#: catalog/heap.c:3583 +#: 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:219 parser/parse_utilcmd.c:2329 +#: catalog/index.c:219 parser/parse_utilcmd.c:2176 #, c-format msgid "multiple primary keys for table \"%s\" are not allowed" msgstr "テーブル\"%s\"に複数のプライマリキーを持たせることはできません" @@ -4692,77 +4717,77 @@ msgstr "プライマリキーを式にすることはできません" msgid "primary key column \"%s\" is not marked NOT NULL" msgstr "主キー列\"%s\"がNOT NULL指定されていません" -#: catalog/index.c:799 catalog/index.c:1920 +#: 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:839 +#: catalog/index.c:838 #, c-format msgid "nondeterministic collations are not supported for operator class \"%s\"" msgstr "非決定的照合順序は演算子クラス \"%s\" ではサポートされません" -#: catalog/index.c:854 +#: catalog/index.c:853 #, c-format msgid "concurrent index creation on system catalog tables is not supported" msgstr "システムカタログテーブルの並行的インデックス作成はサポートされていません" -#: catalog/index.c:863 catalog/index.c:1332 +#: catalog/index.c:862 catalog/index.c:1331 #, c-format msgid "concurrent index creation for exclusion constraints is not supported" msgstr "排他制約のためのインデックスの並列的作成はサポートされていません" -#: catalog/index.c:872 +#: catalog/index.c:871 #, c-format msgid "shared indexes cannot be created after initdb" msgstr "initdbの後に共有インデックスを作成できません" -#: catalog/index.c:892 commands/createas.c:421 commands/sequence.c:159 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\"はすでに存在します、スキップします" -#: catalog/index.c:942 +#: 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:952 utils/cache/relcache.c:3740 +#: 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:2221 +#: catalog/index.c:2214 #, c-format msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLYはトランザクション内で最初の操作でなければなりません" -#: catalog/index.c:3700 +#: catalog/index.c:3668 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "他のセッションの一時テーブルはインデクス再構築できません" -#: catalog/index.c:3711 commands/indexcmds.c:3732 +#: catalog/index.c:3679 commands/indexcmds.c:3626 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "TOASTテーブルの無効なインデックスの再作成はできません" -#: catalog/index.c:3727 commands/indexcmds.c:3610 commands/indexcmds.c:3756 commands/tablecmds.c:3658 +#: 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:3864 +#: catalog/index.c:3832 #, c-format msgid "index \"%s\" was reindexed" msgstr "インデックス\"%s\"のインデックス再構築が完了しました" -#: catalog/index.c:4030 +#: catalog/index.c:3998 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "TOASTテーブルの無効なインデックス \"%s.%s\"の再作成はできません、スキップします " -#: catalog/namespace.c:462 catalog/namespace.c:666 catalog/namespace.c:758 commands/trigger.c:5756 +#: 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\"" @@ -4782,17 +4807,17 @@ msgstr "リレーション\"%s.%s\"のロックを取得できませんでした msgid "could not obtain lock on relation \"%s\"" msgstr "リレーション\"%s\"のロックを取得できませんでした" -#: catalog/namespace.c:633 parser/parse_relation.c:1443 +#: catalog/namespace.c:633 parser/parse_relation.c:1430 #, c-format msgid "relation \"%s.%s\" does not exist" msgstr "リレーション\"%s.%s\"は存在しません" -#: catalog/namespace.c:638 parser/parse_relation.c:1456 parser/parse_relation.c:1464 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:704 catalog/namespace.c:3522 commands/extension.c:1718 commands/extension.c:1724 +#: 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 "作成先のスキーマが選択されていません" @@ -4837,12 +4862,12 @@ msgstr "テキスト検索テンプレート\"%s\"は存在しません" msgid "text search configuration \"%s\" does not exist" msgstr "テキスト検索設定\"%s\"は存在しません" -#: catalog/namespace.c:3329 parser/parse_expr.c:866 parser/parse_target.c:1262 +#: 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:3335 gram.y:19384 gram.y:19424 parser/parse_expr.c:873 parser/parse_target.c:1269 +#: catalog/namespace.c:3335 gram.y:19188 gram.y:19228 parser/parse_expr.c:875 parser/parse_target.c:1266 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "修飾名が不適切です(ドット区切りの名前が多すぎます): %s" @@ -4857,7 +4882,7 @@ msgstr "一時スキーマへ、または一時スキーマからオブジェク msgid "cannot move objects into or out of TOAST schema" msgstr "TOASTスキーマへ、またはTOASTスキーマからオブジェクトを移動できません" -#: catalog/namespace.c:3544 commands/schemacmds.c:264 commands/schemacmds.c:344 commands/tablecmds.c:1437 utils/adt/regproc.c:1688 +#: 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\"は存在しません" @@ -4892,235 +4917,230 @@ msgstr "リカバリ中は一時テーブルを作成できません" msgid "cannot create temporary tables during a parallel operation" msgstr "並行処理中は一時テーブルを作成できません" -#: catalog/objectaddress.c:1376 commands/policy.c:93 commands/policy.c:373 commands/tablecmds.c:260 commands/tablecmds.c:302 commands/tablecmds.c:2360 commands/tablecmds.c:13541 +#: 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:1383 commands/tablecmds.c:272 commands/tablecmds.c:18614 commands/view.c:113 +#: 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:1390 commands/matview.c:201 commands/tablecmds.c:278 commands/tablecmds.c:18619 +#: 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:1397 commands/tablecmds.c:296 commands/tablecmds.c:18624 +#: 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:1438 +#: catalog/objectaddress.c:1433 #, c-format msgid "must specify relation and object name" msgstr "リレーションとオブジェクトの名前の指定が必要です" -#: catalog/objectaddress.c:1514 catalog/objectaddress.c:1567 +#: catalog/objectaddress.c:1509 catalog/objectaddress.c:1562 #, c-format msgid "column name must be qualified" msgstr "列名を修飾する必要があります" -#: catalog/objectaddress.c:1586 +#: 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:1623 commands/functioncmds.c:132 commands/tablecmds.c:288 commands/typecmds.c:278 commands/typecmds.c:3830 parser/parse_type.c:243 parser/parse_type.c:272 parser/parse_type.c:801 utils/adt/acl.c:4558 +#: 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:1634 -#, c-format -msgid "\"%s\" is not a domain" -msgstr "\"%s\"はドメインではありません" - -#: catalog/objectaddress.c:1742 +#: 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:1773 +#: 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:1824 catalog/objectaddress.c:1850 +#: 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:1839 commands/foreigncmds.c:430 commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:713 +#: catalog/objectaddress.c:1834 commands/foreigncmds.c:441 commands/foreigncmds.c:1004 commands/foreigncmds.c:1367 foreign/foreign.c:713 #, c-format msgid "server \"%s\" does not exist" msgstr "サーバー\"%s\"は存在しません" -#: catalog/objectaddress.c:1906 +#: catalog/objectaddress.c:1901 #, c-format msgid "publication relation \"%s\" in publication \"%s\" does not exist" msgstr "パブリケーション\"%2$s\"にパブリケーションリレーション\"%1$s\"は存在しません" -#: catalog/objectaddress.c:1953 +#: catalog/objectaddress.c:1948 #, c-format msgid "publication schema \"%s\" in publication \"%s\" does not exist" msgstr "パブリケーション\"%2$s\"にパブリケーションスキーマ\"%1$s\"は存在しません" -#: catalog/objectaddress.c:2011 +#: catalog/objectaddress.c:2006 #, c-format msgid "unrecognized default ACL object type \"%c\"" msgstr "デフォルトのACLオブジェクトタイプ\"%c\"は認識できません" -#: catalog/objectaddress.c:2012 +#: 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:2063 +#: 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:2068 +#: catalog/objectaddress.c:2063 #, c-format msgid "default ACL for user \"%s\" on %s does not exist" msgstr "ユーザー\"%s\"に対する%sへのデフォルトACLは存在しません" -#: catalog/objectaddress.c:2094 catalog/objectaddress.c:2151 catalog/objectaddress.c:2206 +#: 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:2128 +#: catalog/objectaddress.c:2123 #, c-format msgid "unsupported object type \"%s\"" msgstr "サポートされないオブジェクトタイプ\"%s\"" -#: catalog/objectaddress.c:2147 catalog/objectaddress.c:2164 catalog/objectaddress.c:2229 catalog/objectaddress.c:2313 +#: 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:2168 +#: catalog/objectaddress.c:2163 #, c-format msgid "large object OID may not be null" msgstr "ラージオブジェクトのOIDはnullにはなり得ません" -#: catalog/objectaddress.c:2177 catalog/objectaddress.c:2247 catalog/objectaddress.c:2254 +#: 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:2240 catalog/objectaddress.c:2261 +#: catalog/objectaddress.c:2235 catalog/objectaddress.c:2256 #, c-format msgid "argument list length must be exactly %d" msgstr "引数リストの長さはちょうど%dである必要があります" -#: catalog/objectaddress.c:2475 libpq/be-fsstubs.c:334 +#: catalog/objectaddress.c:2470 libpq/be-fsstubs.c:329 #, c-format msgid "must be owner of large object %u" msgstr "ラージオブジェクト %u の所有者である必要があります" -#: catalog/objectaddress.c:2490 commands/functioncmds.c:1575 +#: 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:2517 catalog/objectaddress.c:2526 catalog/objectaddress.c:2532 +#: catalog/objectaddress.c:2512 catalog/objectaddress.c:2521 catalog/objectaddress.c:2527 #, c-format msgid "permission denied" msgstr "権限がありません" -#: catalog/objectaddress.c:2518 catalog/objectaddress.c:2527 +#: catalog/objectaddress.c:2513 catalog/objectaddress.c:2522 #, c-format msgid "The current user must have the %s attribute." msgstr "現在のユーザーは%s属性を持つ必要があります。" -#: catalog/objectaddress.c:2533 +#: 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:2547 +#: catalog/objectaddress.c:2542 #, c-format msgid "must be superuser" msgstr "スーパーユーザーである必要があります" -#: catalog/objectaddress.c:2616 +#: catalog/objectaddress.c:2611 #, c-format msgid "unrecognized object type \"%s\"" msgstr "認識されないオブジェクトタイプ\"%s\"" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2933 +#: catalog/objectaddress.c:2928 #, c-format msgid "column %s of %s" msgstr "%2$s の列 %1$s" -#: catalog/objectaddress.c:2948 +#: catalog/objectaddress.c:2943 #, c-format msgid "function %s" msgstr "関数%s" -#: catalog/objectaddress.c:2961 +#: catalog/objectaddress.c:2956 #, c-format msgid "type %s" msgstr "型%s" -#: catalog/objectaddress.c:2998 +#: catalog/objectaddress.c:2993 #, c-format msgid "cast from %s to %s" msgstr "%sから%sへの型変換" -#: catalog/objectaddress.c:3031 +#: catalog/objectaddress.c:3026 #, c-format msgid "collation %s" msgstr "照合順序%s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3062 +#: catalog/objectaddress.c:3057 #, c-format msgid "constraint %s on %s" msgstr "%2$sに対する制約%1$s" -#: catalog/objectaddress.c:3068 +#: catalog/objectaddress.c:3063 #, c-format msgid "constraint %s" msgstr "制約%s" -#: catalog/objectaddress.c:3100 +#: catalog/objectaddress.c:3095 #, c-format msgid "conversion %s" msgstr "変換%s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3122 +#: catalog/objectaddress.c:3117 #, c-format msgid "default value for %s" msgstr "%s のデフォルト値" -#: catalog/objectaddress.c:3133 +#: catalog/objectaddress.c:3128 #, c-format msgid "language %s" msgstr "言語%s" -#: catalog/objectaddress.c:3141 +#: catalog/objectaddress.c:3136 #, c-format msgid "large object %u" msgstr "ラージオブジェクト%u" -#: catalog/objectaddress.c:3154 +#: catalog/objectaddress.c:3149 #, c-format msgid "operator %s" msgstr "演算子%s" -#: catalog/objectaddress.c:3191 +#: catalog/objectaddress.c:3186 #, c-format msgid "operator class %s for access method %s" msgstr "アクセスメソッド%2$s用の演算子クラス%1$s" -#: catalog/objectaddress.c:3219 +#: catalog/objectaddress.c:3214 #, c-format msgid "access method %s" msgstr "アクセスメソッド%s" @@ -5129,7 +5149,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:3274 +#: 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" @@ -5138,236 +5158,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:3339 +#: 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:3393 +#: 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:3439 +#: catalog/objectaddress.c:3434 #, c-format msgid "trigger %s on %s" msgstr "%2$s のトリガ %1$s" -#: catalog/objectaddress.c:3459 +#: catalog/objectaddress.c:3454 #, c-format msgid "schema %s" msgstr "スキーマ%s" -#: catalog/objectaddress.c:3487 +#: catalog/objectaddress.c:3482 #, c-format msgid "statistics object %s" msgstr "統計オブジェクト%s" -#: catalog/objectaddress.c:3518 +#: catalog/objectaddress.c:3513 #, c-format msgid "text search parser %s" msgstr "テキスト検索パーサ%s" -#: catalog/objectaddress.c:3549 +#: catalog/objectaddress.c:3544 #, c-format msgid "text search dictionary %s" msgstr "テキスト検索辞書%s" -#: catalog/objectaddress.c:3580 +#: catalog/objectaddress.c:3575 #, c-format msgid "text search template %s" msgstr "テキスト検索テンプレート%s" -#: catalog/objectaddress.c:3611 +#: catalog/objectaddress.c:3606 #, c-format msgid "text search configuration %s" msgstr "テキスト検索設定%s" -#: catalog/objectaddress.c:3624 +#: catalog/objectaddress.c:3619 #, c-format msgid "role %s" msgstr "ロール%s" -#: catalog/objectaddress.c:3661 catalog/objectaddress.c:5579 +#: catalog/objectaddress.c:3656 catalog/objectaddress.c:5505 #, c-format msgid "membership of role %s in role %s" msgstr "ロール%sのロール%sへの所属" -#: catalog/objectaddress.c:3682 +#: catalog/objectaddress.c:3677 #, c-format msgid "database %s" msgstr "データベース%s" -#: catalog/objectaddress.c:3698 +#: catalog/objectaddress.c:3693 #, c-format msgid "tablespace %s" msgstr "テーブル空間%s" -#: catalog/objectaddress.c:3709 +#: catalog/objectaddress.c:3704 #, c-format msgid "foreign-data wrapper %s" msgstr "外部データラッパー%s" -#: catalog/objectaddress.c:3719 +#: catalog/objectaddress.c:3714 #, c-format msgid "server %s" msgstr "サーバー%s" -#: catalog/objectaddress.c:3752 +#: catalog/objectaddress.c:3747 #, c-format msgid "user mapping for %s on server %s" msgstr "サーバー%2$s上のユーザーマッピング%1$s" -#: catalog/objectaddress.c:3804 +#: 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:3808 +#: catalog/objectaddress.c:3803 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "新しいリレーションに関するデフォルトの権限は、ロール%sに属します。" -#: catalog/objectaddress.c:3814 +#: 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:3818 +#: catalog/objectaddress.c:3813 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "新しいシーケンスに関するデフォルトの権限は、ロール%sに属します。" -#: catalog/objectaddress.c:3824 +#: 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:3828 +#: catalog/objectaddress.c:3823 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "新しい関数に関するデフォルトの権限は、ロール%sに属します。" -#: catalog/objectaddress.c:3834 +#: 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:3838 +#: catalog/objectaddress.c:3833 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "新しい型に関するデフォルトの権限は、ロール%sに属します" -#: catalog/objectaddress.c:3844 +#: catalog/objectaddress.c:3839 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "ロール%sに属する新しいスキーマ上のデフォルト権限" -#: catalog/objectaddress.c:3851 +#: catalog/objectaddress.c:3846 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "スキーマ %2$s のロール %1$s に属するデフォルト権限" -#: catalog/objectaddress.c:3855 +#: catalog/objectaddress.c:3850 #, c-format msgid "default privileges belonging to role %s" msgstr "デフォルトの権限はロール%sに属します。" -#: catalog/objectaddress.c:3877 +#: catalog/objectaddress.c:3872 #, c-format msgid "extension %s" msgstr "機能拡張%s" -#: catalog/objectaddress.c:3894 +#: catalog/objectaddress.c:3889 #, c-format msgid "event trigger %s" msgstr "イベントトリガ%s" -#: catalog/objectaddress.c:3918 +#: catalog/objectaddress.c:3913 #, c-format msgid "parameter %s" msgstr "パラメータ %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3961 +#: catalog/objectaddress.c:3956 #, c-format msgid "policy %s on %s" msgstr "%2$s のポリシ %1$s" -#: catalog/objectaddress.c:3975 +#: catalog/objectaddress.c:3970 #, c-format msgid "publication %s" msgstr "パブリケーション%s" -#: catalog/objectaddress.c:3988 +#: catalog/objectaddress.c:3983 #, c-format msgid "publication of schema %s in publication %s" msgstr "パブリケーション%2$sでのスキーマ%1$sのパブリケーション" #. translator: first %s is, e.g., "table %s" -#: catalog/objectaddress.c:4019 +#: catalog/objectaddress.c:4014 #, c-format msgid "publication of %s in publication %s" msgstr "パブリケーション %2$s での %1$s のパブリケーション" -#: catalog/objectaddress.c:4032 +#: catalog/objectaddress.c:4027 #, c-format msgid "subscription %s" msgstr "サブスクリプション%s" -#: catalog/objectaddress.c:4053 +#: catalog/objectaddress.c:4048 #, c-format msgid "transform for %s language %s" msgstr "言語%2$sの%1$s型に対する変換" -#: catalog/objectaddress.c:4122 +#: catalog/objectaddress.c:4117 #, c-format msgid "table %s" msgstr "テーブル%s" -#: catalog/objectaddress.c:4127 +#: catalog/objectaddress.c:4122 #, c-format msgid "index %s" msgstr "インデックス%s" -#: catalog/objectaddress.c:4131 +#: catalog/objectaddress.c:4126 #, c-format msgid "sequence %s" msgstr "シーケンス%s" -#: catalog/objectaddress.c:4135 +#: catalog/objectaddress.c:4130 #, c-format msgid "toast table %s" msgstr "TOASTテーブル%s" -#: catalog/objectaddress.c:4139 +#: catalog/objectaddress.c:4134 #, c-format msgid "view %s" msgstr "ビュー%s" -#: catalog/objectaddress.c:4143 +#: catalog/objectaddress.c:4138 #, c-format msgid "materialized view %s" msgstr "実体化ビュー%s" -#: catalog/objectaddress.c:4147 +#: catalog/objectaddress.c:4142 #, c-format msgid "composite type %s" msgstr "複合型%s" -#: catalog/objectaddress.c:4151 +#: catalog/objectaddress.c:4146 #, c-format msgid "foreign table %s" msgstr "外部テーブル%s" -#: catalog/objectaddress.c:4156 +#: catalog/objectaddress.c:4151 #, c-format msgid "relation %s" msgstr "リレーション%s" -#: catalog/objectaddress.c:4197 +#: catalog/objectaddress.c:4192 #, c-format msgid "operator family %s for access method %s" msgstr "アクセスメソッド%2$sの演算子族%1$s" @@ -5408,7 +5428,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:3057 +#: 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属性は一致している必要があります" @@ -5483,7 +5503,7 @@ msgstr "\"%s\"は仮説集合集約です。" msgid "cannot change number of direct arguments of an aggregate function" msgstr "集約関数の直接引数の数は変更できません" -#: catalog/pg_aggregate.c:858 commands/functioncmds.c:701 commands/typecmds.c:2011 commands/typecmds.c:2057 commands/typecmds.c:2109 commands/typecmds.c:2146 commands/typecmds.c:2180 commands/typecmds.c:2214 commands/typecmds.c:2248 commands/typecmds.c:2277 commands/typecmds.c:2364 commands/typecmds.c:2406 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 +#: 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" @@ -5579,36 +5599,21 @@ msgstr "照合順序\"%s\"はすでに存在します" msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "エンコーディング\"%2$s\"の照合順序\"%1$s\"はすでに存在します" -#: catalog/pg_constraint.c:753 commands/tablecmds.c:7801 -#, c-format -msgid "cannot change NO INHERIT status of NOT NULL constraint \"%s\" on relation \"%s\"" -msgstr "リレーション\"%2$s\"の非NULL制約\"%1$s\"のNO INHERIT設定は変更できません" - -#: catalog/pg_constraint.c:992 +#: catalog/pg_constraint.c:733 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "ドメイン\"%2$s\"の制約\"%1$s\"はすでに存在します" -#: catalog/pg_constraint.c:1193 catalog/pg_constraint.c:1286 +#: catalog/pg_constraint.c:933 catalog/pg_constraint.c:1026 #, c-format msgid "constraint \"%s\" for table \"%s\" does not exist" msgstr "テーブル\"%2$s\"の制約\"%1$s\"は存在しません" -#: catalog/pg_constraint.c:1386 +#: catalog/pg_constraint.c:1126 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "ドメイン\"%2$s\"に対する制約\"%1$s\"は存在しません" -#: catalog/pg_constraint.c:1640 -#, c-format -msgid "invalid type for PERIOD part of foreign key" -msgstr "外部キーのPERIOD部に対して不正な型" - -#: catalog/pg_constraint.c:1641 -#, c-format -msgid "Only range and multirange are supported." -msgstr "範囲型および副範囲型のみがサポートされます。" - #: catalog/pg_conversion.c:64 #, c-format msgid "conversion \"%s\" already exists" @@ -5619,27 +5624,27 @@ msgstr "変換\"%s\"はすでに存在します" msgid "default conversion for %s to %s already exists" msgstr "%sから%sへのデフォルトの変換はすでに存在します" -#: catalog/pg_depend.c:223 commands/extension.c:3508 +#: 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:230 catalog/pg_depend.c:281 commands/extension.c:3548 +#: 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:233 +#: 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:284 +#: 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:647 +#: catalog/pg_depend.c:648 #, c-format msgid "cannot remove dependency on %s because it is a system object" msgstr "システムオブジェクトであるため、%sの依存関係を削除できません。" @@ -5689,7 +5694,7 @@ msgstr "パーティション\"%s\"を取り外せません" msgid "The partition is being detached concurrently or has an unfinished detach." msgstr "このパーティションは今現在取り外し中であるか取り外し処理が未完了の状態です。" -#: catalog/pg_inherits.c:595 commands/tablecmds.c:4871 commands/tablecmds.c:16861 +#: 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 detach operation." msgstr "ALTER TABLE ... DETACH PARTITION ... FINALIZE を実行して保留中の取り外し処理を完了させてください。" @@ -5884,57 +5889,62 @@ msgstr "SQL関数は型%sの引数と取ることができません" 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 "この操作はUNLOGGEDテーブルに対してはサポートされていません。" -#: 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:462 +#: catalog/pg_publication.c:392 #, c-format msgid "relation \"%s\" is already member of publication \"%s\"" msgstr "リレーション\"%s\"はすでにパブリケーション\"%s\"のメンバです" -#: catalog/pg_publication.c:574 +#: catalog/pg_publication.c:534 #, c-format msgid "cannot use system column \"%s\" in publication column list" msgstr "システム列\"%s\"はパブリケーション列リスト内では使用できません" -#: catalog/pg_publication.c:580 +#: 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:692 +#: catalog/pg_publication.c:636 #, c-format msgid "schema \"%s\" is already member of publication \"%s\"" msgstr "スキーマ\"%s\"はすでにパブリケーション\"%s\"のメンバです" @@ -6008,12 +6018,12 @@ msgstr "データベースシステムが必要としているため%sが所有 msgid "cannot reassign ownership of objects owned by %s because they are required by the database system" msgstr "データベースシステムが必要としているため%sが所有するオブジェクトの所有者を再割り当てできません" -#: catalog/pg_subscription.c:469 +#: catalog/pg_subscription.c:438 #, c-format msgid "could not drop relation mapping for subscription \"%s\"" msgstr "サブスクリプション\"%s\"に対するリレーションマッピングを削除できませんでした" -#: catalog/pg_subscription.c:471 +#: catalog/pg_subscription.c:440 #, c-format msgid "Table synchronization for relation \"%s\" is in progress and is in state \"%c\"." msgstr "リレーション\\\"%s\\\"のテーブル同期が進行中で、状態は\\\"%c\\\"です。" @@ -6021,7 +6031,7 @@ msgstr "リレーション\\\"%s\\\"のテーブル同期が進行中で、状 #. translator: first %s is a SQL ALTER command and second %s is a #. SQL DROP command #. -#: catalog/pg_subscription.c:478 +#: 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を実行してこのサブスクリプションを削除してください。" @@ -6051,7 +6061,7 @@ msgstr "値渡し型の場合、内部サイズ%dは不正です" msgid "alignment \"%c\" is invalid for variable-length type" msgstr "可変長型の場合、アラインメント\"%c\"は不正です" -#: catalog/pg_type.c:325 commands/typecmds.c:4350 +#: catalog/pg_type.c:325 commands/typecmds.c:4363 #, c-format msgid "fixed-size types must have storage PLAIN" msgstr "固定長型の場合はPLAIN格納方式でなければなりません" @@ -6066,7 +6076,7 @@ msgstr "\"%s\"の複範囲型の作成中に失敗しました。" msgid "You can manually specify a multirange type name using the \"multirange_type_name\" attribute." msgstr "\"multirange_type_name\"属性で複範囲型の型名を手動で指定することができます。" -#: catalog/storage.c:533 storage/buffer/bufmgr.c:1553 +#: 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に不正なページ" @@ -6151,7 +6161,7 @@ msgstr "直列化関数は集約遷移データの型が%sの場合にだけ指 msgid "must specify both or neither of serialization and deserialization functions" msgstr "直列化関数と復元関数は両方指定するか、両方指定しないかのどちらかである必要があります" -#: commands/aggregatecmds.c:434 commands/functioncmds.c:649 +#: commands/aggregatecmds.c:434 commands/functioncmds.c:634 #, c-format msgid "parameter \"parallel\" must be SAFE, RESTRICTED, or UNSAFE" msgstr "パラメータ\"parallel\"はSAVE、RESTRICTEDまたはUNSAFEのいずれかでなければなりません" @@ -6166,12 +6176,12 @@ msgstr "パラメータ\"%s\"は READ_ONLY、SHAREABLE または READ_WRITE で msgid "event trigger \"%s\" already exists" msgstr "イベントトリガ\"%s\"はすでに存在します" -#: commands/alter.c:86 commands/foreigncmds.c:593 +#: commands/alter.c:86 commands/foreigncmds.c:604 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "外部データラッパー\"%s\"はすでに存在します" -#: commands/alter.c:89 commands/foreigncmds.c:884 +#: commands/alter.c:89 commands/foreigncmds.c:895 #, c-format msgid "server \"%s\" already exists" msgstr "サーバー\"%s\"はすでに存在します" @@ -6181,12 +6191,12 @@ msgstr "サーバー\"%s\"はすでに存在します" msgid "language \"%s\" already exists" msgstr "言語\"%s\"はすでに存在します" -#: commands/alter.c:95 commands/publicationcmds.c:805 +#: commands/alter.c:95 commands/publicationcmds.c:764 #, c-format msgid "publication \"%s\" already exists" msgstr "パブリケーション\"%s\"はすでに存在します" -#: commands/alter.c:98 commands/subscriptioncmds.c:629 +#: commands/alter.c:98 commands/subscriptioncmds.c:669 #, c-format msgid "subscription \"%s\" already exists" msgstr "サブスクリプション\"%s\"はすでに存在します" @@ -6226,17 +6236,17 @@ msgstr "テキスト検索設定\"%s\"はすでにスキーマ\"%s\"存在しま msgid "must be superuser to rename %s" msgstr "%sの名前を変更するにはスーパーユーザーである必要があります" -#: commands/alter.c:256 commands/subscriptioncmds.c:608 commands/subscriptioncmds.c:1147 commands/subscriptioncmds.c:1231 commands/subscriptioncmds.c:1989 +#: 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:609 commands/subscriptioncmds.c:1148 commands/subscriptioncmds.c:1232 commands/subscriptioncmds.c:1990 +#: 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:730 +#: commands/alter.c:735 #, c-format msgid "must be superuser to set schema of %s" msgstr "%sのスキーマを設定するにはスーパーユーザーである必要があります" @@ -6256,7 +6266,7 @@ msgstr "アクセスメソッドを作成するにはスーパーユーザーで msgid "access method \"%s\" already exists" msgstr "アクセスメソッド\"%s\"は存在しません" -#: commands/amcmds.c:154 commands/indexcmds.c:226 commands/indexcmds.c:859 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\"は存在しません" @@ -6266,57 +6276,52 @@ msgstr "アクセスメソッド\"%s\"は存在しません" 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:941 +#: commands/amcmds.c:264 commands/event_trigger.c:200 commands/foreigncmds.c:500 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:215 +#: commands/analyze.c:217 #, c-format msgid "skipping \"%s\" --- cannot analyze this foreign table" msgstr "\"%s\"をスキップしています --- この外部テーブルに対してANALYZEを実行することはできません" -#: commands/analyze.c:232 +#: commands/analyze.c:234 #, c-format msgid "skipping \"%s\" --- cannot analyze non-tables or special system tables" msgstr "\"%s\"をスキップしています --- テーブルでないものや特別なシステムテーブルに対してANALYZEを実行することはできません" -#: commands/analyze.c:317 +#: commands/analyze.c:314 #, c-format msgid "analyzing \"%s.%s\" inheritance tree" msgstr "\"%s.%s\"継承ツリーを解析しています" -#: commands/analyze.c:322 +#: commands/analyze.c:319 #, c-format msgid "analyzing \"%s.%s\"" msgstr "\"%s.%s\"を解析しています" -#: commands/analyze.c:393 +#: 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:803 +#: commands/analyze.c:785 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"\n" msgstr "テーブル\"%s.%s.%s\"に対する自動ANALYZE\n" -#: commands/analyze.c:805 -#, c-format -msgid "finished analyzing table \"%s.%s.%s\"\n" -msgstr "テーブル\"%s.%s.%s\"の解析完了\n" - -#: commands/analyze.c:1327 +#: 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:1411 +#: 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:1509 +#: 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をスキップします --- このツリーにはアナライズ可能な子テーブルがありません" @@ -6361,82 +6366,82 @@ msgstr "PID %d のサーバープロセスは、この中で最も古いトラ msgid "The NOTIFY queue cannot be emptied until that process ends its current transaction." msgstr "このプロセスが現在のトランザクションを終了するまで NOTYFY キューを空にすることはできません" -#: commands/cluster.c:127 +#: commands/cluster.c:128 #, c-format msgid "unrecognized CLUSTER option \"%s\"" msgstr "認識できないCLUSTERオプション \"%s\"" -#: commands/cluster.c:158 commands/cluster.c:421 +#: 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:15429 commands/tablecmds.c:17483 +#: commands/cluster.c:191 commands/tablecmds.c:14838 commands/tablecmds.c:16770 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "テーブル\"%2$s\"にはインデックス\"%1$s\"は存在しません" -#: commands/cluster.c:410 +#: commands/cluster.c:422 #, c-format msgid "cannot cluster a shared catalog" msgstr "共有カタログをクラスタ化できません" -#: commands/cluster.c:425 +#: commands/cluster.c:437 #, c-format msgid "cannot vacuum temporary tables of other sessions" msgstr "他のセッションの一時テーブルに対してはVACUUMを実行できません" -#: commands/cluster.c:507 commands/tablecmds.c:17493 +#: 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:515 +#: commands/cluster.c:521 #, c-format msgid "cannot cluster on index \"%s\" because access method does not support clustering" msgstr "インデックス\"%s\"でクラスタ化できません。アクセスメソッドがクラスタ化をサポートしないためです" -#: commands/cluster.c:527 +#: commands/cluster.c:533 #, c-format msgid "cannot cluster on partial index \"%s\"" msgstr "部分インデックス\"%s\"をクラスタ化できません" -#: commands/cluster.c:541 +#: commands/cluster.c:547 #, c-format msgid "cannot cluster on invalid index \"%s\"" msgstr "無効なインデックス\"%s\"ではクラスタ化できません" -#: commands/cluster.c:565 +#: commands/cluster.c:571 #, c-format msgid "cannot mark index clustered in partitioned table" msgstr "パーティションテーブル内のインデックスは CLUSTER 済みとマークできません`" -#: commands/cluster.c:961 +#: 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:967 +#: commands/cluster.c:962 #, c-format msgid "clustering \"%s.%s\" using sequential scan and sort" msgstr "シーケンシャルスキャンとソートを使って\"%s.%s\"をクラスタ化しています" -#: commands/cluster.c:972 +#: commands/cluster.c:967 #, c-format msgid "vacuuming \"%s.%s\"" msgstr "\"%s.%s\"に対してVACUUMを実行しています" -#: commands/cluster.c:999 +#: 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:1004 +#: commands/cluster.c:999 #, c-format msgid "" "%.0f dead row versions cannot be removed yet.\n" @@ -6445,7 +6450,7 @@ msgstr "" "%.0f 個の無効な行が今はまだ削除できません。\n" "%s." -#: commands/cluster.c:1746 +#: commands/cluster.c:1744 #, c-format msgid "permission denied to cluster \"%s\", skipping it" msgstr "\"%s\"のクラスタ化を行う権限がありません、スキップします" @@ -6455,8 +6460,8 @@ msgstr "\"%s\"のクラスタ化を行う権限がありません、スキップ msgid "collation attribute \"%s\" not recognized" msgstr "照合順序の属性\"%s\"が認識できません" -#: commands/collationcmds.c:123 commands/collationcmds.c:129 commands/define.c:375 commands/tablecmds.c:8210 replication/pgoutput/pgoutput.c:316 replication/pgoutput/pgoutput.c:339 replication/pgoutput/pgoutput.c:353 replication/pgoutput/pgoutput.c:363 replication/pgoutput/pgoutput.c:373 replication/pgoutput/pgoutput.c:383 replication/pgoutput/pgoutput.c:395 replication/walsender.c:1117 replication/walsender.c:1139 replication/walsender.c:1149 -#: replication/walsender.c:1158 replication/walsender.c:1400 replication/walsender.c:1409 +#: 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 "競合するオプション、あるいは余計なオプションがあります" @@ -6488,7 +6493,7 @@ msgstr "認識できないの照合順序プロバイダ: %s" msgid "parameter \"%s\" must be specified" msgstr "パラメータ\"%s\"の指定が必要です" -#: commands/collationcmds.c:293 commands/dbcommands.c:1147 +#: commands/collationcmds.c:293 commands/dbcommands.c:1134 #, c-format msgid "using standard form \"%s\" for ICU locale \"%s\"" msgstr "ICUロケール\"%s\"の標準形式\"%s\"を使用します" @@ -6498,7 +6503,7 @@ msgstr "ICUロケール\"%s\"の標準形式\"%s\"を使用します" msgid "nondeterministic collations not supported with this provider" msgstr "非決定的照合順序はこのプロバイダではサポートされません" -#: commands/collationcmds.c:317 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でなければ指定できません" @@ -6508,59 +6513,59 @@ msgstr "ICUルールはロケールプロバイダがICUでなければ指定で msgid "current database's encoding is not supported with this provider" msgstr "現在のデータベースのエンコーディングはこのプロバイダではサポートされません" -#: commands/collationcmds.c:405 +#: 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:416 +#: commands/collationcmds.c:420 #, c-format msgid "collation \"%s\" already exists in schema \"%s\"" msgstr "照合順序\"%s\"はすでにスキーマ\"%s\"内に存在します" -#: commands/collationcmds.c:441 +#: 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:443 commands/subscriptioncmds.c:1445 commands/tablecmds.c:7986 commands/tablecmds.c:7996 commands/tablecmds.c:7998 commands/tablecmds.c:15131 commands/tablecmds.c:18647 commands/tablecmds.c:18668 commands/typecmds.c:3774 commands/typecmds.c:3859 commands/typecmds.c:4213 +#: 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:476 commands/dbcommands.c:2579 +#: commands/collationcmds.c:480 commands/dbcommands.c:2566 #, c-format msgid "changing version from %s to %s" msgstr "バージョン%sから%sへの変更" -#: commands/collationcmds.c:491 commands/dbcommands.c:2592 +#: commands/collationcmds.c:495 commands/dbcommands.c:2579 #, c-format msgid "version has not changed" msgstr "バージョンが変わっていません" -#: commands/collationcmds.c:524 commands/dbcommands.c:2762 utils/adt/dbsize.c:180 +#: commands/collationcmds.c:528 commands/dbcommands.c:2749 #, c-format msgid "database with OID %u does not exist" msgstr "OID %uのデータベースは存在しません" -#: commands/collationcmds.c:550 +#: commands/collationcmds.c:554 #, c-format msgid "collation with OID %u does not exist" msgstr "OID %uの照合順序は存在しません" -#: commands/collationcmds.c:844 +#: commands/collationcmds.c:848 #, c-format msgid "must be superuser to import system collations" msgstr "システム照合順序をインポートするにはスーパーユーザーである必要があります" -#: commands/collationcmds.c:964 commands/collationcmds.c:1049 +#: 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:1678 commands/dbcommands.c:1896 commands/dbcommands.c:2008 commands/dbcommands.c:2206 commands/dbcommands.c:2446 commands/dbcommands.c:2539 commands/dbcommands.c:2663 commands/dbcommands.c:3174 utils/init/postinit.c:985 utils/init/postinit.c:1049 utils/init/postinit.c:1122 +#: 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\"は存在しません" @@ -6570,12 +6575,12 @@ msgstr "データベース\"%s\"は存在しません" msgid "cannot set comment on relation \"%s\"" msgstr "リレーション\"%s\"にはコメントを設定できません" -#: commands/constraint.c:61 utils/adt/ri_triggers.c:2174 +#: 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:2183 +#: commands/constraint.c:68 utils/adt/ri_triggers.c:2028 #, c-format msgid "function \"%s\" must be fired AFTER ROW" msgstr "関数\"%s\"はAFTER ROWトリガで実行してください" @@ -6667,229 +6672,202 @@ msgstr "パラメータ\"%s\"はBoolean値または\"match\"のみを取りま #. 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:818 commands/copy.c:834 commands/copy.c:851 commands/copy.c:877 commands/copy.c:887 +#: 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:474 +#: commands/copy.c:416 commands/copy.c:441 #, c-format msgid "COPY %s \"%s\" not recognized" msgstr "COPY %s \"%s\"を認識できません" -#: commands/copy.c:436 commands/define.c:73 commands/define.c:84 commands/define.c:178 commands/define.c:196 commands/define.c:211 commands/define.c:229 -#, c-format -msgid "%s requires a numeric value" -msgstr "%sは数値が必要です" - -#: commands/copy.c:446 -#, c-format -msgid "REJECT_LIMIT (%lld) must be greater than zero" -msgstr "REJECT_LIMIT (%lld)は0より大きくなければなりません" - -#: commands/copy.c:536 +#: commands/copy.c:502 #, c-format msgid "COPY format \"%s\" not recognized" msgstr "COPY フォーマット\"%s\"を認識できません" -#: commands/copy.c:594 commands/copy.c:609 commands/copy.c:624 commands/copy.c:643 +#: 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:655 +#: commands/copy.c:621 #, c-format msgid "argument to option \"%s\" must be a valid encoding name" msgstr "オプション\"%s\"の引数は有効なエンコーディング名でなければなりません" -#: commands/copy.c:683 commands/dbcommands.c:879 commands/dbcommands.c:2394 +#: commands/copy.c:642 commands/dbcommands.c:866 commands/dbcommands.c:2381 #, c-format msgid "option \"%s\" not recognized" msgstr "タイムゾーン\"%s\"を認識できません" #. translator: %s is the name of a COPY option, e.g. ON_ERROR -#: commands/copy.c:696 commands/copy.c:701 commands/copy.c:706 commands/copy.c:776 +#: commands/copy.c:655 commands/copy.c:660 commands/copy.c:665 commands/copy.c:740 #, c-format msgid "cannot specify %s in BINARY mode" msgstr "BINARYモードでは%sを指定できません" -#: commands/copy.c:728 +#: commands/copy.c:670 +#, c-format +msgid "only ON_ERROR STOP is allowed in BINARY mode" +msgstr "BINARYモードではN_ERROR STOPのみ使用可能です" + +#: commands/copy.c:692 #, c-format msgid "COPY delimiter must be a single one-byte character" msgstr "COPYの区切り文字は単一の1バイト文字でなければなりません" -#: commands/copy.c:735 +#: commands/copy.c:699 #, c-format msgid "COPY delimiter cannot be newline or carriage return" msgstr "COPYの区切り文字は改行や復帰記号とすることができません" -#: commands/copy.c:741 +#: commands/copy.c:705 #, c-format msgid "COPY null representation cannot use newline or carriage return" msgstr "COPYのNULL表現には改行や復帰記号を使用することはできません" -#: commands/copy.c:751 +#: commands/copy.c:715 #, c-format msgid "COPY default representation cannot use newline or carriage return" msgstr "COPYのデフォルト表現には改行や復帰記号を使用することはできません" -#: commands/copy.c:769 +#: commands/copy.c:733 #, c-format msgid "COPY delimiter cannot be \"%s\"" msgstr "COPYの区切り文字を\"%s\"とすることはできません" #. translator: %s is the name of a COPY option, e.g. ON_ERROR -#: commands/copy.c:783 commands/copy.c:800 commands/copy.c:812 commands/copy.c:827 commands/copy.c:843 +#: commands/copy.c:747 commands/copy.c:764 commands/copy.c:776 commands/copy.c:791 commands/copy.c:807 #, c-format msgid "COPY %s requires CSV mode" msgstr "COPY %s はCSVモードを要求します" -#: commands/copy.c:788 +#: commands/copy.c:752 #, c-format msgid "COPY quote must be a single one-byte character" msgstr "COPYの引用符は単一の1バイト文字でなければなりません" -#: commands/copy.c:793 +#: commands/copy.c:757 #, c-format msgid "COPY delimiter and quote must be different" msgstr "COPYの区切り文字と引用符は異なる文字でなければなりません" -#: commands/copy.c:805 +#: commands/copy.c:769 #, c-format msgid "COPY escape must be a single one-byte character" msgstr "COPYのエスケープは単一の1バイト文字でなければなりません" #. translator: %s is the name of a COPY option, e.g. NULL -#: commands/copy.c:859 commands/copy.c:895 +#: commands/copy.c:823 commands/copy.c:859 #, c-format msgid "COPY delimiter character must not appear in the %s specification" msgstr "COPYの区切り文字は%s指定では使用できません" #. translator: %s is the name of a COPY option, e.g. NULL -#: commands/copy.c:868 commands/copy.c:904 +#: commands/copy.c:832 commands/copy.c:868 #, c-format msgid "CSV quote character must not appear in the %s specification" msgstr "COPYの引用符は%s指定では使用できません" -#: commands/copy.c:913 +#: commands/copy.c:877 #, c-format msgid "NULL specification and DEFAULT specification cannot be the same" msgstr "NULL指定とDEFAULT指定は同じにはできません" -#: commands/copy.c:919 -#, c-format -msgid "only ON_ERROR STOP is allowed in BINARY mode" -msgstr "BINARYモードではN_ERROR STOPのみ使用可能です" - -#. translator: first and second %s are the names of COPY option, e.g. -#. * ON_ERROR, third is the value of the COPY option, e.g. IGNORE -#: commands/copy.c:926 -#, c-format -msgid "COPY %s requires %s to be set to %s" -msgstr "COPY %s では %s が %s に設定されている必要があります" - -#: commands/copy.c:988 +#: commands/copy.c:939 #, c-format msgid "column \"%s\" is a generated column" msgstr "列\"%s\"は生成カラムです" -#: commands/copy.c:990 +#: commands/copy.c:941 #, c-format msgid "Generated columns cannot be used in COPY." msgstr "生成カラムはCOPYでは使えません。" -#: commands/copy.c:1005 commands/indexcmds.c:1934 commands/statscmds.c:239 commands/tablecmds.c:2566 commands/tablecmds.c:3065 commands/tablecmds.c:3885 parser/parse_relation.c:3794 parser/parse_relation.c:3804 parser/parse_relation.c:3822 parser/parse_relation.c:3829 parser/parse_relation.c:3843 utils/adt/tsvector_op.c:2853 +#: 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:1012 commands/tablecmds.c:2592 commands/trigger.c:953 parser/parse_target.c:1086 parser/parse_target.c:1097 +#: 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:121 +#: commands/copyfrom.c:118 #, c-format msgid "COPY %s" msgstr "%sのCOPY" -#: commands/copyfrom.c:129 +#: commands/copyfrom.c:126 #, c-format msgid "COPY %s, line %llu, column %s" msgstr "%sのCOPY、行 %llu、列 %s" -#: commands/copyfrom.c:134 commands/copyfrom.c:180 +#: commands/copyfrom.c:131 commands/copyfrom.c:177 #, c-format msgid "COPY %s, line %llu" msgstr "%sのCOPY、行 %llu" -#: commands/copyfrom.c:146 +#: commands/copyfrom.c:143 #, c-format msgid "COPY %s, line %llu, column %s: \"%s\"" msgstr "%sのCOPY、行 %llu、列 %s: \"%s\"" -#: commands/copyfrom.c:156 +#: commands/copyfrom.c:153 #, c-format msgid "COPY %s, line %llu, column %s: null input" msgstr "%sのCOPY、行 %llu、列 %s: null が入力されました" -#: commands/copyfrom.c:173 +#: commands/copyfrom.c:170 #, c-format msgid "COPY %s, line %llu: \"%s\"" msgstr "%sのCOPY、行 %llu: \"%s\"" -#: commands/copyfrom.c:684 +#: commands/copyfrom.c:673 #, c-format msgid "cannot copy to view \"%s\"" msgstr "ビュー\"%s\"へのコピーはできません" -#: commands/copyfrom.c:686 +#: 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:690 +#: commands/copyfrom.c:679 #, c-format msgid "cannot copy to materialized view \"%s\"" msgstr "実体化ビュー\"%s\"へのコピーはできません" -#: commands/copyfrom.c:695 +#: commands/copyfrom.c:684 #, c-format msgid "cannot copy to sequence \"%s\"" msgstr "シーケンス\"%s\"へのコピーはできません" -#: commands/copyfrom.c:700 +#: commands/copyfrom.c:689 #, c-format msgid "cannot copy to non-table relation \"%s\"" msgstr "テーブル以外のリレーション\"%s\"へのコピーはできません" -#: commands/copyfrom.c:740 +#: commands/copyfrom.c:729 #, c-format msgid "cannot perform COPY FREEZE on a partitioned table" msgstr "パーティション親テーブルに対して COPY FREEZE は実行できません" -#: commands/copyfrom.c:747 -#, c-format -msgid "cannot perform COPY FREEZE on a foreign table" -msgstr "外部テーブルに対して COPY FREEZE は実行できません" - -#: commands/copyfrom.c:761 +#: commands/copyfrom.c:744 #, c-format msgid "cannot perform COPY FREEZE because of prior transaction activity" msgstr "先行するトランザクション処理のためCOPY FREEZEを実行することができません" -#: commands/copyfrom.c:767 +#: 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:1031 -#, c-format -msgid "skipped more than REJECT_LIMIT (%lld) rows due to data type incompatibility" -msgstr "データ型の不適合により、REJECT_LIMIT (%lld)を超える行がスキップされました" - -#: commands/copyfrom.c:1334 +#: 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" @@ -6897,207 +6875,207 @@ 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:1469 commands/copyfrom.c:1512 commands/copyto.c:601 +#: 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:1565 utils/mb/mbutils.c:385 +#: 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\"用のデフォルト変換関数は存在しません" -#: commands/copyfrom.c:1763 +#: 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:1776 commands/copyto.c:706 +#: commands/copyfrom.c:1755 commands/copyto.c:706 #, c-format msgid "\"%s\" is a directory" msgstr "\"%s\"はディレクトリです" -#: commands/copyfrom.c:1844 commands/copyto.c:299 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:1859 commands/copyto.c:304 +#: commands/copyfrom.c:1838 commands/copyto.c:304 #, c-format msgid "program \"%s\" failed" msgstr "プログラム\"%s\"の実行に失敗しました" -#: commands/copyfromparse.c:191 +#: commands/copyfromparse.c:200 #, c-format msgid "COPY file signature not recognized" msgstr "COPYファイルのシグネチャが不明です" -#: commands/copyfromparse.c:196 +#: commands/copyfromparse.c:205 #, c-format msgid "invalid COPY file header (missing flags)" msgstr "COPYファイルのヘッダが不正です(フラグがありません)" -#: commands/copyfromparse.c:200 +#: commands/copyfromparse.c:209 #, c-format msgid "invalid COPY file header (WITH OIDS)" msgstr "COPYファイルのヘッダが不正です(WITH OIDS)" -#: commands/copyfromparse.c:205 +#: commands/copyfromparse.c:214 #, c-format msgid "unrecognized critical flags in COPY file header" msgstr "COPYファイルのヘッダ内の重要なフラグが不明です" -#: commands/copyfromparse.c:211 +#: commands/copyfromparse.c:220 #, c-format msgid "invalid COPY file header (missing length)" msgstr "COPYファイルのヘッダが不正です(サイズがありません)" -#: commands/copyfromparse.c:218 +#: commands/copyfromparse.c:227 #, c-format msgid "invalid COPY file header (wrong length)" msgstr "COPYファイルのヘッダが不正です(サイズが不正です)" -#: commands/copyfromparse.c:247 +#: commands/copyfromparse.c:256 #, c-format msgid "could not read from COPY file: %m" msgstr "COPYファイルから読み込めませんでした: %m" -#: commands/copyfromparse.c:269 commands/copyfromparse.c:294 replication/walsender.c:726 replication/walsender.c:752 tcop/postgres.c:368 +#: commands/copyfromparse.c:278 commands/copyfromparse.c:303 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 "トランザクションを実行中のクライアント接続で想定外のEOFがありました" -#: commands/copyfromparse.c:285 replication/walsender.c:742 +#: commands/copyfromparse.c:294 replication/walsender.c:776 #, c-format msgid "unexpected message type 0x%02X during COPY from stdin" msgstr "標準入力からのCOPY中に想定外のメッセージタイプ0x%02Xがありました" -#: commands/copyfromparse.c:308 replication/walsender.c:773 +#: commands/copyfromparse.c:317 replication/walsender.c:807 #, c-format msgid "COPY from stdin failed: %s" msgstr "標準入力からのCOPYが失敗しました: %s" -#: commands/copyfromparse.c:776 +#: commands/copyfromparse.c:785 #, c-format msgid "wrong number of fields in header line: got %d, expected %d" msgstr "ヘッダ行の列数が間違っています: %dでしたが、%dを想定していました" -#: commands/copyfromparse.c:792 +#: commands/copyfromparse.c:801 #, c-format msgid "column name mismatch in header line field %d: got null value (\"%s\"), expected \"%s\"" msgstr "ヘッダ行フィールド%dでカラム名の不一致: NULL値(\"%s\")を検出, 予期していた値\"%s\"" -#: commands/copyfromparse.c:799 +#: 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:883 commands/copyfromparse.c:1513 commands/copyfromparse.c:1769 +#: 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:897 +#: commands/copyfromparse.c:906 #, c-format msgid "missing data for column \"%s\"" msgstr "列\"%s\"のデータがありません" -#: commands/copyfromparse.c:981 +#: 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:989 +#: 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:1035 +#: commands/copyfromparse.c:1044 #, c-format msgid "received copy data after EOF marker" msgstr "EOF マーカーの後ろでコピーデータを受信しました" -#: commands/copyfromparse.c:1042 +#: commands/copyfromparse.c:1051 #, c-format msgid "row field count is %d, expected %d" msgstr "行のフィールド数は%d、その期待値は%dです" -#: commands/copyfromparse.c:1326 commands/copyfromparse.c:1343 +#: commands/copyfromparse.c:1336 commands/copyfromparse.c:1353 #, c-format msgid "literal carriage return found in data" msgstr "データの中に復帰記号そのものがありました" -#: commands/copyfromparse.c:1327 commands/copyfromparse.c:1344 +#: commands/copyfromparse.c:1337 commands/copyfromparse.c:1354 #, c-format msgid "unquoted carriage return found in data" msgstr "データの中に引用符のない復帰記号がありました" -#: commands/copyfromparse.c:1329 commands/copyfromparse.c:1346 +#: commands/copyfromparse.c:1339 commands/copyfromparse.c:1356 #, c-format msgid "Use \"\\r\" to represent carriage return." msgstr "復帰記号は\"\\r\"と表現してください" -#: commands/copyfromparse.c:1330 commands/copyfromparse.c:1347 +#: commands/copyfromparse.c:1340 commands/copyfromparse.c:1357 #, c-format msgid "Use quoted CSV field to represent carriage return." msgstr "復帰記号を表現するにはCSVフィールドを引用符で括ってください" -#: commands/copyfromparse.c:1359 +#: commands/copyfromparse.c:1369 #, c-format msgid "literal newline found in data" msgstr "データの中に改行記号そのものがありました" -#: commands/copyfromparse.c:1360 +#: commands/copyfromparse.c:1370 #, c-format msgid "unquoted newline found in data" msgstr "データの中に引用符のない改行記号がありました" -#: commands/copyfromparse.c:1362 +#: commands/copyfromparse.c:1372 #, c-format msgid "Use \"\\n\" to represent newline." msgstr "改行記号は\"\\n\"と表現してください" -#: commands/copyfromparse.c:1363 +#: commands/copyfromparse.c:1373 #, c-format msgid "Use quoted CSV field to represent newline." msgstr "改行記号を表現するにはCSVフィールドを引用符で括ってください" -#: commands/copyfromparse.c:1401 commands/copyfromparse.c:1423 +#: 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:1405 commands/copyfromparse.c:1416 commands/copyfromparse.c:1432 +#: commands/copyfromparse.c:1428 commands/copyfromparse.c:1444 #, c-format -msgid "end-of-copy marker is not alone on its line" -msgstr "コピー終端記号が行内で単独ではありません" +msgid "end-of-copy marker corrupt" +msgstr "コピー終端記号が破損しています" -#: commands/copyfromparse.c:1705 commands/copyfromparse.c:1920 +#: commands/copyfromparse.c:1746 commands/copyfromparse.c:1961 #, c-format msgid "unexpected default marker in COPY data" msgstr "COPYデータの中に想定外のデフォルトマーカーがあります" -#: commands/copyfromparse.c:1706 commands/copyfromparse.c:1921 +#: commands/copyfromparse.c:1747 commands/copyfromparse.c:1962 #, c-format msgid "Column \"%s\" has no default value." msgstr "列\"%s\"はデフォルト値を持ちません。" -#: commands/copyfromparse.c:1853 +#: commands/copyfromparse.c:1894 #, c-format msgid "unterminated CSV quoted field" msgstr "CSV引用符が閉じていません" -#: commands/copyfromparse.c:1955 commands/copyfromparse.c:1974 +#: commands/copyfromparse.c:1996 commands/copyfromparse.c:2015 #, c-format msgid "unexpected EOF in COPY data" msgstr "COPYデータの中に想定外のEOFがあります" -#: commands/copyfromparse.c:1964 +#: commands/copyfromparse.c:2005 #, c-format msgid "invalid field size" msgstr "フィールドサイズが不正です" -#: commands/copyfromparse.c:1987 +#: commands/copyfromparse.c:2028 #, c-format msgid "incorrect binary data format" msgstr "バイナリデータ書式が不正です" @@ -7202,416 +7180,421 @@ msgstr "ファイル\"%s\"を書き込み用にオープンできませんでし 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:521 +#: commands/createas.c:210 commands/createas.c:516 #, c-format msgid "too many column names were specified" msgstr "指定された列別名が多すぎます" -#: commands/createas.c:544 +#: commands/createas.c:539 #, c-format msgid "policies not yet implemented for this command" msgstr "このコマンドにはポリシは実装されていません" -#: commands/dbcommands.c:842 +#: commands/dbcommands.c:829 #, c-format msgid "LOCATION is not supported anymore" msgstr "LOCATIONはもはやサポートされません" -#: commands/dbcommands.c:843 +#: commands/dbcommands.c:830 #, c-format msgid "Consider using tablespaces instead." msgstr "代わりにテーブル空間の使用を検討してください" -#: commands/dbcommands.c:868 +#: commands/dbcommands.c:855 #, c-format msgid "OIDs less than %u are reserved for system objects" msgstr "%uより小さいOIDはシステムオブジェクトのために予約されています" -#: commands/dbcommands.c:899 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:910 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:944 +#: commands/dbcommands.c:931 #, c-format msgid "unrecognized locale provider: %s" msgstr "認識できない照合順序プロバイダ: %s" -#: commands/dbcommands.c:957 commands/dbcommands.c:2427 commands/user.c:299 commands/user.c:739 +#: 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:978 +#: commands/dbcommands.c:965 #, c-format msgid "permission denied to create database" msgstr "データベースを作成する権限がありません" -#: commands/dbcommands.c:1002 +#: commands/dbcommands.c:989 #, c-format msgid "template database \"%s\" does not exist" msgstr "テンプレートデータベース\"%s\"は存在しません" -#: commands/dbcommands.c:1012 +#: commands/dbcommands.c:999 #, c-format msgid "cannot use invalid database \"%s\" as template" msgstr "無効なデータベース\"%s\"はテンプレートとして使用できません" -#: commands/dbcommands.c:1013 commands/dbcommands.c:2457 utils/init/postinit.c:1064 +#: 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:1024 +#: commands/dbcommands.c:1011 #, c-format msgid "permission denied to copy database \"%s\"" msgstr "データベース\"%s\"をコピーする権限がありません" -#: commands/dbcommands.c:1041 +#: commands/dbcommands.c:1028 #, c-format msgid "invalid create database strategy \"%s\"" msgstr "データベース作成の方法\"%s\"は不正です" -#: commands/dbcommands.c:1042 +#: commands/dbcommands.c:1029 #, c-format msgid "Valid strategies are \"wal_log\" and \"file_copy\"." msgstr "有効な方法は\"wal_log\"と\"file_copy\"です。" -#: commands/dbcommands.c:1063 +#: commands/dbcommands.c:1050 #, c-format msgid "invalid server encoding %d" msgstr "サーバーの符号化方式%dは不正です" -#: commands/dbcommands.c:1069 +#: commands/dbcommands.c:1056 #, c-format msgid "invalid LC_COLLATE locale name: \"%s\"" msgstr "LC_COLLATEのロケール名\"%s\"は不正です" -#: commands/dbcommands.c:1070 commands/dbcommands.c:1076 +#: 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:1075 +#: commands/dbcommands.c:1062 #, c-format msgid "invalid LC_CTYPE locale name: \"%s\"" msgstr "LC_CTYPEのロケール名\"%s\"は不正です" -#: commands/dbcommands.c:1087 +#: commands/dbcommands.c:1074 #, c-format msgid "BUILTIN_LOCALE cannot be specified unless locale provider is builtin" msgstr "BUILTIN_LOCALEはロケールプロバイダがbuiltinでなければ指定できません" -#: commands/dbcommands.c:1095 +#: commands/dbcommands.c:1082 #, c-format msgid "ICU locale cannot be specified unless locale provider is ICU" msgstr "ICUロケールはロケールプロバイダがICUでなければ指定できません" -#: commands/dbcommands.c:1113 +#: commands/dbcommands.c:1100 #, c-format msgid "LOCALE or BUILTIN_LOCALE must be specified" msgstr "LOCALEかBUILTIN_LOCALEのいずれかを指定しなければなりません" -#: commands/dbcommands.c:1122 +#: commands/dbcommands.c:1109 #, c-format msgid "encoding \"%s\" is not supported with ICU provider" msgstr "エンコーディング\"%s\"はICUではサポートされていません" -#: commands/dbcommands.c:1132 +#: commands/dbcommands.c:1119 #, c-format msgid "LOCALE or ICU_LOCALE must be specified" msgstr "LOCALEかICU_LOCALEのいずれかを指定しなければなりません" -#: commands/dbcommands.c:1176 +#: 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:1179 +#: 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:1184 +#: 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:1186 +#: 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:1191 +#: 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:1193 +#: 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:1198 +#: 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:1200 +#: 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:1212 +#: 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:1214 +#: 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:1225 +#: 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:1227 +#: 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:1256 +#: 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:1261 +#: commands/dbcommands.c:1248 #, c-format msgid "template database \"%s\" has a collation version mismatch" msgstr "テンプレートデータベース\"%s\"では照合順序バージョンの不一致が起きています" -#: commands/dbcommands.c:1263 +#: 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:1266 +#: 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:1311 commands/dbcommands.c:2054 +#: 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:1337 +#: commands/dbcommands.c:1324 #, c-format msgid "cannot assign new default tablespace \"%s\"" msgstr "新しいデフォルトのテーブル空間\"%s\"を割り当てられません" -#: commands/dbcommands.c:1339 +#: 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:1369 commands/dbcommands.c:1925 +#: commands/dbcommands.c:1356 commands/dbcommands.c:1912 #, c-format msgid "database \"%s\" already exists" msgstr "データベース\"%s\"はすでに存在します" -#: commands/dbcommands.c:1383 +#: commands/dbcommands.c:1370 #, c-format msgid "source database \"%s\" is being accessed by other users" msgstr "元となるデータベース\"%s\"は他のユーザーによってアクセスされています" -#: commands/dbcommands.c:1405 +#: commands/dbcommands.c:1392 #, c-format msgid "database OID %u is already in use by database \"%s\"" msgstr "データベースOID %uはすでにデータベース\"%s\"で使用されています" -#: commands/dbcommands.c:1411 +#: commands/dbcommands.c:1398 #, c-format msgid "data directory with the specified OID %u already exists" msgstr "指定されたOID %uのデータディレクトリはすでに存在します" -#: commands/dbcommands.c:1584 commands/dbcommands.c:1599 utils/adt/pg_locale.c:1659 +#: 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:1587 +#: commands/dbcommands.c:1574 #, c-format msgid "The chosen LC_CTYPE setting requires encoding \"%s\"." msgstr "選択されたLC_CTYPEを設定するには、符号化方式\"%s\"である必要があります。" -#: commands/dbcommands.c:1602 +#: commands/dbcommands.c:1589 #, c-format msgid "The chosen LC_COLLATE setting requires encoding \"%s\"." msgstr "選択されたLC_COLLATEを設定するには、符号化方式\"%s\"である必要があります。" -#: commands/dbcommands.c:1685 +#: commands/dbcommands.c:1672 #, c-format msgid "database \"%s\" does not exist, skipping" msgstr "データベース\"%s\"は存在しません、スキップします" -#: commands/dbcommands.c:1709 +#: commands/dbcommands.c:1696 #, c-format msgid "cannot drop a template database" msgstr "テンプレートデータベースを削除できません" -#: commands/dbcommands.c:1715 +#: commands/dbcommands.c:1702 #, c-format msgid "cannot drop the currently open database" msgstr "現在オープンしているデータベースを削除できません" -#: commands/dbcommands.c:1728 +#: commands/dbcommands.c:1715 #, c-format msgid "database \"%s\" is used by an active logical replication slot" msgstr "データベース\"%s\"は有効な論理レプリケーションスロットで使用中です" -#: commands/dbcommands.c:1730 +#: 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:1744 +#: commands/dbcommands.c:1731 #, c-format msgid "database \"%s\" is being used by logical replication subscription" msgstr "データベース\"%s\"は論理レプリケーションのサブスクリプションで使用中です" -#: commands/dbcommands.c:1746 +#: commands/dbcommands.c:1733 #, c-format msgid "There is %d subscription." msgid_plural "There are %d subscriptions." msgstr[0] "%d個のサブスクリプションがあります" -#: commands/dbcommands.c:1767 commands/dbcommands.c:1947 commands/dbcommands.c:2076 +#: 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:1907 +#: commands/dbcommands.c:1894 #, c-format msgid "permission denied to rename database" msgstr "データベースの名前を変更する権限がありません" -#: commands/dbcommands.c:1936 +#: commands/dbcommands.c:1923 #, c-format msgid "current database cannot be renamed" msgstr "現在のデータベースの名前を変更できません" -#: commands/dbcommands.c:2032 +#: commands/dbcommands.c:2019 #, c-format msgid "cannot change the tablespace of the currently open database" msgstr "現在オープン中のデータベースのテーブルスペースは変更できません" -#: commands/dbcommands.c:2138 +#: commands/dbcommands.c:2125 #, c-format msgid "some relations of database \"%s\" are already in tablespace \"%s\"" msgstr "データベース\"%s\"のリレーションの中に、テーブルスペース\"%s\"にすでに存在するものがあります" -#: commands/dbcommands.c:2140 +#: 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:2269 commands/dbcommands.c:3012 commands/dbcommands.c:3312 commands/dbcommands.c:3425 +#: 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:2330 +#: commands/dbcommands.c:2317 #, c-format msgid "unrecognized DROP DATABASE option \"%s\"" msgstr "DROP DATABASEのオプション\"%s\"が認識できません" -#: commands/dbcommands.c:2408 +#: commands/dbcommands.c:2395 #, c-format msgid "option \"%s\" cannot be specified with other options" msgstr "オプション\"%s\"は他のオプションと一緒に指定はできません" -#: commands/dbcommands.c:2456 +#: commands/dbcommands.c:2443 #, c-format msgid "cannot alter invalid database \"%s\"" msgstr "無効なデータベース\"%s\"は変更できません" -#: commands/dbcommands.c:2473 +#: commands/dbcommands.c:2460 #, c-format msgid "cannot disallow connections for current database" msgstr "現在のデータベースへの接続は禁止できません" -#: commands/dbcommands.c:2703 +#: commands/dbcommands.c:2690 #, c-format msgid "permission denied to change owner of database" msgstr "データベースの所有者を変更する権限がありません" -#: commands/dbcommands.c:3118 +#: 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:3121 +#: 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:3126 storage/ipc/procarray.c:3860 +#: 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:3268 +#: commands/dbcommands.c:3255 #, c-format msgid "missing directory \"%s\"" msgstr "ディレクトリ\"%s\"がありません" -#: commands/dbcommands.c:3326 commands/tablespace.c:184 commands/tablespace.c:633 +#: 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:40 commands/define.c:244 commands/define.c:276 commands/define.c:304 commands/define.c:350 +#: 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:140 +#: 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\"はboolean値が必要です" -#: commands/define.c:154 commands/define.c:163 commands/define.c:313 +#: 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:258 +#: commands/define.c:271 #, c-format msgid "argument of %s must be a name" msgstr "%sの引数は名前でなければなりません" -#: commands/define.c:288 +#: commands/define.c:301 #, c-format msgid "argument of %s must be a type name" msgstr "%sの引数は型名でなければなりません" -#: commands/define.c:334 +#: commands/define.c:347 #, c-format msgid "invalid argument for %s: \"%s\"" msgstr "%sの引数が不正です: \"%s\"" -#: commands/dropcmds.c:96 commands/functioncmds.c:1397 utils/adt/ruleutils.c:2953 +#: commands/dropcmds.c:96 commands/functioncmds.c:1382 utils/adt/ruleutils.c:2910 #, c-format msgid "\"%s\" is an aggregate function" msgstr "\"%s\"は集約関数です" @@ -7621,17 +7604,17 @@ msgstr "\"%s\"は集約関数です" msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "集約関数を削除するにはDROP AGGREGATEを使用してください" -#: commands/dropcmds.c:153 commands/sequence.c:462 commands/tablecmds.c:3969 commands/tablecmds.c:4130 commands/tablecmds.c:4182 commands/tablecmds.c:17924 tcop/utility.c:1328 +#: 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:183 commands/dropcmds.c:282 commands/tablecmds.c:1442 +#: 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:223 commands/dropcmds.c:262 commands/tablecmds.c:289 +#: commands/dropcmds.c:223 commands/dropcmds.c:262 commands/tablecmds.c:286 #, c-format msgid "type \"%s\" does not exist, skipping" msgstr "型\"%s\"は存在しません、スキップします" @@ -7746,7 +7729,7 @@ msgstr "リレーション\"%2$s\"のルール\"%1$s\"は存在しません、 msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "外部データラッパ\"%s\"は存在しません、スキップします" -#: commands/dropcmds.c:448 commands/foreigncmds.c:1360 +#: commands/dropcmds.c:448 commands/foreigncmds.c:1371 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "外部データラッパ\"%s\"は存在しません、スキップします" @@ -7827,442 +7810,437 @@ msgstr "イベントトリガ\"%s\"の所有者を変更する権限がありま msgid "The owner of an event trigger must be a superuser." msgstr "イベントトリガの所有者はスーパーユーザーでなければなりません" -#: commands/event_trigger.c:1404 +#: 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:1497 commands/event_trigger.c:1518 +#: 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:1931 +#: commands/event_trigger.c:1936 #, c-format msgid "%s can only be called in an event trigger function" msgstr "%sはイベントトリガ関数でのみ呼び出すことができます" -#: commands/explain.c:253 commands/explain.c:278 +#: 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:285 +#: commands/explain.c:273 #, c-format msgid "unrecognized EXPLAIN option \"%s\"" msgstr "EXPLAIN オプション\"%s\"が認識できません" -#: commands/explain.c:294 commands/explain.c:306 commands/explain.c:312 +#: commands/explain.c:282 +#, c-format +msgid "EXPLAIN option WAL requires ANALYZE" +msgstr "EXPLAINのオプション WAL には ANALYZE 指定が必要です" + +#: commands/explain.c:291 +#, c-format +msgid "EXPLAIN option TIMING requires ANALYZE" +msgstr "EXPLAINのオプション TIMING には ANALYZE 指定が必要です" + +#: commands/explain.c:297 #, c-format -msgid "EXPLAIN option %s requires ANALYZE" -msgstr "EXPLAINのオプション %s には ANALYZE 指定が必要です" +msgid "EXPLAIN option SERIALIZE requires ANALYZE" +msgstr "EXPLAINのオプション SERIALIZE には ANALYZE 指定が必要です" -#: commands/explain.c:318 +#: 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:168 commands/extension.c:3142 +#: commands/extension.c:178 commands/extension.c:3031 #, c-format msgid "extension \"%s\" does not exist" msgstr "機能拡張\"%s\"は存在しません" -#: commands/extension.c:233 commands/extension.c:242 commands/extension.c:254 commands/extension.c:264 +#: 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:234 +#: commands/extension.c:278 #, c-format msgid "Extension names must not be empty." msgstr "機能拡張名が無効です: 空であってはなりません" -#: commands/extension.c:243 +#: commands/extension.c:287 #, c-format msgid "Extension names must not contain \"--\"." msgstr "機能拡張名に\"--\"が含まれていてはなりません" -#: commands/extension.c:255 +#: commands/extension.c:299 #, c-format msgid "Extension names must not begin or end with \"-\"." msgstr "機能拡張名が\"-\"で始まったり終わったりしてはなりません" -#: commands/extension.c:265 +#: commands/extension.c:309 #, c-format msgid "Extension names must not contain directory separator characters." msgstr "機能拡張名にディレクトリの区切り文字が含まれていてはなりません" -#: commands/extension.c:280 commands/extension.c:289 commands/extension.c:298 commands/extension.c:308 +#: 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:281 +#: commands/extension.c:325 #, c-format msgid "Version names must not be empty." msgstr "バージョン名が無効です: 空であってはなりません" -#: commands/extension.c:290 +#: commands/extension.c:334 #, c-format msgid "Version names must not contain \"--\"." msgstr "バージョン名に\"--\"が含まれていてはなりません" -#: commands/extension.c:299 +#: commands/extension.c:343 #, c-format msgid "Version names must not begin or end with \"-\"." msgstr "バージョン名が\"-\"で始まったり終わったりしてはなりません" -#: commands/extension.c:309 +#: commands/extension.c:353 #, c-format msgid "Version names must not contain directory separator characters." msgstr "バージョン名にディレクトリの区切り文字が含まれていてはなりません" -#: commands/extension.c:463 +#: commands/extension.c:507 #, c-format msgid "extension \"%s\" is not available" msgstr "機能拡張\"%s\" は利用できません" -#: commands/extension.c:464 +#: commands/extension.c:508 #, c-format msgid "Could not open extension control file \"%s\": %m." msgstr "機能拡張の制御ファイル\"%s\"をオープンできませんでした: %m" -#: commands/extension.c:466 +#: 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:470 +#: commands/extension.c:514 #, c-format msgid "could not open extension control file \"%s\": %m" msgstr "機能拡張の制御ファイル\"%s\"をオープンできませんでした: %m" -#: commands/extension.c:493 commands/extension.c:503 +#: 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:525 commands/extension.c:533 commands/extension.c:541 utils/misc/guc.c:3144 +#: 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:550 +#: commands/extension.c:594 #, c-format msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\"は有効な符号化方式名ではありません" -#: commands/extension.c:564 commands/extension.c:579 +#: 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:586 +#: commands/extension.c:630 #, c-format msgid "unrecognized parameter \"%s\" in file \"%s\"" msgstr "ファイル\"%2$s\"中に認識できないパラメータ\"%1$s\"があります" -#: commands/extension.c:595 +#: commands/extension.c:639 #, c-format msgid "parameter \"schema\" cannot be specified when \"relocatable\" is true" msgstr "\"relocatable\"が真の場合はパラメータ\"schema\"は指定できません" -#: commands/extension.c:781 -#, c-format -msgid "SQL statement \"%.*s\"" -msgstr "SQL文 \"%.*s\"" - -#: commands/extension.c:810 -#, c-format -msgid "extension script file \"%s\", near line %d" -msgstr "機能拡張スクリプトファイル \"%s\"、%d 行目付近" - -#: commands/extension.c:814 -#, c-format -msgid "extension script file \"%s\"" -msgstr "機能拡張スクリプトファイル \"%s\"" - -#: commands/extension.c:926 +#: commands/extension.c:817 #, c-format msgid "transaction control statements are not allowed within an extension script" msgstr "トランザクション制御ステートメントを機能拡張スクリプトの中に書くことはできません" -#: commands/extension.c:1008 +#: commands/extension.c:897 #, c-format msgid "permission denied to create extension \"%s\"" msgstr "機能拡張\"%s\"を作成する権限がありません" -#: commands/extension.c:1011 +#: commands/extension.c:900 #, c-format msgid "Must have CREATE privilege on current database to create this extension." msgstr "この機能拡張を生成するには現在のデータベースのCREATE権限が必要です。" -#: commands/extension.c:1012 +#: commands/extension.c:901 #, c-format msgid "Must be superuser to create this extension." msgstr "この機能拡張を生成するにはスーパーユーザーである必要があります。" -#: commands/extension.c:1016 +#: commands/extension.c:905 #, c-format msgid "permission denied to update extension \"%s\"" msgstr "機能拡張\"%s\"を更新する権限がありません" -#: commands/extension.c:1019 +#: commands/extension.c:908 #, c-format msgid "Must have CREATE privilege on current database to update this extension." msgstr "この機能拡張を更新するには現在のデータベースのCREATE権限が必要です。" -#: commands/extension.c:1020 +#: commands/extension.c:909 #, c-format msgid "Must be superuser to update this extension." msgstr "この機能拡張を更新するにはスーパーユーザーである必要があります。" -#: commands/extension.c:1153 +#: commands/extension.c:1042 #, c-format msgid "invalid character in extension owner: must not contain any of \"%s\"" msgstr "機能拡張の所有者名に不正な文字: \"%s\"のいずれの文字も含むことはできません" -#: commands/extension.c:1177 commands/extension.c:1204 +#: 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:1399 +#: 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:1607 commands/extension.c:3200 +#: commands/extension.c:1496 commands/extension.c:3089 #, c-format msgid "version to install must be specified" msgstr "インストールするバージョンを指定してください" -#: commands/extension.c:1644 +#: 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:1678 +#: commands/extension.c:1567 #, c-format msgid "extension \"%s\" must be installed in schema \"%s\"" msgstr "機能拡張\"%s\"はスキーマ\"%s\"内にインストールされていなければなりません" -#: commands/extension.c:1838 +#: commands/extension.c:1727 #, c-format msgid "cyclic dependency detected between extensions \"%s\" and \"%s\"" msgstr "機能拡張\"%s\"と\"%s\"の間に循環依存関係が検出されました" -#: commands/extension.c:1843 +#: commands/extension.c:1732 #, c-format msgid "installing required extension \"%s\"" msgstr "必要な機能拡張をインストールします:\"%s\"" -#: commands/extension.c:1866 +#: commands/extension.c:1755 #, c-format msgid "required extension \"%s\" is not installed" msgstr "要求された機能拡張\"%s\"はインストールされていません" -#: commands/extension.c:1869 +#: commands/extension.c:1758 #, c-format msgid "Use CREATE EXTENSION ... CASCADE to install required extensions too." msgstr "必要な機能拡張を一緒にインストールするには CREATE EXTENSION ... CASCADE を使ってください。" -#: commands/extension.c:1904 +#: commands/extension.c:1793 #, c-format msgid "extension \"%s\" already exists, skipping" msgstr "機能拡張\"%s\"はすでに存在します、スキップします" -#: commands/extension.c:1911 +#: commands/extension.c:1800 #, c-format msgid "extension \"%s\" already exists" msgstr "機能拡張\"%s\"はすでに存在します" -#: commands/extension.c:1922 +#: commands/extension.c:1811 #, c-format msgid "nested CREATE EXTENSION is not supported" msgstr "入れ子の CREATE EXTENSION はサポートされません" -#: commands/extension.c:2086 +#: commands/extension.c:1975 #, c-format msgid "cannot drop extension \"%s\" because it is being modified" msgstr "変更されているため拡張\"%s\"を削除できません" -#: commands/extension.c:2561 +#: 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:2573 +#: commands/extension.c:2462 #, c-format msgid "OID %u does not refer to a table" msgstr "OID %u がテーブルを参照していません" -#: commands/extension.c:2578 +#: commands/extension.c:2467 #, c-format msgid "table \"%s\" is not a member of the extension being created" msgstr "テーブル\"%s\"は生成されようとしている機能拡張のメンバではありません" -#: commands/extension.c:2924 +#: 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:2965 commands/extension.c:3059 +#: 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:3022 +#: 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:3024 +#: commands/extension.c:2913 #, c-format msgid "Extension \"%s\" requests no relocation of extension \"%s\"." msgstr "機能拡張\"%s\"は機能拡張\"%s\"の再配置禁止を要求しています。" -#: commands/extension.c:3061 +#: commands/extension.c:2950 #, c-format msgid "%s is not in the extension's schema \"%s\"" msgstr "機能拡張のスキーマ\"%2$s\"に%1$sが見つかりません" -#: commands/extension.c:3122 +#: commands/extension.c:3011 #, c-format msgid "nested ALTER EXTENSION is not supported" msgstr "入れ子になった ALTER EXTENSION はサポートされていません" -#: commands/extension.c:3211 +#: commands/extension.c:3100 #, c-format msgid "version \"%s\" of extension \"%s\" is already installed" msgstr "機能拡張 \"%2$s\"のバージョン\"%1$s\"はすでにインストールされています" -#: commands/extension.c:3422 +#: commands/extension.c:3311 #, c-format msgid "cannot add an object of this type to an extension" msgstr "この型のオブジェクトは機能拡張に追加できません" -#: commands/extension.c:3520 +#: 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:3602 commands/typecmds.c:4029 utils/fmgr/funcapi.c:725 +#: 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:3644 +#: commands/extension.c:3532 #, c-format msgid "file \"%s\" is too large" msgstr "ファイル\"%s\"は大きすぎます" -#: commands/foreigncmds.c:148 commands/foreigncmds.c:157 +#: commands/foreigncmds.c:159 commands/foreigncmds.c:168 #, c-format msgid "option \"%s\" not found" msgstr "オプション\"%s\"が見つかりません" -#: commands/foreigncmds.c:167 +#: commands/foreigncmds.c:178 #, c-format msgid "option \"%s\" provided more than once" msgstr "オプション\"%s\"が2回以上指定されました" -#: commands/foreigncmds.c:221 commands/foreigncmds.c:229 +#: commands/foreigncmds.c:232 commands/foreigncmds.c:240 #, c-format msgid "permission denied to change owner of foreign-data wrapper \"%s\"" msgstr "外部データラッパー\"%s\"の所有者を変更する権限がありません" -#: commands/foreigncmds.c:223 +#: commands/foreigncmds.c:234 #, c-format msgid "Must be superuser to change owner of a foreign-data wrapper." msgstr "外部データラッパーの所有者を変更するにはスーパーユーザーである必要があります。" -#: commands/foreigncmds.c:231 +#: commands/foreigncmds.c:242 #, 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:691 +#: commands/foreigncmds.c:302 commands/foreigncmds.c:718 foreign/foreign.c:691 #, c-format msgid "foreign-data wrapper \"%s\" does not exist" msgstr "外部データラッパー\"%s\"は存在しません" -#: commands/foreigncmds.c:325 +#: commands/foreigncmds.c:336 #, c-format msgid "foreign-data wrapper with OID %u does not exist" msgstr "OID %uの外部データラッパーは存在しません" -#: commands/foreigncmds.c:462 +#: commands/foreigncmds.c:473 #, c-format msgid "foreign server with OID %u does not exist" msgstr "OID %uの外部サーバーは存在しません" -#: commands/foreigncmds.c:580 +#: commands/foreigncmds.c:591 #, c-format msgid "permission denied to create foreign-data wrapper \"%s\"" msgstr "外部データラッパー\"%s\"を作成する権限がありません" -#: commands/foreigncmds.c:582 +#: commands/foreigncmds.c:593 #, c-format msgid "Must be superuser to create a foreign-data wrapper." msgstr "外部データラッパを作成するにはスーパーユーザーである必要があります。" -#: commands/foreigncmds.c:697 +#: commands/foreigncmds.c:708 #, c-format msgid "permission denied to alter foreign-data wrapper \"%s\"" msgstr "外部データラッパー\"%s\"を変更する権限がありません" -#: commands/foreigncmds.c:699 +#: commands/foreigncmds.c:710 #, c-format msgid "Must be superuser to alter a foreign-data wrapper." msgstr "外部データラッパーを更新するにはスーパーユーザーである必要があります。" -#: commands/foreigncmds.c:730 +#: commands/foreigncmds.c:741 #, c-format msgid "changing the foreign-data wrapper handler can change behavior of existing foreign tables" msgstr "外部データラッパーのハンドラーを変更すると、既存の外部テーブルの振る舞いが変わることがあります" -#: commands/foreigncmds.c:745 +#: commands/foreigncmds.c:756 #, c-format msgid "changing the foreign-data wrapper validator can cause the options for dependent objects to become invalid" msgstr "外部データラッパーのバリデータ(検証用関数)を変更すると、それに依存するオプションが不正になる場合があります" -#: commands/foreigncmds.c:876 +#: commands/foreigncmds.c:887 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "サーバー\"%s\"はすでに存在します、スキップします" -#: commands/foreigncmds.c:1144 +#: commands/foreigncmds.c:1155 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "\"%s\"のユーザーマッピングはサーバー\"%s\"に対してすでに存在します、スキップします" -#: commands/foreigncmds.c:1154 +#: commands/foreigncmds.c:1165 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "\"%s\"のユーザーマッピングはサーバー\"%s\"に対してすでに存在します" -#: commands/foreigncmds.c:1254 commands/foreigncmds.c:1374 +#: commands/foreigncmds.c:1265 commands/foreigncmds.c:1385 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "\"%s\"のユーザーマッピングはサーバー\"%s\"に対しては存在しません" -#: commands/foreigncmds.c:1379 +#: commands/foreigncmds.c:1390 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "\"%s\"のユーザーマッピングはサーバー\"%s\"に対しては存在しません、スキップします" -#: commands/foreigncmds.c:1507 foreign/foreign.c:404 +#: commands/foreigncmds.c:1518 foreign/foreign.c:404 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "外部データラッパー\"%s\"にはハンドラがありません" -#: commands/foreigncmds.c:1513 +#: commands/foreigncmds.c:1524 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "外部データラッパー\"%s\"は IMPORT FOREIGN SCHEMA をサポートしていません" -#: commands/foreigncmds.c:1615 +#: commands/foreigncmds.c:1626 #, c-format msgid "importing foreign table \"%s\"" msgstr "外部テーブル\"%s\"をインポートします" @@ -8297,663 +8275,633 @@ msgstr "シェル型の定義を作成します" msgid "SQL function cannot accept shell type %s" msgstr "SQL関数はシェル型\"%s\"を受け付けられません" -#: commands/functioncmds.c:251 +#: commands/functioncmds.c:250 #, c-format msgid "aggregate cannot accept shell type %s" msgstr "集約はシェル型\"%s\"を受け付けられません" -#: commands/functioncmds.c:257 +#: commands/functioncmds.c:255 #, c-format msgid "argument type %s is only a shell" msgstr "引数型%sは単なるシェルです" -#: commands/functioncmds.c:268 +#: commands/functioncmds.c:265 #, c-format msgid "type %s does not exist" msgstr "型%sは存在しません" -#: commands/functioncmds.c:283 +#: 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:293 +#: commands/functioncmds.c:287 #, c-format msgid "functions cannot accept set arguments" msgstr "関数は集合を引数として受け付けられません" -#: commands/functioncmds.c:304 +#: commands/functioncmds.c:297 #, c-format msgid "VARIADIC parameter must be the last input parameter" msgstr "VARIADIC パラメータは最後の入力パラメータでなければなりません" -#: commands/functioncmds.c:325 +#: commands/functioncmds.c:317 #, c-format msgid "VARIADIC parameter must be the last parameter" msgstr "VARIADIC パラメータは最後のパラメータでなければなりません" -#: commands/functioncmds.c:351 +#: commands/functioncmds.c:342 #, c-format msgid "VARIADIC parameter must be an array" msgstr "VARIADIC パラメータは配列でなければなりません" -#: commands/functioncmds.c:397 +#: commands/functioncmds.c:387 #, c-format msgid "parameter name \"%s\" used more than once" msgstr "パラメータ\"%s\"が複数指定されました" -#: commands/functioncmds.c:416 +#: commands/functioncmds.c:405 #, c-format msgid "only input parameters can have default values" msgstr "入力パラメータのみがデフォルト値を持てます" -#: commands/functioncmds.c:432 +#: commands/functioncmds.c:420 #, c-format msgid "cannot use table references in parameter default value" msgstr "パラメータのデフォルト値としてテーブル参照を使用できません" -#: commands/functioncmds.c:457 +#: commands/functioncmds.c:444 #, c-format msgid "input parameters after one with a default value must also have defaults" msgstr "デフォルト値を持つパラメータの後にある入力パラメータは、必ずデフォルト値を持たなければなりません" -#: commands/functioncmds.c:468 +#: commands/functioncmds.c:454 #, c-format msgid "procedure OUT parameters cannot appear after one with a default value" msgstr "プロシージャの出力パラメータはデフォルト値を持つパラメータの後には置けません" -#: commands/functioncmds.c:611 commands/functioncmds.c:790 +#: commands/functioncmds.c:596 commands/functioncmds.c:775 #, c-format msgid "invalid attribute in procedure definition" msgstr "プロシージャ定義内の不正な属性" -#: commands/functioncmds.c:707 +#: commands/functioncmds.c:692 #, c-format msgid "support function %s must return type %s" msgstr "サポート関数%sは%s型を返さなければなりません" -#: commands/functioncmds.c:718 +#: commands/functioncmds.c:703 #, c-format msgid "must be superuser to specify a support function" msgstr "サポート関数を指定するにはスーパーユーザーである必要があります" -#: commands/functioncmds.c:839 commands/functioncmds.c:1442 +#: commands/functioncmds.c:824 commands/functioncmds.c:1427 #, c-format msgid "COST must be positive" msgstr "COSTは正数でなければなりません" -#: commands/functioncmds.c:847 commands/functioncmds.c:1450 +#: commands/functioncmds.c:832 commands/functioncmds.c:1435 #, c-format msgid "ROWS must be positive" msgstr "ROWSは正数でなければなりません" -#: commands/functioncmds.c:876 +#: commands/functioncmds.c:861 #, c-format msgid "no function body specified" msgstr "関数本体の指定がありません" -#: commands/functioncmds.c:881 +#: commands/functioncmds.c:866 #, c-format msgid "duplicate function body specified" msgstr "関数本体の指定が重複しています" -#: commands/functioncmds.c:886 +#: commands/functioncmds.c:871 #, c-format msgid "inline SQL function body only valid for language SQL" msgstr "インラインのSQL関数本体は言語指定がSQLの場合にのみ有効です" -#: commands/functioncmds.c:928 +#: commands/functioncmds.c:913 #, c-format msgid "SQL function with unquoted function body cannot have polymorphic arguments" msgstr "本体をクォートせずに定義するSQL関数は多態引き数を取れません" -#: commands/functioncmds.c:954 commands/functioncmds.c:973 +#: 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:1001 +#: commands/functioncmds.c:986 #, c-format msgid "only one AS item needed for language \"%s\"" msgstr "言語\"%s\"ではAS項目は1つだけ必要です" -#: commands/functioncmds.c:1106 +#: commands/functioncmds.c:1091 #, c-format msgid "no language specified" msgstr "言語が指定されていません" -#: commands/functioncmds.c:1114 commands/functioncmds.c:2132 commands/proclang.c:235 +#: 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:1116 commands/functioncmds.c:2134 +#: 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:1149 commands/functioncmds.c:1434 +#: commands/functioncmds.c:1134 commands/functioncmds.c:1419 #, c-format msgid "only superuser can define a leakproof function" msgstr "スーパーユーザーのみがリークプルーフ関数を定義することができます" -#: commands/functioncmds.c:1200 +#: commands/functioncmds.c:1185 #, c-format msgid "function result type must be %s because of OUT parameters" msgstr "OUTパラメータで定義されているため、関数の戻り値型は%sでなければなりません" -#: commands/functioncmds.c:1213 +#: commands/functioncmds.c:1198 #, c-format msgid "function result type must be specified" msgstr "関数の結果型を指定しなければなりません" -#: commands/functioncmds.c:1266 commands/functioncmds.c:1454 +#: 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:1561 +#: commands/functioncmds.c:1546 #, c-format msgid "source data type %s is a pseudo-type" msgstr "変換元データ型%sは疑似型です" -#: commands/functioncmds.c:1567 +#: commands/functioncmds.c:1552 #, c-format msgid "target data type %s is a pseudo-type" msgstr "変換先データ型%sは疑似型です" -#: commands/functioncmds.c:1591 +#: commands/functioncmds.c:1576 #, c-format msgid "cast will be ignored because the source data type is a domain" msgstr "元のデータ型がドメインであるため、キャストは無視されます" -#: commands/functioncmds.c:1596 +#: commands/functioncmds.c:1581 #, c-format msgid "cast will be ignored because the target data type is a domain" msgstr "対象のデータ型がドメインであるため、キャストは無視されます" -#: commands/functioncmds.c:1621 +#: commands/functioncmds.c:1606 #, c-format msgid "cast function must take one to three arguments" msgstr "キャスト関数の引数は1つから3つまでです" -#: commands/functioncmds.c:1627 +#: 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:1631 +#: commands/functioncmds.c:1616 #, c-format msgid "second argument of cast function must be type %s" msgstr "キャスト関数の第2引数は%s型でなければなりません" -#: commands/functioncmds.c:1636 +#: commands/functioncmds.c:1621 #, c-format msgid "third argument of cast function must be type %s" msgstr "キャスト関数の第3引数は%s型でなければなりません" -#: commands/functioncmds.c:1643 +#: 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:1654 +#: commands/functioncmds.c:1639 #, c-format msgid "cast function must not be volatile" msgstr "キャスト関数はvolatileではいけません" -#: commands/functioncmds.c:1659 +#: commands/functioncmds.c:1644 #, c-format msgid "cast function must be a normal function" msgstr "キャスト関数は通常の関数でなければなりません" -#: commands/functioncmds.c:1663 +#: commands/functioncmds.c:1648 #, c-format msgid "cast function must not return a set" msgstr "キャスト関数は集合を返してはいけません" -#: commands/functioncmds.c:1689 +#: commands/functioncmds.c:1674 #, c-format msgid "must be superuser to create a cast WITHOUT FUNCTION" msgstr "WITHOUT FUNCTION指定のキャストを作成するにはスーパーユーザーである必要があります" -#: commands/functioncmds.c:1704 +#: commands/functioncmds.c:1689 #, c-format msgid "source and target data types are not physically compatible" msgstr "変換元と変換先のデータ型の間には物理的な互換性がありません" -#: commands/functioncmds.c:1724 +#: commands/functioncmds.c:1709 #, c-format msgid "composite data types are not binary-compatible" msgstr "複合データ型がバイナリ互換ではありません" -#: commands/functioncmds.c:1730 +#: commands/functioncmds.c:1715 #, c-format msgid "array data types are not binary-compatible" msgstr "配列データ型がバイナリ互換ではありません" -#: commands/functioncmds.c:1738 +#: commands/functioncmds.c:1723 #, c-format msgid "range data types are not binary-compatible" msgstr "範囲データ型がバイナリ互換ではありません" -#: commands/functioncmds.c:1744 +#: commands/functioncmds.c:1729 #, c-format msgid "enum data types are not binary-compatible" msgstr "列挙データ型がバイナリ互換ではありません" -#: commands/functioncmds.c:1761 +#: commands/functioncmds.c:1746 #, c-format msgid "domain data types must not be marked binary-compatible" msgstr "ドメインデータ型はバイナリ互換としてマークされていてはなりません" -#: commands/functioncmds.c:1771 +#: commands/functioncmds.c:1756 #, c-format msgid "source data type and target data type are the same" msgstr "変換元と変換先のデータ型が同一です" -#: commands/functioncmds.c:1804 +#: commands/functioncmds.c:1789 #, c-format msgid "transform function must not be volatile" msgstr "変換関数はvolatileではいけません" -#: commands/functioncmds.c:1808 +#: commands/functioncmds.c:1793 #, c-format msgid "transform function must be a normal function" msgstr "変換関数は通常の関数でなければなりません" -#: commands/functioncmds.c:1812 +#: commands/functioncmds.c:1797 #, c-format msgid "transform function must not return a set" msgstr "変換関数は集合を返してはいけません" -#: commands/functioncmds.c:1816 +#: commands/functioncmds.c:1801 #, c-format msgid "transform function must take one argument" msgstr "変換関数は引数を1つとらなければなりません" -#: commands/functioncmds.c:1820 +#: commands/functioncmds.c:1805 #, c-format msgid "first argument of transform function must be type %s" msgstr "変換関数の第1引数は%s型でなければなりません" -#: commands/functioncmds.c:1859 +#: commands/functioncmds.c:1844 #, c-format msgid "data type %s is a pseudo-type" msgstr "データ型%sは擬似型です" -#: commands/functioncmds.c:1865 +#: commands/functioncmds.c:1850 #, c-format msgid "data type %s is a domain" msgstr "データ型%sはドメインです" -#: commands/functioncmds.c:1905 +#: commands/functioncmds.c:1890 #, c-format msgid "return data type of FROM SQL function must be %s" msgstr "FROM SQL関数の戻り値のデータ型は%sでなければなりません" -#: commands/functioncmds.c:1931 +#: 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:1958 +#: commands/functioncmds.c:1943 #, c-format msgid "transform for type %s language \"%s\" already exists" msgstr "型%s、言語\"%s\"の変換はすでに存在します" -#: commands/functioncmds.c:2044 +#: commands/functioncmds.c:2029 #, c-format msgid "transform for type %s language \"%s\" does not exist" msgstr "型%s、言語\"%s\"の変換は存在しません" -#: commands/functioncmds.c:2068 +#: commands/functioncmds.c:2053 #, c-format msgid "function %s already exists in schema \"%s\"" msgstr "関数%sはすでにスキーマ\"%s\"内に存在します" -#: commands/functioncmds.c:2119 +#: commands/functioncmds.c:2104 #, c-format msgid "no inline code specified" msgstr "インラインコードの指定がありません" -#: commands/functioncmds.c:2165 +#: commands/functioncmds.c:2150 #, c-format msgid "language \"%s\" does not support inline code execution" msgstr "言語\"%s\"ではインラインコード実行をサポートしていません" -#: commands/functioncmds.c:2260 +#: 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:659 +#: commands/indexcmds.c:656 #, c-format msgid "must specify at least one column" msgstr "少なくとも1つの列を指定しなければなりません" -#: commands/indexcmds.c:663 +#: commands/indexcmds.c:660 #, c-format msgid "cannot use more than %d columns in an index" msgstr "インデックスには%dを超える列を使用できません" -#: commands/indexcmds.c:712 +#: commands/indexcmds.c:703 #, c-format msgid "cannot create index on relation \"%s\"" msgstr "リレーション\"%s\"のインデックスを作成できません" -#: commands/indexcmds.c:738 +#: commands/indexcmds.c:729 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "パーティション親テーブル\"%s\"には CREATE INDEX CONCURRENTLY は実行できません" -#: commands/indexcmds.c:748 +#: commands/indexcmds.c:739 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "他のセッションの一時テーブルに対するインデックスを作成できません" -#: commands/indexcmds.c:786 commands/tablecmds.c:853 commands/tablespace.c:1178 +#: 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:818 commands/tablecmds.c:884 commands/tablecmds.c:3665 +#: 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:851 +#: commands/indexcmds.c:842 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "古いメソッド\"rtree\"をアクセスメソッド\"gist\"に置換しています" -#: commands/indexcmds.c:872 +#: commands/indexcmds.c:863 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "アクセスメソッド\"%s\"ではユニークインデックスをサポートしていません" -#: commands/indexcmds.c:877 +#: commands/indexcmds.c:868 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "アクセスメソッド\"%s\"では包含列をサポートしていません" -#: commands/indexcmds.c:882 +#: commands/indexcmds.c:873 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "アクセスメソッド\"%s\"は複数列インデックスをサポートしません" -#: commands/indexcmds.c:887 +#: commands/indexcmds.c:878 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "アクセスメソッド\"%s\"は排除制約をサポートしていません" -#: commands/indexcmds.c:892 -#, c-format -msgid "access method \"%s\" does not support WITHOUT OVERLAPS constraints" -msgstr "アクセスメソッド\"%s\"はWITHOUT OVERLAPS制約をサポートしていません" - -#: commands/indexcmds.c:1023 +#: commands/indexcmds.c:1007 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "パーティションキーはアクセスメソッド\"%s\"を使っているインデックスには適合させられません" -#: commands/indexcmds.c:1033 +#: commands/indexcmds.c:1017 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "パーティションキー定義では %s 制約はサポートしていません" -#: commands/indexcmds.c:1035 +#: commands/indexcmds.c:1019 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "%s 制約はパーティションキーが式を含む場合は使用できません" -#: commands/indexcmds.c:1085 +#: 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:1101 +#: commands/indexcmds.c:1085 #, c-format msgid "unique constraint on partitioned table must include all partitioning columns" msgstr "パーティション親テーブル上のユニーク制約はすべてのパーティショニング列を含まなければなりません" -#: commands/indexcmds.c:1102 +#: 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:1121 commands/indexcmds.c:1140 +#: commands/indexcmds.c:1105 commands/indexcmds.c:1124 #, c-format msgid "index creation on system columns is not supported" msgstr "システム列へのインデックス作成はサポートされていません" -#: commands/indexcmds.c:1372 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:1374 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:1832 +#: commands/indexcmds.c:1806 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "インデックスの述部の関数はIMMUTABLEマークが必要です" -#: commands/indexcmds.c:1929 parser/parse_utilcmd.c:2713 parser/parse_utilcmd.c:2896 +#: 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:1953 parser/parse_utilcmd.c:1965 +#: commands/indexcmds.c:1909 parser/parse_utilcmd.c:1807 #, c-format msgid "expressions are not supported in included columns" msgstr "包含列では式はサポートされません" -#: commands/indexcmds.c:1994 +#: commands/indexcmds.c:1950 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "式インデックスの関数はIMMUTABLEマークが必要です" -#: commands/indexcmds.c:2009 +#: commands/indexcmds.c:1965 #, c-format msgid "including column does not support a collation" msgstr "包含列は照合順序をサポートしません" -#: commands/indexcmds.c:2013 +#: commands/indexcmds.c:1969 #, c-format msgid "including column does not support an operator class" msgstr "包含列は演算子クラスをサポートしません" -#: commands/indexcmds.c:2017 +#: commands/indexcmds.c:1973 #, c-format msgid "including column does not support ASC/DESC options" msgstr "包含列は ASC/DESC オプションをサポートしません" -#: commands/indexcmds.c:2021 +#: commands/indexcmds.c:1977 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "包含列は NULLS FIRST/LAST オプションをサポートしません" -#: commands/indexcmds.c:2064 +#: commands/indexcmds.c:2020 #, c-format msgid "could not determine which collation to use for index expression" msgstr "インデックス式で使用する照合順序を特定できませんでした" -#: commands/indexcmds.c:2072 commands/tablecmds.c:18948 commands/typecmds.c:812 parser/parse_expr.c:2793 parser/parse_type.c:568 parser/parse_utilcmd.c:4038 utils/adt/misc.c:630 +#: 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 型では照合順序はサポートされません" -#: commands/indexcmds.c:2139 +#: commands/indexcmds.c:2095 #, c-format msgid "operator %s is not commutative" msgstr "演算子 %s は可換ではありません" -#: commands/indexcmds.c:2141 +#: commands/indexcmds.c:2097 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "排除制約で使えるのは可換演算子だけです" -#: commands/indexcmds.c:2151 +#: commands/indexcmds.c:2123 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "演算子%sは演算子族\"%s\"のメンバーではありません" -#: commands/indexcmds.c:2154 +#: 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:2203 +#: commands/indexcmds.c:2161 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "アクセスメソッド\"%s\"はASC/DESCオプションをサポートしません" -#: commands/indexcmds.c:2208 +#: 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:2252 commands/tablecmds.c:18973 commands/tablecmds.c:18979 commands/typecmds.c:2337 +#: 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 "アクセスメソッド\"%2$s\"にはデータ型%1$s用のデフォルトの演算子クラスがありません" -#: commands/indexcmds.c:2254 +#: 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:2283 commands/indexcmds.c:2291 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:2305 commands/typecmds.c:2325 +#: 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:2395 +#: commands/indexcmds.c:2353 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "データ型%sには複数のデフォルトの演算子クラスがあります" -#: commands/indexcmds.c:2444 commands/indexcmds.c:2463 executor/execReplication.c:329 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:3864 utils/adt/arrayfuncs.c:4419 utils/adt/arrayfuncs.c:6438 utils/adt/rowtypes.c:1220 -#, c-format -msgid "could not identify an equality operator for type %s" -msgstr "型%sの等価演算子を特定できませんでした" - -#: commands/indexcmds.c:2445 commands/indexcmds.c:2464 -#, c-format -msgid "could not identify an overlaps operator for type %s" -msgstr "型%sの重複検出演算子を特定できませんでした" - -#: commands/indexcmds.c:2446 commands/indexcmds.c:2465 -#, c-format -msgid "could not identify a contained-by operator for type %s" -msgstr "型%sの被包含演算子を特定できませんでした" - -#: commands/indexcmds.c:2447 commands/tablecmds.c:10018 -#, c-format -msgid "Could not translate compare type %d for operator family \"%s\", input type %s, access method \"%s\"." -msgstr "演算子ファミリー\"%2$s\"、入力型 %3$s、アクセスメソッド\"%4$s\"に対応する比較方式%1$dを変換できませんでした。" - -#: commands/indexcmds.c:2466 -#, c-format -msgid "There is no suitable operator in operator family \"%s\" for access method \"%s\"." -msgstr "アクセスメソッド\"%2$s\"に対する演算子族\"%1$s\"に適切な演算子がありません。" - -#: commands/indexcmds.c:2787 +#: commands/indexcmds.c:2681 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "認識できないREINDEXのオプション \"%s\"" -#: commands/indexcmds.c:3019 +#: commands/indexcmds.c:2913 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "テーブル\"%s\"には並行インデックス再作成が可能なインデックスがありません" -#: commands/indexcmds.c:3033 +#: commands/indexcmds.c:2927 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "テーブル\"%s\"には再構築すべきインデックスはありません" -#: commands/indexcmds.c:3080 commands/indexcmds.c:3591 commands/indexcmds.c:3721 +#: commands/indexcmds.c:2974 commands/indexcmds.c:3485 commands/indexcmds.c:3615 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "システムカタログではインデックスの並行再構築はできません" -#: commands/indexcmds.c:3104 +#: commands/indexcmds.c:2998 #, c-format msgid "can only reindex the currently open database" msgstr "現在オープンしているデータベースのみをインデックス再構築することができます" -#: commands/indexcmds.c:3196 +#: commands/indexcmds.c:3090 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "システムカタログではインデックスの並行再構築はできません、全てスキップします" -#: commands/indexcmds.c:3229 +#: commands/indexcmds.c:3123 #, c-format msgid "cannot move system relations, skipping all" msgstr "システムリレーションは移動できません、すべてスキップします" -#: commands/indexcmds.c:3275 +#: commands/indexcmds.c:3169 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "パーティションテーブル\"%s.%s\"のインデックス再構築中" -#: commands/indexcmds.c:3278 +#: commands/indexcmds.c:3172 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "パーティションインデックス\"%s.%s\"のインデックス再構築中" -#: commands/indexcmds.c:3471 commands/indexcmds.c:4363 +#: commands/indexcmds.c:3365 commands/indexcmds.c:4249 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "テーブル\"%s.%s\"のインデックス再構築が完了しました" -#: commands/indexcmds.c:3623 commands/indexcmds.c:3676 +#: commands/indexcmds.c:3517 commands/indexcmds.c:3570 #, c-format msgid "skipping reindex of invalid index \"%s.%s\"" msgstr "無効なインデックス\"%s.%s\"の再構築をスキップします" -#: commands/indexcmds.c:3626 commands/indexcmds.c:3679 +#: 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:3630 +#: commands/indexcmds.c:3524 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "排他制約インデックス\"%s.%s\"を並行再構築することはできません、スキップします " -#: commands/indexcmds.c:3786 +#: commands/indexcmds.c:3680 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "このタイプのリレーションでインデックス並列再構築はできません" -#: commands/indexcmds.c:3804 +#: commands/indexcmds.c:3698 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "テーブルスペース\"%s\"への非共有リレーションの移動はできません" -#: commands/indexcmds.c:4344 commands/indexcmds.c:4356 +#: commands/indexcmds.c:4230 commands/indexcmds.c:4242 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr " インデックス\"%s.%s\"の再構築が完了しました " -#: commands/indexcmds.c:4346 commands/indexcmds.c:4365 +#: commands/indexcmds.c:4232 commands/indexcmds.c:4251 #, c-format msgid "%s." msgstr "%s。" @@ -8963,41 +8911,36 @@ msgstr "%s。" msgid "cannot lock relation \"%s\"" msgstr "リレーション\"%s\"はロックできません" -#: commands/matview.c:208 +#: commands/matview.c:206 #, c-format msgid "CONCURRENTLY cannot be used when the materialized view is not populated" msgstr "実体化ビューにデータが投入されていない場合はCONCURRENTLYを使用することはできません" -#: commands/matview.c:214 gram.y:19114 +#: commands/matview.c:212 gram.y:18925 #, c-format msgid "%s and %s options cannot be used together" msgstr "%sオプションと%sオプションとを同時に使用することはできません" -#: commands/matview.c:273 +#: commands/matview.c:269 #, c-format msgid "cannot refresh materialized view \"%s\" concurrently" msgstr "実体化ビュー\"%s\"を平行的に最新化することはできません" -#: commands/matview.c:276 +#: 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句を持たないユニークインデックスを作成してください。" -#: commands/matview.c:682 +#: 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:684 +#: commands/matview.c:668 #, c-format msgid "Row: %s" msgstr "行: %s" -#: commands/matview.c:840 -#, c-format -msgid "could not find suitable unique index on materialized view" -msgstr "実体化ビューに適切なユニークインデックスがありませんでした" - #: commands/opclasscmds.c:124 #, c-format msgid "operator family \"%s\" does not exist for access method \"%s\"" @@ -9283,7 +9226,7 @@ msgstr "演算子の属性\"%s\"は変更できません" 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:1773 commands/tablecmds.c:2373 commands/tablecmds.c:3779 commands/tablecmds.c:6688 commands/tablecmds.c:9793 commands/tablecmds.c:18535 commands/tablecmds.c:18570 commands/trigger.c:316 commands/trigger.c:1334 commands/trigger.c:1444 rewrite/rewriteDefine.c:268 rewrite/rewriteDefine.c:779 rewrite/rewriteRemove.c:74 +#: 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\"はシステムカタログです" @@ -9323,17 +9266,17 @@ msgstr "テーブル\"%2$s\"に対するポリシ\"%1$s\"は存在しません" msgid "only USING expression allowed for SELECT, DELETE" msgstr "SELECT、DELETEにはUSING式のみが指定可能です" -#: commands/portalcmds.c:63 commands/portalcmds.c:191 commands/portalcmds.c:242 +#: 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:75 +#: commands/portalcmds.c:72 #, c-format msgid "cannot create a cursor WITH HOLD within security-restricted operation" msgstr "セキュリティー制限操作中は、WITH HOLD指定のカーソルを作成できません" -#: commands/portalcmds.c:199 commands/portalcmds.c:252 executor/execCurrent.c:70 utils/adt/xml.c:2936 utils/adt/xml.c:3106 +#: commands/portalcmds.c:189 commands/portalcmds.c:242 executor/execCurrent.c:70 utils/adt/xml.c:2949 utils/adt/xml.c:3119 #, c-format msgid "cursor \"%s\" does not exist" msgstr "カーソル\"%s\"は存在しません" @@ -9378,205 +9321,200 @@ msgstr "準備された文\"%s\"は存在しません" msgid "must be superuser to create custom procedural language" msgstr "手続き言語を生成するためにはスーパーユーザーである必要があります" -#: commands/publicationcmds.c:129 postmaster/postmaster.c:1120 postmaster/postmaster.c:1222 utils/init/miscinit.c:1867 +#: 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:148 +#: commands/publicationcmds.c:143 #, c-format msgid "unrecognized value for publication option \"%s\": \"%s\"" msgstr "パブリケーションオプション\"%s\"に対する認識できない値: \"%s\"" -#: commands/publicationcmds.c:169 +#: commands/publicationcmds.c:157 #, c-format msgid "unrecognized publication parameter: \"%s\"" msgstr "識別できないパブリケーションのパラメータ: \"%s\"" -#: commands/publicationcmds.c:210 +#: commands/publicationcmds.c:198 #, c-format msgid "no schema has been selected for CURRENT_SCHEMA" msgstr "SURRENT_SCHEMAでスキーマの選択ができませんでした" -#: commands/publicationcmds.c:534 +#: commands/publicationcmds.c:495 msgid "System columns are not allowed." msgstr "システム列は使用できません。" -#: commands/publicationcmds.c:541 commands/publicationcmds.c:546 commands/publicationcmds.c:563 +#: commands/publicationcmds.c:502 commands/publicationcmds.c:507 commands/publicationcmds.c:524 msgid "User-defined operators are not allowed." msgstr "ユーザー定義演算子は使用できません。" -#: commands/publicationcmds.c:587 +#: 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:599 +#: commands/publicationcmds.c:560 msgid "User-defined types are not allowed." msgstr "ユーザー定義型は使用できません。" -#: commands/publicationcmds.c:602 +#: commands/publicationcmds.c:563 msgid "User-defined or built-in mutable functions are not allowed." msgstr "ユーザー定義または組み込みの不変関数は使用できません。" -#: commands/publicationcmds.c:605 +#: commands/publicationcmds.c:566 msgid "User-defined collations are not allowed." msgstr "ユーザー定義照合順序は使用できません。" -#: commands/publicationcmds.c:615 +#: commands/publicationcmds.c:576 #, c-format msgid "invalid publication WHERE expression" msgstr "パブリケーションのWHERE式が不正です" -#: commands/publicationcmds.c:668 +#: commands/publicationcmds.c:629 #, c-format msgid "cannot use publication WHERE clause for relation \"%s\"" msgstr "リレーション\"%s\"に対してはパブリケーションのWHERE句は使用できません" -#: commands/publicationcmds.c:670 +#: 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:741 commands/publicationcmds.c:755 +#: 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:744 +#: 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:758 +#: commands/publicationcmds.c:719 #, c-format msgid "Column lists cannot be specified for partitioned tables when %s is false." msgstr "%sが偽のときはパーティション親テーブルに対して列リストを使用できません。" -#: commands/publicationcmds.c:795 +#: commands/publicationcmds.c:754 #, c-format msgid "must be superuser to create FOR ALL TABLES publication" msgstr "FOR ALL TABLE 指定のパブリケーションを生成するためにはスーパーユーザーである必要があります" -#: commands/publicationcmds.c:870 +#: 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:906 +#: commands/publicationcmds.c:861 #, c-format msgid "\"wal_level\" is insufficient to publish logical changes" msgstr "\"wal_level\"が論理更新情報のパブリッシュには不十分です" -#: commands/publicationcmds.c:907 +#: commands/publicationcmds.c:862 #, c-format msgid "Set \"wal_level\" to \"logical\" before creating subscriptions." msgstr "サブスクリプションを作成する前に\"wal_level\"を\"logical\"に設定にしてください。" -#: commands/publicationcmds.c:1007 commands/publicationcmds.c:1015 +#: 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:1010 +#: 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:1018 +#: 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:1339 +#: commands/publicationcmds.c:1292 #, c-format msgid "cannot add schema to publication \"%s\"" msgstr "パブリケーション\"%s\"にはスキーマは追加できません" -#: commands/publicationcmds.c:1341 +#: 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:1389 +#: commands/publicationcmds.c:1342 #, c-format msgid "must be superuser to add or set schemas" msgstr "スキーマを追加または設定するにはスーパーユーザーである必要があります" -#: commands/publicationcmds.c:1398 commands/publicationcmds.c:1406 +#: 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:1400 +#: 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:1408 +#: 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:1432 commands/publicationcmds.c:1471 commands/publicationcmds.c:2008 utils/cache/lsyscache.c:3661 +#: 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:1634 commands/publicationcmds.c:1697 +#: 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:1641 commands/publicationcmds.c:1709 +#: commands/publicationcmds.c:1594 commands/publicationcmds.c:1662 #, c-format msgid "conflicting or redundant column lists for table \"%s\"" msgstr "テーブル\"%s\"で列リストが衝突しているか重複しています" -#: commands/publicationcmds.c:1843 +#: commands/publicationcmds.c:1796 #, c-format msgid "column list must not be specified in ALTER PUBLICATION ... DROP" msgstr "ALTER PUBLICATION ... DROPでは、列リストは指定できません" -#: commands/publicationcmds.c:1855 +#: commands/publicationcmds.c:1808 #, c-format msgid "relation \"%s\" is not part of the publication" msgstr "リレーション\"%s\"はパブリケーションの一部ではありません" -#: commands/publicationcmds.c:1862 +#: commands/publicationcmds.c:1815 #, c-format msgid "cannot use a WHERE clause when removing a table from a publication" msgstr "テーブルをパブリケーションから削除する際にはWHERE句を指定できません" -#: commands/publicationcmds.c:1922 +#: commands/publicationcmds.c:1875 #, c-format msgid "tables from schema \"%s\" are not part of the publication" msgstr "スキーマ\"%s\"のテーブルはこのパブリケーションに含まれてません" -#: commands/publicationcmds.c:1965 commands/publicationcmds.c:1972 +#: commands/publicationcmds.c:1918 commands/publicationcmds.c:1925 #, c-format msgid "permission denied to change owner of publication \"%s\"" msgstr "パブリケーション\"%s\"の所有者を変更する権限がありません" -#: commands/publicationcmds.c:1967 +#: 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:1974 +#: 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:2040 +#: commands/publicationcmds.c:1993 #, c-format msgid "publication with OID %u does not exist" msgstr "OID %uのパブリケーションは存在しません" -#: commands/publicationcmds.c:2073 -#, c-format -msgid "%s requires a \"none\" or \"stored\" value" -msgstr "%sの値は\"none\"または\"stored\"である必要があります" - #: commands/schemacmds.c:109 commands/schemacmds.c:289 #, c-format msgid "unacceptable schema name \"%s\"" @@ -9733,12 +9671,12 @@ msgstr "シーケンスは関連するテーブルと同じスキーマでなけ msgid "cannot change ownership of identity sequence" msgstr "識別シーケンスの所有者は変更できません" -#: commands/sequence.c:1671 commands/tablecmds.c:15118 commands/tablecmds.c:17944 +#: 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:106 commands/statscmds.c:115 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で指定可能なリレーションは一つのみです" @@ -9803,12 +9741,12 @@ msgstr "定形情報定義中の列名が重複しています" msgid "duplicate expression in statistics definition" msgstr "統計情報定義内に重複した式" -#: commands/statscmds.c:628 commands/tablecmds.c:8701 +#: commands/statscmds.c:628 commands/tablecmds.c:8653 #, c-format msgid "statistics target %d is too low" msgstr "統計情報目標%dは小さすぎます" -#: commands/statscmds.c:636 commands/tablecmds.c:8709 +#: commands/statscmds.c:636 commands/tablecmds.c:8661 #, c-format msgid "lowering statistics target to %d" msgstr "統計情報目標を%dに減らします" @@ -9818,1775 +9756,1690 @@ msgstr "統計情報目標を%dに減らします" msgid "statistics object \"%s.%s\" does not exist, skipping" msgstr "統計情報オブジェクト\"%s.%s\"は存在しません、スキップします" -#: commands/subscriptioncmds.c:331 replication/pgoutput/pgoutput.c:406 +#: 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 "識別できないoriginの値: \"%s\"" -#: commands/subscriptioncmds.c:354 +#: commands/subscriptioncmds.c:363 #, c-format msgid "invalid WAL location (LSN): %s" msgstr "不正なWAL位置(LSN): %s" -#: commands/subscriptioncmds.c:363 -#, c-format -msgid "unrecognized subscription parameter: \"%s\"" -msgstr "認識できないサブスクリプションパラメータ: \"%s\"" - #. translator: both %s are strings of the form "option = value" -#: commands/subscriptioncmds.c:378 commands/subscriptioncmds.c:385 commands/subscriptioncmds.c:392 commands/subscriptioncmds.c:414 commands/subscriptioncmds.c:430 +#: 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:420 commands/subscriptioncmds.c:436 +#: commands/subscriptioncmds.c:429 commands/subscriptioncmds.c:445 #, c-format msgid "subscription with %s must also set %s" msgstr "%s としたサブスクリプションでは %s を設定する必要があります" -#: commands/subscriptioncmds.c:466 +#: commands/subscriptioncmds.c:506 #, c-format msgid "could not receive list of publications from the publisher: %s" msgstr "パブリケーション一覧をパブリッシャから受け取れませんでした: %s" -#: commands/subscriptioncmds.c:498 +#: 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:586 +#: commands/subscriptioncmds.c:626 #, c-format msgid "permission denied to create subscription" msgstr "サブスクリプションを作成する権限がありません" -#: commands/subscriptioncmds.c:587 +#: commands/subscriptioncmds.c:627 #, c-format msgid "Only roles with privileges of the \"%s\" role may create subscriptions." msgstr "\"%s\"ロールの権限を持つロールのみがサブスクリプションを作成できます。" -#: commands/subscriptioncmds.c:718 commands/subscriptioncmds.c:852 commands/subscriptioncmds.c:1594 +#: 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 "subscription \"%s\" could not connect to the publisher: %s" -msgstr "サブスクリプション\"%s\"はパブリッシャに接続できませんでした: %s" +msgid "could not connect to the publisher: %s" +msgstr "パブリッシャに接続できませんでした: %s" -#: commands/subscriptioncmds.c:790 +#: commands/subscriptioncmds.c:829 #, c-format msgid "created replication slot \"%s\" on publisher" msgstr "パブリッシャ上でレプリケーションスロット\"%s\"を作成しました" -#: commands/subscriptioncmds.c:802 +#: commands/subscriptioncmds.c:841 #, c-format msgid "subscription was created, but is not connected" msgstr "サブスクリプションは作成されましたが接続されていません" -#: commands/subscriptioncmds.c:803 +#: 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:1070 -#, c-format -msgid "cannot set option \"%s\" for enabled subscription" -msgstr "有効にされているサブスクリプションにはオプション”%s”を指定できません" - -#: commands/subscriptioncmds.c:1084 -#, c-format -msgid "cannot set option \"%s\" for a subscription that does not have a slot name" -msgstr "スロット名を指定されていないサブスクリプションのオプション\"%s\"を設定することはできません" - -#: commands/subscriptioncmds.c:1127 commands/subscriptioncmds.c:1663 commands/subscriptioncmds.c:2044 utils/cache/lsyscache.c:3711 +#: 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:1185 +#: commands/subscriptioncmds.c:1166 commands/subscriptioncmds.c:1245 #, c-format msgid "cannot set %s for enabled subscription" msgstr "有効にされているサブスクリプションには %s を指定できません" -#: commands/subscriptioncmds.c:1270 -#, c-format -msgid "slot_name and two_phase cannot be altered at the same time" -msgstr "slot_nameとtwo_phaseは同時に変更できません" - -#: commands/subscriptioncmds.c:1286 -#, c-format -msgid "cannot alter two_phase when logical replication worker is still running" -msgstr "論理レプリケーションワーカーがまだ実行中のためtwo_phaseは変更できません" - -#: commands/subscriptioncmds.c:1287 +#: commands/subscriptioncmds.c:1233 #, c-format -msgid "Try again after some time." -msgstr "少し待ってから再試行してください。" - -#: commands/subscriptioncmds.c:1300 -#, c-format -msgid "cannot disable two_phase when prepared transactions are present" -msgstr "準備済みトランザクションが存在するためtwo_phaseを無効にできません" - -#: commands/subscriptioncmds.c:1301 -#, c-format -msgid "Resolve these transactions and try again." -msgstr "トランザクションの解決後に再試行してください。" +msgid "cannot set option \"%s\" for a subscription that does not have a slot name" +msgstr "スロット名を指定されていないサブスクリプションのオプション\"%s\"を設定することはできません" -#: commands/subscriptioncmds.c:1348 +#: commands/subscriptioncmds.c:1279 #, c-format msgid "cannot enable subscription that does not have a slot name" msgstr "スロット名を指定されていないサブスクリプションを有効にはできません" -#: commands/subscriptioncmds.c:1392 commands/subscriptioncmds.c:1443 +#: 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:1393 +#: 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:1402 commands/subscriptioncmds.c:1457 +#: 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:1403 +#: 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:1459 +#: 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:1481 +#: commands/subscriptioncmds.c:1412 #, c-format msgid "ALTER SUBSCRIPTION ... REFRESH is not allowed for disabled subscriptions" msgstr "ALTER SUBSCRIPTION ... REFRESHは無効化されているサブスクリプションには実行できません" -#: commands/subscriptioncmds.c:1506 +#: 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:1507 +#: 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:1542 +#: 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:1667 +#: commands/subscriptioncmds.c:1594 #, c-format msgid "subscription \"%s\" does not exist, skipping" msgstr "サブスクリプション\"%s\"は存在しません、スキップします" -#: commands/subscriptioncmds.c:1934 +#: commands/subscriptioncmds.c:1863 #, c-format msgid "dropped replication slot \"%s\" on publisher" msgstr "パブリッシャ上でレプリケーションスロット\"%s\"を削除しました" -#: commands/subscriptioncmds.c:1943 commands/subscriptioncmds.c:1951 +#: 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:2076 +#: commands/subscriptioncmds.c:2005 #, c-format msgid "subscription with OID %u does not exist" msgstr "OID %uのサブスクリプションは存在しません" -#: commands/subscriptioncmds.c:2147 commands/subscriptioncmds.c:2271 +#: 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:2183 +#: 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:2185 +#: 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)をサブスクライブします" -#: commands/subscriptioncmds.c:2188 +#: 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:2293 replication/logical/tablesync.c:905 replication/pgoutput/pgoutput.c:1155 +#: 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:2343 +#: 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:2346 +#: commands/subscriptioncmds.c:2279 #, 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:2377 +#: commands/subscriptioncmds.c:2310 #, c-format msgid "publication name \"%s\" used more than once" msgstr "パブリケーション名\"%s\"が2回以上使われています" -#: commands/subscriptioncmds.c:2421 +#: commands/subscriptioncmds.c:2354 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "パブリケーション\"%s\"はサブスクリプション\"%s\"にすでに存在します" -#: commands/subscriptioncmds.c:2435 +#: commands/subscriptioncmds.c:2368 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "パブリケーション\"%s\"はサブスクリプション\"%s\"にはありません" -#: commands/subscriptioncmds.c:2446 +#: commands/subscriptioncmds.c:2379 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "サブスクリプションからすべてのパブリケーションを削除することはできません" -#: commands/subscriptioncmds.c:2503 +#: commands/subscriptioncmds.c:2436 #, c-format msgid "%s requires a Boolean value or \"parallel\"" msgstr "パラメータ\"%s\"はBoolean値または\"parallel\"のみを取ります" -#: commands/tablecmds.c:258 commands/tablecmds.c:300 +#: commands/tablecmds.c:255 commands/tablecmds.c:297 #, c-format msgid "table \"%s\" does not exist" msgstr "テーブル\"%s\"は存在しません" -#: commands/tablecmds.c:259 commands/tablecmds.c:301 +#: commands/tablecmds.c:256 commands/tablecmds.c:298 #, c-format msgid "table \"%s\" does not exist, skipping" msgstr "テーブル\"%s\"は存在しません、スキップします" -#: commands/tablecmds.c:261 commands/tablecmds.c:303 +#: commands/tablecmds.c:258 commands/tablecmds.c:300 msgid "Use DROP TABLE to remove a table." msgstr "テーブルを削除するにはDROP TABLEを使用してください。" -#: commands/tablecmds.c:264 +#: commands/tablecmds.c:261 #, c-format msgid "sequence \"%s\" does not exist" msgstr "シーケンス\"%s\"は存在しません" -#: commands/tablecmds.c:265 +#: commands/tablecmds.c:262 #, c-format msgid "sequence \"%s\" does not exist, skipping" msgstr "シーケンス\"%s\"は存在しません、スキップします" -#: commands/tablecmds.c:267 +#: commands/tablecmds.c:264 msgid "Use DROP SEQUENCE to remove a sequence." msgstr "シーケンスを削除するにはDROP SEQUENCEを使用してください。" -#: commands/tablecmds.c:270 +#: commands/tablecmds.c:267 #, c-format msgid "view \"%s\" does not exist" msgstr "ビュー\"%s\"は存在しません" -#: commands/tablecmds.c:271 +#: commands/tablecmds.c:268 #, c-format msgid "view \"%s\" does not exist, skipping" msgstr "ビュー\"%s\"は存在しません、スキップします" -#: commands/tablecmds.c:273 +#: commands/tablecmds.c:270 msgid "Use DROP VIEW to remove a view." msgstr "ビューを削除するにはDROP VIEWを使用してください。" -#: commands/tablecmds.c:276 +#: commands/tablecmds.c:273 #, c-format msgid "materialized view \"%s\" does not exist" msgstr "実体化ビュー\"%s\"は存在しません" -#: commands/tablecmds.c:277 +#: commands/tablecmds.c:274 #, c-format msgid "materialized view \"%s\" does not exist, skipping" msgstr "実体化ビュー\"%s\"は存在しません、スキップします" -#: commands/tablecmds.c:279 +#: commands/tablecmds.c:276 msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "実体化ビューを削除するにはDROP MATERIALIZED VIEWを使用してください。" -#: commands/tablecmds.c:282 commands/tablecmds.c:306 commands/tablecmds.c:20584 parser/parse_utilcmd.c:2405 +#: commands/tablecmds.c:279 commands/tablecmds.c:303 commands/tablecmds.c:19854 parser/parse_utilcmd.c:2251 #, c-format msgid "index \"%s\" does not exist" msgstr "インデックス\"%s\"は存在しません" -#: commands/tablecmds.c:283 commands/tablecmds.c:307 +#: commands/tablecmds.c:280 commands/tablecmds.c:304 #, c-format msgid "index \"%s\" does not exist, skipping" msgstr "インデックス\"%s\"は存在しません、スキップします" -#: commands/tablecmds.c:285 commands/tablecmds.c:309 +#: commands/tablecmds.c:282 commands/tablecmds.c:306 msgid "Use DROP INDEX to remove an index." msgstr "インデックスを削除するにはDROP INDEXを使用してください" -#: commands/tablecmds.c:290 +#: commands/tablecmds.c:287 #, c-format msgid "\"%s\" is not a type" msgstr "\"%s\"は型ではありません" -#: commands/tablecmds.c:291 +#: commands/tablecmds.c:288 msgid "Use DROP TYPE to remove a type." msgstr "型を削除するにはDROP TYPEを使用してください" -#: commands/tablecmds.c:294 commands/tablecmds.c:14957 commands/tablecmds.c:17646 +#: 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:295 +#: commands/tablecmds.c:292 #, c-format msgid "foreign table \"%s\" does not exist, skipping" msgstr "外部テーブル\"%s\"は存在しません、スキップします" -#: commands/tablecmds.c:297 +#: commands/tablecmds.c:294 msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "外部テーブルを削除するには DROP FOREIGN TABLE を使用してください。" -#: commands/tablecmds.c:763 +#: commands/tablecmds.c:734 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMITは一時テーブルでのみ使用できます" -#: commands/tablecmds.c:780 -#, c-format -msgid "partitioned tables cannot be unlogged" -msgstr "パーティションテーブルはログ非取得にはできません" - -#: commands/tablecmds.c:800 +#: commands/tablecmds.c:765 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "セキュリティー制限操作中は、一時テーブルを作成できません" -#: commands/tablecmds.c:836 commands/tablecmds.c:16378 +#: 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:1106 +#: commands/tablecmds.c:1067 #, c-format msgid "\"%s\" is not partitioned" msgstr "\"%s\"はパーティションされていません" -#: commands/tablecmds.c:1200 +#: commands/tablecmds.c:1161 #, c-format msgid "cannot partition using more than %d columns" msgstr "%d以上の列を使ったパーティションはできません" -#: commands/tablecmds.c:1256 +#: commands/tablecmds.c:1217 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "パーティションテーブル\"%s\"では外部子テーブルを作成できません" -#: commands/tablecmds.c:1258 +#: commands/tablecmds.c:1219 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "テーブル\"%s\"はユニークインデックスを持っています" -#: commands/tablecmds.c:1388 commands/tablecmds.c:13957 +#: commands/tablecmds.c:1338 commands/tablecmds.c:13382 #, c-format msgid "too many array dimensions" msgstr "配列の次元多すぎます" -#: commands/tablecmds.c:1393 parser/parse_clause.c:772 parser/parse_relation.c:1925 +#: 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:1522 +#: commands/tablecmds.c:1489 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLYは複数オブジェクトの削除をサポートしていません" -#: commands/tablecmds.c:1526 +#: commands/tablecmds.c:1493 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLYはCASCADEをサポートしません" -#: commands/tablecmds.c:1630 +#: commands/tablecmds.c:1597 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "パーティション親インデックス\"%s\"は並行的に削除することはできません" -#: commands/tablecmds.c:1918 +#: commands/tablecmds.c:1885 #, c-format msgid "cannot truncate only a partitioned table" msgstr "パーティションの親テーブルのみの切り詰めはできません" -#: commands/tablecmds.c:1919 +#: 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:1992 +#: commands/tablecmds.c:1959 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "テーブル\"%s\"へのカスケードを削除します" -#: commands/tablecmds.c:2353 +#: commands/tablecmds.c:2320 #, c-format msgid "cannot truncate foreign table \"%s\"" msgstr "外部テーブル\"%s\"の切り詰めはできません" -#: commands/tablecmds.c:2410 +#: commands/tablecmds.c:2377 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "他のセッションの一時テーブルを削除できません" -#: commands/tablecmds.c:2648 commands/tablecmds.c:16275 +#: commands/tablecmds.c:2606 commands/tablecmds.c:15683 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "パーティション親テーブル\"%s\"からの継承はできません" -#: commands/tablecmds.c:2653 +#: commands/tablecmds.c:2611 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "パーティション子テーブル\"%s\"からの継承はできません" -#: commands/tablecmds.c:2661 parser/parse_utilcmd.c:2677 parser/parse_utilcmd.c:2865 +#: 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:2673 +#: commands/tablecmds.c:2631 #, c-format msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" msgstr "一時リレーションを永続リレーション\"%s\"のパーティション子テーブルとして作ることはできません" -#: commands/tablecmds.c:2682 commands/tablecmds.c:16254 +#: commands/tablecmds.c:2640 commands/tablecmds.c:15662 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "一時リレーション\"%s\"から継承することはできません" -#: commands/tablecmds.c:2692 commands/tablecmds.c:16262 +#: commands/tablecmds.c:2650 commands/tablecmds.c:15670 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "他のセッションの一時リレーションから継承することはできません" -#: commands/tablecmds.c:2847 commands/tablecmds.c:2901 commands/tablecmds.c:13640 parser/parse_utilcmd.c:1417 parser/parse_utilcmd.c:1462 parser/parse_utilcmd.c:1893 parser/parse_utilcmd.c:2001 +#: 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 "cannot convert whole-row table reference" msgstr "行全体テーブル参照を変換できません" -#: commands/tablecmds.c:2848 parser/parse_utilcmd.c:1418 +#: commands/tablecmds.c:2792 parser/parse_utilcmd.c:1266 #, c-format msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." msgstr "制約\"%s\"はテーブル\"%s\"への行全体参照を含みます。" -#: commands/tablecmds.c:2902 parser/parse_utilcmd.c:1463 +#: commands/tablecmds.c:2846 parser/parse_utilcmd.c:1309 #, c-format msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." msgstr "制約\"%s\"はテーブル\"%s\"への行全体参照を含みます。" -#: commands/tablecmds.c:3024 commands/tablecmds.c:3309 +#: commands/tablecmds.c:2956 commands/tablecmds.c:3227 #, c-format msgid "column \"%s\" inherits from generated column but specifies default" msgstr "列\"%s\"は生成列を継承しますが、default 指定がされています" -#: commands/tablecmds.c:3029 commands/tablecmds.c:3314 +#: commands/tablecmds.c:2961 commands/tablecmds.c:3232 #, c-format msgid "column \"%s\" inherits from generated column but specifies identity" msgstr "列\"%s\"は生成列を継承しますが、識別列と指定されています" -#: commands/tablecmds.c:3037 commands/tablecmds.c:3322 +#: commands/tablecmds.c:2969 commands/tablecmds.c:3240 #, c-format msgid "child column \"%s\" specifies generation expression" msgstr "子テーブルの列\"%s\"は生成式を指定しています" -#: commands/tablecmds.c:3039 commands/tablecmds.c:3324 +#: commands/tablecmds.c:2971 commands/tablecmds.c:3242 #, c-format msgid "A child table column cannot be generated unless its parent column is." msgstr "子テーブルの列は、親となる列が生成列でなければ生成列にはできません。" -#: commands/tablecmds.c:3085 +#: commands/tablecmds.c:3017 #, c-format msgid "column \"%s\" inherits conflicting generation expressions" msgstr "列\"%s\"は競合する生成式を継承します" -#: commands/tablecmds.c:3087 +#: commands/tablecmds.c:3019 #, c-format msgid "To resolve the conflict, specify a generation expression explicitly." msgstr "この競合を解消するには明示的に生成式を指定してください。" -#: commands/tablecmds.c:3091 +#: commands/tablecmds.c:3023 #, c-format msgid "column \"%s\" inherits conflicting default values" msgstr "列\"%s\"は競合するデフォルト値を継承します" -#: commands/tablecmds.c:3093 +#: commands/tablecmds.c:3025 #, c-format msgid "To resolve the conflict, specify a default explicitly." msgstr "競合を解消するには明示的にデフォルトを指定してください" -#: commands/tablecmds.c:3160 +#: commands/tablecmds.c:3080 #, c-format msgid "check constraint name \"%s\" appears multiple times but with different expressions" msgstr "異なる式を持つ検査制約名\"%s\"が複数あります。" -#: commands/tablecmds.c:3213 +#: commands/tablecmds.c:3131 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "継承される定義で列\"%s\"をマージしています" -#: commands/tablecmds.c:3217 +#: commands/tablecmds.c:3135 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "継承される定義で列\"%s\"を移動してマージします" -#: commands/tablecmds.c:3218 +#: commands/tablecmds.c:3136 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "ユーザーが指定した列が継承した列の位置に移動されました。" -#: commands/tablecmds.c:3230 +#: commands/tablecmds.c:3148 #, c-format msgid "column \"%s\" has a type conflict" msgstr "列\"%s\"の型が競合しています" -#: commands/tablecmds.c:3232 commands/tablecmds.c:3266 commands/tablecmds.c:3282 commands/tablecmds.c:3389 commands/tablecmds.c:3417 commands/tablecmds.c:3433 parser/parse_coerce.c:2190 parser/parse_coerce.c:2210 parser/parse_coerce.c:2230 parser/parse_coerce.c:2251 parser/parse_coerce.c:2306 parser/parse_coerce.c:2340 parser/parse_coerce.c:2416 parser/parse_coerce.c:2447 parser/parse_coerce.c:2486 parser/parse_coerce.c:2553 parser/parse_param.c:224 +#: 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対%s" -#: commands/tablecmds.c:3244 +#: commands/tablecmds.c:3162 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "列\"%s\"の照合順序が競合しています" -#: commands/tablecmds.c:3246 commands/tablecmds.c:3403 commands/tablecmds.c:7172 +#: commands/tablecmds.c:3164 commands/tablecmds.c:3326 commands/tablecmds.c:7080 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "\"%s\"対\"%s\"" -#: commands/tablecmds.c:3264 +#: commands/tablecmds.c:3182 #, c-format msgid "column \"%s\" has a storage parameter conflict" msgstr "列\"%s\"でストレージパラメータが競合しています" -#: commands/tablecmds.c:3280 commands/tablecmds.c:3431 +#: commands/tablecmds.c:3198 commands/tablecmds.c:3354 #, c-format msgid "column \"%s\" has a compression method conflict" msgstr "列\"%s\"で圧縮方式が競合しています" -#: commands/tablecmds.c:3375 +#: commands/tablecmds.c:3293 #, c-format msgid "merging multiple inherited definitions of column \"%s\"" msgstr "複数の継承される列\"%s\"の定義をマージしています" -#: commands/tablecmds.c:3387 +#: commands/tablecmds.c:3305 #, c-format msgid "inherited column \"%s\" has a type conflict" msgstr "継承される列\"%s\"の型が競合しています" -#: commands/tablecmds.c:3401 +#: commands/tablecmds.c:3324 #, c-format msgid "inherited column \"%s\" has a collation conflict" msgstr "継承される列 \"%s\"の照合順序が競合しています" -#: commands/tablecmds.c:3415 +#: commands/tablecmds.c:3338 #, c-format msgid "inherited column \"%s\" has a storage parameter conflict" msgstr "継承される列\"%s\"でストレージパラメータが競合しています" -#: commands/tablecmds.c:3443 +#: commands/tablecmds.c:3366 #, c-format msgid "inherited column \"%s\" has a generation conflict" msgstr "継承された列 \"%s\"の生成が競合しています" -#: commands/tablecmds.c:3674 +#: commands/tablecmds.c:3597 #, c-format msgid "cannot move temporary tables of other sessions" msgstr "他のセッションの一時テーブルを移動できません" -#: commands/tablecmds.c:3747 +#: commands/tablecmds.c:3670 #, c-format msgid "cannot rename column of typed table" msgstr "型付けされたテーブルの列をリネームできません" -#: commands/tablecmds.c:3766 +#: commands/tablecmds.c:3689 #, c-format msgid "cannot rename columns of relation \"%s\"" msgstr "リレーション\"%s\"の列名は変更できません" -#: commands/tablecmds.c:3861 +#: commands/tablecmds.c:3784 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "継承される列\"%s\"の名前を子テーブルでも変更する必要があります" -#: commands/tablecmds.c:3893 +#: commands/tablecmds.c:3816 #, c-format msgid "cannot rename system column \"%s\"" msgstr "システム列%s\"の名前を変更できません" -#: commands/tablecmds.c:3908 +#: commands/tablecmds.c:3831 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "継承される列\"%s\"の名前を変更できません" -#: commands/tablecmds.c:4063 +#: commands/tablecmds.c:3983 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "継承される制約\"%s\"の名前を子テーブルでも変更する必要があります" -#: commands/tablecmds.c:4070 +#: 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:4370 +#: 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:4379 +#: commands/tablecmds.c:4299 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" msgstr "保留中のトリガイベントがあるため\"%2$s\"を%1$sできません" -#: commands/tablecmds.c:4405 +#: commands/tablecmds.c:4325 #, c-format msgid "cannot alter temporary tables of other sessions" msgstr "他のセッションの一時テーブルは変更できません" -#: commands/tablecmds.c:4869 +#: commands/tablecmds.c:4798 #, c-format msgid "cannot alter partition \"%s\" with an incomplete detach" msgstr "パーティション子テーブル\"%s\"は不完全な取り外し状態であるため変更できません" -#: commands/tablecmds.c:5098 +#: commands/tablecmds.c:5002 commands/tablecmds.c:5017 #, c-format msgid "cannot change persistence setting twice" msgstr "永続性設定の変更は2度はできません" -#: commands/tablecmds.c:5115 +#: commands/tablecmds.c:5038 #, c-format msgid "cannot have multiple SET ACCESS METHOD subcommands" msgstr "SET ACCESS METHODサブコマンドを複数指定できません" -#: commands/tablecmds.c:5845 +#: commands/tablecmds.c:5768 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "システムリレーション\"%sを書き換えられません" -#: commands/tablecmds.c:5851 +#: commands/tablecmds.c:5774 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "カタログテーブルとして使用されているテーブル\"%s\"は書き換えられません" -#: commands/tablecmds.c:5863 +#: commands/tablecmds.c:5786 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "他のセッションの一時テーブルを書き換えられません" -#: commands/tablecmds.c:6363 +#: commands/tablecmds.c:6281 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "リレーション\"%2$s\"の列\"%1$s\"にNULL値があります" -#: commands/tablecmds.c:6380 +#: 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:6400 partitioning/partbounds.c:3387 +#: 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:6406 +#: 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:6671 +#: commands/tablecmds.c:6588 #, c-format msgid "ALTER action %s cannot be performed on relation \"%s\"" msgstr "ALTERのアクション%sはリレーション\"%s\"では実行できません" -#: commands/tablecmds.c:6926 commands/tablecmds.c:6933 +#: 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:6940 +#: 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:6947 +#: 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:7003 +#: 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:7005 +#: commands/tablecmds.c:6922 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "型付けされたテーブルを変更する場合も ALTER .. CASCADE を使用してください" -#: commands/tablecmds.c:7051 -#, c-format -msgid "type %s is the row type of another table" -msgstr "型\"%s\"は他のテーブルの行型です" - -#: commands/tablecmds.c:7053 -#, c-format -msgid "A typed table must use a stand-alone composite type created with CREATE TYPE." -msgstr "型付きテーブルは、CREATE TYPEで作成された独立した複合型を使用する必要があります。" - -#: commands/tablecmds.c:7058 +#: commands/tablecmds.c:6968 #, c-format msgid "type %s is not a composite type" msgstr "型 %s は複合型ではありません" -#: commands/tablecmds.c:7085 +#: commands/tablecmds.c:6995 #, c-format msgid "cannot add column to typed table" msgstr "型付けされたテーブルに列を追加できません" -#: commands/tablecmds.c:7135 +#: commands/tablecmds.c:7043 #, c-format msgid "cannot add column to a partition" msgstr "パーティションに列は追加できません" -#: commands/tablecmds.c:7164 commands/tablecmds.c:16496 +#: 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:7170 commands/tablecmds.c:16502 +#: 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:7188 +#: commands/tablecmds.c:7096 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "子\"%2$s\"の列\"%1$s\"の定義をマージしています" -#: commands/tablecmds.c:7241 +#: commands/tablecmds.c:7149 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "子テーブルを持つテーブルに識別列を再帰的に追加することはできません" -#: commands/tablecmds.c:7455 +#: commands/tablecmds.c:7395 #, c-format msgid "column must be added to child tables too" msgstr "列は子テーブルでも追加する必要があります" -#: commands/tablecmds.c:7533 +#: commands/tablecmds.c:7473 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "リレーション\"%2$s\"の列\"%1$s\"はすでに存在します、スキップします" -#: commands/tablecmds.c:7540 +#: commands/tablecmds.c:7480 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "リレーション\"%2$s\"の列\"%1$s\"はすでに存在します" -#: commands/tablecmds.c:7631 commands/tablecmds.c:7785 commands/tablecmds.c:7977 commands/tablecmds.c:8109 commands/tablecmds.c:8238 commands/tablecmds.c:8332 commands/tablecmds.c:8433 commands/tablecmds.c:8590 commands/tablecmds.c:8743 commands/tablecmds.c:8824 commands/tablecmds.c:8958 commands/tablecmds.c:13420 commands/tablecmds.c:14980 commands/tablecmds.c:17735 +#: commands/tablecmds.c:7546 commands/tablecmds.c:12693 +#, c-format +msgid "cannot remove constraint from only the partitioned table when partitions exist" +msgstr "子テーブルが存在する場合にはパーティション親テーブルのみから制約を削除することはできません" + +#: 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: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:7637 commands/tablecmds.c:7983 commands/tablecmds.c:13181 +#: 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:7654 +#: commands/tablecmds.c:7630 #, c-format -msgid "column \"%s\" is marked NOT NULL in parent table" -msgstr "列\"%s\"は親テーブルでNOT NULL指定されています" +msgid "column \"%s\" is in a primary key" +msgstr "列\"%s\"はプライマリキーで使用しています" + +#: commands/tablecmds.c:7635 +#, c-format +msgid "column \"%s\" is in index used as replica identity" +msgstr "列\"%s\"は複製識別として使用中のインデックスに含まれています" + +#: commands/tablecmds.c:7658 +#, c-format +msgid "column \"%s\" is marked NOT NULL in parent table" +msgstr "列\"%s\"は親テーブルでNOT NULL指定されています" -#: commands/tablecmds.c:7854 commands/tablecmds.c:9692 +#: commands/tablecmds.c:7858 commands/tablecmds.c:9566 #, c-format msgid "constraint must be added to child tables too" msgstr "制約は子テーブルにも追加する必要があります" -#: commands/tablecmds.c:7855 commands/tablecmds.c:8087 commands/tablecmds.c:8194 commands/tablecmds.c:8311 commands/tablecmds.c:9131 +#: commands/tablecmds.c:7859 #, c-format -msgid "Do not specify the ONLY keyword." -msgstr "ONLYキーワードを指定しないでください。" +msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." +msgstr "リレーション\"%2$s\"の列\"%1$s\"はすでにNOT NULLではありません。" -#: commands/tablecmds.c:7992 +#: commands/tablecmds.c:7944 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "リレーション\"%2$s\"の列\"%1$s\"は生成カラムです" -#: commands/tablecmds.c:8086 +#: commands/tablecmds.c:8038 #, c-format msgid "cannot add identity to a column of only the partitioned table" msgstr "パーティション親テーブルのみで列を識別列とすることはできません" -#: commands/tablecmds.c:8092 +#: commands/tablecmds.c:8044 #, c-format msgid "cannot add identity to a column of a partition" msgstr "パーティション子テーブルの列を識別列とすることはできません" -#: commands/tablecmds.c:8120 +#: 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:8126 +#: 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:8132 +#: 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:8193 +#: commands/tablecmds.c:8145 #, c-format msgid "cannot change identity column of only the partitioned table" msgstr "パーティション親テーブルのみで列の識別列属性を変更することはできません" -#: commands/tablecmds.c:8199 +#: commands/tablecmds.c:8151 #, c-format msgid "cannot change identity column of a partition" msgstr "パーティション子テーブルの列の識別列属性を変更することはできません" -#: commands/tablecmds.c:8244 commands/tablecmds.c:8340 +#: 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:8310 +#: commands/tablecmds.c:8262 #, c-format msgid "cannot drop identity from a column of only the partitioned table" msgstr "パーティション親テーブルのみで列の識別列属性を削除することはできません" -#: commands/tablecmds.c:8316 +#: commands/tablecmds.c:8268 #, c-format msgid "cannot drop identity from a column of a partition" msgstr "パーティション子テーブルの列の識別列属性を削除することはできません" -#: commands/tablecmds.c:8345 +#: 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:8439 +#: 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:8537 +#: 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:8559 +#: commands/tablecmds.c:8511 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "継承列から生成式を削除することはできません" -#: commands/tablecmds.c:8598 +#: 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:8603 +#: 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:8681 +#: commands/tablecmds.c:8633 #, c-format msgid "cannot refer to non-index column by number" msgstr "非インデックス列を番号で参照することはできません" -#: commands/tablecmds.c:8733 +#: commands/tablecmds.c:8685 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "リレーション \"%2$s\"の列 %1$d は存在しません" -#: commands/tablecmds.c:8752 +#: 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:8757 +#: 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:8759 +#: commands/tablecmds.c:8711 #, c-format msgid "Alter statistics on table column instead." msgstr "代わりにテーブルカラムの統計情報を変更してください。" -#: commands/tablecmds.c:9005 +#: commands/tablecmds.c:8957 #, c-format msgid "cannot drop column from typed table" msgstr "型付けされたテーブルから列を削除できません" -#: commands/tablecmds.c:9069 +#: commands/tablecmds.c:9020 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "リレーション\"%2$s\"の列\"%1$s\"は存在しません、スキップします" -#: commands/tablecmds.c:9082 +#: commands/tablecmds.c:9033 #, c-format msgid "cannot drop system column \"%s\"" msgstr "システム列\"%s\"を削除できません" -#: commands/tablecmds.c:9092 +#: commands/tablecmds.c:9043 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "継承される列\"%s\"を削除できません" -#: commands/tablecmds.c:9105 +#: 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:9130 +#: commands/tablecmds.c:9081 #, c-format msgid "cannot drop column from only the partitioned table when partitions exist" msgstr "子テーブルが存在する場合にはパーティション親テーブルのみから列を削除することはできません" -#: commands/tablecmds.c:9259 -#, c-format -msgid "column \"%s\" of table \"%s\" is not marked NOT NULL" -msgstr "テーブル\"%2$s\"の列\"%1$s\"は非NULLに設定されていません" - -#: commands/tablecmds.c:9400 +#: 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:9425 +#: 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:9779 +#: 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:9787 commands/tablecmds.c:10389 +#: 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:9657 +#, c-format +msgid "This feature is not yet supported on partitioned tables." +msgstr "この機能はパーティションテーブルに対してはサポートされていません。" + +#: commands/tablecmds.c:9664 commands/tablecmds.c:10146 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "参照先のリレーション\"%s\"はテーブルではありません" -#: commands/tablecmds.c:9810 +#: commands/tablecmds.c:9687 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "永続テーブルの制約は永続テーブルだけを参照できます" -#: commands/tablecmds.c:9817 +#: commands/tablecmds.c:9694 #, c-format msgid "constraints on unlogged tables may reference only permanent or unlogged tables" msgstr "UNLOGGEDテーブルに対する制約は、永続テーブルまたはUNLOGGEDテーブルだけを参照する場合があります" -#: commands/tablecmds.c:9823 +#: commands/tablecmds.c:9700 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "一時テーブルに対する制約は一時テーブルだけを参照する場合があります" -#: commands/tablecmds.c:9827 +#: commands/tablecmds.c:9704 #, c-format msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "一時テーブルに対する制約にはこのセッションの一時テーブルを加える必要があります" -#: commands/tablecmds.c:9842 commands/tablecmds.c:9869 -#, c-format -msgid "foreign key uses PERIOD on the referenced table but not the referencing table" -msgstr "外部キーが参照先テーブル上ではPERIODを使用していますが、参照元テーブルでは使用していません" - -#: commands/tablecmds.c:9881 -#, c-format -msgid "foreign key uses PERIOD on the referencing table but not the referenced table" -msgstr "外部キーが参照元テーブル上ではPERIODを使用していますが、参照先テーブルでは使用していません" - -#: commands/tablecmds.c:9895 -#, c-format -msgid "foreign key must use PERIOD when referencing a primary using WITHOUT OVERLAPS" -msgstr "主キーがWITHOUT OVERLAPSを使用している場合は外部キーはPERIODを使用する必要があります" - -#: commands/tablecmds.c:9919 commands/tablecmds.c:9925 +#: commands/tablecmds.c:9769 commands/tablecmds.c:9775 #, c-format msgid "invalid %s action for foreign key constraint containing generated column" msgstr "生成カラムを含む外部キー制約に対する不正な %s 処理" -#: commands/tablecmds.c:9940 commands/tablecmds.c:9948 -#, c-format -msgid "unsupported %s action for foreign key constraint using PERIOD" -msgstr "PERIODを使用する外部キー制約に対するサポートされない %s 処理" - -#: commands/tablecmds.c:9963 +#: commands/tablecmds.c:9791 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "外部キーの参照列数と被参照列数が合いません" -#: commands/tablecmds.c:10016 -#, c-format -msgid "could not identify an overlaps operator for foreign key" -msgstr "外部キーに使用する重複検出演算子を特定できませんでした" - -#: commands/tablecmds.c:10017 -#, c-format -msgid "could not identify an equality operator for foreign key" -msgstr "外部キーに使用する等価演算子を特定できませんでした" - -#: commands/tablecmds.c:10096 commands/tablecmds.c:10130 +#: commands/tablecmds.c:9898 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "外部キー制約\"%sは実装されていません" -#: commands/tablecmds.c:10098 -#, c-format -msgid "Key columns \"%s\" of the referencing table and \"%s\" of the referenced table are of incompatible types: %s and %s." -msgstr "キー列である参照元テーブルの\"%1$s\"と参照先テーブルの\"%2$s\"の型に互換性がありません: %3$sと%4$s。" - -#: commands/tablecmds.c:10131 +#: commands/tablecmds.c:9900 #, c-format -msgid "Key columns \"%s\" of the referencing table and \"%s\" of the referenced table have incompatible collations: \"%s\" and \"%s\". If either collation is nondeterministic, then both collations have to be the same." -msgstr "キー列である参照元テーブルの\"%1$s\"と参照先テーブルの\"%2$s\"の照合順序に互換性がありません: %3$sと%4$s。いずれかの照合順序が非決定的である場合は両方の照合順序が同一である必要があります。" +msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." +msgstr "キーとなる列\"%s\"と\"%s\"との間で型に互換性がありません:%sと%s" -#: commands/tablecmds.c:10331 +#: commands/tablecmds.c:10075 #, 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:10696 commands/tablecmds.c:11137 parser/parse_utilcmd.c:941 parser/parse_utilcmd.c:1086 +#: 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:11120 +#: commands/tablecmds.c:10856 #, 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:11755 commands/tablecmds.c:12073 commands/tablecmds.c:13060 commands/tablecmds.c:13289 +#: 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 "リレーション\"%2$s\"の制約\"%1$s\"は存在しません" -#: commands/tablecmds.c:11762 +#: commands/tablecmds.c:11464 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "リレーション\"%2$s\"の制約\"%1$s\"は外部キー制約ではありません" -#: commands/tablecmds.c:11801 +#: commands/tablecmds.c:11502 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "リレーション\"%2$s\"の制約\"%1$s\"を変更できません" -#: commands/tablecmds.c:11804 +#: commands/tablecmds.c:11505 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "制約\"%1$s\"は、リレーション\"%3$s\"上の制約\"%2$s\"から派生しています。" -#: commands/tablecmds.c:11806 +#: commands/tablecmds.c:11507 #, c-format msgid "You may alter the constraint it derives from instead." msgstr "この制約の代わりに派生元の制約を変更することは可能です。" -#: commands/tablecmds.c:12081 +#: commands/tablecmds.c:11746 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "リレーション\"%2$s\"の制約\"%1$s\"は外部キー制約でも検査制約でもありません" -#: commands/tablecmds.c:12087 -#, c-format -msgid "cannot validate NOT ENFORCED constraint" -msgstr "NOT ENFORCED制約は検証できません" - -#: commands/tablecmds.c:12271 +#: commands/tablecmds.c:11823 #, c-format msgid "constraint must be validated on child tables too" msgstr "制約は子テーブルでも検証される必要があります" -#: commands/tablecmds.c:12345 +#: commands/tablecmds.c:11910 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "外部キー制約で参照される列\"%s\"が存在しません" -#: commands/tablecmds.c:12351 +#: commands/tablecmds.c:11916 #, c-format msgid "system columns cannot be used in foreign keys" msgstr "システム列は外部キーに使用できません" -#: commands/tablecmds.c:12355 +#: commands/tablecmds.c:11920 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "外部キーでは%dを超えるキーを持つことができません" -#: commands/tablecmds.c:12423 +#: commands/tablecmds.c:11985 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "被参照テーブル\"%s\"には遅延可能プライマリキーは使用できません" -#: commands/tablecmds.c:12440 +#: commands/tablecmds.c:12002 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "被参照テーブル\"%s\"にはプライマリキーがありません" -#: commands/tablecmds.c:12513 +#: commands/tablecmds.c:12070 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "外部キーの被参照列リストには重複があってはなりません" -#: commands/tablecmds.c:12616 +#: commands/tablecmds.c:12162 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "被参照テーブル\"%s\"に対しては、遅延可能な一意性制約は使用できません" -#: commands/tablecmds.c:12621 +#: commands/tablecmds.c:12167 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "被参照テーブル\"%s\"に、指定したキーに一致する一意性制約がありません" -#: commands/tablecmds.c:13064 -#, c-format -msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" -msgstr "リレーション\"%2$s\"の制約\"%1$s\"は存在しません、スキップします" - -#: commands/tablecmds.c:13109 +#: commands/tablecmds.c:12606 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"の継承された制約\"%1$s\"を削除できません" -#: commands/tablecmds.c:13161 -#, c-format -msgid "column \"%s\" is in a primary key" -msgstr "列\"%s\"はプライマリキーで使用しています" - -#: commands/tablecmds.c:13169 +#: commands/tablecmds.c:12656 #, c-format -msgid "column \"%s\" is in index used as replica identity" -msgstr "列\"%s\"は複製識別として使用中のインデックスに含まれています" +msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" +msgstr "リレーション\"%2$s\"の制約\"%1$s\"は存在しません、スキップします" -#: commands/tablecmds.c:13402 +#: commands/tablecmds.c:12831 #, c-format msgid "cannot alter column type of typed table" msgstr "型付けされたテーブルの列の型を変更できません" -#: commands/tablecmds.c:13430 +#: commands/tablecmds.c:12857 #, c-format msgid "cannot specify USING when altering type of generated column" msgstr "生成列の型変更の際にはUSINGを指定することはできません" -#: commands/tablecmds.c:13431 commands/tablecmds.c:18791 commands/tablecmds.c:18881 commands/trigger.c:656 rewrite/rewriteHandler.c:947 rewrite/rewriteHandler.c:982 +#: 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:13442 +#: commands/tablecmds.c:12868 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "継承される列\"%s\"を変更できません" -#: commands/tablecmds.c:13451 +#: commands/tablecmds.c:12877 #, c-format msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "列\"%s\"はリレーション\"%s\"のパーティションキーの一部であるため、変更できません" -#: commands/tablecmds.c:13502 +#: commands/tablecmds.c:12927 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "列\"%s\"に対するUSING句の結果は自動的に%s型に型変換できません" -#: commands/tablecmds.c:13505 +#: commands/tablecmds.c:12930 #, c-format msgid "You might need to add an explicit cast." msgstr "必要に応じて明示的な型変換を追加してください。" -#: commands/tablecmds.c:13509 +#: commands/tablecmds.c:12934 #, 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:13513 +#: commands/tablecmds.c:12938 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "必要に応じて\"USING %s::%s\"を追加してください。" -#: commands/tablecmds.c:13612 +#: commands/tablecmds.c:13037 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "リレーション\"%2$s\"の継承列\"%1$s\"は変更できません" -#: commands/tablecmds.c:13641 +#: commands/tablecmds.c:13066 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "USING式が行全体テーブル参照を含んでいます。" -#: commands/tablecmds.c:13652 +#: commands/tablecmds.c:13077 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "継承される列\"%s\"の型を子テーブルで変更しなければなりません" -#: commands/tablecmds.c:13777 +#: commands/tablecmds.c:13202 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "列\"%s\"の型を2回変更することはできません" -#: commands/tablecmds.c:13815 +#: commands/tablecmds.c:13240 #, c-format msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" msgstr "カラム\"%s\"に対する生成式は自動的に%s型にキャストできません" -#: commands/tablecmds.c:13820 +#: commands/tablecmds.c:13245 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "列\"%s\"のデフォルト値を自動的に%s型にキャストできません" -#: commands/tablecmds.c:14124 +#: commands/tablecmds.c:13549 #, c-format msgid "cannot alter type of a column used by a function or procedure" msgstr "関数またはプロシージャで使用される列の型は変更できません" -#: commands/tablecmds.c:14125 commands/tablecmds.c:14140 commands/tablecmds.c:14160 commands/tablecmds.c:14179 commands/tablecmds.c:14238 +#: 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:14139 +#: commands/tablecmds.c:13564 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "ビューまたはルールで使用される列の型は変更できません" -#: commands/tablecmds.c:14159 +#: commands/tablecmds.c:13584 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "トリガー定義で使用される列の型は変更できません" -#: commands/tablecmds.c:14178 +#: commands/tablecmds.c:13603 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "ポリシ定義で使用されている列の型は変更できません" -#: commands/tablecmds.c:14209 +#: commands/tablecmds.c:13634 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "生成カラムで使用される列の型は変更できません" -#: commands/tablecmds.c:14210 +#: commands/tablecmds.c:13635 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "カラム\"%s\"は生成カラム\"%s\"で使われています。" -#: commands/tablecmds.c:14237 +#: commands/tablecmds.c:13662 #, c-format msgid "cannot alter type of a column used by a publication WHERE clause" msgstr "パブリケーションのWHERE句で使用される列の型は変更できません" -#: commands/tablecmds.c:15088 commands/tablecmds.c:15100 +#: commands/tablecmds.c:14497 commands/tablecmds.c:14509 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "インデックス\"%s\"の所有者を変更できません" -#: commands/tablecmds.c:15090 commands/tablecmds.c:15102 +#: commands/tablecmds.c:14499 commands/tablecmds.c:14511 #, c-format msgid "Change the ownership of the index's table instead." msgstr "代わりにインデックスのテーブルの所有者を変更してください。" -#: commands/tablecmds.c:15116 +#: commands/tablecmds.c:14525 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "シーケンス\"%s\"の所有者を変更できません" -#: commands/tablecmds.c:15141 +#: commands/tablecmds.c:14550 #, c-format msgid "cannot change owner of relation \"%s\"" msgstr "リレーション\"%s\"の所有者を変更できません" -#: commands/tablecmds.c:15608 +#: commands/tablecmds.c:15017 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "SET TABLESPACEサブコマンドを複数指定できません" -#: commands/tablecmds.c:15685 +#: commands/tablecmds.c:15094 #, c-format msgid "cannot set options for relation \"%s\"" msgstr "リレーション\"%s\"のオプションは設定できません" -#: commands/tablecmds.c:15719 commands/view.c:440 +#: 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:15970 +#: commands/tablecmds.c:15379 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "テーブルスペースにはテーブル、インデックスおよび実体化ビューしかありません" -#: commands/tablecmds.c:15982 +#: commands/tablecmds.c:15391 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "pg_globalテーブルスペースとの間のリレーションの移動はできません" -#: commands/tablecmds.c:16074 +#: commands/tablecmds.c:15483 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "リレーション\"%s.%s\"のロックが獲得できなかったため中断します" -#: commands/tablecmds.c:16090 +#: commands/tablecmds.c:15499 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "テーブルスペース\"%s\"には合致するリレーションはありませんでした" -#: commands/tablecmds.c:16212 +#: commands/tablecmds.c:15621 #, c-format msgid "cannot change inheritance of typed table" msgstr "型付けされたテーブルの継承を変更できません" -#: commands/tablecmds.c:16217 commands/tablecmds.c:16793 +#: commands/tablecmds.c:15626 commands/tablecmds.c:16126 #, c-format msgid "cannot change inheritance of a partition" msgstr "パーティションの継承は変更できません" -#: commands/tablecmds.c:16222 +#: commands/tablecmds.c:15631 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "パーティションテーブルの継承は変更できません" -#: commands/tablecmds.c:16269 +#: commands/tablecmds.c:15677 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "他のセッションの一時テーブルを継承できません" -#: commands/tablecmds.c:16282 +#: commands/tablecmds.c:15690 #, c-format msgid "cannot inherit from a partition" msgstr "パーティションからの継承はできません" -#: commands/tablecmds.c:16304 commands/tablecmds.c:19299 +#: commands/tablecmds.c:15712 commands/tablecmds.c:18570 #, c-format msgid "circular inheritance not allowed" msgstr "循環継承を行うことはできません" -#: commands/tablecmds.c:16305 commands/tablecmds.c:19300 +#: commands/tablecmds.c:15713 commands/tablecmds.c:18571 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\"はすでに\"%s\"の子です" -#: commands/tablecmds.c:16318 +#: commands/tablecmds.c:15726 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "トリガ\"%s\"によってテーブル\"%s\"が継承子テーブルになることができません" -#: commands/tablecmds.c:16320 +#: commands/tablecmds.c:15728 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." msgstr "遷移テーブルを使用したROWトリガは継承関係ではサポートされていません。" -#: commands/tablecmds.c:16521 commands/tablecmds.c:16762 +#: commands/tablecmds.c:15917 #, c-format -msgid "column \"%s\" in child table \"%s\" must be marked NOT NULL" -msgstr "子テーブル\"%2$s\"の列\"%1$s\"は非NULLに設定されていません" +msgid "column \"%s\" in child table must be marked NOT NULL" +msgstr "子テーブルの列\"%s\"はNOT NULLである必要があります" -#: commands/tablecmds.c:16531 +#: commands/tablecmds.c:15926 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "子テーブルの列\"%s\"は生成列である必要があります" -#: commands/tablecmds.c:16535 +#: commands/tablecmds.c:15930 #, c-format msgid "column \"%s\" in child table must not be a generated column" msgstr "子テーブルの列\"%s\"は生成列であってはなりません" -#: commands/tablecmds.c:16573 +#: commands/tablecmds.c:15968 #, c-format msgid "child table is missing column \"%s\"" msgstr "子テーブルには列\"%s\"がありません" -#: commands/tablecmds.c:16690 +#: commands/tablecmds.c:16049 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "子テーブル\"%s\"では検査制約\"%s\"に異なった定義がされています" -#: commands/tablecmds.c:16699 +#: commands/tablecmds.c:16056 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "制約\"%s\"は子テーブル\"%s\"上の継承されない制約と競合します" -#: commands/tablecmds.c:16710 +#: commands/tablecmds.c:16066 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "制約\"%s\"は子テーブル\"%s\"のNOT VALID制約と衝突しています" -#: commands/tablecmds.c:16721 -#, c-format -msgid "constraint \"%s\" conflicts with NOT ENFORCED constraint on child table \"%s\"" -msgstr "制約\"%s\"は子テーブル\"%s\"のNOT ENFORCED制約と衝突しています" - -#: commands/tablecmds.c:16770 +#: commands/tablecmds.c:16104 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "子テーブルには制約\"%s\"がありません" -#: commands/tablecmds.c:16857 +#: commands/tablecmds.c:16190 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "パーティション\"%s\"はすでにパーティションテーブル\"%s.%s\"からの取り外し保留中です" -#: commands/tablecmds.c:16886 commands/tablecmds.c:16934 +#: 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:16940 +#: commands/tablecmds.c:16271 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "リレーション\"%s\"はリレーション\"%s\"の親ではありません" -#: commands/tablecmds.c:17211 +#: commands/tablecmds.c:16498 #, c-format msgid "typed tables cannot inherit" msgstr "型付けされたテーブルは継承できません" -#: commands/tablecmds.c:17241 +#: commands/tablecmds.c:16528 #, c-format msgid "table is missing column \"%s\"" msgstr "テーブルには列\"%s\"がありません" -#: commands/tablecmds.c:17252 +#: commands/tablecmds.c:16539 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "テーブルには列\"%s\"がありますが型は\"%s\"を必要としています" -#: commands/tablecmds.c:17261 +#: commands/tablecmds.c:16548 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "テーブル\"%s\"では列\"%s\"の型が異なっています" -#: commands/tablecmds.c:17275 +#: commands/tablecmds.c:16562 #, c-format msgid "table has extra column \"%s\"" msgstr "テーブルに余分な列\"%s\"があります" -#: commands/tablecmds.c:17327 +#: commands/tablecmds.c:16614 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\"は型付けされたテーブルではありません" -#: commands/tablecmds.c:17507 +#: commands/tablecmds.c:16788 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "非ユニークインデックス\"%s\"は複製識別としては使用できません" -#: commands/tablecmds.c:17513 +#: commands/tablecmds.c:16794 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "一意性を即時検査しないインデックス\"%s\"は複製識別には使用できません" -#: commands/tablecmds.c:17519 +#: commands/tablecmds.c:16800 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "式インデックス\"%s\"は複製識別としては使用できません" -#: commands/tablecmds.c:17525 +#: commands/tablecmds.c:16806 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "部分インデックス\"%s\"を複製識別としては使用できません" -#: commands/tablecmds.c:17542 +#: commands/tablecmds.c:16823 #, 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:17549 +#: commands/tablecmds.c:16830 #, 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:17798 +#: commands/tablecmds.c:17082 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "テーブル\"%s\"は一時テーブルであるため、ログ出力設定を変更できません" -#: commands/tablecmds.c:17822 +#: commands/tablecmds.c:17106 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "テーブル\"%s\"はパブリケーションの一部であるため、UNLOGGEDに変更できません" -#: commands/tablecmds.c:17824 +#: commands/tablecmds.c:17108 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "UNLOGGEDリレーションはレプリケーションできません。" -#: commands/tablecmds.c:17869 +#: commands/tablecmds.c:17153 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "テーブル\"%s\"はUNLOGGEDテーブル\"%s\"を参照しているためLOGGEDには設定できません" -#: commands/tablecmds.c:17879 +#: commands/tablecmds.c:17163 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "テーブル\"%s\"はLOGGEDテーブル\"%s\"を参照しているためUNLOGGEDには設定できません" -#: commands/tablecmds.c:17943 +#: commands/tablecmds.c:17221 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "所有するシーケンスを他のスキーマに移動することができません" -#: commands/tablecmds.c:18051 +#: commands/tablecmds.c:17329 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "リレーション\"%s\"はスキーマ\"%s\"内にすでに存在します" -#: commands/tablecmds.c:18476 +#: commands/tablecmds.c:17754 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "\"%s\"はテーブルや実体化ビューではありません" -#: commands/tablecmds.c:18629 +#: commands/tablecmds.c:17907 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\"は複合型ではありません" -#: commands/tablecmds.c:18659 +#: commands/tablecmds.c:17937 #, c-format msgid "cannot change schema of index \"%s\"" msgstr "インデックス\"%s\"のスキーマを変更できません" -#: commands/tablecmds.c:18661 commands/tablecmds.c:18675 +#: commands/tablecmds.c:17939 commands/tablecmds.c:17953 #, c-format msgid "Change the schema of the table instead." msgstr "代わりにこのテーブルのスキーマを変更してください。" -#: commands/tablecmds.c:18665 +#: commands/tablecmds.c:17943 #, c-format msgid "cannot change schema of composite type \"%s\"" msgstr "複合型%sのスキーマは変更できません" -#: commands/tablecmds.c:18673 +#: commands/tablecmds.c:17951 #, c-format msgid "cannot change schema of TOAST table \"%s\"" msgstr "TOASTテーブル\"%s\"のスキーマは変更できません" -#: commands/tablecmds.c:18705 +#: commands/tablecmds.c:17983 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "\"list\"パーティションストラテジは2つ以上の列に対しては使えません" -#: commands/tablecmds.c:18771 +#: commands/tablecmds.c:18049 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "パーティションキーに指定されている列\"%s\"は存在しません" -#: commands/tablecmds.c:18779 +#: commands/tablecmds.c:18057 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "パーティションキーでシステム列\"%s\"は使用できません" -#: commands/tablecmds.c:18790 commands/tablecmds.c:18880 +#: commands/tablecmds.c:18068 commands/tablecmds.c:18158 #, c-format msgid "cannot use generated column in partition key" msgstr "パーティションキーで生成カラムは使用できません" -#: commands/tablecmds.c:18863 +#: commands/tablecmds.c:18141 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "パーティションキー式はシステム列への参照を含むことができません" -#: commands/tablecmds.c:18910 +#: commands/tablecmds.c:18188 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "パーティションキー式で使われる関数はIMMUTABLE指定されている必要があります" -#: commands/tablecmds.c:18919 +#: commands/tablecmds.c:18197 #, c-format msgid "cannot use constant expression as partition key" msgstr "定数式をパーティションキーとして使うことはできません" -#: commands/tablecmds.c:18940 +#: commands/tablecmds.c:18218 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "パーティション式で使用する照合順序を特定できませんでした" -#: commands/tablecmds.c:18975 +#: commands/tablecmds.c:18253 #, 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:18981 +#: commands/tablecmds.c:18259 #, 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:19239 +#: commands/tablecmds.c:18510 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\"はすでパーティションです" -#: commands/tablecmds.c:19245 +#: commands/tablecmds.c:18516 #, c-format msgid "cannot attach a typed table as partition" msgstr "型付けされたテーブルをパーティションにアタッチすることはできません" -#: commands/tablecmds.c:19261 +#: commands/tablecmds.c:18532 #, c-format msgid "cannot attach inheritance child as partition" msgstr "継承子テーブルをパーティションにアタッチすることはできません" -#: commands/tablecmds.c:19275 +#: commands/tablecmds.c:18546 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "継承親テーブルをパーティションにアタッチすることはできません" -#: commands/tablecmds.c:19309 +#: commands/tablecmds.c:18580 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "一時リレーションを永続リレーション \"%s\" のパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:19317 +#: commands/tablecmds.c:18588 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "永続リレーションを一時リレーション\"%s\"のパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:19325 +#: commands/tablecmds.c:18596 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "他セッションの一時リレーションのパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:19332 +#: commands/tablecmds.c:18603 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "他セッションの一時リレーションにパーティション子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:19352 +#: commands/tablecmds.c:18623 #, c-format msgid "table \"%s\" being attached contains an identity column \"%s\"" msgstr "アタッチ対象のテーブル\"%s\"には識別列\"%s\"が含まれています" -#: commands/tablecmds.c:19354 +#: commands/tablecmds.c:18625 #, c-format msgid "The new partition may not contain an identity column." msgstr "新しいパーティションは識別列を含むことはできません" -#: commands/tablecmds.c:19362 +#: commands/tablecmds.c:18633 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "テーブル\"%1$s\"は親テーブル\"%3$s\"にない列\"%2$s\"を含んでいます" -#: commands/tablecmds.c:19365 +#: commands/tablecmds.c:18636 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "新しいパーティションは親に存在する列のみを含むことができます。" -#: commands/tablecmds.c:19377 +#: commands/tablecmds.c:18648 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "トリガ\"%s\"のため、テーブル\"%s\"はパーティション子テーブルにはなれません" -#: commands/tablecmds.c:19379 +#: commands/tablecmds.c:18650 #, c-format msgid "ROW triggers with transition tables are not supported on partitions." msgstr "遷移テーブルを使用するROWトリガはパーティションではサポートされません。" -#: commands/tablecmds.c:19561 +#: commands/tablecmds.c:18826 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "外部テーブル\"%s\"はパーティションテーブル\"%s\"の子テーブルとしてアタッチすることはできません" -#: commands/tablecmds.c:19564 +#: commands/tablecmds.c:18829 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "パーティション親テーブル\"%s\"はユニークインデックスを持っています。" -#: commands/tablecmds.c:19887 +#: commands/tablecmds.c:19151 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "デフォルトパーティションを持つパーティションは並列的に取り外しはできません" -#: commands/tablecmds.c:19996 +#: commands/tablecmds.c:19260 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "パーティション親テーブル\"%s\"には CREATE INDEX CONCURRENTLY は実行できません" -#: commands/tablecmds.c:20002 +#: commands/tablecmds.c:19266 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "パーティション子テーブル\\\"%s\\\"は同時に削除されました" -#: commands/tablecmds.c:20618 commands/tablecmds.c:20638 commands/tablecmds.c:20659 commands/tablecmds.c:20678 commands/tablecmds.c:20727 +#: commands/tablecmds.c:19888 commands/tablecmds.c:19908 commands/tablecmds.c:19929 commands/tablecmds.c:19948 commands/tablecmds.c:19990 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "インデックス\"%s\"をインデックス\"%s\"の子インデックスとしてアタッチすることはできません" -#: commands/tablecmds.c:20621 +#: commands/tablecmds.c:19891 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "インデックス\"%s\"はすでに別のインデックスにアタッチされています。" -#: commands/tablecmds.c:20641 +#: commands/tablecmds.c:19911 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "インデックス\"%s\"はテーブル\"%s\"のどの子テーブルのインデックスでもありません。" -#: commands/tablecmds.c:20662 +#: commands/tablecmds.c:19932 #, c-format msgid "The index definitions do not match." msgstr "インデックス定義が合致しません。" -#: commands/tablecmds.c:20681 +#: commands/tablecmds.c:19951 #, 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:20730 +#: commands/tablecmds.c:19993 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "子テーブル\"%s\"にはすでに他のインデックスがアタッチされています。" -#: commands/tablecmds.c:20853 -#, c-format -msgid "invalid primary key definition" -msgstr "不正な主キー定義" - -#: commands/tablecmds.c:20854 -#, c-format -msgid "Column \"%s\" of relation \"%s\" is not marked NOT NULL." -msgstr "リレーション\"%2$s\"の列\"%1$s\"は非NULLに設定されていません。" - -#: commands/tablecmds.c:20989 +#: commands/tablecmds.c:20229 #, c-format msgid "column data type %s does not support compression" msgstr "列データ型%sは圧縮をサポートしていません" -#: commands/tablecmds.c:20996 +#: commands/tablecmds.c:20236 #, c-format msgid "invalid compression method \"%s\"" msgstr "無効な圧縮方式\"%s\"" -#: commands/tablecmds.c:21022 +#: commands/tablecmds.c:20262 #, c-format msgid "invalid storage type \"%s\"" msgstr "不正な格納タイプ\"%s\"" -#: commands/tablecmds.c:21032 +#: commands/tablecmds.c:20272 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "列のデータ型%sは格納タイプPLAINしか取ることができません" @@ -11761,7 +11614,7 @@ msgstr "外部テーブルは INSTEAD OF トリガを持つことができませ msgid "Foreign tables cannot have constraint triggers." msgstr "外部テーブルは制約トリガを持つことができません。" -#: commands/trigger.c:309 commands/trigger.c:1327 commands/trigger.c:1434 +#: commands/trigger.c:309 commands/trigger.c:1325 commands/trigger.c:1432 #, c-format msgid "relation \"%s\" cannot have triggers" msgstr "リレーション\"%s\"にはトリガーを設定できません" @@ -11891,7 +11744,7 @@ msgstr "BEFORE トリガーの WHEN 条件では NEW の生成列を参照でき msgid "A whole-row reference is used and the table contains generated columns." msgstr "行全体参照が使われていてかつ、このテーブルは生成カラムを含んでいます。" -#: commands/trigger.c:763 commands/trigger.c:1610 +#: commands/trigger.c:763 commands/trigger.c:1607 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "リレーション\"%2$s\"用のトリガ\"%1$s\"はすでに存在します" @@ -11906,77 +11759,77 @@ msgstr "リレーション\"%2$s\"のトリガー\"%1$s\"は内部トリガー msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" msgstr "リレーション\"%2$s\"のトリガー\"%1$s\"は制約トリガーです" -#: commands/trigger.c:1399 commands/trigger.c:1553 commands/trigger.c:1834 +#: 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:1525 +#: commands/trigger.c:1522 #, c-format msgid "cannot rename trigger \"%s\" on table \"%s\"" msgstr "テーブル\"%2$s\"のトリガー\"%1$s\"の名前は変更できません" -#: commands/trigger.c:1527 +#: commands/trigger.c:1524 #, c-format msgid "Rename the trigger on the partitioned table \"%s\" instead." msgstr "代わりにパーティション親テーブル\"%s\"でこのトリガーの名前を変更してください。" -#: commands/trigger.c:1627 +#: commands/trigger.c:1624 #, c-format msgid "renamed trigger \"%s\" on relation \"%s\"" msgstr "リレーション\"%2$s\"のトリガー\"%1$s\"の名前を変更しました" -#: commands/trigger.c:1773 +#: commands/trigger.c:1770 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "権限がありません: \"%s\"はシステムトリガです" -#: commands/trigger.c:2382 +#: commands/trigger.c:2379 #, c-format msgid "trigger function %u returned null value" msgstr "トリガ関数%uはNULL値を返しました" -#: commands/trigger.c:2442 commands/trigger.c:2660 commands/trigger.c:2913 commands/trigger.c:3266 +#: 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:2518 +#: 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:2519 +#: 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:3344 executor/nodeModifyTable.c:1648 executor/nodeModifyTable.c:1722 executor/nodeModifyTable.c:2529 executor/nodeModifyTable.c:2619 executor/nodeModifyTable.c:3291 executor/nodeModifyTable.c:3461 +#: commands/trigger.c:3341 executor/nodeModifyTable.c:1562 executor/nodeModifyTable.c:1636 executor/nodeModifyTable.c:2398 executor/nodeModifyTable.c:2489 executor/nodeModifyTable.c:3153 executor/nodeModifyTable.c:3323 #, 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:3385 executor/nodeLockRows.c:228 executor/nodeLockRows.c:237 executor/nodeModifyTable.c:368 executor/nodeModifyTable.c:1664 executor/nodeModifyTable.c:2545 executor/nodeModifyTable.c:2770 +#: commands/trigger.c:3382 executor/nodeLockRows.c:228 executor/nodeLockRows.c:237 executor/nodeModifyTable.c:335 executor/nodeModifyTable.c:1578 executor/nodeModifyTable.c:2415 executor/nodeModifyTable.c:2639 #, c-format msgid "could not serialize access due to concurrent update" msgstr "更新が同時に行われたためアクセスの直列化ができませんでした" -#: commands/trigger.c:3393 executor/nodeModifyTable.c:1754 executor/nodeModifyTable.c:2636 executor/nodeModifyTable.c:2794 executor/nodeModifyTable.c:3309 +#: commands/trigger.c:3390 executor/nodeModifyTable.c:1668 executor/nodeModifyTable.c:2506 executor/nodeModifyTable.c:2663 executor/nodeModifyTable.c:3171 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "削除が同時に行われたためアクセスの直列化ができませんでした" -#: commands/trigger.c:4626 +#: commands/trigger.c:4599 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" msgstr "セキュリティー制限操作中は、遅延トリガーは発火させられません" -#: commands/trigger.c:5807 +#: commands/trigger.c:5780 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "制約\"%s\"は遅延可能ではありません" -#: commands/trigger.c:5830 +#: commands/trigger.c:5803 #, c-format msgid "constraint \"%s\" does not exist" msgstr "制約\"%s\"は存在しません" @@ -12086,7 +11939,7 @@ msgstr "基本型を作成するにはスーパーユーザーである必要が 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:331 commands/typecmds.c:1486 commands/typecmds.c:4467 +#: commands/typecmds.c:331 commands/typecmds.c:1460 commands/typecmds.c:4480 #, c-format msgid "type attribute \"%s\" not recognized" msgstr "型の属性\"%s\"は不明です" @@ -12106,7 +11959,7 @@ msgstr "%sを配列要素の型にすることはできません" msgid "alignment \"%s\" not recognized" msgstr "アライメント\"%s\"は不明です" -#: commands/typecmds.c:454 commands/typecmds.c:4341 +#: commands/typecmds.c:454 commands/typecmds.c:4354 #, c-format msgid "storage \"%s\" not recognized" msgstr "格納方式\"%s\"は不明です" @@ -12136,302 +11989,287 @@ msgstr "添字処理関数なしで要素型を指定することはできませ msgid "\"%s\" is not a valid base type for a domain" msgstr "\"%s\"はドメインの基本型として無効です" -#: commands/typecmds.c:885 +#: commands/typecmds.c:883 #, c-format msgid "multiple default expressions" msgstr "デフォルト式が複数あります" -#: commands/typecmds.c:945 commands/typecmds.c:960 +#: commands/typecmds.c:946 commands/typecmds.c:955 #, c-format msgid "conflicting NULL/NOT NULL constraints" msgstr "NULL制約とNOT NULL制約が競合しています" -#: commands/typecmds.c:950 -#, c-format -msgid "not-null constraints for domains cannot be marked NO INHERIT" -msgstr "ドメインに対する非NULL制約はNO INHERIT指定できません" - -#: commands/typecmds.c:977 +#: commands/typecmds.c:971 #, c-format msgid "check constraints for domains cannot be marked NO INHERIT" msgstr "ドメインに対する検査制約はNO INHERITとマークすることができません" -#: commands/typecmds.c:988 +#: commands/typecmds.c:980 commands/typecmds.c:2940 #, c-format msgid "unique constraints not possible for domains" msgstr "ドメインでは一意性制約は使用できません" -#: commands/typecmds.c:995 +#: commands/typecmds.c:986 commands/typecmds.c:2946 #, c-format msgid "primary key constraints not possible for domains" msgstr "ドメインではプライマリキー制約はできません" -#: commands/typecmds.c:1002 +#: commands/typecmds.c:992 commands/typecmds.c:2952 #, c-format msgid "exclusion constraints not possible for domains" msgstr "ドメインでは排除制約は使用できません" -#: commands/typecmds.c:1009 +#: commands/typecmds.c:998 commands/typecmds.c:2958 #, c-format msgid "foreign key constraints not possible for domains" msgstr "ドメイン用の外部キー制約はできません" -#: commands/typecmds.c:1019 +#: commands/typecmds.c:1007 commands/typecmds.c:2967 #, c-format msgid "specifying constraint deferrability not supported for domains" msgstr "ドメインでは制約遅延の指定はサポートしていません" -#: commands/typecmds.c:1027 -#, c-format -msgid "specifying GENERATED not supported for domains" -msgstr "ドメインではGENERATEDの指定はサポートしていません" - -#: commands/typecmds.c:1035 -#, c-format -msgid "specifying constraint enforceability not supported for domains" -msgstr "ドメインでは制約の強制性指定はサポートしていません" - -#: commands/typecmds.c:1353 utils/cache/typcache.c:2743 +#: commands/typecmds.c:1327 utils/cache/typcache.c:2570 #, c-format msgid "%s is not an enum" msgstr "%s は数値ではありません" -#: commands/typecmds.c:1494 +#: commands/typecmds.c:1468 #, c-format msgid "type attribute \"subtype\" is required" msgstr "型の属性\"subtype\"が必要です" -#: commands/typecmds.c:1499 +#: commands/typecmds.c:1473 #, c-format msgid "range subtype cannot be %s" msgstr "範囲の派生元型を%sにすることはできません" -#: commands/typecmds.c:1518 +#: commands/typecmds.c:1492 #, c-format msgid "range collation specified but subtype does not support collation" msgstr "範囲の照合順序が指定されましたが、派生もと型が照合順序をサポートしていません" -#: commands/typecmds.c:1528 +#: commands/typecmds.c:1502 #, c-format msgid "cannot specify a canonical function without a pre-created shell type" msgstr "事前にシェル型を生成せずに正規化関数を指定することはできません" -#: commands/typecmds.c:1529 +#: 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:2001 +#: commands/typecmds.c:1975 #, c-format msgid "type input function %s has multiple matches" msgstr "型の入力関数%sが複数合致します" -#: commands/typecmds.c:2019 +#: commands/typecmds.c:1993 #, c-format msgid "type input function %s must return type %s" msgstr "型の入力関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2035 +#: commands/typecmds.c:2009 #, c-format msgid "type input function %s should not be volatile" msgstr "型の入力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2063 +#: commands/typecmds.c:2037 #, c-format msgid "type output function %s must return type %s" msgstr "型の出力関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2070 +#: commands/typecmds.c:2044 #, c-format msgid "type output function %s should not be volatile" msgstr "型の出力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2099 +#: commands/typecmds.c:2073 #, c-format msgid "type receive function %s has multiple matches" msgstr "型の受信関数 %s が複数合致しました" -#: commands/typecmds.c:2117 +#: commands/typecmds.c:2091 #, c-format msgid "type receive function %s must return type %s" msgstr "型の受信関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2124 +#: commands/typecmds.c:2098 #, c-format msgid "type receive function %s should not be volatile" msgstr "型の受信関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2152 +#: commands/typecmds.c:2126 #, c-format msgid "type send function %s must return type %s" msgstr "型の送信関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2159 +#: commands/typecmds.c:2133 #, c-format msgid "type send function %s should not be volatile" msgstr "型の送信関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2186 +#: commands/typecmds.c:2160 #, c-format msgid "typmod_in function %s must return type %s" msgstr "typmod_in関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2193 +#: commands/typecmds.c:2167 #, c-format msgid "type modifier input function %s should not be volatile" msgstr "型修正子の入力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2220 +#: commands/typecmds.c:2194 #, c-format msgid "typmod_out function %s must return type %s" msgstr "typmod_out関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2227 +#: commands/typecmds.c:2201 #, c-format msgid "type modifier output function %s should not be volatile" msgstr "型修正子の出力関数%sはvolatileであってはなりません" -#: commands/typecmds.c:2254 +#: commands/typecmds.c:2228 #, c-format msgid "type analyze function %s must return type %s" msgstr "型のANALYZE関数%sは%s型を返す必要があります" -#: commands/typecmds.c:2283 +#: commands/typecmds.c:2257 #, c-format msgid "type subscripting function %s must return type %s" msgstr "型の添字処理関数%sは型%sを返す必要があります" -#: commands/typecmds.c:2293 +#: commands/typecmds.c:2267 #, c-format msgid "user-defined types cannot use subscripting function %s" msgstr "ユーザー定義型は添字処理関数%sを使用できません" -#: commands/typecmds.c:2339 +#: 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:2370 +#: commands/typecmds.c:2344 #, c-format msgid "range canonical function %s must return range type" msgstr "範囲の正規化関数 %s は範囲型を返す必要があります" -#: commands/typecmds.c:2376 +#: commands/typecmds.c:2350 #, c-format msgid "range canonical function %s must be immutable" msgstr "範囲の正規化関数 %s は不変関数でなければなりません" -#: commands/typecmds.c:2412 +#: commands/typecmds.c:2386 #, c-format msgid "range subtype diff function %s must return type %s" msgstr "範囲の派生元の型の差分関数 %s は %s型を返す必要があります" -#: commands/typecmds.c:2419 +#: commands/typecmds.c:2393 #, c-format msgid "range subtype diff function %s must be immutable" msgstr "範囲の派生元の型の差分関数 %s は不変関数である必要があります" -#: commands/typecmds.c:2446 +#: 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:2479 +#: 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:2512 +#: 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:2894 commands/typecmds.c:3076 +#: 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:2898 +#: commands/typecmds.c:2872 #, c-format msgid "constraint \"%s\" of domain \"%s\" does not exist, skipping" msgstr "ドメイン\"%2$s\"の制約\"%1$s\"は存在しません、スキップします" -#: commands/typecmds.c:3083 +#: 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:3163 +#: commands/typecmds.c:3180 #, c-format msgid "column \"%s\" of table \"%s\" contains null values" msgstr "テーブル\"%2$s\"の列\"%1$s\"にNULL値があります" -#: commands/typecmds.c:3252 +#: 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:3481 commands/typecmds.c:3759 commands/typecmds.c:3844 commands/typecmds.c:4060 +#: 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:3515 commands/typecmds.c:3671 +#: 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:3566 +#: commands/typecmds.c:3583 #, c-format msgid "cannot use table references in domain check constraint" msgstr "ドメインの検査制約ではテーブル参照を使用できません" -#: commands/typecmds.c:3771 commands/typecmds.c:3856 commands/typecmds.c:4210 +#: 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:3781 commands/typecmds.c:3866 commands/typecmds.c:4108 +#: 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:3783 commands/typecmds.c:3868 commands/typecmds.c:4110 +#: 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:3879 +#: commands/typecmds.c:3892 #, c-format msgid "cannot alter multirange type %s" msgstr "複範囲型%sを変更できません" -#: commands/typecmds.c:3882 +#: 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:4189 +#: commands/typecmds.c:4202 #, c-format msgid "type \"%s\" already exists in schema \"%s\"" msgstr "型\"%s\"はスキーマ\"%s\"内にすでに存在します" -#: commands/typecmds.c:4369 +#: commands/typecmds.c:4382 #, c-format msgid "cannot change type's storage to PLAIN" msgstr "型の格納方式をPLAINには変更できません" -#: commands/typecmds.c:4462 +#: commands/typecmds.c:4475 #, c-format msgid "type attribute \"%s\" cannot be changed" msgstr "型の属性\"%s\"は変更できません" -#: commands/typecmds.c:4480 +#: commands/typecmds.c:4493 #, c-format msgid "must be superuser to alter a type" msgstr "型の変更を行うにはスーパーユーザーである必要があります" -#: commands/typecmds.c:4501 commands/typecmds.c:4510 +#: commands/typecmds.c:4514 commands/typecmds.c:4523 #, c-format msgid "%s is not a base type" msgstr "\"%s\"は基本型ではありません" @@ -12456,7 +12294,7 @@ msgstr "%s属性を持つロールのみがロールを作成できます。" 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:17463 gram.y:17509 utils/adt/acl.c:5708 utils/adt/acl.c:5714 +#: commands/user.c:354 commands/user.c:1386 commands/user.c:1393 gram.y:17317 gram.y:17363 utils/adt/acl.c:5574 utils/adt/acl.c:5580 #, c-format msgid "role name \"%s\" is reserved" msgstr "ロール名\"%s\"は予約されています" @@ -12545,7 +12383,7 @@ msgstr "%s属性および削除対象ロールに対する%sオプションを msgid "cannot use special role specifier in DROP ROLE" msgstr "DROP ROLE で特殊ロールの識別子は使えません" -#: commands/user.c:1135 commands/user.c:1357 commands/variable.c:864 commands/variable.c:867 commands/variable.c:983 commands/variable.c:986 utils/adt/acl.c:366 utils/adt/acl.c:386 utils/adt/acl.c:5563 utils/adt/acl.c:5611 utils/adt/acl.c:5639 utils/adt/acl.c:5658 utils/adt/regproc.c:1571 utils/init/miscinit.c:801 +#: 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\"は存在しません" @@ -12610,7 +12448,7 @@ msgstr "%1$s属性とロール\"%3$s\"に対する%2$sオプションを持つ msgid "MD5 password cleared because of role rename" msgstr "ロール名が変更されたためMD5パスワードがクリアされました" -#: commands/user.c:1518 gram.y:1286 +#: commands/user.c:1518 gram.y:1294 #, c-format msgid "unrecognized role option \"%s\"" msgstr "ロールオプション\"%s\"が認識できません" @@ -12650,105 +12488,105 @@ msgstr "ロール\"%s\"の権限を持つロールのみが、そのロールが msgid "Only roles with privileges of role \"%s\" may reassign objects to it." msgstr "ロール\"%s\"の権限を持つロールのみが、オブジェクトの所有者をそのロールに変更できます。" -#: commands/user.c:1734 +#: commands/user.c:1733 #, c-format msgid "role \"%s\" cannot be a member of any role" msgstr "ロール\"%s\"はどのロールのメンバーにもなれません" -#: commands/user.c:1747 +#: commands/user.c:1746 #, c-format msgid "role \"%s\" is a member of role \"%s\"" msgstr "ロール\"%s\"はロール\"%s\"のメンバです" -#: commands/user.c:1787 commands/user.c:1813 +#: 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:1890 +#: 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:2025 +#: 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:2126 +#: commands/user.c:2124 #, c-format msgid "role \"%s\" cannot have explicit members" msgstr "ロール\"%s\"は明示的なメンバーを持てません" -#: commands/user.c:2137 commands/user.c:2160 +#: commands/user.c:2135 commands/user.c:2158 #, c-format msgid "permission denied to grant role \"%s\"" msgstr "ロール\"%s\"権限を付与する権限がありません" -#: commands/user.c:2139 +#: 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:2144 commands/user.c:2167 +#: commands/user.c:2142 commands/user.c:2165 #, c-format msgid "permission denied to revoke role \"%s\"" msgstr "ロール\"%s\"の権限を剥奪する権限がありません" -#: commands/user.c:2146 +#: 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:2162 +#: 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:2169 +#: 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:2249 commands/user.c:2258 +#: commands/user.c:2247 commands/user.c:2256 #, c-format msgid "permission denied to grant privileges as role \"%s\"" msgstr "ロール\"%s\"として権限を付与する権限がありません" -#: commands/user.c:2251 +#: 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:2260 +#: commands/user.c:2258 #, c-format msgid "The grantor must have the %s option on role \"%s\"." msgstr "付与者はロール\"%s\"に対する%sオプションを持つ必要があります。" -#: commands/user.c:2268 +#: commands/user.c:2266 #, c-format msgid "permission denied to revoke privileges granted by role \"%s\"" msgstr "ロール\"%s\"によって付与された権限を剥奪する権限がありません" -#: commands/user.c:2270 +#: 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:2493 utils/adt/acl.c:1325 +#: commands/user.c:2491 utils/adt/acl.c:1324 #, c-format msgid "dependent privileges exist" msgstr "依存する権限が存在します" -#: commands/user.c:2494 utils/adt/acl.c:1326 +#: commands/user.c:2492 utils/adt/acl.c:1325 #, c-format msgid "Use CASCADE to revoke them too." msgstr "これらも剥奪するにはCASCADEを使用してください" -#: commands/vacuum.c:133 +#: commands/vacuum.c:134 #, c-format -msgid "\"%s\" must be 0 or between %d kB and %d kB." -msgstr "\"%s\"は0または%d kBと%d kBとの間でなければなりません。" +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:209 #, c-format @@ -12815,47 +12653,42 @@ msgstr "ONLY_DATABASE_STATSは他のVACUUMオプションと一緒に指定す msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%sはVACUUMやANALYZEからは実行できません" -#: commands/vacuum.c:727 +#: commands/vacuum.c:732 #, c-format msgid "permission denied to vacuum \"%s\", skipping it" msgstr "列%sのVACUUMを行う権限がありません、スキップします" -#: commands/vacuum.c:740 +#: commands/vacuum.c:745 #, c-format msgid "permission denied to analyze \"%s\", skipping it" msgstr "列%sのANALYZEを行う権限がありません、スキップします" -#: commands/vacuum.c:818 commands/vacuum.c:919 +#: commands/vacuum.c:823 commands/vacuum.c:920 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "\"%s\"のVACUUM処理をスキップしています -- ロックを獲得できませんでした" -#: commands/vacuum.c:823 +#: commands/vacuum.c:828 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "\"%s\"のVACUUM処理をスキップしています -- リレーションはすでに存在しません" -#: commands/vacuum.c:839 commands/vacuum.c:924 +#: commands/vacuum.c:844 commands/vacuum.c:925 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "\"%s\"のANALYZEをスキップしています --- ロック獲得できませんでした" -#: commands/vacuum.c:844 +#: commands/vacuum.c:849 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "\"%s\"のANALYZEをスキップします --- リレーションはすでに存在しません" -#: commands/vacuum.c:960 -#, c-format -msgid "VACUUM ONLY of partitioned table \"%s\" has no effect" -msgstr "パーティション親テーブル\"%s\"に対する VACUUM ONLY は効果がありません" - -#: commands/vacuum.c:1151 +#: commands/vacuum.c:1141 #, c-format msgid "cutoff for removing and freezing tuples is far in the past" msgstr "タプルの削除およびフリーズのカットオフ値が古すぎます" -#: commands/vacuum.c:1152 commands/vacuum.c:1157 +#: commands/vacuum.c:1142 commands/vacuum.c:1147 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -12864,37 +12697,37 @@ msgstr "" "周回問題を回避するためにすぐに実行中のトランザクションを終了してください。\n" "古い準備済みトランザクションのコミットまたはロールバック、もしくは古いレプリケーションスロットの削除が必要な場合もあります。" -#: commands/vacuum.c:1156 +#: commands/vacuum.c:1146 #, c-format msgid "cutoff for freezing multixacts is far in the past" msgstr "マルチトランザクションのフリーズのカットオフ値が古すぎます" -#: commands/vacuum.c:1912 +#: commands/vacuum.c:1902 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "データベースの一部は20億トランザクション以上の間にVACUUMを実行されていませんでした" -#: commands/vacuum.c:1913 +#: commands/vacuum.c:1903 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "トランザクションの周回によるデータ損失が発生している可能性があります" -#: commands/vacuum.c:2092 +#: commands/vacuum.c:2082 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "\"%s\"をスキップしています --- テーブルではないものや、特別なシステムテーブルに対してはVACUUMを実行できません" -#: commands/vacuum.c:2523 +#: commands/vacuum.c:2514 #, c-format msgid "scanned index \"%s\" to remove %lld row versions" msgstr "インデックス\"%s\"をスキャンして%lldの行バージョンを削除しました" -#: commands/vacuum.c:2542 +#: commands/vacuum.c:2533 #, c-format msgid "index \"%s\" now contains %.0f row versions in %u pages" msgstr "現在インデックス\"%s\"は%.0f行バージョンを%uページで含んでいます" -#: commands/vacuum.c:2546 +#: commands/vacuum.c:2537 #, c-format msgid "" "%.0f index row versions were removed.\n" @@ -12905,13 +12738,13 @@ msgstr "" "%uインデックスページを新たに削除\n" "%uページが現在削除中、うち%uページが再利用可能。" -#: commands/vacuumparallel.c:709 +#: 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:715 +#: 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)" @@ -12919,8 +12752,8 @@ msgstr[0] "インデックスのクリーンアップのために%d個の並列V #: commands/variable.c:185 #, c-format -msgid "Conflicting \"DateStyle\" specifications." -msgstr "\"DateStyle\"指定が競合しています。" +msgid "Conflicting \"datestyle\" specifications." +msgstr "\"datestyle\"指定が競合しています。" #: commands/variable.c:307 #, c-format @@ -12932,12 +12765,12 @@ msgstr "タイムゾーンのインターバル指定では月は指定できま msgid "Cannot specify days in time zone interval." msgstr "タイムゾーンのインターバル指定では日は指定できません。" -#: commands/variable.c:351 commands/variable.c:435 +#: 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:437 +#: commands/variable.c:353 commands/variable.c:435 #, c-format msgid "PostgreSQL does not support leap seconds." msgstr "PostgreSQLはうるう秒をサポートしていません。" @@ -12947,102 +12780,107 @@ msgstr "PostgreSQLはうるう秒をサポートしていません。" msgid "UTC timezone offset is out of range." msgstr "UTCのタイムゾーンオフセットが範囲外です。" -#: commands/variable.c:554 +#: commands/variable.c:552 #, c-format msgid "cannot set transaction read-write mode inside a read-only transaction" msgstr "読み取りのみのトランザクションでトランザクションモードを読み書きモードに設定することはできません" -#: commands/variable.c:561 +#: commands/variable.c:559 #, c-format msgid "transaction read-write mode must be set before any query" msgstr "トランザクションの読み書きモードの設定は、問い合わせより前に行う必要があります" -#: commands/variable.c:568 +#: commands/variable.c:566 #, c-format msgid "cannot set transaction read-write mode during recovery" msgstr "リカバリ中にはトランザクションを読み書きモードに設定できません" -#: commands/variable.c:596 +#: 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:603 +#: 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:610 storage/lmgr/predicate.c:1685 +#: commands/variable.c:606 storage/lmgr/predicate.c:1685 #, c-format msgid "cannot use serializable mode in a hot standby" msgstr "ホットスタンバイ中はシリアライズモードを使用できません" -#: commands/variable.c:611 +#: commands/variable.c:607 #, c-format msgid "You can use REPEATABLE READ instead." msgstr "代わりに REPEATABLE READ を使ってください" -#: commands/variable.c:633 +#: 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:639 +#: 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:715 -#, c-format -msgid "Cannot change \"client_encoding\" during a parallel operation." -msgstr "並列処理中は\"client_encoding\"を変更できません。" - -#: commands/variable.c:743 +#: commands/variable.c:713 #, c-format msgid "Conversion between %s and %s is not supported." msgstr "%sと%s 間の変換はサポートされていません。" -#: commands/variable.c:750 +#: commands/variable.c:720 #, c-format msgid "Cannot change \"client_encoding\" now." msgstr "現在\"client_encoding\"を変更できません。" -#: commands/variable.c:889 +#: 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 "セッション認証を\"%s\"に設定する権限は拒否されます" -#: commands/variable.c:894 +#: commands/variable.c:881 #, c-format msgid "permission denied to set session authorization \"%s\"" msgstr "セッション認証を\"%s\"に設定する権限は拒否されました" -#: commands/variable.c:1003 +#: commands/variable.c:991 #, c-format msgid "permission will be denied to set role \"%s\"" msgstr "ロール\"%s\"を設定する権限がありません" -#: commands/variable.c:1008 +#: commands/variable.c:996 #, c-format msgid "permission denied to set role \"%s\"" msgstr "ロール\"%s\"を設定する権限がありません" -#: commands/variable.c:1212 +#: commands/variable.c:1200 #, c-format msgid "Bonjour is not supported by this build" msgstr "このビルドでは bonjour はサポートされていません" -#: commands/variable.c:1240 commands/variable.c:1254 +#: commands/variable.c:1228 #, c-format -msgid "\"%s\" must be set to 0 on platforms that lack support for issuing read-ahead advice." -msgstr "先読み指示の発行をサポートしていないプラットフォームでは\"%s\"を0に設定する必要があります。" +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:1268 +#: 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:78 +#: commands/view.c:79 #, c-format msgid "could not determine which collation to use for view column \"%s\"" msgstr "ビューの列\"%s\"で使用する照合順序を特定できませんでした" @@ -13127,411 +12965,406 @@ msgstr "カーソル\"%s\"は行上に位置していません" msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "カーソル\"%s\"はテーブル\"%s\"を単純な更新可能スキャンではありません" -#: executor/execCurrent.c:280 executor/execExprInterp.c:3008 +#: 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:3020 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2567 #, c-format msgid "no value found for parameter %d" msgstr "パラメータ%dの値がありません" -#: executor/execExpr.c:667 executor/execExpr.c:674 executor/execExpr.c:680 executor/execExprInterp.c:5355 executor/execExprInterp.c:5372 executor/execExprInterp.c:5471 executor/nodeModifyTable.c:210 executor/nodeModifyTable.c:221 executor/nodeModifyTable.c:238 executor/nodeModifyTable.c:246 +#: 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:204 executor/nodeModifyTable.c:223 executor/nodeModifyTable.c:240 executor/nodeModifyTable.c:250 executor/nodeModifyTable.c:260 #, c-format msgid "table row type and query-specified row type do not match" msgstr "テーブルの行型と問い合わせで指定した行型が一致しません" -#: executor/execExpr.c:668 executor/nodeModifyTable.c:211 +#: executor/execExpr.c:643 executor/nodeModifyTable.c:205 #, c-format msgid "Query has too many columns." msgstr "問い合わせの列が多すぎます" -#: executor/execExpr.c:675 executor/nodeModifyTable.c:239 +#: executor/execExpr.c:650 executor/nodeModifyTable.c:224 #, c-format msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "問い合わせで %d 番目に削除される列の値を指定しています。" -#: executor/execExpr.c:681 executor/execExprInterp.c:5373 executor/nodeModifyTable.c:222 +#: executor/execExpr.c:656 executor/execExprInterp.c:4870 executor/nodeModifyTable.c:251 #, 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:1157 parser/parse_agg.c:843 +#: executor/execExpr.c:1104 parser/parse_agg.c:838 #, c-format msgid "window function calls cannot be nested" msgstr "ウィンドウ関数の呼び出しを入れ子にすることはできません" -#: executor/execExpr.c:1689 +#: executor/execExpr.c:1649 #, c-format msgid "target type is not an array" msgstr "対象型は配列ではありません" -#: executor/execExpr.c:2033 +#: 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:2729 executor/execSRF.c:718 parser/parse_func.c:138 parser/parse_func.c:655 parser/parse_func.c:1033 +#: 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:2756 executor/execSRF.c:738 executor/functions.c:1068 utils/adt/jsonfuncs.c:4055 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:3254 parser/parse_node.c:272 parser/parse_node.c:322 +#: 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:3382 executor/execExpr.c:3404 +#: executor/execExpr.c:3214 executor/execExpr.c:3236 #, c-format msgid "type %s does not support subscripted assignment" msgstr "型%sは添字を使った代入をサポートしません" -#: executor/execExprInterp.c:2330 +#: executor/execExprInterp.c:2019 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "%2$s型の属性%1$dが削除されています" -#: executor/execExprInterp.c:2336 +#: executor/execExprInterp.c:2025 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "型%2$sの属性%1$dの型が間違っています" -#: executor/execExprInterp.c:2338 executor/execExprInterp.c:3697 executor/execExprInterp.c:3743 +#: 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:2418 utils/adt/expandedrecord.c:99 utils/adt/expandedrecord.c:231 utils/cache/typcache.c:1839 utils/cache/typcache.c:1998 utils/cache/typcache.c:2145 utils/fmgr/funcapi.c:569 +#: 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:3181 +#: executor/execExprInterp.c:2710 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "このタイプのテーブルではWHERE CURRENT OFをサポートしません" -#: executor/execExprInterp.c:3394 +#: executor/execExprInterp.c:2923 #, c-format msgid "cannot merge incompatible arrays" msgstr "互換性がない配列をマージできません" -#: executor/execExprInterp.c:3395 +#: 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:3416 utils/adt/arrayfuncs.c:1305 utils/adt/arrayfuncs.c:3515 utils/adt/arrayfuncs.c:5605 utils/adt/arrayfuncs.c:6122 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:3436 executor/execExprInterp.c:3471 +#: executor/execExprInterp.c:2965 executor/execExprInterp.c:3000 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "多次元配列の配列式の次数があっていなければなりません" -#: executor/execExprInterp.c:3448 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:3545 utils/adt/arrayfuncs.c:5377 -#: utils/adt/arrayfuncs.c:6214 utils/adt/arrayfuncs.c:6558 utils/adt/arrayutils.c:83 utils/adt/arrayutils.c:92 utils/adt/arrayutils.c:99 +#: 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:3696 executor/execExprInterp.c:3742 +#: executor/execExprInterp.c:3225 executor/execExprInterp.c:3271 #, c-format msgid "attribute %d has wrong type" msgstr "属性%dの型が間違っています" -#: executor/execExprInterp.c:4328 utils/adt/domains.c:158 +#: 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:4343 utils/adt/domains.c:196 +#: 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:4918 +#: 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:4923 +#: 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:5123 executor/execExprInterp.c:5131 +#: 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:5356 +#: 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:5472 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:602 +#: 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:905 +#: executor/execIndexing.c:870 #, c-format msgid "could not create exclusion constraint \"%s\"" msgstr "排除制約\"%s\"を作成できませんでした" -#: executor/execIndexing.c:908 +#: executor/execIndexing.c:873 #, c-format msgid "Key %s conflicts with key %s." msgstr "キー %s がキー %s と競合しています" -#: executor/execIndexing.c:910 +#: executor/execIndexing.c:875 #, c-format msgid "Key conflicts exist." msgstr "キーの競合が存在します" -#: executor/execIndexing.c:916 +#: executor/execIndexing.c:881 #, c-format msgid "conflicting key value violates exclusion constraint \"%s\"" msgstr "重複キーの値が排除制約\"%s\"に違反しています" -#: executor/execIndexing.c:919 +#: executor/execIndexing.c:884 #, c-format msgid "Key %s conflicts with existing key %s." msgstr "キー %s が既存のキー %s と競合しています" -#: executor/execIndexing.c:921 +#: executor/execIndexing.c:886 #, c-format msgid "Key conflicts with existing key." msgstr "キーが既存のキーと衝突しています" -#: executor/execIndexing.c:1166 -#, c-format -msgid "empty WITHOUT OVERLAPS value found in column \"%s\" in relation \"%s\"" -msgstr "リレーション\"%2$s\"の列\"%1$s\"に空のWITHOUT OVERLAPS値が見つかりました" - -#: executor/execMain.c:1058 +#: executor/execMain.c:1039 #, c-format msgid "cannot change sequence \"%s\"" msgstr "シーケンス\"%s\"を変更できません" -#: executor/execMain.c:1064 +#: executor/execMain.c:1045 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "TOASTリレーション\"%s\"を変更できません" -#: executor/execMain.c:1083 +#: executor/execMain.c:1064 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "実体化ビュー\"%s\"を変更できません" -#: executor/execMain.c:1095 +#: executor/execMain.c:1076 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "外部テーブル\"%s\"への挿入ができません" -#: executor/execMain.c:1101 +#: executor/execMain.c:1082 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "外部テーブル\"%s\"は挿入を許しません" -#: executor/execMain.c:1108 +#: executor/execMain.c:1089 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "外部テーブル \"%s\"の更新ができません" -#: executor/execMain.c:1114 +#: executor/execMain.c:1095 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "外部テーブル\"%s\"は更新を許しません" -#: executor/execMain.c:1121 +#: executor/execMain.c:1102 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "外部テーブル\"%s\"からの削除ができません" -#: executor/execMain.c:1127 +#: executor/execMain.c:1108 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "外部テーブル\"%s\"は削除を許しません" -#: executor/execMain.c:1138 +#: executor/execMain.c:1119 #, c-format msgid "cannot change relation \"%s\"" msgstr "リレーション\"%s\"を変更できません" -#: executor/execMain.c:1165 +#: executor/execMain.c:1146 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "シーケンス\"%s\"では行のロックはできません" -#: executor/execMain.c:1172 +#: executor/execMain.c:1153 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "TOAST リレーション\"%s\"では行のロックはできません" -#: executor/execMain.c:1179 +#: executor/execMain.c:1160 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "ビュー\"%s\"では行のロックはできません" -#: executor/execMain.c:1187 +#: executor/execMain.c:1168 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "実体化ビュー\"%s\"では行のロックはできません" -#: executor/execMain.c:1196 executor/execMain.c:2711 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:1202 +#: executor/execMain.c:1183 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "リレーション\"%s\"では行のロックはできません" -#: executor/execMain.c:1925 +#: executor/execMain.c:1901 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "リレーション\"%s\"の新しい行はパーティション制約に違反しています" -#: executor/execMain.c:1927 executor/execMain.c:2011 executor/execMain.c:2062 executor/execMain.c:2172 +#: 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:2008 +#: 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:2060 +#: executor/execMain.c:2036 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "リレーション\"%s\"の新しい行は検査制約\"%s\"に違反しています" -#: executor/execMain.c:2170 +#: executor/execMain.c:2146 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "新しい行はビュー\"%s\"のチェックオプションに違反しています" -#: executor/execMain.c:2180 +#: 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:2185 +#: executor/execMain.c:2161 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "新しい行はテーブル\"%s\"の行レベルセキュリティポリシに違反しています" -#: executor/execMain.c:2193 +#: 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:2198 +#: 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:2205 +#: 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:2210 +#: 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:328 +#: executor/execPartition.c:327 #, c-format msgid "no partition of relation \"%s\" found for row" msgstr "行に対応するパーティションがリレーション\"%s\"に見つかりません" -#: executor/execPartition.c:331 +#: executor/execPartition.c:330 #, c-format msgid "Partition key of the failing row contains %s." msgstr "失敗した行のパーティションキーは%sを含みます。" -#: executor/execReplication.c:147 +#: 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:151 +#: executor/execReplication.c:276 executor/execReplication.c:460 #, c-format msgid "concurrent update, retrying" msgstr "同時更新がありました、リトライします" -#: executor/execReplication.c:158 +#: executor/execReplication.c:282 executor/execReplication.c:466 #, c-format msgid "concurrent delete, retrying" msgstr "並行する削除がありました、リトライします" -#: executor/execReplication.c:771 executor/execReplication.c:777 executor/execReplication.c:783 +#: 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:687 executor/execReplication.c:693 #, c-format msgid "cannot update table \"%s\"" msgstr "テーブル\"%s\"の更新ができません" -#: executor/execReplication.c:773 executor/execReplication.c:791 +#: 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:779 executor/execReplication.c:797 +#: 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:785 executor/execReplication.c:803 -#, c-format -msgid "Replica identity must not contain unpublished generated columns." -msgstr "複製識別がパブリッシュされていない生成列を含んでいてはなりません。" - -#: executor/execReplication.c:789 executor/execReplication.c:795 executor/execReplication.c:801 +#: executor/execReplication.c:699 executor/execReplication.c:705 #, c-format msgid "cannot delete from table \"%s\"" msgstr "テーブル\"%s\"からの削除ができません" -#: executor/execReplication.c:821 +#: 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:823 +#: 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:827 +#: 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:829 +#: 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:845 +#: executor/execReplication.c:749 #, c-format msgid "cannot use relation \"%s.%s\" as logical replication target" msgstr "リレーション\"%s.%s\"は論理レプリケーション先としては使用できません" @@ -13592,12 +13425,12 @@ msgstr "このタイプのタプルのトランザクション情報は持たな msgid "don't have a storage tuple in this context" msgstr "この文脈ではストレージタプルを保持しないでください" -#: executor/execUtils.c:759 +#: executor/execUtils.c:713 #, c-format msgid "materialized view \"%s\" has not been populated" msgstr "実体化ビュー\"%s\"にはデータが格納されていません" -#: executor/execUtils.c:761 +#: executor/execUtils.c:715 #, c-format msgid "Use the REFRESH MATERIALIZED VIEW command." msgstr "REFRESH MATERIALIZED VIEWコマンドを使用してください。" @@ -13679,12 +13512,12 @@ msgstr "最後のステートメントが返す列が少なすぎます。" msgid "return type %s is not supported for SQL functions" msgstr "戻り値型%sはSQL関数でサポートされていません" -#: executor/nodeAgg.c:3936 executor/nodeWindowAgg.c:3041 +#: 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:3959 parser/parse_agg.c:685 parser/parse_agg.c:713 +#: executor/nodeAgg.c:3966 parser/parse_agg.c:680 parser/parse_agg.c:708 #, c-format msgid "aggregate function calls cannot be nested" msgstr "集約関数の呼び出しを入れ子にすることはできません" @@ -13694,7 +13527,7 @@ msgstr "集約関数の呼び出しを入れ子にすることはできません msgid "custom scan \"%s\" does not support MarkPos" msgstr "カスタムスキャン\"%s\"はMarkPosをサポートしていません" -#: executor/nodeHashjoin.c:1230 executor/nodeHashjoin.c:1260 +#: executor/nodeHashjoin.c:1131 executor/nodeHashjoin.c:1161 #, c-format msgid "could not rewind hash-join temporary file" msgstr "ハッシュ結合用一時ファイルを巻き戻せませんでした" @@ -13714,73 +13547,78 @@ msgstr "OFFSET は負数であってはなりません" msgid "LIMIT must not be negative" msgstr "LIMIT は負数であってはなりません" -#: executor/nodeMergejoin.c:1574 +#: executor/nodeMergejoin.c:1579 #, c-format msgid "RIGHT JOIN is only supported with merge-joinable join conditions" msgstr "RIGHT JOINはマージ結合可能な結合条件でのみサポートされています" -#: executor/nodeMergejoin.c:1592 +#: executor/nodeMergejoin.c:1597 #, c-format msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "FULL JOINはマージ結合可能な結合条件でのみサポートされています" -#: executor/nodeModifyTable.c:247 +#: executor/nodeModifyTable.c:241 +#, c-format +msgid "Query provides a value for a generated column at ordinal position %d." +msgstr "問い合わせで %d 番目に生成列の値を指定しています。" + +#: executor/nodeModifyTable.c:261 #, c-format msgid "Query has too few columns." msgstr "問い合わせの列が少なすぎます。" -#: executor/nodeModifyTable.c:1647 executor/nodeModifyTable.c:1721 +#: executor/nodeModifyTable.c:1561 executor/nodeModifyTable.c:1635 #, c-format msgid "tuple to be deleted was already modified by an operation triggered by the current command" msgstr "削除対象のタプルはすでに現在のコマンドによって引き起こされた操作によって変更されています" -#: executor/nodeModifyTable.c:1920 +#: executor/nodeModifyTable.c:1790 #, c-format msgid "invalid ON UPDATE specification" msgstr "不正な ON UPDATE 指定です" -#: executor/nodeModifyTable.c:1921 +#: executor/nodeModifyTable.c:1791 #, c-format msgid "The result tuple would appear in a different partition than the original tuple." msgstr "結果タプルをもとのパーティションではなく異なるパーティションに追加しようとしました。" -#: executor/nodeModifyTable.c:2377 +#: executor/nodeModifyTable.c:2247 #, 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:2378 +#: executor/nodeModifyTable.c:2248 #, c-format msgid "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." msgstr "外部キーがパーティションルートテーブル\"%2$s\"ではなくパーティション親テーブル\"%1$s\"を指しています。" -#: executor/nodeModifyTable.c:2381 +#: executor/nodeModifyTable.c:2251 #, c-format msgid "Consider defining the foreign key on table \"%s\"." msgstr "テーブル\"%s\"上に外部キー制約を定義することを検討してください。" #. translator: %s is a SQL command name -#: executor/nodeModifyTable.c:2748 executor/nodeModifyTable.c:3297 executor/nodeModifyTable.c:3467 +#: executor/nodeModifyTable.c:2617 executor/nodeModifyTable.c:3159 executor/nodeModifyTable.c:3329 #, c-format msgid "%s command cannot affect row a second time" msgstr "%sコマンドは単一の行に2度は適用できません" -#: executor/nodeModifyTable.c:2750 +#: executor/nodeModifyTable.c:2619 #, c-format msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." msgstr "同じコマンドでの挿入候補の行が同じ制約値を持つことがないようにしてください" -#: executor/nodeModifyTable.c:3290 executor/nodeModifyTable.c:3460 +#: executor/nodeModifyTable.c:3152 executor/nodeModifyTable.c:3322 #, c-format msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" msgstr "更新または削除対象のタプルは、現在のコマンドによって発火した操作トリガーによってすでに更新されています" -#: executor/nodeModifyTable.c:3299 executor/nodeModifyTable.c:3469 +#: executor/nodeModifyTable.c:3161 executor/nodeModifyTable.c:3331 #, c-format msgid "Ensure that not more than one source row matches any one target row." msgstr "ソース行が2行以上ターゲット行に合致しないようにしてください。" -#: executor/nodeModifyTable.c:3368 +#: executor/nodeModifyTable.c:3230 #, c-format msgid "tuple to be merged was already moved to another partition due to concurrent update" msgstr "マージ対象のタプルは同時に行われた更新によってすでに他の子テーブルに移動されています" @@ -13795,7 +13633,7 @@ msgstr "TABLESAMPLEパラメータにnullは指定できません" msgid "TABLESAMPLE REPEATABLE parameter cannot be null" msgstr "TABLESAMPLE REPEATABLE パラメータにnullは指定できません" -#: executor/nodeSubplan.c:317 executor/nodeSubplan.c:343 executor/nodeSubplan.c:397 executor/nodeSubplan.c:1182 +#: 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 "式として使用された副問い合わせが2行以上の行を返しました" @@ -13830,27 +13668,27 @@ msgstr "列\"%s\"でnullは許可されません" msgid "moving-aggregate transition function must not return null" msgstr "移動集約の推移関数はnullを返却してはなりません" -#: executor/nodeWindowAgg.c:2106 +#: executor/nodeWindowAgg.c:2083 #, c-format msgid "frame starting offset must not be null" msgstr "フレームの開始オフセットは NULL であってはなりません" -#: executor/nodeWindowAgg.c:2120 +#: executor/nodeWindowAgg.c:2096 #, c-format msgid "frame starting offset must not be negative" msgstr "フレームの開始オフセットは負数であってはなりません" -#: executor/nodeWindowAgg.c:2133 +#: executor/nodeWindowAgg.c:2108 #, c-format msgid "frame ending offset must not be null" msgstr "フレームの終了オフセットは NULL であってはなりません" -#: executor/nodeWindowAgg.c:2147 +#: executor/nodeWindowAgg.c:2121 #, c-format msgid "frame ending offset must not be negative" msgstr "フレームの終了オフセットは負数であってはなりません" -#: executor/nodeWindowAgg.c:2957 +#: executor/nodeWindowAgg.c:2891 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "集約関数 %s はウィンドウ関数としての使用をサポートしていません" @@ -13901,7 +13739,7 @@ msgstr "カーソルで%s問い合わせを開くことができません" msgid "DECLARE SCROLL CURSOR ... FOR UPDATE/SHARE is not supported" msgstr "DECLARE SCROLL CURSOR ... FOR UPDATE/SHAREはサポートされていません" -#: executor/spi.c:1719 parser/analyze.c:3122 +#: executor/spi.c:1719 parser/analyze.c:2928 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "スクロール可能カーソルは読み取り専用である必要があります。" @@ -13919,8 +13757,8 @@ msgstr "%s問い合わせがタプルを返しません" #: executor/spi.c:2987 #, c-format -msgid "PL/pgSQL expression \"%s\"" -msgstr "PL/pgSQL式 \"%s\"" +msgid "SQL expression \"%s\"" +msgstr "SQL関数\"%s\"" #: executor/spi.c:2992 #, c-format @@ -13942,7 +13780,7 @@ msgstr "共有メモリキューにタプルを送出できませんでした" msgid "user mapping not found for user \"%s\", server \"%s\"" msgstr "ユーザー\"%s\"、サーバー\"%s\"に対するユーザーマッピングが見つかりません" -#: foreign/foreign.c:336 optimizer/plan/createplan.c:7241 optimizer/util/plancat.c:540 +#: 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 "非システムの外部テーブルへのアクセスは制限されています" @@ -13962,455 +13800,463 @@ msgstr "おそらくオプション\"%s\"なのではないでしょうか。" msgid "There are no valid options in this context." msgstr "このコンテクストで有効なオプションはありません。" -#: gram.y:1223 +#: gram.y:1231 #, c-format msgid "UNENCRYPTED PASSWORD is no longer supported" msgstr "UNENCRYPTED PASSWORD は今後サポートされません" -#: gram.y:1224 +#: gram.y:1232 #, c-format msgid "Remove UNENCRYPTED to store the password in encrypted form instead." msgstr "UNENCRYPTED を削除してください。そうすれば替わりにパスワードを暗号化形式で格納します。" -#: gram.y:1551 gram.y:1567 +#: 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:1728 +#: gram.y:1727 #, c-format msgid "current database cannot be changed" msgstr "現在のデータベースを変更できません" -#: gram.y:1869 +#: gram.y:1860 #, c-format msgid "time zone interval must be HOUR or HOUR TO MINUTE" msgstr "タイムゾーンの間隔はHOURまたはHOUR TO MINUTEでなければなりません" -#: gram.y:2501 +#: gram.y:2487 #, c-format msgid "column number must be in range from 1 to %d" msgstr "列番号は1から%dまでの範囲でなければなりません" -#: gram.y:3097 +#: gram.y:3083 #, c-format msgid "sequence option \"%s\" not supported here" msgstr "シーケンスのオプション\"%s\"はここではサポートされていません" -#: gram.y:3136 +#: gram.y:3122 #, c-format msgid "modulus for hash partition provided more than once" msgstr "ハッシュパーティションで法(除数)が2回以上指定されています" -#: gram.y:3145 +#: gram.y:3131 #, c-format msgid "remainder for hash partition provided more than once" msgstr "ハッシュパーティションで剰余が2回以上指定されています" -#: gram.y:3152 +#: gram.y:3138 #, c-format msgid "unrecognized hash partition bound specification \"%s\"" msgstr "ハッシュパーティションの境界条件\"%s\"が認識できません" -#: gram.y:3160 +#: gram.y:3146 #, c-format msgid "modulus for hash partition must be specified" msgstr "ハッシュパーティションでは法(除数)の指定が必要です" -#: gram.y:3165 +#: gram.y:3150 #, c-format msgid "remainder for hash partition must be specified" msgstr "ハッシュパーティションでは剰余の指定が必要です" -#: gram.y:3374 gram.y:3409 +#: gram.y:3358 gram.y:3392 #, c-format msgid "STDIN/STDOUT not allowed with PROGRAM" msgstr "STDIN/STDOUTはPROGRAMと同時に使用できません" -#: gram.y:3380 +#: gram.y:3364 #, c-format msgid "WHERE clause not allowed with COPY TO" msgstr "COPY TO で WHERE 句は使用できません" -#: gram.y:3729 gram.y:3736 gram.y:13154 gram.y:13162 +#: 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:4017 +#: gram.y:3995 #, c-format msgid "for a generated column, GENERATED ALWAYS must be specified" msgstr "生成カラムに対しては GENERATED ALWAYS の指定が必須です" -#: gram.y:4421 utils/adt/ri_triggers.c:2258 +#: gram.y:4340 utils/adt/ri_triggers.c:2103 #, c-format msgid "MATCH PARTIAL not yet implemented" msgstr "MMATCH PARTIAL はまだ実装されていません" -#: gram.y:4513 +#: gram.y:4432 #, c-format msgid "a column list with %s is only supported for ON DELETE actions" msgstr "%sが指定された列リストはON DELETEのアクションに対してのみサポートされます" -#: gram.y:5232 +#: gram.y:5151 #, c-format msgid "CREATE EXTENSION ... FROM is no longer supported" msgstr "CREATE EXTENSION ... FROM はすでにサポートされていません" -#: gram.y:5930 +#: gram.y:5849 #, c-format msgid "unrecognized row security option \"%s\"" msgstr "認識できない行セキュリティオプション \"%s\"" -#: gram.y:5931 +#: gram.y:5850 #, c-format msgid "Only PERMISSIVE or RESTRICTIVE policies are supported currently." msgstr "現時点ではPERMISSIVEもしくはRESTRICTIVEポリシのみがサポートされています" -#: gram.y:6016 +#: gram.y:5935 #, c-format msgid "CREATE OR REPLACE CONSTRAINT TRIGGER is not supported" msgstr "CREATE OR REPLACE CONSTRAINT TRIGGERはサポートされません" -#: gram.y:6054 +#: gram.y:5972 msgid "duplicate trigger events specified" msgstr "重複したトリガーイベントが指定されました" -#: gram.y:6196 parser/parse_utilcmd.c:3922 parser/parse_utilcmd.c:3948 +#: 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:6204 +#: gram.y:6121 #, c-format msgid "conflicting constraint properties" msgstr "制約属性の競合" -#: gram.y:6305 +#: gram.y:6220 #, c-format msgid "CREATE ASSERTION is not yet implemented" msgstr "CREATE ASSERTIONはまだ実装されていません" -#: gram.y:6623 +#: gram.y:6537 #, c-format msgid "dropping an enum value is not implemented" msgstr "列挙型の値の削除は実装されていません" -#: gram.y:8602 +#: gram.y:6655 +#, c-format +msgid "RECHECK is no longer required" +msgstr "RECHECK はもはや必要とされません" + +#: gram.y:6656 +#, c-format +msgid "Update your data type." +msgstr "データ型を更新してください" + +#: gram.y:8529 #, c-format msgid "aggregates cannot have output arguments" msgstr "集約は出力の引数を持つことができません" -#: gram.y:9066 utils/adt/regproc.c:670 +#: gram.y:8992 utils/adt/regproc.c:670 #, c-format msgid "missing argument" msgstr "引数が足りません" -#: gram.y:9067 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:11295 gram.y:11314 +#: gram.y:11221 gram.y:11240 #, c-format msgid "WITH CHECK OPTION not supported on recursive views" msgstr "WITH CHECK OPTIONは再帰ビューではサポートされていません" -#: gram.y:13301 +#: gram.y:13162 #, c-format msgid "LIMIT #,# syntax is not supported" msgstr "LIMIT #,#構文は実装されていません" -#: gram.y:13302 +#: gram.y:13163 #, c-format msgid "Use separate LIMIT and OFFSET clauses." msgstr "分割してLIMITとOFFSET句を使用してください" -#: gram.y:14190 +#: gram.y:14038 #, c-format msgid "only one DEFAULT value is allowed" msgstr "DEFAULT値は一つだけ指定可能です" -#: gram.y:14199 +#: gram.y:14047 #, c-format msgid "only one PATH value per column is allowed" msgstr "列一つにつきPATH値は一つだけ指定可能です" -#: gram.y:14208 +#: gram.y:14056 #, c-format msgid "conflicting or redundant NULL / NOT NULL declarations for column \"%s\"" msgstr "列\"%s\"でNULL / NOT NULL宣言が衝突しているか重複しています" -#: gram.y:14217 +#: gram.y:14065 #, c-format msgid "unrecognized column option \"%s\"" msgstr "認識できない列オプション \"%s\"" -#: gram.y:14299 +#: gram.y:14098 +#, c-format +msgid "option name \"%s\" cannot be used in XMLTABLE" +msgstr "オプション名 \"%s\" は XMLTABLE の中では使用できません" + +#: gram.y:14154 #, c-format msgid "only string constants are supported in JSON_TABLE path specification" msgstr "JSON_TABLEパス指定では文字列定数のみがサポートされます" -#: gram.y:14621 +#: gram.y:14476 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "浮動小数点数の型の精度は最低でも1ビット必要です" -#: gram.y:14630 +#: gram.y:14485 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "浮動小数点型の精度は54ビットより低くなければなりません" -#: gram.y:15147 +#: gram.y:15002 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "OVERLAPS式の左辺のパラメータ数が間違っています" -#: gram.y:15152 +#: gram.y:15007 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "OVERLAPS式の右辺のパラメータ数が間違っています" -#: gram.y:15329 +#: gram.y:15184 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "UNIQUE 述部はまだ実装されていません" -#: gram.y:15743 +#: gram.y:15598 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "複数のORDER BY句はWITHIN GROUPと一緒には使用できません" -#: gram.y:15748 +#: gram.y:15603 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "DISTINCT は WITHIN GROUP と同時には使えません" -#: gram.y:15753 +#: gram.y:15608 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "VARIADIC は WITHIN GROUP と同時には使えません" -#: gram.y:16480 gram.y:16504 +#: gram.y:16335 gram.y:16359 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "フレームの開始は UNBOUNDED FOLLOWING であってはなりません" -#: gram.y:16485 +#: gram.y:16340 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "次の行から始まるフレームは、現在行では終了できません" -#: gram.y:16509 +#: gram.y:16364 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "フレームの終了は UNBOUNDED PRECEDING であってはなりません" -#: gram.y:16515 +#: gram.y:16370 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "現在行から始まるフレームは、先行する行を含むことができません" -#: gram.y:16522 +#: gram.y:16377 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "次の行から始まるフレームは、先行する行を含むことができません" -#: gram.y:17071 +#: gram.y:16926 #, c-format msgid "unrecognized JSON encoding: %s" msgstr "不明なJSON符号化方式: \"%s\"" -#: gram.y:17396 +#: gram.y:17250 #, c-format msgid "type modifier cannot have parameter name" msgstr "型修正子はパラメータ名を持つことはできません" -#: gram.y:17402 +#: gram.y:17256 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "型修正子はORDER BYを持つことはできません" -#: gram.y:17470 gram.y:17477 gram.y:17484 +#: gram.y:17324 gram.y:17331 gram.y:17338 #, c-format msgid "%s cannot be used as a role name here" msgstr "%sはここではロール名として使用できません" -#: gram.y:17574 gram.y:19101 +#: gram.y:17428 gram.y:18913 #, c-format msgid "WITH TIES cannot be specified without ORDER BY clause" msgstr "WITH TIESはORDER BY句なしでは指定できません" -#: gram.y:18794 gram.y:18969 +#: gram.y:18604 gram.y:18779 msgid "improper use of \"*\"" msgstr "\"*\"の使い方が不適切です" -#: gram.y:18932 gram.y:18949 tsearch/spell.c:964 tsearch/spell.c:981 tsearch/spell.c:998 tsearch/spell.c:1015 tsearch/spell.c:1080 +#: gram.y:18742 gram.y:18759 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:19033 +#: gram.y:18843 #, 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:19070 +#: gram.y:18880 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "複数のORDER BY句は使用できません" -#: gram.y:19081 +#: gram.y:18891 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "複数のOFFSET句は使用できません" -#: gram.y:19090 +#: gram.y:18900 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "複数のLIMIT句は使用できません" -#: gram.y:19126 +#: gram.y:18909 +#, c-format +msgid "multiple limit options not allowed" +msgstr "複数のLIMITオプションは使用できません" + +#: gram.y:18936 #, c-format msgid "multiple WITH clauses not allowed" msgstr "複数の WITH 句は使用できません" -#: gram.y:19324 +#: gram.y:19129 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "テーブル関数では OUT と INOUT 引数は使用できません" -#: gram.y:19458 +#: gram.y:19262 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "複数の COLLATE 句は使用できません" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:19498 gram.y:19511 +#: gram.y:19300 gram.y:19313 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "%s制約は遅延可能にはできません" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:19524 +#: gram.y:19326 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "%s制約をNOT VALIDとマークすることはできません" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:19537 +#: gram.y:19339 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "%s制約をNO INHERITをマークすることはできません" -#. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:19550 -#, c-format -msgid "%s constraints cannot be marked NOT ENFORCED" -msgstr "%s制約をNOT ENFORCEDとマークすることはできません" - -#. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:19572 -#, c-format -msgid "%s constraints cannot be marked ENFORCED" -msgstr "%s制約をENFORCEDとマークすることはできません" - -#: gram.y:19594 +#: gram.y:19361 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "識別できないパーティションストラテジ \"%s\"" -#: gram.y:19618 +#: gram.y:19385 #, c-format msgid "invalid publication object list" msgstr "不正なパブリケーションオブジェクトリスト" -#: gram.y:19619 +#: gram.y:19386 #, 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:19635 +#: gram.y:19402 #, c-format msgid "invalid table name" msgstr "不正なテーブル名" -#: gram.y:19656 +#: gram.y:19423 #, c-format msgid "WHERE clause not allowed for schema" msgstr "WHERE句はスキーマに対しては使用できません" -#: gram.y:19663 +#: gram.y:19430 #, c-format msgid "column specification not allowed for schema" msgstr "列指定はスキーマに対しては使用できません" -#: gram.y:19677 +#: gram.y:19444 #, 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:518 +#: guc-file.l:511 #, c-format msgid "syntax error in file \"%s\" line %u, near end of line" msgstr "ファイル\"%s\"の行%uの行末近辺で構文エラーがありました" -#: guc-file.l:528 +#: guc-file.l:521 #, c-format msgid "syntax error in file \"%s\" line %u, near token \"%s\"" msgstr "ファイル\"%s\"の行%uのトークン\"%s\"近辺で構文エラーがありました" -#: guc-file.l:548 +#: guc-file.l:541 #, c-format msgid "too many syntax errors found, abandoning file \"%s\"" msgstr "多くの構文エラーがありました。ファイル\"%s\"を断念します" -#: jsonpath_gram.y:268 jsonpath_gram.y:600 jsonpath_scan.l:617 jsonpath_scan.l:628 jsonpath_scan.l:638 jsonpath_scan.l:690 utils/adt/encode.c:513 utils/adt/encode.c:578 utils/adt/jsonfuncs.c:660 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 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:269 +#: jsonpath_gram.y:267 #, c-format msgid ".decimal() can only have an optional precision[,scale]." msgstr ".decimal()では\"精度[,スケール]\"のオプションを1つだけ指定可能です" -#: jsonpath_gram.y:601 +#: jsonpath_gram.y:599 #, c-format msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." msgstr "LIKE_REGEX 述語の中に認識できないフラグ文字\"%.*s\"があります。" -#: jsonpath_gram.y:631 tsearch/spell.c:750 utils/adt/regexp.c:223 +#: 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:679 +#: jsonpath_gram.y:677 #, c-format msgid "XQuery \"x\" flag (expanded regular expressions) is not implemented" msgstr "XQueryの\"x\"フラグ(拡張正規表現)は実装されていません" @@ -14427,48 +14273,48 @@ msgstr "不正な16進文字列" msgid "unexpected end after backslash" msgstr "バックスラッシュの後の想定外の終了" -#: jsonpath_scan.l:201 repl_scanner.l:217 scan.l:742 +#: jsonpath_scan.l:201 repl_scanner.l:211 scan.l:756 msgid "unterminated quoted string" msgstr "文字列の引用符が閉じていません" -#: jsonpath_scan.l:227 +#: jsonpath_scan.l:228 msgid "unexpected end of comment" msgstr "コメントの想定外の終了" -#: jsonpath_scan.l:317 +#: jsonpath_scan.l:319 msgid "invalid numeric literal" msgstr "不正なnumericリテラル" -#: jsonpath_scan.l:322 jsonpath_scan.l:327 jsonpath_scan.l:332 scan.l:1056 scan.l:1060 scan.l:1064 scan.l:1068 +#: 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:378 +#: 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:385 +#: jsonpath_scan.l:382 #, c-format msgid "%s at or near \"%s\" of jsonpath input" msgstr "jsonpath 入力の\"%2$s\"または近くに %1$s があります" -#: jsonpath_scan.l:545 +#: jsonpath_scan.l:568 msgid "invalid input" msgstr "不正な入力" -#: jsonpath_scan.l:571 +#: jsonpath_scan.l:594 msgid "invalid hexadecimal digit" msgstr "不正な16進数桁" -#: jsonpath_scan.l:584 utils/adt/jsonfuncs.c:648 +#: jsonpath_scan.l:607 utils/adt/jsonfuncs.c:647 #, c-format msgid "unsupported Unicode escape sequence" msgstr "サポートされないUnicodeエスケープシーケンス" -#: jsonpath_scan.l:602 +#: jsonpath_scan.l:625 #, c-format msgid "could not convert Unicode to server encoding" msgstr "Unicodeのサーバーエンコーディングへの変換に失敗しました" @@ -14478,709 +14324,704 @@ msgstr "Unicodeのサーバーエンコーディングへの変換に失敗し msgid "Failed on DSA request of size %zu." msgstr "サイズ%zuの動的共有エリアの要求に失敗しました。" -#: libpq/auth-sasl.c:89 +#: libpq/auth-sasl.c:97 #, c-format msgid "expected SASL response, got message type %d" msgstr "SASL応答を想定していましたが、メッセージタイプ%dを受け取りました" -#: libpq/auth-scram.c:267 +#: libpq/auth-scram.c:263 #, c-format msgid "client selected an invalid SASL authentication mechanism" msgstr "クライアントが無効なSASL認証機構を選択しました" -#: libpq/auth-scram.c:291 libpq/auth-scram.c:547 libpq/auth-scram.c:558 +#: 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:302 +#: libpq/auth-scram.c:298 #, c-format msgid "User \"%s\" does not have a valid SCRAM secret." msgstr "ユーザー\"%s\"は有効なSCRAMシークレットを持ちません。" -#: libpq/auth-scram.c:382 libpq/auth-scram.c:387 libpq/auth-scram.c:751 libpq/auth-scram.c:759 libpq/auth-scram.c:864 libpq/auth-scram.c:877 libpq/auth-scram.c:887 libpq/auth-scram.c:995 libpq/auth-scram.c:1002 libpq/auth-scram.c:1017 libpq/auth-scram.c:1032 libpq/auth-scram.c:1046 libpq/auth-scram.c:1064 libpq/auth-scram.c:1079 libpq/auth-scram.c:1392 libpq/auth-scram.c:1400 +#: 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:383 +#: libpq/auth-scram.c:379 #, c-format msgid "The message is empty." msgstr "メッセージが空です。" -#: libpq/auth-scram.c:388 +#: libpq/auth-scram.c:384 #, c-format msgid "Message length does not match input length." msgstr "メッセージの長さが入力の長さと一致しません" -#: libpq/auth-scram.c:420 +#: libpq/auth-scram.c:416 #, c-format msgid "invalid SCRAM response" msgstr "不正なSCRAM応答" -#: libpq/auth-scram.c:421 +#: libpq/auth-scram.c:417 #, c-format msgid "Nonce does not match." msgstr "Nonce が合致しません" -#: libpq/auth-scram.c:504 +#: libpq/auth-scram.c:493 #, c-format msgid "could not generate random salt" msgstr "乱数ソルトを生成できませんでした" -#: libpq/auth-scram.c:752 +#: libpq/auth-scram.c:738 #, c-format msgid "Expected attribute \"%c\" but found \"%s\"." msgstr "属性\"%c\"を想定していましたが、\"%s\"でした。" -#: libpq/auth-scram.c:760 libpq/auth-scram.c:888 +#: libpq/auth-scram.c:746 libpq/auth-scram.c:874 #, c-format msgid "Expected character \"=\" for attribute \"%c\"." msgstr "属性\"%c\"としては文字\"=\"を想定していました。" -#: libpq/auth-scram.c:865 +#: libpq/auth-scram.c:851 #, c-format msgid "Attribute expected, but found end of string." msgstr "属性を想定しましたが、文字列が終了しました。" -#: libpq/auth-scram.c:878 +#: libpq/auth-scram.c:864 #, c-format msgid "Attribute expected, but found invalid character \"%s\"." msgstr "属性を想定しましたが、不正な文字\"%s\"でした。" -#: libpq/auth-scram.c:996 libpq/auth-scram.c:1018 +#: 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:1003 libpq/auth-scram.c:1033 +#: 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:1024 +#: libpq/auth-scram.c:1010 #, c-format msgid "SCRAM channel binding negotiation error" msgstr "SCRAM チャネルバインディングのネゴシエーションエラー" -#: libpq/auth-scram.c:1025 +#: 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:1047 +#: 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:1058 +#: libpq/auth-scram.c:1044 #, c-format msgid "unsupported SCRAM channel-binding type \"%s\"" msgstr "SCRAM チャネルバインディングタイプ \"%s\"はサポートされていません" -#: libpq/auth-scram.c:1065 +#: libpq/auth-scram.c:1051 #, c-format msgid "Unexpected channel-binding flag \"%s\"." msgstr "予期しないチャネル割り当てフラグ \"%s\"" -#: libpq/auth-scram.c:1075 +#: libpq/auth-scram.c:1061 #, c-format msgid "client uses authorization identity, but it is not supported" msgstr "クライアントは認証識別子を使っていますがサポートされていません" -#: libpq/auth-scram.c:1080 +#: libpq/auth-scram.c:1066 #, c-format msgid "Unexpected attribute \"%s\" in client-first-message." msgstr "client-fist-message での想定外の属性\"%s\"" -#: libpq/auth-scram.c:1096 +#: libpq/auth-scram.c:1082 #, c-format msgid "client requires an unsupported SCRAM extension" msgstr "クライアントはサポート外のSCRAM拡張を要求しています" -#: libpq/auth-scram.c:1110 +#: libpq/auth-scram.c:1096 #, c-format msgid "non-printable characters in SCRAM nonce" msgstr "SCRAM nonce の中に表示不能な文字があります" -#: libpq/auth-scram.c:1240 +#: libpq/auth-scram.c:1227 #, c-format msgid "could not generate random nonce" msgstr "乱数nonceを生成できませんでした" -#: libpq/auth-scram.c:1250 +#: libpq/auth-scram.c:1237 #, c-format msgid "could not encode random nonce" msgstr "乱数nonceをエンコードできませんでした" -#: libpq/auth-scram.c:1356 +#: libpq/auth-scram.c:1343 #, c-format msgid "SCRAM channel binding check failed" msgstr "SCRAM チャネルバインディングの確認で失敗しました" -#: libpq/auth-scram.c:1374 +#: 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:1393 +#: libpq/auth-scram.c:1380 #, c-format msgid "Malformed proof in client-final-message." msgstr "client-final-message 中の proof の形式が不正です" -#: libpq/auth-scram.c:1401 +#: libpq/auth-scram.c:1388 #, c-format msgid "Garbage found at the end of client-final-message." msgstr "client-final-message の終端に不要なデータがあります。" -#: libpq/auth.c:253 +#: libpq/auth.c:269 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "ユーザー\"%s\"の認証に失敗しました: ホストを拒絶しました" -#: libpq/auth.c:256 +#: libpq/auth.c:272 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"の\"trust\"認証に失敗しました" -#: libpq/auth.c:259 +#: libpq/auth.c:275 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"のIdent認証に失敗しました" -#: libpq/auth.c:262 +#: libpq/auth.c:278 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"で対向(peer)認証に失敗しました" -#: libpq/auth.c:267 +#: libpq/auth.c:283 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"のパスワード認証に失敗しました" -#: libpq/auth.c:272 +#: libpq/auth.c:288 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"のGSSAPI認証に失敗しました" -#: libpq/auth.c:275 +#: libpq/auth.c:291 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"のSSPI認証に失敗しました" -#: libpq/auth.c:278 +#: libpq/auth.c:294 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"のPAM認証に失敗しました" -#: libpq/auth.c:281 +#: libpq/auth.c:297 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"のBSD認証に失敗しました" -#: libpq/auth.c:284 +#: libpq/auth.c:300 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"のLDAP認証に失敗しました" -#: libpq/auth.c:287 +#: libpq/auth.c:303 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"の証明書認証に失敗しました" -#: libpq/auth.c:290 +#: libpq/auth.c:306 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "ユーザー\"%s\"の RADIUS 認証に失敗しました" -#: libpq/auth.c:293 +#: libpq/auth.c:309 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "ユーザー\"%s\"の認証に失敗しました: 認証方式が不正です" -#: libpq/auth.c:297 +#: libpq/auth.c:313 #, c-format msgid "Connection matched file \"%s\" line %d: \"%s\"" msgstr "接続はファイル%sの行%dに一致しました: \"%s\"" -#: libpq/auth.c:341 +#: libpq/auth.c:357 #, c-format msgid "authentication identifier set more than once" msgstr "認証識別子が2度以上設定されました" -#: libpq/auth.c:342 +#: libpq/auth.c:358 #, c-format msgid "previous identifier: \"%s\"; new identifier: \"%s\"" msgstr "以前の識別子: \"%s\"; 新しい識別子: \"%s\"" -#: libpq/auth.c:352 +#: libpq/auth.c:368 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" msgstr "接続認証完了: 識別名=\"%s\" 方式=%s (%s:%d)" -#: libpq/auth.c:392 +#: libpq/auth.c:408 #, c-format msgid "client certificates can only be checked if a root certificate store is available" msgstr "クライアント証明書はルート証明書ストアが利用できる場合にのみ検証されます" -#: libpq/auth.c:403 +#: libpq/auth.c:419 #, c-format msgid "connection requires a valid client certificate" msgstr "この接続には有効なクライアント証明が必要です" -#: libpq/auth.c:434 libpq/auth.c:480 +#: libpq/auth.c:450 libpq/auth.c:496 msgid "GSS encryption" msgstr "GSS暗号化" -#: libpq/auth.c:437 libpq/auth.c:483 +#: libpq/auth.c:453 libpq/auth.c:499 msgid "SSL encryption" msgstr "SSL暗号化" -#: libpq/auth.c:439 libpq/auth.c:485 +#: libpq/auth.c:455 libpq/auth.c:501 msgid "no encryption" msgstr "暗号化なし" #. translator: last %s describes encryption state -#: libpq/auth.c:445 +#: 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:452 +#: 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:490 +#: libpq/auth.c:506 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "クライアントIPアドレスは\"%s\"に解決され、前方検索と一致しました。" -#: libpq/auth.c:493 +#: libpq/auth.c:509 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "クライアントIPアドレスは\"%s\"に解決されました。前方検索は検査されません。" -#: libpq/auth.c:496 +#: libpq/auth.c:512 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "クライアントIPアドレスは\"%s\"に解決され、前方検索と一致しませんでした。" -#: libpq/auth.c:499 +#: 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:504 +#: 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:512 +#: 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:520 +#: 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:640 +#: libpq/auth.c:656 #, c-format msgid "connection authenticated: user=\"%s\" method=%s (%s:%d)" msgstr "接続認証完了: ユーザー=\"%s\" 方式=%s (%s:%d)" -#: libpq/auth.c:709 +#: libpq/auth.c:725 #, c-format msgid "expected password response, got message type %d" msgstr "パスワード応答を想定しましたが、メッセージタイプ%dを受け取りました" -#: libpq/auth.c:730 +#: libpq/auth.c:746 #, c-format msgid "invalid password packet size" msgstr "パスワードパケットのサイズが不正です" -#: libpq/auth.c:748 +#: libpq/auth.c:764 #, c-format msgid "empty password returned by client" msgstr "クライアントから空のパスワードが返されました" -#: libpq/auth.c:876 +#: libpq/auth.c:892 #, c-format msgid "could not generate random MD5 salt" msgstr "ランダムなMD5ソルトの生成に失敗しました" -#: libpq/auth.c:927 libpq/be-secure-gssapi.c:543 +#: libpq/auth.c:943 libpq/be-secure-gssapi.c:550 #, c-format msgid "could not set environment: %m" msgstr "環境を設定できません: %m" -#: libpq/auth.c:966 +#: libpq/auth.c:982 #, c-format msgid "expected GSS response, got message type %d" msgstr "GSS応答を想定しましたが、メッセージタイプ %d を受け取りました" -#: libpq/auth.c:1032 +#: libpq/auth.c:1048 msgid "accepting GSS security context failed" msgstr "GSSセキュリティコンテキストの受け付けに失敗しました" -#: libpq/auth.c:1073 +#: libpq/auth.c:1089 msgid "retrieving GSS user name failed" msgstr "GSSユーザー名の受信に失敗しました" -#: libpq/auth.c:1219 +#: libpq/auth.c:1235 msgid "could not acquire SSPI credentials" msgstr "SSPIの資格ハンドルを入手できませんでした" -#: libpq/auth.c:1244 +#: libpq/auth.c:1260 #, c-format msgid "expected SSPI response, got message type %d" msgstr "SSPI応答を想定しましたが、メッセージタイプ%dを受け取りました" -#: libpq/auth.c:1322 +#: libpq/auth.c:1338 msgid "could not accept SSPI security context" msgstr "SSPIセキュリティコンテキストを受け付けられませんでした" -#: libpq/auth.c:1363 +#: libpq/auth.c:1379 msgid "could not get token from SSPI security context" msgstr "SSPIセキュリティコンテキストからトークンを入手できませんでした" -#: libpq/auth.c:1499 libpq/auth.c:1518 +#: libpq/auth.c:1515 libpq/auth.c:1534 #, c-format msgid "could not translate name" msgstr "名前の変換ができませんでした" -#: libpq/auth.c:1531 +#: libpq/auth.c:1547 #, c-format msgid "realm name too long" msgstr "realm名が長すぎます" -#: libpq/auth.c:1546 +#: libpq/auth.c:1562 #, c-format msgid "translated account name too long" msgstr "変換後のアカウント名が長すぎます" -#: libpq/auth.c:1725 +#: libpq/auth.c:1741 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "Ident接続用のソケットを作成できませんでした: %m" -#: libpq/auth.c:1740 +#: libpq/auth.c:1756 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "ローカルアドレス\"%s\"にバインドできませんでした: %m" -#: libpq/auth.c:1752 +#: 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:1774 +#: 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:1791 +#: 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:1801 +#: libpq/auth.c:1817 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "Identサーバーからの応答の書式が不正です: \"%s\"" -#: libpq/auth.c:1857 +#: libpq/auth.c:1870 #, c-format msgid "peer authentication is not supported on this platform" msgstr "このプラットフォームでは対向(peer)認証はサポートされていません" -#: libpq/auth.c:1861 +#: libpq/auth.c:1874 #, c-format msgid "could not get peer credentials: %m" msgstr "ピアの資格証明を入手できませんでした: %m" -#: libpq/auth.c:1871 -#, c-format -msgid "could not look up local user ID %ld: %m" -msgstr "ローカルユーザーID %ldの参照に失敗しました: %m" - -#: libpq/auth.c:1877 +#: libpq/auth.c:1886 #, c-format -msgid "local user with ID %ld does not exist" -msgstr "ID %ld を持つローカルユーザーは存在しません" +msgid "could not look up local user ID %ld: %s" +msgstr "ローカルユーザーID %ldの参照に失敗しました: %s" -#: libpq/auth.c:1977 +#: libpq/auth.c:1988 #, c-format msgid "error from underlying PAM layer: %s" msgstr "背後のPAM層でエラーがありました: %s" -#: libpq/auth.c:1988 +#: libpq/auth.c:1999 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" msgstr "非サポートのPAM変換%d/\"%s\"" -#: libpq/auth.c:2045 +#: libpq/auth.c:2056 #, c-format msgid "could not create PAM authenticator: %s" msgstr "PAM authenticatorを作成できませんでした: %s" -#: libpq/auth.c:2056 +#: libpq/auth.c:2067 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "pam_set_item(PAM_USER)が失敗しました: %s" -#: libpq/auth.c:2088 +#: libpq/auth.c:2099 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "pam_set_item(PAM_RHOST)が失敗しました: %s" -#: libpq/auth.c:2100 +#: libpq/auth.c:2111 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "\"pam_set_item(PAM_CONV)が失敗しました: %s" -#: libpq/auth.c:2113 +#: libpq/auth.c:2124 #, c-format msgid "pam_authenticate failed: %s" msgstr "\"pam_authenticateが失敗しました: %s" -#: libpq/auth.c:2126 +#: libpq/auth.c:2137 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "pam_acct_mgmtが失敗しました: %s" -#: libpq/auth.c:2137 +#: libpq/auth.c:2148 #, c-format msgid "could not release PAM authenticator: %s" msgstr "PAM authenticatorを解放できませんでした: %s" -#: libpq/auth.c:2217 +#: libpq/auth.c:2228 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "LDAPを初期化できませんでした: %d" -#: libpq/auth.c:2254 +#: libpq/auth.c:2265 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "ldapbasedn からドメイン名を抽出できませんでした" -#: libpq/auth.c:2262 +#: 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:2264 +#: libpq/auth.c:2275 #, c-format msgid "Set an LDAP server name explicitly." msgstr "LDAPサーバー名を明示的に指定してください。" -#: libpq/auth.c:2316 +#: libpq/auth.c:2327 #, c-format msgid "could not initialize LDAP: %s" msgstr "LDAPを初期化できませんでした: %s" -#: libpq/auth.c:2326 +#: libpq/auth.c:2337 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "この LDAP ライブラリでは ldaps はサポートされていません" -#: libpq/auth.c:2334 +#: libpq/auth.c:2345 #, c-format msgid "could not initialize LDAP: %m" msgstr "LDAPを初期化できませんでした: %m" -#: libpq/auth.c:2344 +#: libpq/auth.c:2355 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "LDAPプロトコルバージョンを設定できませんでした: %s" -#: libpq/auth.c:2360 +#: libpq/auth.c:2371 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "LDAP TLSセッションを開始できませんでした: %s" -#: libpq/auth.c:2437 +#: libpq/auth.c:2448 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "LDAP サーバーも ldapbasedn も指定されていません" -#: libpq/auth.c:2444 +#: libpq/auth.c:2455 #, c-format msgid "LDAP server not specified" msgstr "LDAP サーバーの指定がありません" -#: libpq/auth.c:2506 +#: libpq/auth.c:2517 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "LDAP 認証でユーザー名の中に不正な文字があります" -#: libpq/auth.c:2523 +#: 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:2553 +#: 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:2569 +#: libpq/auth.c:2580 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "LDAPサーバー\"%s\"は存在しません" -#: libpq/auth.c:2570 +#: 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:2574 +#: libpq/auth.c:2585 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "LDAPユーザー\"%s\"は一意ではありません" -#: libpq/auth.c:2575 +#: 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:2595 +#: 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:2622 +#: 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:2654 +#: libpq/auth.c:2665 #, c-format msgid "LDAP diagnostics: %s" msgstr "LDAP診断: %s" -#: libpq/auth.c:2692 +#: libpq/auth.c:2703 #, c-format msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" msgstr "ユーザー \"%s\" の証明書認証に失敗しました: クライアント証明書にユーザー名が含まれていません" -#: libpq/auth.c:2713 +#: libpq/auth.c:2724 #, c-format msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" msgstr "ユーザー\"%s\"の証明書認証に失敗しました: サブジェクト識別名(DN)が取得できません" -#: libpq/auth.c:2736 +#: 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:2741 +#: 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:2843 +#: libpq/auth.c:2854 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS サーバーが指定されていません" -#: libpq/auth.c:2850 +#: libpq/auth.c:2861 #, c-format msgid "RADIUS secret not specified" msgstr "RADIUS secret が指定されていません" -#: libpq/auth.c:2864 +#: libpq/auth.c:2875 #, c-format msgid "RADIUS authentication does not support passwords longer than %d characters" msgstr "RADIUS認証では%d文字より長いパスワードはサポートしていません" -#: libpq/auth.c:2966 libpq/hba.c:2356 +#: 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:2980 +#: libpq/auth.c:2991 #, c-format msgid "could not generate random encryption vector" msgstr "ランダムな暗号化ベクトルを生成できませんでした" -#: libpq/auth.c:3017 +#: libpq/auth.c:3028 #, c-format msgid "could not perform MD5 encryption of password: %s" msgstr "パスワードのMD5暗号化に失敗しました: %s" -#: libpq/auth.c:3044 +#: libpq/auth.c:3055 #, c-format msgid "could not create RADIUS socket: %m" msgstr "RADIUSのソケットを作成できませんでした: %m" -#: libpq/auth.c:3060 +#: libpq/auth.c:3071 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "ローカルの RADIUS ソケットをバインドできませんでした: %m" -#: libpq/auth.c:3070 +#: libpq/auth.c:3081 #, c-format msgid "could not send RADIUS packet: %m" msgstr "RADIUS パケットを送信できませんでした: %m" -#: libpq/auth.c:3104 libpq/auth.c:3130 +#: libpq/auth.c:3115 libpq/auth.c:3141 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "%sからのRADIUSの応答待ちがタイムアウトしました" -#: libpq/auth.c:3123 +#: libpq/auth.c:3134 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "RADIUSソケットの状態をチェックできませんでした: %m" -#: libpq/auth.c:3153 +#: libpq/auth.c:3164 #, c-format msgid "could not read RADIUS response: %m" msgstr "RADIUS応答を読めませんでした: %m" -#: libpq/auth.c:3161 +#: libpq/auth.c:3172 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "%sからのRADIUS応答が誤ったポートから送られてきました: %d" -#: libpq/auth.c:3169 +#: libpq/auth.c:3180 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "%sからのRADIUS応答が短すぎます: %d" -#: libpq/auth.c:3176 +#: 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:3184 +#: 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:3209 +#: libpq/auth.c:3220 #, c-format msgid "could not perform MD5 encryption of received packet: %s" msgstr "受信パケットのMD5暗号化に失敗しました: %s" -#: libpq/auth.c:3219 +#: libpq/auth.c:3230 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "%sからのRADIUS応答が間違ったMD5シグネチャを保持しています" -#: libpq/auth.c:3237 +#: 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)を保持しています" -#: 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:565 +#: 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" @@ -15190,7 +15031,7 @@ msgstr "ラージオブジェクト記述子が不正です: %d" msgid "large object descriptor %d was not opened for reading" msgstr "ラージオブジェクト記述子 %d は読み込み用にオープンされていませんでした" -#: libpq/be-fsstubs.c:197 libpq/be-fsstubs.c:572 +#: libpq/be-fsstubs.c:197 libpq/be-fsstubs.c:567 #, c-format msgid "large object descriptor %d was not opened for writing" msgstr "ラージオブジェクト記述子%dは書き込み用に開かれていませんでした" @@ -15205,32 +15046,32 @@ msgstr "lo_lseekの結果がラージオブジェクト記述子の範囲%dを msgid "lo_tell result out of range for large-object descriptor %d" msgstr "lo_tellの結果がラージオブジェクト記述子の範囲%dを超えています" -#: libpq/be-fsstubs.c:444 +#: libpq/be-fsstubs.c:439 #, c-format msgid "could not open server file \"%s\": %m" msgstr "サーバーファイル\"%s\"をオープンできませんでした: %m" -#: libpq/be-fsstubs.c:467 +#: libpq/be-fsstubs.c:462 #, c-format msgid "could not read server file \"%s\": %m" msgstr "サーバーファイル\"%s\"を読み取れませんでした: %m" -#: libpq/be-fsstubs.c:526 +#: libpq/be-fsstubs.c:521 #, c-format msgid "could not create server file \"%s\": %m" msgstr "サーバーファイル\"%s\"を作成できませんでした: %m" -#: libpq/be-fsstubs.c:538 +#: libpq/be-fsstubs.c:533 #, c-format msgid "could not write server file \"%s\": %m" msgstr "サーバーファイル\"%s\"を書き出せませんでした: %m" -#: libpq/be-fsstubs.c:779 +#: libpq/be-fsstubs.c:774 #, c-format msgid "large object read request is too large" msgstr "ラージオブジェクトの読み込み要求が大きすぎます" -#: libpq/be-fsstubs.c:821 utils/adt/genfile.c:248 utils/adt/genfile.c:269 +#: libpq/be-fsstubs.c:816 utils/adt/genfile.c:248 utils/adt/genfile.c:269 #, c-format msgid "requested length cannot be negative" msgstr "負の長さを指定することはできません" @@ -15265,326 +15106,287 @@ msgstr "秘密鍵ファイル\"%s\"はグループまたは全員からアクセ 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:202 +#: libpq/be-secure-gssapi.c:208 msgid "GSSAPI wrap error" msgstr "GSSAPI名ラップエラー" -#: libpq/be-secure-gssapi.c:209 +#: libpq/be-secure-gssapi.c:215 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "送出されるGSSAPIメッセージに機密性が適用されません" -#: libpq/be-secure-gssapi.c:216 libpq/be-secure-gssapi.c:637 +#: libpq/be-secure-gssapi.c:222 libpq/be-secure-gssapi.c:644 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "サーバーは過大なサイズのGSSAPIパケットを送信しようとしました: (%zu > %zu)" -#: libpq/be-secure-gssapi.c:352 +#: libpq/be-secure-gssapi.c:358 libpq/be-secure-gssapi.c:585 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %zu)" msgstr "過大なサイズのGSSAPIパケットがクライアントから送出されました: (%zu > %zu)" -#: libpq/be-secure-gssapi.c:390 +#: libpq/be-secure-gssapi.c:396 msgid "GSSAPI unwrap error" msgstr "GSSAPIアンラップエラー" -#: libpq/be-secure-gssapi.c:397 +#: libpq/be-secure-gssapi.c:403 #, c-format msgid "incoming GSSAPI message did not use confidentiality" msgstr "到着したGSSAPIメッセージには機密性が適用されていません" -#: libpq/be-secure-gssapi.c:578 -#, c-format -msgid "oversize GSSAPI packet sent by the client (%zu > %d)" -msgstr "過大なサイズのGSSAPIパケットがクライアントから送出されました: (%zu > %d)" - -#: libpq/be-secure-gssapi.c:603 +#: libpq/be-secure-gssapi.c:610 msgid "could not accept GSSAPI security context" msgstr "GSSAPIセキュリティコンテキストを受け入れられませんでした" -#: libpq/be-secure-gssapi.c:704 +#: libpq/be-secure-gssapi.c:728 msgid "GSSAPI size check error" msgstr "GSSAPIサイズチェックエラー" -#: libpq/be-secure-openssl.c:118 +#: libpq/be-secure-openssl.c:131 #, c-format msgid "could not create SSL context: %s" msgstr "SSLコンテキストを作成できませんでした: %s" -#: libpq/be-secure-openssl.c:144 +#: 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:164 +#: 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:169 +#: 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:178 +#: 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:191 libpq/be-secure-openssl.c:214 +#: 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:201 +#: libpq/be-secure-openssl.c:214 #, c-format msgid "could not set minimum SSL protocol version" msgstr "最小SSLプロトコルバージョンを設定できませんでした" -#: libpq/be-secure-openssl.c:224 +#: libpq/be-secure-openssl.c:237 #, c-format msgid "could not set maximum SSL protocol version" msgstr "最大SSLプロトコルバージョンを設定できませんでした" -#: libpq/be-secure-openssl.c:241 +#: libpq/be-secure-openssl.c:253 #, c-format msgid "could not set SSL protocol version range" msgstr "SSLプロトコルバージョンの範囲を設定できませんでした" -#: libpq/be-secure-openssl.c:242 +#: libpq/be-secure-openssl.c:254 #, c-format msgid "\"%s\" cannot be higher than \"%s\"" msgstr "\"%s\"は\"%s\"より大きくできません" -#: libpq/be-secure-openssl.c:295 -#, c-format -msgid "could not set the TLSv1.2 cipher list (no valid ciphers available)" -msgstr " TLSv1.2 の暗号方式リストが設定できませんでした (有効な暗号方式がありません)" - -#: libpq/be-secure-openssl.c:310 +#: libpq/be-secure-openssl.c:307 #, c-format -msgid "could not set the TLSv1.3 cipher suites (no valid ciphers available)" -msgstr " TLSv1.3 の暗号スイートが設定できませんでした (有効な暗号方式がありません)" +msgid "could not set the cipher list (no valid ciphers available)" +msgstr "暗号方式リストがセットできません (利用可能な暗号方式がありません)" -#: libpq/be-secure-openssl.c:331 +#: 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:380 +#: 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:388 +#: 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:396 +#: 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:454 +#: 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:468 +#: libpq/be-secure-openssl.c:464 #, c-format msgid "could not initialize SSL connection: %s" msgstr "SSL接続を初期化できませんでした: %s" -#: libpq/be-secure-openssl.c:476 +#: libpq/be-secure-openssl.c:472 #, c-format msgid "could not set SSL socket: %s" msgstr "SSLソケットを設定できませんでした: %s" -#: libpq/be-secure-openssl.c:532 +#: libpq/be-secure-openssl.c:528 #, c-format msgid "could not accept SSL connection: %m" msgstr "SSL接続を受け付けられませんでした: %m" -#: libpq/be-secure-openssl.c:536 libpq/be-secure-openssl.c:593 +#: 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:577 +#: libpq/be-secure-openssl.c:573 #, c-format msgid "could not accept SSL connection: %s" msgstr "SSL接続を受け付けられませんでした: %s" -#: libpq/be-secure-openssl.c:581 +#: 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:598 libpq/be-secure-openssl.c:813 libpq/be-secure-openssl.c:883 +#: 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:626 +#: 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:670 +#: 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:716 +#: 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:802 libpq/be-secure-openssl.c:867 +#: 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:1050 +#: 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:1062 +#: libpq/be-secure-openssl.c:1050 #, c-format msgid "could not load DH parameters file: %s" msgstr "DHパラメータをロードできませんでした: %s" -#: libpq/be-secure-openssl.c:1072 +#: libpq/be-secure-openssl.c:1060 #, c-format msgid "invalid DH parameters: %s" msgstr "不正なDHパラメータです: %s" -#: libpq/be-secure-openssl.c:1081 +#: libpq/be-secure-openssl.c:1069 #, c-format msgid "invalid DH parameters: p is not prime" msgstr "不正なDHパラメータ: pは素数ではありません" -#: libpq/be-secure-openssl.c:1090 +#: 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:1226 +#: 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:1263 +#: 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:1264 +#: libpq/be-secure-openssl.c:1252 msgid "unknown" msgstr "不明" -#: libpq/be-secure-openssl.c:1401 +#: libpq/be-secure-openssl.c:1389 #, c-format msgid "DH: could not load DH parameters" msgstr "DH: DHパラメータをロードできませんでした" -#: libpq/be-secure-openssl.c:1409 +#: 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:1439 +#: libpq/be-secure-openssl.c:1424 #, c-format -msgid "failed to set group names specified in ssl_groups: %s" -msgstr "ssl_groupsで指定されたグループ名の設定に失敗しました: %s" - -#: libpq/be-secure-openssl.c:1441 -msgid "No valid groups found" -msgstr "有効なグループが見つかりませんでした" +msgid "ECDH: unrecognized curve name: %s" +msgstr "ECDH: 認識できない曲線名: %s" -#: libpq/be-secure-openssl.c:1442 +#: libpq/be-secure-openssl.c:1433 #, c-format -msgid "Ensure that each group name is spelled correctly and supported by the installed version of OpenSSL" -msgstr "すべてのグループ名が正しく記述されおり、インストールされているバージョンのOpenSSLでサポートされていることを確認してください" +msgid "ECDH: could not create key" +msgstr "ECDH: キーを生成できませんでした" -#: libpq/be-secure-openssl.c:1488 +#: libpq/be-secure-openssl.c:1461 msgid "no SSL error reported" msgstr "SSLエラーはありませんでした" -#: libpq/be-secure-openssl.c:1506 +#: libpq/be-secure-openssl.c:1479 #, c-format msgid "SSL error code %lu" msgstr "SSLエラーコード: %lu" -#: libpq/be-secure-openssl.c:1663 +#: libpq/be-secure-openssl.c:1636 #, c-format msgid "could not create BIO" msgstr "BIOを作成できませんでした" -#: libpq/be-secure-openssl.c:1673 +#: 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:1681 +#: 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/crypt.c:50 +#: libpq/crypt.c:48 #, c-format msgid "Role \"%s\" does not exist." msgstr "ロール\"%s\"は存在しません。" -#: libpq/crypt.c:60 +#: libpq/crypt.c:58 #, c-format msgid "User \"%s\" has no password assigned." msgstr "ユーザー\"%s\"はパスワードが設定されていません。" -#: libpq/crypt.c:78 +#: libpq/crypt.c:76 #, c-format msgid "User \"%s\" has an expired password." msgstr "ユーザー\"%s\"のパスワードは期限切れです。" -#: libpq/crypt.c:174 -#, c-format -msgid "encrypted password is too long" -msgstr "暗号化されたパスワードが長すぎます" - -#: libpq/crypt.c:175 -#, c-format -msgid "Encrypted passwords must be no longer than %d bytes." -msgstr "暗号化されたパスワードは%dバイト以下でなければなりません。" - -#: libpq/crypt.c:183 -#, c-format -msgid "setting an MD5-encrypted password" -msgstr "MD5暗号化パスワードを設定しています" - -#: libpq/crypt.c:184 -#, c-format -msgid "MD5 password support is deprecated and will be removed in a future release of PostgreSQL." -msgstr "MD5パスワードは非推奨であり、PostgreSQLの将来のリリースでは廃止される予定です。" - -#: libpq/crypt.c:185 -#, c-format -msgid "Refer to the PostgreSQL documentation for details about migrating to another password type." -msgstr "他のパスワードタイプへの移行の詳細についてはPostgreSQL文書を参照してください。" - -#: libpq/crypt.c:216 +#: 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:237 libpq/crypt.c:279 libpq/crypt.c:299 +#: 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:318 +#: libpq/crypt.c:284 #, c-format msgid "Password of user \"%s\" is in unrecognized format." msgstr "ユーザー\"%s\"のパスワードは識別不能な形式です。" @@ -15594,8 +15396,8 @@ msgstr "ユーザー\"%s\"のパスワードは識別不能な形式です。" msgid "invalid regular expression \"%s\": %s" msgstr "不正な正規表現\"%s\": %s" -#: libpq/hba.c:329 libpq/hba.c:664 libpq/hba.c:1249 libpq/hba.c:1269 libpq/hba.c:1292 libpq/hba.c:1305 libpq/hba.c:1358 libpq/hba.c:1386 libpq/hba.c:1394 libpq/hba.c:1406 libpq/hba.c:1427 libpq/hba.c:1440 libpq/hba.c:1465 libpq/hba.c:1492 libpq/hba.c:1504 libpq/hba.c:1563 libpq/hba.c:1583 libpq/hba.c:1597 libpq/hba.c:1617 libpq/hba.c:1628 libpq/hba.c:1643 libpq/hba.c:1662 libpq/hba.c:1678 libpq/hba.c:1690 libpq/hba.c:1756 libpq/hba.c:1769 libpq/hba.c:1791 -#: libpq/hba.c:1803 libpq/hba.c:1821 libpq/hba.c:1871 libpq/hba.c:1915 libpq/hba.c:1926 libpq/hba.c:1942 libpq/hba.c:1959 libpq/hba.c:1970 libpq/hba.c:1989 libpq/hba.c:2005 libpq/hba.c:2021 libpq/hba.c:2080 libpq/hba.c:2097 libpq/hba.c:2110 libpq/hba.c:2122 libpq/hba.c:2141 libpq/hba.c:2227 libpq/hba.c:2245 libpq/hba.c:2339 libpq/hba.c:2358 libpq/hba.c:2387 libpq/hba.c:2400 libpq/hba.c:2423 libpq/hba.c:2445 libpq/hba.c:2459 tsearch/ts_locale.c:196 +#: 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 行目" @@ -15610,494 +15412,494 @@ msgstr "存在しない認証設定ファイル\"%s\"をスキップします" msgid "could not open file \"%s\": maximum nesting depth exceeded" msgstr "ファイル\"%s\"をオープンできませんでした: 入れ子の深さが上限を超えています" -#: libpq/hba.c:1220 +#: 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:1247 +#: libpq/hba.c:1243 #, c-format msgid "authentication option \"%s\" is only valid for authentication methods %s" msgstr "認証オプション\"%s\"は認証方式%sでのみ有効です" -#: libpq/hba.c:1267 +#: libpq/hba.c:1263 #, c-format msgid "authentication method \"%s\" requires argument \"%s\" to be set" msgstr "認証方式\"%s\"の場合は引数\"%s\"がセットされなければなりません" -#: libpq/hba.c:1291 +#: libpq/hba.c:1287 #, c-format msgid "missing entry at end of line" msgstr "行末の要素が足りません" -#: libpq/hba.c:1304 +#: libpq/hba.c:1300 #, c-format msgid "multiple values in ident field" msgstr "identヂールド内の複数の値" -#: libpq/hba.c:1356 +#: libpq/hba.c:1352 #, c-format msgid "multiple values specified for connection type" msgstr "接続タイプで複数の値が指定されました" -#: libpq/hba.c:1357 +#: libpq/hba.c:1353 #, c-format msgid "Specify exactly one connection type per line." msgstr "1行に1つの接続タイプだけを指定してください" -#: libpq/hba.c:1384 +#: libpq/hba.c:1380 #, c-format msgid "hostssl record cannot match because SSL is disabled" msgstr "SSLが無効なため、hostssl行は照合できません" -#: libpq/hba.c:1385 +#: libpq/hba.c:1381 #, c-format msgid "Set \"ssl = on\" in postgresql.conf." msgstr "postgresql.confで\"ssl = on\"に設定してください。" -#: libpq/hba.c:1393 +#: 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:1405 +#: 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:1425 +#: libpq/hba.c:1421 #, c-format msgid "invalid connection type \"%s\"" msgstr "接続オプションタイプ \"%s\" は不正です" -#: libpq/hba.c:1439 +#: libpq/hba.c:1435 #, c-format msgid "end-of-line before database specification" msgstr "データベース指定の前に行末を検出しました" -#: libpq/hba.c:1464 +#: libpq/hba.c:1460 #, c-format msgid "end-of-line before role specification" msgstr "ロール指定の前に行末を検出しました" -#: libpq/hba.c:1491 +#: libpq/hba.c:1487 #, c-format msgid "end-of-line before IP address specification" msgstr "IP アドレス指定の前に行末を検出しました" -#: libpq/hba.c:1502 +#: libpq/hba.c:1498 #, c-format msgid "multiple values specified for host address" msgstr "ホストアドレスで複数の値が指定されました" -#: libpq/hba.c:1503 +#: libpq/hba.c:1499 #, c-format msgid "Specify one address range per line." msgstr "1行に1つのアドレス範囲を指定してください" -#: libpq/hba.c:1561 +#: libpq/hba.c:1557 #, c-format msgid "invalid IP address \"%s\": %s" msgstr "不正なIPアドレス\"%s\": %s" -#: libpq/hba.c:1581 +#: libpq/hba.c:1577 #, c-format msgid "specifying both host name and CIDR mask is invalid: \"%s\"" msgstr "ホスト名とCIDRマスクを両方指定するのは不正です: \"%s\"" -#: libpq/hba.c:1595 +#: libpq/hba.c:1591 #, c-format msgid "invalid CIDR mask in address \"%s\"" msgstr "IPアドレス\"%s\"内の CIDR マスクが不正です" -#: libpq/hba.c:1615 +#: libpq/hba.c:1611 #, c-format msgid "end-of-line before netmask specification" msgstr "ネットマスク指定の前に行末を検出しました" -#: libpq/hba.c:1616 +#: libpq/hba.c:1612 #, c-format msgid "Specify an address range in CIDR notation, or provide a separate netmask." msgstr "CIDR記法でアドレス範囲を指定してするか、ネットマスクを分けて指定してください。" -#: libpq/hba.c:1627 +#: libpq/hba.c:1623 #, c-format msgid "multiple values specified for netmask" msgstr "ネットマスクで複数の値が指定されました" -#: libpq/hba.c:1641 +#: libpq/hba.c:1637 #, c-format msgid "invalid IP mask \"%s\": %s" msgstr "不正なIPマスク\"%s\": %s" -#: libpq/hba.c:1661 +#: libpq/hba.c:1657 #, c-format msgid "IP address and mask do not match" msgstr "IPアドレスとマスクが一致しません" -#: libpq/hba.c:1677 +#: libpq/hba.c:1673 #, c-format msgid "end-of-line before authentication method" msgstr "認証方式指定の前に行末を検出しました" -#: libpq/hba.c:1688 +#: libpq/hba.c:1684 #, c-format msgid "multiple values specified for authentication type" msgstr "認証タイプで複数の値が指定されました" -#: libpq/hba.c:1689 +#: libpq/hba.c:1685 #, c-format msgid "Specify exactly one authentication type per line." msgstr "認証タイプは1行に1つだけ指定してください。" -#: libpq/hba.c:1754 +#: libpq/hba.c:1750 #, c-format msgid "invalid authentication method \"%s\"" msgstr "不正な認証方式\"%s\"" -#: libpq/hba.c:1767 +#: libpq/hba.c:1763 #, c-format msgid "invalid authentication method \"%s\": not supported by this build" msgstr "不正な認証方式\"%s\": このビルドではサポートされていません" -#: libpq/hba.c:1790 +#: libpq/hba.c:1786 #, c-format msgid "gssapi authentication is not supported on local sockets" msgstr "ローカルソケットではgssapi認証はサポートしていません" -#: libpq/hba.c:1802 +#: libpq/hba.c:1798 #, c-format msgid "peer authentication is only supported on local sockets" msgstr "peer認証はローカルソケットでのみサポートしています" -#: libpq/hba.c:1820 +#: libpq/hba.c:1816 #, c-format msgid "cert authentication is only supported on hostssl connections" msgstr "hostssl接続では証明書認証のみをサポートしています" -#: libpq/hba.c:1870 +#: libpq/hba.c:1866 #, c-format msgid "authentication option not in name=value format: %s" msgstr "認証オプションが 名前=値 形式になっていません: %s" -#: libpq/hba.c:1914 +#: libpq/hba.c:1910 #, c-format -msgid "cannot mix options for simple bind and search+bind modes" -msgstr "単純バインドモードと検索+バインドモードのオプションを混在させることはできません" +msgid "cannot use ldapbasedn, ldapbinddn, ldapbindpasswd, ldapsearchattribute, ldapsearchfilter, or ldapurl together with ldapprefix" +msgstr "ldapbasedn、 ldapbinddn、ldapbindpasswd、ldapsearchattribute、, ldapsearchfilter またはldapurlは、ldapprefixと同時には指定できません" -#: libpq/hba.c:1925 +#: 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:1941 +#: libpq/hba.c:1937 #, c-format msgid "cannot use ldapsearchattribute together with ldapsearchfilter" msgstr "ldapsearchattribute、ldapsearchfilter と同時には指定できません" -#: libpq/hba.c:1958 +#: libpq/hba.c:1954 #, c-format msgid "list of RADIUS servers cannot be empty" msgstr "RADIUSサーバーのリストは空にはできません" -#: libpq/hba.c:1969 +#: libpq/hba.c:1965 #, c-format msgid "list of RADIUS secrets cannot be empty" msgstr "RADIUSシークレットのリストは空にはできません" -#: libpq/hba.c:1986 +#: 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:2002 +#: 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:2018 +#: 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:2070 +#: libpq/hba.c:2066 msgid "ident, peer, gssapi, sspi, and cert" msgstr "ident、peer、gssapi、sspiおよびcert" -#: libpq/hba.c:2079 +#: libpq/hba.c:2075 #, c-format msgid "clientcert can only be configured for \"hostssl\" rows" msgstr "クライアント証明書は\"hostssl\"の行でのみ設定できます" -#: libpq/hba.c:2096 +#: libpq/hba.c:2092 #, c-format msgid "clientcert only accepts \"verify-full\" when using \"cert\" authentication" msgstr "\"cert\"認証使用時はclientcertは\"verify-full\"にしか設定できません" -#: libpq/hba.c:2109 +#: libpq/hba.c:2105 #, c-format msgid "invalid value for clientcert: \"%s\"" msgstr "clientcertの値が不正です: \"%s\"" -#: libpq/hba.c:2121 +#: libpq/hba.c:2117 #, c-format msgid "clientname can only be configured for \"hostssl\" rows" msgstr "クライアント名は\"hostssl\"の行でのみ設定できます" -#: libpq/hba.c:2140 +#: libpq/hba.c:2136 #, c-format msgid "invalid value for clientname: \"%s\"" msgstr "clientnameの値が不正です: \"%s\"" -#: libpq/hba.c:2173 +#: libpq/hba.c:2169 #, c-format msgid "could not parse LDAP URL \"%s\": %s" msgstr "LDAP URL\"%s\"をパースできませんでした: %s" -#: libpq/hba.c:2184 +#: libpq/hba.c:2180 #, c-format msgid "unsupported LDAP URL scheme: %s" msgstr "非サポートのLDAP URLコード: %s" -#: libpq/hba.c:2208 +#: libpq/hba.c:2204 #, c-format msgid "LDAP URLs not supported on this platform" msgstr "このプラットフォームではLDAP URLをサポートしていません。" -#: libpq/hba.c:2226 +#: libpq/hba.c:2222 #, c-format msgid "invalid ldapscheme value: \"%s\"" msgstr "不正な ldapscheme の値: \"%s\"" -#: libpq/hba.c:2244 +#: libpq/hba.c:2240 #, c-format msgid "invalid LDAP port number: \"%s\"" msgstr "不正なLDAPポート番号です: \"%s\"" # -#: libpq/hba.c:2290 libpq/hba.c:2297 +#: libpq/hba.c:2286 libpq/hba.c:2293 msgid "gssapi and sspi" msgstr "gssapiおよびsspi" -#: libpq/hba.c:2306 libpq/hba.c:2315 +#: libpq/hba.c:2302 libpq/hba.c:2311 msgid "sspi" msgstr "sspi" -#: libpq/hba.c:2337 +#: libpq/hba.c:2333 #, c-format msgid "could not parse RADIUS server list \"%s\"" msgstr "RADIUSサーバーのリスト\"%s\"のパースに失敗しました" -#: libpq/hba.c:2385 +#: libpq/hba.c:2381 #, c-format msgid "could not parse RADIUS port list \"%s\"" msgstr "RADIUSポートのリスト\"%s\"のパースに失敗しました" -#: libpq/hba.c:2399 +#: libpq/hba.c:2395 #, c-format msgid "invalid RADIUS port number: \"%s\"" msgstr "不正なRADIUSポート番号: \"%s\"" -#: libpq/hba.c:2421 +#: libpq/hba.c:2417 #, c-format msgid "could not parse RADIUS secret list \"%s\"" msgstr "RADIUSシークレットのリスト\"%s\"のパースに失敗しました" -#: libpq/hba.c:2443 +#: libpq/hba.c:2439 #, c-format msgid "could not parse RADIUS identifiers list \"%s\"" msgstr "RADIUS識別子のリスト\"%s\"のパースに失敗しました" -#: libpq/hba.c:2457 +#: libpq/hba.c:2453 #, c-format msgid "unrecognized authentication option name: \"%s\"" msgstr "認証オプション名を認識できません: \"%s\"" -#: libpq/hba.c:2649 +#: libpq/hba.c:2645 #, c-format msgid "configuration file \"%s\" contains no entries" msgstr "設定ファイル\"%s\"には何も含まれていません" -#: libpq/hba.c:2802 +#: libpq/hba.c:2798 #, c-format msgid "regular expression match for \"%s\" failed: %s" msgstr "正規表現\"%s\"で照合に失敗しました: %s" -#: libpq/hba.c:2826 +#: 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:2929 +#: 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:2949 +#: 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:212 libpq/pqcomm.c:220 libpq/pqcomm.c:251 libpq/pqcomm.c:260 libpq/pqcomm.c:1649 libpq/pqcomm.c:1694 libpq/pqcomm.c:1734 libpq/pqcomm.c:1778 libpq/pqcomm.c:1817 libpq/pqcomm.c:1856 libpq/pqcomm.c:1892 libpq/pqcomm.c:1931 +#: 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:297 +#: libpq/pqcomm.c:296 #, c-format msgid "could not set socket to nonblocking mode: %m" msgstr "ソケットを非ブロッキングモードに設定できませんでした: %m" -#: libpq/pqcomm.c:457 +#: 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:477 +#: 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:481 +#: libpq/pqcomm.c:480 #, c-format msgid "could not translate service \"%s\" to address: %s" msgstr "サービス\"%s\"をアドレスに変換できませんでした: %s" -#: libpq/pqcomm.c:503 +#: libpq/pqcomm.c:502 #, c-format msgid "could not bind to all requested addresses: MAXLISTEN (%d) exceeded" msgstr "要求されたアドレスを全てバインドできませんでした: MAXLISTEN (%d)を超えています" -#: libpq/pqcomm.c:512 +#: libpq/pqcomm.c:511 msgid "IPv4" msgstr "IPv4" -#: libpq/pqcomm.c:515 +#: libpq/pqcomm.c:514 msgid "IPv6" msgstr "IPv6" -#: libpq/pqcomm.c:518 +#: libpq/pqcomm.c:517 msgid "Unix" msgstr "Unix" -#: libpq/pqcomm.c:522 +#: libpq/pqcomm.c:521 #, c-format msgid "unrecognized address family %d" msgstr "アドレスファミリ %d を認識できません" #. translator: first %s is IPv4, IPv6, or Unix -#: libpq/pqcomm.c:546 +#: 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:575 libpq/pqcomm.c:593 +#: 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:616 +#: libpq/pqcomm.c:615 #, c-format msgid "could not bind %s address \"%s\": %m" msgstr "%sアドレス\"%s\"のbindに失敗しました: %m" -#: libpq/pqcomm.c:620 +#: libpq/pqcomm.c:619 #, c-format msgid "Is another postmaster already running on port %d?" msgstr "すでに他のpostmasterがポート%dで稼動していませんか?" -#: libpq/pqcomm.c:622 +#: 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:651 +#: libpq/pqcomm.c:650 #, c-format msgid "could not listen on %s address \"%s\": %m" msgstr "%sアドレス\"%s\"のlistenに失敗しました: %m" -#: libpq/pqcomm.c:659 +#: 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:664 +#: libpq/pqcomm.c:663 #, c-format msgid "listening on %s address \"%s\", port %d" msgstr "%sアドレス\"%s\"、ポート%dで待ち受けています" -#: libpq/pqcomm.c:754 +#: libpq/pqcomm.c:753 #, c-format msgid "group \"%s\" does not exist" msgstr "グループ\"%s\"は存在しません" -#: libpq/pqcomm.c:764 +#: libpq/pqcomm.c:763 #, c-format msgid "could not set group of file \"%s\": %m" msgstr "ファイル\"%s\"のグループを設定できませんでした: %m" -#: libpq/pqcomm.c:775 +#: libpq/pqcomm.c:774 #, c-format msgid "could not set permissions of file \"%s\": %m" msgstr "ファイル\"%s\"の権限を設定できませんでした: %m" -#: libpq/pqcomm.c:804 +#: libpq/pqcomm.c:803 #, c-format msgid "could not accept new connection: %m" msgstr "新しい接続を受け付けることができませんでした: %m" -#: libpq/pqcomm.c:886 +#: libpq/pqcomm.c:885 #, c-format msgid "there is no client connection" msgstr "クライアント接続がありません" -#: libpq/pqcomm.c:942 libpq/pqcomm.c:1043 +#: libpq/pqcomm.c:941 libpq/pqcomm.c:1042 #, c-format msgid "could not receive data from client: %m" msgstr "クライアントからデータを受信できませんでした: %m" -#: libpq/pqcomm.c:1150 tcop/postgres.c:4457 +#: libpq/pqcomm.c:1149 tcop/postgres.c:4533 #, c-format msgid "terminating connection because protocol synchronization was lost" msgstr "プロトコルの同期が失われたためコネクションを終了します" -#: libpq/pqcomm.c:1216 +#: libpq/pqcomm.c:1215 #, c-format msgid "unexpected EOF within message length word" msgstr "メッセージ長ワード内のEOFは想定外です" -#: libpq/pqcomm.c:1226 +#: libpq/pqcomm.c:1225 #, c-format msgid "invalid message length" msgstr "メッセージ長が不正です" -#: libpq/pqcomm.c:1248 libpq/pqcomm.c:1261 +#: libpq/pqcomm.c:1247 libpq/pqcomm.c:1260 #, c-format msgid "incomplete message from client" msgstr "クライアントからのメッセージが不完全です" -#: libpq/pqcomm.c:1402 +#: libpq/pqcomm.c:1401 #, c-format msgid "could not send data to client: %m" msgstr "クライアントにデータを送信できませんでした: %m" -#: libpq/pqcomm.c:1617 +#: libpq/pqcomm.c:1616 #, c-format msgid "%s(%s) failed: error code %d" msgstr "%s(%s)が失敗しました: エラーコード %d" -#: libpq/pqcomm.c:1706 +#: libpq/pqcomm.c:1705 #, c-format msgid "setting the keepalive idle time is not supported" msgstr "キープアライブのアイドル時間の設定はサポートされていません" -#: libpq/pqcomm.c:1790 libpq/pqcomm.c:1865 libpq/pqcomm.c:1940 +#: libpq/pqcomm.c:1789 libpq/pqcomm.c:1864 libpq/pqcomm.c:1939 #, c-format msgid "%s(%s) not supported" msgstr "%s(%s)はサポートされていません" @@ -16122,12 +15924,12 @@ msgstr "メッセージ内の文字列が不正です" msgid "invalid message format" msgstr "メッセージの書式が不正です" -#: main/main.c:301 +#: main/main.c:236 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s: WSAStartupが失敗しました: %d\n" -#: main/main.c:389 +#: main/main.c:324 #, c-format msgid "" "%s is the PostgreSQL server.\n" @@ -16136,7 +15938,7 @@ msgstr "" "%sはPostgreSQLサーバーです\n" "\n" -#: main/main.c:390 +#: main/main.c:325 #, c-format msgid "" "Usage:\n" @@ -16147,107 +15949,107 @@ msgstr "" " %s [オプション]...\n" "\n" -#: main/main.c:391 +#: main/main.c:326 #, c-format msgid "Options:\n" msgstr "オプション:\n" -#: main/main.c:392 +#: main/main.c:327 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B NBUFFERS 共有バッファの数\n" -#: main/main.c:393 +#: main/main.c:328 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c NAME=VALUE 実行時パラメータの設定\n" -#: main/main.c:394 +#: 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:395 +#: main/main.c:330 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 デバッグレベル\n" -#: main/main.c:396 +#: main/main.c:331 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D DATADIR データベースディレクトリ\n" -#: main/main.c:397 +#: main/main.c:332 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e ヨーロッパ式の日付フォーマットでの入力(DMY)\n" -#: main/main.c:398 +#: main/main.c:333 #, c-format msgid " -F turn fsync off\n" msgstr " -F fsyncを無効にする\n" -#: main/main.c:399 +#: 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:400 +#: main/main.c:335 #, c-format msgid " -i enable TCP/IP connections (deprecated)\n" msgstr " -i TCP/IP接続を有効にする (非推奨)\n" -#: main/main.c:401 +#: main/main.c:336 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k DIRECTORY Unixドメインソケットの場所\n" -#: main/main.c:403 +#: main/main.c:338 #, c-format msgid " -l enable SSL connections\n" msgstr " -l SSL接続を有効にする\n" -#: main/main.c:405 +#: main/main.c:340 #, c-format msgid " -N MAX-CONNECT maximum number of allowed connections\n" msgstr " -N MAX-CONNECT 許容する最大接続数\n" -#: main/main.c:406 +#: main/main.c:341 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p PORT 接続を待ち受けるポート番号\n" -#: main/main.c:407 +#: main/main.c:342 #, c-format msgid " -s show statistics after each query\n" msgstr " -s 各問い合わせの後に統計情報を表示\n" -#: main/main.c:408 +#: 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:409 +#: main/main.c:344 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示し、終了\n" -#: main/main.c:410 +#: main/main.c:345 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --NAME=VALUE 実行時パラメータを設定\n" -#: main/main.c:411 +#: main/main.c:346 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config 設定パラメータの説明を出力し、終了\n" -#: main/main.c:412 +#: main/main.c:347 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示し、終了\n" -#: main/main.c:414 +#: main/main.c:349 #, c-format msgid "" "\n" @@ -16256,39 +16058,39 @@ msgstr "" "\n" "開発者向けオプション:\n" -#: main/main.c:415 +#: 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:416 +#: main/main.c:351 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O システムテーブル構造の変更を許可\n" -#: main/main.c:417 +#: main/main.c:352 #, c-format msgid " -P disable system indexes\n" msgstr " -P システムインデックスを無効にする\n" -#: main/main.c:418 +#: 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:419 +#: 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:420 +#: 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:422 +#: main/main.c:357 #, c-format msgid "" "\n" @@ -16297,39 +16099,39 @@ msgstr "" "\n" "シングルユーザーモード用のオプション:\n" -#: main/main.c:423 +#: main/main.c:358 #, c-format msgid " --single selects single-user mode (must be first argument)\n" msgstr "" " --single シングルユーザーモードを選択(最初の引数でなければ\n" " なりません)\n" -#: main/main.c:424 +#: main/main.c:359 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " DBNAME データベース名 (デフォルトはユーザー名)\n" -#: main/main.c:425 +#: main/main.c:360 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 デバッグレベルを上書き\n" -#: main/main.c:426 +#: main/main.c:361 #, c-format msgid " -E echo statement before execution\n" msgstr " -E 実行前に文を表示\n" -#: main/main.c:427 +#: main/main.c:362 #, c-format msgid " -j do not use newline as interactive query delimiter\n" msgstr " -j 対話式問い合わせの区切りとして改行を使用しない\n" -#: main/main.c:428 main/main.c:434 +#: 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:430 +#: main/main.c:365 #, c-format msgid "" "\n" @@ -16338,22 +16140,22 @@ msgstr "" "\n" "初期起動用のオプション:\n" -#: main/main.c:431 +#: main/main.c:366 #, c-format msgid " --boot selects bootstrapping mode (must be first argument)\n" msgstr " --boot 初期起動モードを選択 (最初の引数でなければなりません)\n" -#: main/main.c:432 +#: main/main.c:367 #, c-format msgid " --check selects check mode (must be first argument)\n" msgstr " --check チェックモードを選択 (最初の引数でなければなりません)\n" -#: main/main.c:433 +#: main/main.c:368 #, c-format msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" msgstr " DBNAME データベース名 (初期起動モードでは必須の引数)\n" -#: main/main.c:436 +#: main/main.c:371 #, c-format msgid "" "\n" @@ -16369,12 +16171,12 @@ msgstr "" "\n" "不具合は<%s>まで報告してください。\n" -#: main/main.c:440 +#: main/main.c:375 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: main/main.c:451 +#: main/main.c:386 #, c-format msgid "" "\"root\" execution of the PostgreSQL server is not permitted.\n" @@ -16387,12 +16189,12 @@ msgstr "" "する必要があります。適切なサーバーの起動方法に関する詳細はドキュメントを\n" "参照してください\n" -#: main/main.c:468 +#: main/main.c:403 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: 実ユーザーIDと実効ユーザーIDは一致しなければなりません\n" -#: main/main.c:475 +#: main/main.c:410 #, c-format msgid "" "Execution of PostgreSQL by a user with administrative permissions is not\n" @@ -16416,12 +16218,12 @@ msgstr "拡張可能ノードタイプ\"%s\"はすでに存在します" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "ExtensibleNodeMethods \"%s\"は登録されていません" -#: nodes/makefuncs.c:154 statistics/extended_stats.c:2306 +#: 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:118 nodes/nodeFuncs.c:149 parser/parse_coerce.c:2602 parser/parse_coerce.c:2740 parser/parse_coerce.c:2787 parser/parse_expr.c:2110 parser/parse_func.c:710 parser/parse_oper.c:869 utils/fmgr/funcapi.c:669 +#: 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の配列型がありませんでした" @@ -16436,90 +16238,80 @@ msgstr "パラメータを持つポータル\"%s\": %s" msgid "unnamed portal with parameters: %s" msgstr "パラメータを持つ無名ポータル: %s" -#: optimizer/path/joinrels.c:972 +#: 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:7263 parser/parse_merge.c:203 rewrite/rewriteHandler.c:1686 +#: 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:1755 +#: 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:1443 parser/analyze.c:1861 parser/analyze.c:2120 parser/analyze.c:3441 +#: 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:2182 optimizer/plan/planner.c:4025 +#: 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:2183 optimizer/plan/planner.c:4026 optimizer/plan/planner.c:4707 optimizer/prep/prepunion.c:1070 +#: 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 "一部のデータ型がハッシュのみをサポートする一方で、別の型はソートのみをサポートしています。" -#: optimizer/plan/planner.c:4706 +#: optimizer/plan/planner.c:4832 #, c-format msgid "could not implement DISTINCT" msgstr "DISTINCTを実行できませんでした" -#: optimizer/plan/planner.c:6122 +#: optimizer/plan/planner.c:6177 #, c-format msgid "could not implement window PARTITION BY" msgstr "ウィンドウの PARTITION BY を実行できませんでした" -#: optimizer/plan/planner.c:6123 +#: optimizer/plan/planner.c:6178 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "ウィンドウ分割に使用する列は、ソート可能なデータ型でなければなりません。" -#: optimizer/plan/planner.c:6127 +#: optimizer/plan/planner.c:6182 #, c-format msgid "could not implement window ORDER BY" msgstr "ウィンドウの ORDER BY を実行できませんでした" -#: optimizer/plan/planner.c:6128 +#: optimizer/plan/planner.c:6183 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "ウィンドウの順序付けをする列は、ソート可能なデータ型でなければなりません。" -#: optimizer/prep/prepunion.c:440 +#: optimizer/prep/prepunion.c:467 #, c-format msgid "could not implement recursive UNION" msgstr "再帰UNIONを実行できませんでした" -#: optimizer/prep/prepunion.c:441 +#: optimizer/prep/prepunion.c:468 #, c-format msgid "All column datatypes must be hashable." msgstr "すべての列のデータ型はハッシュ可能でなければなりません。" -#. translator: %s is INTERSECT or EXCEPT -#: optimizer/prep/prepunion.c:1068 +#. translator: %s is UNION, INTERSECT, or EXCEPT +#: optimizer/prep/prepunion.c:1319 #, c-format msgid "could not implement %s" msgstr "%sを実行できませんでした" -#: optimizer/util/appendinfo.c:165 -#, c-format -msgid "attribute \"%s\" of relation \"%s\" does not match parent's type" -msgstr "リレーション\"%2$s\"の属性\"%1$s\"は親での型と一致していません" - -#: optimizer/util/appendinfo.c:170 -#, c-format -msgid "attribute \"%s\" of relation \"%s\" does not match parent's collation" -msgstr "リレーション\"%2$s\"の属性\"%1$s\"は親での照合順序と一致していません" - -#: optimizer/util/clauses.c:4964 +#: optimizer/util/clauses.c:4963 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "SQL関数\"%s\"のインライン化処理中" @@ -16544,676 +16336,665 @@ msgstr "ON CONFLICT句中の制約には関連付けられるインデックス msgid "ON CONFLICT DO UPDATE not supported with exclusion constraints" msgstr "ON CONFLICT DO UPDATEでの排除制約の使用はサポートされていません" -#: optimizer/util/plancat.c:952 +#: 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:915 parser/analyze.c:1640 +#: parser/analyze.c:824 parser/analyze.c:1550 #, c-format msgid "VALUES lists must all be the same length" msgstr "VALUESリストはすべて同じ長さでなければなりません" -#: parser/analyze.c:1117 +#: parser/analyze.c:1027 #, c-format msgid "INSERT has more expressions than target columns" msgstr "INSERTに対象列よりも多くの式があります" -#: parser/analyze.c:1135 +#: parser/analyze.c:1045 #, c-format msgid "INSERT has more target columns than expressions" msgstr "INSERTに式よりも多くの対象列があります" -#: parser/analyze.c:1139 +#: 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:1447 parser/analyze.c:1834 +#: 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:1763 parser/analyze.c:3673 +#: parser/analyze.c:1673 parser/analyze.c:3479 #, c-format msgid "%s cannot be applied to VALUES" msgstr "%sをVALUESに使用できません" -#: parser/analyze.c:2001 +#: parser/analyze.c:1911 #, c-format msgid "invalid UNION/INTERSECT/EXCEPT ORDER BY clause" msgstr "不正なUNION/INTERSECT/EXCEPT ORDER BY句です" -#: parser/analyze.c:2002 +#: parser/analyze.c:1912 #, c-format msgid "Only result column names can be used, not expressions or functions." msgstr "式や関数ではなく、結果列の名前のみが使用できます。" -#: parser/analyze.c:2003 +#: 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:2110 +#: 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:2182 +#: 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:2269 +#: parser/analyze.c:2178 #, c-format msgid "each %s query must have the same number of columns" msgstr "すべての%s問い合わせは同じ列数を返す必要があります" -#: parser/analyze.c:2626 +#: parser/analyze.c:2535 #, c-format msgid "SET target columns cannot be qualified with the relation name." msgstr "SETの対象列はリレーション名で修飾することはできません。" -#. translator: %s is OLD or NEW -#: parser/analyze.c:2714 parser/analyze.c:2724 -#, c-format -msgid "%s cannot be specified multiple times" -msgstr "%s は複数回指定できません" - -#: parser/analyze.c:2736 parser/parse_relation.c:473 -#, c-format -msgid "table name \"%s\" specified more than once" -msgstr "テーブル名\"%s\"が複数指定されました" - -#: parser/analyze.c:2784 +#: parser/analyze.c:2589 #, c-format msgid "RETURNING must have at least one column" msgstr "RETURNINGには少なくとも1つの列が必要です" -#: parser/analyze.c:2886 +#: 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:2947 +#: 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:3072 parser/analyze.c:3080 +#: parser/analyze.c:2878 parser/analyze.c:2886 #, c-format msgid "cannot specify both %s and %s" msgstr "%sと%sの両方を同時には指定できません" -#: parser/analyze.c:3100 +#: 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:3108 +#: parser/analyze.c:2914 #, c-format msgid "DECLARE CURSOR WITH HOLD ... %s is not supported" msgstr "DECLARE CURSOR WITH HOLD ... %sはサポートされていません" -#: parser/analyze.c:3111 +#: 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:3119 +#: 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:3130 +#: parser/analyze.c:2936 #, c-format msgid "DECLARE INSENSITIVE CURSOR ... %s is not valid" msgstr "DECLARE INSENSITIVE CURSOR ... %sはが不正です" -#: parser/analyze.c:3133 +#: parser/analyze.c:2939 #, c-format msgid "Insensitive cursors must be READ ONLY." msgstr "INSENSITIVEカーソルは読み取り専用である必要があります。" -#: parser/analyze.c:3227 +#: parser/analyze.c:3033 #, c-format msgid "materialized views must not use data-modifying statements in WITH" msgstr "実体化ビューではWITH句にデータを変更する文を含んではなりません" -#: parser/analyze.c:3237 +#: parser/analyze.c:3043 #, c-format msgid "materialized views must not use temporary tables or views" msgstr "実体化ビューでは一時テーブルやビューを使用してはいけません" -#: parser/analyze.c:3247 +#: parser/analyze.c:3053 #, c-format msgid "materialized views may not be defined using bound parameters" msgstr "実体化ビューは境界パラメータを用いて定義してはなりません" -#: parser/analyze.c:3259 +#: 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:3448 +#: 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:3455 +#: 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:3462 +#: 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:3469 +#: 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:3476 +#: 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:3483 +#: 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:3582 +#: 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:3646 +#: 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:3655 +#: 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:3664 +#: 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:3682 +#: 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:3691 +#: 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:3711 +#: 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:215 parser/parse_oper.c:215 +#: 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:217 +#: parser/parse_agg.c:212 #, c-format msgid "Aggregates with DISTINCT must be able to sort their inputs." msgstr "DISTINCT 付きの集約関数は、入力がソート可能である必要があります。" -#: parser/parse_agg.c:275 +#: parser/parse_agg.c:270 #, c-format msgid "GROUPING must have fewer than 32 arguments" msgstr "GROUPINGの引数は32より少くなければなりません" -#: parser/parse_agg.c:378 +#: parser/parse_agg.c:373 msgid "aggregate functions are not allowed in JOIN conditions" msgstr "JOIN条件で集約関数を使用できません" -#: parser/parse_agg.c:380 +#: parser/parse_agg.c:375 msgid "grouping operations are not allowed in JOIN conditions" msgstr "グルーピング演算はJOIN条件の中では使用できません" -#: parser/parse_agg.c:390 +#: 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:392 +#: 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:397 +#: parser/parse_agg.c:392 msgid "aggregate functions are not allowed in functions in FROM" msgstr "集約関数はFROM句内の関数では使用できません" -#: parser/parse_agg.c:399 +#: parser/parse_agg.c:394 msgid "grouping operations are not allowed in functions in FROM" msgstr "グルーピング演算はFROM句内の関数では使用できません" -#: parser/parse_agg.c:407 +#: parser/parse_agg.c:402 msgid "aggregate functions are not allowed in policy expressions" msgstr "集約関数はポリシ式では使用できません" -#: parser/parse_agg.c:409 +#: parser/parse_agg.c:404 msgid "grouping operations are not allowed in policy expressions" msgstr "グルーピング演算はポリシ式では使用できません" -#: parser/parse_agg.c:426 +#: parser/parse_agg.c:421 msgid "aggregate functions are not allowed in window RANGE" msgstr "集約関数はウィンドウRANGEの中では集約関数を使用できません" -#: parser/parse_agg.c:428 +#: parser/parse_agg.c:423 msgid "grouping operations are not allowed in window RANGE" msgstr "ウィンドウ定義のRANGE句の中ではグルーピング演算は使用できません" -#: parser/parse_agg.c:433 +#: parser/parse_agg.c:428 msgid "aggregate functions are not allowed in window ROWS" msgstr "ウィンドウ定義のROWS句では集約関数は使用できません" -#: parser/parse_agg.c:435 +#: parser/parse_agg.c:430 msgid "grouping operations are not allowed in window ROWS" msgstr "ウィンドウ定義のROWS句ではグルーピング演算は使用できません" -#: parser/parse_agg.c:440 +#: parser/parse_agg.c:435 msgid "aggregate functions are not allowed in window GROUPS" msgstr "ウィンドウ定義のGROUPS句では集約関数は使用できません" -#: parser/parse_agg.c:442 +#: parser/parse_agg.c:437 msgid "grouping operations are not allowed in window GROUPS" msgstr "ウィンドウ定義のGROUPS句ではグルーピング演算は使用できません" -#: parser/parse_agg.c:455 +#: parser/parse_agg.c:450 msgid "aggregate functions are not allowed in MERGE WHEN conditions" msgstr "MERGE WHEN条件では集約関数を使用できません" -#: parser/parse_agg.c:457 +#: parser/parse_agg.c:452 msgid "grouping operations are not allowed in MERGE WHEN conditions" msgstr "MERGE WHEN条件ではグルーピング演算を使用できません" -#: parser/parse_agg.c:484 +#: parser/parse_agg.c:479 msgid "aggregate functions are not allowed in check constraints" msgstr "検査制約では集約関数を使用できません" -#: parser/parse_agg.c:486 +#: parser/parse_agg.c:481 msgid "grouping operations are not allowed in check constraints" msgstr "検査制約ではグルーピング演算を使用できません" -#: parser/parse_agg.c:493 +#: parser/parse_agg.c:488 msgid "aggregate functions are not allowed in DEFAULT expressions" msgstr "DEFAULT式では集約関数を使用できません" -#: parser/parse_agg.c:495 +#: parser/parse_agg.c:490 msgid "grouping operations are not allowed in DEFAULT expressions" msgstr "DEFAULT式ではグルーピング演算を使用できません" -#: parser/parse_agg.c:500 +#: parser/parse_agg.c:495 msgid "aggregate functions are not allowed in index expressions" msgstr "インデックス式では集約関数を使用できません" -#: parser/parse_agg.c:502 +#: parser/parse_agg.c:497 msgid "grouping operations are not allowed in index expressions" msgstr "インデックス式ではグルーピング演算を使用できません" -#: parser/parse_agg.c:507 +#: parser/parse_agg.c:502 msgid "aggregate functions are not allowed in index predicates" msgstr "インデックス述語では集約関数を使用できません" -#: parser/parse_agg.c:509 +#: parser/parse_agg.c:504 msgid "grouping operations are not allowed in index predicates" msgstr "インデックス述語ではグルーピング演算を使用できません" -#: parser/parse_agg.c:514 +#: parser/parse_agg.c:509 msgid "aggregate functions are not allowed in statistics expressions" msgstr "統計情報式では集約関数を使用できません" -#: parser/parse_agg.c:516 +#: parser/parse_agg.c:511 msgid "grouping operations are not allowed in statistics expressions" msgstr "統計情報式ではグルーピング演算使用できません" -#: parser/parse_agg.c:521 +#: parser/parse_agg.c:516 msgid "aggregate functions are not allowed in transform expressions" msgstr "変換式では集約関数を使用できません" -#: parser/parse_agg.c:523 +#: parser/parse_agg.c:518 msgid "grouping operations are not allowed in transform expressions" msgstr "変換式ではグルーピング演算を使用できません" -#: parser/parse_agg.c:528 +#: parser/parse_agg.c:523 msgid "aggregate functions are not allowed in EXECUTE parameters" msgstr "EXECUTEのパラメータでは集約関数を使用できません" -#: parser/parse_agg.c:530 +#: parser/parse_agg.c:525 msgid "grouping operations are not allowed in EXECUTE parameters" msgstr "EXECUTEのパラメータではグルーピング演算を使用できません" -#: parser/parse_agg.c:535 +#: parser/parse_agg.c:530 msgid "aggregate functions are not allowed in trigger WHEN conditions" msgstr "トリガのWHEN条件では集約関数を使用できません" -#: parser/parse_agg.c:537 +#: parser/parse_agg.c:532 msgid "grouping operations are not allowed in trigger WHEN conditions" msgstr "トリガのWHEN条件ではグルーピング演算を使用できません" -#: parser/parse_agg.c:542 +#: parser/parse_agg.c:537 msgid "aggregate functions are not allowed in partition bound" msgstr "集約関数はパーティション境界では使用できません" -#: parser/parse_agg.c:544 +#: parser/parse_agg.c:539 msgid "grouping operations are not allowed in partition bound" msgstr "グルーピング演算はパーティション境界では使用できません" -#: parser/parse_agg.c:549 +#: parser/parse_agg.c:544 msgid "aggregate functions are not allowed in partition key expressions" msgstr "パーティションキー式では集約関数は使用できません" -#: parser/parse_agg.c:551 +#: parser/parse_agg.c:546 msgid "grouping operations are not allowed in partition key expressions" msgstr "パーティションキー式ではグルーピング演算は使用できません" -#: parser/parse_agg.c:557 +#: parser/parse_agg.c:552 msgid "aggregate functions are not allowed in column generation expressions" msgstr "集約関数はカラム生成式では使用できません" -#: parser/parse_agg.c:559 +#: parser/parse_agg.c:554 msgid "grouping operations are not allowed in column generation expressions" msgstr "グルーピング演算はカラム生成式では使用できません" -#: parser/parse_agg.c:565 +#: parser/parse_agg.c:560 msgid "aggregate functions are not allowed in CALL arguments" msgstr "CALLの引数では集約関数を使用できません" -#: parser/parse_agg.c:567 +#: parser/parse_agg.c:562 msgid "grouping operations are not allowed in CALL arguments" msgstr "CALLの引数ではグルーピング演算を使用できません" -#: parser/parse_agg.c:573 +#: parser/parse_agg.c:568 msgid "aggregate functions are not allowed in COPY FROM WHERE conditions" msgstr "集約関数は COPY FROM の WHERE 条件では使用できません" -#: parser/parse_agg.c:575 +#: 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:602 parser/parse_clause.c:1962 +#: 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:605 +#: parser/parse_agg.c:600 #, c-format msgid "grouping operations are not allowed in %s" msgstr "%sではグルーピング演算を使用できません" -#: parser/parse_agg.c:706 +#: 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:784 +#: parser/parse_agg.c:779 #, c-format msgid "aggregate function calls cannot contain set-returning function calls" msgstr "集合返却関数の呼び出しに集約関数の呼び出しを含むことはできません" -#: parser/parse_agg.c:785 parser/parse_expr.c:1760 parser/parse_expr.c:2243 parser/parse_func.c:885 +#: 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:790 +#: parser/parse_agg.c:785 #, c-format msgid "aggregate function calls cannot contain window function calls" msgstr "集約関数の呼び出しにウィンドウ関数の呼び出しを含むことはできません" -#: parser/parse_agg.c:869 +#: parser/parse_agg.c:864 msgid "window functions are not allowed in JOIN conditions" msgstr "JOIN条件ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:876 +#: parser/parse_agg.c:871 msgid "window functions are not allowed in functions in FROM" msgstr "FROM句内の関数ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:882 +#: parser/parse_agg.c:877 msgid "window functions are not allowed in policy expressions" msgstr "ポリシ式ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:895 +#: parser/parse_agg.c:890 msgid "window functions are not allowed in window definitions" msgstr "ウィンドウ定義ではウィンドウ関数は使用できません" -#: parser/parse_agg.c:906 +#: parser/parse_agg.c:901 msgid "window functions are not allowed in MERGE WHEN conditions" msgstr "MERGE WHEN条件ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:931 +#: parser/parse_agg.c:926 msgid "window functions are not allowed in check constraints" msgstr "検査制約の中ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:935 +#: parser/parse_agg.c:930 msgid "window functions are not allowed in DEFAULT expressions" msgstr "DEFAULT式の中ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:938 +#: parser/parse_agg.c:933 msgid "window functions are not allowed in index expressions" msgstr "インデックス式ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:941 +#: parser/parse_agg.c:936 msgid "window functions are not allowed in statistics expressions" msgstr "統計情報式ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:944 +#: parser/parse_agg.c:939 msgid "window functions are not allowed in index predicates" msgstr "インデックス述語ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:947 +#: parser/parse_agg.c:942 msgid "window functions are not allowed in transform expressions" msgstr "変換式ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:950 +#: parser/parse_agg.c:945 msgid "window functions are not allowed in EXECUTE parameters" msgstr "EXECUTEパラメータではウィンドウ関数を使用できません" -#: parser/parse_agg.c:953 +#: parser/parse_agg.c:948 msgid "window functions are not allowed in trigger WHEN conditions" msgstr "トリガのWHEN条件ではウィンドウ関数を使用できません" -#: parser/parse_agg.c:956 +#: parser/parse_agg.c:951 msgid "window functions are not allowed in partition bound" msgstr "ウィンドウ関数はパーティション境界では使用できません" -#: parser/parse_agg.c:959 +#: parser/parse_agg.c:954 msgid "window functions are not allowed in partition key expressions" msgstr "パーティションキー式ではウィンドウ関数は使用できません" -#: parser/parse_agg.c:962 +#: parser/parse_agg.c:957 msgid "window functions are not allowed in CALL arguments" msgstr "CALLの引数ではウィンドウ関数は使用できません" -#: parser/parse_agg.c:965 +#: parser/parse_agg.c:960 msgid "window functions are not allowed in COPY FROM WHERE conditions" msgstr "ウィンドウ関数は COPY FROM の WHERE 条件では使用できません" -#: parser/parse_agg.c:968 +#: 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:991 parser/parse_clause.c:1971 +#: 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:1025 parser/parse_clause.c:2804 +#: parser/parse_agg.c:1020 parser/parse_clause.c:2804 #, c-format msgid "window \"%s\" does not exist" msgstr "ウィンドウ\"%s\"は存在しません" -#: parser/parse_agg.c:1115 +#: parser/parse_agg.c:1108 #, c-format msgid "too many grouping sets present (maximum 4096)" msgstr "グルーピングセットの数が多すぎます (最大4096)" -#: parser/parse_agg.c:1276 +#: 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:1499 +#: 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:1502 +#: 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:1507 +#: parser/parse_agg.c:1449 #, c-format msgid "subquery uses ungrouped column \"%s.%s\" from outer query" msgstr "外部問い合わせから副問い合わせがグループ化されていない列\"%s.%s\"を使用しています" -#: parser/parse_agg.c:1672 +#: 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: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:567 parser/parse_clause.c:595 parser/parse_func.c:2553 +#: 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:607 +#: parser/parse_clause.c:609 #, c-format msgid "multiple column definition lists are not allowed for the same function" msgstr "同じ関数に対して複数の列定義リストを持つことができません" -#: parser/parse_clause.c:640 +#: 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:641 +#: 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:647 +#: parser/parse_clause.c:649 #, c-format msgid "UNNEST() with multiple arguments cannot have a column definition list" msgstr "複数の引数をもつUNNEST()は列定義リストを持つことができません" -#: parser/parse_clause.c:648 +#: 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:655 +#: 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:656 +#: 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_jsontable.c:293 +#: 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:1142 +#: 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 "USING句に列名\"%s\"が複数あります" -#: 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 "USING句で指定した列\"%sが左テーブルに存在しません" -#: 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 "USING句で指定した列\"%sが右テーブルに存在しません" @@ -17352,173 +17133,173 @@ msgstr "演算子\"%s\"は有効な順序付け演算子名ではありません msgid "Ordering operators must be \"<\" or \">\" members of btree operator families." msgstr "順序付け演算子はB-Tree演算子族の\"<\"または\">\"要素でなければなりません。" -#: parser/parse_clause.c:3778 +#: 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:3784 +#: 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:3787 +#: parser/parse_clause.c:3784 #, c-format msgid "Cast the offset value to an appropriate type." msgstr "オフセット値を適切な型にキャストしてください。" -#: parser/parse_clause.c:3792 +#: 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:3795 +#: parser/parse_clause.c:3792 #, c-format msgid "Cast the offset value to the exact intended type." msgstr "オフセット値を意図した型そのものにキャストしてください。" -#: parser/parse_coerce.c:1048 parser/parse_coerce.c:1086 parser/parse_coerce.c:1104 parser/parse_coerce.c:1119 parser/parse_expr.c:2144 parser/parse_expr.c:2762 parser/parse_expr.c:3413 parser/parse_expr.c:3642 parser/parse_target.c:1001 +#: 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への型変換ができません" -#: parser/parse_coerce.c:1089 +#: parser/parse_coerce.c:1091 #, c-format msgid "Input has too few columns." msgstr "入力列が少なすぎます。" -#: parser/parse_coerce.c:1107 +#: 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:1122 +#: 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:1177 parser/parse_coerce.c:1225 +#: parser/parse_coerce.c:1179 parser/parse_coerce.c:1227 #, c-format msgid "argument of %s must be type %s, not type %s" msgstr "%1$sの引数は型%3$sではなく%2$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:1188 parser/parse_coerce.c:1237 +#: 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:1418 +#: parser/parse_coerce.c:1420 #, c-format msgid "%s types %s and %s cannot be matched" msgstr "%sの型%sと%sを一致させることができません" -#: parser/parse_coerce.c:1534 +#: 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:1586 +#: parser/parse_coerce.c:1588 #, c-format msgid "%s could not convert type %s to %s" msgstr "%sで型%sから%sへ変換できませんでした" -#: parser/parse_coerce.c:2189 parser/parse_coerce.c:2209 parser/parse_coerce.c:2229 parser/parse_coerce.c:2250 parser/parse_coerce.c:2305 parser/parse_coerce.c:2339 +#: 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:2284 parser/parse_coerce.c:2397 utils/fmgr/funcapi.c:600 +#: 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:2317 parser/parse_coerce.c:2467 utils/fmgr/funcapi.c:614 +#: 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:2351 parser/parse_coerce.c:2431 parser/parse_coerce.c:2564 utils/fmgr/funcapi.c:632 utils/fmgr/funcapi.c:697 +#: 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:2388 +#: parser/parse_coerce.c:2390 #, c-format msgid "cannot determine element type of \"anyarray\" argument" msgstr "\"anyarray\"型の引数の要素型を決定できません" -#: parser/parse_coerce.c:2414 parser/parse_coerce.c:2445 parser/parse_coerce.c:2484 parser/parse_coerce.c:2550 +#: 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:2509 +#: parser/parse_coerce.c:2511 #, c-format msgid "could not determine polymorphic type because input has type %s" msgstr "入力型が%sであったため多様型が特定できませんでした" -#: parser/parse_coerce.c:2523 +#: parser/parse_coerce.c:2525 #, c-format msgid "type matched to anynonarray is an array type: %s" msgstr "anynonarrayと照合されたは配列型です: %s" -#: parser/parse_coerce.c:2533 +#: 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:2594 +#: 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:2612 parser/parse_coerce.c:2633 parser/parse_coerce.c:2683 parser/parse_coerce.c:2688 parser/parse_coerce.c:2752 parser/parse_coerce.c:2764 +#: 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:2622 +#: 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:2643 +#: 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:2657 +#: parser/parse_coerce.c:2659 #, c-format msgid "type matched to anycompatiblenonarray is an array type: %s" msgstr "anycompatiblenonarrayに対応する型が配列型です: %s" -#: parser/parse_coerce.c:2892 +#: 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:2909 +#: 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:2921 +#: 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:2933 +#: 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:2963 +#: parser/parse_coerce.c:2965 msgid "A result of type internal requires at least one input of type internal." msgstr "internal型の返却値には少なくとも1つのinternal型の入力が必要です。" @@ -17562,335 +17343,335 @@ msgstr "問い合わせ\"%s\"への再帰的参照が、INTERSECT内に現れて msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "問い合わせ\"%s\"への再帰的参照が、EXCEPT内で現れてはなりません" -#: parser/parse_cte.c:136 +#: parser/parse_cte.c:137 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "WITH 問い合わせ名\"%s\"が複数回指定されました" -#: parser/parse_cte.c:308 +#: parser/parse_cte.c:309 #, c-format msgid "could not identify an inequality operator for type %s" msgstr "型%sの不等演算子を特定できませんでした" -#: parser/parse_cte.c:335 +#: parser/parse_cte.c:336 #, c-format msgid "WITH clause containing a data-modifying statement must be at the top level" msgstr "データを変更するようなステートメントを含む WITH 句はトップレベルでなければなりません" -#: parser/parse_cte.c:384 +#: 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 "再帰問い合わせ\"%s\"の列%dの型は、非再帰項の内では%sになっていますが全体としては%sです" -#: parser/parse_cte.c:390 +#: 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:395 +#: 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 "再帰問い合わせ\"%s\"の列%dの照合順序は、非再帰項では\"%s\"ですが全体としては\"%s\"です" -#: parser/parse_cte.c:399 +#: 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:420 +#: parser/parse_cte.c:421 #, c-format msgid "WITH query is not recursive" msgstr "WITH問い合わせは再帰的ではありません" -#: parser/parse_cte.c:451 +#: 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:456 +#: 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:471 +#: parser/parse_cte.c:472 #, c-format msgid "search column \"%s\" not in WITH query column list" msgstr "検索カラム\\\"%s\\\"はWITH問い合わせの列リストの中にありません" -#: parser/parse_cte.c:478 +#: parser/parse_cte.c:479 #, c-format msgid "search column \"%s\" specified more than once" msgstr "検索列\"%s\"が複数回指定されています" -#: parser/parse_cte.c:487 +#: parser/parse_cte.c:488 #, c-format msgid "search sequence column name \"%s\" already used in WITH query column list" msgstr "検索順序列の名前\\\"%s\\\"はすでにWITH問い合わせの列リストで使われています" -#: parser/parse_cte.c:504 +#: parser/parse_cte.c:505 #, c-format msgid "cycle column \"%s\" not in WITH query column list" msgstr "循環列\"%s\"がWITH問い合わせの列リストに存在しません" -#: parser/parse_cte.c:511 +#: parser/parse_cte.c:512 #, c-format msgid "cycle column \"%s\" specified more than once" msgstr "循環列\"%s\"が複数回指定されています" -#: parser/parse_cte.c:520 +#: 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:527 +#: 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:535 +#: 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:545 +#: 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:552 +#: 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:636 +#: 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:816 +#: parser/parse_cte.c:882 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "WITH項目間の再帰は実装されていません" -#: parser/parse_cte.c:868 +#: parser/parse_cte.c:934 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "再帰問い合わせ\"%s\"はデータを更新するス文を含んでいてはなりません" -#: parser/parse_cte.c:876 +#: parser/parse_cte.c:942 #, 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:911 +#: parser/parse_cte.c:977 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "再帰問い合わせ内の ORDER BY は実装されていません" -#: parser/parse_cte.c:917 +#: parser/parse_cte.c:983 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "再帰問い合わせ内の OFFSET は実装されていません" -#: parser/parse_cte.c:923 +#: parser/parse_cte.c:989 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "再帰問い合わせ内の LIMIT は実装されていません" -#: parser/parse_cte.c:929 +#: 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:1008 +#: parser/parse_cte.c:1074 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "問い合わせ\"%s\"への再帰参照が2回以上現れてはなりません" -#: parser/parse_expr.c:311 +#: parser/parse_expr.c:313 #, c-format msgid "DEFAULT is not allowed in this context" msgstr "この文脈ではDEFAULTは使えません" -#: parser/parse_expr.c:404 parser/parse_relation.c:3793 parser/parse_relation.c:3803 parser/parse_relation.c:3821 parser/parse_relation.c:3828 parser/parse_relation.c:3842 +#: 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:416 +#: 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:422 +#: parser/parse_expr.c:424 #, c-format msgid "could not identify column \"%s\" in record data type" msgstr "レコードデータ型の列\"%s\"を特定できませんでした" -#: parser/parse_expr.c:428 +#: 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:459 parser/parse_target.c:735 +#: 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:582 +#: parser/parse_expr.c:584 msgid "cannot use column reference in DEFAULT expression" msgstr "列参照はDEFAULT式では使用できません" -#: parser/parse_expr.c:585 +#: parser/parse_expr.c:587 msgid "cannot use column reference in partition bound expression" msgstr "列参照はパーティション境界式では使用できません" -#: parser/parse_expr.c:844 parser/parse_relation.c:844 parser/parse_relation.c:926 parser/parse_target.c:1241 +#: 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:900 parser/parse_param.c:111 parser/parse_param.c:143 parser/parse_param.c:205 parser/parse_param.c:304 +#: 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がありません" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1101 parser/parse_expr.c:3073 +#: parser/parse_expr.c:1103 parser/parse_expr.c:3073 #, c-format msgid "%s requires = operator to yield boolean" msgstr "%sは真偽値を得るために = 演算子を必要とします" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1107 parser/parse_expr.c:3080 +#: 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:1393 +#: 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:1517 parser/parse_expr.c:1549 +#: 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:1563 +#: 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:1758 parser/parse_expr.c:2241 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:1822 +#: parser/parse_expr.c:1824 msgid "cannot use subquery in check constraint" msgstr "検査制約では副問い合わせを使用できません" -#: parser/parse_expr.c:1826 +#: parser/parse_expr.c:1828 msgid "cannot use subquery in DEFAULT expression" msgstr "DEFAULT式には副問い合わせを使用できません" -#: parser/parse_expr.c:1829 +#: parser/parse_expr.c:1831 msgid "cannot use subquery in index expression" msgstr "式インデックスには副問い合わせを使用できません" -#: parser/parse_expr.c:1832 +#: parser/parse_expr.c:1834 msgid "cannot use subquery in index predicate" msgstr "インデックスの述部に副問い合わせを使用できません" -#: parser/parse_expr.c:1835 +#: parser/parse_expr.c:1837 msgid "cannot use subquery in statistics expression" msgstr "時計情報式では副問い合わせを使用できません" -#: parser/parse_expr.c:1838 +#: parser/parse_expr.c:1840 msgid "cannot use subquery in transform expression" msgstr "変換式では副問い合わせを使用できません" -#: parser/parse_expr.c:1841 +#: parser/parse_expr.c:1843 msgid "cannot use subquery in EXECUTE parameter" msgstr "EXECUTEのパラメータに副問い合わせを使用できません" -#: parser/parse_expr.c:1844 +#: parser/parse_expr.c:1846 msgid "cannot use subquery in trigger WHEN condition" msgstr "トリガーの WHEN 条件では副問い合わせを使用できません" -#: parser/parse_expr.c:1847 +#: parser/parse_expr.c:1849 msgid "cannot use subquery in partition bound" msgstr "副問い合わせはパーティション境界では使用できません" -#: parser/parse_expr.c:1850 +#: parser/parse_expr.c:1852 msgid "cannot use subquery in partition key expression" msgstr "パーティションキー式では副問い合わせを使用できません" -#: parser/parse_expr.c:1853 +#: parser/parse_expr.c:1855 msgid "cannot use subquery in CALL argument" msgstr "CALLの引数で副問い合わせは使用できません" -#: parser/parse_expr.c:1856 +#: parser/parse_expr.c:1858 msgid "cannot use subquery in COPY FROM WHERE condition" msgstr "副問い合わせは COPY FROM の WHERE 条件では使用できません" -#: parser/parse_expr.c:1859 +#: parser/parse_expr.c:1861 msgid "cannot use subquery in column generation expression" msgstr "副問い合わせはカラム生成式では使用できません" -#: parser/parse_expr.c:1912 parser/parse_expr.c:3772 +#: 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:1983 +#: parser/parse_expr.c:1985 #, c-format msgid "subquery has too many columns" msgstr "副問い合わせの列が多すぎます" -#: parser/parse_expr.c:1988 +#: parser/parse_expr.c:1990 #, c-format msgid "subquery has too few columns" msgstr "副問い合わせの列が少なすぎます" -#: parser/parse_expr.c:2084 +#: parser/parse_expr.c:2094 #, c-format msgid "cannot determine type of empty array" msgstr "空の配列のデータ型を決定できません" -#: parser/parse_expr.c:2085 +#: 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:2099 +#: parser/parse_expr.c:2109 #, c-format msgid "could not find element type for data type %s" msgstr "データ型%sの要素を見つけられませんでした" -#: parser/parse_expr.c:2182 +#: parser/parse_expr.c:2192 #, c-format msgid "ROW expressions can have at most %d entries" msgstr "ROW式は最大でも%dエントリまでしか持てません" -#: parser/parse_expr.c:2387 +#: parser/parse_expr.c:2397 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "無名のXML属性値は列参照でなければなりません" -#: parser/parse_expr.c:2388 +#: parser/parse_expr.c:2398 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "無名のXML要素値は列参照でなければなりません" -#: parser/parse_expr.c:2403 +#: parser/parse_expr.c:2413 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "XML属性名\"%s\"が複数あります" -#: parser/parse_expr.c:2511 +#: parser/parse_expr.c:2521 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "XMLSERIALIZE の結果を %s へキャストできません" @@ -18021,7 +17802,7 @@ 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:92 +#: 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挙動指定" @@ -18432,12 +18213,12 @@ msgstr "集合返却関数は COPY FROM の WHERE条件では使用できませ msgid "set-returning functions are not allowed in column generation expressions" msgstr "集合返却関数はカラム生成式では使用できません" -#: parser/parse_jsontable.c:93 +#: 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:187 parser/parse_jsontable.c:201 +#: 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" @@ -18517,222 +18298,227 @@ msgstr "演算子 ANY/ALL (配列) はブール型を返さなければなりま msgid "op ANY/ALL (array) requires operator not to return a set" msgstr "演算子 ANY/ALL (配列) 集合を返してはなりません" -#: parser/parse_param.c:222 +#: parser/parse_param.c:221 #, c-format msgid "inconsistent types deduced for parameter $%d" msgstr "パラメータ$%dについて推定された型が不整合です" -#: parser/parse_param.c:310 tcop/postgres.c:733 +#: 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:226 +#: parser/parse_relation.c:221 #, c-format msgid "table reference \"%s\" is ambiguous" msgstr "テーブル参照\"%s\"は曖昧です" -#: parser/parse_relation.c:273 +#: parser/parse_relation.c:265 #, c-format msgid "table reference %u is ambiguous" msgstr "テーブル参照%uは曖昧です" -#: parser/parse_relation.c:502 parser/parse_relation.c:3735 parser/parse_relation.c:3744 +#: parser/parse_relation.c:465 +#, c-format +msgid "table name \"%s\" specified more than once" +msgstr "テーブル名\"%s\"が複数指定されました" + +#: 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:506 parser/parse_relation.c:3746 +#: 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:508 +#: parser/parse_relation.c:500 #, c-format msgid "The combining JOIN type must be INNER or LEFT for a LATERAL reference." msgstr "LATERAL参照では組み合わせる結合のタイプはINNERまたはLEFTでなければなりません" -#: parser/parse_relation.c:711 +#: parser/parse_relation.c:703 #, c-format msgid "system column \"%s\" reference in check constraint is invalid" msgstr "検査制約で参照されるシステム列\"%s\"は不正です" -#: parser/parse_relation.c:720 +#: parser/parse_relation.c:712 #, c-format msgid "cannot use system column \"%s\" in column generation expression" msgstr "カラム生成式ではシステム列\"%s\"は使用できません" -#: parser/parse_relation.c:731 +#: 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:1247 parser/parse_relation.c:1704 parser/parse_relation.c:2398 +#: 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:1458 +#: 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:1460 +#: 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:1846 +#: 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:1852 +#: parser/parse_relation.c:1839 #, c-format msgid "a column definition list is redundant for a function returning a named composite type" msgstr "名前付き複合型w返す関数に対しては列定義リストは不要です" -#: parser/parse_relation.c:1859 +#: parser/parse_relation.c:1846 #, c-format msgid "a column definition list is only allowed for functions returning \"record\"" msgstr "列定義リストは\"record\"を返す関数でのみ使用できます" -#: parser/parse_relation.c:1870 +#: parser/parse_relation.c:1857 #, c-format msgid "a column definition list is required for functions returning \"record\"" msgstr "\"record\"を返す関数では列定義リストが必要です" -#: parser/parse_relation.c:1907 +#: parser/parse_relation.c:1894 #, c-format msgid "column definition lists can have at most %d entries" msgstr "列定義リストは最大でも%dエントリまでしか持てません" -#: parser/parse_relation.c:1967 +#: parser/parse_relation.c:1954 #, c-format msgid "function \"%s\" in FROM has unsupported return type %s" msgstr "FROM句の関数\"%s\"の戻り値型%sはサポートされていません" -#: parser/parse_relation.c:1994 parser/parse_relation.c:2079 +#: 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:2109 +#: 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:2190 +#: 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:2255 +#: parser/parse_relation.c:2242 #, c-format msgid "joins can have at most %d columns" msgstr "JOIN で指定できるのは、最大 %d 列です" -#: parser/parse_relation.c:2280 +#: 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:2371 +#: 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:3737 +#: parser/parse_relation.c:3635 #, c-format msgid "Perhaps you meant to reference the table alias \"%s\"." msgstr "テーブル別名\"%s\"を参照しようとしていたようです。" -#: parser/parse_relation.c:3749 +#: 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:3755 +#: parser/parse_relation.c:3653 #, c-format msgid "missing FROM-clause entry for table \"%s\"" msgstr "テーブル\"%s\"用のFROM句エントリがありません" -#: parser/parse_relation.c:3795 +#: 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:3797 +#: parser/parse_relation.c:3695 #, c-format msgid "Try using a table-qualified name." msgstr "テーブル名で修飾した名前を試してください。" -#: parser/parse_relation.c:3805 +#: 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:3808 +#: 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:3810 +#: parser/parse_relation.c:3708 #, c-format msgid "To reference that column, you must use a table-qualified name." msgstr "その列を参照するには、テーブル名で修飾した名前を使う必要があります。" -#: parser/parse_relation.c:3830 +#: parser/parse_relation.c:3728 #, c-format msgid "Perhaps you meant to reference the column \"%s.%s\"." msgstr "列\"%s.%s\"を参照しようとしていたようです。" -#: parser/parse_relation.c:3844 +#: 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:483 parser/parse_target.c:798 +#: 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:511 +#: parser/parse_target.c:508 #, c-format msgid "cannot set an array element to DEFAULT" msgstr "配列要素にDEFAULTを設定できません" -#: parser/parse_target.c:516 +#: parser/parse_target.c:513 #, c-format msgid "cannot set a subfield to DEFAULT" msgstr "サブフィールドにDEFAULTを設定できません" -#: parser/parse_target.c:590 +#: 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:782 +#: 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:791 +#: 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:880 +#: 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:890 +#: 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:1330 +#: parser/parse_target.c:1327 #, c-format msgid "SELECT * with no tables specified is not valid" msgstr "テーブル指定のないSELECT *は無効です" @@ -18752,7 +18538,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:478 utils/cache/typcache.c:532 +#: 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\"は単なるシェルです" @@ -18772,357 +18558,322 @@ msgstr "型修正子は単純な定数または識別子でなければなりま msgid "invalid type name \"%s\"" msgstr "不正な型名\"%s\"" -#: parser/parse_utilcmd.c:265 +#: parser/parse_utilcmd.c:263 #, c-format msgid "cannot create partitioned table as inheritance child" msgstr "パーティション親テーブルを継承の子テーブルとして作成はできません" -#: parser/parse_utilcmd.c:504 +#: parser/parse_utilcmd.c:475 #, c-format msgid "cannot set logged status of a temporary sequence" msgstr "一時シーケンスのログ出力状態は設定できません" -#: parser/parse_utilcmd.c:642 +#: parser/parse_utilcmd.c:611 #, c-format msgid "array of serial is not implemented" msgstr "連番(SERIAL)の配列は実装されていません" -#: parser/parse_utilcmd.c:747 parser/parse_utilcmd.c:765 parser/parse_utilcmd.c:873 parser/parse_utilcmd.c:906 +#: 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:759 parser/parse_utilcmd.c:1077 -#, c-format -msgid "not-null constraints on partitioned tables cannot be NO INHERIT" -msgstr "パーティション親テーブルに対する非NULL制約はNO INHERIT指定できません" - -#: parser/parse_utilcmd.c:773 parser/parse_utilcmd.c:808 -#, c-format -msgid "conflicting NO INHERIT declarations for not-null constraints on column \"%s\"" -msgstr "列\"%s\"の非NULL制約に関する矛盾するNO INHERIT宣言" - -#: parser/parse_utilcmd.c:821 +#: 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:838 +#: parser/parse_utilcmd.c:731 #, c-format msgid "identity columns are not supported on typed tables" msgstr "型付けされたテーブルでは識別列はサポートされていません" -#: parser/parse_utilcmd.c:842 +#: parser/parse_utilcmd.c:735 #, c-format msgid "identity columns are not supported on partitions" msgstr "パーティションでは識別列はサポートされていません" -#: parser/parse_utilcmd.c:851 +#: 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:884 +#: parser/parse_utilcmd.c:774 #, c-format msgid "generated columns are not supported on typed tables" msgstr "型付けされたテーブルでは生成カラムはサポートされていません" -#: parser/parse_utilcmd.c:888 +#: 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:915 parser/parse_utilcmd.c:1043 +#: 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:924 parser/parse_utilcmd.c:1053 +#: 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:971 +#: 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:979 +#: 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:987 +#: 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:1063 +#: parser/parse_utilcmd.c:931 #, c-format msgid "exclusion constraints are not supported on foreign tables" msgstr "外部テーブルでは除外制約はサポートされていません" -#: parser/parse_utilcmd.c:1138 +#: parser/parse_utilcmd.c:996 #, c-format msgid "LIKE is not supported for creating foreign tables" msgstr "外部テーブルの作成においてLIKEはサポートされていません" -#: parser/parse_utilcmd.c:1151 +#: parser/parse_utilcmd.c:1009 #, c-format msgid "relation \"%s\" is invalid in LIKE clause" msgstr "LIKE句ではリレーション\"%s\"は不正です" -#: parser/parse_utilcmd.c:1894 parser/parse_utilcmd.c:2002 +#: 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:2396 +#: parser/parse_utilcmd.c:2242 #, c-format msgid "cannot use an existing index in CREATE TABLE" msgstr "CREATE TABLE では既存のインデックスを使えません" -#: parser/parse_utilcmd.c:2416 +#: parser/parse_utilcmd.c:2262 #, c-format msgid "index \"%s\" is already associated with a constraint" msgstr "インデックス\"%s\"はすでに1つの制約に割り当てられています" -#: parser/parse_utilcmd.c:2442 +#: parser/parse_utilcmd.c:2283 #, c-format msgid "\"%s\" is not a unique index" msgstr "\"%s\"はユニークインデックスではありません" -#: parser/parse_utilcmd.c:2443 parser/parse_utilcmd.c:2450 parser/parse_utilcmd.c:2457 parser/parse_utilcmd.c:2534 +#: 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:2449 +#: parser/parse_utilcmd.c:2290 #, c-format msgid "index \"%s\" contains expressions" msgstr "インデックス\"%s\"は式を含んでいます" -#: parser/parse_utilcmd.c:2456 +#: parser/parse_utilcmd.c:2297 #, c-format msgid "\"%s\" is a partial index" msgstr "\"%s\"は部分インデックスです" -#: parser/parse_utilcmd.c:2468 +#: parser/parse_utilcmd.c:2309 #, c-format msgid "\"%s\" is a deferrable index" msgstr "\"%s\"は遅延可能インデックスです" -#: parser/parse_utilcmd.c:2469 +#: parser/parse_utilcmd.c:2310 #, c-format msgid "Cannot create a non-deferrable constraint using a deferrable index." msgstr "遅延可能インデックスを使った遅延不可制約は作れません。" -#: parser/parse_utilcmd.c:2533 +#: 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:2725 +#: parser/parse_utilcmd.c:2531 #, c-format msgid "column \"%s\" appears twice in primary key constraint" msgstr "列\"%s\"がプライマリキー制約内に2回出現します" -#: parser/parse_utilcmd.c:2731 +#: parser/parse_utilcmd.c:2537 #, c-format msgid "column \"%s\" appears twice in unique constraint" msgstr "列\"%s\"が一意性制約内に2回出現します" -#: parser/parse_utilcmd.c:2776 -#, c-format -msgid "column \"%s\" in WITHOUT OVERLAPS is not a range or multirange type" -msgstr "WITHOUT OVERLAPS中の列\"%s\"は範囲型でも副範囲型でもありません" - -#: parser/parse_utilcmd.c:2804 -#, c-format -msgid "constraint using WITHOUT OVERLAPS needs at least two columns" -msgstr "WITHOUT OVERLAPSを使用する制約では少なくとも2つの列が必要です" - -#: parser/parse_utilcmd.c:3099 +#: 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:3171 +#: parser/parse_utilcmd.c:2943 #, c-format msgid "statistics expressions can refer only to the table being referenced" msgstr "統計情報式は参照されているテーブルのみを参照できます" -#: parser/parse_utilcmd.c:3214 +#: parser/parse_utilcmd.c:2986 #, c-format msgid "rules on materialized views are not supported" msgstr "実体化ビューに対するルールはサポートされません" -#: parser/parse_utilcmd.c:3274 +#: parser/parse_utilcmd.c:3046 #, c-format msgid "rule WHERE condition cannot contain references to other relations" msgstr "ルールのWHERE条件に他のリレーションへの参照を持たせられません" -#: parser/parse_utilcmd.c:3346 +#: 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:3364 parser/parse_utilcmd.c:3465 rewrite/rewriteHandler.c:544 rewrite/rewriteManip.c:1156 +#: 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:3382 +#: parser/parse_utilcmd.c:3154 #, c-format msgid "ON SELECT rule cannot use OLD" msgstr "ON SELECTルールではOLDを使用できません" -#: parser/parse_utilcmd.c:3386 +#: parser/parse_utilcmd.c:3158 #, c-format msgid "ON SELECT rule cannot use NEW" msgstr "ON SELECTルールではNEWを使用できません" -#: parser/parse_utilcmd.c:3395 +#: parser/parse_utilcmd.c:3167 #, c-format msgid "ON INSERT rule cannot use OLD" msgstr "ON INSERTルールではOLDを使用できません" -#: parser/parse_utilcmd.c:3401 +#: parser/parse_utilcmd.c:3173 #, c-format msgid "ON DELETE rule cannot use NEW" msgstr "ON DELETEルールではNEWを使用できません" -#: parser/parse_utilcmd.c:3429 +#: parser/parse_utilcmd.c:3201 #, c-format msgid "cannot refer to OLD within WITH query" msgstr "WITH 問い合わせ内では OLD は参照できません" -#: parser/parse_utilcmd.c:3436 +#: parser/parse_utilcmd.c:3208 #, c-format msgid "cannot refer to NEW within WITH query" msgstr "WITH 問い合わせ内では NEW は参照できません" -#: parser/parse_utilcmd.c:3894 +#: parser/parse_utilcmd.c:3664 #, c-format msgid "misplaced DEFERRABLE clause" msgstr "DEFERRABLE句の場所が間違っています" -#: parser/parse_utilcmd.c:3899 parser/parse_utilcmd.c:3914 +#: 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:3909 +#: parser/parse_utilcmd.c:3679 #, c-format msgid "misplaced NOT DEFERRABLE clause" msgstr "NOT DEFERRABLE句の場所が間違っています" -#: parser/parse_utilcmd.c:3930 +#: parser/parse_utilcmd.c:3700 #, c-format msgid "misplaced INITIALLY DEFERRED clause" msgstr "INITIALLY DEFERRED句の場所が間違っています<" -#: parser/parse_utilcmd.c:3935 parser/parse_utilcmd.c:3961 +#: 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:3956 +#: parser/parse_utilcmd.c:3726 #, c-format msgid "misplaced INITIALLY IMMEDIATE clause" msgstr "INITIALLY IMMEDIATE句の場所が間違っています<" -#: parser/parse_utilcmd.c:3972 -#, c-format -msgid "misplaced ENFORCED clause" -msgstr "ENFORCED句の場所が間違っています" - -#: parser/parse_utilcmd.c:3977 parser/parse_utilcmd.c:3993 -#, c-format -msgid "multiple ENFORCED/NOT ENFORCED clauses not allowed" -msgstr "複数のENFORCED/NOT ENFORCED句は指定できません" - -#: parser/parse_utilcmd.c:3988 -#, c-format -msgid "misplaced NOT ENFORCED clause" -msgstr "NOT ENFORCED句の場所が間違っています" - -#: parser/parse_utilcmd.c:4186 +#: 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:4221 +#: parser/parse_utilcmd.c:3954 #, c-format msgid "\"%s\" is not a partitioned table" msgstr "\"%s\"はパーティションテーブルではありません" -#: parser/parse_utilcmd.c:4228 +#: parser/parse_utilcmd.c:3961 #, c-format msgid "table \"%s\" is not partitioned" msgstr "テーブル\"%s\"はパーティションされていません" -#: parser/parse_utilcmd.c:4235 +#: parser/parse_utilcmd.c:3968 #, c-format msgid "index \"%s\" is not partitioned" msgstr "インデックス\"%s\"はパーティションされていません" -#: parser/parse_utilcmd.c:4275 +#: parser/parse_utilcmd.c:4008 #, c-format msgid "a hash-partitioned table may not have a default partition" msgstr "ハッシュパーティションテーブルはデフォルトパーティションを持つことができません" -#: parser/parse_utilcmd.c:4292 +#: parser/parse_utilcmd.c:4025 #, c-format msgid "invalid bound specification for a hash partition" msgstr "ハッシュパーティションに対する不正な境界指定" -#: parser/parse_utilcmd.c:4298 partitioning/partbounds.c:4802 +#: 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:4305 partitioning/partbounds.c:4810 +#: 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:4318 +#: parser/parse_utilcmd.c:4051 #, c-format msgid "invalid bound specification for a list partition" msgstr "リストパーティションに対する不正な境界指定" -#: parser/parse_utilcmd.c:4371 +#: parser/parse_utilcmd.c:4104 #, c-format msgid "invalid bound specification for a range partition" msgstr "範囲パーティションに対する不正な境界指定" -#: parser/parse_utilcmd.c:4377 +#: parser/parse_utilcmd.c:4110 #, c-format msgid "FROM must specify exactly one value per partitioning column" msgstr "FROMは全てのパーティション列ごとに一つの値を指定しなければなりません" -#: parser/parse_utilcmd.c:4381 +#: parser/parse_utilcmd.c:4114 #, c-format msgid "TO must specify exactly one value per partitioning column" msgstr "TOは全てのパーティション列ごとに一つの値を指定しなければなりません" -#: parser/parse_utilcmd.c:4495 +#: parser/parse_utilcmd.c:4228 #, c-format msgid "cannot specify NULL in range bound" msgstr "範囲境界でNULLは使用できません" -#: parser/parse_utilcmd.c:4544 +#: parser/parse_utilcmd.c:4277 #, c-format msgid "every bound following MAXVALUE must also be MAXVALUE" msgstr "MAXVALUEに続く境界値はMAXVALUEでなければなりません" -#: parser/parse_utilcmd.c:4551 +#: parser/parse_utilcmd.c:4284 #, c-format msgid "every bound following MINVALUE must also be MINVALUE" msgstr "MINVALUEに続く境界値はMINVALUEでなければなりません" -#: parser/parse_utilcmd.c:4594 +#: parser/parse_utilcmd.c:4327 #, c-format msgid "specified value cannot be cast to type %s for column \"%s\"" msgstr "指定した値は列\"%s\"の%s型に変換できません" @@ -19135,12 +18886,12 @@ msgstr "UESCAPE の後には単純な文字列リテラルが続かなければ msgid "invalid Unicode escape character" msgstr "不正なUnicodeエスケープ文字" -#: parser/parser.c:347 scan.l:1385 +#: parser/parser.c:347 scan.l:1393 #, c-format msgid "invalid Unicode escape value" msgstr "不正なUnicodeエスケープシーケンスの値" -#: parser/parser.c:494 scan.l:702 utils/adt/varlena.c:6653 +#: parser/parser.c:494 scan.l:716 utils/adt/varlena.c:6640 #, c-format msgid "invalid Unicode escape" msgstr "不正なUnicodeエスケープ" @@ -19150,7 +18901,7 @@ msgstr "不正なUnicodeエスケープ" msgid "Unicode escapes must be \\XXXX or \\+XXXXXX." msgstr "Unicodeエスケープは\\XXXXまたは\\+XXXXXXでなければなりません。" -#: parser/parser.c:523 scan.l:663 scan.l:679 scan.l:695 utils/adt/varlena.c:6678 +#: 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サロゲートペア" @@ -19292,12 +19043,12 @@ msgstr "このプラットフォームではヒュージページをサポート 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:1403 +#: 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:801 port/sysv_shmem.c:801 utils/init/miscinit.c:1405 +#: 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\". に対応する古いサーバープロセスをすべて終了させてください。" @@ -19445,219 +19196,199 @@ msgstr "失敗したシステムコールはMapViewOfFileExです。" msgid "Failed system call was MapViewOfFileEx." msgstr "失敗したシステムコールはMapViewOfFileExです。" -#: postmaster/autovacuum.c:691 +#: postmaster/autovacuum.c:686 #, c-format msgid "autovacuum worker took too long to start; canceled" msgstr "自動VACUUMワーカーの起動に時間がかかりすぎています; キャンセルしました" -#: postmaster/autovacuum.c:2215 +#: postmaster/autovacuum.c:2218 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "自動VACUUM: 孤立した一時テーブル\"%s.%s.%s\"を削除します" -#: postmaster/autovacuum.c:2451 +#: postmaster/autovacuum.c:2461 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "テーブル\"%s.%s.%s\"に対する自動VACUUM" -#: postmaster/autovacuum.c:2454 +#: postmaster/autovacuum.c:2464 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "テーブル\"%s.%s.%s\"に対する自動ANALYZE" -#: postmaster/autovacuum.c:2648 +#: postmaster/autovacuum.c:2660 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "リレーション\"%s.%s.%s\"の作業エントリを処理しています" -#: postmaster/autovacuum.c:3279 +#: postmaster/autovacuum.c:3291 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "誤設定のため自動VACUUMが起動できません" -#: postmaster/autovacuum.c:3280 +#: postmaster/autovacuum.c:3292 #, c-format msgid "Enable the \"track_counts\" option." msgstr "\"track_counts\"オプションを有効にしてください。" -#: postmaster/autovacuum.c:3402 -#, c-format -msgid "\"autovacuum_max_workers\" (%d) should be less than or equal to \"autovacuum_worker_slots\" (%d)" -msgstr "\"autovacuum_max_workers\" (%d) は \"autovacuum_worker_slots\" (%d) 以下でなければなりません" - -#: postmaster/autovacuum.c:3404 -#, c-format -msgid "The server will only start up to \"autovacuum_worker_slots\" (%d) autovacuum workers at a given time." -msgstr "このサーバーは、同時に最大 \"autovacuum_worker_slots\" (%d) プロセスの自動バキュームワーカーを起動します。" - #: postmaster/bgworker.c:260 #, c-format -msgid "inconsistent background worker state (\"max_worker_processes\"=%d, total slots=%d)" -msgstr "バックグラウンドワーカー状態の不整合 (\"max_worker_processes\"=%d, スロット総数=%d)" +msgid "inconsistent background worker state (max_worker_processes=%d, total_slots=%d)" +msgstr "バックグラウンドワーカー状態の矛盾 (max_worker_processes=%d, total_slots=%d)" -#: postmaster/bgworker.c:645 +#: postmaster/bgworker.c:651 #, c-format msgid "background worker \"%s\": background workers without shared memory access are not supported" msgstr "バックグラウンドワーカー\"%s\": 共有メモリアクセスを伴わないバックグラウンドワーカーはサポートされません" -#: postmaster/bgworker.c:656 +#: 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:670 +#: postmaster/bgworker.c:676 #, c-format msgid "background worker \"%s\": invalid restart interval" msgstr "バックグラウンドワーカー\"%s\": 不正な再起動間隔" -#: postmaster/bgworker.c:685 +#: postmaster/bgworker.c:691 #, c-format msgid "background worker \"%s\": parallel workers may not be configured for restart" msgstr "バックグラウンドワーカー\"%s\": パラレルワーカーは再起動するように設定してはいけません" -#: postmaster/bgworker.c:709 tcop/postgres.c:3314 +#: postmaster/bgworker.c:715 tcop/postgres.c:3312 #, c-format msgid "terminating background worker \"%s\" due to administrator command" msgstr "管理者コマンドによりバックグラウンドワーカー\"%s\"を終了しています" -#: postmaster/bgworker.c:868 postmaster/bgworker.c:902 -#, c-format -msgid "database connection requirement not indicated during registration" -msgstr "登録時にデータベース接続の必要性が示されていません" - -#: postmaster/bgworker.c:878 postmaster/bgworker.c:912 -#, c-format -msgid "invalid processing mode in background worker" -msgstr "バックグラウンドワーカー内の不正な処理モード" - -#: postmaster/bgworker.c:965 +#: 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:988 +#: postmaster/bgworker.c:911 #, c-format msgid "background worker \"%s\": only dynamic background workers can request notification" msgstr "バックグラウンドワーカー\"%s\": 動的バックグラウンドワーカーのみが通知を要求できます" -#: postmaster/bgworker.c:1003 +#: postmaster/bgworker.c:926 #, c-format msgid "too many background workers" msgstr "バックグラウンドワーカーが多すぎます" -#: postmaster/bgworker.c:1004 +#: 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:1008 postmaster/checkpointer.c:457 +#: postmaster/bgworker.c:931 postmaster/checkpointer.c:445 #, c-format msgid "Consider increasing the configuration parameter \"%s\"." msgstr "設定パラメータ\"%s\"を増やすことを検討してください。" -#: postmaster/checkpointer.c:453 +#: 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:1119 +#: postmaster/checkpointer.c:1067 #, c-format msgid "checkpoint request failed" msgstr "チェックポイント要求が失敗しました" -#: postmaster/checkpointer.c:1120 +#: postmaster/checkpointer.c:1068 #, c-format msgid "Consult recent messages in the server log for details." msgstr "詳細はサーバーログの最近のメッセージを調査してください" -#: postmaster/launch_backend.c:379 +#: postmaster/launch_backend.c:381 #, c-format msgid "could not execute server process \"%s\": %m" msgstr "サーバープロセス\"%s\"を実行できませんでした: %m" -#: postmaster/launch_backend.c:433 +#: postmaster/launch_backend.c:434 #, c-format msgid "could not create backend parameter file mapping: error code %lu" msgstr "バックエンドパラメータファイルのファイルマッピングを作成できませんでした: エラーコード%lu" -#: postmaster/launch_backend.c:441 +#: postmaster/launch_backend.c:442 #, c-format msgid "could not map backend parameter memory: error code %lu" msgstr "バックエンドパラメータのメモリをマップできませんでした: エラーコード %lu" -#: postmaster/launch_backend.c:458 +#: postmaster/launch_backend.c:459 #, c-format msgid "subprocess command line too long" msgstr "サブプロセスのコマンドラインが長すぎます" -#: postmaster/launch_backend.c:476 +#: postmaster/launch_backend.c:477 #, c-format msgid "CreateProcess() call failed: %m (error code %lu)" msgstr "CreateProcess() の呼び出しが失敗しました: %m (エラーコード %lu)" -#: postmaster/launch_backend.c:505 +#: 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:509 +#: 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:531 +#: postmaster/launch_backend.c:530 #, c-format msgid "giving up after too many tries to reserve shared memory" msgstr "共有メモリの確保のリトライ回数が多すぎるため中断します" -#: postmaster/launch_backend.c:532 +#: postmaster/launch_backend.c:531 #, c-format msgid "This might be caused by ASLR or antivirus software." msgstr "これはASLRまたはアンチウイルスソフトウェアが原因である可能性があります。" -#: postmaster/launch_backend.c:821 +#: 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:853 +#: postmaster/launch_backend.c:866 #, c-format msgid "could not create inherited socket: error code %d\n" msgstr "継承したソケットを作成できませんでした: エラーコード %d\n" -#: postmaster/launch_backend.c:882 +#: 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:888 +#: 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:899 +#: 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:911 +#: postmaster/launch_backend.c:924 #, c-format msgid "could not remove file \"%s\": %m\n" msgstr "ファイル\"%s\"を削除できませんでした: %m\n" -#: postmaster/launch_backend.c:927 +#: 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:946 +#: 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:953 +#: postmaster/launch_backend.c:966 #, c-format msgid "could not close handle to backend parameter variables: error code %lu\n" msgstr "バックエンドパラメータ変数のハンドルをクローズできませんでした: エラーコード%lu\n" @@ -19707,138 +19438,138 @@ msgstr "アーカイブモジュールはシンボル%sを定義しなくては msgid "archive modules must register an archive callback" msgstr "アーカイブモジュールはアーカイブコールバックを登録しなくてはなりません" -#: postmaster/postmaster.c:668 +#: postmaster/postmaster.c:661 #, c-format msgid "%s: invalid argument for option -f: \"%s\"\n" msgstr "%s: -fオプションに対する不正な引数: \"%s\"\n" -#: postmaster/postmaster.c:741 +#: postmaster/postmaster.c:734 #, c-format msgid "%s: invalid argument for option -t: \"%s\"\n" msgstr "%s: -tオプションに対する不正な引数: \"%s\"\n" -#: postmaster/postmaster.c:764 +#: postmaster/postmaster.c:757 #, c-format msgid "%s: invalid argument: \"%s\"\n" msgstr "%s: 不正な引数: \"%s\"\n" -#: postmaster/postmaster.c:832 +#: 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:840 +#: postmaster/postmaster.c:833 #, c-format msgid "WAL archival cannot be enabled when \"wal_level\" is \"minimal\"" msgstr "\"wal_level\"が\"minimal\"の時はWALアーカイブは有効にできません" -#: postmaster/postmaster.c:843 +#: postmaster/postmaster.c:836 #, c-format 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:846 +#: postmaster/postmaster.c:839 #, c-format msgid "WAL cannot be summarized when \"wal_level\" is \"minimal\"" msgstr "\"wal_level\"が\"minimal\"の時はWALは集約できません" -#: postmaster/postmaster.c:854 +#: postmaster/postmaster.c:847 #, c-format msgid "%s: invalid datetoken tables, please fix\n" msgstr "%s: データトークンテーブルが不正です、修復してください\n" -#: postmaster/postmaster.c:1015 +#: postmaster/postmaster.c:1004 #, c-format msgid "could not create I/O completion port for child queue" msgstr "子キュー向けのI/O終了ポートを作成できませんでした" -#: postmaster/postmaster.c:1081 +#: postmaster/postmaster.c:1069 #, c-format msgid "ending log output to stderr" msgstr "標準エラー出力へのログ出力を終了しています" -#: postmaster/postmaster.c:1082 +#: postmaster/postmaster.c:1070 #, c-format msgid "Future log output will go to log destination \"%s\"." msgstr "この後のログ出力はログ配送先\"%s\"に出力されます。" -#: postmaster/postmaster.c:1093 +#: postmaster/postmaster.c:1081 #, c-format msgid "starting %s" msgstr "%s を起動しています" -#: postmaster/postmaster.c:1155 +#: postmaster/postmaster.c:1143 #, c-format msgid "could not create listen socket for \"%s\"" msgstr "\"%s\"に関する監視用ソケットを作成できませんでした" -#: postmaster/postmaster.c:1161 +#: postmaster/postmaster.c:1149 #, c-format msgid "could not create any TCP/IP sockets" msgstr "TCP/IPソケットを作成できませんでした" -#: postmaster/postmaster.c:1193 +#: postmaster/postmaster.c:1181 #, c-format msgid "DNSServiceRegister() failed: error code %ld" msgstr "DNSServiceRegister()が失敗しました: エラーコード %ld" -#: postmaster/postmaster.c:1246 +#: postmaster/postmaster.c:1234 #, c-format msgid "could not create Unix-domain socket in directory \"%s\"" msgstr "ディレクトリ\"%s\"においてUnixドメインソケットを作成できませんでした" -#: postmaster/postmaster.c:1252 +#: postmaster/postmaster.c:1240 #, c-format msgid "could not create any Unix-domain sockets" msgstr "Unixドメインソケットを作成できませんでした" -#: postmaster/postmaster.c:1263 +#: postmaster/postmaster.c:1251 #, c-format msgid "no socket created for listening" msgstr "監視用に作成するソケットはありません" -#: postmaster/postmaster.c:1294 +#: 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:1298 +#: 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:1326 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:1354 +#: postmaster/postmaster.c:1342 #, c-format msgid "postmaster became multithreaded during startup" msgstr "postmasterは起動処理中はマルチスレッドで動作します" -#: postmaster/postmaster.c:1355 postmaster/postmaster.c:3600 +#: 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:1454 +#: postmaster/postmaster.c:1442 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s: 自身の実行ファイルのパスが特定できません" -#: postmaster/postmaster.c:1461 +#: postmaster/postmaster.c:1449 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: 一致するpostgres実行ファイルがありませんでした" -#: postmaster/postmaster.c:1484 utils/misc/tzparser.c:342 +#: 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:1511 +#: postmaster/postmaster.c:1499 #, c-format msgid "" "%s: could not find the database system\n" @@ -19850,274 +19581,289 @@ msgstr "" "ファイル\"%s\"をオープンできませんでした: %m\n" #. translator: %s is SIGKILL or SIGABRT -#: postmaster/postmaster.c:1748 +#: postmaster/postmaster.c:1789 #, c-format msgid "issuing %s to recalcitrant children" msgstr "手に負えない子プロセスに%sを送出します" -#: postmaster/postmaster.c:1770 +#: postmaster/postmaster.c:1811 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "データディレクトリのロックファイルが不正なため、即時シャットダウンを実行中です" -#: postmaster/postmaster.c:1991 +#: postmaster/postmaster.c:1874 +#, c-format +msgid "wrong key in cancel request for process %d" +msgstr "プロセス%dに対するキャンセル要求においてキーが間違っています" + +#: postmaster/postmaster.c:1886 +#, c-format +msgid "PID %d in cancel request did not match any process" +msgstr "キャンセル要求内のPID %dがどのプロセスにも一致しません" + +#: postmaster/postmaster.c:2106 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "SIGHUPを受け取りました。設定ファイルをリロードしています" #. translator: %s is a configuration file -#: postmaster/postmaster.c:1999 postmaster/postmaster.c:2003 +#: postmaster/postmaster.c:2134 postmaster/postmaster.c:2138 #, c-format msgid "%s was not reloaded" msgstr "%s は再読み込みされていません" -#: postmaster/postmaster.c:2013 +#: postmaster/postmaster.c:2148 #, c-format msgid "SSL configuration was not reloaded" msgstr "SSL設定は再読み込みされていません" -#: postmaster/postmaster.c:2099 +#: postmaster/postmaster.c:2234 #, c-format msgid "received smart shutdown request" msgstr "スマートシャットダウン要求を受け取りました" -#: postmaster/postmaster.c:2140 +#: postmaster/postmaster.c:2275 #, c-format msgid "received fast shutdown request" msgstr "高速シャットダウン要求を受け取りました" -#: postmaster/postmaster.c:2158 +#: postmaster/postmaster.c:2293 #, c-format msgid "aborting any active transactions" msgstr "活動中の全トランザクションをアボートしています" -#: postmaster/postmaster.c:2182 +#: postmaster/postmaster.c:2317 #, c-format msgid "received immediate shutdown request" msgstr "即時シャットダウン要求を受け取りました" -#: postmaster/postmaster.c:2257 +#: postmaster/postmaster.c:2389 #, c-format msgid "shutdown at recovery target" msgstr "リカバリ目標でシャットダウンします" -#: postmaster/postmaster.c:2275 postmaster/postmaster.c:2311 +#: postmaster/postmaster.c:2407 postmaster/postmaster.c:2443 msgid "startup process" msgstr "起動プロセス" -#: postmaster/postmaster.c:2278 +#: postmaster/postmaster.c:2410 #, c-format msgid "aborting startup due to startup process failure" msgstr "起動プロセスの失敗のため起動を中断しています" -#: postmaster/postmaster.c:2334 +#: postmaster/postmaster.c:2485 #, c-format msgid "database system is ready to accept connections" msgstr "データベースシステムの接続受け付け準備が整いました" -#: postmaster/postmaster.c:2356 +#: postmaster/postmaster.c:2506 msgid "background writer process" msgstr "バックグランドライタプロセス" -#: postmaster/postmaster.c:2389 +#: postmaster/postmaster.c:2553 msgid "checkpointer process" msgstr "チェックポイント処理プロセス" -#: postmaster/postmaster.c:2406 +#: postmaster/postmaster.c:2569 msgid "WAL writer process" msgstr "WALライタプロセス" -#: postmaster/postmaster.c:2422 +#: postmaster/postmaster.c:2584 msgid "WAL receiver process" msgstr "WAL 受信プロセス" -#: postmaster/postmaster.c:2437 +#: postmaster/postmaster.c:2598 msgid "WAL summarizer process" msgstr "WAL集約プロセス" -#: postmaster/postmaster.c:2453 +#: postmaster/postmaster.c:2613 msgid "autovacuum launcher process" msgstr "自動VACUUM起動プロセス" -#: postmaster/postmaster.c:2469 +#: postmaster/postmaster.c:2631 msgid "archiver process" msgstr "アーカイバプロセス" -#: postmaster/postmaster.c:2484 +#: postmaster/postmaster.c:2644 msgid "system logger process" msgstr "システムログ取得プロセス" -#: postmaster/postmaster.c:2502 +#: postmaster/postmaster.c:2661 msgid "slot sync worker process" msgstr "スロット同期ワーカープロセス" -#: postmaster/postmaster.c:2522 postmaster/postmaster.c:2524 -msgid "untracked child process" -msgstr "追跡されていない子プロセス" - -#: postmaster/postmaster.c:2557 +#: postmaster/postmaster.c:2717 #, c-format msgid "background worker \"%s\"" msgstr "バックグラウンドワーカー\"%s\"" -#: postmaster/postmaster.c:2773 +#: postmaster/postmaster.c:2796 postmaster/postmaster.c:2816 postmaster/postmaster.c:2823 postmaster/postmaster.c:2841 +msgid "server process" +msgstr "サーバープロセス" + +#: 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:2806 +#: postmaster/postmaster.c:3082 #, c-format msgid "%s (PID %d) exited with exit code %d" msgstr "%s (PID %d)は終了コード%dで終了しました" -#: postmaster/postmaster.c:2808 postmaster/postmaster.c:2820 postmaster/postmaster.c:2830 postmaster/postmaster.c:2841 +#: 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:2817 +#: 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:2827 +#: 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:2839 +#: postmaster/postmaster.c:3115 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d)は認識できないステータス%dで終了しました" -#: postmaster/postmaster.c:3114 +#: postmaster/postmaster.c:3331 #, c-format msgid "abnormal database system shutdown" msgstr "データベースシステムは異常にシャットダウンしました" -#: postmaster/postmaster.c:3140 +#: postmaster/postmaster.c:3357 #, c-format msgid "shutting down due to startup process failure" msgstr "起動プロセスの失敗のためシャットダウンしています" -#: postmaster/postmaster.c:3146 +#: postmaster/postmaster.c:3363 #, c-format msgid "shutting down because \"restart_after_crash\" is off" msgstr "\"restart_after_crash\"がoffであるためシャットダウンします" -#: postmaster/postmaster.c:3158 +#: postmaster/postmaster.c:3375 #, c-format msgid "all server processes terminated; reinitializing" msgstr "全てのサーバープロセスが終了しました: 再初期化しています" -#: postmaster/postmaster.c:3530 +#: 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:3607 #, c-format msgid "could not fork new process for connection: %m" msgstr "接続用の新しいプロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:3565 +#: postmaster/postmaster.c:3649 msgid "could not fork new process for connection: " msgstr "接続用の新しいプロセスをforkできませんでした" -#: postmaster/postmaster.c:3599 +#: postmaster/postmaster.c:3683 #, c-format msgid "postmaster became multithreaded" msgstr "postmasterがマルチスレッド動作になっています" -#: postmaster/postmaster.c:3670 +#: postmaster/postmaster.c:3752 #, c-format msgid "database system is ready to accept read-only connections" msgstr "データベースシステムはリードオンリー接続の受け付け準備ができました" -#: postmaster/postmaster.c:3771 -#, c-format -msgid "WAL was shut down unexpectedly" -msgstr "WALが予期せずシャットダウンされました。" - -#: postmaster/postmaster.c:3896 -#, c-format -msgid "no slot available for new autovacuum worker process" -msgstr "新しい自動VACUUMワーカープロセスに割り当て可能なスロットがありません" - -#: postmaster/postmaster.c:3911 +#: postmaster/postmaster.c:3935 #, c-format msgid "could not fork \"%s\" process: %m" msgstr "\"%s\"プロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:4070 +#: postmaster/postmaster.c:4173 postmaster/postmaster.c:4207 #, c-format -msgid "no slot available for new background worker process" -msgstr "新しいバックグラウンドワーカープロセスに割り当て可能なスロットがありません" +msgid "database connection requirement not indicated during registration" +msgstr "登録時にデータベース接続の必要性が示されていません" + +#: postmaster/postmaster.c:4183 postmaster/postmaster.c:4217 +#, c-format +msgid "invalid processing mode in background worker" +msgstr "バックグラウンドワーカー内の不正な処理モード" -#: postmaster/postmaster.c:4088 +#: postmaster/postmaster.c:4277 #, c-format msgid "could not fork background worker process: %m" msgstr "バックグランドワーカープロセスをforkできませんでした: %m" -#: postmaster/postmaster.c:4327 +#: postmaster/postmaster.c:4360 +#, c-format +msgid "no slot available for new background worker process" +msgstr "新しいバックグラウンドワーカープロセスに割り当て可能なスロットがありません" + +#: postmaster/postmaster.c:4623 #, c-format msgid "could not read exit code for process\n" msgstr "子プロセスの終了コードの読み込みができませんでした\n" -#: postmaster/postmaster.c:4369 +#: postmaster/postmaster.c:4665 #, c-format msgid "could not post child completion status\n" msgstr "個プロセスの終了コードを投稿できませんでした\n" -#: postmaster/syslogger.c:527 postmaster/syslogger.c:1172 +#: postmaster/syslogger.c:529 postmaster/syslogger.c:1173 #, c-format msgid "could not read from logger pipe: %m" msgstr "ロガーパイプから読み取れませんでした: %m" -#: postmaster/syslogger.c:626 postmaster/syslogger.c:640 +#: postmaster/syslogger.c:629 postmaster/syslogger.c:643 #, c-format msgid "could not create pipe for syslog: %m" msgstr "syslog用のパイプを作成できませんでした: %m" -#: postmaster/syslogger.c:711 +#: postmaster/syslogger.c:712 #, c-format msgid "could not fork system logger: %m" msgstr "システムロガーをforkできませんでした: %m" -#: postmaster/syslogger.c:730 +#: postmaster/syslogger.c:731 #, c-format msgid "redirecting log output to logging collector process" msgstr "ログ出力をログ収集プロセスにリダイレクトしています" -#: postmaster/syslogger.c:731 +#: postmaster/syslogger.c:732 #, c-format msgid "Future log output will appear in directory \"%s\"." msgstr "ここからのログ出力はディレクトリ\"%s\"に現れます。" -#: postmaster/syslogger.c:739 +#: postmaster/syslogger.c:740 #, c-format msgid "could not redirect stdout: %m" msgstr "標準出力にリダイレクトできませんでした: %m" -#: postmaster/syslogger.c:744 postmaster/syslogger.c:761 +#: postmaster/syslogger.c:745 postmaster/syslogger.c:762 #, c-format msgid "could not redirect stderr: %m" msgstr "標準エラー出力にリダイレクトできませんでした: %m" -#: postmaster/syslogger.c:1127 +#: postmaster/syslogger.c:1128 #, c-format msgid "could not write to log file: %m\n" msgstr "ログファイルに書き込めませんでした: %m\n" -#: postmaster/syslogger.c:1247 +#: postmaster/syslogger.c:1246 #, c-format msgid "could not open log file \"%s\": %m" msgstr "ロックファイル\"%s\"をオープンできませんでした: %m" -#: postmaster/syslogger.c:1337 +#: postmaster/syslogger.c:1336 #, c-format msgid "disabling automatic rotation (use SIGHUP to re-enable)" msgstr "自動ローテーションを無効にしています(再度有効にするにはSIGHUPを使用してください)" @@ -20163,150 +19909,150 @@ msgstr "%X/%Xでタイムライン%uのWALを読み取れませんでした" 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:322 repl_gram.y:363 +#: repl_gram.y:318 repl_gram.y:359 #, c-format msgid "invalid timeline %u" msgstr "タイムライン%uは不正です" -#: repl_scanner.l:160 +#: repl_scanner.l:154 msgid "invalid streaming start location" msgstr "不正なストリーミング開始位置" -#: replication/libpqwalreceiver/libpqwalreceiver.c:268 replication/libpqwalreceiver/libpqwalreceiver.c:359 +#: replication/libpqwalreceiver/libpqwalreceiver.c:267 replication/libpqwalreceiver/libpqwalreceiver.c:358 #, c-format msgid "password is required" msgstr "パスワードが必要です" -#: replication/libpqwalreceiver/libpqwalreceiver.c:269 +#: 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:270 +#: 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:286 +#: replication/libpqwalreceiver/libpqwalreceiver.c:285 #, c-format msgid "could not clear search path: %s" msgstr "search_pathを消去できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:332 replication/libpqwalreceiver/libpqwalreceiver.c:518 +#: replication/libpqwalreceiver/libpqwalreceiver.c:331 replication/libpqwalreceiver/libpqwalreceiver.c:517 #, c-format msgid "invalid connection string syntax: %s" msgstr "不正な接続文字列の構文: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:360 +#: replication/libpqwalreceiver/libpqwalreceiver.c:359 #, c-format msgid "Non-superusers must provide a password in the connection string." msgstr "非スーパーユーザーは接続文字列中でパスワードを指定する必要があります。" -#: replication/libpqwalreceiver/libpqwalreceiver.c:387 +#: replication/libpqwalreceiver/libpqwalreceiver.c:386 #, c-format msgid "could not parse connection string: %s" msgstr "接続文字列をパースできませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:460 +#: 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:477 replication/libpqwalreceiver/libpqwalreceiver.c:764 +#: replication/libpqwalreceiver/libpqwalreceiver.c:476 replication/libpqwalreceiver/libpqwalreceiver.c:763 #, c-format msgid "invalid response from primary server" msgstr "プライマリサーバーからの応答が不正です" -#: replication/libpqwalreceiver/libpqwalreceiver.c:478 +#: 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:607 replication/libpqwalreceiver/libpqwalreceiver.c:614 replication/libpqwalreceiver/libpqwalreceiver.c:644 +#: 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:668 +#: replication/libpqwalreceiver/libpqwalreceiver.c:667 #, c-format msgid "could not send end-of-streaming message to primary: %s" msgstr "プライマリにストリーミングの終了メッセージを送信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:691 +#: replication/libpqwalreceiver/libpqwalreceiver.c:690 #, c-format msgid "unexpected result set after end-of-streaming" msgstr "ストリーミングの終了後の想定外の結果セット" -#: replication/libpqwalreceiver/libpqwalreceiver.c:706 +#: replication/libpqwalreceiver/libpqwalreceiver.c:705 #, c-format msgid "error while shutting down streaming COPY: %s" msgstr "ストリーミングCOPY終了中のエラー: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:716 +#: replication/libpqwalreceiver/libpqwalreceiver.c:715 #, c-format msgid "error reading result of streaming command: %s" msgstr "ストリーミングコマンドの結果読み取り中のエラー: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:725 replication/libpqwalreceiver/libpqwalreceiver.c:958 +#: 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:752 +#: 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:765 +#: 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:921 replication/libpqwalreceiver/libpqwalreceiver.c:974 replication/libpqwalreceiver/libpqwalreceiver.c:981 +#: 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:1001 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1000 #, c-format msgid "could not send data to WAL stream: %s" msgstr "WAL ストリームにデータを送信できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1102 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1101 #, c-format msgid "could not create replication slot \"%s\": %s" msgstr "レプリケーションスロット\"%s\"を作成できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1153 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1140 #, c-format msgid "could not alter replication slot \"%s\": %s" msgstr "レプリケーションスロット\"%s\"を変更できませんでした: %s" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1187 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1174 #, c-format msgid "invalid query response" msgstr "不正な問い合わせ応答" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1188 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1175 #, c-format msgid "Expected %d fields, got %d fields." msgstr "%d個の列を期待していましたが、%d列を受信しました。" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1258 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1245 #, c-format msgid "the query interface requires a database connection" msgstr "クエリインタフェースの動作にはデータベースコネクションが必要です" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1290 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1277 msgid "empty query" msgstr "空の問い合わせ" -#: replication/libpqwalreceiver/libpqwalreceiver.c:1296 +#: replication/libpqwalreceiver/libpqwalreceiver.c:1283 msgid "unexpected pipeline mode" msgstr "想定されていないパイプラインモード" @@ -20344,220 +20090,127 @@ msgstr "共有メモリキューにデータを送出できませんでした" msgid "logical replication apply worker will serialize the remaining changes of remote transaction %u to a file" msgstr "論理レプリケーションt起用ワーカーはリモートトランザクション%uの残りの変更をシリアライズしてファイルに格納します" -#: replication/logical/conflict.c:122 -#, c-format -msgid "conflict detected on relation \"%s.%s\": conflict=%s" -msgstr "リレーション\"%s.%s\"で衝突が検出されました: conflict=%s" - -#: replication/logical/conflict.c:217 -#, c-format -msgid "Key already exists in unique index \"%s\", modified locally in transaction %u at %s." -msgstr "ユニークインデックス\"%s\"にすでにキーが存在しており、トランザクション%uで%sにローカルに更新されています。" - -#: replication/logical/conflict.c:221 -#, c-format -msgid "Key already exists in unique index \"%s\", modified by origin \"%s\" in transaction %u at %s." -msgstr "ユニークインデックス\"%s\"にすでにキーが存在しており、起源\"%s\"によってトランザクション%uで%sにに更新されています。" - -#: replication/logical/conflict.c:233 -#, c-format -msgid "Key already exists in unique index \"%s\", modified by a non-existent origin in transaction %u at %s." -msgstr "ユニークインデックス\"%s\"にすでにキーが存在しており、存在しない起源によってトランザクション%uで%sにに更新されています。" - -#: replication/logical/conflict.c:238 -#, c-format -msgid "Key already exists in unique index \"%s\", modified in transaction %u." -msgstr "ユニークインデックス\"%s\"にすでにキーが存在しており、トランザクション%uで更新されています。" - -#: replication/logical/conflict.c:245 -#, c-format -msgid "Updating the row that was modified locally in transaction %u at %s." -msgstr "トランザクション%uで%sにローカルに更新された行の更新中。" - -#: replication/logical/conflict.c:248 -#, c-format -msgid "Updating the row that was modified by a different origin \"%s\" in transaction %u at %s." -msgstr "異なる起源”%s\"よってトランザクション%uで%sに更新された行の更新中。" - -#: replication/logical/conflict.c:253 -#, c-format -msgid "Updating the row that was modified by a non-existent origin in transaction %u at %s." -msgstr "存在しない起源よってトランザクション%uで%sに更新された行の更新中。" - -#: replication/logical/conflict.c:259 -msgid "Could not find the row to be updated." -msgstr "更新すべき行が見つかりませんでした。" - -#: replication/logical/conflict.c:264 -#, c-format -msgid "Deleting the row that was modified locally in transaction %u at %s." -msgstr "トランザクション%uで%sにローカルに更新された行の削除中。" - -#: replication/logical/conflict.c:267 -#, c-format -msgid "Deleting the row that was modified by a different origin \"%s\" in transaction %u at %s." -msgstr "異なる起源”%s\"よってトランザクション%uで%sに更新された行の削除中。" - -#: replication/logical/conflict.c:272 -#, c-format -msgid "Deleting the row that was modified by a non-existent origin in transaction %u at %s." -msgstr "存在しない起源よってトランザクション%uで%sに更新された行の削除中。" - -#: replication/logical/conflict.c:278 -msgid "Could not find the row to be deleted." -msgstr "削除すべき行が見つかりませんでした。" - -#: replication/logical/conflict.c:333 -#, c-format -msgid "Key %s" -msgstr "キー %s" - -#: replication/logical/conflict.c:350 -#, c-format -msgid "existing local tuple %s" -msgstr "存在するローカルタプル %s" - -#: replication/logical/conflict.c:355 -#, c-format -msgid "Existing local tuple %s" -msgstr "存在するローカルタプル %s" - -#: replication/logical/conflict.c:382 -#, c-format -msgid "remote tuple %s" -msgstr "リモートタプル %s" - -#: replication/logical/conflict.c:386 -#, c-format -msgid "Remote tuple %s" -msgstr "リモートタプル %s" - -#: replication/logical/conflict.c:420 -#, c-format -msgid "replica identity %s" -msgstr "複製識別 %s" - -#: replication/logical/conflict.c:421 -#, c-format -msgid "replica identity full %s" -msgstr "全列複製識別 %s" - -#: replication/logical/conflict.c:426 -#, c-format -msgid "Replica identity %s" -msgstr "複製識別 %s" - -#: replication/logical/conflict.c:427 -#, c-format -msgid "Replica identity full %s" -msgstr "全列複製識別 %s" - -#: replication/logical/decode.c:177 replication/logical/logical.c:141 +#: replication/logical/decode.c:177 replication/logical/logical.c:143 #, c-format 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 の時は論理レプリケーションワーカーは起動できません" +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:511 replication/slot.c:1556 storage/lmgr/lock.c:1033 storage/lmgr/lock.c:1071 storage/lmgr/lock.c:2908 storage/lmgr/lock.c:4311 storage/lmgr/lock.c:4376 storage/lmgr/lock.c:4726 storage/lmgr/predicate.c:2469 storage/lmgr/predicate.c:2484 storage/lmgr/predicate.c:3881 +#: 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 "\"%s\"を大きくする必要があるかもしれません。" -#: replication/logical/launcher.c:510 +#: replication/logical/launcher.c:513 #, c-format msgid "out of background worker slots" msgstr "バックグラウンドワーカースロットが足りません" -#: replication/logical/launcher.c:717 +#: replication/logical/launcher.c:720 #, c-format msgid "logical replication worker slot %d is empty, cannot attach" msgstr "論理レプリケーションワーカースロット%dが空いていないため接続できません" -#: replication/logical/launcher.c:726 +#: 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:121 +#: replication/logical/logical.c:123 #, c-format msgid "logical decoding requires \"wal_level\" >= \"logical\"" msgstr "論理デコードを行うためには\"wal_level\" >= \"logical\" である必要があります" -#: replication/logical/logical.c:126 +#: replication/logical/logical.c:128 #, c-format msgid "logical decoding requires a database connection" msgstr "論理デコードを行うにはデータベース接続が必要です" -#: replication/logical/logical.c:365 replication/logical/logical.c:519 +#: replication/logical/logical.c:367 replication/logical/logical.c:521 #, c-format msgid "cannot use physical replication slot for logical decoding" msgstr "物理レプリケーションスロットを論理デコードに使用するとはできません" -#: replication/logical/logical.c:370 replication/logical/logical.c:529 +#: replication/logical/logical.c:372 replication/logical/logical.c:531 #, c-format msgid "replication slot \"%s\" was not created in this database" msgstr "レプリケーションスロット\"%s\"はこのデータベースでは作成されていません" -#: replication/logical/logical.c:377 +#: replication/logical/logical.c:379 #, c-format msgid "cannot create logical replication slot in transaction that has performed writes" msgstr "論理レプリケーションスロットは書き込みを行ったトランザクションの中で生成することはできません" -#: replication/logical/logical.c:540 +#: replication/logical/logical.c:542 #, c-format msgid "cannot use replication slot \"%s\" for logical decoding" msgstr "レプリケーションスロット\"%s\"は論理デコードには使用できません" -#: replication/logical/logical.c:542 replication/slot.c:809 replication/slot.c:844 +#: replication/logical/logical.c:544 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 +#: replication/logical/logical.c:545 #, c-format msgid "Specify another replication slot." msgstr "他のレプリケーションスロットを指定してください。" -#: replication/logical/logical.c:609 +#: replication/logical/logical.c:556 replication/logical/logical.c:563 +#, c-format +msgid "can no longer get changes from replication slot \"%s\"" +msgstr "すでにレプリケーションスロット\"%s\"から変更を取り出すことはできません" + +#: replication/logical/logical.c:558 +#, c-format +msgid "This slot has been invalidated because it exceeded the maximum reserved size." +msgstr "最大留保量を超えたため、このスロットは無効化されています。" + +#: replication/logical/logical.c:565 +#, c-format +msgid "This slot has been invalidated because it was conflicting with recovery." +msgstr "リカバリとの競合のため、このスロットは無効化されました。" + +#: replication/logical/logical.c:630 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "スロット\"%s\"の論理デコードを開始します" -#: replication/logical/logical.c:611 +#: replication/logical/logical.c:632 #, 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:759 +#: replication/logical/logical.c:780 #, 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:765 +#: replication/logical/logical.c:786 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" msgstr "スロット\"%s\", 出力プラグイン\"%s\", %sコールバックの処理中" -#: replication/logical/logical.c:936 replication/logical/logical.c:981 replication/logical/logical.c:1026 replication/logical/logical.c:1072 +#: replication/logical/logical.c:957 replication/logical/logical.c:1002 replication/logical/logical.c:1047 replication/logical/logical.c:1093 #, c-format msgid "logical replication at prepare time requires a %s callback" msgstr "プリペア時の論理レプリケーションを行うには%sコールバックが必要です" -#: replication/logical/logical.c:1304 replication/logical/logical.c:1353 replication/logical/logical.c:1394 replication/logical/logical.c:1480 replication/logical/logical.c:1529 +#: replication/logical/logical.c:1325 replication/logical/logical.c:1374 replication/logical/logical.c:1415 replication/logical/logical.c:1501 replication/logical/logical.c:1550 #, c-format msgid "logical streaming requires a %s callback" msgstr "論理ストリーミングを行うには%sコールバックが必要です" -#: replication/logical/logical.c:1439 +#: replication/logical/logical.c:1460 #, c-format msgid "logical streaming at prepare time requires a %s callback" msgstr "プリペア時の論理ストリーミングを行うには%sコールバックが必要です" @@ -20582,7 +20235,7 @@ msgstr "配列は1次元でなければなりません" msgid "array must not contain nulls" msgstr "配列にはNULL値を含めてはいけません" -#: replication/logical/logicalfuncs.c:177 utils/adt/json.c:1428 utils/adt/jsonb.c:1304 +#: 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 "配列の要素数は偶数でなければなりません" @@ -20592,209 +20245,199 @@ msgstr "配列の要素数は偶数でなければなりません" msgid "logical decoding output plugin \"%s\" produces binary output, but function \"%s\" expects textual data" msgstr "論理デコード出力プラグイン\"%s\"はバイナリ出力を生成します, しかし関数\"%s\"はテキストデータを期待しています" -#: replication/logical/origin.c:194 +#: replication/logical/origin.c:190 #, c-format msgid "cannot query or manipulate replication origin when \"max_replication_slots\" is 0" msgstr "\"max_replication_slots\"が0の時はレプリケーション基点の問い合わせや操作はできません" -#: replication/logical/origin.c:199 +#: replication/logical/origin.c:195 #, c-format msgid "cannot manipulate replication origins during recovery" msgstr "リカバリ中はレプリケーション基点を操作できません" -#: replication/logical/origin.c:244 +#: replication/logical/origin.c:240 #, c-format msgid "replication origin \"%s\" does not exist" msgstr "レプリケーション基点\"%s\"は存在しません" -#: replication/logical/origin.c:335 +#: replication/logical/origin.c:331 #, c-format msgid "could not find free replication origin ID" msgstr "レプリケーション基点IDの空きがありません" -#: replication/logical/origin.c:369 +#: 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:496 +#: replication/logical/origin.c:492 #, c-format msgid "replication origin with ID %d does not exist" msgstr "IDが%dのレプリケーション基点がありません" -#: replication/logical/origin.c:761 +#: replication/logical/origin.c:757 #, c-format msgid "replication checkpoint has wrong magic %u instead of %u" msgstr "レプリケーションチェックポイントのマジックナンバー%uは不正です、正しい値は%u" -#: replication/logical/origin.c:802 +#: 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:810 +#: 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:820 +#: replication/logical/origin.c:816 #, c-format msgid "replication slot checkpoint has wrong checksum %u, expected %u" msgstr "レプリケーションスロットチェックポイントのチェックサム%uは間違っています、正しくは%uです" -#: replication/logical/origin.c:948 replication/logical/origin.c:1147 +#: 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:959 replication/logical/origin.c:1160 +#: 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:961 replication/logical/origin.c:1162 replication/slot.c:2421 +#: 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\"を増やして再度試してください" -#: replication/logical/origin.c:1118 +#: replication/logical/origin.c:1114 #, c-format msgid "cannot setup replication origin when one is already setup" msgstr "既に初期化されている場合はレプリケーション基点の初期化はできません" -#: replication/logical/origin.c:1203 replication/logical/origin.c:1419 replication/logical/origin.c:1439 +#: 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:1289 +#: replication/logical/origin.c:1285 #, c-format msgid "replication origin name \"%s\" is reserved" msgstr "レプリケーション基点名\"%s\"は予約されています" -#: replication/logical/origin.c:1291 +#: 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:241 -msgid ", " -msgstr ", " - -#: replication/logical/relation.c:243 +#: replication/logical/relation.c:242 #, c-format msgid "\"%s\"" msgstr "\"%s\"" -#: replication/logical/relation.c:262 +#: 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] "論理レプリケーション先のリレーション\"%s.%s\"は複製された列を失っています: %s" -#: replication/logical/relation.c:273 -#, c-format -msgid "logical replication target relation \"%s.%s\" has incompatible generated column: %s" -msgid_plural "logical replication target relation \"%s.%s\" has incompatible generated columns: %s" -msgstr[0] "論理レプリケーション先のリレーション\"%s.%s\"に非互換の生成列が存在します: %s" - -#: replication/logical/relation.c:328 +#: 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:421 +#: replication/logical/relation.c:398 #, c-format msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "論理レプリケーション先のリレーション\"%s.%s\"は存在しません" -#: replication/logical/reorderbuffer.c:3998 +#: replication/logical/reorderbuffer.c:4129 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "XID%uのためのデータファイルの書き出しに失敗しました: %m" -#: replication/logical/reorderbuffer.c:4344 replication/logical/reorderbuffer.c:4369 +#: replication/logical/reorderbuffer.c:4475 replication/logical/reorderbuffer.c:4500 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "並べ替えバッファのあふれファイルの読み込みに失敗しました: %m" -#: replication/logical/reorderbuffer.c:4348 replication/logical/reorderbuffer.c:4373 +#: replication/logical/reorderbuffer.c:4479 replication/logical/reorderbuffer.c:4504 #, 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:4623 +#: replication/logical/reorderbuffer.c:4754 #, c-format -msgid "could not remove file \"%s\" during removal of %s/%s/xid*: %m" -msgstr "%2$s/%3$s/xid* の削除中にファイル\"%1$s\"が削除できませんでした: %4$m" +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:5120 +#: replication/logical/reorderbuffer.c:5250 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "ファイル\"%1$s\"の読み込みに失敗しました: %3$dバイトのはずが%2$dバイトでした" -#: replication/logical/slotsync.c:213 +#: replication/logical/slotsync.c:215 replication/logical/slotsync.c:579 #, c-format -msgid "could not synchronize replication slot \"%s\" because remote slot precedes local slot" -msgstr "リモートのスロットがローカルのスロットよりも進んでいるためレプリケーションスロット\"%s\"を同期できませんでした" +msgid "could not synchronize replication slot \"%s\"" +msgstr "レプリケーションスロット\"%s\"を同期できませんでした" -#: replication/logical/slotsync.c:215 +#: 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です。" +msgid "Synchronization could lead to data loss as the remote slot needs WAL at LSN %X/%X and catalog xmin %u, but the standby has LSN %X/%X and catalog xmin %u." +msgstr "リモートスロットでは LSN %X/%X のWALとカタログxmin %u が必要ですが、スタンバイ側では LSN %X/%X、カタログxmin %u となっており、同期を行うとデータが失われる可能性があります。" -#: replication/logical/slotsync.c:457 +#: 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:577 -#, c-format -msgid "could not synchronize replication slot \"%s\"" -msgstr "レプリケーションスロット\"%s\"を同期できませんでした" - -#: replication/logical/slotsync.c:578 +#: 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から見つけられませんでした。" +msgid "Synchronization could lead to data loss as standby could not build a consistent snapshot to decode WALs at LSN %X/%X." +msgstr "スタンバイがLSN %X/%XのWALをデコードするために必要な一貫性のあるスナップショットを作成できないため、同期によってデータが失われる可能性があります。" -#: replication/logical/slotsync.c:587 +#: replication/logical/slotsync.c:589 #, c-format msgid "newly created replication slot \"%s\" is sync-ready now" msgstr "新規に作成したレプリケーションスロット\"%s\"が同期可能になりました" -#: replication/logical/slotsync.c:626 +#: 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:648 +#: 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:817 +#: 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:963 +#: replication/logical/slotsync.c:965 #, c-format -msgid "could not fetch primary slot name \"%s\" info from the primary server: %s" -msgstr "プライマリサーバーからプライマリのスロット名\"%s\"の情報を取得できませんでした: %s" +msgid "could not fetch primary_slot_name \"%s\" info from the primary server: %s" +msgstr "プライマリサーバーから primary_slot_name \"%s\"の情報を取得できませんでした: %s" -#: replication/logical/slotsync.c:965 +#: replication/logical/slotsync.c:967 #, c-format -msgid "Check if \"primary_slot_name\" is configured correctly." -msgstr "\"primary_slot_name\"が正しく設定されてるか確認してください。" +msgid "Check if primary_slot_name is configured correctly." +msgstr "\"primary_slot_name\"が正しく設定されているか確認してください。" -#: replication/logical/slotsync.c:985 +#: 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:994 +#: 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\"はプライマリサーバーに存在しません" @@ -20802,126 +20445,126 @@ msgstr "%2$sで指定されたレプリケーションスロット\"%1$s\"はプ #. translator: first %s is a connection option; second %s is a GUC #. variable name #. -#: replication/logical/slotsync.c:1027 +#: 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:1048 +#: 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:1061 replication/logical/slotsync.c:1089 +#: 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:1075 +#: 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:1127 +#: 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:1136 +#: replication/logical/slotsync.c:1138 #, c-format msgid "replication slot synchronization worker will restart because of a parameter change" msgstr "パラメータの変更があったため、レプリケーションスロット同期ワーカーが再起動します" -#: replication/logical/slotsync.c:1160 +#: replication/logical/slotsync.c:1162 #, c-format msgid "replication slot synchronization worker is shutting down on receiving SIGINT" msgstr "SIGINTを受信したためレプリケーションスロット同期ワーカーがシャットダウンします" -#: replication/logical/slotsync.c:1285 +#: replication/logical/slotsync.c:1287 #, c-format msgid "cannot synchronize replication slots when standby promotion is ongoing" msgstr "スタンバイの昇格処理中はリプリケーションスロットの同期はできません" -#: replication/logical/slotsync.c:1293 +#: replication/logical/slotsync.c:1295 #, c-format msgid "cannot synchronize replication slots concurrently" msgstr "複数のレプリケーションスロットの並行同期はできません" -#: replication/logical/slotsync.c:1401 +#: replication/logical/slotsync.c:1403 #, c-format msgid "slot sync worker started" msgstr "スロット同期ワーカーが起動しました" -#: replication/logical/slotsync.c:1464 replication/slotfuncs.c:897 +#: replication/logical/slotsync.c:1466 replication/slotfuncs.c:926 replication/walreceiver.c:307 #, c-format -msgid "synchronization worker \"%s\" could not connect to the primary server: %s" -msgstr "同期ワーカー\"%s\"はプライマリ・サーバーに接続できませんでした: %s" +msgid "could not connect to the primary server: %s" +msgstr "プライマリサーバーへの接続ができませんでした: %s" -#: replication/logical/snapbuild.c:514 +#: replication/logical/snapbuild.c:653 #, c-format msgid "initial slot snapshot too large" msgstr "初期スロットスナップショットが大きすぎます" -#: replication/logical/snapbuild.c:568 +#: 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:1362 replication/logical/snapbuild.c:1868 +#: replication/logical/snapbuild.c:1451 replication/logical/snapbuild.c:1548 replication/logical/snapbuild.c:2064 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "論理デコードは一貫性ポイントを%X/%Xで発見しました" -#: replication/logical/snapbuild.c:1267 +#: replication/logical/snapbuild.c:1453 #, c-format msgid "There are no running transactions." msgstr "実行中のトランザクションはありません。" -#: replication/logical/snapbuild.c:1314 +#: replication/logical/snapbuild.c:1500 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "論理デコードは初期開始点を%X/%Xで発見しました" -#: replication/logical/snapbuild.c:1316 replication/logical/snapbuild.c:1340 +#: replication/logical/snapbuild.c:1502 replication/logical/snapbuild.c:1526 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "%2$uより古いトランザクション(おおよそ%1$d個)の完了を待っています" -#: replication/logical/snapbuild.c:1338 +#: replication/logical/snapbuild.c:1524 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "論理デコードは初期の一貫性ポイントを%X/%Xで発見しました" -#: replication/logical/snapbuild.c:1364 +#: replication/logical/snapbuild.c:1550 #, c-format msgid "There are no old transactions anymore." msgstr "古いトランザクションはこれ以上はありません" -#: replication/logical/snapbuild.c:1730 +#: replication/logical/snapbuild.c:1951 #, 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:1736 +#: replication/logical/snapbuild.c:1957 #, 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:1777 +#: replication/logical/snapbuild.c:1998 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "スナップショット生成状態ファイル\"%s\"のチェックサムが一致しません: %uですが、%uであるべきです" -#: replication/logical/snapbuild.c:1870 +#: replication/logical/snapbuild.c:2066 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "論理デコードは保存されたスナップショットを使って開始します。" -#: replication/logical/snapbuild.c:1977 +#: replication/logical/snapbuild.c:2173 #, c-format msgid "could not parse file name \"%s\"" msgstr "ファイル名\"%s\"をパースできませんでした" @@ -20936,276 +20579,261 @@ msgstr "サブスクリプション\"%s\"、テーブル\"%s\"に対する論理 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:831 replication/logical/tablesync.c:972 +#: 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:838 +#: replication/logical/tablesync.c:834 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "テーブル\"%s.%s\"がパブリッシャ上で見つかりませんでした" -#: replication/logical/tablesync.c:891 +#: 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:1070 +#: 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" -#: replication/logical/tablesync.c:1237 +#: 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:1352 -#, c-format -msgid "table synchronization worker for subscription \"%s\" could not connect to the publisher: %s" -msgstr "サブスクリプション\"%s\"のテーブル同期ワーカーがパブリッシャに接続できませんでした: %s" - -#: replication/logical/tablesync.c:1437 +#: replication/logical/tablesync.c:1429 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "テーブルコピー中にパブリッシャ上でのトランザクション開始に失敗しました: %s" -#: replication/logical/tablesync.c:1480 +#: replication/logical/tablesync.c:1472 #, c-format msgid "replication origin \"%s\" already exists" msgstr "レプリケーション基点\"%s\"はすでに存在します" -#: replication/logical/tablesync.c:1513 replication/logical/worker.c:2382 +#: 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:1526 +#: replication/logical/tablesync.c:1518 #, c-format msgid "table copy could not finish transaction on publisher: %s" msgstr "テーブルコピー中にパブリッシャ上でのトランザクション終了に失敗しました: %s" -#: replication/logical/worker.c:479 +#: replication/logical/worker.c:483 #, c-format msgid "logical replication parallel apply worker for subscription \"%s\" will stop" msgstr "サブスクリプション\"%s\"に対応する論理レプリケーション並列適用ワーカーが停止します" -#: replication/logical/worker.c:481 +#: replication/logical/worker.c:485 #, c-format msgid "Cannot handle streamed replication transactions using parallel apply workers until all tables have been synchronized." msgstr "すべてのテーブルの同期が完了するまでは、ストリームされたトランザクションを適用ワーカーで扱うことはできません。" -#: replication/logical/worker.c:850 replication/logical/worker.c:965 +#: 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:2522 +#: 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 "論理レプリケーション先のリレーション\"%s.%s\"は複製の識別列を期待していましたが、パブリッシャは送信しませんでした" -#: replication/logical/worker.c:2529 +#: 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 "論理レプリケーション先のリレーション\"%s.%s\"が識別列インデックスも主キーをもっておらず、かつパブリッシュされたリレーションがREPLICA IDENTITY FULLとなっていません" -#: replication/logical/worker.c:3463 +#: replication/logical/worker.c:3384 #, c-format msgid "invalid logical replication message type \"??? (%d)\"" msgstr "不正な論理レプリケーションのメッセージタイプ \"??? (%d)\"" -#: replication/logical/worker.c:3635 +#: replication/logical/worker.c:3556 #, c-format msgid "data stream from publisher has ended" msgstr "パブリッシャからのデータストリームが終了しました" -#: replication/logical/worker.c:3789 +#: replication/logical/worker.c:3710 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "タイムアウトにより論理レプリケーションワーカーを終了しています" -#: replication/logical/worker.c:3986 +#: replication/logical/worker.c:3904 #, c-format msgid "logical replication worker for subscription \"%s\" will stop because the subscription was removed" msgstr "サブスクリプション\"%s\"が削除されたため、このサブスクリプションに対応する論理レプリケーションワーカーが停止します" -#: replication/logical/worker.c:4000 +#: replication/logical/worker.c:3918 #, c-format msgid "logical replication worker for subscription \"%s\" will stop because the subscription was disabled" msgstr "サブスクリプション\"%s\"が無効化されたため、このサブスクリプションに対応する論理レプリケーションワーカーが停止します" -#: replication/logical/worker.c:4031 +#: replication/logical/worker.c:3949 #, c-format msgid "logical replication parallel apply worker for subscription \"%s\" will stop because of a parameter change" msgstr "パラメータの変更があったため、サブスクリプション\"%s\"に対応する論理レプリケーション並列適用ワーカーが停止します" -#: replication/logical/worker.c:4035 +#: replication/logical/worker.c:3953 #, c-format msgid "logical replication worker for subscription \"%s\" will restart because of a parameter change" msgstr "パラメータの変更があったため、サブスクリプション\"%s\"に対応する論理レプリケーションワーカーが再起動します" -#: replication/logical/worker.c:4049 +#: 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 "サブスクリプション\"%s\"の所有者のスーパーユーザー権限が剥奪されたため、このサブスクリプションに対応する論理レプリケーション並列適用ワーカーが停止します" -#: replication/logical/worker.c:4053 +#: 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 "サブスクリプション\"%s\"の所有者のスーパーユーザー権限が剥奪されたため、このサブスクリプションに対応する論理レプリケーションワーカーが再起動します" -#: replication/logical/worker.c:4555 +#: replication/logical/worker.c:4499 #, c-format msgid "subscription has no replication slot set" msgstr "サブスクリプションにレプリケーションスロットが設定されていません" -#: replication/logical/worker.c:4580 -#, c-format -msgid "apply worker for subscription \"%s\" could not connect to the publisher: %s" -msgstr "サブスクリプション\"%s\"の適用ワーカーがパブリッシャに接続できませんでした: %s" - -#: replication/logical/worker.c:4669 +#: replication/logical/worker.c:4620 #, 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:4685 +#: replication/logical/worker.c:4636 #, 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:4709 +#: replication/logical/worker.c:4660 #, c-format msgid "logical replication table synchronization worker for subscription \"%s\", table \"%s\" has started" msgstr "サブスクリプション\"%s\"、テーブル\"%s\"に対応する論理レプリケーションテーブル同期ワーカーが起動しました" -#: replication/logical/worker.c:4714 +#: replication/logical/worker.c:4665 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "サブスクリプション\"%s\"に対応する論理レプリケーション適用ワーカーが起動しました" -#: replication/logical/worker.c:4836 +#: replication/logical/worker.c:4795 #, c-format msgid "subscription \"%s\" has been disabled because of an error" msgstr "サブスクリプション\"%s\"はエラーのため無効化されました" -#: replication/logical/worker.c:4884 +#: replication/logical/worker.c:4843 #, c-format msgid "logical replication starts skipping transaction at LSN %X/%X" msgstr "論理レプリケーションは%X/%Xででトランザクションのスキップを開始します" -#: replication/logical/worker.c:4898 +#: replication/logical/worker.c:4857 #, c-format msgid "logical replication completed skipping transaction at LSN %X/%X" msgstr "論理レプリケーションは%X/%Xでトランザクションのスキップを完了しました" -#: replication/logical/worker.c:4980 +#: replication/logical/worker.c:4945 #, c-format msgid "skip-LSN of subscription \"%s\" cleared" msgstr "サブスクリプションの\"%s\"スキップLSNをクリアしました" -#: replication/logical/worker.c:4981 +#: replication/logical/worker.c:4946 #, 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:5018 +#: replication/logical/worker.c:4974 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" msgstr "メッセージタイプ \"%2$s\"でレプリケーション基点\"%1$s\"のリモートからのデータを処理中" -#: replication/logical/worker.c:5022 +#: replication/logical/worker.c:4978 #, 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:5027 +#: replication/logical/worker.c:4983 #, 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:5038 +#: replication/logical/worker.c:4994 #, 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:5045 +#: replication/logical/worker.c:5001 #, 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:5056 +#: replication/logical/worker.c:5012 #, 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:5064 +#: replication/logical/worker.c:5020 #, 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:324 +#: replication/pgoutput/pgoutput.c:322 #, c-format msgid "invalid proto_version" msgstr "不正なproto_version" -#: replication/pgoutput/pgoutput.c:329 +#: replication/pgoutput/pgoutput.c:327 #, c-format msgid "proto_version \"%s\" out of range" msgstr "proto_version \"%s\"は範囲外です" -#: replication/pgoutput/pgoutput.c:346 +#: replication/pgoutput/pgoutput.c:344 #, c-format msgid "invalid publication_names syntax" msgstr "publication_namesの構文が不正です" -#: replication/pgoutput/pgoutput.c:416 replication/pgoutput/pgoutput.c:420 +#: replication/pgoutput/pgoutput.c:414 replication/pgoutput/pgoutput.c:418 #, c-format msgid "option \"%s\" missing" msgstr "オプション\"%s\"が指定されていません" -#: replication/pgoutput/pgoutput.c:465 +#: 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:471 +#: 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:486 +#: 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:492 +#: 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:497 +#: replication/pgoutput/pgoutput.c:510 #, c-format msgid "streaming requested, but not supported by output plugin" msgstr "ストリーミングが要求されましたが、出力プラグインでサポートされていません" -#: replication/pgoutput/pgoutput.c:511 +#: 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:516 +#: replication/pgoutput/pgoutput.c:529 #, c-format msgid "two-phase commit requested, but not supported by output plugin" msgstr "2相コミットが要求されました、しかし出力プラグインではサポートされていません" -#: replication/pgoutput/pgoutput.c:1078 -#, c-format -msgid "cannot use different values of publish_generated_columns for table \"%s.%s\" in different publications" -msgstr "異なるパブリケーションでテーブル\"%s.%s\"に対してpublish_generated_columnsの値を異なる設定にすることはできません" - #: replication/slot.c:260 #, c-format msgid "replication slot name \"%s\" is too short" @@ -21231,7 +20859,7 @@ msgstr "レプリケーションスロット名は小文字、数字とアンダ msgid "cannot enable failover for a replication slot created on the standby" msgstr "スタンバイ上で作成したレプリケーションスロットのフェイルオーバーを有効にすることはできません" -#: replication/slot.c:345 replication/slot.c:866 +#: replication/slot.c:345 replication/slot.c:849 #, c-format msgid "cannot enable failover for a temporary replication slot" msgstr "一時レプリケーションスロットのフェイルオーバーを有効にすることはできません" @@ -21251,313 +20879,323 @@ msgstr "レプリケーションスロットは全て使用中です" msgid "Free one or increase \"max_replication_slots\"." msgstr "どれか一つを解放するか、\"max_replication_slots\"を大きくしてください。" -#: replication/slot.c:564 replication/slotfuncs.c:658 utils/activity/pgstat_replslot.c:56 utils/adt/genfile.c:739 +#: 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:575 -#, c-format -msgid "can no longer access replication slot \"%s\"" -msgstr "レプリケーションスロット\"%s\"にはすでにアクセスできなくなっています" - -#: replication/slot.c:577 -#, c-format -msgid "This replication slot has been invalidated due to \"%s\"." -msgstr "このレプリケーションスロットは\"%s\"によって無効化されています。" - -#: replication/slot.c:623 replication/slot.c:1369 +#: 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:653 +#: replication/slot.c:638 #, c-format msgid "acquired logical replication slot \"%s\"" msgstr "論理レプリケーションスロット\"%s\"を取得しました" -#: replication/slot.c:655 +#: replication/slot.c:640 #, c-format msgid "acquired physical replication slot \"%s\"" msgstr "物理レプリケーションスロット\"%s\"を取得しました" -#: replication/slot.c:740 +#: replication/slot.c:729 #, c-format msgid "released logical replication slot \"%s\"" msgstr "論理レプリケーションスロット\"%s\"を解放しました" -#: replication/slot.c:742 +#: replication/slot.c:731 #, c-format msgid "released physical replication slot \"%s\"" msgstr "物理レプリケーションスロット\"%s\"を解放しました" -#: replication/slot.c:808 +#: replication/slot.c:797 #, c-format msgid "cannot drop replication slot \"%s\"" msgstr "レプリケーションスロット\"%s\"を削除できませんでした" -#: replication/slot.c:831 +#: replication/slot.c:816 #, c-format msgid "cannot use %s with a physical replication slot" msgstr "%sは物理レプリケーションスロットでは使用できません" -#: replication/slot.c:843 +#: replication/slot.c:828 #, c-format msgid "cannot alter replication slot \"%s\"" msgstr "レプリケーションスロット\"%s\"を変更できませんでした" -#: replication/slot.c:853 +#: replication/slot.c:838 #, c-format msgid "cannot enable failover for a replication slot on the standby" msgstr "スタンバイ上ではレプリケーションスロットのフェイルオーバーを有効にすることはできません" -#: replication/slot.c:1001 replication/slot.c:1959 replication/slot.c:2344 +#: 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:1404 +#: 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:1409 +#: replication/slot.c:1377 #, c-format msgid "replication slots can only be used if \"wal_level\" >= \"replica\"" msgstr "レプリケーションスロットは\"wal_level\" >= \"replica\" のときだけ使用できます" -#: replication/slot.c:1421 +#: replication/slot.c:1389 #, c-format msgid "permission denied to use replication slots" msgstr "レプリケーションスロットを使用する権限がありません" -#: replication/slot.c:1422 +#: replication/slot.c:1390 #, c-format msgid "Only roles with the %s attribute may use replication slots." msgstr "%s属性を持つロールのみがレプリケーションスロットを使用できます。" -#: replication/slot.c:1530 +#: 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:1538 +#: replication/slot.c:1506 #, c-format msgid "The slot conflicted with xid horizon %u." msgstr "このスロットはXID地平線%uと競合しました。" -#: replication/slot.c:1543 +#: replication/slot.c:1511 msgid "Logical decoding on standby requires \"wal_level\" >= \"logical\" on the primary server." msgstr "論理デコードを行うためにはプライマリサーバー上で\"wal_level\" >= \"logical\" である必要があります。" -#: replication/slot.c:1551 +#: replication/slot.c:1519 #, c-format msgid "terminating process %d to release replication slot \"%s\"" msgstr "プロセス%dを終了してレプリケーションスロット\"%s\"を解放します" -#: replication/slot.c:1553 +#: replication/slot.c:1521 #, c-format msgid "invalidating obsolete replication slot \"%s\"" msgstr "使用不能のレプリケーションスロット\"%s\"を無効化します" -#: replication/slot.c:2282 +#: 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:2289 +#: replication/slot.c:2256 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "レプリケーションスロットファイル\"%s\"はサポート外のバージョン%uです" -#: replication/slot.c:2296 +#: replication/slot.c:2263 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "レプリケーションスロットファイル\"%s\"のサイズ%uは異常です" -#: replication/slot.c:2332 +#: 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:2366 +#: replication/slot.c:2335 #, c-format msgid "logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"" msgstr "論理レプリケーションスロット\"%s\"がありますが、\"wal_level\" < \"logical\" です" -#: replication/slot.c:2368 +#: replication/slot.c:2337 #, c-format msgid "Change \"wal_level\" to be \"logical\" or higher." msgstr "\"wal_level\"を\"logical\"もしくはそれより上位の設定にしてください。" -#: replication/slot.c:2372 +#: 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:2351 +#, c-format +msgid "Change \"hot_standby\" to be \"on\"." +msgstr "\"hot_standby\" を \"on\" に変更してください。" + +#: replication/slot.c:2356 #, c-format msgid "physical replication slot \"%s\" exists, but \"wal_level\" < \"replica\"" msgstr "物理レプリケーションスロット\"%s\"がありますが、\"wal_level\" < \"replica\" です" -#: replication/slot.c:2374 +#: replication/slot.c:2358 #, c-format msgid "Change \"wal_level\" to be \"replica\" or higher." msgstr "\"wal_level\"を\"replica\"もしくはそれより上位の設定にしてください。" -#: replication/slot.c:2420 +#: replication/slot.c:2400 #, c-format msgid "too many replication slots active before shutdown" msgstr "シャットダウン前のアクティブなレプリケーションスロットの数が多すぎます" -#: replication/slot.c:2487 -#, c-format -msgid "Replication slot \"%s\" does not exist." -msgstr "レプリケーションスロット\"%s\"は存在しません。" - -#: replication/slot.c:2495 +#: replication/slot.c:2475 #, c-format -msgid "\"%s\" is not a physical replication slot." +msgid "\"%s\" is not a physical replication slot" msgstr "\"%s\"は物理レプリケーションスロットではありません。" -#: replication/slot.c:2672 +#: 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:2674 replication/slot.c:2708 replication/slot.c:2723 +#: 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:2676 +#: replication/slot.c:2658 #, c-format msgid "Create the replication slot \"%s\" or amend parameter \"%s\"." msgstr "レプリケーションスロット\"%s\"を作成するか、パラメータ\"%s\"を修正してください。" -#: replication/slot.c:2686 +#: replication/slot.c:2668 #, c-format msgid "cannot specify logical replication slot \"%s\" in parameter \"%s\"" msgstr "パラメータ\"%2$s\"では論理レプリケーションスロット\"%1$s\"は指定できません" -#: replication/slot.c:2688 +#: replication/slot.c:2670 #, c-format msgid "Logical replication is waiting for correction on replication slot \"%s\"." msgstr "論理レプリケーションはレプリケーションスロット\"%s\"が修正されるのを待っています。" -#: replication/slot.c:2690 +#: replication/slot.c:2672 #, c-format msgid "Remove the logical replication slot \"%s\" from parameter \"%s\"." msgstr "論理レプリケーションスロット\"%s\"をパラメータ\"%s\"から削除してください。" -#: replication/slot.c:2706 +#: 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:2710 +#: replication/slot.c:2692 #, c-format msgid "Drop and recreate the replication slot \"%s\", or amend parameter \"%s\"." msgstr "レプリケーションスロット\"%s\"を削除して再作成するか、パラメータ\"%s\"を修正してください。" -#: replication/slot.c:2721 +#: 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:2725 +#: 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:523 +#: replication/slotfuncs.c:526 #, c-format msgid "invalid target WAL LSN" msgstr "不正な目標WAL LSN" -#: replication/slotfuncs.c:545 +#: replication/slotfuncs.c:548 #, c-format msgid "replication slot \"%s\" cannot be advanced" msgstr "レプリケーションスロット\"%s\"は進められません" -#: replication/slotfuncs.c:547 +#: replication/slotfuncs.c:550 #, c-format msgid "This slot has never previously reserved WAL, or it has been invalidated." msgstr "このスロットはWALを留保したことがないか、無効化さています。" -#: replication/slotfuncs.c:563 +#: 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:670 +#: replication/slotfuncs.c:673 #, c-format msgid "cannot copy physical replication slot \"%s\" as a logical replication slot" msgstr "物理レプリケーションスロット\"%s\"を論理レプリケーションスロットとしてコピーすることはできません" -#: replication/slotfuncs.c:672 +#: replication/slotfuncs.c:675 #, c-format msgid "cannot copy logical replication slot \"%s\" as a physical replication slot" msgstr "論理レプリケーションスロット\"%s\"を物理レプリケーションスロットとしてコピーすることはできません" -#: replication/slotfuncs.c:679 +#: replication/slotfuncs.c:682 #, c-format msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "WAL の留保をしていないレプリケーションスロットはコピーできません" -#: replication/slotfuncs.c:765 +#: 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:767 +#: replication/slotfuncs.c:782 #, c-format msgid "The source replication slot was modified incompatibly during the copy operation." msgstr "コピー処理中にコピー元のレプリケーションスロットが非互換的に変更されました。" -#: replication/slotfuncs.c:773 +#: replication/slotfuncs.c:788 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "未完成の論理レプリケーションスロット\"%s\"はコピーできません" -#: replication/slotfuncs.c:775 +#: replication/slotfuncs.c:790 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "このソースレプリケーションスロットの confirmed_flush_lsn が有効値になってから再度実行してください。" -#: replication/slotfuncs.c:874 +#: 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 +#: replication/syncrep.c:304 #, 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 +#: 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 "トランザクションはローカルではすでにコミット済みですが、スタンバイ側にはレプリケーションされていない可能性があります。" -#: replication/syncrep.c:278 +#: replication/syncrep.c:321 #, c-format msgid "canceling wait for synchronous replication due to user request" msgstr "ユーザーからの要求により同期レプリケーションの待ち状態をキャンセルしています" # y, c-format -#: replication/syncrep.c:485 +#: replication/syncrep.c:528 #, c-format msgid "standby \"%s\" is now a synchronous standby with priority %d" msgstr "スタンバイ\"%s\"は優先度%dの同期スタンバイになりました" -#: replication/syncrep.c:489 +#: replication/syncrep.c:532 #, c-format msgid "standby \"%s\" is now a candidate for quorum synchronous standby" msgstr "スタンバイ\"%s\"は定足数同期スタンバイの候補になりました" -#: replication/syncrep.c:1014 +#: replication/syncrep.c:1080 #, c-format -msgid "\"%s\" parser failed." -msgstr "\"%s\"のパーサーが失敗しました。" +msgid "\"synchronous_standby_names\" parser failed" +msgstr "\"synchronous_standby_names\" のパースに失敗しました" -#: replication/syncrep.c:1021 +#: replication/syncrep.c:1086 #, c-format msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "同期スタンバイの数(%d)は1以上である必要があります" @@ -21567,193 +21205,188 @@ msgstr "同期スタンバイの数(%d)は1以上である必要があります" msgid "terminating walreceiver process due to administrator command" msgstr "管理者コマンドにより WAL 受信プロセスを終了しています" -#: replication/walreceiver.c:307 -#, c-format -msgid "streaming replication receiver \"%s\" could not connect to the primary server: %s" -msgstr "ストリーミングレプリケーション・レシーバー\"%s\"はプライマリ・サーバーに接続できませんでした: %s" - -#: replication/walreceiver.c:355 +#: replication/walreceiver.c:354 #, c-format msgid "database system identifier differs between the primary and standby" msgstr "データベースシステムの識別子がプライマリサーバーとスタンバイサーバー間で異なります" -#: replication/walreceiver.c:356 +#: 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:367 +#: replication/walreceiver.c:366 #, c-format msgid "highest timeline %u of the primary is behind recovery timeline %u" msgstr "プライマリの最大のタイムライン%uが、リカバリのタイムライン %uより遅れています" -#: replication/walreceiver.c:420 +#: 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:424 +#: 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:459 +#: replication/walreceiver.c:458 #, c-format msgid "cannot continue WAL streaming, recovery has already ended" msgstr "WAL ストリーミングを継続できません。リカバリはすでに終わっています。" -#: replication/walreceiver.c:503 +#: replication/walreceiver.c:502 #, c-format msgid "replication terminated by primary server" msgstr "プライマリサーバーによりレプリケーションが打ち切られました" -#: replication/walreceiver.c:504 +#: 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:594 +#: replication/walreceiver.c:593 #, c-format msgid "terminating walreceiver due to timeout" msgstr "レプリケーションタイムアウトによりwalreceiverを終了しています" -#: replication/walreceiver.c:626 +#: replication/walreceiver.c:625 #, c-format msgid "primary server contains no more WAL on requested timeline %u" msgstr "プライマリサーバーには要求されたタイムライン%u上にこれ以上WALがありません" -#: replication/walreceiver.c:642 replication/walreceiver.c:1072 +#: 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:761 +#: replication/walreceiver.c:760 #, c-format msgid "fetching timeline history file for timeline %u from primary server" msgstr "プライマリサーバーからライムライン%u用のタイムライン履歴ファイルを取り込みしています" -#: replication/walreceiver.c:960 +#: 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:499 +#: replication/walsender.c:535 #, c-format msgid "cannot use %s with a logical replication slot" msgstr "%sは論理レプリケーションスロットでは使用できません" -#: replication/walsender.c:603 storage/smgr/md.c:1746 +#: 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:607 +#: replication/walsender.c:643 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "ファイル\"%s\"の先頭にシークできませんでした: %m" -#: replication/walsender.c:823 +#: replication/walsender.c:857 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "論理レプリケーションスロットは物理レプリケーションには使用できません" -#: replication/walsender.c:889 +#: replication/walsender.c:923 #, 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:892 +#: 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:936 +#: 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 "要求された開始ポイント%X/%XはサーバーのWALフラッシュ位置%X/%Xより進んでいます" -#: replication/walsender.c:1131 +#: 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:1237 +#: 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:1247 +#: 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:1253 +#: 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:1258 +#: 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:1264 +#: 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:1270 +#: replication/walsender.c:1303 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s はサブトランザクション内では呼び出せません" -#: replication/walsender.c:1447 +#: replication/walsender.c:1476 #, c-format msgid "terminating walsender process after promotion" msgstr "昇格後にWAL送信プロセスを終了します" -#: replication/walsender.c:1976 +#: replication/walsender.c:2015 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "WAL送信プロセスが停止モードの間は新しいコマンドを実行できません" -#: replication/walsender.c:2011 +#: replication/walsender.c:2050 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "物理レプリケーション用のWAL送信プロセスでSQLコマンドは実行できません" -#: replication/walsender.c:2042 +#: replication/walsender.c:2083 #, c-format msgid "received replication command: %s" msgstr "レプリケーションコマンドを受信しました: %s" -#: replication/walsender.c:2050 tcop/fastpath.c:208 tcop/postgres.c:1135 tcop/postgres.c:1492 tcop/postgres.c:1744 tcop/postgres.c:2226 tcop/postgres.c:2663 tcop/postgres.c:2740 +#: 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 "現在のトランザクションがアボートしました。トランザクションブロックが終わるまでコマンドは無視されます" -#: replication/walsender.c:2207 replication/walsender.c:2242 +#: replication/walsender.c:2248 replication/walsender.c:2283 #, c-format msgid "unexpected EOF on standby connection" msgstr "スタンバイ接続で想定外のEOFがありました" -#: replication/walsender.c:2230 +#: replication/walsender.c:2271 #, c-format msgid "invalid standby message type \"%c\"" msgstr "スタンバイのメッセージタイプ\"%c\"は不正です" -#: replication/walsender.c:2319 +#: replication/walsender.c:2360 #, c-format msgid "unexpected message type \"%c\"" msgstr "想定しないメッセージタイプ\"%c\"" -#: replication/walsender.c:2733 +#: replication/walsender.c:2778 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "レプリケーションタイムアウトにより WAL 送信プロセスを終了しています" @@ -21943,275 +21576,275 @@ msgstr "WITH の問い合わせ名\"%s\"が、ルールのアクションと書 msgid "INSERT ... SELECT rule actions are not supported for queries having data-modifying statements in WITH" msgstr "INSERT ... SELECTルールのアクションはWITHにデータ更新文を持つ問い合わせに対してはサポートされません" -#: rewrite/rewriteHandler.c:669 +#: rewrite/rewriteHandler.c:668 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "複数ルールではRETURNINGリストを持つことはできません" -#: rewrite/rewriteHandler.c:906 rewrite/rewriteHandler.c:945 +#: 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:908 rewrite/rewriteHandler.c:974 +#: 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:910 +#: rewrite/rewriteHandler.c:904 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "OVERRIDING SYSTEM VALUE を指定することで挿入を強制できます。" -#: rewrite/rewriteHandler.c:972 rewrite/rewriteHandler.c:980 +#: 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:1115 rewrite/rewriteHandler.c:1133 +#: rewrite/rewriteHandler.c:1109 rewrite/rewriteHandler.c:1127 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "同じ列\"%s\"に複数の代入があります" -#: rewrite/rewriteHandler.c:1688 +#: rewrite/rewriteHandler.c:1682 #, c-format msgid "MERGE is not supported for relations with rules." msgstr "MERGEはルールを持つリレーションに対してはサポートされません。" -#: rewrite/rewriteHandler.c:1728 rewrite/rewriteHandler.c:3268 +#: rewrite/rewriteHandler.c:1722 rewrite/rewriteHandler.c:3262 #, c-format msgid "access to non-system view \"%s\" is restricted" msgstr "非システムのビュー\"%s\"へのアクセスは制限されています" -#: rewrite/rewriteHandler.c:2127 rewrite/rewriteHandler.c:4262 +#: rewrite/rewriteHandler.c:2122 rewrite/rewriteHandler.c:4254 #, c-format msgid "infinite recursion detected in rules for relation \"%s\"" msgstr "リレーション\"%s\"のルールで無限再帰を検出しました" -#: rewrite/rewriteHandler.c:2232 +#: rewrite/rewriteHandler.c:2227 #, c-format msgid "infinite recursion detected in policy for relation \"%s\"" msgstr "リレーション\"%s\"のポリシで無限再帰を検出しました" -#: rewrite/rewriteHandler.c:2595 +#: rewrite/rewriteHandler.c:2589 msgid "Junk view columns are not updatable." msgstr "ジャンクビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2600 +#: rewrite/rewriteHandler.c:2594 msgid "View columns that are not columns of their base relation are not updatable." msgstr "基底リレーションの列ではないビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2603 +#: rewrite/rewriteHandler.c:2597 msgid "View columns that refer to system columns are not updatable." msgstr "システム列を参照するビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2606 +#: rewrite/rewriteHandler.c:2600 msgid "View columns that return whole-row references are not updatable." msgstr "行全体参照を返すビュー列は更新不可です。" -#: rewrite/rewriteHandler.c:2667 +#: rewrite/rewriteHandler.c:2661 msgid "Views containing DISTINCT are not automatically updatable." msgstr "DISTINCTを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2670 +#: rewrite/rewriteHandler.c:2664 msgid "Views containing GROUP BY are not automatically updatable." msgstr "GROUP BYを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2673 +#: rewrite/rewriteHandler.c:2667 msgid "Views containing HAVING are not automatically updatable." msgstr "HAVINGを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2676 +#: rewrite/rewriteHandler.c:2670 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "UNION、INTERSECT、EXCEPTを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2679 +#: rewrite/rewriteHandler.c:2673 msgid "Views containing WITH are not automatically updatable." msgstr "WITHを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2682 +#: rewrite/rewriteHandler.c:2676 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "LIMIT、OFFSETを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2694 +#: rewrite/rewriteHandler.c:2688 msgid "Views that return aggregate functions are not automatically updatable." msgstr "集約関数を返すビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2697 +#: rewrite/rewriteHandler.c:2691 msgid "Views that return window functions are not automatically updatable." msgstr "ウィンドウ関数を返すビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2700 +#: rewrite/rewriteHandler.c:2694 msgid "Views that return set-returning functions are not automatically updatable." msgstr "集合返却関数を返すビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2707 rewrite/rewriteHandler.c:2711 rewrite/rewriteHandler.c:2719 +#: 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:2722 +#: rewrite/rewriteHandler.c:2716 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "TABLESAMPLEを含むビューは自動更新できません。" -#: rewrite/rewriteHandler.c:2746 +#: rewrite/rewriteHandler.c:2740 msgid "Views that have no updatable columns are not automatically updatable." msgstr "更新可能な列を持たないビューは自動更新できません。" -#: rewrite/rewriteHandler.c:3127 rewrite/rewriteHandler.c:3162 +#: rewrite/rewriteHandler.c:3121 rewrite/rewriteHandler.c:3156 #, c-format msgid "cannot insert into view \"%s\"" msgstr "ビュー\"%s\"へは挿入(INSERT)できません" -#: rewrite/rewriteHandler.c:3130 +#: 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:3135 rewrite/rewriteHandler.c:3171 +#: rewrite/rewriteHandler.c:3129 rewrite/rewriteHandler.c:3165 #, c-format msgid "cannot update view \"%s\"" msgstr "ビュー\"%s\"は更新できません" -#: rewrite/rewriteHandler.c:3138 +#: 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:3143 rewrite/rewriteHandler.c:3180 +#: rewrite/rewriteHandler.c:3137 rewrite/rewriteHandler.c:3174 #, c-format msgid "cannot delete from view \"%s\"" msgstr "ビュー\"%s\"からは削除できません" -#: rewrite/rewriteHandler.c:3146 +#: 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:3165 +#: 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:3174 +#: 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:3183 +#: 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:3358 +#: rewrite/rewriteHandler.c:3352 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "ビュー\"%2$s\"の列\"%1$s\"への挿入はできません" -#: rewrite/rewriteHandler.c:3366 +#: rewrite/rewriteHandler.c:3360 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "ビュー\"%2$s\"の列\"%1$s\"は更新できません" -#: rewrite/rewriteHandler.c:3374 +#: rewrite/rewriteHandler.c:3368 #, c-format msgid "cannot merge into column \"%s\" of view \"%s\"" msgstr "ビュー\"%2$s\"の列\"%1$s\"への統合はできません" -#: rewrite/rewriteHandler.c:3402 +#: rewrite/rewriteHandler.c:3396 #, c-format msgid "cannot merge into view \"%s\"" msgstr "ビュー\"%s\"への統合はできません" -#: rewrite/rewriteHandler.c:3404 +#: 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:3405 +#: 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:3920 +#: 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:3931 +#: 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:3945 +#: 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:3949 +#: 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:3954 +#: 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:4214 +#: rewrite/rewriteHandler.c:4206 msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "条件付きDO INSTEADルールを持つビューは自動更新できません。" -#: rewrite/rewriteHandler.c:4311 +#: rewrite/rewriteHandler.c:4303 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"へのINSERT RETURNINGを行うことはできません" -#: rewrite/rewriteHandler.c:4313 +#: 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:4318 +#: rewrite/rewriteHandler.c:4310 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"へのUPDATE RETURNINGを行うことはできません" -#: rewrite/rewriteHandler.c:4320 +#: 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:4325 +#: rewrite/rewriteHandler.c:4317 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "リレーション\"%s\"へのDELETE RETURNINGを行うことはできません" -#: rewrite/rewriteHandler.c:4327 +#: 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:4345 +#: 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:4402 +#: 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:1144 +#: rewrite/rewriteManip.c:1084 #, c-format msgid "conditional utility statements are not implemented" msgstr "条件付きのユーティリティ文は実装されていません" -#: rewrite/rewriteManip.c:1489 +#: rewrite/rewriteManip.c:1431 #, c-format msgid "WHERE CURRENT OF on a view is not implemented" msgstr "ビューに対するWHERE CURRENT OFは実装されていません" -#: rewrite/rewriteManip.c:1848 +#: 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コマンドでの複数列代入の一部となる列を参照することはできません" @@ -22221,211 +21854,147 @@ 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:483 +#: scan.l:497 msgid "unterminated /* comment" msgstr "/*コメントが閉じていません" -#: scan.l:503 +#: scan.l:517 msgid "unterminated bit string literal" msgstr "ビット列リテラルの終端がありません" -#: scan.l:517 +#: scan.l:531 msgid "unterminated hexadecimal string literal" msgstr "16進数文字列リテラルの終端がありません" -#: scan.l:567 +#: scan.l:581 #, c-format msgid "unsafe use of string constant with Unicode escapes" msgstr "Unicodeエスケープを使った文字列定数の危険な使用" -#: scan.l:568 +#: 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\"がoffの時に使用することはできません。" -#: scan.l:629 +#: scan.l:643 msgid "unhandled previous state in xqs" msgstr "xqsの中で処理されない前ステート" -#: scan.l:703 +#: scan.l:717 #, c-format msgid "Unicode escapes must be \\uXXXX or \\UXXXXXXXX." msgstr "Unicodeエスケープは\\uXXXXまたは\\UXXXXXXXXでなければなりません。" -#: scan.l:714 +#: scan.l:728 #, c-format msgid "unsafe use of \\' in a string literal" msgstr "文字列リテラルで安全ではない\\'が使用されました。" -#: scan.l:715 +#: scan.l:729 #, c-format msgid "Use '' to write quotes in strings. \\' is insecure in client-only encodings." msgstr "文字列内で引用符を記述するには''を使用してください。\\'はクライアントのみで有効な符号化形式では安全ではありません。" -#: scan.l:787 +#: scan.l:801 msgid "unterminated dollar-quoted string" msgstr "文字列のドル引用符が閉じていません" -#: scan.l:804 scan.l:814 +#: scan.l:818 scan.l:828 msgid "zero-length delimited identifier" msgstr "二重引用符で囲まれた識別子の長さがゼロです" -#: scan.l:825 syncrep_scanner.l:114 +#: scan.l:839 syncrep_scanner.l:101 msgid "unterminated quoted identifier" msgstr "識別子の引用符が閉じていません" -#: scan.l:988 +#: scan.l:1002 msgid "operator too long" msgstr "演算子が長すぎます" -#: scan.l:1001 -msgid "parameter number too large" -msgstr "パラメータ数が多すぎます" - -#: scan.l:1007 +#: scan.l:1015 msgid "trailing junk after parameter" msgstr "パラメータの後に余分な文字" -#: scan.l:1028 +#: scan.l:1036 msgid "invalid hexadecimal integer" msgstr "不正な16進整数" -#: scan.l:1032 +#: scan.l:1040 msgid "invalid octal integer" msgstr "不正な8進整数" -#: scan.l:1036 +#: scan.l:1044 msgid "invalid binary integer" msgstr "不正な2進整数" #. translator: %s is typically the translation of "syntax error" -#: scan.l:1231 +#: 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:1239 +#: scan.l:1247 #, c-format msgid "%s at or near \"%s\"" msgstr "\"%2$s\"またはその近辺で%1$s" -#: scan.l:1431 +#: scan.l:1439 #, c-format msgid "nonstandard use of \\' in a string literal" msgstr "文字列リテラルないでの\\'の非標準的な使用" -#: scan.l:1432 +#: scan.l:1440 #, c-format msgid "Use '' to write quotes in strings, or use the escape string syntax (E'...')." msgstr "文字列内で単一引用符を記述するには''、またはエスケープ文字列構文(E'...')を使用してください。" -#: scan.l:1441 +#: scan.l:1449 #, c-format msgid "nonstandard use of \\\\ in a string literal" msgstr "文字列リテラル内での\\\\の非標準的な使用" -#: scan.l:1442 +#: scan.l:1450 #, c-format msgid "Use the escape string syntax for backslashes, e.g., E'\\\\'." msgstr "バックスラッシュのエスケープ文字列構文、例えばE'\\\\'を使用してください。" -#: scan.l:1456 +#: scan.l:1464 #, c-format msgid "nonstandard use of escape in a string literal" msgstr "文字列リテラル内でのエスケープの非標準的な使用" -#: scan.l:1457 +#: scan.l:1465 #, c-format msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "エスケープのエスケープ文字列構文、例えばE'\\r\\n'を使用してください。" -#: snowball/dict_snowball.c:217 +#: snowball/dict_snowball.c:215 #, c-format msgid "no Snowball stemmer available for language \"%s\" and encoding \"%s\"" msgstr "言語\"%s\"および符号化方式\"%s\"用に使用可能なSnowballステマがありません" -#: snowball/dict_snowball.c:240 tsearch/dict_ispell.c:75 tsearch/dict_simple.c:50 +#: 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:249 +#: snowball/dict_snowball.c:247 #, c-format msgid "multiple Language parameters" msgstr "重複したLanguageパラメータ" -#: snowball/dict_snowball.c:256 +#: snowball/dict_snowball.c:254 #, c-format msgid "unrecognized Snowball parameter: \"%s\"" msgstr "認識できないSnowballパラメータ: \"%s\"" -#: snowball/dict_snowball.c:264 +#: snowball/dict_snowball.c:262 #, c-format msgid "missing Language parameter" msgstr "Languageパラメータがありません" -#: statistics/attribute_stats.c:162 statistics/attribute_stats.c:885 statistics/relation_stats.c:130 -#, c-format -msgid "Statistics cannot be modified during recovery." -msgstr "リカバリ中は統計情報の更新はできません。" - -#: statistics/attribute_stats.c:174 -#, c-format -msgid "cannot modify statistics on system column \"%s\"" -msgstr "システム列\"%s\"の統計情報は更新できません" - -#: statistics/attribute_stats.c:248 -#, c-format -msgid "unable to determine element type of attribute \"%s\"" -msgstr "属性 \"%s\" の要素型を特定できません" - -#: statistics/attribute_stats.c:249 -#, c-format -msgid "Cannot set STATISTIC_KIND_MCELEM or STATISTIC_KIND_DECHIST." -msgstr "STATISTIC_KIND_MCELEM および STATISTIC_KIND_DECHIST は設定できません。" - -#: statistics/attribute_stats.c:264 -#, c-format -msgid "could not determine less-than operator for attribute \"%s\"" -msgstr "属性 \"%s\" の小なり演算子(<)を特定できませんでした" - -#: statistics/attribute_stats.c:265 -#, c-format -msgid "Cannot set STATISTIC_KIND_HISTOGRAM or STATISTIC_KIND_CORRELATION." -msgstr "STATISTIC_KIND_HISTOGRAM および STATISTIC_KIND_CORRELATION は設定できません。" - -#: statistics/attribute_stats.c:278 -#, c-format -msgid "attribute \"%s\" is not a range type" -msgstr "属性 \"%s\" は範囲型ではありません" - -#: statistics/attribute_stats.c:279 -#, c-format -msgid "Cannot set STATISTIC_KIND_RANGE_LENGTH_HISTOGRAM or STATISTIC_KIND_BOUNDS_HISTOGRAM." -msgstr "STATISTIC_KIND_RANGE_LENGTH_HISTOGRAM および STATISTIC_KIND_BOUNDS_HISTOGRAM は設定できません。" - -#: statistics/attribute_stats.c:524 statistics/attribute_stats.c:532 -#, c-format -msgid "attribute %d of relation \"%s\" does not exist" -msgstr "リレーション \"%2$s\" の属性%1$dは存在しません" - -#: statistics/attribute_stats.c:667 statistics/stat_utils.c:76 -#, c-format -msgid "\"%s\" array cannot contain NULL values" -msgstr "\"%s\" の配列はNULL値を格納できません" - -#: statistics/attribute_stats.c:710 -#, c-format -msgid "maximum number of statistics slots exceeded: %d" -msgstr "統計情報スロットの最大数を超過しました: %d" - -#: statistics/attribute_stats.c:896 -#, c-format -msgid "cannot clear statistics on system column \"%s\"" -msgstr "システム列\"%s\"の統計情報はクリアできません" - -#: statistics/extended_stats.c:175 +#: 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\"に対して計算できませんでした" @@ -22435,117 +22004,42 @@ msgstr "統計オブジェクト\"%s.%s\"がリレーション\"%s.%s\"に対し msgid "function returning record called in context that cannot accept type record" msgstr "レコード型を受け付けられないコンテキストでレコードを返す関数が呼び出されました" -#: statistics/relation_stats.c:86 -#, c-format -msgid "relpages cannot be < -1" -msgstr "relpages は-1未満にはできません" - -#: statistics/relation_stats.c:101 -#, c-format -msgid "reltuples cannot be < -1.0" -msgstr "reltuplesは-1.0未満にはできません" - -#: statistics/relation_stats.c:116 -#, c-format -msgid "relallvisible cannot be < 0" -msgstr "relallvisible は0未満にはできません" - -#: statistics/relation_stats.c:195 -#, c-format -msgid "pg_class entry for relid %u not found" -msgstr "relid %u のpg_classエントリが見つかりません" - -#: statistics/stat_utils.c:40 -#, c-format -msgid "\"%s\" cannot be NULL" -msgstr "\"%s\"はNULLにはできません" - -#: statistics/stat_utils.c:67 -#, c-format -msgid "\"%s\" cannot be a multidimensional array" -msgstr "\"%s\"は多次元配列にはなれません" - -#: statistics/stat_utils.c:107 -#, c-format -msgid "\"%s\" must be specified when \"%s\" is specified" -msgstr "\"%s” は、\"%s\"が指定される際には必ず指定される必要があります" - -#: statistics/stat_utils.c:145 -#, c-format -msgid "cannot modify statistics for relation \"%s\"" -msgstr "リレーション\"%s\"の統計情報は変更できません" - -#: statistics/stat_utils.c:153 -#, c-format -msgid "cannot modify statistics for shared relation" -msgstr "共有リレーションの統計情報は変更できません" - -#: statistics/stat_utils.c:184 -#, c-format -msgid "unrecognized argument name: \"%s\"" -msgstr "識別できない引数名: \"%s\"" - -#: statistics/stat_utils.c:198 -#, c-format -msgid "argument \"%s\" has type \"%s\", expected type \"%s\"" -msgstr "引数\"%s\"の型は\"%s\"ですが、期待される型は\"%s\"です" - -#: statistics/stat_utils.c:240 -#, c-format -msgid "variadic arguments must be name/value pairs" -msgstr "可変長引数は名前/値のペアである必要があります" - -#: statistics/stat_utils.c:241 -#, c-format -msgid "Provide an even number of variadic arguments that can be divided into pairs." -msgstr "2つ組に分割できるよう、偶数個の可変長引数を指定してください。" - -#: statistics/stat_utils.c:255 -#, c-format -msgid "name at variadic position %d is NULL" -msgstr "可変長引数の位置%dの名前がNULLです" - -#: statistics/stat_utils.c:259 -#, c-format -msgid "name at variadic position %d has type \"%s\", expected type \"%s\"" -msgstr "可変長引数の位置%dの名前の型が\"%s\"ですが、期待される型は\"%s\"です" - -#: storage/buffer/bufmgr.c:650 storage/buffer/bufmgr.c:806 +#: 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:1545 +#: 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:2289 storage/buffer/localbuf.c:362 +#: 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:2360 +#: 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:2362 +#: 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:5622 +#: storage/buffer/bufmgr.c:5654 #, c-format msgid "could not write block %u of %s" msgstr "%u ブロックを %s に書き出せませんでした" -#: storage/buffer/bufmgr.c:5624 +#: storage/buffer/bufmgr.c:5656 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "複数回失敗しました ---ずっと書き込みエラーが続くかもしれません。" -#: storage/buffer/bufmgr.c:5646 storage/buffer/bufmgr.c:5666 +#: storage/buffer/bufmgr.c:5678 storage/buffer/bufmgr.c:5698 #, c-format msgid "writing block %u of relation %s" msgstr "ブロック %u を リレーション %s に書き込んでいます" @@ -22555,12 +22049,12 @@ msgstr "ブロック %u を リレーション %s に書き込んでいます" msgid "no empty local buffer available" msgstr "利用できる、空のローカルバッファがありません" -#: storage/buffer/localbuf.c:598 +#: storage/buffer/localbuf.c:597 #, c-format msgid "cannot access temporary tables during a parallel operation" msgstr "並列処理中は一時テーブルにはアクセスできません" -#: storage/buffer/localbuf.c:713 +#: 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\"を変更できません。" @@ -22580,150 +22074,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:875 +#: 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:951 +#: storage/file/buffile.c:956 #, c-format msgid "could not delete fileset \"%s\": %m" msgstr "ファイルセット\"%s\"を削除できませんでした: %m" -#: storage/file/buffile.c:969 storage/smgr/md.c:328 storage/smgr/md.c:1207 +#: 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:582 storage/file/fd.c:654 storage/file/fd.c:690 +#: 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:612 +#: storage/file/fd.c:613 #, c-format msgid "could not determine dirty data size: %m" msgstr "ダーティーデータのサイズを特定できませんでした: %m" -#: storage/file/fd.c:664 +#: storage/file/fd.c:665 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "データの書き出し中にmunmap()に失敗しました: %m" -#: storage/file/fd.c:982 +#: storage/file/fd.c:983 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimitが失敗しました: %m" -#: storage/file/fd.c:1072 +#: storage/file/fd.c:1073 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "サーバープロセスを起動させるために利用できるファイル記述子が不足しています" -#: storage/file/fd.c:1073 +#: storage/file/fd.c:1074 #, c-format msgid "System allows %d, server needs at least %d." msgstr "システムでは%d使用できますが、サーバーでは少なくとも%d必要です。" -#: storage/file/fd.c:1161 storage/file/fd.c:2640 storage/file/fd.c:2749 storage/file/fd.c:2900 +#: 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:1535 +#: storage/file/fd.c:1536 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "一時ファイル: パス \"%s\"、サイズ %lu" -#: storage/file/fd.c:1674 +#: storage/file/fd.c:1675 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "一時ディレクトリ\"%s\"を作成できませんでした: %m" -#: storage/file/fd.c:1681 +#: storage/file/fd.c:1682 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "一時サブディレクトリ\"%s\"を作成できませんでした: %m" -#: storage/file/fd.c:1878 +#: storage/file/fd.c:1879 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "一時ファイル\"%s\"を作成できませんでした: %m" -#: storage/file/fd.c:1914 +#: storage/file/fd.c:1915 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "一時ファイル\"%s\"をオープンできませんでした: %m" -#: storage/file/fd.c:1955 +#: storage/file/fd.c:1956 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "一時ファイル\"%s\"を unlink できませんでした: %m" -#: storage/file/fd.c:2043 +#: storage/file/fd.c:2044 #, c-format msgid "could not delete file \"%s\": %m" msgstr "ファイル\"%s\"を削除できませんでした: %m" -#: storage/file/fd.c:2256 +#: storage/file/fd.c:2234 #, c-format -msgid "temporary file size exceeds \"temp_file_limit\" (%dkB)" -msgstr "一時ファイルのサイズが\"temp_file_limit\" (%dkB)を超えています" +msgid "temporary file size exceeds temp_file_limit (%dkB)" +msgstr "一時ファイルのサイズがtemp_file_limit(%d KB)を超えています" -#: storage/file/fd.c:2616 storage/file/fd.c:2675 +#: 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:2720 +#: 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:2876 +#: 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:3407 +#: storage/file/fd.c:3384 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "一時ファイル用ディレクトリに想定外のファイルがありました: \"%s\"" -#: storage/file/fd.c:3525 +#: 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:3752 +#: 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:3784 +#: 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:3973 +#: 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 "\"%s\" is not supported on this platform." -msgstr "このプラットフォームでは\"%s\"をサポートしていません。" +msgid "Invalid list syntax in parameter \"%s\"" +msgstr "パラメータ\"%s\"のリスト構文が不正です" -#: storage/file/fd.c:3988 +#: storage/file/fd.c:3984 #, c-format -msgid "Invalid list syntax in parameter \"%s\"." -msgstr "パラメータ\"%s\"のリスト構文が不正です。" +msgid "Invalid option \"%s\"" +msgstr "不正なオプション\"%s\"" -#: storage/file/fd.c:4008 +#: storage/file/fd.c:3997 #, c-format -msgid "Invalid option \"%s\"." -msgstr "不正なオプション\"%s\"。" +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:4021 storage/file/fd.c:4029 +#: storage/file/fd.c:4004 #, c-format -msgid "\"%s\" is not supported for WAL because %s is too small." -msgstr "%2$sが小さすぎるため\"%1$s\"はWALに対してはサポートされません。" +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 @@ -22825,46 +22324,36 @@ msgstr "DSMセグメントサイズは0以外の値である必要がありま msgid "requested DSM segment size does not match size of existing segment" msgstr "要求されたDSMセグメントサイズが既存のセグメントのサイズと異なっています" -#: storage/ipc/procarray.c:488 storage/lmgr/proc.c:408 tcop/backend_startup.c:319 +#: 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:3858 +#: storage/ipc/procarray.c:3857 #, c-format msgid "database \"%s\" is being used by prepared transactions" msgstr "データベース\"%s\"は準備済みトランザクションで使用中です" -#: storage/ipc/procarray.c:3894 storage/ipc/procarray.c:3902 storage/ipc/signalfuncs.c:256 storage/ipc/signalfuncs.c:263 storage/ipc/signalfuncs.c:270 +#: 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:3895 storage/ipc/signalfuncs.c:257 +#: 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:3903 storage/ipc/signalfuncs.c:271 +#: 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:448 +#: storage/ipc/procsignal.c:416 #, c-format msgid "still waiting for backend with PID %d to accept ProcSignalBarrier" msgstr "PID %dのバックエンドがProcSignalBarrierを受け付けるのを待っています" -#: storage/ipc/procsignal.c:780 -#, c-format -msgid "wrong key in cancel request for process %d" -msgstr "プロセス%dに対するキャンセル要求においてキーが間違っています" - -#: storage/ipc/procsignal.c:789 -#, c-format -msgid "PID %d in cancel request did not match any process" -msgstr "キャンセル要求内のPID %dがどのプロセスにも一致しません" - #: storage/ipc/shm_mq.c:383 #, c-format msgid "cannot send a message of size %zu via shared memory queue" @@ -22875,88 +22364,78 @@ msgstr "共有メモリキュー経由で大きさ%zuのメッセージは送信 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:1032 storage/lmgr/lock.c:1070 storage/lmgr/lock.c:2907 storage/lmgr/lock.c:4310 storage/lmgr/lock.c:4375 storage/lmgr/lock.c:4725 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 +#: 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:156 storage/ipc/shmem.c:252 +#: 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:431 +#: storage/ipc/shmem.c:436 #, c-format msgid "could not create ShmemIndex entry for data structure \"%s\"" msgstr "データ構造体\"%s\"のためのShmemIndexエントリを作成できませんでした" -#: storage/ipc/shmem.c:446 +#: 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:465 +#: 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:497 storage/ipc/shmem.c:516 +#: 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:74 +#: storage/ipc/signalfuncs.c:72 #, c-format msgid "PID %d is not a PostgreSQL backend process" msgstr "PID %dはPostgreSQLバックエンドプロセスではありません" -#: storage/ipc/signalfuncs.c:123 storage/lmgr/proc.c:1495 utils/adt/mcxtfuncs.c:302 +#: 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:143 storage/ipc/signalfuncs.c:150 storage/ipc/signalfuncs.c:157 +#: storage/ipc/signalfuncs.c:129 storage/ipc/signalfuncs.c:136 #, c-format msgid "permission denied to cancel query" msgstr "問い合わせをキャンセルする権限がありません" -#: storage/ipc/signalfuncs.c:144 +#: storage/ipc/signalfuncs.c:130 #, c-format msgid "Only roles with the %s attribute may cancel queries of roles with the %s attribute." msgstr "%s属性を持つロールのみが、%s属性を持つロールが実行中の問い合わせをキャンセルできます。" -#: storage/ipc/signalfuncs.c:151 -#, c-format -msgid "Only roles with privileges of the \"%s\" role may cancel autovacuum workers." -msgstr "\"%s\"ロールの権限を持つロールのみが自動VACUUMワーカーのキャンセルを行うことができます。" - -#: storage/ipc/signalfuncs.c:158 +#: 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:200 +#: 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:218 +#: 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:249 +#: storage/ipc/signalfuncs.c:228 #, c-format msgid "\"timeout\" must not be negative" msgstr "\"timeout\"は負数であってはなりません" -#: storage/ipc/signalfuncs.c:264 -#, c-format -msgid "Only roles with privileges of the \"%s\" role may terminate autovacuum workers." -msgstr "\"%s\"ロールの権限を持つロールのみが自動VACUUMワーカーを終了させることができます。" - -#: storage/ipc/signalfuncs.c:313 +#: storage/ipc/signalfuncs.c:285 #, c-format msgid "rotation not possible because log collection not active" msgstr "ログ収集が活動していませんのでローテーションを行うことができません" @@ -22971,69 +22450,69 @@ msgstr "リカバリは%ld.%03dミリ秒経過後待機継続中: %s" msgid "recovery finished waiting after %ld.%03d ms: %s" msgstr "リカバリは%ld.%03dミリ秒で待機終了: %s" -#: storage/ipc/standby.c:920 tcop/postgres.c:3198 +#: storage/ipc/standby.c:920 tcop/postgres.c:3196 #, c-format msgid "canceling statement due to conflict with recovery" msgstr "リカバリで競合が発生したためステートメントをキャンセルしています" -#: storage/ipc/standby.c:921 tcop/postgres.c:2548 +#: storage/ipc/standby.c:921 tcop/postgres.c:2557 #, c-format msgid "User transaction caused buffer deadlock with recovery." msgstr "リカバリ時にユーザーのトランザクションがバッファのデッドロックを引き起こしました。" -#: storage/ipc/standby.c:1482 +#: storage/ipc/standby.c:1486 msgid "unknown reason" msgstr "不明な理由" -#: storage/ipc/standby.c:1487 +#: storage/ipc/standby.c:1491 msgid "recovery conflict on buffer pin" msgstr "バッファピンによるリカバリ競合" -#: storage/ipc/standby.c:1490 +#: storage/ipc/standby.c:1494 msgid "recovery conflict on lock" msgstr "ロック上のリカバリ衝突" -#: storage/ipc/standby.c:1493 +#: storage/ipc/standby.c:1497 msgid "recovery conflict on tablespace" msgstr "テーブル空間上のリカバリ衝突" -#: storage/ipc/standby.c:1496 +#: storage/ipc/standby.c:1500 msgid "recovery conflict on snapshot" msgstr "スナップショットによるリカバリ競合" -#: storage/ipc/standby.c:1499 +#: storage/ipc/standby.c:1503 msgid "recovery conflict on replication slot" msgstr "レプリケーションスロットに対するリカバリ競合" -#: storage/ipc/standby.c:1502 +#: storage/ipc/standby.c:1506 msgid "recovery conflict on buffer deadlock" msgstr "バッファのデッドロックによるリカバリ競合" -#: storage/ipc/standby.c:1505 +#: storage/ipc/standby.c:1509 msgid "recovery conflict on database" msgstr "データベース上のリカバリ衝突" -#: storage/large_object/inv_api.c:152 +#: 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:234 +#: 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:259 storage/large_object/inv_api.c:271 storage/large_object/inv_api.c:468 storage/large_object/inv_api.c:579 storage/large_object/inv_api.c:769 +#: 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:417 +#: storage/large_object/inv_api.c:455 #, c-format msgid "invalid whence setting: %d" msgstr "不正なwhence設定: %d" -#: storage/large_object/inv_api.c:589 +#: storage/large_object/inv_api.c:627 #, c-format msgid "invalid large object write request size: %d" msgstr "ラージオブジェクトの書き出し要求サイズが不正です: %d" @@ -23058,122 +22537,122 @@ msgstr "デッドロックを検出しました" msgid "See server log for query details." msgstr "問い合わせの詳細はサーバーログを参照してください" -#: storage/lmgr/lmgr.c:847 +#: storage/lmgr/lmgr.c:854 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"のタプル(%1$u,%2$u)の更新中" -#: storage/lmgr/lmgr.c:850 +#: storage/lmgr/lmgr.c:857 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"のタプル(%1$u,%2$u)の削除中" -#: storage/lmgr/lmgr.c:853 +#: storage/lmgr/lmgr.c:860 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"のタプル(%1$u,%2$u)のロック中" -#: storage/lmgr/lmgr.c:856 +#: storage/lmgr/lmgr.c:863 #, 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:859 +#: storage/lmgr/lmgr.c:866 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"のインデックスタプル(%1$u,%2$u)の挿入中" -#: storage/lmgr/lmgr.c:862 +#: storage/lmgr/lmgr.c:869 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"のタプル(%1$u,%2$u)の一意性の確認中" -#: storage/lmgr/lmgr.c:865 +#: storage/lmgr/lmgr.c:872 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "リレーション\"%3$s\"の更新されたタプル(%1$u,%2$u)の再チェック中" -#: storage/lmgr/lmgr.c:868 +#: storage/lmgr/lmgr.c:875 #, 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:1238 +#: storage/lmgr/lmgr.c:1245 #, c-format msgid "relation %u of database %u" msgstr "データベース%2$uのリレーション%1$u" -#: storage/lmgr/lmgr.c:1244 +#: storage/lmgr/lmgr.c:1251 #, c-format msgid "extension of relation %u of database %u" msgstr "データベース%2$uのリレーション%1$uの拡張" -#: storage/lmgr/lmgr.c:1250 +#: storage/lmgr/lmgr.c:1257 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "データベース%uのpg_database.datfrozenxid" -#: storage/lmgr/lmgr.c:1255 +#: storage/lmgr/lmgr.c:1262 #, c-format msgid "page %u of relation %u of database %u" msgstr "データベース%3$uのリレーション%2$uのページ%1$u" -#: storage/lmgr/lmgr.c:1262 +#: storage/lmgr/lmgr.c:1269 #, 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:1270 +#: storage/lmgr/lmgr.c:1277 #, c-format msgid "transaction %u" msgstr "トランザクション %u" -#: storage/lmgr/lmgr.c:1275 +#: storage/lmgr/lmgr.c:1282 #, c-format msgid "virtual transaction %d/%u" msgstr "仮想トランザクション %d/%u" -#: storage/lmgr/lmgr.c:1281 +#: storage/lmgr/lmgr.c:1288 #, c-format msgid "speculative token %u of transaction %u" msgstr "トランザクション%2$uの投機的書き込みトークン%1$u" -#: storage/lmgr/lmgr.c:1287 +#: storage/lmgr/lmgr.c:1294 #, c-format msgid "object %u of class %u of database %u" msgstr "データベース%3$uのリレーション%2$uのオブジェクト%1$u" -#: storage/lmgr/lmgr.c:1295 +#: storage/lmgr/lmgr.c:1302 #, c-format msgid "user lock [%u,%u,%u]" msgstr "ユーザーロック[%u,%u,%u]" -#: storage/lmgr/lmgr.c:1302 +#: storage/lmgr/lmgr.c:1309 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "アドバイザリ・ロック[%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1310 +#: storage/lmgr/lmgr.c:1317 #, c-format msgid "remote transaction %u of subscription %u of database %u" msgstr "データベース%3$uのサブスクリプション%2$uのリモートトランザクション%1$u" -#: storage/lmgr/lmgr.c:1317 +#: storage/lmgr/lmgr.c:1324 #, c-format msgid "unrecognized locktag type %d" msgstr "ロックタグタイプ%dは不明です" -#: storage/lmgr/lock.c:860 +#: 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:862 +#: 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:3363 storage/lmgr/lock.c:3431 storage/lmgr/lock.c:3547 +#: 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することはできません" @@ -23208,12 +22687,12 @@ msgstr "このデフォルトを変更するためには\"SET default_transactio msgid "a snapshot-importing transaction must not be READ ONLY DEFERRABLE" msgstr "スナップショットをインポートするトランザクションはREAD ONLY DEFERRABLEではいけません" -#: storage/lmgr/predicate.c:1817 utils/time/snapmgr.c:497 utils/time/snapmgr.c:503 +#: 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:1818 utils/time/snapmgr.c:504 +#: 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であるソースプロセスは既に実行中ではありません。" @@ -23228,450 +22707,450 @@ msgstr "トランザクション間で read/write の依存性があったため msgid "The transaction might succeed if retried." msgstr "リトライが行われた場合、このトランザクションは成功するかもしれません" -#: storage/lmgr/proc.c:404 +#: 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:1588 +#: 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:1603 +#: 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:1612 +#: 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:1619 +#: 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:1636 +#: 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:141 +#: storage/page/bufpage.c:152 #, c-format msgid "page verification failed, calculated checksum %u but expected %u" msgstr "ページ検証が失敗しました。計算されたチェックサムは%uですが想定は%uです" -#: storage/page/bufpage.c:206 storage/page/bufpage.c:719 storage/page/bufpage.c:1062 storage/page/bufpage.c:1197 storage/page/bufpage.c:1303 storage/page/bufpage.c:1415 +#: 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:748 +#: storage/page/bufpage.c:759 #, c-format msgid "corrupted line pointer: %u" msgstr "ラインポインタが破損しています: %u" -#: storage/page/bufpage.c:778 storage/page/bufpage.c:1255 +#: 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:1081 storage/page/bufpage.c:1222 storage/page/bufpage.c:1319 storage/page/bufpage.c:1431 +#: 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:477 storage/smgr/md.c:539 +#: 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:492 storage/smgr/md.c:603 +#: 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:498 +#: 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:581 +#: storage/smgr/md.c:589 #, c-format msgid "could not extend file \"%s\" with FileFallocate(): %m" msgstr "ファイル\"%s\"をFileFallocate()で拡張できませんでした: %m" -#: storage/smgr/md.c:879 +#: 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:905 +#: 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:1008 +#: 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:1178 +#: 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:1233 +#: 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:1711 +#: 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:1725 +#: 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:87 +#: tcop/backend_startup.c:85 #, c-format msgid "SSL configuration could not be loaded in child process" msgstr "SSL構成は子プロセスでは読み込めません" -#: tcop/backend_startup.c:209 +#: tcop/backend_startup.c:208 #, c-format msgid "connection received: host=%s port=%s" msgstr "接続を受け付けました: ホスト=%s ポート番号=%s" -#: tcop/backend_startup.c:214 +#: tcop/backend_startup.c:213 #, c-format msgid "connection received: host=%s" msgstr "接続を受け付けました: ホスト=%s" -#: tcop/backend_startup.c:292 +#: tcop/backend_startup.c:277 #, c-format msgid "the database system is starting up" msgstr "データベースシステムは起動処理中です" -#: tcop/backend_startup.c:298 +#: tcop/backend_startup.c:283 #, c-format msgid "the database system is not yet accepting connections" msgstr "データベースシステムはまだ接続を受け付けていません" -#: tcop/backend_startup.c:299 +#: tcop/backend_startup.c:284 #, c-format msgid "Consistent recovery state has not been yet reached." msgstr "リカバリの一貫性はまだ確保されていません。" -#: tcop/backend_startup.c:303 +#: tcop/backend_startup.c:288 #, c-format msgid "the database system is not accepting connections" msgstr "データベースシステムは接続を受け付けていません" -#: tcop/backend_startup.c:304 +#: tcop/backend_startup.c:289 #, c-format msgid "Hot standby mode is disabled." msgstr "ホットスタンバイモードは無効です。" -#: tcop/backend_startup.c:309 +#: tcop/backend_startup.c:294 #, c-format msgid "the database system is shutting down" msgstr "データベースシステムはシャットダウンしています" -#: tcop/backend_startup.c:314 +#: tcop/backend_startup.c:299 #, c-format msgid "the database system is in recovery mode" msgstr "データベースシステムはリカバリモードです" -#: tcop/backend_startup.c:429 +#: tcop/backend_startup.c:414 #, c-format msgid "received direct SSL connection request without ALPN protocol negotiation extension" msgstr "ALPNプロトコルネゴシエーション拡張を持たない直接SSL接続要求を受信しました" -#: tcop/backend_startup.c:435 +#: tcop/backend_startup.c:420 #, c-format msgid "direct SSL connection accepted" msgstr "直接SSL接続を受け付けられました" -#: tcop/backend_startup.c:445 +#: tcop/backend_startup.c:430 #, c-format msgid "direct SSL connection rejected" msgstr "直接SSL接続が拒否されました" -#: tcop/backend_startup.c:504 tcop/backend_startup.c:532 +#: tcop/backend_startup.c:489 tcop/backend_startup.c:517 #, c-format msgid "incomplete startup packet" msgstr "開始パケットが不完全です" -#: tcop/backend_startup.c:516 tcop/backend_startup.c:558 +#: tcop/backend_startup.c:501 tcop/backend_startup.c:538 #, c-format msgid "invalid length of startup packet" msgstr "不正な開始パケット長" -#: tcop/backend_startup.c:594 +#: tcop/backend_startup.c:573 #, c-format msgid "SSLRequest accepted" msgstr "SSLRequestを受け付けました" -#: tcop/backend_startup.c:597 +#: tcop/backend_startup.c:576 #, c-format msgid "SSLRequest rejected" msgstr "SSLRequestを拒否しました" -#: tcop/backend_startup.c:606 +#: tcop/backend_startup.c:585 #, c-format msgid "failed to send SSL negotiation response: %m" msgstr "SSLネゴシエーション応答の送信に失敗しました: %m" -#: tcop/backend_startup.c:624 +#: tcop/backend_startup.c:603 #, c-format msgid "received unencrypted data after SSL request" msgstr "SSL要求の後に非暗号化データを受信しました" -#: tcop/backend_startup.c:625 tcop/backend_startup.c:679 +#: 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 "これはクライアントソフトウェアのバグであるか、man-in-the-middle攻撃の証左である可能性があります。" -#: tcop/backend_startup.c:648 +#: tcop/backend_startup.c:627 #, c-format msgid "GSSENCRequest accepted" msgstr "GSSENCRequestを受け付けました" -#: tcop/backend_startup.c:651 +#: tcop/backend_startup.c:630 #, c-format msgid "GSSENCRequest rejected" msgstr "GSSENCRequestを拒否しました" -#: tcop/backend_startup.c:660 +#: tcop/backend_startup.c:639 #, c-format msgid "failed to send GSSAPI negotiation response: %m" msgstr "GSSAPIネゴシエーション応答の送信に失敗しました: %m" -#: tcop/backend_startup.c:678 +#: tcop/backend_startup.c:657 #, c-format msgid "received unencrypted data after GSSAPI encryption request" msgstr "GSSAPI暗号化リクエストの後に非暗号化データを受信" -#: tcop/backend_startup.c:706 +#: 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:769 +#: 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:810 +#: tcop/backend_startup.c:785 #, c-format msgid "invalid startup packet layout: expected terminator as last byte" msgstr "開始パケットの配置が不正です: 最終バイトはターミネータであるはずです" -#: tcop/backend_startup.c:827 +#: tcop/backend_startup.c:802 #, c-format msgid "no PostgreSQL user name specified in startup packet" msgstr "開始パケットで指定されたPostgreSQLユーザー名は存在しません" -#: tcop/fastpath.c:141 utils/fmgr/fmgr.c:2161 +#: 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:148 +#: tcop/fastpath.c:149 #, c-format msgid "cannot call function \"%s\" via fastpath interface" msgstr "関数\"%s\"は高速呼び出しインタフェースでの呼び出しはできません" -#: tcop/fastpath.c:233 +#: tcop/fastpath.c:234 #, c-format msgid "fastpath function call: \"%s\" (OID %u)" msgstr "近道関数呼び出し: \"%s\"(OID %u))" -#: tcop/fastpath.c:312 tcop/postgres.c:1361 tcop/postgres.c:1597 tcop/postgres.c:2063 tcop/postgres.c:2324 +#: 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ミリ秒 ファストパス関数呼び出し: \"%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:454 tcop/postgres.c:4943 +#: tcop/postgres.c:467 tcop/postgres.c:5012 #, c-format msgid "invalid frontend message type %d" msgstr "フロントエンドメッセージタイプ%dが不正です" -#: tcop/postgres.c:1069 +#: tcop/postgres.c:1076 #, c-format msgid "statement: %s" msgstr "文: %s" -#: tcop/postgres.c:1366 +#: tcop/postgres.c:1374 #, c-format msgid "duration: %s ms statement: %s" msgstr "期間: %s ミリ秒 文: %s" -#: tcop/postgres.c:1472 +#: tcop/postgres.c:1480 #, c-format msgid "cannot insert multiple commands into a prepared statement" msgstr "準備された文に複数のコマンドを挿入できません" -#: tcop/postgres.c:1602 +#: tcop/postgres.c:1610 #, c-format msgid "duration: %s ms parse %s: %s" msgstr "期間: %s ミリ秒 パース%s : %s" -#: tcop/postgres.c:1669 tcop/postgres.c:2644 +#: tcop/postgres.c:1677 tcop/postgres.c:2653 #, c-format msgid "unnamed prepared statement does not exist" msgstr "無名の準備された文が存在しません" -#: tcop/postgres.c:1721 +#: tcop/postgres.c:1729 #, c-format msgid "bind message has %d parameter formats but %d parameters" msgstr "バインドメッセージは%dパラメータ書式ありましたがパラメータは%dでした" -#: tcop/postgres.c:1727 +#: 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:1941 +#: tcop/postgres.c:1949 #, c-format msgid "incorrect binary data format in bind parameter %d" msgstr "バインドパラメータ%dにおいてバイナリデータ書式が不正です" -#: tcop/postgres.c:2068 +#: tcop/postgres.c:2076 #, c-format msgid "duration: %s ms bind %s%s%s: %s" msgstr "期間: %s ミリ秒 バインド %s%s%s: %s" -#: tcop/postgres.c:2123 tcop/postgres.c:2726 +#: tcop/postgres.c:2131 tcop/postgres.c:2735 #, c-format msgid "portal \"%s\" does not exist" msgstr "ポータル\"%s\"は存在しません" -#: tcop/postgres.c:2205 +#: tcop/postgres.c:2213 #, c-format msgid "%s %s%s%s: %s" msgstr "%s %s%s%s: %s" -#: tcop/postgres.c:2207 tcop/postgres.c:2332 +#: tcop/postgres.c:2215 tcop/postgres.c:2341 msgid "execute fetch from" msgstr "取り出し実行" -#: tcop/postgres.c:2208 tcop/postgres.c:2333 +#: tcop/postgres.c:2216 tcop/postgres.c:2342 msgid "execute" msgstr "実行" -#: tcop/postgres.c:2329 +#: 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:2477 +#: tcop/postgres.c:2486 #, c-format msgid "prepare: %s" msgstr "準備: %s" -#: tcop/postgres.c:2502 +#: tcop/postgres.c:2511 #, c-format msgid "Parameters: %s" msgstr "パラメータ: %s" -#: tcop/postgres.c:2517 +#: tcop/postgres.c:2526 #, c-format msgid "Abort reason: recovery conflict" msgstr "異常終了の理由: リカバリ衝突" -#: tcop/postgres.c:2533 +#: tcop/postgres.c:2542 #, c-format msgid "User was holding shared buffer pin for too long." msgstr "ユーザーが共有バッファ・ピンを長く保持し過ぎていました" -#: tcop/postgres.c:2536 +#: tcop/postgres.c:2545 #, c-format msgid "User was holding a relation lock for too long." msgstr "ユーザーリレーションのロックを長く保持し過ぎていました" -#: tcop/postgres.c:2539 +#: tcop/postgres.c:2548 #, c-format msgid "User was or might have been using tablespace that must be dropped." msgstr "削除されるべきテーブルスペースをユーザーが使っていました(もしくはその可能性がありました)。" -#: tcop/postgres.c:2542 +#: tcop/postgres.c:2551 #, c-format msgid "User query might have needed to see row versions that must be removed." msgstr "削除されるべきバージョンの行をユーザー問い合わせが参照しなければならなかった可能性がありました。" -#: tcop/postgres.c:2545 +#: tcop/postgres.c:2554 #, c-format msgid "User was using a logical replication slot that must be invalidated." msgstr "無効化されるべき論理レプリケーションスロットをユーザーが使用していました。" -#: tcop/postgres.c:2551 +#: tcop/postgres.c:2560 #, c-format msgid "User was connected to a database that must be dropped." msgstr "削除されるべきデータベースにユーザーが接続していました。" -#: tcop/postgres.c:2590 +#: tcop/postgres.c:2599 #, c-format msgid "portal \"%s\" parameter $%d = %s" msgstr "ポータル\"%s\" パラメータ$%d = %s" -#: tcop/postgres.c:2593 +#: tcop/postgres.c:2602 #, c-format msgid "portal \"%s\" parameter $%d" msgstr "ポータル\"%s\" パラメータ $%d" -#: tcop/postgres.c:2599 +#: tcop/postgres.c:2608 #, c-format msgid "unnamed portal parameter $%d = %s" msgstr "無名ポータルパラメータ $%d = %s" -#: tcop/postgres.c:2602 +#: tcop/postgres.c:2611 #, c-format msgid "unnamed portal parameter $%d" msgstr "無名ポータルパラメータ $%d" -#: tcop/postgres.c:2957 +#: tcop/postgres.c:2955 #, c-format msgid "terminating connection because of unexpected SIGQUIT signal" msgstr "予期しないSIGQUITシグナルによりコネクションを終了します" -#: tcop/postgres.c:2963 +#: tcop/postgres.c:2961 #, c-format msgid "terminating connection because of crash of another server process" msgstr "他のサーバープロセスがクラッシュしたため接続を終了します" -#: tcop/postgres.c:2964 +#: 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 "" @@ -23679,152 +23158,167 @@ msgstr "" "postmasterはこのサーバープロセスに対し、現在のトランザクションをロールバック\n" "し終了するよう指示しました。" -#: tcop/postgres.c:2968 tcop/postgres.c:3221 +#: 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:2975 +#: tcop/postgres.c:2973 #, c-format msgid "terminating connection due to immediate shutdown command" msgstr "即時シャットダウンコマンドによりコネクションを終了します" -#: tcop/postgres.c:3053 +#: tcop/postgres.c:3051 #, c-format msgid "floating-point exception" msgstr "浮動小数点例外" -#: tcop/postgres.c:3054 +#: 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:3219 +#: tcop/postgres.c:3217 #, c-format msgid "terminating connection due to conflict with recovery" msgstr "リカバリで競合が発生したため、接続を終了しています" -#: tcop/postgres.c:3291 +#: tcop/postgres.c:3289 #, c-format msgid "canceling authentication due to timeout" msgstr "タイムアウトにより認証処理をキャンセルしています" -#: tcop/postgres.c:3295 +#: tcop/postgres.c:3293 #, c-format msgid "terminating autovacuum process due to administrator command" msgstr "管理者コマンドにより自動VACUUM処理を終了しています" -#: tcop/postgres.c:3299 +#: tcop/postgres.c:3297 #, c-format msgid "terminating logical replication worker due to administrator command" msgstr "管理者コマンドにより、論理レプリケーションワーカーを終了します" -#: tcop/postgres.c:3319 +#: tcop/postgres.c:3317 #, c-format msgid "terminating connection due to administrator command" msgstr "管理者コマンドにより接続を終了しています" -#: tcop/postgres.c:3350 +#: tcop/postgres.c:3348 #, c-format msgid "connection to client lost" msgstr "クライアントへの接続が切れました。" -#: tcop/postgres.c:3402 +#: tcop/postgres.c:3400 #, c-format msgid "canceling statement due to lock timeout" msgstr "ロックのタイムアウトのためステートメントをキャンセルしています" -#: tcop/postgres.c:3409 +#: tcop/postgres.c:3407 #, c-format msgid "canceling statement due to statement timeout" msgstr "ステートメントのタイムアウトのためステートメントをキャンセルしています" -#: tcop/postgres.c:3416 +#: tcop/postgres.c:3414 #, c-format msgid "canceling autovacuum task" msgstr "自動VACUUM処理をキャンセルしています" -#: tcop/postgres.c:3429 +#: tcop/postgres.c:3427 #, c-format msgid "canceling statement due to user request" msgstr "ユーザーからの要求により文をキャンセルしています" -#: tcop/postgres.c:3450 +#: tcop/postgres.c:3448 #, c-format msgid "terminating connection due to idle-in-transaction timeout" msgstr "トランザクション中アイドルタイムアウトのため接続を終了します" -#: tcop/postgres.c:3463 +#: tcop/postgres.c:3461 #, c-format msgid "terminating connection due to transaction timeout" msgstr "トランザクションタイムアウトのため接続を終了します" -#: tcop/postgres.c:3476 +#: tcop/postgres.c:3474 #, c-format msgid "terminating connection due to idle-session timeout" msgstr "アイドルセッションタイムアウトにより接続を終了します" -#: tcop/postgres.c:3512 +#: tcop/postgres.c:3564 +#, c-format +msgid "stack depth limit exceeded" +msgstr "スタック長制限を越えました" + +#: 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)を増やしてください。" + +#: tcop/postgres.c:3612 +#, c-format +msgid "\"max_stack_depth\" must not exceed %ldkB." +msgstr "\"max_stack_depth\"は%ldkBを越えてはなりません。" + +#: 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: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:3533 +#: tcop/postgres.c:3658 #, c-format msgid "Cannot enable parameter when \"log_statement_stats\" is true." msgstr "\"log_statement_stats\"が真の場合、パラメータを有効にできません" -#: tcop/postgres.c:3548 +#: 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:3986 +#: tcop/postgres.c:4098 #, c-format msgid "invalid command-line argument for server process: %s" msgstr "サーバープロセスに対する不正なコマンドライン引数: %s" -#: tcop/postgres.c:3987 tcop/postgres.c:3993 +#: tcop/postgres.c:4099 tcop/postgres.c:4105 #, c-format msgid "Try \"%s --help\" for more information." msgstr "詳細は\"%s --help\"を実行してください。" -#: tcop/postgres.c:3991 +#: tcop/postgres.c:4103 #, c-format msgid "%s: invalid command-line argument: %s" msgstr "%s: 不正なコマンドライン引数: %s" -#: tcop/postgres.c:4044 +#: tcop/postgres.c:4156 #, c-format msgid "%s: no database nor user name specified" msgstr "%s: データベース名もユーザー名も指定されていません" -#: tcop/postgres.c:4233 -#, c-format -msgid "could not generate random cancel key" -msgstr "ランダムなキャンセルキーを生成できませんでした" - -#: tcop/postgres.c:4833 +#: tcop/postgres.c:4909 #, c-format msgid "invalid CLOSE message subtype %d" msgstr "不正なCLOSEメッセージのサブタイプ%d" -#: tcop/postgres.c:4870 +#: tcop/postgres.c:4946 #, c-format msgid "invalid DESCRIBE message subtype %d" msgstr "不正なDESCRIBEメッセージのサブタイプ%d" -#: tcop/postgres.c:4964 +#: tcop/postgres.c:5033 #, c-format msgid "fastpath function calls not supported in a replication connection" msgstr "レプリケーション接続では高速関数呼び出しはサポートされていません" -#: tcop/postgres.c:4968 +#: tcop/postgres.c:5037 #, c-format msgid "extended query protocol not supported in a replication connection" msgstr "レプリケーション接続では拡張問い合わせプロトコルはサポートされていません" -#: tcop/postgres.c:5114 +#: 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" @@ -23834,12 +23328,12 @@ msgstr "接続を切断: セッション時間: %d:%02d:%02d.%03d ユーザー=% msgid "bind message has %d result formats but query has %d columns" msgstr "バインドメッセージは%dの結果書式がありましたが、問い合わせは%d列でした" -#: tcop/pquery.c:939 tcop/pquery.c:1692 +#: tcop/pquery.c:942 tcop/pquery.c:1696 #, c-format msgid "cursor can only scan forward" msgstr "カーゾルは前方へのスキャンしかできません" -#: tcop/pquery.c:940 tcop/pquery.c:1693 +#: tcop/pquery.c:943 tcop/pquery.c:1697 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "後方スキャンを有効にするためにはSCROLLオプションを付けて宣言してください。" @@ -23869,68 +23363,68 @@ msgid "cannot execute %s within security-restricted operation" msgstr "セキュリティー制限操作の中では %s を実行できません" #. translator: %s is name of a SQL command, eg LISTEN -#: tcop/utility.c:824 +#: 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:950 +#: tcop/utility.c:947 #, c-format msgid "permission denied to execute %s command" msgstr "%sコマンドを実行する権限がありません" -#: tcop/utility.c:952 +#: 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:53 tsearch/dict_thesaurus.c:616 +#: tsearch/dict_ispell.c:52 tsearch/dict_thesaurus.c:616 #, c-format msgid "multiple DictFile parameters" msgstr "重複するDictFileパラメータ" -#: tsearch/dict_ispell.c:64 +#: tsearch/dict_ispell.c:63 #, c-format msgid "multiple AffFile parameters" msgstr "重複するAffFileパラメータ" -#: tsearch/dict_ispell.c:83 +#: tsearch/dict_ispell.c:82 #, c-format msgid "unrecognized Ispell parameter: \"%s\"" msgstr "認識不可のIspellパラメータ: \"%s\"" -#: tsearch/dict_ispell.c:97 +#: tsearch/dict_ispell.c:96 #, c-format msgid "missing AffFile parameter" msgstr "AffFileパラメータがありません" -#: tsearch/dict_ispell.c:103 tsearch/dict_thesaurus.c:640 +#: tsearch/dict_ispell.c:102 tsearch/dict_thesaurus.c:640 #, c-format msgid "missing DictFile parameter" msgstr "DictFileパラメータがありません" -#: tsearch/dict_simple.c:59 +#: tsearch/dict_simple.c:58 #, c-format msgid "multiple Accept parameters" msgstr "重複するAcceptパラメータ" -#: tsearch/dict_simple.c:67 +#: tsearch/dict_simple.c:66 #, c-format msgid "unrecognized simple dictionary parameter: \"%s\"" msgstr "認識できない単純辞書パラメータ: \"%s\"" -#: tsearch/dict_synonym.c:120 +#: tsearch/dict_synonym.c:118 #, c-format msgid "unrecognized synonym parameter: \"%s\"" msgstr "認識できない類義語パラメータ: \"%s\"" -#: tsearch/dict_synonym.c:127 +#: tsearch/dict_synonym.c:125 #, c-format msgid "missing Synonyms parameter" msgstr "類義語パラメータがありません" -#: tsearch/dict_synonym.c:134 +#: tsearch/dict_synonym.c:132 #, c-format msgid "could not open synonym file \"%s\": %m" msgstr "類義語ファイル\"%s\"をオープンできませんでした: %m" @@ -24005,12 +23499,12 @@ msgstr "認識できないシソーラスパラメータ \"%s\"" msgid "missing Dictionary parameter" msgstr "Dictionaryパラメータがありません" -#: tsearch/spell.c:382 tsearch/spell.c:399 tsearch/spell.c:408 tsearch/spell.c:1044 +#: 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:386 tsearch/spell.c:1048 +#: tsearch/spell.c:386 tsearch/spell.c:1049 #, c-format msgid "affix flag \"%s\" is out of range" msgstr "接辞フラグ\"%s\"は範囲外です" @@ -24030,46 +23524,51 @@ msgstr "\"long\"フラグ値を伴った不正な接辞フラグ\"%s\"" msgid "could not open dictionary file \"%s\": %m" msgstr "辞書ファイル\"%s\"をオープンできませんでした: %m" -#: tsearch/spell.c:1171 tsearch/spell.c:1183 tsearch/spell.c:1747 tsearch/spell.c:1752 tsearch/spell.c:1757 +#: 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:1224 tsearch/spell.c:1295 tsearch/spell.c:1444 +#: 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:1278 +#: 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:1322 +#: tsearch/spell.c:1324 #, c-format msgid "invalid number of flag vector aliases" msgstr "不正な数のフラグベクタの別名" -#: tsearch/spell.c:1345 +#: tsearch/spell.c:1347 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "別名の数が指定された数 %d を超えています" -#: tsearch/spell.c:1560 +#: tsearch/spell.c:1562 #, 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 +#: 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:191 +#: 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 "wchar_tからサーバー符号化方式への変換が失敗しました: %m" + #: 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" @@ -24080,12 +23579,12 @@ msgstr "インデックス付けするには単語が長すぎます" msgid "Words longer than %d characters are ignored." msgstr "%dより長い単語は無視されます。" -#: tsearch/ts_utils.c:52 +#: tsearch/ts_utils.c:51 #, c-format msgid "invalid text search configuration file name \"%s\"" msgstr "テキスト検索設定ファイル名は%sは不正です" -#: tsearch/ts_utils.c:84 +#: tsearch/ts_utils.c:83 #, c-format msgid "could not open stop-word file \"%s\": %m" msgstr "ストップワードファイル\"%s\"をオープンできませんでした: %m" @@ -24115,92 +23614,42 @@ msgstr "%sは正数でなければなりまsん" msgid "%s must be >= 0" msgstr "%sは0以上でなければなりません" -#: utils/activity/pgstat.c:534 +#: utils/activity/pgstat.c:435 #, c-format msgid "could not unlink permanent statistics file \"%s\": %m" msgstr "永続統計情報ファイル\"%s\"をunlinkできませんでした: %m" -#: utils/activity/pgstat.c:1444 +#: utils/activity/pgstat.c:1254 #, c-format msgid "invalid statistics kind: \"%s\"" msgstr "不正な統計情報種別: \"%s\"" -#: utils/activity/pgstat.c:1489 -#, c-format -msgid "custom cumulative statistics name is invalid" -msgstr "独自集積統計情報の名前が不正です" - -#: utils/activity/pgstat.c:1490 -#, c-format -msgid "Provide a non-empty name for the custom cumulative statistics." -msgstr "独自集積統計情報の名前には空ではない文字列を設定してください。" - -#: utils/activity/pgstat.c:1493 -#, c-format -msgid "custom cumulative statistics ID %u is out of range" -msgstr "独自集積統計情報のID %uは範囲外です" - -#: utils/activity/pgstat.c:1494 -#, c-format -msgid "Provide a custom cumulative statistics ID between %u and %u." -msgstr "独自集積統計情報IDは%uから%uの間の値で指定してください。" - -#: utils/activity/pgstat.c:1499 utils/activity/pgstat.c:1526 utils/activity/pgstat.c:1539 -#, c-format -msgid "failed to register custom cumulative statistics \"%s\" with ID %u" -msgstr "独自集積統計情報\"%s\"のID %uでの登録に失敗しました" - -#: utils/activity/pgstat.c:1500 -#, c-format -msgid "Custom cumulative statistics must be registered while initializing modules in \"shared_preload_libraries\"." -msgstr "独自集積統計情報は\"shared_preload_libraries\"にあるモジュールの初期化中に登録する必要があります。" - -#: utils/activity/pgstat.c:1509 -#, c-format -msgid "custom cumulative statistics property is invalid" -msgstr "独自集積統計情報の特性が不正です" - -#: utils/activity/pgstat.c:1510 -#, c-format -msgid "Custom cumulative statistics require a shared memory size for fixed-numbered objects." -msgstr "独自集積統計情報は固定数のオブジェクトのための共有メモリのサイズを必要とします。" - -#: utils/activity/pgstat.c:1527 -#, c-format -msgid "Custom cumulative statistics \"%s\" already registered with the same ID." -msgstr "独自集積統計情報\"%s\"はすでに同一のIDで登録されています。" - -#: utils/activity/pgstat.c:1540 -#, c-format -msgid "Existing cumulative statistics with ID %u has the same name." -msgstr "ID %uの既存の独自集積統計情報が同じ名前です。" - -#: utils/activity/pgstat.c:1546 -#, c-format -msgid "registered custom cumulative statistics \"%s\" with ID %u" -msgstr "独自集積統計情報\"%s\"をID %uで登録しました" - -#: utils/activity/pgstat.c:1616 +#: utils/activity/pgstat.c:1334 #, c-format msgid "could not open temporary statistics file \"%s\": %m" msgstr "一時統計情報ファイル\"%s\"をオープンできませんでした: %m" -#: utils/activity/pgstat.c:1740 +#: utils/activity/pgstat.c:1454 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "一時統計情報ファイル\"%s\"に書き込みできませんでした: %m" -#: utils/activity/pgstat.c:1749 +#: utils/activity/pgstat.c:1463 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "一時統計情報ファイル\"%s\"をクローズできませんでした: %m" -#: utils/activity/pgstat.c:1805 +#: 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:1520 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "統計情報ファイル\"%s\"をオープンできませんでした: %m" -#: utils/activity/pgstat.c:2053 +#: utils/activity/pgstat.c:1682 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "統計情報ファイル\"%s\"が破損しています" @@ -24210,102 +23659,102 @@ msgstr "統計情報ファイル\"%s\"が破損しています" msgid "function call to dropped function" msgstr "削除された関数の呼び出し" -#: utils/activity/pgstat_xact.c:366 +#: utils/activity/pgstat_xact.c:362 #, c-format -msgid "resetting existing statistics for kind %s, db=%u, oid=%llu" -msgstr "種類%s、db=%u、oid=%lluに対する既存の統計情報をリセットします" +msgid "resetting existing statistics for kind %s, db=%u, oid=%u" +msgstr "種類%s、db=%u、oid=%uの既存統計情報をリセットします" -#: utils/activity/wait_event.c:206 utils/activity/wait_event.c:231 +#: 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:245 +#: utils/activity/wait_event.c:246 #, c-format msgid "too many custom wait events" msgstr "独自待機イベントの数が多すぎます" -#: utils/adt/acl.c:187 utils/adt/name.c:93 +#: utils/adt/acl.c:183 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "識別子が長すぎます" -#: utils/adt/acl.c:188 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:276 +#: utils/adt/acl.c:272 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "キーワードが不明です: \"%s\"" -#: utils/adt/acl.c:277 +#: utils/adt/acl.c:273 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "ACLキーワードは\"group\"または\"user\"でなければなりません。" -#: utils/adt/acl.c:285 +#: utils/adt/acl.c:281 #, c-format msgid "missing name" msgstr "名前がありません" -#: utils/adt/acl.c:286 +#: 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:292 +#: utils/adt/acl.c:288 #, c-format msgid "missing \"=\" sign" msgstr "\"=\"記号がありません" -#: utils/adt/acl.c:351 +#: utils/adt/acl.c:350 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "不正なモード文字: \"%s\"の一つでなければなりません" -#: utils/adt/acl.c:381 +#: utils/adt/acl.c:380 #, c-format msgid "a name must follow the \"/\" sign" msgstr "\"/\"記号の後には名前が必要です" -#: utils/adt/acl.c:393 +#: utils/adt/acl.c:392 #, c-format msgid "defaulting grantor to user ID %u" msgstr "権限付与者をデフォルトのユーザーID %uにしています" -#: utils/adt/acl.c:579 +#: utils/adt/acl.c:578 #, c-format msgid "ACL array contains wrong data type" msgstr "ACL配列に不正なデータ型があります。" -#: utils/adt/acl.c:583 +#: utils/adt/acl.c:582 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "ACL配列は1次元の配列でなければなりません" -#: utils/adt/acl.c:587 +#: utils/adt/acl.c:586 #, c-format msgid "ACL arrays must not contain null values" msgstr "ACL配列にはNULL値を含めてはいけません" -#: utils/adt/acl.c:616 +#: utils/adt/acl.c:615 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "ACL指定の後に余計なごみがあります" -#: utils/adt/acl.c:1264 +#: utils/adt/acl.c:1263 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "グラントオプションでその権限付与者に権限を付与し返すことはできません" -#: utils/adt/acl.c:1580 +#: utils/adt/acl.c:1579 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsertはもうサポートされていません" -#: utils/adt/acl.c:1590 +#: utils/adt/acl.c:1589 #, c-format msgid "aclremove is no longer supported" msgstr "aclremoveはもうサポートされていません" @@ -24315,17 +23764,17 @@ msgstr "aclremoveはもうサポートされていません" msgid "unrecognized privilege type: \"%s\"" msgstr "権限タイプが不明です: \"%s\"" -#: utils/adt/acl.c:3548 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:5330 +#: 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:866 utils/adt/json.c:611 utils/adt/json.c:749 utils/adt/json.c:799 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 +#: 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 "入力データ型を特定できませんでした" @@ -24335,8 +23784,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:1229 utils/adt/float.c:1303 utils/adt/float.c:4019 utils/adt/float.c:4057 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:2039 utils/adt/numeric.c:4557 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:3112 +#: 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の範囲外です" @@ -24371,7 +23820,7 @@ msgstr "異なる要素次数の配列の連結には互換性がありません 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:5628 utils/adt/arrayfuncs.c:5634 +#: 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 "次元の異なる配列は結合できません" @@ -24461,7 +23910,7 @@ msgstr "想定外の配列要素。" msgid "Specified array dimensions do not match array contents." msgstr "指定された配列の次元数が配列の内容と合致していません。" -#: utils/adt/arrayfuncs.c:783 utils/adt/jsonfuncs.c:2599 +#: utils/adt/arrayfuncs.c:783 utils/adt/jsonfuncs.c:2598 #, c-format msgid "Multidimensional arrays must have sub-arrays with matching dimensions." msgstr "多次元配列は合致する次元の副配列を持たなければなりません。" @@ -24476,7 +23925,7 @@ msgstr "配列要素が正しくクォートされていません" msgid "Unexpected end of input." msgstr "想定外の入力の終端。" -#: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3511 utils/adt/arrayfuncs.c:6118 +#: 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" @@ -24491,7 +23940,7 @@ msgstr "不正な配列フラグ" 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:1378 utils/adt/multirangetypes.c:450 utils/adt/rangetypes.c:351 utils/cache/lsyscache.c:2985 +#: 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にはバイナリ入力関数がありません" @@ -24501,7 +23950,7 @@ msgstr "型%sにはバイナリ入力関数がありません" msgid "improper binary format in array element %d" msgstr "配列要素%dのバイナリ書式が不適切です" -#: utils/adt/arrayfuncs.c:1588 utils/adt/multirangetypes.c:455 utils/adt/rangetypes.c:356 utils/cache/lsyscache.c:3018 +#: 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にはバイナリ出力関数がありません" @@ -24511,7 +23960,7 @@ msgstr "型%sにはバイナリ出力関数がありません" 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:2915 utils/adt/arrayfuncs.c:6104 utils/adt/arrayfuncs.c:6130 utils/adt/arrayfuncs.c:6141 utils/adt/json.c:1441 utils/adt/json.c:1509 utils/adt/jsonb.c:1317 utils/adt/jsonb.c:1401 utils/adt/jsonfuncs.c:4711 utils/adt/jsonfuncs.c:4864 utils/adt/jsonfuncs.c:4975 utils/adt/jsonfuncs.c:5023 +#: 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 "配列の添え字が不正な数値です" @@ -24546,77 +23995,77 @@ msgstr "空の配列値のスライスに代入するには、スライスの範 msgid "source array too small" msgstr "元の配列が小さすぎます" -#: utils/adt/arrayfuncs.c:3669 +#: utils/adt/arrayfuncs.c:3657 #, c-format msgid "null array element not allowed in this context" msgstr "この文脈ではNULLの配列要素は許可されません" -#: utils/adt/arrayfuncs.c:3840 utils/adt/arrayfuncs.c:4011 utils/adt/arrayfuncs.c:4402 +#: 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:4189 utils/adt/multirangetypes.c:2805 utils/adt/multirangetypes.c:2877 utils/adt/rangetypes.c:1361 utils/adt/rangetypes.c:1425 utils/adt/rowtypes.c:1893 +#: 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:4317 utils/adt/rowtypes.c:2014 +#: 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:5518 +#: utils/adt/arrayfuncs.c:5506 #, c-format msgid "data type %s is not an array type" msgstr "データ型%sは配列型ではありません" -#: utils/adt/arrayfuncs.c:5573 +#: utils/adt/arrayfuncs.c:5561 #, c-format msgid "cannot accumulate null arrays" msgstr "null配列は連結できません" -#: utils/adt/arrayfuncs.c:5601 +#: utils/adt/arrayfuncs.c:5589 #, c-format msgid "cannot accumulate empty arrays" msgstr "空の配列は連結できません" -#: utils/adt/arrayfuncs.c:6002 utils/adt/arrayfuncs.c:6042 +#: 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:6105 utils/adt/arrayfuncs.c:6131 +#: 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:6110 utils/adt/arrayfuncs.c:6136 +#: utils/adt/arrayfuncs.c:6100 utils/adt/arrayfuncs.c:6126 #, c-format msgid "dimension values cannot be null" msgstr "次元値にnullにはできません" -#: utils/adt/arrayfuncs.c:6142 +#: utils/adt/arrayfuncs.c:6132 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "下限配列が次元配列のサイズと異なっています" -#: utils/adt/arrayfuncs.c:6423 +#: utils/adt/arrayfuncs.c:6413 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "多次元配列からの要素削除はサポートされません" -#: utils/adt/arrayfuncs.c:6700 +#: utils/adt/arrayfuncs.c:6690 #, c-format msgid "thresholds must be one-dimensional array" msgstr "閾値は1次元の配列でなければなりません" -#: utils/adt/arrayfuncs.c:6705 +#: utils/adt/arrayfuncs.c:6695 #, c-format msgid "thresholds array must not contain NULLs" msgstr "閾値配列にはNULL値を含めてはいけません" -#: utils/adt/arrayfuncs.c:6938 +#: utils/adt/arrayfuncs.c:6928 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "削除する要素の数は0と%dとの間でなければなりません" @@ -24657,9 +24106,9 @@ msgid "encoding conversion from %s to ASCII not supported" msgstr "%s符号化方式からASCIIへの変換はサポートされていません" #. translator: first %s is inet or cidr -#: utils/adt/bool.c:150 utils/adt/cash.c:354 utils/adt/datetime.c:4258 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/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:805 utils/adt/numeric.c:7324 utils/adt/numeric.c:7527 utils/adt/numeric.c:8474 utils/adt/numutils.c:356 utils/adt/numutils.c:617 utils/adt/numutils.c:878 utils/adt/numutils.c:917 utils/adt/numutils.c:939 utils/adt/numutils.c:1003 utils/adt/numutils.c:1025 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:511 utils/adt/uuid.c:172 utils/adt/xid8funcs.c:323 +#: 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\"" @@ -24669,13 +24118,13 @@ msgstr "\"%s\"型の入力構文が不正です: \"%s\"" msgid "money out of range" msgstr "マネー型の値が範囲外です" -#: utils/adt/cash.c:161 utils/adt/cash.c:725 utils/adt/float.c:106 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:3294 utils/adt/numeric.c:3317 utils/adt/numeric.c:3402 utils/adt/numeric.c:3420 utils/adt/numeric.c:3516 utils/adt/numeric.c:9399 -#: utils/adt/numeric.c:9923 utils/adt/numeric.c:10039 utils/adt/numeric.c:11550 utils/adt/timestamp.c:3706 +#: 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:611 utils/adt/numutils.c:872 utils/adt/numutils.c:923 utils/adt/numutils.c:962 utils/adt/numutils.c:1009 +#: 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の範囲外です" @@ -24690,7 +24139,7 @@ msgstr "\"char\"の範囲外です" msgid "could not compute %s hash: %s" msgstr "%sハッシュを計算できませんでした: %s" -#: utils/adt/date.c:64 utils/adt/timestamp.c:117 utils/adt/varbit.c:105 utils/adt/varchar.c:48 +#: 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 "不正な型修飾子です。" @@ -24705,125 +24154,125 @@ msgstr "(%d)%sの精度は負ではいけません" msgid "TIME(%d)%s precision reduced to maximum allowed, %d" msgstr "TIME(%d)%sの位取りを許容最大値%dまで減らしました" -#: utils/adt/date.c:167 utils/adt/date.c:175 utils/adt/formatting.c:4171 utils/adt/formatting.c:4180 utils/adt/formatting.c:4285 utils/adt/formatting.c:4295 +#: 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:539 utils/adt/date.c:563 utils/adt/rangetypes.c:1584 utils/adt/rangetypes.c:1599 utils/adt/xml.c:2552 +#: 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:2565 #, c-format msgid "date out of range" msgstr "日付が範囲外です" -#: utils/adt/date.c:265 utils/adt/date.c:275 utils/adt/timestamp.c:599 +#: 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:282 utils/adt/date.c:291 utils/adt/timestamp.c:605 +#: 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:514 +#: utils/adt/date.c:495 #, c-format msgid "cannot subtract infinite dates" msgstr "無限大の日付は減算できません" -#: utils/adt/date.c:612 utils/adt/date.c:675 utils/adt/date.c:711 utils/adt/date.c:2925 utils/adt/date.c:2935 +#: 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:1141 utils/adt/date.c:1224 utils/adt/date.c:1240 utils/adt/date.c:2234 utils/adt/date.c:3030 utils/adt/timestamp.c:4658 utils/adt/timestamp.c:4749 utils/adt/timestamp.c:4897 utils/adt/timestamp.c:4998 utils/adt/timestamp.c:5113 utils/adt/timestamp.c:5165 utils/adt/timestamp.c:5422 utils/adt/timestamp.c:5623 utils/adt/timestamp.c:5670 utils/adt/timestamp.c:5894 utils/adt/timestamp.c:5941 utils/adt/timestamp.c:6022 utils/adt/timestamp.c:6166 +#: 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:1249 utils/adt/date.c:2250 utils/adt/date.c:3050 utils/adt/timestamp.c:4763 utils/adt/timestamp.c:5015 utils/adt/timestamp.c:5179 utils/adt/timestamp.c:5382 utils/adt/timestamp.c:5679 utils/adt/timestamp.c:5950 utils/adt/timestamp.c:5991 utils/adt/timestamp.c:6227 +#: 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:1333 utils/adt/date.c:1379 utils/adt/date.c:1938 utils/adt/date.c:1969 utils/adt/date.c:1998 utils/adt/date.c:2888 utils/adt/date.c:3120 utils/adt/datetime.c:432 utils/adt/datetime.c:1817 utils/adt/formatting.c:4016 utils/adt/formatting.c:4052 utils/adt/formatting.c:4139 utils/adt/formatting.c:4261 utils/adt/json.c:375 utils/adt/json.c:414 utils/adt/timestamp.c:249 utils/adt/timestamp.c:281 utils/adt/timestamp.c:706 utils/adt/timestamp.c:715 -#: utils/adt/timestamp.c:793 utils/adt/timestamp.c:826 utils/adt/timestamp.c:3059 utils/adt/timestamp.c:3068 utils/adt/timestamp.c:3085 utils/adt/timestamp.c:3090 utils/adt/timestamp.c:3109 utils/adt/timestamp.c:3122 utils/adt/timestamp.c:3133 utils/adt/timestamp.c:3139 utils/adt/timestamp.c:3145 utils/adt/timestamp.c:3150 utils/adt/timestamp.c:3203 utils/adt/timestamp.c:3212 utils/adt/timestamp.c:3233 utils/adt/timestamp.c:3238 utils/adt/timestamp.c:3259 -#: utils/adt/timestamp.c:3272 utils/adt/timestamp.c:3286 utils/adt/timestamp.c:3294 utils/adt/timestamp.c:3300 utils/adt/timestamp.c:3305 utils/adt/timestamp.c:4373 utils/adt/timestamp.c:4525 utils/adt/timestamp.c:4601 utils/adt/timestamp.c:4667 utils/adt/timestamp.c:4757 utils/adt/timestamp.c:4836 utils/adt/timestamp.c:4906 utils/adt/timestamp.c:5009 utils/adt/timestamp.c:5487 utils/adt/timestamp.c:5761 utils/adt/timestamp.c:6295 utils/adt/timestamp.c:6305 -#: utils/adt/timestamp.c:6310 utils/adt/timestamp.c:6316 utils/adt/timestamp.c:6356 utils/adt/timestamp.c:6443 utils/adt/timestamp.c:6484 utils/adt/timestamp.c:6488 utils/adt/timestamp.c:6542 utils/adt/timestamp.c:6546 utils/adt/timestamp.c:6552 utils/adt/timestamp.c:6593 utils/adt/xml.c:2574 utils/adt/xml.c:2581 utils/adt/xml.c:2601 utils/adt/xml.c:2608 +#: 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:2587 utils/adt/xml.c:2594 utils/adt/xml.c:2614 utils/adt/xml.c:2621 #, c-format msgid "timestamp out of range" msgstr "timestampの範囲外です" -#: utils/adt/date.c:1555 utils/adt/date.c:2371 utils/adt/formatting.c:4344 +#: 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:1607 utils/adt/timestamp.c:614 +#: 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:2039 +#: utils/adt/date.c:2020 #, c-format msgid "cannot convert infinite interval to time" msgstr "無限大のintervalはtimeに変換できません" -#: utils/adt/date.c:2080 utils/adt/date.c:2624 +#: 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:2103 utils/adt/date.c:2651 +#: 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:2134 utils/adt/date.c:2686 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:413 utils/adt/numeric.c:2698 utils/adt/timestamp.c:3803 utils/adt/timestamp.c:3840 utils/adt/timestamp.c:3881 +#: 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:2379 +#: utils/adt/date.c:2360 #, c-format msgid "time zone displacement out of range" msgstr "タイムゾーンの置換が範囲外です" -#: utils/adt/date.c:3151 utils/adt/timestamp.c:6338 utils/adt/timestamp.c:6575 +#: 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:3158 utils/adt/timestamp.c:6345 utils/adt/timestamp.c:6582 +#: 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:3324 utils/adt/datetime.c:4243 utils/adt/datetime.c:4249 utils/adt/timestamp.c:529 +#: 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:4217 utils/adt/datetime.c:4224 +#: 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:4226 +#: utils/adt/datetime.c:4110 #, c-format -msgid "Perhaps you need a different \"DateStyle\" setting." -msgstr "他の\"DateStyle\"設定が必要かもしれません。" +msgid "Perhaps you need a different \"datestyle\" setting." +msgstr "他の\"datestyle\"設定が必要かもしれません。" -#: utils/adt/datetime.c:4231 +#: utils/adt/datetime.c:4115 #, c-format msgid "interval field value out of range: \"%s\"" msgstr "intervalフィールドの値が範囲外です: \"%s\"" -#: utils/adt/datetime.c:4237 +#: utils/adt/datetime.c:4121 #, c-format msgid "time zone displacement out of range: \"%s\"" msgstr "タイムゾーンの置換が範囲外です: \"%s\"" -#: utils/adt/datetime.c:4251 +#: utils/adt/datetime.c:4135 #, c-format msgid "This time zone name appears in the configuration file for time zone abbreviation \"%s\"." msgstr "このタイムゾーンはタイムゾーン省略名\"%s\"の構成ファイルにあるようです。" @@ -24833,22 +24282,17 @@ msgstr "このタイムゾーンはタイムゾーン省略名\"%s\"の構成フ msgid "invalid Datum pointer" msgstr "不正なDatumポインタ" -#: utils/adt/dbsize.c:293 utils/adt/genfile.c:656 -#, c-format -msgid "tablespace with OID %u does not exist" -msgstr "OID %uのテーブル空間は存在しません" - -#: utils/adt/dbsize.c:782 utils/adt/dbsize.c:858 +#: utils/adt/dbsize.c:764 utils/adt/dbsize.c:840 #, c-format msgid "invalid size: \"%s\"" msgstr "不正なサイズ: \"%s\"" -#: utils/adt/dbsize.c:859 +#: utils/adt/dbsize.c:841 #, c-format msgid "Invalid size unit: \"%s\"." msgstr "不正なサイズの単位: \"%s\"" -#: utils/adt/dbsize.c:860 +#: 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\"です。" @@ -24873,32 +24317,32 @@ msgstr "エンコーディング変換の結果が大きすぎです" msgid "result of decoding conversion is too large" msgstr "デコード変換の結果が大きすぎます" -#: utils/adt/encode.c:238 utils/adt/encode.c:248 +#: utils/adt/encode.c:217 utils/adt/encode.c:227 #, c-format msgid "invalid hexadecimal digit: \"%.*s\"" msgstr "不正な16進数表現: \"%.*s\"" -#: utils/adt/encode.c:244 +#: utils/adt/encode.c:223 #, c-format msgid "invalid hexadecimal data: odd number of digits" msgstr "不正な16進数データ: 桁数が奇数です" -#: utils/adt/encode.c:365 +#: utils/adt/encode.c:344 #, c-format msgid "unexpected \"=\" while decoding base64 sequence" msgstr "base64シーケンスのデコード中に想定外の\"=\"" -#: utils/adt/encode.c:377 +#: utils/adt/encode.c:356 #, c-format msgid "invalid symbol \"%.*s\" found while decoding base64 sequence" msgstr "base64シーケンスのデコード中に検出された不正なシンボル\"%.*s\"" -#: utils/adt/encode.c:398 +#: utils/adt/encode.c:377 #, c-format msgid "invalid base64 end sequence" msgstr "不正なbase64終了シーケンス" -#: utils/adt/encode.c:399 +#: utils/adt/encode.c:378 #, c-format msgid "Input data is missing padding, is truncated, or is otherwise corrupted." msgstr "入力データにパディングがありません、切り詰められたかさもなければ壊れています。" @@ -24933,355 +24377,335 @@ msgstr "実際の列挙型を特定できませんでした" msgid "enum %s contains no values" msgstr "列挙型 %s に値がありません" -#: utils/adt/float.c:90 +#: utils/adt/float.c:83 #, c-format msgid "value out of range: overflow" msgstr "範囲外の値です: オーバーフロー" -#: utils/adt/float.c:98 +#: utils/adt/float.c:91 #, c-format msgid "value out of range: underflow" msgstr "範囲外の値です: アンダーフロー" -#: utils/adt/float.c:287 +#: utils/adt/float.c:280 #, c-format msgid "\"%s\" is out of range for type real" msgstr "型realでは\"%s\"は範囲外です" -#: utils/adt/float.c:489 +#: 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:1254 utils/adt/float.c:1328 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:4696 utils/adt/numeric.c:4701 +#: 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:1454 utils/adt/numeric.c:3812 utils/adt/numeric.c:10454 +#: 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:1522 utils/adt/numeric.c:4100 utils/adt/numeric.c:4212 +#: 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:1526 utils/adt/numeric.c:4104 utils/adt/numeric.c:11345 +#: 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:1702 utils/adt/float.c:1735 utils/adt/numeric.c:4012 utils/adt/numeric.c:11125 +#: 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:1706 utils/adt/float.c:1739 utils/adt/numeric.c:3950 utils/adt/numeric.c:4007 utils/adt/numeric.c:11129 +#: 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: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 "入力が範囲外です" -#: utils/adt/float.c:3997 utils/adt/numeric.c:1979 +#: 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:4002 utils/adt/numeric.c:1990 +#: 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:4008 utils/adt/numeric.c:1995 +#: 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:4074 utils/adt/numeric.c:2009 +#: utils/adt/float.c:4077 utils/adt/numeric.c:1887 #, c-format msgid "lower bound cannot equal upper bound" msgstr "下限を上限と同じにできません" -#: utils/adt/formatting.c:556 +#: utils/adt/formatting.c:530 #, c-format msgid "invalid format specification for an interval value" msgstr "\"tinterval\"値に対する不正な書式指定" -#: utils/adt/formatting.c:557 +#: utils/adt/formatting.c:531 #, c-format msgid "Intervals are not tied to specific calendar dates." msgstr "時間間隔が特定の暦日付に結びついていません" -#: utils/adt/formatting.c:1197 +#: utils/adt/formatting.c:1161 #, c-format msgid "\"EEEE\" must be the last pattern used" msgstr "\"EEEE\"は最終パターンでなければなりません。" -#: utils/adt/formatting.c:1205 +#: utils/adt/formatting.c:1169 #, c-format msgid "\"9\" must be ahead of \"PR\"" msgstr "\"9\"は\"PR\"の前になければなりません" -#: utils/adt/formatting.c:1221 +#: utils/adt/formatting.c:1185 #, c-format msgid "\"0\" must be ahead of \"PR\"" msgstr "\"0\"は\"PR\"の前になければなりません" -#: utils/adt/formatting.c:1248 +#: utils/adt/formatting.c:1212 #, c-format msgid "multiple decimal points" msgstr "複数の小数点があります" -#: utils/adt/formatting.c:1252 utils/adt/formatting.c:1339 +#: 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:1264 +#: utils/adt/formatting.c:1228 #, c-format msgid "cannot use \"S\" twice" msgstr "\"S\"は1回しか使用できません" -#: utils/adt/formatting.c:1268 +#: 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:1288 +#: utils/adt/formatting.c:1252 #, c-format msgid "cannot use \"S\" and \"MI\" together" msgstr "\"S\"と\"MI\"を混在できません" -#: utils/adt/formatting.c:1298 +#: utils/adt/formatting.c:1262 #, c-format msgid "cannot use \"S\" and \"PL\" together" msgstr "\"S\"と\"PL\"を混在できません" -#: utils/adt/formatting.c:1308 +#: utils/adt/formatting.c:1272 #, c-format msgid "cannot use \"S\" and \"SG\" together" msgstr "\"S\"と\"SG\"を混在できません" -#: utils/adt/formatting.c:1317 +#: 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:1326 -#, c-format -msgid "cannot use \"RN\" twice" -msgstr "\"RN\"は1回しか使用できません" - -#: utils/adt/formatting.c:1347 +#: utils/adt/formatting.c:1307 #, c-format msgid "cannot use \"EEEE\" twice" msgstr "\"EEEE\"は1回しか使用できません" -#: utils/adt/formatting.c:1353 +#: utils/adt/formatting.c:1313 #, c-format msgid "\"EEEE\" is incompatible with other formats" msgstr "\"EEEE\"が他のフォーマットと互換性がありません" -#: utils/adt/formatting.c:1354 +#: 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:1363 -#, c-format -msgid "\"RN\" is incompatible with other formats" -msgstr "\"RN\"が他のフォーマットと互換性がありません" - -#: utils/adt/formatting.c:1364 -#, c-format -msgid "\"RN\" may only be used together with \"FM\"." -msgstr "\"RN\"は\"FM\"と共にのみ使用できます。" - -#: utils/adt/formatting.c:1445 +#: utils/adt/formatting.c:1398 #, c-format msgid "invalid datetime format separator: \"%s\"" msgstr "不正なdatetime書式のセパレータ: \"%s\"" -#: utils/adt/formatting.c:1572 +#: utils/adt/formatting.c:1525 #, c-format msgid "\"%s\" is not a number" msgstr "\"%s\"は数値ではありません" -#: utils/adt/formatting.c:1653 utils/adt/formatting.c:1717 utils/adt/formatting.c:1781 utils/adt/formatting.c:1845 +#: utils/adt/formatting.c:1603 #, c-format -msgid "could not determine which collation to use for %s function" -msgstr "%s 関数に対して使用する照合順序を特定できませんでした" +msgid "case conversion failed: %s" +msgstr "文字ケースの変換に失敗しました: %s" -#: utils/adt/formatting.c:1853 +#: utils/adt/formatting.c:1651 utils/adt/formatting.c:1799 utils/adt/formatting.c:1989 #, c-format -msgid "Unicode case folding can only be performed if server encoding is UTF8" -msgstr "UnicodeケースフォールディングはサーバーエンコーディングがUTF-8の場合にのみ実行可能です" +msgid "could not determine which collation to use for %s function" +msgstr "%s 関数に対して使用する照合順序を特定できませんでした" -#: utils/adt/formatting.c:2150 +#: utils/adt/formatting.c:2410 #, c-format msgid "invalid combination of date conventions" msgstr "不正な暦法の組み合わせ" -#: utils/adt/formatting.c:2151 +#: 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:2173 +#: utils/adt/formatting.c:2433 #, c-format msgid "conflicting values for \"%s\" field in formatting string" msgstr "書式文字列中で\"%s\"フィールドの値が衝突しています" -#: utils/adt/formatting.c:2175 +#: utils/adt/formatting.c:2435 #, c-format msgid "This value contradicts a previous setting for the same field type." msgstr "この値は同じフィールド型に対する以前の設定と矛盾しています" -#: utils/adt/formatting.c:2242 +#: utils/adt/formatting.c:2502 #, c-format msgid "source string too short for \"%s\" formatting field" msgstr "書式フィールド\"%s\"に対して元の文字列が短すぎます" -#: utils/adt/formatting.c:2244 +#: utils/adt/formatting.c:2504 #, c-format msgid "Field requires %d characters, but only %d remain." msgstr "フィールドには%d文字必要ですが、%d文字しか残っていません。" -#: utils/adt/formatting.c:2246 utils/adt/formatting.c:2260 +#: 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:2256 utils/adt/formatting.c:2269 utils/adt/formatting.c:2490 utils/adt/formatting.c:3390 +#: 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:2258 +#: 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:2271 +#: utils/adt/formatting.c:2531 #, c-format msgid "Value must be an integer." msgstr "値は整数でなければなりません。" -#: utils/adt/formatting.c:2276 +#: utils/adt/formatting.c:2536 #, c-format msgid "value for \"%s\" in source string is out of range" msgstr "もとの文字列において\"%s\"に対応する値が範囲外です" -#: utils/adt/formatting.c:2278 +#: utils/adt/formatting.c:2538 #, c-format msgid "Value must be in the range %d to %d." msgstr "値は%dから%dまでの範囲でなければなりません。" -#: utils/adt/formatting.c:2492 +#: 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:2708 utils/adt/formatting.c:2728 utils/adt/formatting.c:2748 utils/adt/formatting.c:2768 utils/adt/formatting.c:2787 utils/adt/formatting.c:2806 utils/adt/formatting.c:2830 utils/adt/formatting.c:2848 utils/adt/formatting.c:2866 utils/adt/formatting.c:2884 utils/adt/formatting.c:2901 utils/adt/formatting.c:2918 +#: 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:3198 +#: utils/adt/formatting.c:3458 #, c-format msgid "unmatched format separator \"%c\"" msgstr "合致しないフォーマットセパレータ \"%c\"" -#: utils/adt/formatting.c:3259 +#: utils/adt/formatting.c:3519 #, c-format msgid "unmatched format character \"%s\"" msgstr "合致しないフォーマット文字\"%s\"" -#: utils/adt/formatting.c:3392 +#: utils/adt/formatting.c:3652 #, c-format msgid "Time zone abbreviation is not recognized." msgstr "タイムゾーン省略名が認識されません。" -#: utils/adt/formatting.c:3593 +#: utils/adt/formatting.c:3853 #, c-format msgid "invalid input string for \"Y,YYY\"" msgstr " \"Y,YYY\"に対応する入力文字列が不正です" -#: utils/adt/formatting.c:3600 -#, c-format -msgid "value for \"Y,YYY\" in source string is out of range" -msgstr "もとの文字列内の\"Y,YYY\"に対応する値が範囲外です" - -#: utils/adt/formatting.c:3689 +#: utils/adt/formatting.c:3942 #, c-format msgid "input string is too short for datetime format" msgstr "datetime書式に対して入力文字列が短すぎます" -#: utils/adt/formatting.c:3697 +#: utils/adt/formatting.c:3950 #, c-format msgid "trailing characters remain in input string after datetime format" msgstr "datetimeフォーマット後に文字が入力文字列中に残っています" -#: utils/adt/formatting.c:4241 +#: utils/adt/formatting.c:4494 #, c-format msgid "missing time zone in input string for type timestamptz" msgstr "timestamptz型に対応する入力に時間帯がありません" -#: utils/adt/formatting.c:4247 +#: utils/adt/formatting.c:4500 #, c-format msgid "timestamptz out of range" msgstr "timestamptzの範囲外です" -#: utils/adt/formatting.c:4275 +#: utils/adt/formatting.c:4528 #, c-format msgid "datetime format is zoned but not timed" msgstr "datetimeフォーマットで時間帯は指定されていますが、時刻が指定されていません" -#: utils/adt/formatting.c:4324 +#: utils/adt/formatting.c:4577 #, c-format msgid "missing time zone in input string for type timetz" msgstr "timetz型に対する入力文字列中に時間帯がありません" -#: utils/adt/formatting.c:4330 +#: utils/adt/formatting.c:4583 #, c-format msgid "timetz out of range" msgstr "timetzの範囲外です" -#: utils/adt/formatting.c:4356 +#: utils/adt/formatting.c:4609 #, c-format msgid "datetime format is not dated and not timed" msgstr "datetimeフォーマットで日付は指定されていますが、時間が指定されていません" -#: utils/adt/formatting.c:4533 +#: utils/adt/formatting.c:4786 #, c-format msgid "hour \"%d\" is invalid for the 12-hour clock" msgstr "12時間形式では\"%d\"時は不正です" -#: utils/adt/formatting.c:4535 +#: 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:4712 +#: utils/adt/formatting.c:4900 #, c-format msgid "cannot calculate day of year without year information" msgstr "年の情報なしでは年内の日数は計算できません" -#: utils/adt/formatting.c:5833 +#: utils/adt/formatting.c:5852 #, c-format msgid "\"EEEE\" not supported for input" msgstr "\"EEEE\"は入力としてサポートしていません" -#: utils/adt/formatting.c:6110 +#: utils/adt/formatting.c:5864 #, c-format -msgid "invalid Roman numeral" -msgstr "不正なローマ数字" +msgid "\"RN\" not supported for input" +msgstr "\"RN\"は入力としてサポートしていません" #: utils/adt/genfile.c:84 #, c-format @@ -25293,7 +24717,7 @@ msgstr "絶対パスは許可されていません" msgid "path must be in or below the data directory" msgstr "パスはデータディレクトリ内もしくはより下層でなければなりません" -#: utils/adt/genfile.c:114 utils/adt/oracle_compat.c:206 utils/adt/oracle_compat.c:304 utils/adt/oracle_compat.c:855 utils/adt/oracle_compat.c:1158 +#: 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 "要求した長さが長すぎます" @@ -25308,6 +24732,11 @@ msgstr "ファイル\"%s\"をシークできませんでした: %m" 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" @@ -25358,13 +24787,13 @@ msgstr "少なくとも2ポイントを要求しなければなりません" msgid "invalid int2vector data" msgstr "不正なint2vectorデータ" -#: utils/adt/int.c:1529 utils/adt/int8.c:1403 utils/adt/numeric.c:1767 utils/adt/timestamp.c:6642 utils/adt/timestamp.c:6728 +#: 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: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:4645 utils/adt/rangetypes.c:1535 utils/adt/rangetypes.c:1548 utils/adt/varbit.c:1676 +#: 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の範囲外です" @@ -25374,48 +24803,48 @@ msgstr "bigintの範囲外です" msgid "OID out of range" msgstr "OIDの範囲外です" -#: utils/adt/json.c:204 utils/adt/jsonb.c:664 +#: 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:1043 utils/adt/json.c:1053 utils/fmgr/funcapi.c:2090 +#: 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:1076 utils/adt/json.c:1275 utils/adt/json.c:1457 utils/adt/json.c:1531 utils/adt/jsonb.c:1333 utils/adt/jsonb.c:1423 +#: 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:1126 utils/adt/json.c:1297 +#: 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:1235 utils/adt/jsonb.c:1134 +#: 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:1237 utils/adt/jsonb.c:1136 +#: 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:1435 utils/adt/jsonb.c:1311 +#: utils/adt/json.c:1427 utils/adt/jsonb.c:1311 #, c-format msgid "array must have two columns" msgstr "配列は最低でも2つの列が必要です" -#: utils/adt/json.c:1520 utils/adt/jsonb.c:1412 +#: utils/adt/json.c:1516 utils/adt/jsonb.c:1412 #, c-format msgid "mismatched array dimensions" msgstr "配列の次元が合っていません" -#: utils/adt/json.c:1850 utils/adt/jsonb_util.c:1963 +#: utils/adt/json.c:1702 utils/adt/jsonb_util.c:1956 #, c-format msgid "duplicate JSON object key value" msgstr "JSONオブジェクトキー値の重複" @@ -25480,22 +24909,22 @@ msgstr "jsonbオブジェクトは%s型へはキャストできません" msgid "cannot cast jsonb array or object to type %s" msgstr "jsonbの配列またはオブジェクトは%s型へはキャストできません" -#: utils/adt/jsonb_util.c:763 +#: 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:804 +#: 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:1678 utils/adt/jsonb_util.c:1698 +#: 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:1759 utils/adt/jsonb_util.c:1794 utils/adt/jsonb_util.c:1814 +#: 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を超えています" @@ -25530,204 +24959,204 @@ msgstr "jsonb添字はテキスト型でなければなりません" msgid "jsonb subscript in assignment must not be null" msgstr "代入におけるjsonb添え字はnullにはできません" -#: utils/adt/jsonfuncs.c:584 utils/adt/jsonfuncs.c:831 utils/adt/jsonfuncs.c:2440 utils/adt/jsonfuncs.c:3016 utils/adt/jsonfuncs.c:3949 utils/adt/jsonfuncs.c:4296 +#: 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:589 utils/adt/jsonfuncs.c:816 utils/adt/jsonfuncs.c:3018 utils/adt/jsonfuncs.c:3936 +#: 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:725 +#: 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:1884 utils/adt/jsonfuncs.c:1921 +#: 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:1888 utils/adt/jsonfuncs.c:1907 +#: 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:1987 +#: utils/adt/jsonfuncs.c:1986 #, c-format msgid "cannot call %s on a non-object" msgstr "非オブジェクトに対して%sは呼び出せません" -#: utils/adt/jsonfuncs.c:2175 +#: utils/adt/jsonfuncs.c:2174 #, c-format msgid "cannot deconstruct an array as an object" msgstr "配列をオブジェクトとして再構築することはできません" -#: utils/adt/jsonfuncs.c:2189 +#: utils/adt/jsonfuncs.c:2188 #, c-format msgid "cannot deconstruct a scalar" msgstr "スカラを再構築することはできません" -#: utils/adt/jsonfuncs.c:2234 +#: utils/adt/jsonfuncs.c:2233 #, c-format msgid "cannot extract elements from a scalar" msgstr "スカラから要素を取り出すことはできません" -#: utils/adt/jsonfuncs.c:2238 +#: utils/adt/jsonfuncs.c:2237 #, c-format msgid "cannot extract elements from an object" msgstr "オブジェクトから要素を取り出すことはできません" -#: utils/adt/jsonfuncs.c:2425 utils/adt/jsonfuncs.c:4174 +#: 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:2516 utils/adt/jsonfuncs.c:2521 utils/adt/jsonfuncs.c:2539 utils/adt/jsonfuncs.c:2545 +#: 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:2517 +#: utils/adt/jsonfuncs.c:2516 #, c-format msgid "See the value of key \"%s\"." msgstr "キー\"%s\"の値を見てください。" -#: utils/adt/jsonfuncs.c:2540 +#: utils/adt/jsonfuncs.c:2539 #, c-format msgid "See the array element %s of key \"%s\"." msgstr "キー\"%s\"の配列要素%sを見てください。" -#: utils/adt/jsonfuncs.c:2546 +#: utils/adt/jsonfuncs.c:2545 #, c-format msgid "See the array element %s." msgstr "配列要素%sを見てください。" -#: utils/adt/jsonfuncs.c:2598 +#: 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:3648 +#: 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:3672 +#: utils/adt/jsonfuncs.c:3671 #, c-format msgid "could not determine row type for result of %s" msgstr "%sの結果に対応する行の型を決定できませんでした" -#: utils/adt/jsonfuncs.c:3674 +#: 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:4060 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:4191 utils/adt/jsonfuncs.c:4275 +#: 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:4224 +#: utils/adt/jsonfuncs.c:4223 #, c-format msgid "cannot call %s on an object" msgstr "オブジェクトに対して%sを呼び出すことはできません" -#: utils/adt/jsonfuncs.c:4657 utils/adt/jsonfuncs.c:4716 utils/adt/jsonfuncs.c:4796 +#: 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:4801 +#: utils/adt/jsonfuncs.c:4800 #, c-format msgid "cannot delete from object using integer index" msgstr "オブジェクトから整数添字を使って削除することはできません" -#: utils/adt/jsonfuncs.c:4869 utils/adt/jsonfuncs.c:5028 +#: utils/adt/jsonfuncs.c:4868 utils/adt/jsonfuncs.c:5027 #, c-format msgid "cannot set path in scalar" msgstr "スカラにパスを設定することはできません" -#: utils/adt/jsonfuncs.c:4910 utils/adt/jsonfuncs.c:4952 +#: 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:4923 +#: utils/adt/jsonfuncs.c:4922 #, c-format msgid "JSON value must not be null" msgstr "JSON値はnullではあってはなりません" -#: utils/adt/jsonfuncs.c:4924 +#: 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:4925 +#: 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:4980 +#: utils/adt/jsonfuncs.c:4979 #, c-format msgid "cannot delete path in scalar" msgstr "スカラでパスを削除することはできません" -#: utils/adt/jsonfuncs.c:5194 +#: utils/adt/jsonfuncs.c:5193 #, c-format msgid "path element at position %d is null" msgstr "位置%dのパス要素がnullです" -#: utils/adt/jsonfuncs.c:5213 utils/adt/jsonfuncs.c:5244 utils/adt/jsonfuncs.c:5317 +#: 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:5214 utils/adt/jsonfuncs.c:5245 +#: 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:5318 +#: 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:5422 +#: 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:5439 +#: 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:5591 +#: utils/adt/jsonfuncs.c:5590 #, c-format msgid "wrong flag type, only arrays and scalars are allowed" msgstr "間違ったフラグのタイプ; 配列およびスカラのみ使用可能です" -#: utils/adt/jsonfuncs.c:5598 +#: utils/adt/jsonfuncs.c:5597 #, c-format msgid "flag array element is not a string" msgstr "フラグ配列の要素が文字列ではありません" -#: utils/adt/jsonfuncs.c:5599 utils/adt/jsonfuncs.c:5621 +#: 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:5619 +#: utils/adt/jsonfuncs.c:5618 #, c-format msgid "wrong flag in flag array: \"%s\"" msgstr "フラグ配列内の間違ったフラグ値: \"%s\"" @@ -25742,192 +25171,212 @@ msgstr "ルート式では@を使用できません" msgid "LAST is allowed only in array subscripts" msgstr "LAST は配列の添え字でのみ使用可能です" -#: utils/adt/jsonpath_exec.c:489 +#: utils/adt/jsonpath_exec.c:491 #, c-format msgid "single boolean result is expected" msgstr "単一のブール値の結果が必要です" -#: utils/adt/jsonpath_exec.c:849 +#: 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:872 +#: 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:921 +#: utils/adt/jsonpath_exec.c:923 #, c-format msgid "jsonpath array subscript is out of bounds" msgstr "jsonpath配列の添え字が範囲外です" -#: utils/adt/jsonpath_exec.c:978 +#: 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:1042 +#: utils/adt/jsonpath_exec.c:1044 #, c-format msgid "JSON object does not contain key \"%s\"" msgstr "JSONオブジェクトはキー\"%s\"を含んでいません" -#: utils/adt/jsonpath_exec.c:1054 +#: 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:1112 +#: 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:1165 utils/adt/jsonpath_exec.c:1191 utils/adt/jsonpath_exec.c:1279 utils/adt/jsonpath_exec.c:1304 utils/adt/jsonpath_exec.c:1356 utils/adt/jsonpath_exec.c:1376 utils/adt/jsonpath_exec.c:1438 utils/adt/jsonpath_exec.c:1527 utils/adt/jsonpath_exec.c:1560 utils/adt/jsonpath_exec.c:1584 +#: 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 %s" -msgstr "jsonpath項目メソッド .%2$s() の引数\"%1$s\"が型%3$sに適合しません" +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:1170 utils/adt/jsonpath_exec.c:1196 utils/adt/jsonpath_exec.c:1413 utils/adt/jsonpath_exec.c:1445 +#: 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 "NaN or Infinity is not allowed for jsonpath item method .%s()" msgstr "NaNとInifinityはjsonpath項目メソッド .%s() では使用できません" -#: utils/adt/jsonpath_exec.c:1209 utils/adt/jsonpath_exec.c:1312 utils/adt/jsonpath_exec.c:1454 utils/adt/jsonpath_exec.c:1592 +#: 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:1385 +#: 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 "jsonpath項目メソッド .%2$s() の引数\"%1$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 "jsonpath項目メソッド .%2$s() の引数\"%1$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() は真偽値、文字列または数値にのみ適用可能です" -#: utils/adt/jsonpath_exec.c:1486 +#: 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 "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:1500 +#: 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:1647 +#: 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:2136 +#: 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:2143 +#: 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:2211 +#: 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:2310 +#: 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:2356 +#: 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:2449 +#: utils/adt/jsonpath_exec.c:2450 #, c-format msgid "time precision of jsonpath item method .%s() is out of range for type integer" msgstr "JSONパス項目メソッド .%s() の日付時刻精度がinteger型の範囲外です" -#: utils/adt/jsonpath_exec.c:2483 utils/adt/jsonpath_exec.c:2489 utils/adt/jsonpath_exec.c:2516 utils/adt/jsonpath_exec.c:2544 utils/adt/jsonpath_exec.c:2597 utils/adt/jsonpath_exec.c:2648 utils/adt/jsonpath_exec.c:2719 +#: 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:2485 +#: 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:2678 utils/adt/jsonpath_exec.c:2759 +#: 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:2839 +#: 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:3123 +#: 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:3157 +#: utils/adt/jsonpath_exec.c:3158 #, c-format msgid "could not find jsonpath variable \"%s\"" msgstr "jsonpath変数\"%s\"が見つかりませんでした" -#: utils/adt/jsonpath_exec.c:3210 +#: utils/adt/jsonpath_exec.c:3211 #, c-format msgid "\"vars\" argument is not an object" msgstr "引数\"vars\"がオブジェクトではありません" -#: utils/adt/jsonpath_exec.c:3211 +#: 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:3474 +#: 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:3486 +#: utils/adt/jsonpath_exec.c:3487 #, c-format msgid "jsonpath array subscript is out of integer range" msgstr "jsonpath配列の添え字が整数の範囲外です" -#: utils/adt/jsonpath_exec.c:3670 +#: 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:3672 +#: utils/adt/jsonpath_exec.c:3673 #, c-format msgid "Use *_tz() function for time zone support." msgstr "*_tz() 関数を使用することで時間帯がサポートされます。" -#: utils/adt/jsonpath_exec.c:3980 +#: 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:3982 utils/adt/jsonpath_exec.c:3987 +#: 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:3986 +#: 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:4044 utils/adt/jsonpath_exec.c:4068 +#: 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:4049 utils/adt/jsonpath_exec.c:4073 +#: 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パス式は単一のスカラー要素を返却する必要があります" @@ -25937,42 +25386,42 @@ msgstr "JSON_VALUE中のJSONパス式は単一のスカラー要素を返却す msgid "levenshtein argument exceeds maximum length of %d characters" msgstr "レーベンシュタイン距離関数の引数の長さが上限の%d文字を超えています" -#: utils/adt/like.c:162 +#: utils/adt/like.c:159 #, c-format -msgid "could not determine which collation to use for LIKE" -msgstr "LIKE で使用する照合順序を特定できませんでした" +msgid "nondeterministic collations are not supported for LIKE" +msgstr "非決定的照合順序はLIKEではサポートされません" -#: utils/adt/like.c:193 utils/adt/like_support.c:1019 +#: 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ではサポートされません" -#: utils/adt/like_match.c:107 utils/adt/like_match.c:169 utils/adt/like_match.c:237 +#: utils/adt/like_match.c:108 utils/adt/like_match.c:168 #, c-format msgid "LIKE pattern must not end with escape character" msgstr "LIKE パターンはエスケープ文字で終わってはなりません" -#: utils/adt/like_match.c:437 utils/adt/regexp.c:800 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:803 #, c-format msgid "invalid escape string" msgstr "不正なエスケープ文字列" -#: utils/adt/like_match.c:438 utils/adt/regexp.c:801 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:804 #, c-format msgid "Escape string must be empty or one character." msgstr "エスケープ文字は空か1文字でなければなりません。" -#: utils/adt/like_support.c:1009 +#: utils/adt/like_support.c:1013 #, c-format msgid "case insensitive matching not supported on type bytea" msgstr "型byteaでは大文字小文字の区別をしないマッチをサポートしません" -#: utils/adt/like_support.c:1106 +#: utils/adt/like_support.c:1114 #, c-format msgid "regular-expression matching not supported on type bytea" msgstr "型byteaでは正規表現のマッチをサポートしません" @@ -25992,7 +25441,7 @@ msgstr "macaddr8データがmacaddr型に変換するには範囲外です" 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:293 +#: utils/adt/mcxtfuncs.c:173 #, c-format msgid "PID %d is not a PostgreSQL server process" msgstr "PID %dはPostgreSQLサーバープロセスではありません" @@ -26106,7 +25555,7 @@ msgstr "不正なCIDR値: \"%s\"" msgid "Value has bits set to right of mask." msgstr "値ではマスクの右側のビットがセットされています。" -#: utils/adt/network.c:152 utils/adt/network.c:1178 utils/adt/network.c:1203 utils/adt/network.c:1228 +#: 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" @@ -26139,157 +25588,157 @@ msgstr "\"cidr\"の外部値が不正です" msgid "invalid mask length: %d" msgstr "不正なマスク長: %d" -#: utils/adt/network.c:1246 +#: utils/adt/network.c:1252 #, c-format msgid "could not format cidr value: %m" msgstr "cidr値を整形できませんでした: %m" -#: utils/adt/network.c:1479 +#: utils/adt/network.c:1485 #, c-format msgid "cannot merge addresses from different families" msgstr "異なるファミリのアドレスは結合できません" -#: utils/adt/network.c:1887 +#: utils/adt/network.c:1893 #, c-format msgid "cannot AND inet values of different sizes" msgstr "サイズが異なるinet値のANDはできません" -#: utils/adt/network.c:1919 +#: utils/adt/network.c:1925 #, c-format msgid "cannot OR inet values of different sizes" msgstr "サイズが異なるinet値のORはできません" -#: utils/adt/network.c:1980 utils/adt/network.c:2056 +#: utils/adt/network.c:1986 utils/adt/network.c:2062 #, c-format msgid "result is out of range" msgstr "結果が範囲外です" -#: utils/adt/network.c:2021 +#: utils/adt/network.c:2027 #, c-format msgid "cannot subtract inet values of different sizes" msgstr "サイズが異なるinet値の引き算はできません" -#: utils/adt/numeric.c:795 utils/adt/numeric.c:3762 utils/adt/numeric.c:7319 utils/adt/numeric.c:7522 utils/adt/numeric.c:7994 utils/adt/numeric.c:10928 utils/adt/numeric.c:11403 utils/adt/numeric.c:11497 utils/adt/numeric.c:11632 +#: 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:1108 +#: utils/adt/numeric.c:1106 #, c-format msgid "invalid sign in external \"numeric\" value" msgstr "外部\"numeric\"の値の符号が不正です" -#: utils/adt/numeric.c:1114 +#: utils/adt/numeric.c:1112 #, c-format msgid "invalid scale in external \"numeric\" value" msgstr "外部\"numeric\"の値の位取りが不正です" -#: utils/adt/numeric.c:1123 +#: utils/adt/numeric.c:1121 #, c-format msgid "invalid digit in external \"numeric\" value" msgstr "外部\"numeric\"の値の桁が不正です" -#: utils/adt/numeric.c:1338 utils/adt/numeric.c:1352 +#: 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:1343 +#: 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:1361 +#: utils/adt/numeric.c:1359 #, c-format msgid "invalid NUMERIC type modifier" msgstr "不正なNUMERIC型の修正子" -#: utils/adt/numeric.c:1727 +#: utils/adt/numeric.c:1725 #, c-format msgid "start value cannot be NaN" msgstr "開始値はNaNにはできません" -#: utils/adt/numeric.c:1731 +#: utils/adt/numeric.c:1729 #, c-format msgid "start value cannot be infinity" msgstr "開始値は無限大にはできません" -#: utils/adt/numeric.c:1738 +#: utils/adt/numeric.c:1736 #, c-format msgid "stop value cannot be NaN" msgstr "終了値はNaNにはできません" -#: utils/adt/numeric.c:1742 +#: utils/adt/numeric.c:1740 #, c-format msgid "stop value cannot be infinity" msgstr "終了値は無限大にはできません" -#: utils/adt/numeric.c:1755 +#: utils/adt/numeric.c:1753 #, c-format msgid "step size cannot be NaN" msgstr "加算量はNaNにはできません" -#: utils/adt/numeric.c:1759 +#: utils/adt/numeric.c:1757 #, c-format msgid "step size cannot be infinity" msgstr "加算量は無限大にはできません" -#: utils/adt/numeric.c:3752 +#: utils/adt/numeric.c:3649 #, c-format msgid "factorial of a negative number is undefined" msgstr "負数の階乗は定義されていません" -#: utils/adt/numeric.c:4359 +#: utils/adt/numeric.c:4256 #, c-format msgid "lower bound cannot be NaN" msgstr "下限をNaNにすることはできません" -#: utils/adt/numeric.c:4363 +#: utils/adt/numeric.c:4260 #, c-format msgid "lower bound cannot be infinity" msgstr "下限を無限値にすることはできません" -#: utils/adt/numeric.c:4370 +#: utils/adt/numeric.c:4267 #, c-format msgid "upper bound cannot be NaN" msgstr "上限をNaNにすることはできません" -#: utils/adt/numeric.c:4374 +#: utils/adt/numeric.c:4271 #, c-format msgid "upper bound cannot be infinity" msgstr "上限を無限値にすることはできません" -#: utils/adt/numeric.c:4535 utils/adt/numeric.c:4623 utils/adt/numeric.c:4683 utils/adt/numeric.c:4879 +#: 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:4539 utils/adt/numeric.c:4627 utils/adt/numeric.c:4687 utils/adt/numeric.c:4883 +#: 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:4892 +#: utils/adt/numeric.c:4789 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsnの範囲外です" -#: utils/adt/numeric.c:8084 utils/adt/numeric.c:8135 +#: utils/adt/numeric.c:7981 utils/adt/numeric.c:8032 #, c-format msgid "numeric field overflow" msgstr "numericフィールドのオーバーフロー" -#: utils/adt/numeric.c:8085 +#: 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:8136 +#: 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:11701 utils/adt/pseudorandomfuncs.c:135 utils/adt/pseudorandomfuncs.c:159 +#: 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 "下限は上限と同じあるいはより小さい必要があります" @@ -26299,27 +25748,27 @@ msgstr "下限は上限と同じあるいはより小さい必要があります msgid "invalid oidvector data" msgstr "不正なoidvectorデータ" -#: utils/adt/oracle_compat.c:992 +#: utils/adt/oracle_compat.c:976 #, c-format msgid "requested character too large" msgstr "要求された文字が大きすぎます" -#: utils/adt/oracle_compat.c:1036 +#: utils/adt/oracle_compat.c:1020 #, c-format msgid "character number must be positive" msgstr "文字番号は正数でなければなりません" -#: utils/adt/oracle_compat.c:1040 +#: utils/adt/oracle_compat.c:1024 #, c-format msgid "null character not permitted" msgstr "NULL文字は許可されません" -#: utils/adt/oracle_compat.c:1058 utils/adt/oracle_compat.c:1111 +#: 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:1099 +#: utils/adt/oracle_compat.c:1083 #, c-format msgid "requested character not valid for encoding: %u" msgstr "要求された文字は符号化方式に対して不正です: %u" @@ -26329,147 +25778,142 @@ msgstr "要求された文字は符号化方式に対して不正です: %u" msgid "percentile value %g is not between 0 and 1" msgstr "百分位数の値%gが0と1の間ではありません" -#: utils/adt/pg_locale.c:324 utils/adt/pg_locale.c:356 +#: 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:1263 +#: 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: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:1546 +#, c-format +msgid "could not create locale \"%s\": %m" +msgstr "ロケール\"%s\"を作成できませんでした: %m" + +#: 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: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:1717 #, c-format msgid "collation \"%s\" has no actual version, but a version was recorded" msgstr "照合順序\"%s\"には実際のバージョンがありませんが、バージョンが記録されています" -#: utils/adt/pg_locale.c:1269 +#: utils/adt/pg_locale.c:1723 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "照合順序\"%s\"でバージョンの不一致が起きています" -#: utils/adt/pg_locale.c:1271 +#: 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:1274 +#: 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:1625 utils/adt/pg_locale.c:1652 utils/adt/pg_locale_builtin.c:186 +#: 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:1717 +#: utils/adt/pg_locale.c:1814 #, c-format -msgid "could not convert locale name \"%s\" to language tag: %s" -msgstr "ロケール名\"%s\"を、言語タグに変換できませんでした: %s" - -#: utils/adt/pg_locale.c:1726 utils/adt/pg_locale.c:1801 utils/adt/pg_locale_icu.c:221 -#, c-format -msgid "ICU is not supported in this build" -msgstr "このビルドではICUはサポートされていません" - -#: utils/adt/pg_locale.c:1759 -#, c-format -msgid "could not get language from ICU locale \"%s\": %s" -msgstr "ICUロケール\"%s\"から言語を取得できませんでした: %s" - -#: utils/adt/pg_locale.c:1761 utils/adt/pg_locale.c:1791 -#, c-format -msgid "To disable ICU locale validation, set the parameter \"%s\" to \"%s\"." -msgstr "ICUロケールを無効にするには、パラメータ\"%s\"を\"%s\"に設定してください。" - -#: utils/adt/pg_locale.c:1789 -#, c-format -msgid "ICU locale \"%s\" has unknown language \"%s\"" -msgstr "ICUロケール\"%s\"には未知の言語\"%s\"が含まれています" +msgid "could not load locale \"%s\"" +msgstr "ロケール\"%s\"をロードできませんでした" -#: utils/adt/pg_locale_icu.c:270 +#: utils/adt/pg_locale.c:1839 #, c-format -msgid "could not get language from locale \"%s\": %s" -msgstr "ロケール\"%s\"から言語を取得できませんでした: %s" +msgid "could not get collation version for locale \"%s\": error code %lu" +msgstr "ロケール\"%s\"に対応する照合順序バージョンを取得できませんでした: エラーコード %lu" -#: utils/adt/pg_locale_icu.c:292 utils/adt/pg_locale_icu.c:309 +#: utils/adt/pg_locale.c:1895 utils/adt/pg_locale.c:1908 #, c-format -msgid "could not open collator for locale \"%s\": %s" -msgstr "ロケール\"%s\"の照合器をオープンできませんでした: %s" +msgid "could not convert string to UTF-16: error code %lu" +msgstr "文字列をUTF-16に変換できませんでした: エラーコード %lu" -#: utils/adt/pg_locale_icu.c:380 +#: utils/adt/pg_locale.c:1920 #, c-format -msgid "could not open collator for locale \"%s\" with rules \"%s\": %s" -msgstr "ルール\"%2$s\"を持つロケール\"%1$s\"の照合器をオープンできませんでした: %3$s" +msgid "could not compare Unicode strings: %m" +msgstr "Unicode文字列を比較できませんでした: %m" -#: utils/adt/pg_locale_icu.c:494 +#: utils/adt/pg_locale.c:2094 #, c-format msgid "collation failed: %s" msgstr "照合順序による比較に失敗しました: %s" -#: utils/adt/pg_locale_icu.c:573 utils/adt/pg_locale_icu.c:837 +#: 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_icu.c:647 utils/adt/pg_locale_icu.c:659 utils/adt/pg_locale_icu.c:884 utils/adt/pg_locale_icu.c:905 +#: utils/adt/pg_locale.c:2635 #, c-format -msgid "%s failed: %s" -msgstr "%s が失敗しました: %s" +msgid "could not get language from locale \"%s\": %s" +msgstr "ロケール\"%s\"から言語を取得できませんでした: %s" -#: utils/adt/pg_locale_icu.c:688 +#: utils/adt/pg_locale.c:2656 utils/adt/pg_locale.c:2672 #, c-format -msgid "case conversion failed: %s" -msgstr "文字ケースの変換に失敗しました: %s" +msgid "could not open collator for locale \"%s\": %s" +msgstr "ロケール\"%s\"の照合器をオープンできませんでした: %s" -#: utils/adt/pg_locale_icu.c:857 +#: utils/adt/pg_locale.c:2697 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "エンコーディング\"%s\"はICUではサポートされていません" -#: utils/adt/pg_locale_icu.c:864 +#: 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_libc.c:554 +#: 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 "collations with different collate and ctype values are not supported on this platform" -msgstr "このプラットフォームでは値が異なるcollateとctypeによる照合順序をサポートしていません" - -#: utils/adt/pg_locale_libc.c:684 -#, c-format -msgid "could not load locale \"%s\"" -msgstr "ロケール\"%s\"をロードできませんでした" - -#: utils/adt/pg_locale_libc.c:709 -#, c-format -msgid "could not get collation version for locale \"%s\": error code %lu" -msgstr "ロケール\"%s\"に対応する照合順序バージョンを取得できませんでした: エラーコード %lu" +msgid "%s failed: %s" +msgstr "%s が失敗しました: %s" -#: utils/adt/pg_locale_libc.c:772 utils/adt/pg_locale_libc.c:785 +#: utils/adt/pg_locale.c:2983 #, c-format -msgid "could not convert string to UTF-16: error code %lu" -msgstr "文字列をUTF-16に変換できませんでした: エラーコード %lu" +msgid "could not convert locale name \"%s\" to language tag: %s" +msgstr "ロケール名\"%s\"を、言語タグに変換できませんでした: %s" -#: utils/adt/pg_locale_libc.c:794 +#: utils/adt/pg_locale.c:3024 #, c-format -msgid "could not compare Unicode strings: %m" -msgstr "Unicode文字列を比較できませんでした: %m" +msgid "could not get language from ICU locale \"%s\": %s" +msgstr "ICUロケール\"%s\"から言語を取得できませんでした: %s" -#: utils/adt/pg_locale_libc.c:826 +#: utils/adt/pg_locale.c:3026 utils/adt/pg_locale.c:3055 #, c-format -msgid "could not create locale \"%s\": %m" -msgstr "ロケール\"%s\"を作成できませんでした: %m" +msgid "To disable ICU locale validation, set the parameter \"%s\" to \"%s\"." +msgstr "ICUロケールを無効にするには、パラメータ\"%s\"を\"%s\"に設定してください。" -#: utils/adt/pg_locale_libc.c:829 +#: utils/adt/pg_locale.c:3053 #, c-format -msgid "The operating system could not find any locale data for the locale name \"%s\"." -msgstr "オペレーティングシステムはロケール名\"%s\"のロケールデータを見つけられませんでした。" +msgid "ICU locale \"%s\" has unknown language \"%s\"" +msgstr "ICUロケール\"%s\"には未知の言語\"%s\"が含まれています" -#: utils/adt/pg_locale_libc.c:1001 +#: utils/adt/pg_locale.c:3204 #, c-format msgid "invalid multibyte character for locale" msgstr "ロケールに対する不正なマルチバイト文字" -#: utils/adt/pg_locale_libc.c:1002 +#: 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ロケールはデータベースの符号化方式と互換性がありません" @@ -26484,27 +25928,27 @@ msgstr "pg_lsnにNaNは加算できません" msgid "cannot subtract NaN from pg_lsn" msgstr "pg_lsnからNaNは減算できません" -#: utils/adt/pg_upgrade_support.c:38 +#: 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:280 +#: utils/adt/pgstatfuncs.c:252 #, c-format msgid "invalid command name: \"%s\"" msgstr "不正なコマンド名: \"%s\"" -#: utils/adt/pgstatfuncs.c:1908 +#: utils/adt/pgstatfuncs.c:1739 #, c-format msgid "unrecognized reset target: \"%s\"" msgstr "認識できないリセットターゲット: \"%s\"" -#: utils/adt/pgstatfuncs.c:1909 +#: 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:2015 +#: utils/adt/pgstatfuncs.c:1822 #, c-format msgid "invalid subscription OID %u" msgstr "不正なサブスクリプションOID %u" @@ -26589,7 +26033,7 @@ msgstr "カンマが多すぎます" msgid "Junk after right parenthesis or bracket." msgstr "右括弧または右角括弧の後にごみがあります" -#: utils/adt/regexp.c:304 utils/adt/regexp.c:1996 utils/adt/varlena.c:4286 +#: utils/adt/regexp.c:304 utils/adt/regexp.c:2022 utils/adt/varlena.c:4273 #, c-format msgid "regular expression failed: %s" msgstr "正規表現が失敗しました: %s" @@ -26604,28 +26048,28 @@ msgstr "不正な正規表現オプション: \"%.*s\"" 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: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:6817 utils/misc/guc.c:6851 +#: utils/adt/regexp.c:716 utils/adt/regexp.c:725 utils/adt/regexp.c:1108 utils/adt/regexp.c:1172 utils/adt/regexp.c:1181 utils/adt/regexp.c:1190 utils/adt/regexp.c:1199 utils/adt/regexp.c:1879 utils/adt/regexp.c:1888 utils/adt/regexp.c:1897 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:936 +#: utils/adt/regexp.c:939 #, 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: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 +#: utils/adt/regexp.c:1119 utils/adt/regexp.c:1210 utils/adt/regexp.c:1297 utils/adt/regexp.c:1336 utils/adt/regexp.c:1724 utils/adt/regexp.c:1779 utils/adt/regexp.c:1908 #, c-format msgid "%s does not support the \"global\" option" msgstr "%sは\"global\"オプションをサポートしません" -#: utils/adt/regexp.c:1312 +#: utils/adt/regexp.c:1338 #, c-format msgid "Use the regexp_matches function instead." msgstr "代わりにregexp_matchesを使ってください。" -#: utils/adt/regexp.c:1500 +#: utils/adt/regexp.c:1526 #, c-format msgid "too many regular expression matches" msgstr "正規表現のマッチが多過ぎます" @@ -26640,7 +26084,7 @@ msgstr "\"%s\"という名前の関数が複数あります" msgid "more than one operator named %s" msgstr "%sという名前の演算子が複数あります" -#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10767 utils/adt/ruleutils.c:10980 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10526 utils/adt/ruleutils.c:10739 #, c-format msgid "too many arguments" msgstr "引数が多すぎます" @@ -26650,7 +26094,7 @@ msgstr "引数が多すぎます" msgid "Provide two argument types for operator." msgstr "演算子では2つの引数型を指定してください" -#: utils/adt/regproc.c:1564 utils/adt/regproc.c:1681 utils/adt/regproc.c:1810 utils/adt/regproc.c:1815 utils/adt/varlena.c:3388 utils/adt/varlena.c:3393 +#: 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 "不正な名前の構文" @@ -26675,92 +26119,77 @@ msgstr "型の名前を想定していました" msgid "improper type name" msgstr "型の名前が不適切です" -#: utils/adt/ri_triggers.c:313 utils/adt/ri_triggers.c:1774 utils/adt/ri_triggers.c:2773 +#: 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:316 utils/adt/ri_triggers.c:1777 +#: 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:2191 +#: utils/adt/ri_triggers.c:2036 #, c-format msgid "function \"%s\" must be fired for INSERT" msgstr "関数\"%s\"はINSERTで発火しなければなりません" -#: utils/adt/ri_triggers.c:2197 +#: utils/adt/ri_triggers.c:2042 #, c-format msgid "function \"%s\" must be fired for UPDATE" msgstr "関数\"%s\"はUPDATEで発火しなければなりません" -#: utils/adt/ri_triggers.c:2203 +#: utils/adt/ri_triggers.c:2048 #, c-format msgid "function \"%s\" must be fired for DELETE" msgstr "関数\"%s\"はDELETEで発火しなければなりません" -#: utils/adt/ri_triggers.c:2226 +#: 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:2228 +#: 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:2598 +#: 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:2602 +#: 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:2763 +#: 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:2766 utils/adt/ri_triggers.c:2805 +#: 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:2777 +#: 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:2780 +#: utils/adt/ri_triggers.c:2608 #, c-format msgid "Key is not present in table \"%s\"." msgstr "テーブル\"%s\"にキーがありません。" -#: utils/adt/ri_triggers.c:2786 -#, c-format -msgid "update or delete on table \"%s\" violates RESTRICT setting of foreign key constraint \"%s\" on table \"%s\"" -msgstr "テーブル\"%1$s\"の更新または削除は、テーブル\"%3$s\"の外部キー制約\"%2$s\"のRESTRICT設定に違反しています" - -#: utils/adt/ri_triggers.c:2791 -#, c-format -msgid "Key (%s)=(%s) is referenced from table \"%s\"." -msgstr "キー(%s)=(%s)はテーブル\"%s\"から参照されています。" - -#: utils/adt/ri_triggers.c:2794 -#, c-format -msgid "Key is referenced from table \"%s\"." -msgstr "キーがテーブル\"%s\"から参照されています。" - -#: utils/adt/ri_triggers.c:2800 +#: 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:2808 +#: utils/adt/ri_triggers.c:2622 #, c-format msgid "Key is still referenced from table \"%s\"." msgstr "テーブル\"%s\"からキーがまだ参照されています。" @@ -26810,158 +26239,128 @@ msgstr "バイナリデータのレコードカラム%5$dで予期していた%3 msgid "improper binary format in record column %d" msgstr "レコード列%dのバイナリ書式が不適切です" -#: utils/adt/rowtypes.c:949 utils/adt/rowtypes.c:1195 utils/adt/rowtypes.c:1471 utils/adt/rowtypes.c:1717 +#: 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:1040 utils/adt/rowtypes.c:1265 utils/adt/rowtypes.c:1568 utils/adt/rowtypes.c:1753 +#: 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:2737 +#: utils/adt/ruleutils.c:2694 #, c-format msgid "input is a query, not an expression" msgstr "入力が式ではなく文です" -#: utils/adt/ruleutils.c:2749 +#: utils/adt/ruleutils.c:2706 #, c-format msgid "expression contains variables of more than one relation" msgstr "式が2つ以上のリレーションの変数を含んでいます" -#: utils/adt/ruleutils.c:2756 +#: utils/adt/ruleutils.c:2713 #, c-format msgid "expression contains variables" msgstr "式が変数を含んでいます" -#: utils/adt/ruleutils.c:5430 +#: utils/adt/ruleutils.c:5246 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "ルール\"%s\"はサポートしていないイベントタイプ%dを持ちます" -#: utils/adt/tid.c:317 -#, c-format -msgid "cannot look at latest visible tid for relation \"%s.%s\"" -msgstr "リレーション\"%s.%s\"の最新の可視TIDを参照できません" - -#: utils/adt/tid.c:356 -#, c-format -msgid "ctid isn't of type TID" -msgstr "ctidはTID型ではありません" - -#: utils/adt/tid.c:364 -#, c-format -msgid "currtid cannot handle views with no CTID" -msgstr "currtidはCTIDを持たないビューは扱えません" - -#: utils/adt/tid.c:369 -#, c-format -msgid "the view has no rules" -msgstr "このビューにはルールが設定されていません" - -#: utils/adt/tid.c:381 -#, c-format -msgid "only one select rule is allowed in views" -msgstr "ビューではSELECTルールは一つしか設定できません" - -#: utils/adt/timestamp.c:129 +#: utils/adt/timestamp.c:128 #, c-format msgid "TIMESTAMP(%d)%s precision must not be negative" msgstr "TIMESTAMP(%d)%s の精度は負であってはなりません" -#: utils/adt/timestamp.c:135 +#: 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:203 utils/adt/timestamp.c:456 -#, c-format -msgid "timestamp out of range: \"%s\"" -msgstr "timestampが範囲外です: \"%s\"" - -#: utils/adt/timestamp.c:395 +#: 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:513 +#: utils/adt/timestamp.c:512 #, c-format msgid "Numeric time zones must have \"-\" or \"+\" as first character." msgstr "数字タイムゾーンは先頭の文字が\"-\"または\"+\"でなければなりません。" -#: utils/adt/timestamp.c:525 +#: 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:633 +#: 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:734 +#: utils/adt/timestamp.c:744 #, c-format msgid "timestamp cannot be NaN" msgstr "タイムスタンプは NaN にはできません" -#: utils/adt/timestamp.c:752 utils/adt/timestamp.c:764 +#: 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:947 utils/adt/timestamp.c:1506 utils/adt/timestamp.c:1516 utils/adt/timestamp.c:1577 utils/adt/timestamp.c:2800 utils/adt/timestamp.c:2809 utils/adt/timestamp.c:2824 utils/adt/timestamp.c:2898 utils/adt/timestamp.c:2915 utils/adt/timestamp.c:2972 utils/adt/timestamp.c:3015 utils/adt/timestamp.c:3393 utils/adt/timestamp.c:3451 utils/adt/timestamp.c:3474 utils/adt/timestamp.c:3483 utils/adt/timestamp.c:3507 utils/adt/timestamp.c:3530 -#: utils/adt/timestamp.c:3539 utils/adt/timestamp.c:3674 utils/adt/timestamp.c:3775 utils/adt/timestamp.c:4182 utils/adt/timestamp.c:4219 utils/adt/timestamp.c:4267 utils/adt/timestamp.c:4276 utils/adt/timestamp.c:4368 utils/adt/timestamp.c:4415 utils/adt/timestamp.c:4424 utils/adt/timestamp.c:4520 utils/adt/timestamp.c:4573 utils/adt/timestamp.c:4583 utils/adt/timestamp.c:4808 utils/adt/timestamp.c:4818 utils/adt/timestamp.c:5173 +#: 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:1084 utils/adt/timestamp.c:1117 +#: utils/adt/timestamp.c:1094 utils/adt/timestamp.c:1127 #, c-format msgid "invalid INTERVAL type modifier" msgstr "不正なINTERVAL型の修正子です" -#: utils/adt/timestamp.c:1100 +#: utils/adt/timestamp.c:1110 #, c-format msgid "INTERVAL(%d) precision must not be negative" msgstr "INTERVAL(%d)の精度は負ではいけません" -#: utils/adt/timestamp.c:1106 +#: utils/adt/timestamp.c:1116 #, c-format msgid "INTERVAL(%d) precision reduced to maximum allowed, %d" msgstr "INTERVAL(%d)の精度を許容最大値%dまで減らしました" -#: utils/adt/timestamp.c:1496 +#: 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:4557 utils/adt/timestamp.c:4792 +#: utils/adt/timestamp.c:4564 utils/adt/timestamp.c:4769 #, c-format msgid "origin out of range" msgstr "基点が範囲外です" -#: utils/adt/timestamp.c:4562 utils/adt/timestamp.c:4797 +#: 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:4567 utils/adt/timestamp.c:4802 +#: 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:4578 utils/adt/timestamp.c:4813 +#: 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:5115 utils/adt/timestamp.c:5167 +#: utils/adt/timestamp.c:5091 #, c-format msgid "Months usually have fractional weeks." msgstr "月は通常週の端数を含んでいます。" -#: utils/adt/timestamp.c:6647 utils/adt/timestamp.c:6733 +#: utils/adt/timestamp.c:6551 utils/adt/timestamp.c:6637 #, c-format msgid "step size cannot be infinite" msgstr "加算量は無限にはできません" @@ -27036,32 +26435,32 @@ msgstr "テキスト検索問い合わせはストップワードのみを含む msgid "ts_rewrite query must return two tsquery columns" msgstr "ts_rewrite問い合わせは2列のtsquery列を返さなければなりません" -#: utils/adt/tsrank.c:415 +#: utils/adt/tsrank.c:412 #, c-format msgid "array of weight must be one-dimensional" msgstr "重み配列は1次元の配列でなければなりません" -#: utils/adt/tsrank.c:420 +#: utils/adt/tsrank.c:417 #, c-format msgid "array of weight is too short" msgstr "重み配列が短すぎます" -#: utils/adt/tsrank.c:425 +#: utils/adt/tsrank.c:422 #, c-format msgid "array of weight must not contain nulls" msgstr "重み配列にはNULL値を含めてはいけません" -#: utils/adt/tsrank.c:434 utils/adt/tsrank.c:876 +#: utils/adt/tsrank.c:431 utils/adt/tsrank.c:871 #, c-format msgid "weight out of range" msgstr "重みが範囲外です" -#: utils/adt/tsvector.c:216 +#: utils/adt/tsvector.c:213 #, c-format msgid "word is too long (%ld bytes, max %ld bytes)" msgstr "単語が長すぎます(%ldバイト、最大は%ldバイト)" -#: utils/adt/tsvector.c:223 +#: utils/adt/tsvector.c:220 #, c-format msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "tsベクターのための文字列が長すぎます(%ldバイト、最大は%ldバイト)" @@ -27141,7 +26540,7 @@ msgstr "エスケープ文字がありません: \"%s\"" msgid "wrong position info in tsvector: \"%s\"" msgstr "tsvector内の位置情報が間違っています: \"%s\"" -#: utils/adt/uuid.c:463 utils/adt/uuid.c:560 +#: utils/adt/uuid.c:418 #, c-format msgid "could not generate random values" msgstr "乱数値を生成できませんでした" @@ -27186,7 +26585,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:911 utils/adt/varlena.c:974 utils/adt/varlena.c:1131 utils/adt/varlena.c:3030 utils/adt/varlena.c:3108 +#: 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は許可されません" @@ -27211,7 +26610,7 @@ 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:3312 +#: utils/adt/varbit.c:1833 utils/adt/varlena.c:3337 #, c-format msgid "new bit must be 0 or 1" msgstr "新しいビットは0か1でなければなりません" @@ -27226,92 +26625,92 @@ msgstr "値は型character(%d)としては長すぎます" msgid "value too long for type character varying(%d)" msgstr "値は型character varying(%d)としては長すぎます" -#: utils/adt/varchar.c:737 utils/adt/varlena.c:1519 +#: 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:1229 utils/adt/varlena.c:1792 +#: 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:3196 utils/adt/varlena.c:3263 +#: 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:3227 utils/adt/varlena.c:3299 +#: 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:4398 +#: utils/adt/varlena.c:4385 #, c-format msgid "field position must not be zero" msgstr "フィールド位置には0は指定できません" -#: utils/adt/varlena.c:5643 +#: utils/adt/varlena.c:5630 #, c-format msgid "unterminated format() type specifier" msgstr "終端されていないformat()型指定子" -#: utils/adt/varlena.c:5644 utils/adt/varlena.c:5778 utils/adt/varlena.c:5899 +#: 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:5776 utils/adt/varlena.c:5897 +#: 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:5789 utils/adt/varlena.c:5846 +#: utils/adt/varlena.c:5776 utils/adt/varlena.c:5833 #, c-format msgid "too few arguments for format()" msgstr "format()の引数が少なすぎます" -#: utils/adt/varlena.c:5942 utils/adt/varlena.c:6124 +#: utils/adt/varlena.c:5929 utils/adt/varlena.c:6111 #, c-format msgid "number is out of range" msgstr "数値が範囲外です" -#: utils/adt/varlena.c:6005 utils/adt/varlena.c:6033 +#: 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:6026 +#: utils/adt/varlena.c:6013 #, c-format msgid "width argument position must be ended by \"$\"" msgstr "width引数の位置は\"$\"で終わらなければなりません" -#: utils/adt/varlena.c:6071 +#: utils/adt/varlena.c:6058 #, c-format msgid "null values cannot be formatted as an SQL identifier" msgstr "NULLはSQL識別子として書式付けできません" -#: utils/adt/varlena.c:6279 +#: 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:6292 +#: utils/adt/varlena.c:6279 #, c-format msgid "invalid normalization form: %s" msgstr "不正な正規化形式: %s" -#: utils/adt/varlena.c:6337 +#: 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:6554 utils/adt/varlena.c:6589 utils/adt/varlena.c:6624 +#: 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:6654 +#: utils/adt/varlena.c:6641 #, c-format msgid "Unicode escapes must be \\XXXX, \\+XXXXXX, \\uXXXX, or \\UXXXXXXXX." msgstr "Unicodeエスケープは \\XXXX、\\+XXXXXX、\\uXXXX または \\UXXXXXXXX でなければなりません。" @@ -27361,156 +26760,156 @@ msgstr "無効なXMLコメント" msgid "not an XML document" msgstr "XML文書ではありません" -#: utils/adt/xml.c:1008 utils/adt/xml.c:1031 +#: utils/adt/xml.c:1015 utils/adt/xml.c:1038 #, c-format msgid "invalid XML processing instruction" msgstr "無効なXML処理命令です" -#: utils/adt/xml.c:1009 +#: utils/adt/xml.c:1016 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "XML処理命令の対象名を\"%s\"とすることができませんでした。" -#: utils/adt/xml.c:1032 +#: utils/adt/xml.c:1039 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "XML処理命令には\"?>\"を含めることはできません。" -#: utils/adt/xml.c:1111 +#: utils/adt/xml.c:1118 #, c-format msgid "xmlvalidate is not implemented" msgstr "XML の妥当性検査は実装されていません" -#: utils/adt/xml.c:1167 +#: utils/adt/xml.c:1174 #, c-format msgid "could not initialize XML library" msgstr "XMLライブラリを初期化できませんでした" -#: utils/adt/xml.c:1168 +#: utils/adt/xml.c:1175 #, 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:1254 +#: utils/adt/xml.c:1261 #, c-format msgid "could not set up XML error handler" msgstr "XMLエラーハンドラを設定できませんでした" -#: utils/adt/xml.c:1255 +#: utils/adt/xml.c:1262 #, 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:2281 +#: utils/adt/xml.c:2294 msgid "Invalid character value." msgstr "文字の値が有効ではありません" -#: utils/adt/xml.c:2284 +#: utils/adt/xml.c:2297 msgid "Space required." msgstr "スペースをあけてください。" -#: utils/adt/xml.c:2287 +#: utils/adt/xml.c:2300 msgid "standalone accepts only 'yes' or 'no'." msgstr "standalone には 'yes' か 'no' だけが有効です。" -#: utils/adt/xml.c:2290 +#: utils/adt/xml.c:2303 msgid "Malformed declaration: missing version." msgstr "不正な形式の宣言: バージョンがありません。" -#: utils/adt/xml.c:2293 +#: utils/adt/xml.c:2306 msgid "Missing encoding in text declaration." msgstr "テキスト宣言にエンコーディングの指定がありません。" -#: utils/adt/xml.c:2296 +#: utils/adt/xml.c:2309 msgid "Parsing XML declaration: '?>' expected." msgstr "XML 宣言のパース中: '>?' が必要です。" -#: utils/adt/xml.c:2299 +#: utils/adt/xml.c:2312 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "認識できないlibxml のエラーコード: %d" -#: utils/adt/xml.c:2553 +#: utils/adt/xml.c:2566 #, c-format msgid "XML does not support infinite date values." msgstr "XMLはデータ値として無限をサポートしません。" -#: utils/adt/xml.c:2575 utils/adt/xml.c:2602 +#: utils/adt/xml.c:2588 utils/adt/xml.c:2615 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XMLタイムスタンプ値としては無限をサポートしません。" -#: utils/adt/xml.c:3018 +#: utils/adt/xml.c:3031 #, c-format msgid "invalid query" msgstr "不正な無効な問い合わせ" -#: utils/adt/xml.c:3110 +#: utils/adt/xml.c:3123 #, c-format msgid "portal \"%s\" does not return tuples" msgstr "ポータル\"%s\"はタプルを返却しません" -#: utils/adt/xml.c:4362 +#: utils/adt/xml.c:4375 #, c-format msgid "invalid array for XML namespace mapping" msgstr "XML名前空間マッピングに対する不正な配列" -#: utils/adt/xml.c:4363 +#: utils/adt/xml.c:4376 #, 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:4387 +#: utils/adt/xml.c:4400 #, c-format msgid "empty XPath expression" msgstr "空のXPath式" -#: utils/adt/xml.c:4439 +#: utils/adt/xml.c:4452 #, c-format msgid "neither namespace name nor URI may be null" msgstr "名前空間名もURIもnullにはできません" -#: utils/adt/xml.c:4446 +#: utils/adt/xml.c:4459 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "\"%s\"という名前のXML名前空間およびURI\"%s\"を登録できませんでした" -#: utils/adt/xml.c:4795 +#: utils/adt/xml.c:4808 #, c-format msgid "DEFAULT namespace is not supported" msgstr "デフォルト名前空間は実装されていません" -#: utils/adt/xml.c:4824 +#: utils/adt/xml.c:4837 #, c-format msgid "row path filter must not be empty string" msgstr "行パスフィルタは空文字列であってはなりません" -#: utils/adt/xml.c:4858 +#: utils/adt/xml.c:4871 #, c-format msgid "column path filter must not be empty string" msgstr "列パスフィルタ空文字列であってはなりません" -#: utils/adt/xml.c:5005 +#: utils/adt/xml.c:5018 #, c-format msgid "more than one value returned by column XPath expression" msgstr "列XPath式が2つ以上の値を返却しました" -#: utils/cache/lsyscache.c:1018 +#: 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:2914 utils/cache/lsyscache.c:2947 utils/cache/lsyscache.c:2980 utils/cache/lsyscache.c:3013 +#: 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:2919 +#: utils/cache/lsyscache.c:2892 #, c-format msgid "no input function available for type %s" msgstr "型%sの利用可能な入力関数がありません" -#: utils/cache/lsyscache.c:2952 +#: utils/cache/lsyscache.c:2925 #, c-format msgid "no output function available for type %s" msgstr "型%sの利用可能な出力関数がありません" @@ -27525,27 +26924,27 @@ msgstr "アクセスメソッド %2$s の演算子クラス\"%1$s\"は%4$s型に msgid "cached plan must not change result type" msgstr "キャッシュした実行計画は結果型を変更してはなりません" -#: utils/cache/relcache.c:3750 +#: utils/cache/relcache.c:3801 #, c-format msgid "heap relfilenumber value not set when in binary upgrade mode" msgstr "バイナリアップグレードモード中にヒープのrelfilenumberの値が設定されていません" -#: utils/cache/relcache.c:3758 +#: utils/cache/relcache.c:3809 #, c-format msgid "unexpected request for new relfilenumber in binary upgrade mode" msgstr "バイナリアップグレードモード中に、予期しない新規relfilenumberの要求がありました" -#: utils/cache/relcache.c:6553 +#: utils/cache/relcache.c:6539 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "リレーションキャッシュ初期化ファイル\"%sを作成できません: %m" -#: utils/cache/relcache.c:6555 +#: utils/cache/relcache.c:6541 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "とりあえず続行しますが、何かがおかしいです。" -#: utils/cache/relcache.c:6885 +#: utils/cache/relcache.c:6871 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "キャッシュファイル\"%s\"を削除できませんでした: %m" @@ -27565,7 +26964,7 @@ msgstr "リレーションマッピングファイル\"%s\"に不正なデータ msgid "relation mapping file \"%s\" contains incorrect checksum" msgstr "リレーションマッピングファイル\"%s\"の中に不正なチェックサムがあります" -#: utils/cache/typcache.c:1899 utils/fmgr/funcapi.c:574 +#: utils/cache/typcache.c:1812 utils/fmgr/funcapi.c:574 #, c-format msgid "record type has not been registered" msgstr "レコード型は登録されていません" @@ -27580,182 +26979,190 @@ 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:411 +#: utils/error/elog.c:415 #, c-format msgid "error occurred before error message processing is available\n" msgstr "エラーメッセージの処理が可能になる前にエラーが発生しました\n" -#: utils/error/elog.c:2137 +#: utils/error/elog.c:2134 #, c-format msgid "could not reopen file \"%s\" as stderr: %m" msgstr "ファイル\"%s\"の標準エラー出力としての再オープンに失敗しました: %m" -#: utils/error/elog.c:2150 +#: utils/error/elog.c:2147 #, c-format msgid "could not reopen file \"%s\" as stdout: %m" msgstr "ファイル\"%s\"の標準出力としての再オープンに失敗しました: %m" -#: utils/error/elog.c:2186 +#: utils/error/elog.c:2183 #, c-format -msgid "Invalid character." -msgstr "不正な文字。" +msgid "Invalid character" +msgstr "不正な文字" -#: utils/error/elog.c:2892 utils/error/elog.c:2919 utils/error/elog.c:2935 +#: utils/error/elog.c:2889 utils/error/elog.c:2916 utils/error/elog.c:2932 msgid "[unknown]" msgstr "[不明]" -#: utils/error/elog.c:3205 utils/error/elog.c:3529 utils/error/elog.c:3636 +#: utils/error/elog.c:3202 utils/error/elog.c:3526 utils/error/elog.c:3633 msgid "missing error text" msgstr "エラーテキストがありません" -#: utils/error/elog.c:3208 utils/error/elog.c:3211 +#: utils/error/elog.c:3205 utils/error/elog.c:3208 #, c-format msgid " at character %d" msgstr "(%d文字目)" -#: utils/error/elog.c:3221 utils/error/elog.c:3228 +#: utils/error/elog.c:3218 utils/error/elog.c:3225 msgid "DETAIL: " msgstr "詳細: " -#: utils/error/elog.c:3235 +#: utils/error/elog.c:3232 msgid "HINT: " msgstr "ヒント: " -#: utils/error/elog.c:3242 +#: utils/error/elog.c:3239 msgid "QUERY: " msgstr "問い合わせ: " -#: utils/error/elog.c:3249 +#: utils/error/elog.c:3246 msgid "CONTEXT: " msgstr "文脈: " -#: utils/error/elog.c:3259 +#: utils/error/elog.c:3256 #, c-format msgid "LOCATION: %s, %s:%d\n" msgstr "場所: %s, %s:%d\n" -#: utils/error/elog.c:3266 +#: utils/error/elog.c:3263 #, c-format msgid "LOCATION: %s:%d\n" msgstr "場所: %s:%d\n" -#: utils/error/elog.c:3273 +#: utils/error/elog.c:3270 msgid "BACKTRACE: " msgstr "バックトレース: " -#: utils/error/elog.c:3285 +#: utils/error/elog.c:3282 msgid "STATEMENT: " msgstr "文: " -#: utils/error/elog.c:3681 +#: utils/error/elog.c:3678 msgid "DEBUG" msgstr "DEBUG" -#: utils/error/elog.c:3685 +#: utils/error/elog.c:3682 msgid "LOG" msgstr "LOG" -#: utils/error/elog.c:3688 +#: utils/error/elog.c:3685 msgid "INFO" msgstr "INFO" -#: utils/error/elog.c:3691 +#: utils/error/elog.c:3688 msgid "NOTICE" msgstr "NOTICE" -#: utils/error/elog.c:3695 +#: utils/error/elog.c:3692 msgid "WARNING" msgstr "WARNING" -#: utils/error/elog.c:3698 +#: utils/error/elog.c:3695 msgid "ERROR" msgstr "ERROR" -#: utils/error/elog.c:3701 +#: utils/error/elog.c:3698 msgid "FATAL" msgstr "FATAL" -#: utils/error/elog.c:3704 +#: utils/error/elog.c:3701 msgid "PANIC" msgstr "PANIC" -#: utils/fmgr/dfmgr.c:118 +#: utils/fmgr/dfmgr.c:128 #, c-format msgid "could not find function \"%s\" in file \"%s\"" msgstr "ファイル\"%2$s\"内に関数\"%1$s\"がありませんでした" -#: utils/fmgr/dfmgr.c:237 +#: utils/fmgr/dfmgr.c:247 #, c-format msgid "could not load library \"%s\": %s" msgstr "ライブラリ\"%s\"をロードできませんでした: %s" -#: utils/fmgr/dfmgr.c:269 +#: utils/fmgr/dfmgr.c:279 #, c-format msgid "incompatible library \"%s\": missing magic block" msgstr "\"%s\"は互換性がないライブラリです。マジックブロックの欠落" -#: utils/fmgr/dfmgr.c:271 +#: 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:317 +#: utils/fmgr/dfmgr.c:327 #, c-format msgid "incompatible library \"%s\": version mismatch" msgstr "\"%s\"は互換性がないライブラリです: バージョンの不一致" -#: utils/fmgr/dfmgr.c:319 +#: utils/fmgr/dfmgr.c:329 #, c-format msgid "Server is version %d, library is version %s." msgstr "サーバーはバージョン%d、ライブラリはバージョン%sです。" -#: utils/fmgr/dfmgr.c:331 +#: utils/fmgr/dfmgr.c:341 #, c-format msgid "incompatible library \"%s\": ABI mismatch" msgstr "非互換のライブラリ\"%s\": ABIの不一致" -#: utils/fmgr/dfmgr.c:333 +#: utils/fmgr/dfmgr.c:343 #, c-format msgid "Server has ABI \"%s\", library has \"%s\"." msgstr "サーバー側ABIは\"%s\"、ライブラリ側は\"%s\"です。" -#. translator: %s is a variable name and %d its values -#: utils/fmgr/dfmgr.c:352 utils/fmgr/dfmgr.c:362 utils/fmgr/dfmgr.c:372 +#: 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 %s = %d, library has %d." -msgstr "サーバー側では %s = %d ですが、ライブラリ側は %d です。" +msgid "Server has INDEX_MAX_KEYS = %d, library has %d." +msgstr "サーバー側は INDEX_MAX_KEYS = %d ですが、ライブラリ側は %d です。" -#. translator: %s is a variable name and %d its values -#: utils/fmgr/dfmgr.c:382 +#: utils/fmgr/dfmgr.c:379 #, c-format -msgid "Server has %s = %s, library has %s." -msgstr "サーバー側では %s = \"%s\"ですが、ライブラリ側は\"%s\"です。" +msgid "Server has NAMEDATALEN = %d, library has %d." +msgstr "サーバー側は NAMEDATALEN = %d ですが、ライブラリ側は %d です。" -#: utils/fmgr/dfmgr.c:389 +#: 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:392 +#: utils/fmgr/dfmgr.c:398 #, c-format msgid "incompatible library \"%s\": magic block mismatch" msgstr "\"%s\"は互換性がないライブラリです: マジックブロックの不一致" -#: utils/fmgr/dfmgr.c:469 +#: utils/fmgr/dfmgr.c:475 #, c-format msgid "access to library \"%s\" is not allowed" msgstr "ライブラリ\"%s\"へのアクセスは許可されません" -#: utils/fmgr/dfmgr.c:495 +#: utils/fmgr/dfmgr.c:501 #, c-format msgid "invalid macro name in dynamic library path: %s" msgstr "ダイナミックライブラリパス内のマクロが不正です: %s" -#: utils/fmgr/dfmgr.c:535 +#: 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:554 +#: utils/fmgr/dfmgr.c:560 #, c-format msgid "component in parameter \"dynamic_library_path\" is not an absolute path" msgstr "パラメータ\"dynamic_library_path\"内の要素が絶対パスでありません" @@ -27815,249 +27222,177 @@ msgstr "列の別名が提供されていませんでした" msgid "could not determine row description for function returning record" msgstr "レコードを返す関数についての行定義を特定できませんでした" -#: utils/init/miscinit.c:265 -msgid "unknown process type" -msgstr "不明なプロセスタイプ" - -#: utils/init/miscinit.c:270 -msgid "not initialized" -msgstr "未初期化プロセス" - -#: utils/init/miscinit.c:273 -msgid "archiver" -msgstr "アーカイバー" - -#: utils/init/miscinit.c:276 -msgid "autovacuum launcher" -msgstr "自動VACUUM起動プロセス" - -#: utils/init/miscinit.c:279 -msgid "autovacuum worker" -msgstr "自動VACUUMワーカー" - -#: utils/init/miscinit.c:282 -msgid "client backend" -msgstr "クライアント バックエンド" - -#: utils/init/miscinit.c:285 -msgid "dead-end client backend" -msgstr "終了待ちバックエンド" - -#: utils/init/miscinit.c:288 -msgid "background worker" -msgstr "バックグラウンドワーカー" - -#: utils/init/miscinit.c:291 -msgid "background writer" -msgstr "バックグランドライター" - -#: utils/init/miscinit.c:294 -msgid "checkpointer" -msgstr "チェックポインター" - -#: utils/init/miscinit.c:297 -msgid "logger" -msgstr "ログ出力プロセス" - -#: utils/init/miscinit.c:300 -msgid "slotsync worker" -msgstr "スロット同期ワーカー" - -#: utils/init/miscinit.c:303 -msgid "standalone backend" -msgstr "単独起動バックエンド" - -#: utils/init/miscinit.c:306 -msgid "startup" -msgstr "初期起動プロセス" - -#: utils/init/miscinit.c:309 -msgid "walreceiver" -msgstr "WAL受信プロセス" - -#: utils/init/miscinit.c:312 -msgid "walsender" -msgstr "WAL送信プロセス" - -#: utils/init/miscinit.c:315 -msgid "walsummarizer" -msgstr "WAL集計プロセス" - -#: utils/init/miscinit.c:318 -msgid "walwriter" -msgstr "WAL書き込みプロセス" - -#: utils/init/miscinit.c:355 +#: utils/init/miscinit.c:353 #, c-format msgid "data directory \"%s\" does not exist" msgstr "データディレクトリ\"%s\"は存在しません" -#: utils/init/miscinit.c:360 +#: utils/init/miscinit.c:358 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "ディレクトリ\"%s\"の権限を読み取れませんでした: %m" -#: utils/init/miscinit.c:368 +#: utils/init/miscinit.c:366 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "指定されたデータディレクトリ\"%s\"はディレクトリではありません" -#: utils/init/miscinit.c:384 +#: utils/init/miscinit.c:382 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "データディレクトリ\"%s\"の所有者情報が間違っています" -#: utils/init/miscinit.c:386 +#: 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:404 +#: utils/init/miscinit.c:402 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "データディレクトリ\"%s\"の権限設定が不正です" -#: utils/init/miscinit.c:406 +#: 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:464 +#: utils/init/miscinit.c:462 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "ディレクトリ\"%s\"に移動できませんでした: %m" -#: utils/init/miscinit.c:722 utils/misc/guc.c:3647 +#: 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:809 +#: utils/init/miscinit.c:807 #, c-format msgid "role with OID %u does not exist" msgstr "OID が %u であるロールは存在しません" -#: utils/init/miscinit.c:855 +#: utils/init/miscinit.c:853 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "ロール\"%s\"はログインが許可されません" -#: utils/init/miscinit.c:876 +#: utils/init/miscinit.c:874 #, c-format msgid "too many connections for role \"%s\"" msgstr "ロール\"%s\"からの接続が多すぎます" -#: utils/init/miscinit.c:1047 +#: utils/init/miscinit.c:1045 #, c-format msgid "invalid role OID: %u" msgstr "不正なロールID: %u" -#: utils/init/miscinit.c:1194 +#: utils/init/miscinit.c:1192 #, c-format msgid "database system is shut down" msgstr "データベースシステムはシャットダウンしました" -#: utils/init/miscinit.c:1281 +#: utils/init/miscinit.c:1279 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "ロックファイル\"%s\"を作成できませんでした: %m" -#: utils/init/miscinit.c:1295 +#: utils/init/miscinit.c:1293 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "ロックファイル\"%s\"をオープンできませんでした: %m" -#: utils/init/miscinit.c:1302 +#: utils/init/miscinit.c:1300 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "ロックファイル\"%s\"を読み取れませんでした: %m" -#: utils/init/miscinit.c:1311 +#: utils/init/miscinit.c:1309 #, c-format msgid "lock file \"%s\" is empty" msgstr "ロックファイル\"%s\"が空です" -#: utils/init/miscinit.c:1312 +#: 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:1356 +#: utils/init/miscinit.c:1354 #, c-format msgid "lock file \"%s\" already exists" msgstr "ロックファイル\"%s\"はすでに存在します" -#: utils/init/miscinit.c:1360 +#: 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:1362 +#: 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:1365 +#: 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:1367 +#: 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:1418 +#: utils/init/miscinit.c:1416 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "古いロックファイル\"%s\"を削除できませんでした: %m" -#: utils/init/miscinit.c:1420 +#: 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:1457 utils/init/miscinit.c:1471 utils/init/miscinit.c:1482 +#: 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:1593 utils/init/miscinit.c:1735 utils/misc/guc.c:5762 +#: 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:1723 +#: utils/init/miscinit.c:1721 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "ファイル\"%s\"をオープンできませんでした: %m; とりあえず続けます" -#: utils/init/miscinit.c:1748 +#: 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:1787 utils/init/miscinit.c:1803 +#: 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:1789 +#: utils/init/miscinit.c:1787 #, c-format msgid "File \"%s\" is missing." msgstr "ファイル\"%s\"が存在しません" -#: utils/init/miscinit.c:1805 +#: utils/init/miscinit.c:1803 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "ファイル\"%s\"に有効なデータがありません。" -#: utils/init/miscinit.c:1807 +#: utils/init/miscinit.c:1805 #, c-format msgid "You might need to initdb." msgstr "initdbする必要があるかもしれません" -#: utils/init/miscinit.c:1815 +#: 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とは互換性がありません" @@ -28105,132 +27440,122 @@ msgstr "はい" msgid " GSS (authenticated=%s, encrypted=%s, delegated_credentials=%s)" msgstr " GSS (認証=%s、暗号化=%s、委任資格証明=%s)" -#: utils/init/postinit.c:332 +#: utils/init/postinit.c:333 #, c-format msgid "database \"%s\" has disappeared from pg_database" msgstr "データベース\"%s\"はpg_databaseから消失しました" -#: utils/init/postinit.c:334 +#: 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:354 +#: utils/init/postinit.c:355 #, c-format msgid "database \"%s\" is not currently accepting connections" msgstr "現在データベース\"%s\"は接続を受け付けません" -#: utils/init/postinit.c:367 +#: utils/init/postinit.c:368 #, c-format msgid "permission denied for database \"%s\"" msgstr "データベース\"%s\"へのアクセスが拒否されました" -#: utils/init/postinit.c:368 +#: utils/init/postinit.c:369 #, c-format msgid "User does not have CONNECT privilege." msgstr "ユーザーはCONNECT権限を持ちません。" -#: utils/init/postinit.c:388 +#: utils/init/postinit.c:389 #, c-format msgid "too many connections for database \"%s\"" msgstr "データベース\"%s\"への接続が多すぎます" -#: utils/init/postinit.c:412 utils/init/postinit.c:419 +#: 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:413 +#: 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:415 utils/init/postinit.c:422 +#: 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:420 +#: 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: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:556 -#, c-format -msgid "too many server processes configured" -msgstr "サーバープロセス数の設定が大きすぎます" - -#: utils/init/postinit.c:557 -#, c-format -msgid "\"max_connections\" (%d) plus \"autovacuum_worker_slots\" (%d) plus \"max_worker_processes\" (%d) plus \"max_wal_senders\" (%d) must be less than %d." -msgstr "\"max_connections\" (%d) + \"autovacuum_worker_slots\" (%d) + \"max_worker_processes\" (%d) + \"max_wal_senders\" (%d)は%dより小さくなければなりません。" - -#: utils/init/postinit.c:855 +#: utils/init/postinit.c:904 #, c-format msgid "no roles are defined in this database system" msgstr "データベースシステム内でロールが定義されていません" -#: utils/init/postinit.c:856 +#: 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:893 +#: utils/init/postinit.c:942 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "バイナリアップグレードモード中に接続するにはスーパーユーザーである必要があります" -#: utils/init/postinit.c:913 +#: utils/init/postinit.c:962 #, c-format msgid "remaining connection slots are reserved for roles with the %s attribute" msgstr "残りの接続枠は%s属性を持つロールのために予約されています" -#: utils/init/postinit.c:919 +#: 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:931 +#: utils/init/postinit.c:980 #, c-format msgid "permission denied to start WAL sender" msgstr "WAL送信プロセスを開始する権限がありません" -#: utils/init/postinit.c:932 +#: 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:1050 +#: utils/init/postinit.c:1099 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "削除またはリネームされたばかりのようです。" -#: utils/init/postinit.c:1054 +#: utils/init/postinit.c:1103 #, c-format msgid "database %u does not exist" msgstr "データベース %u は存在しません" -#: utils/init/postinit.c:1063 +#: utils/init/postinit.c:1112 #, c-format msgid "cannot connect to invalid database \"%s\"" msgstr "無効なデータベース\"%s\"への接続はできません" -#: utils/init/postinit.c:1124 +#: utils/init/postinit.c:1173 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "データベースのサブディレクトリ\"%s\"がありません。" @@ -28295,7 +27620,7 @@ msgstr "bind_textdomain_codesetが失敗しました" msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "符号化方式\"%s\"に対する不正なバイト列です: %s" -#: utils/mb/mbutils.c:1751 +#: utils/mb/mbutils.c:1759 #, c-format msgid "character with byte sequence %s in encoding \"%s\" has no equivalent in encoding \"%s\"" msgstr "符号化方式\"%2$s\"においてバイト列%1$sである文字は符号化方式\"%3$s\"で等価な文字を持ちません" @@ -28310,80 +27635,80 @@ msgstr "空の設定ディレクトリ名: \"%s\"" msgid "could not open configuration directory \"%s\": %m" msgstr "設定ディレクトリ\"%s\"をオープンできませんでした: %m" -#: utils/misc/guc.c:119 +#: 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:156 +#: 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:428 +#: 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:468 utils/misc/guc.c:3501 utils/misc/guc.c:3745 utils/misc/guc.c:3843 utils/misc/guc.c:3941 utils/misc/guc.c:4068 utils/misc/guc.c:4209 +#: 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:504 +#: utils/misc/guc.c:506 #, c-format msgid "parameter \"%s\" removed from configuration file, reset to default" msgstr "パラメーター\"%s\"が設定ファイルから削除されました。デフォルト値に戻ります。" -#: utils/misc/guc.c:569 +#: utils/misc/guc.c:571 #, c-format msgid "parameter \"%s\" changed to \"%s\"" msgstr "パラメータ\"%s\"は\"%s\"に変更されました" -#: utils/misc/guc.c:611 +#: utils/misc/guc.c:613 #, c-format msgid "configuration file \"%s\" contains errors" msgstr "設定ファイル\"%s\"にはエラーがあります" -#: utils/misc/guc.c:616 +#: utils/misc/guc.c:618 #, c-format msgid "configuration file \"%s\" contains errors; unaffected changes were applied" msgstr "設定ファイル\"%s\"にはエラーがあります。影響がない変更は適用されました" -#: utils/misc/guc.c:621 +#: utils/misc/guc.c:623 #, c-format msgid "configuration file \"%s\" contains errors; no changes were applied" msgstr "設定ファイル\"%s\"にはエラーがあります。変更は適用されませんでした" -#: utils/misc/guc.c:1137 utils/misc/guc.c:1153 +#: utils/misc/guc.c:1139 utils/misc/guc.c:1155 #, c-format msgid "invalid configuration parameter name \"%s\"" msgstr "設定パラメータ名\"%s\"は不正です" -#: utils/misc/guc.c:1139 +#: 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:1155 +#: utils/misc/guc.c:1157 #, c-format msgid "\"%s\" is a reserved prefix." msgstr "\"%s\"は予約されている接頭辞です。" -#: utils/misc/guc.c:1168 utils/misc/guc.c:1278 +#: utils/misc/guc.c:1170 utils/misc/guc.c:1280 #, c-format msgid "unrecognized configuration parameter \"%s\"" msgstr "設定パラメータ\"%s\"は不明です" -#: utils/misc/guc.c:1800 +#: 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:1804 +#: 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:1828 +#: utils/misc/guc.c:1830 #, c-format msgid "" "%s does not know where to find the server configuration file.\n" @@ -28393,12 +27718,12 @@ msgstr "" "--config-fileまたは-Dオプションを指定する、あるいはPGDATA環境変数を設\n" "定する必要があります。\n" -#: utils/misc/guc.c:1851 +#: 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:1879 +#: utils/misc/guc.c:1881 #, c-format msgid "" "%s does not know where to find the database system data.\n" @@ -28408,7 +27733,7 @@ msgstr "" "\"%s\"内の\"data_directory\"で指定するか、実行時に-Dオプションを指定する、またはPGDATA環\n" "境変数で設定することができます。\n" -#: utils/misc/guc.c:1931 +#: utils/misc/guc.c:1933 #, c-format msgid "" "%s does not know where to find the \"hba\" configuration file.\n" @@ -28418,7 +27743,7 @@ msgstr "" "\"%s\"内で\"hba_directory\"を指定する、-Dオプションを指定する、PGDATA環\n" "境変数で設定することができます。\n" -#: utils/misc/guc.c:1962 +#: utils/misc/guc.c:1964 #, c-format msgid "" "%s does not know where to find the \"ident\" configuration file.\n" @@ -28428,121 +27753,121 @@ msgstr "" "\"%s\"内で\"ident_directory\"を指定する、-Dオプションを指定する、PGDATA環\n" "境変数で設定することができます。\n" -#: utils/misc/guc.c:2941 +#: utils/misc/guc.c:2943 msgid "Value exceeds integer range." msgstr "値が整数範囲を超えています。" -#: utils/misc/guc.c:3182 +#: 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:3223 +#: 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:3462 +#: utils/misc/guc.c:3465 #, c-format msgid "parameter \"%s\" cannot be set during a parallel operation" msgstr "パラメータ\"%s\"は並列操作中には設定できません" -#: utils/misc/guc.c:3478 utils/misc/guc.c:4693 +#: utils/misc/guc.c:3481 utils/misc/guc.c:4696 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "パラメータ\"%s\"を変更できません" -#: utils/misc/guc.c:3511 +#: utils/misc/guc.c:3514 #, c-format msgid "parameter \"%s\" cannot be changed now" msgstr "現在パラメータ\"%s\"を変更できません" -#: utils/misc/guc.c:3538 utils/misc/guc.c:3600 utils/misc/guc.c:4668 utils/misc/guc.c:6753 +#: 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:3580 +#: utils/misc/guc.c:3583 #, c-format msgid "parameter \"%s\" cannot be set after connection start" msgstr "接続開始後にパラメータ\"%s\"を変更できません" -#: utils/misc/guc.c:3639 +#: utils/misc/guc.c:3642 #, c-format msgid "cannot set parameter \"%s\" within security-definer function" msgstr "セキュリティー定義用関数内でパラメーター\"%s\"を設定できません" -#: utils/misc/guc.c:3660 +#: utils/misc/guc.c:3663 #, c-format msgid "parameter \"%s\" cannot be reset" msgstr "パラメータ\"%s\"は設定できません" -#: utils/misc/guc.c:3667 +#: utils/misc/guc.c:3670 #, c-format msgid "parameter \"%s\" cannot be set locally in functions" msgstr "パラメータ\"%s\"は関数内では変更できません" -#: utils/misc/guc.c:4367 utils/misc/guc.c:4415 utils/misc/guc.c:5447 +#: 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:4368 utils/misc/guc.c:4416 utils/misc/guc.c:5448 +#: 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:4626 +#: utils/misc/guc.c:4629 #, c-format msgid "ALTER SYSTEM is not allowed in this environment" msgstr "ALTER SYSTEMはこの環境では許可されていません" -#: utils/misc/guc.c:4658 +#: 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:4737 +#: 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:4782 +#: utils/misc/guc.c:4785 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "ファイル\"%s\"の内容をパースできませんでした" -#: utils/misc/guc.c:4964 +#: utils/misc/guc.c:4967 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "パラメータ\"%s\"を再定義しようとしています" -#: utils/misc/guc.c:5303 +#: utils/misc/guc.c:5306 #, c-format msgid "invalid configuration parameter name \"%s\", removing it" msgstr "設定パラメータ名\"%s\"は不正です、削除します" -#: utils/misc/guc.c:5305 +#: utils/misc/guc.c:5308 #, c-format msgid "\"%s\" is now a reserved prefix." msgstr "\"%s\" は予約された接頭辞になりました。" -#: utils/misc/guc.c:6176 +#: utils/misc/guc.c:6179 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "パラメータ\"%s\"の\"%s\"への変更中" -#: utils/misc/guc.c:6345 +#: utils/misc/guc.c:6348 #, c-format msgid "parameter \"%s\" could not be set" msgstr "パラメータ\"%s\"を設定できません" -#: utils/misc/guc.c:6435 +#: utils/misc/guc.c:6438 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "パラメータ\"%s\"の設定をパースできません" -#: utils/misc/guc.c:6885 +#: utils/misc/guc.c:6888 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "パラメータ\"%s\"の値が無効です: %g" @@ -28567,145 +27892,141 @@ msgstr "SET %sは1つの引数のみを取ります" msgid "SET requires parameter name" msgstr "SETにはパラメータ名が必要です" -#: utils/misc/guc_tables.c:675 +#: utils/misc/guc_tables.c:676 msgid "Ungrouped" msgstr "その他" -#: utils/misc/guc_tables.c:676 +#: utils/misc/guc_tables.c:677 msgid "File Locations" msgstr "ファイルの位置" -#: utils/misc/guc_tables.c:677 +#: utils/misc/guc_tables.c:678 msgid "Connections and Authentication / Connection Settings" msgstr "接続と認証/接続設定" -#: utils/misc/guc_tables.c:678 +#: utils/misc/guc_tables.c:679 msgid "Connections and Authentication / TCP Settings" msgstr "接続と認証/TCP設定" -#: utils/misc/guc_tables.c:679 +#: utils/misc/guc_tables.c:680 msgid "Connections and Authentication / Authentication" msgstr "接続と認証/認証" -#: utils/misc/guc_tables.c:680 +#: utils/misc/guc_tables.c:681 msgid "Connections and Authentication / SSL" msgstr "接続と認証/SSL" -#: utils/misc/guc_tables.c:681 +#: utils/misc/guc_tables.c:682 msgid "Resource Usage / Memory" msgstr "使用リソース/メモリ" -#: utils/misc/guc_tables.c:682 +#: utils/misc/guc_tables.c:683 msgid "Resource Usage / Disk" msgstr "使用リソース/ディスク" -#: utils/misc/guc_tables.c:683 +#: utils/misc/guc_tables.c:684 msgid "Resource Usage / Kernel Resources" msgstr "使用リソース/カーネルリソース" -#: utils/misc/guc_tables.c:684 +#: utils/misc/guc_tables.c:685 +msgid "Resource Usage / Cost-Based Vacuum Delay" +msgstr "使用リソース / コストベースvacuum遅延" + +#: utils/misc/guc_tables.c:686 msgid "Resource Usage / Background Writer" msgstr "使用リソース / バックグラウンド・ライタ" -#: utils/misc/guc_tables.c:685 +#: 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:687 +#: utils/misc/guc_tables.c:689 msgid "Write-Ahead Log / Checkpoints" msgstr "先行書き込みログ / チェックポイント" -#: utils/misc/guc_tables.c:688 +#: utils/misc/guc_tables.c:690 msgid "Write-Ahead Log / Archiving" msgstr "先行書き込みログ / アーカイビング" -#: utils/misc/guc_tables.c:689 +#: utils/misc/guc_tables.c:691 msgid "Write-Ahead Log / Recovery" msgstr "先行書き込みログ / リカバリ" -#: utils/misc/guc_tables.c:690 +#: utils/misc/guc_tables.c:692 msgid "Write-Ahead Log / Archive Recovery" msgstr "先行書き込みログ / アーカイブリカバリ" -#: utils/misc/guc_tables.c:691 +#: utils/misc/guc_tables.c:693 msgid "Write-Ahead Log / Recovery Target" msgstr "先行書き込みログ / チェックポイント" -#: utils/misc/guc_tables.c:692 +#: utils/misc/guc_tables.c:694 msgid "Write-Ahead Log / Summarization" msgstr "先行書き込みログ / 集約" -#: utils/misc/guc_tables.c:693 +#: utils/misc/guc_tables.c:695 msgid "Replication / Sending Servers" msgstr "レプリケーション / 送信サーバー" -#: utils/misc/guc_tables.c:694 +#: utils/misc/guc_tables.c:696 msgid "Replication / Primary Server" msgstr "レプリケーション / プライマリサーバー" -#: utils/misc/guc_tables.c:695 +#: utils/misc/guc_tables.c:697 msgid "Replication / Standby Servers" msgstr "レプリケーション / スタンバイサーバー" -#: utils/misc/guc_tables.c:696 +#: utils/misc/guc_tables.c:698 msgid "Replication / Subscribers" msgstr "レプリケーション / サブスクライバ" -#: utils/misc/guc_tables.c:697 +#: utils/misc/guc_tables.c:699 msgid "Query Tuning / Planner Method Configuration" msgstr "問い合わせのチューニング / プランナ手法設定" -#: utils/misc/guc_tables.c:698 +#: utils/misc/guc_tables.c:700 msgid "Query Tuning / Planner Cost Constants" msgstr "問い合わせのチューニング / プランナコスト定数" -#: utils/misc/guc_tables.c:699 +#: utils/misc/guc_tables.c:701 msgid "Query Tuning / Genetic Query Optimizer" msgstr "問い合わせのチューニング / 遺伝的問い合わせオプティマイザ" -#: utils/misc/guc_tables.c:700 +#: utils/misc/guc_tables.c:702 msgid "Query Tuning / Other Planner Options" msgstr "問い合わせのチューニング / その他のプランオプション" -#: utils/misc/guc_tables.c:701 +#: utils/misc/guc_tables.c:703 msgid "Reporting and Logging / Where to Log" msgstr "レポートとログ出力 / ログの出力先" -#: utils/misc/guc_tables.c:702 +#: utils/misc/guc_tables.c:704 msgid "Reporting and Logging / When to Log" msgstr "レポートとログ出力 / ログのタイミング" -#: utils/misc/guc_tables.c:703 +#: utils/misc/guc_tables.c:705 msgid "Reporting and Logging / What to Log" msgstr "レポートとログ出力 / ログの内容" -#: utils/misc/guc_tables.c:704 +#: utils/misc/guc_tables.c:706 msgid "Reporting and Logging / Process Title" msgstr "レポートとログ出力 / プロセス表記" -#: utils/misc/guc_tables.c:705 +#: utils/misc/guc_tables.c:707 msgid "Statistics / Monitoring" msgstr "統計情報 / 監視" -#: utils/misc/guc_tables.c:706 +#: utils/misc/guc_tables.c:708 msgid "Statistics / Cumulative Query and Index Statistics" msgstr "統計情報 / 問い合わせとインデックスの累積統計情報" -#: utils/misc/guc_tables.c:707 -msgid "Vacuuming / Automatic Vacuuming" -msgstr "VACUUM / 自動VACUUM" - -#: utils/misc/guc_tables.c:708 -msgid "Vacuuming / Cost-Based Vacuum Delay" -msgstr "VACUUM / コストベースVACUUM遅延" - #: utils/misc/guc_tables.c:709 -msgid "Vacuuming / Freezing" -msgstr "VACUUM / 凍結" +msgid "Autovacuum" +msgstr "自動VACUUM" #: utils/misc/guc_tables.c:710 msgid "Client Connection Defaults / Statement Behavior" @@ -28848,1823 +28169,1783 @@ msgid "Enables reordering of GROUP BY keys." msgstr "GROUP BYキーによる再ソートを有効化します。" #: utils/misc/guc_tables.c:1002 -msgid "Enables reordering of DISTINCT pathkeys." -msgstr "DISTINCTパスキーの順序変更を有効にします。" - -#: utils/misc/guc_tables.c:1012 msgid "Enables genetic query optimization." msgstr "遺伝的問い合わせ最適化を有効にします。" -#: utils/misc/guc_tables.c:1013 +#: utils/misc/guc_tables.c:1003 msgid "This algorithm attempts to do planning without exhaustive searching." msgstr "このアルゴリズムでは、全数探索を伴わずに行う実行計画の作成を試みます。" -#: utils/misc/guc_tables.c:1027 +#: utils/misc/guc_tables.c:1017 msgid "Shows whether the current user is a superuser." msgstr "現在のユーザーがスーパーユーザーかどうかを表示します。" -#: utils/misc/guc_tables.c:1042 +#: utils/misc/guc_tables.c:1032 msgid "Allows running the ALTER SYSTEM command." msgstr "ALTER SYSTEMコマンドの実行を許可します。" -#: utils/misc/guc_tables.c:1043 +#: 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:1053 +#: utils/misc/guc_tables.c:1043 msgid "Enables advertising the server via Bonjour." msgstr "Bonjour を経由したサーバーのアドバタイズを有効にします。" -#: utils/misc/guc_tables.c:1062 +#: utils/misc/guc_tables.c:1052 msgid "Collects transaction commit time." msgstr "トランザクションのコミット時刻を収集します。" -#: utils/misc/guc_tables.c:1071 +#: utils/misc/guc_tables.c:1061 msgid "Enables SSL connections." msgstr "SSL接続を有効にします。" -#: utils/misc/guc_tables.c:1080 +#: 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:1089 +#: utils/misc/guc_tables.c:1079 msgid "Give priority to server ciphersuite order." msgstr "サーバー側の暗号スイート順序を優先します。" -#: utils/misc/guc_tables.c:1098 +#: utils/misc/guc_tables.c:1088 msgid "Forces synchronization of updates to disk." msgstr "強制的に更新をディスクに同期します。" -#: utils/misc/guc_tables.c:1099 +#: 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:1110 +#: utils/misc/guc_tables.c:1100 msgid "Continues processing after a checksum failure." msgstr "チェックサムエラーの発生時に処理を継続します。" -#: utils/misc/guc_tables.c:1111 +#: 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:1125 +#: utils/misc/guc_tables.c:1115 msgid "Continues processing past damaged page headers." msgstr "破損したページヘッダがあっても処理を継続します。" -#: utils/misc/guc_tables.c:1126 +#: 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:1139 +#: utils/misc/guc_tables.c:1129 msgid "Continues recovery after an invalid pages failure." msgstr "不正ページエラーの発生時に処理を継続します。" -#: utils/misc/guc_tables.c:1140 +#: 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:1158 +#: 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:1159 +#: 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:1172 +#: 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:1182 +#: utils/misc/guc_tables.c:1172 msgid "Writes zeroes to new WAL files before first use." msgstr "新しいWALファイルの使用前にゼロを書き込みます。" -#: utils/misc/guc_tables.c:1192 +#: utils/misc/guc_tables.c:1182 msgid "Recycles WAL files by renaming them." msgstr "WALファイルを名前を変更して再利用します。" -#: utils/misc/guc_tables.c:1202 +#: utils/misc/guc_tables.c:1192 msgid "Logs each checkpoint." msgstr "チェックポイントをログに記録します。" -#: utils/misc/guc_tables.c:1211 +#: utils/misc/guc_tables.c:1201 msgid "Logs each successful connection." msgstr "成功した接続を全てログに記録します。" -#: utils/misc/guc_tables.c:1220 +#: utils/misc/guc_tables.c:1210 msgid "Logs details of pre-authentication connection handshake." msgstr "認証前接続ハンドシェークの詳細をログに出力します。" -#: utils/misc/guc_tables.c:1230 +#: utils/misc/guc_tables.c:1220 msgid "Logs end of a session, including duration." msgstr "セッションの終了時刻とその期間をログに記録します。" -#: utils/misc/guc_tables.c:1239 +#: utils/misc/guc_tables.c:1229 msgid "Logs each replication command." msgstr "各レプリケーションコマンドをログに記録します。" -#: utils/misc/guc_tables.c:1248 +#: utils/misc/guc_tables.c:1238 msgid "Shows whether the running server has assertion checks enabled." msgstr "起動中のサーバーがアサーションチェックを有効にしているかどうかを表示します。" -#: utils/misc/guc_tables.c:1259 +#: utils/misc/guc_tables.c:1249 msgid "Terminate session on any error." msgstr "何からのエラーがあればセッションを終了します" -#: utils/misc/guc_tables.c:1268 +#: utils/misc/guc_tables.c:1258 msgid "Reinitialize server after backend crash." msgstr "バックエンドがクラッシュした後サーバーを再初期化します" -#: utils/misc/guc_tables.c:1277 +#: utils/misc/guc_tables.c:1267 msgid "Remove temporary files after backend crash." msgstr "バックエンドのクラッシュ後に一時ファイルを削除します。" -#: utils/misc/guc_tables.c:1287 +#: 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:1297 +#: utils/misc/guc_tables.c:1287 msgid "Send SIGABRT not SIGKILL to stuck child processes." msgstr "固まっているプロセスにSIGKILLではなくSIGABRTを送信します。" -#: utils/misc/guc_tables.c:1308 +#: utils/misc/guc_tables.c:1298 msgid "Logs the duration of each completed SQL statement." msgstr "完了したSQL全ての実行時間をログに記録します。" -#: utils/misc/guc_tables.c:1318 -msgid "Set this to force all parse and plan trees to be passed through copyObject(), to facilitate catching errors and omissions in copyObject()." -msgstr "これを設定すると、すべてのパースおよび実行計画ツリーがcopyObject()を通過するようになり、copyObject()でのエラーや処理漏れを検出しやすくします。" - -#: utils/misc/guc_tables.c:1335 -msgid "Set this to force all parse and plan trees to be passed through outfuncs.c/readfuncs.c, to facilitate catching errors and omissions in those modules." -msgstr "これを設定すると、すべてのパースおよび実行計画ツリーがoutfuncs.c/readfuncs.cを通過するようになり、これらのモジュールでのエラーや処理漏れを検出しやすくします。" - -#: utils/misc/guc_tables.c:1352 -msgid "Set this to force all raw parse trees for DML statements to be scanned by raw_expression_tree_walker(), to facilitate catching errors and omissions in that function." -msgstr "これを設定すると、DML文のすべての未処理のパースツリーがraw_expression_tree_walker()でスキャンされ、この関数でのエラーや処理漏れを検出しやすくします。" - -#: utils/misc/guc_tables.c:1370 +#: utils/misc/guc_tables.c:1307 msgid "Logs each query's parse tree." msgstr "問い合わせのパースツリーをログに記録します。" -#: utils/misc/guc_tables.c:1379 +#: utils/misc/guc_tables.c:1316 msgid "Logs each query's rewritten parse tree." msgstr "リライト後の問い合わせのパースツリーをログに記録します。" -#: utils/misc/guc_tables.c:1388 +#: utils/misc/guc_tables.c:1325 msgid "Logs each query's execution plan." msgstr "問い合わせの実行計画をログに記録します。" -#: utils/misc/guc_tables.c:1397 +#: utils/misc/guc_tables.c:1334 msgid "Indents parse and plan tree displays." msgstr "パースツリーと実行計画ツリーの表示をインデントします。" -#: utils/misc/guc_tables.c:1406 +#: utils/misc/guc_tables.c:1343 msgid "Writes parser performance statistics to the server log." msgstr "パーサの性能統計情報をサーバーログに出力します。" -#: utils/misc/guc_tables.c:1415 +#: utils/misc/guc_tables.c:1352 msgid "Writes planner performance statistics to the server log." msgstr "プランナの性能統計情報をサーバーログに出力します。" -#: utils/misc/guc_tables.c:1424 +#: utils/misc/guc_tables.c:1361 msgid "Writes executor performance statistics to the server log." msgstr "エグゼキュータの性能統計情報をサーバーログに出力します。" -#: utils/misc/guc_tables.c:1433 +#: utils/misc/guc_tables.c:1370 msgid "Writes cumulative performance statistics to the server log." msgstr "累積の性能統計情報をサーバーログに出力します。" -#: utils/misc/guc_tables.c:1443 +#: 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:1455 +#: utils/misc/guc_tables.c:1392 msgid "Collects information about executing commands." msgstr "実行中のコマンドに関する情報を収集します。" -#: utils/misc/guc_tables.c:1456 +#: 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:1466 +#: utils/misc/guc_tables.c:1403 msgid "Collects statistics on database activity." msgstr "データベースの活動について統計情報を収集します。" -#: utils/misc/guc_tables.c:1475 +#: utils/misc/guc_tables.c:1412 msgid "Collects timing statistics for database I/O activity." msgstr "データベースのI/O処理時間に関する統計情報を収集します。" -#: utils/misc/guc_tables.c:1484 +#: utils/misc/guc_tables.c:1421 msgid "Collects timing statistics for WAL I/O activity." msgstr "WALのI/O処理時間に関する統計情報を収集します。" -#: utils/misc/guc_tables.c:1494 +#: utils/misc/guc_tables.c:1431 msgid "Updates the process title to show the active SQL command." msgstr "活動中のSQLコマンドを表示するようプロセスタイトルを更新します。" -#: utils/misc/guc_tables.c:1495 +#: 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:1504 +#: utils/misc/guc_tables.c:1441 msgid "Starts the autovacuum subprocess." msgstr "autovacuumサブプロセスを起動します。" -#: utils/misc/guc_tables.c:1514 +#: utils/misc/guc_tables.c:1451 msgid "Generates debugging output for LISTEN and NOTIFY." msgstr "LISTENとNOTIFYコマンドのためのデバッグ出力を生成します。" -#: utils/misc/guc_tables.c:1526 +#: utils/misc/guc_tables.c:1463 msgid "Emits information about lock usage." msgstr "ロック使用状況に関する情報を出力します。" -#: utils/misc/guc_tables.c:1536 +#: utils/misc/guc_tables.c:1473 msgid "Emits information about user lock usage." msgstr "ユーザーロックの使用状況に関する情報を出力します。" -#: utils/misc/guc_tables.c:1546 +#: utils/misc/guc_tables.c:1483 msgid "Emits information about lightweight lock usage." msgstr "軽量ロックの使用状況に関する情報を出力します。" -#: utils/misc/guc_tables.c:1556 +#: utils/misc/guc_tables.c:1493 msgid "Dumps information about all current locks when a deadlock timeout occurs." msgstr "デッドロックの発生時点の全てのロックについての情報をダンプします。" -#: utils/misc/guc_tables.c:1568 +#: utils/misc/guc_tables.c:1505 msgid "Logs long lock waits." msgstr "長時間のロック待機をログに記録します。" -#: utils/misc/guc_tables.c:1577 +#: utils/misc/guc_tables.c:1514 msgid "Logs standby recovery conflict waits." msgstr "スタンバイのリカバリ衝突による待機をログ出力します。" -#: utils/misc/guc_tables.c:1586 +#: utils/misc/guc_tables.c:1523 msgid "Logs the host name in the connection logs." msgstr "接続ログ内でホスト名を出力します。" -#: utils/misc/guc_tables.c:1587 +#: 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:1598 +#: 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:1599 +#: 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:1611 +#: utils/misc/guc_tables.c:1548 msgid "Sets the default read-only status of new transactions." msgstr "新しいトランザクションのリードオンリー設定のデフォルト値を設定。" -#: utils/misc/guc_tables.c:1621 +#: utils/misc/guc_tables.c:1558 msgid "Sets the current transaction's read-only status." msgstr "現在のトランザクションのリードオンリー設定を設定。" -#: utils/misc/guc_tables.c:1631 +#: utils/misc/guc_tables.c:1568 msgid "Sets the default deferrable status of new transactions." msgstr "新しいトランザクションの遅延可否設定のデフォルト値を設定。" -#: utils/misc/guc_tables.c:1640 +#: 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_tables.c:1650 +#: utils/misc/guc_tables.c:1587 msgid "Enable row security." msgstr "行セキュリティを有効にします。" -#: utils/misc/guc_tables.c:1651 +#: utils/misc/guc_tables.c:1588 msgid "When enabled, row security will be applied to all users." msgstr "有効にすると、行セキュリティが全てのユーザーに適用されます。" -#: utils/misc/guc_tables.c:1659 +#: utils/misc/guc_tables.c:1596 msgid "Check routine bodies during CREATE FUNCTION and CREATE PROCEDURE." msgstr "CREATE FUNCTIONおよびCREATE PROCEDUREにおいて関数本体を検査します。" -#: utils/misc/guc_tables.c:1668 +#: utils/misc/guc_tables.c:1605 msgid "Enable input of NULL elements in arrays." msgstr "配列内のNULL要素入力を有効化。" -#: utils/misc/guc_tables.c:1669 +#: 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_tables.c:1685 +#: 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_tables.c:1695 +#: utils/misc/guc_tables.c:1632 msgid "Start a subprocess to capture stderr, csvlog and/or jsonlog into log files." msgstr "標準エラー出力、CSVログ、および/またはJSONログをログファイルに記録するための子プロセスを開始します。" -#: utils/misc/guc_tables.c:1704 +#: utils/misc/guc_tables.c:1641 msgid "Truncate existing log files of same name during log rotation." msgstr "ログローテーション時に既存の同一名称のログファイルを切り詰めます。" -#: utils/misc/guc_tables.c:1714 +#: utils/misc/guc_tables.c:1652 msgid "Emit information about resource usage in sorting." msgstr "ソート中にリソース使用状況に関する情報を出力します。" -#: utils/misc/guc_tables.c:1727 +#: utils/misc/guc_tables.c:1666 msgid "Generate debugging output for synchronized scanning." msgstr "同期スキャン処理のデバッグ出力を生成します。" -#: utils/misc/guc_tables.c:1742 +#: utils/misc/guc_tables.c:1681 msgid "Enable bounded sorting using heap sort." -msgstr "ヒープソートを使用した境界のソート処理を有効にします" +msgstr "ヒープソートを使用した有界ソート処理を有効にします。" -#: utils/misc/guc_tables.c:1755 +#: utils/misc/guc_tables.c:1694 msgid "Emit WAL-related debugging output." msgstr "WAL関連のデバッグ出力を出力します。" -#: utils/misc/guc_tables.c:1767 +#: utils/misc/guc_tables.c:1706 msgid "Shows whether datetimes are integer based." msgstr "日付時刻が整数ベースかどうかを表示します。" -#: utils/misc/guc_tables.c:1778 +#: 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_tables.c:1788 +#: utils/misc/guc_tables.c:1727 msgid "Sets whether GSSAPI delegation should be accepted from the client." msgstr "GSSAPI資格証明委任をクライアントから受け付けるかどかを設定します。" -#: utils/misc/guc_tables.c:1798 +#: utils/misc/guc_tables.c:1737 msgid "Warn about backslash escapes in ordinary string literals." msgstr "普通の文字列リテラル内のバックスラッシュエスケープを警告します。" -#: utils/misc/guc_tables.c:1808 +#: utils/misc/guc_tables.c:1747 msgid "Causes '...' strings to treat backslashes literally." msgstr "'...' 文字列はバックスラッシュをそのまま扱います。" -#: utils/misc/guc_tables.c:1819 +#: utils/misc/guc_tables.c:1758 msgid "Enable synchronized sequential scans." msgstr "同期シーケンシャルスキャンを有効にします。" -#: utils/misc/guc_tables.c:1829 +#: utils/misc/guc_tables.c:1768 msgid "Sets whether to include or exclude transaction with recovery target." msgstr "リカバリ目標のトランザクションを含めるか除外するかを設定。" -#: utils/misc/guc_tables.c:1839 +#: utils/misc/guc_tables.c:1778 msgid "Starts the WAL summarizer process to enable incremental backup." msgstr "差分バックアップを可能にするためのWAL集約プロセスを起動します。" -#: utils/misc/guc_tables.c:1849 +#: utils/misc/guc_tables.c:1788 msgid "Allows connections and queries during recovery." msgstr "リカバリ中でも接続と問い合わせを受け付けます" -#: utils/misc/guc_tables.c:1859 +#: 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:1869 +#: utils/misc/guc_tables.c:1808 msgid "Shows whether hot standby is currently active." msgstr "現在ホットスタンバイが有効であるかどうかを示します。" -#: utils/misc/guc_tables.c:1880 +#: utils/misc/guc_tables.c:1819 msgid "Allows modifications of the structure of system tables." msgstr "システムテーブル構造の変更を許可。" -#: utils/misc/guc_tables.c:1891 +#: utils/misc/guc_tables.c:1830 msgid "Disables reading from system indexes." msgstr "システムインデックスの読み込みを無効にします。" -#: utils/misc/guc_tables.c:1892 +#: 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:1903 +#: utils/misc/guc_tables.c:1842 msgid "Allows tablespaces directly inside pg_tblspc, for testing." msgstr "pg_tblspc直下のテーブル空間を許可します、テスト用。" -#: utils/misc/guc_tables.c:1914 +#: utils/misc/guc_tables.c:1853 msgid "Enables backward compatibility mode for privilege checks on large objects." msgstr "ラージオブジェクトで権限チェックを行う際、後方互換性モードを有効にします。" -#: utils/misc/guc_tables.c:1915 +#: 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:1925 +#: utils/misc/guc_tables.c:1864 msgid "When generating SQL fragments, quote all identifiers." msgstr "SQL文を生成する時に、すべての識別子を引用符で囲みます。" -#: utils/misc/guc_tables.c:1935 +#: utils/misc/guc_tables.c:1874 msgid "Shows whether data checksums are turned on for this cluster." msgstr "データチェックサムがこのクラスタで有効になっているかどうかを表示します。" -#: utils/misc/guc_tables.c:1946 +#: utils/misc/guc_tables.c:1885 msgid "Add sequence number to syslog messages to avoid duplicate suppression." msgstr "シーケンス番号を付加することでsyslogメッセージの重複を防ぎます。" -#: utils/misc/guc_tables.c:1956 +#: 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:1966 +#: 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:1967 +#: utils/misc/guc_tables.c:1906 msgid "Should gather nodes also run subplans or just gather tuples?" msgstr "Gather ノードでも下位プランを実行するのか、もしくはただタプルの収集のみを行うのか?" -#: utils/misc/guc_tables.c:1977 +#: utils/misc/guc_tables.c:1916 msgid "Allow JIT compilation." msgstr "JITコンパイルを許可します。" -#: utils/misc/guc_tables.c:1988 +#: utils/misc/guc_tables.c:1927 msgid "Register JIT-compiled functions with debugger." msgstr "JITコンパイルされた関数をデバッガに登録します。" -#: utils/misc/guc_tables.c:2005 +#: utils/misc/guc_tables.c:1944 msgid "Write out LLVM bitcode to facilitate JIT debugging." msgstr "LLVMビットコードを出力して、JITデバッグを容易にします。" -#: utils/misc/guc_tables.c:2016 +#: utils/misc/guc_tables.c:1955 msgid "Allow JIT compilation of expressions." msgstr "式のJITコンパイルを許可します。" -#: utils/misc/guc_tables.c:2027 +#: utils/misc/guc_tables.c:1966 msgid "Register JIT-compiled functions with perf profiler." msgstr "perfプロファイラにJITコンパイルされた関数を登録します。" -#: utils/misc/guc_tables.c:2044 +#: utils/misc/guc_tables.c:1983 msgid "Allow JIT compilation of tuple deforming." msgstr "タプル分解処理のJITコンパイルを許可します。" -#: utils/misc/guc_tables.c:2055 +#: utils/misc/guc_tables.c:1994 msgid "Whether to continue running after a failure to sync data files." msgstr "データファイルの同期失敗の後に処理を継続するかどうか。" -#: utils/misc/guc_tables.c:2064 +#: 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:2073 +#: utils/misc/guc_tables.c:2012 msgid "Enables event triggers." msgstr "イベントトリガを有効にします。" -#: utils/misc/guc_tables.c:2074 +#: utils/misc/guc_tables.c:2013 msgid "When enabled, event triggers will fire for all applicable statements." msgstr "有効にすると、イベントトリガは適用可能なすべての文に対して発火します。" -#: utils/misc/guc_tables.c:2083 +#: 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:2092 -msgid "Enables deprecation warnings for MD5 passwords." -msgstr "MD5パスワードの非推奨警告を有効にする。" - -#: utils/misc/guc_tables.c:2110 +#: 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:2121 +#: 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:2123 utils/misc/guc_tables.c:2861 +#: 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:2132 +#: utils/misc/guc_tables.c:2062 msgid "Sets the default statistics target." msgstr "デフォルトの統計情報収集目標を設定。" -#: utils/misc/guc_tables.c:2133 +#: 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:2142 +#: 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:2144 +#: 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:2155 +#: 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:2157 +#: 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:2168 +#: 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:2178 +#: 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:2188 +#: utils/misc/guc_tables.c:2118 msgid "GEQO: number of individuals in the population." msgstr "GEQO: 集団内の個体数。" -#: utils/misc/guc_tables.c:2189 utils/misc/guc_tables.c:2199 +#: 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:2198 +#: utils/misc/guc_tables.c:2128 msgid "GEQO: number of iterations of the algorithm." msgstr "GEQO: アルゴリズムの反復回数です。" -#: utils/misc/guc_tables.c:2210 +#: 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:2221 +#: 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:2232 +#: 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:2243 +#: utils/misc/guc_tables.c:2173 msgid "Sets the minimum delay for applying changes during recovery." msgstr "リカバリ中の変更の適用の最小遅延時間を設定します。" -#: utils/misc/guc_tables.c:2254 +#: 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:2265 +#: 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:2276 +#: utils/misc/guc_tables.c:2206 msgid "Sets the maximum number of concurrent connections." msgstr "同時接続数の最大値を設定。" -#: utils/misc/guc_tables.c:2287 +#: utils/misc/guc_tables.c:2217 msgid "Sets the number of connection slots reserved for superusers." msgstr "スーパーユーザーによる接続用に予約される接続スロットの数を設定。" -#: utils/misc/guc_tables.c:2297 +#: 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:2308 +#: utils/misc/guc_tables.c:2238 msgid "Amount of dynamic shared memory reserved at startup." msgstr "起動時に予約される動的共有メモリの量。" -#: utils/misc/guc_tables.c:2323 +#: utils/misc/guc_tables.c:2253 msgid "Sets the number of shared memory buffers used by the server." msgstr "サーバーで使用される共有メモリのバッファ数を設定。" -#: utils/misc/guc_tables.c:2334 +#: 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:2345 +#: 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:2356 +#: 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:2357 +#: utils/misc/guc_tables.c:2287 msgid "-1 indicates that the value could not be determined." msgstr "-1はこの値が確定できなかったことを示します。" -#: utils/misc/guc_tables.c:2367 -msgid "Shows the number of semaphores required for the server." -msgstr "サーバーで必要となるセマフォの数を表示。" - -#: utils/misc/guc_tables.c:2378 +#: 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:2379 utils/misc/guc_tables.c:2434 utils/misc/guc_tables.c:2445 -msgid "Specify 0 to have this value determined as a fraction of \"shared_buffers\"." -msgstr "0を指定するとこの値が\"shared_buffers\"に対する比率に基づいて決定されます。" +#: 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:2389 +#: 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:2400 +#: 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:2411 +#: 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:2422 +#: 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:2433 +#: 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:2444 +#: 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:2455 +#: utils/misc/guc_tables.c:2374 msgid "Sets the maximum number of temporary buffers used by each session." msgstr "各セッションで使用される一時バッファの最大数を設定。" -#: utils/misc/guc_tables.c:2466 +#: utils/misc/guc_tables.c:2385 msgid "Sets the TCP port the server listens on." msgstr "サーバーが接続を監視するTCPポートを設定。" -#: utils/misc/guc_tables.c:2476 +#: utils/misc/guc_tables.c:2395 msgid "Sets the access permissions of the Unix-domain socket." msgstr "Unixドメインソケットのアクセス権限を設定。" -#: utils/misc/guc_tables.c:2477 +#: 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:2491 +#: utils/misc/guc_tables.c:2410 msgid "Sets the file permissions for log files." msgstr "ログファイルのパーミッションを設定。" -#: utils/misc/guc_tables.c:2492 +#: 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:2506 +#: utils/misc/guc_tables.c:2425 msgid "Shows the mode of the data directory." msgstr "データディレクトリのモードを表示します。" -#: utils/misc/guc_tables.c:2507 +#: 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:2520 +#: utils/misc/guc_tables.c:2439 msgid "Sets the maximum memory to be used for query workspaces." msgstr "問い合わせの作業用空間として使用されるメモリの最大値を設定。" -#: utils/misc/guc_tables.c:2521 +#: 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:2538 +#: utils/misc/guc_tables.c:2457 msgid "Sets the maximum memory to be used for maintenance operations." msgstr "保守作業で使用される最大メモリ量を設定。" -#: utils/misc/guc_tables.c:2539 +#: 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:2549 +#: utils/misc/guc_tables.c:2468 msgid "Sets the maximum memory to be used for logical decoding." msgstr "論理デコーディングで使用するメモリ量の上限を設定します。" -#: utils/misc/guc_tables.c:2550 +#: 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:2566 +#: utils/misc/guc_tables.c:2485 msgid "Sets the maximum stack depth, in kilobytes." msgstr "スタック長の最大値をキロバイト単位で設定。" -#: utils/misc/guc_tables.c:2577 +#: 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:2578 +#: utils/misc/guc_tables.c:2497 msgid "-1 means no limit." msgstr "-1は無制限を意味します。" -#: utils/misc/guc_tables.c:2588 +#: 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:2598 +#: 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:2608 +#: utils/misc/guc_tables.c:2527 msgid "Vacuum cost for a page dirtied by vacuum." msgstr "VACUUM処理が1つのページをダーティにした際に課すコスト。" -#: utils/misc/guc_tables.c:2618 +#: utils/misc/guc_tables.c:2537 msgid "Vacuum cost amount available before napping." msgstr "VACUUM処理を一時休止させるまでに使用できるコスト。" -#: utils/misc/guc_tables.c:2628 +#: utils/misc/guc_tables.c:2547 msgid "Vacuum cost amount available before napping, for autovacuum." msgstr "自動VACUUM用のVACUUM処理を一時休止させるまでに使用できるコスト。" -#: utils/misc/guc_tables.c:2638 +#: 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:2651 +#: utils/misc/guc_tables.c:2570 msgid "Sets the maximum number of simultaneously prepared transactions." msgstr "同時に準備状態にできるトランザクションの最大数を設定。" -#: utils/misc/guc_tables.c:2662 +#: utils/misc/guc_tables.c:2581 msgid "Sets the minimum OID of tables for tracking locks." msgstr "ロックの追跡を行うテーブルの最小のOIDを設定。" -#: utils/misc/guc_tables.c:2663 +#: utils/misc/guc_tables.c:2582 msgid "Is used to avoid output on system tables." msgstr "システムテーブルに関するの出力を避けるために使います。" -#: utils/misc/guc_tables.c:2672 +#: utils/misc/guc_tables.c:2591 msgid "Sets the OID of the table with unconditionally lock tracing." msgstr "無条件でロックの追跡を行うテーブルのOIDを設定。" -#: utils/misc/guc_tables.c:2684 +#: utils/misc/guc_tables.c:2603 msgid "Sets the maximum allowed duration of any statement." msgstr "あらゆる文に対して実行時間として許容する上限値を設定。" -#: utils/misc/guc_tables.c:2685 utils/misc/guc_tables.c:2696 utils/misc/guc_tables.c:2707 utils/misc/guc_tables.c:2718 utils/misc/guc_tables.c:2729 +#: 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:2695 +#: utils/misc/guc_tables.c:2614 msgid "Sets the maximum allowed duration of any wait for a lock." msgstr "ロックの待機の最大許容時間を設定。" -#: utils/misc/guc_tables.c:2706 +#: 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:2717 +#: 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:2728 +#: 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:2739 +#: 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:2749 +#: 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:2759 +#: 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:2769 +#: 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:2779 +#: 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:2788 +#: 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:2801 +#: utils/misc/guc_tables.c:2720 msgid "Sets the maximum number of locks per transaction." msgstr "1トランザクション当たりのロック数の上限を設定。" -#: utils/misc/guc_tables.c:2802 +#: 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:2813 +#: utils/misc/guc_tables.c:2732 msgid "Sets the maximum number of predicate locks per transaction." msgstr "1トランザクション当たりの述語ロック数の上限を設定。" -#: utils/misc/guc_tables.c:2814 +#: 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:2825 +#: 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:2826 +#: 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:2836 +#: utils/misc/guc_tables.c:2755 msgid "Sets the maximum number of predicate-locked tuples per page." msgstr "1ページあたりで述語ロックされるタプル数の上限値を設定。" -#: utils/misc/guc_tables.c:2837 +#: 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:2847 +#: utils/misc/guc_tables.c:2766 msgid "Sets the maximum allowed time to complete client authentication." msgstr "クライアント認証の完了までの最大許容時間を設定。" -#: utils/misc/guc_tables.c:2859 +#: 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:2871 +#: 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:2881 +#: utils/misc/guc_tables.c:2800 msgid "Buffer size for reading ahead in the WAL during recovery." msgstr "リカバリ中のWAL先読みバッファのサイズ。" -#: utils/misc/guc_tables.c:2882 +#: 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:2892 +#: utils/misc/guc_tables.c:2811 msgid "Sets the size of WAL files held for standby servers." msgstr "スタンバイサーバーのために確保するWALの量を設定します。" -#: utils/misc/guc_tables.c:2903 +#: utils/misc/guc_tables.c:2822 msgid "Sets the minimum size to shrink the WAL to." msgstr "WALを縮小させる際の最小のサイズを設定。" -#: utils/misc/guc_tables.c:2915 +#: utils/misc/guc_tables.c:2834 msgid "Sets the WAL size that triggers a checkpoint." msgstr "チェックポイントの契機となるWALのサイズを指定。" -#: utils/misc/guc_tables.c:2927 +#: utils/misc/guc_tables.c:2846 msgid "Sets the maximum time between automatic WAL checkpoints." msgstr "自動WALチェックポイントの最大間隔を設定。" -#: utils/misc/guc_tables.c:2938 +#: 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:2940 +#: 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:2953 utils/misc/guc_tables.c:3171 utils/misc/guc_tables.c:3225 +#: 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:2964 +#: 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:2965 -msgid "Specify -1 to have this value determined as a fraction of \"shared_buffers\"." -msgstr "-1を指定するとこの値が\"shared_buffers\"に対する比率に基づいて決定されます。" +#: 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:2975 +#: utils/misc/guc_tables.c:2894 msgid "Time between WAL flushes performed in the WAL writer." msgstr "WALライタで実行する書き出しの時間間隔。" -#: utils/misc/guc_tables.c:2986 +#: 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:2997 +#: 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:3008 +#: utils/misc/guc_tables.c:2927 msgid "Sets the maximum number of simultaneously running WAL sender processes." msgstr "WAL送信プロセスの最大同時実行数を設定。" -#: utils/misc/guc_tables.c:3019 +#: utils/misc/guc_tables.c:2938 msgid "Sets the maximum number of simultaneously defined replication slots." msgstr "同時に定義できるレプリケーションスロットの数の最大値を設定。" -#: utils/misc/guc_tables.c:3029 +#: 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:3030 +#: 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:3042 +#: utils/misc/guc_tables.c:2961 msgid "Sets the maximum time to wait for WAL replication." msgstr "WALレプリケーションを待つ時間の最大値を設定。" -#: utils/misc/guc_tables.c:3053 +#: 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:3065 +#: 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:3076 +#: utils/misc/guc_tables.c:2995 msgid "Sets the number of digits displayed for floating-point values." msgstr "浮動小数点値の表示桁数を設定。" -#: utils/misc/guc_tables.c:3077 +#: 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:3089 -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: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:3092 +#: 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:3102 +#: 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:3104 +#: utils/misc/guc_tables.c:3023 msgid "Zero prints all queries. -1 turns this feature off." msgstr "ゼロにすると全ての問い合わせを出力します。-1はこの機能を無効にします。" -#: utils/misc/guc_tables.c:3114 +#: 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:3116 +#: utils/misc/guc_tables.c:3035 msgid "Zero prints all actions. -1 turns autovacuum logging off." msgstr "ゼロはすべての活動を出力します。-1は自動VACUUMのログ記録を無効にします。" -#: utils/misc/guc_tables.c:3126 +#: 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:3128 utils/misc/guc_tables.c:3140 +#: 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:3138 +#: 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:3150 +#: utils/misc/guc_tables.c:3069 msgid "Background writer sleep time between rounds." msgstr "バックグランドライタの周期毎の待機時間" -#: utils/misc/guc_tables.c:3161 +#: 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:3184 +#: 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:3198 +#: 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:3213 +#: utils/misc/guc_tables.c:3132 msgid "Limit on the size of data reads and writes." msgstr "データの読み込みとか書き込みのサイズ制限" -#: utils/misc/guc_tables.c:3238 +#: utils/misc/guc_tables.c:3157 msgid "Maximum number of concurrent worker processes." msgstr "同時に実行されるワーカープロセス数の最大値です。" -#: utils/misc/guc_tables.c:3250 +#: utils/misc/guc_tables.c:3169 msgid "Maximum number of logical replication worker processes." msgstr "レプリケーションワーカープロセス数の最大値です。" -#: utils/misc/guc_tables.c:3262 +#: utils/misc/guc_tables.c:3181 msgid "Maximum number of table synchronization workers per subscription." msgstr "サブスクリプション毎のテーブル同期ワーカー数の最大値です。" -#: utils/misc/guc_tables.c:3274 +#: utils/misc/guc_tables.c:3193 msgid "Maximum number of parallel apply workers per subscription." msgstr "サブスクリプション毎のテーブル適用ワーカー数の最大値です。" -#: utils/misc/guc_tables.c:3284 +#: 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:3296 +#: 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:3308 +#: utils/misc/guc_tables.c:3227 msgid "Shows the maximum number of function arguments." msgstr "関数の引数の最大数を示します。" -#: utils/misc/guc_tables.c:3319 +#: utils/misc/guc_tables.c:3238 msgid "Shows the maximum number of index keys." msgstr "インデックスキーの最大数を示します。" -#: utils/misc/guc_tables.c:3330 +#: utils/misc/guc_tables.c:3249 msgid "Shows the maximum identifier length." msgstr "識別子の最大長を示します。" -#: utils/misc/guc_tables.c:3341 +#: utils/misc/guc_tables.c:3260 msgid "Shows the size of a disk block." msgstr "ディスクブロックサイズを示します。" -#: utils/misc/guc_tables.c:3352 +#: utils/misc/guc_tables.c:3271 msgid "Shows the number of pages per disk file." msgstr "ディスクファイルごとのページ数を表示します。" -#: utils/misc/guc_tables.c:3363 +#: utils/misc/guc_tables.c:3282 msgid "Shows the block size in the write ahead log." msgstr "先行書き込みログ(WAL)におけるブロックサイズを表示します" -#: utils/misc/guc_tables.c:3374 +#: 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:3386 +#: utils/misc/guc_tables.c:3305 msgid "Shows the size of write ahead log segments." msgstr "先行書き込みログ(WAL)セグメントのサイズを表示します" -#: utils/misc/guc_tables.c:3399 +#: utils/misc/guc_tables.c:3318 msgid "Time for which WAL summary files should be kept." msgstr "WAL集約ファイルを保持する時間。" -#: utils/misc/guc_tables.c:3412 +#: utils/misc/guc_tables.c:3331 msgid "Time to sleep between autovacuum runs." msgstr "自動VACUUMの実行開始間隔。" -#: utils/misc/guc_tables.c:3422 +#: utils/misc/guc_tables.c:3341 msgid "Minimum number of tuple updates or deletes prior to vacuum." msgstr "VACUUMを行うまでの、タプルを更新または削除した回数の最小値。" -#: utils/misc/guc_tables.c:3431 -msgid "Maximum number of tuple updates or deletes prior to vacuum, or -1 to disable maximum threshold." -msgstr "VACUUMを行うまでの、タプルを更新または削除した回数の上限、または -1 を指定するとこの上限を無効化。" - -#: utils/misc/guc_tables.c:3440 +#: 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:3449 +#: 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:3459 +#: 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:3471 +#: 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:3481 -msgid "Sets the number of backend slots to allocate for autovacuum workers." -msgstr "自動VACUUMプロセスに割り当てるバックエンドスロット数を設定。" - -#: utils/misc/guc_tables.c:3490 +#: utils/misc/guc_tables.c:3391 msgid "Sets the maximum number of simultaneously running autovacuum worker processes." msgstr "自動VACUUMのワーカープロセスの最大同時実行数を設定。" -#: utils/misc/guc_tables.c:3500 +#: utils/misc/guc_tables.c:3401 msgid "Sets the maximum number of parallel processes per maintenance operation." msgstr "ひとつの保守作業に割り当てる並列処理プロセスの数の最大値を設定。" -#: utils/misc/guc_tables.c:3510 +#: utils/misc/guc_tables.c:3411 msgid "Sets the maximum number of parallel processes per executor node." msgstr "エグゼキュータノードあたりの並列処理プロセスの数の最大値を設定。" -#: utils/misc/guc_tables.c:3521 +#: 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:3532 +#: 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:3543 +#: utils/misc/guc_tables.c:3444 msgid "Time between issuing TCP keepalives." msgstr "TCPキープアライブを発行する時間間隔。" -#: utils/misc/guc_tables.c:3544 utils/misc/guc_tables.c:3555 utils/misc/guc_tables.c:3679 +#: 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:3554 +#: utils/misc/guc_tables.c:3455 msgid "Time between TCP keepalive retransmits." msgstr "TCPキープアライブの再送信の時間間隔。" -#: utils/misc/guc_tables.c:3565 +#: 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:3576 +#: utils/misc/guc_tables.c:3477 msgid "Maximum number of TCP keepalive retransmits." msgstr "TCPキープアライブの再送信回数の最大値です。" -#: utils/misc/guc_tables.c:3577 +#: 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:3588 +#: utils/misc/guc_tables.c:3489 msgid "Sets the maximum allowed result for exact search by GIN." msgstr "GINによる正確な検索に対して許容する結果数の最大値を設定。" -#: utils/misc/guc_tables.c:3599 +#: 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:3600 +#: 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:3611 +#: utils/misc/guc_tables.c:3512 msgid "Sets the minimum amount of table data for a parallel scan." msgstr "並列スキャンを検討するテーブルデータの量の最小値を設定。" -#: utils/misc/guc_tables.c:3612 +#: 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:3622 +#: utils/misc/guc_tables.c:3523 msgid "Sets the minimum amount of index data for a parallel scan." msgstr "並列スキャンを検討するインデックスデータの量の最小値を設定。" -#: utils/misc/guc_tables.c:3623 +#: 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:3634 +#: utils/misc/guc_tables.c:3535 msgid "Shows the server version as an integer." msgstr "サーバーのバージョンを整数値で表示します。" -#: utils/misc/guc_tables.c:3645 +#: 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:3646 +#: 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:3656 +#: 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:3667 +#: 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:3678 +#: utils/misc/guc_tables.c:3579 msgid "TCP user timeout." msgstr "TCPユーザータイムアウト。" -#: utils/misc/guc_tables.c:3689 +#: utils/misc/guc_tables.c:3590 msgid "The size of huge page that should be requested." msgstr "要求が見込まれるヒュージページのサイズ。" -#: utils/misc/guc_tables.c:3700 +#: utils/misc/guc_tables.c:3601 msgid "Aggressively flush system caches for debugging purposes." msgstr "デバッグ目的のために積極的にシステムキャッシュを消去する。" -#: utils/misc/guc_tables.c:3723 +#: utils/misc/guc_tables.c:3624 msgid "Sets the time interval between checks for disconnection while running queries." msgstr "問い合わせ実行中に接続確認を行う時間間隔を設定します。" -#: utils/misc/guc_tables.c:3734 +#: utils/misc/guc_tables.c:3635 msgid "Time between progress updates for long-running startup operations." msgstr "起動処理が長引いた際のステータス更新の時間間隔。" -#: utils/misc/guc_tables.c:3736 +#: utils/misc/guc_tables.c:3637 msgid "0 turns this feature off." msgstr "ゼロにするとこの機能を無効にします。" -#: utils/misc/guc_tables.c:3746 +#: utils/misc/guc_tables.c:3647 msgid "Sets the iteration count for SCRAM secret generation." msgstr "SCRAMシークレット生成の際の反復回数を設定。" -#: utils/misc/guc_tables.c:3766 +#: 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:3777 +#: 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:3788 +#: 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:3799 +#: 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:3810 +#: 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:3821 +#: 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:3832 +#: 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:3844 +#: utils/misc/guc_tables.c:3745 msgid "Perform JIT compilation if query is more expensive." msgstr "問い合わせがこの値より高コストであればJITコンパイルを実行します。" -#: utils/misc/guc_tables.c:3845 +#: utils/misc/guc_tables.c:3746 msgid "-1 disables JIT compilation." msgstr "-1 でJITコンパイルを禁止します。" -#: utils/misc/guc_tables.c:3855 +#: utils/misc/guc_tables.c:3756 msgid "Optimize JIT-compiled functions if query is more expensive." msgstr "問い合わせがこの値より高コストであればJITコンパイルされた関数を最適化します。" -#: utils/misc/guc_tables.c:3856 +#: utils/misc/guc_tables.c:3757 msgid "-1 disables optimization." msgstr "-1で最適化を行わなくなります。" -#: utils/misc/guc_tables.c:3866 +#: utils/misc/guc_tables.c:3767 msgid "Perform JIT inlining if query is more expensive." msgstr "問い合わせがこの値より高コストであればJITコンパイルされた関数をインライン化します。" -#: utils/misc/guc_tables.c:3867 +#: utils/misc/guc_tables.c:3768 msgid "-1 disables inlining." msgstr "-1 でインライン化を禁止します。" -#: utils/misc/guc_tables.c:3877 +#: 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:3889 +#: 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:3901 +#: utils/misc/guc_tables.c:3802 msgid "GEQO: selective pressure within the population." msgstr "GEQO: 集合内の選択圧力。" -#: utils/misc/guc_tables.c:3912 +#: utils/misc/guc_tables.c:3813 msgid "GEQO: seed for random path selection." msgstr "GEQO: ランダムパス選択用のシード" -#: utils/misc/guc_tables.c:3923 +#: utils/misc/guc_tables.c:3824 msgid "Multiple of \"work_mem\" to use for hash tables." msgstr "ハッシュテーブルで使用する\"work_mem\"に対する倍率。" -#: utils/misc/guc_tables.c:3934 +#: utils/misc/guc_tables.c:3835 msgid "Multiple of the average buffer usage to free per round." msgstr "周期ごとに解放するバッファ数の平均バッファ使用量に対する倍数" -#: utils/misc/guc_tables.c:3944 +#: utils/misc/guc_tables.c:3845 msgid "Sets the seed for random-number generation." msgstr "乱数生成用のシードを設定。" -#: utils/misc/guc_tables.c:3955 +#: utils/misc/guc_tables.c:3856 msgid "Vacuum cost delay in milliseconds." msgstr "ミリ秒単位のコストベースのVACUUM処理の遅延時間です。" -#: utils/misc/guc_tables.c:3966 +#: utils/misc/guc_tables.c:3867 msgid "Vacuum cost delay in milliseconds, for autovacuum." msgstr "自動VACUUM用のミリ秒単位のコストベースのVACUUM処理の遅延時間です。" -#: utils/misc/guc_tables.c:3977 +#: 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:3987 +#: 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:3997 +#: 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:4007 +#: 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:4017 +#: 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:4018 +#: 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:4027 +#: utils/misc/guc_tables.c:3928 msgid "Sets the fraction of transactions from which to log all statements." msgstr "すべての文をログ出力するトランザクションの割合を設定します。" -#: utils/misc/guc_tables.c:4028 +#: 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:4047 +#: 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:4048 +#: utils/misc/guc_tables.c:3949 msgid "This is used only if \"archive_library\" is not set." msgstr "これは\"archive_library\"の設定がされていない場合にのみ使用されます。" # hoge -#: utils/misc/guc_tables.c:4057 +#: 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:4058 +#: utils/misc/guc_tables.c:3959 msgid "An empty string indicates that \"archive_command\" should be used." -msgstr "空文字列は\"archive_command\"の使用を指示します。" +msgstr "空文字列で\"archive_command\"を使用することを示します。" # hoge -#: utils/misc/guc_tables.c:4067 +#: 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:4077 +#: 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:4087 +#: 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:4097 +#: utils/misc/guc_tables.c:3998 msgid "Specifies the timeline to recover into." msgstr "リカバリの目標タイムラインを指定します。" -#: utils/misc/guc_tables.c:4107 +#: 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:4116 +#: utils/misc/guc_tables.c:4017 msgid "Sets the transaction ID up to which recovery will proceed." msgstr "リカバリを指定したトランザクションIDまで進めます。" -#: utils/misc/guc_tables.c:4125 +#: utils/misc/guc_tables.c:4026 msgid "Sets the time stamp up to which recovery will proceed." msgstr "リカバリを指定したタイムスタンプの時刻まで進めます。" -#: utils/misc/guc_tables.c:4134 +#: utils/misc/guc_tables.c:4035 msgid "Sets the named restore point up to which recovery will proceed." msgstr "リカバリを指定した名前のリストアポイントまで進めます。" -#: utils/misc/guc_tables.c:4143 +#: 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:4153 +#: 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:4164 +#: 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:4174 +#: utils/misc/guc_tables.c:4075 msgid "Sets the client's character set encoding." msgstr "クライアントの文字集合の符号化方式を設定。" -#: utils/misc/guc_tables.c:4185 +#: utils/misc/guc_tables.c:4086 msgid "Controls information prefixed to each log line." msgstr "各ログ行の前に付ける情報を制御します。" -#: utils/misc/guc_tables.c:4186 +#: utils/misc/guc_tables.c:4087 msgid "If blank, no prefix is used." msgstr "もし空であればなにも付加しません。" -#: utils/misc/guc_tables.c:4195 +#: utils/misc/guc_tables.c:4096 msgid "Sets the time zone to use in log messages." msgstr "ログメッセージ使用するタイムゾーンを設定。" -#: utils/misc/guc_tables.c:4205 +#: utils/misc/guc_tables.c:4106 msgid "Sets the display format for date and time values." msgstr "日付時刻値の表示用書式を設定。" -#: utils/misc/guc_tables.c:4206 +#: utils/misc/guc_tables.c:4107 msgid "Also controls interpretation of ambiguous date inputs." msgstr "曖昧な日付の入力の解釈も制御します。" -#: utils/misc/guc_tables.c:4217 +#: utils/misc/guc_tables.c:4118 msgid "Sets the default table access method for new tables." msgstr "新規テーブルで使用されるデフォルトテーブルアクセスメソッドを設定。" -#: utils/misc/guc_tables.c:4228 +#: utils/misc/guc_tables.c:4129 msgid "Sets the default tablespace to create tables and indexes in." msgstr "テーブルとインデックスの作成先となるデフォルトのテーブル空間を設定。" -#: utils/misc/guc_tables.c:4229 +#: utils/misc/guc_tables.c:4130 msgid "An empty string selects the database's default tablespace." msgstr "空文字列はデータベースのデフォルトのテーブル空間を選択します。" -#: utils/misc/guc_tables.c:4239 +#: 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:4250 +#: 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:4262 +#: utils/misc/guc_tables.c:4163 msgid "Sets the path for dynamically loadable modules." msgstr "動的ロード可能モジュールのパスを設定。" -#: utils/misc/guc_tables.c:4263 +#: 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:4276 +#: utils/misc/guc_tables.c:4177 msgid "Sets the location of the Kerberos server key file." msgstr "Kerberosサーバーキーファイルの場所を設定。" -#: utils/misc/guc_tables.c:4287 +#: utils/misc/guc_tables.c:4188 msgid "Sets the Bonjour service name." msgstr "Bonjour サービス名を設定。" -#: utils/misc/guc_tables.c:4297 +#: utils/misc/guc_tables.c:4198 msgid "Sets the language in which messages are displayed." msgstr "表示用メッセージの言語を設定。" -#: utils/misc/guc_tables.c:4307 +#: utils/misc/guc_tables.c:4208 msgid "Sets the locale for formatting monetary amounts." msgstr "通貨書式で使用するロケールを設定。 " -#: utils/misc/guc_tables.c:4317 +#: utils/misc/guc_tables.c:4218 msgid "Sets the locale for formatting numbers." msgstr "数字の書式で使用するロケールを設定。" -#: utils/misc/guc_tables.c:4327 +#: utils/misc/guc_tables.c:4228 msgid "Sets the locale for formatting date and time values." msgstr "日付と時間の書式で使用するロケールを設定。" -#: utils/misc/guc_tables.c:4337 +#: utils/misc/guc_tables.c:4238 msgid "Lists shared libraries to preload into each backend." msgstr "各バックエンドに事前ロードする共有ライブラリを列挙します。" -#: utils/misc/guc_tables.c:4348 +#: utils/misc/guc_tables.c:4249 msgid "Lists shared libraries to preload into server." msgstr "サーバーに事前ロードする共有ライブラリを列挙します。" -#: utils/misc/guc_tables.c:4359 +#: utils/misc/guc_tables.c:4260 msgid "Lists unprivileged shared libraries to preload into each backend." msgstr "各バックエンドに事前読み込みする非特権共有ライブラリを列挙します。" -#: utils/misc/guc_tables.c:4370 +#: 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:4382 +#: utils/misc/guc_tables.c:4283 msgid "Shows the server (database) character set encoding." msgstr "サーバー(データベース)文字セット符号化方式を表示します。" -#: utils/misc/guc_tables.c:4394 +#: utils/misc/guc_tables.c:4295 msgid "Shows the server version." msgstr "サーバーのバージョンを表示します。" -#: utils/misc/guc_tables.c:4406 +#: utils/misc/guc_tables.c:4307 msgid "Sets the current role." msgstr "現在のロールを設定。" -#: utils/misc/guc_tables.c:4418 +#: utils/misc/guc_tables.c:4319 msgid "Sets the session user name." msgstr "セッションユーザー名を設定。" -#: utils/misc/guc_tables.c:4429 +#: utils/misc/guc_tables.c:4330 msgid "Sets the destination for server log output." msgstr "サーバーログの出力先を設定。" -#: utils/misc/guc_tables.c:4430 +#: 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:4441 +#: utils/misc/guc_tables.c:4342 msgid "Sets the destination directory for log files." msgstr "ログファイルの格納ディレクトリを設定。" -#: utils/misc/guc_tables.c:4442 +#: 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:4452 +#: utils/misc/guc_tables.c:4353 msgid "Sets the file name pattern for log files." msgstr "ログファイルのファイル名パターンを設定。" -#: utils/misc/guc_tables.c:4463 +#: 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:4474 +#: 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:4485 +#: utils/misc/guc_tables.c:4386 msgid "Sets the time zone for displaying and interpreting time stamps." msgstr "タイムスタンプの表示と解釈に使用するタイムゾーンを設定。" -#: utils/misc/guc_tables.c:4495 +#: utils/misc/guc_tables.c:4396 msgid "Selects a file of time zone abbreviations." msgstr "タイムゾーン省略形用のファイルを選択します。" -#: utils/misc/guc_tables.c:4505 +#: utils/misc/guc_tables.c:4406 msgid "Sets the owning group of the Unix-domain socket." msgstr "Unixドメインソケットを所有するグループを設定。" -#: utils/misc/guc_tables.c:4506 +#: 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:4516 +#: utils/misc/guc_tables.c:4417 msgid "Sets the directories where Unix-domain sockets will be created." msgstr "Unixドメインソケットの作成先ディレクトリを設定。" -#: utils/misc/guc_tables.c:4527 +#: 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:4542 +#: utils/misc/guc_tables.c:4443 msgid "Sets the server's data directory." msgstr "サーバーのデータディレクトリを設定。" -#: utils/misc/guc_tables.c:4553 +#: utils/misc/guc_tables.c:4454 msgid "Sets the server's main configuration file." msgstr "サーバーのメイン設定ファイルを設定。" -#: utils/misc/guc_tables.c:4564 +#: utils/misc/guc_tables.c:4465 msgid "Sets the server's \"hba\" configuration file." msgstr "サーバーの\"hba\"設定ファイルを設定。" -#: utils/misc/guc_tables.c:4575 +#: utils/misc/guc_tables.c:4476 msgid "Sets the server's \"ident\" configuration file." msgstr "サーバーの\"ident\"設定ファイルを設定。" -#: utils/misc/guc_tables.c:4586 +#: utils/misc/guc_tables.c:4487 msgid "Writes the postmaster PID to the specified file." msgstr "postmasterのPIDを指定したファイルに書き込みます。" -#: utils/misc/guc_tables.c:4597 +#: utils/misc/guc_tables.c:4498 msgid "Shows the name of the SSL library." msgstr "SSLライブラリの名前を表示します。" -#: utils/misc/guc_tables.c:4612 +#: utils/misc/guc_tables.c:4513 msgid "Location of the SSL server certificate file." msgstr "SSLサーバー証明書ファイルの場所です" -#: utils/misc/guc_tables.c:4622 +#: utils/misc/guc_tables.c:4523 msgid "Location of the SSL server private key file." msgstr "SSLサーバー秘密鍵ファイルの場所です。" -#: utils/misc/guc_tables.c:4632 +#: utils/misc/guc_tables.c:4533 msgid "Location of the SSL certificate authority file." msgstr "SSL認証局ファイルの場所です" -#: utils/misc/guc_tables.c:4642 +#: utils/misc/guc_tables.c:4543 msgid "Location of the SSL certificate revocation list file." msgstr "SSL証明書失効リストファイルの場所です。" -#: utils/misc/guc_tables.c:4652 +#: utils/misc/guc_tables.c:4553 msgid "Location of the SSL certificate revocation list directory." msgstr "SSL証明書失効リストディレクトリの場所です。" -#: utils/misc/guc_tables.c:4662 +#: 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:4673 +#: utils/misc/guc_tables.c:4574 msgid "Sets default text search configuration." msgstr "デフォルトのテキスト検索設定を設定します。" -#: utils/misc/guc_tables.c:4683 -msgid "Sets the list of allowed TLSv1.3 cipher suites (leave blank for default)." -msgstr "使用可能なTLSv1.3の暗号スイートのリストを設定 (空でデフォルト設定)。" +#: utils/misc/guc_tables.c:4584 +msgid "Sets the list of allowed SSL ciphers." +msgstr "SSL暗号として許可するリストを設定。" -#: utils/misc/guc_tables.c:4694 -msgid "Sets the list of allowed TLSv1.2 (and lower) ciphers." -msgstr "使用可能なTLSv1.2(およびそれ以前)の暗号方式のリストを設定。" +#: utils/misc/guc_tables.c:4599 +msgid "Sets the curve to use for ECDH." +msgstr "ECDHで使用する曲線を設定。" -#: utils/misc/guc_tables.c:4709 -msgid "Sets the group(s) to use for Diffie-Hellman key exchange." -msgstr "Diffie-Hellman鍵交換で使用するグループ(群)を設定。" - -#: utils/misc/guc_tables.c:4710 -msgid "Multiple groups can be specified using colon-separated list." -msgstr "複数のグループはコロン区切りのリストとして指定できます。" - -#: utils/misc/guc_tables.c:4724 +#: utils/misc/guc_tables.c:4614 msgid "Location of the SSL DH parameters file." msgstr "SSLのDHパラメータファイルの場所です。" -#: utils/misc/guc_tables.c:4735 +#: utils/misc/guc_tables.c:4625 msgid "Command to obtain passphrases for SSL." msgstr "SSLのパスフレーズを取得するコマンド。" -#: utils/misc/guc_tables.c:4746 +#: utils/misc/guc_tables.c:4636 msgid "Sets the application name to be reported in statistics and logs." msgstr "統計やログで報告されるアプリケーション名を設定。" -#: utils/misc/guc_tables.c:4757 +#: 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:4768 +#: 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:4769 +#: 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:4779 +#: utils/misc/guc_tables.c:4669 msgid "JIT provider to use." msgstr "使用するJITプロバイダ。" -#: utils/misc/guc_tables.c:4790 +#: utils/misc/guc_tables.c:4680 msgid "Log backtrace for errors in these functions." msgstr "これらの関数でエラーが起きた場合にはバックトレースをログに出力します。" -#: utils/misc/guc_tables.c:4801 +#: utils/misc/guc_tables.c:4691 msgid "Use direct I/O for file access." msgstr "ファイルアクセスに直接I/Oを使用します。" -#: utils/misc/guc_tables.c:4812 +#: 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:4814 +#: 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:4826 +#: utils/misc/guc_tables.c:4716 msgid "Prohibits access to non-system relations of specified kinds." msgstr "指定した種別の非システムリレーションへのアクセスを禁止します。" -#: utils/misc/guc_tables.c:4846 +#: utils/misc/guc_tables.c:4736 msgid "Sets whether \"\\'\" is allowed in string literals." msgstr "文字列リテラルで\"\\'\"が許可されるかどうかを設定。" -#: utils/misc/guc_tables.c:4856 +#: utils/misc/guc_tables.c:4746 msgid "Sets the output format for bytea." msgstr "bytea の出力フォーマットを設定。" -#: utils/misc/guc_tables.c:4866 +#: utils/misc/guc_tables.c:4756 msgid "Sets the message levels that are sent to the client." msgstr "クライアントに送信される最小のメッセージレベルを設定。" -#: utils/misc/guc_tables.c:4867 utils/misc/guc_tables.c:4963 utils/misc/guc_tables.c:4974 +#: 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:4877 +#: utils/misc/guc_tables.c:4767 msgid "Enables in-core computation of query identifiers." msgstr "問い合わせ識別子の内部生成を有効にする。" -#: utils/misc/guc_tables.c:4887 +#: utils/misc/guc_tables.c:4777 msgid "Enables the planner to use constraints to optimize queries." msgstr "問い合わせの最適化の際にプランナに制約を利用させる。" -#: utils/misc/guc_tables.c:4888 +#: 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:4899 +#: utils/misc/guc_tables.c:4789 msgid "Sets the default compression method for compressible values." msgstr "圧縮可能な値に対して使用されるデフォルト圧縮方式を設定。" -#: utils/misc/guc_tables.c:4910 +#: utils/misc/guc_tables.c:4800 msgid "Sets the transaction isolation level of each new transaction." msgstr "新規トランザクションのトランザクション分離レベルを設定。" -#: utils/misc/guc_tables.c:4920 +#: utils/misc/guc_tables.c:4810 msgid "Sets the current transaction's isolation level." msgstr "現在のトランザクションの分離レベルを設定。" -#: utils/misc/guc_tables.c:4931 +#: utils/misc/guc_tables.c:4821 msgid "Sets the display format for interval values." msgstr "インターバル値の表示フォーマットを設定。" -#: utils/misc/guc_tables.c:4942 +#: utils/misc/guc_tables.c:4832 msgid "Log level for reporting invalid ICU locale strings." msgstr "不正なICUロケール設定の報告に使用するログレベル。" -#: utils/misc/guc_tables.c:4952 +#: utils/misc/guc_tables.c:4842 msgid "Sets the verbosity of logged messages." msgstr "ログ出力メッセージの詳細度を設定。" -#: utils/misc/guc_tables.c:4962 +#: utils/misc/guc_tables.c:4852 msgid "Sets the message levels that are logged." msgstr "ログに出力するメッセージレベルを設定。" -#: utils/misc/guc_tables.c:4973 +#: 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:4984 +#: utils/misc/guc_tables.c:4874 msgid "Sets the type of statements logged." msgstr "ログ出力する文の種類を設定。" -#: utils/misc/guc_tables.c:4994 +#: 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:5005 +#: utils/misc/guc_tables.c:4895 msgid "Sets the session's behavior for triggers and rewrite rules." msgstr "トリガと書き換えルールに関するセッションの動作を設定。" -#: utils/misc/guc_tables.c:5015 +#: utils/misc/guc_tables.c:4905 msgid "Sets the current transaction's synchronization level." msgstr "現在のトランザクションの同期レベルを設定。" -#: utils/misc/guc_tables.c:5025 +#: utils/misc/guc_tables.c:4915 msgid "Allows archiving of WAL files using \"archive_command\"." msgstr "\"archive_command\"を使用したWALファイルのアーカイブ処理を許可します。" -#: utils/misc/guc_tables.c:5035 +#: utils/misc/guc_tables.c:4925 msgid "Sets the action to perform upon reaching the recovery target." msgstr "リカバリ目標に到達した際の動作を設定。" -#: utils/misc/guc_tables.c:5045 +#: utils/misc/guc_tables.c:4935 msgid "Collects function-level statistics on database activity." msgstr "データベースの動作に関して、関数レベルの統計情報を収集します。" -#: utils/misc/guc_tables.c:5056 +#: utils/misc/guc_tables.c:4946 msgid "Sets the consistency of accesses to statistics data." msgstr "統計情報読み出し時の一貫性レベルを設定します。" -#: utils/misc/guc_tables.c:5066 +#: 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:5076 +#: utils/misc/guc_tables.c:4966 msgid "Sets the level of information written to the WAL." msgstr "WALに書き出される情報のレベルを設定します。" -#: utils/misc/guc_tables.c:5086 +#: utils/misc/guc_tables.c:4976 msgid "Selects the dynamic shared memory implementation used." msgstr "動的共有メモリで使用する実装を選択します。" -#: utils/misc/guc_tables.c:5096 +#: 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:5106 +#: utils/misc/guc_tables.c:4996 msgid "Selects the method used for forcing WAL updates to disk." msgstr "WAL更新のディスクへの書き出しを強制するめの方法を選択します。" -#: utils/misc/guc_tables.c:5116 +#: utils/misc/guc_tables.c:5006 msgid "Sets how binary values are to be encoded in XML." msgstr "XMLでどのようにバイナリ値を符号化するかを設定します。" -#: utils/misc/guc_tables.c:5126 +#: 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:5137 +#: utils/misc/guc_tables.c:5027 msgid "Use of huge pages on Linux or Windows." msgstr "LinuxおよびWindowsでヒュージページを使用。" -#: utils/misc/guc_tables.c:5147 +#: utils/misc/guc_tables.c:5037 msgid "Indicates the status of huge pages." msgstr "ヒュージページの状態を表示。" -#: utils/misc/guc_tables.c:5158 +#: utils/misc/guc_tables.c:5048 msgid "Prefetch referenced blocks during recovery." msgstr "リカバリ中に被参照ブロックの事前読み込みを行う。" -#: utils/misc/guc_tables.c:5159 +#: 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:5168 +#: utils/misc/guc_tables.c:5058 msgid "Forces the planner's use parallel query nodes." msgstr "プランナに並列問い合わせノードの使用を強制します。" -#: utils/misc/guc_tables.c:5169 +#: 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:5181 +#: utils/misc/guc_tables.c:5071 msgid "Chooses the algorithm for encrypting passwords." msgstr "パスワードの暗号化に使用するアルゴリズムを選択する。" -#: utils/misc/guc_tables.c:5191 +#: utils/misc/guc_tables.c:5081 msgid "Controls the planner's selection of custom or generic plan." msgstr "プランナでのカスタムプランと汎用プランの選択を制御。" -#: utils/misc/guc_tables.c:5192 +#: 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:5204 +#: utils/misc/guc_tables.c:5094 msgid "Sets the minimum SSL/TLS protocol version to use." msgstr "使用する SSL/TLSプロトコルの最小バージョンを設定。" -#: utils/misc/guc_tables.c:5216 +#: utils/misc/guc_tables.c:5106 msgid "Sets the maximum SSL/TLS protocol version to use." msgstr "使用可能な最大の SSL/TLS プロトコルバージョンを指定します。" -#: utils/misc/guc_tables.c:5228 +#: utils/misc/guc_tables.c:5118 msgid "Sets the method for synchronizing the data directory before crash recovery." msgstr "クラシュリカバリ前に行うデータディレクトリの同期の方法を設定する。" -#: utils/misc/guc_tables.c:5237 +#: utils/misc/guc_tables.c:5127 msgid "Forces immediate streaming or serialization of changes in large transactions." msgstr "大きなトランザクションにおいて、即時ストリーミングまたは変更のシリアライズを強制します。" -#: utils/misc/guc_tables.c:5238 +#: 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 "パブリッシャでは、この設定はロジカルでコーディングで個々の変更のストリーミングまたはシリアル化を実行させます。サブスクライバではすべての変更をファイルへシリアライズし、トランザクション終了時にその変更情報の読み出しおよび適用の実行をパラレルワーカーに指示するようにします。" @@ -30693,26 +29974,6 @@ 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/stack_depth.c:101 -#, c-format -msgid "stack depth limit exceeded" -msgstr "スタック長制限を越えました" - -#: utils/misc/stack_depth.c:102 -#, 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)を増やしてください。" - -#: utils/misc/stack_depth.c:149 -#, c-format -msgid "\"max_stack_depth\" must not exceed %zdkB." -msgstr "\"max_stack_depth\"は%zdkBを越えてはなりません。" - -#: utils/misc/stack_depth.c:151 -#, c-format -msgid "Increase the platform's stack depth limit via \"ulimit -s\" or local equivalent." -msgstr "プラットフォームのスタック長制限を\"ulimit -s\"または同等の機能を使用して増加してください" - #: utils/misc/timeout.c:520 #, c-format msgid "cannot add more timeout reasons" @@ -30728,57 +29989,57 @@ msgstr "タイムゾーンファイル\"%3$s\"の%4$d行のタイムゾーン省 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:113 +#: 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:122 +#: 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:134 +#: 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:170 +#: utils/misc/tzparser.c:169 #, c-format msgid "invalid syntax in time zone file \"%s\", line %d" msgstr "タイムゾーンファイル\"%s\"の行%dで構文が無効です" -#: utils/misc/tzparser.c:238 +#: utils/misc/tzparser.c:237 #, c-format msgid "time zone abbreviation \"%s\" is multiply defined" msgstr "タイムゾーン省略形\"%s\"が複数定義されています" -#: utils/misc/tzparser.c:240 +#: 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:302 +#: utils/misc/tzparser.c:301 #, c-format msgid "invalid time zone file name \"%s\"" msgstr "タイムゾーンファイル名が無効です: \"%s\"" -#: utils/misc/tzparser.c:315 +#: utils/misc/tzparser.c:314 #, c-format msgid "time zone file recursion limit exceeded in file \"%s\"" msgstr "ファイル\"%s\"でタイムゾーンファイルの再帰の上限を超えました。" -#: utils/misc/tzparser.c:354 utils/misc/tzparser.c:367 +#: 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:378 +#: 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:403 +#: utils/misc/tzparser.c:401 #, c-format msgid "@INCLUDE without file name in time zone file \"%s\", line %d" msgstr "タイムゾーンファイル\"%s\"の行%dにファイル名がない@INCLUDEがあります" @@ -30793,12 +30054,12 @@ msgstr "メモリコンテキスト\"%s\"の作成時に失敗しました" msgid "could not attach to dynamic shared area" msgstr "動的共有エリアをアタッチできませんでした" -#: utils/mmgr/mcxt.c:1156 +#: 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:1300 +#: utils/mmgr/mcxt.c:1299 #, c-format msgid "logging memory contexts of PID %d" msgstr "PID %dのメモリコンテクストを記録します" @@ -30853,143 +30114,77 @@ msgstr "タプルストア共有一時ファイル内に予期しないチャン msgid "could not seek to block %u in shared tuplestore temporary file" msgstr "共有タプルストア一時ファイルのブロック%uへのシークに失敗しました" -#: utils/sort/tuplesort.c:2340 +#: utils/sort/tuplesort.c:2372 #, c-format msgid "cannot have more than %d runs for an external sort" msgstr "外部ソートでは%d以上のラン数は扱えません" -#: utils/sort/tuplesortvariants.c:1538 +#: utils/sort/tuplesortvariants.c:1552 #, c-format msgid "could not create unique index \"%s\"" msgstr "ユニークインデックス\"%s\"を作成できませんでした" -#: utils/sort/tuplesortvariants.c:1540 +#: utils/sort/tuplesortvariants.c:1554 #, c-format msgid "Key %s is duplicated." msgstr "キー%sは重複しています。" -#: utils/sort/tuplesortvariants.c:1541 +#: utils/sort/tuplesortvariants.c:1555 #, c-format msgid "Duplicate keys exist." msgstr "重複したキーが存在します。" -#: utils/sort/tuplestore.c:552 utils/sort/tuplestore.c:562 utils/sort/tuplestore.c:921 utils/sort/tuplestore.c:1025 utils/sort/tuplestore.c:1089 utils/sort/tuplestore.c:1106 utils/sort/tuplestore.c:1308 utils/sort/tuplestore.c:1373 utils/sort/tuplestore.c:1382 +#: 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:498 +#: utils/time/snapmgr.c:536 #, c-format msgid "The source transaction is not running anymore." msgstr "元となるトランザクションはすでに実行中ではありません。" -#: utils/time/snapmgr.c:1084 +#: utils/time/snapmgr.c:1136 #, c-format msgid "cannot export a snapshot from a subtransaction" msgstr "サブトランザクションからスナップショットをエクスポートすることはできません" -#: utils/time/snapmgr.c:1244 utils/time/snapmgr.c:1249 utils/time/snapmgr.c:1254 utils/time/snapmgr.c:1269 utils/time/snapmgr.c:1274 utils/time/snapmgr.c:1279 utils/time/snapmgr.c:1294 utils/time/snapmgr.c:1299 utils/time/snapmgr.c:1304 utils/time/snapmgr.c:1418 utils/time/snapmgr.c:1434 utils/time/snapmgr.c:1459 +#: 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:1341 +#: 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:1350 +#: 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:1359 +#: utils/time/snapmgr.c:1411 #, c-format msgid "invalid snapshot identifier: \"%s\"" msgstr "無効なスナップショット識別子: \"%s\"" -#: utils/time/snapmgr.c:1374 +#: utils/time/snapmgr.c:1426 #, c-format msgid "snapshot \"%s\" does not exist" msgstr "スナップショット\"%s\"は存在しません" -#: utils/time/snapmgr.c:1472 +#: 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:1476 +#: 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:1491 +#: utils/time/snapmgr.c:1543 #, c-format msgid "cannot import a snapshot from a different database" msgstr "異なるデータベースからのスナップショットを読み込むことはできません" - -#~ msgid "\"RN\" not supported for input" -#~ msgstr "\"RN\"は入力としてサポートしていません" - -#~ msgid "%s with OID %u does not exist" -#~ msgstr "OID %2$uの%1$sは存在しません" - -#~ msgid "Autovacuum" -#~ msgstr "自動VACUUM" - -#~ msgid "MaxFragments should be >= 0" -#~ msgstr "MaxFragments は 0 以上でなければなりません" - -#~ msgid "MinWords should be less than MaxWords" -#~ msgstr "MinWordsはMaxWordsより小さくなければなりません" - -#~ msgid "MinWords should be positive" -#~ msgstr "MinWordsは正でなければなりません" - -#~ msgid "Please report this to <%s>." -#~ msgstr "これを<%s>まで報告してください。" - -#~ msgid "ShortWord should be >= 0" -#~ msgstr "ShortWordは>= 0でなければなりません" - -#~ msgid "This feature is not yet supported on partitioned tables." -#~ msgstr "この機能はパーティションテーブルに対してはサポートされていません。" - -#~ msgid "This slot has been invalidated because it exceeded the maximum reserved size." -#~ msgstr "最大留保量を超えたため、このスロットは無効化されています。" - -#~ msgid "This slot has been invalidated because it was conflicting with recovery." -#~ msgstr "リカバリとの競合のため、このスロットは無効化されました。" - -#~ msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type boolean" -#~ msgstr "jsonpath項目メソッド .%2$s() の引数\"%1$s\"がboolean型に適合しません" - -#~ msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type double precision" -#~ msgstr "jsonpath項目メソッド .%2$s() の引数\"%1$s\"がdouble precision型に適合しません" - -#~ msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type integer" -#~ msgstr "jsonpath項目メソッド .%2$s() の引数\"%1$s\"がinteger型に適合しません" - -#~ msgid "argument \"%s\" of jsonpath item method .%s() is invalid for type numeric" -#~ msgstr "jsonpath項目メソッド .%2$s() の引数\"%1$s\"がnumeric型に適合しません" - -#~ msgid "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing relation \"%s\"" -#~ msgstr "パーティションテーブル\"%1$s\"にリレーション\"%2$s\"を参照する NOT VALID 指定の外部キーは追加できません " - -#~ msgid "cannot alter invalid replication slot \"%s\"" -#~ msgstr "無効なレプリケーションスロット\"%s\"は変更できません" - -#~ msgid "cannot use RETURNING type %s in %s" -#~ msgstr "%2$sではRETURNING型%1$sを使用できません" - -#~ msgid "conversion from wchar_t to server encoding failed: %m" -#~ msgstr "wchar_tからサーバー符号化方式への変換が失敗しました: %m" - -#~ msgid "removing future two-phase state file of epoch %u for transaction %u" -#~ msgstr "トランザクション%2$uの起点%1$uに対応する未来の二相状態ファイルを削除します" - -#~ msgid "removing past two-phase state file of epoch %u for transaction %u" -#~ msgstr "トランザクション%2$uの起点%1$uに対応する過去の二相状態ファイルを削除します" - -#~ msgid "removing past two-phase state from memory for transaction %u" -#~ msgstr "トランザクション%uに対応する過去の二相状態情報をメモリから削除します" diff --git a/src/backend/po/ru.po b/src/backend/po/ru.po index f8e7152cd84f1..5a92311aca062 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-2025. +# 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: 2025-02-08 07:44+0200\n" -"PO-Revision-Date: 2025-02-08 08:50+0200\n" +"POT-Creation-Date: 2025-08-09 07:11+0300\n" +"PO-Revision-Date: 2025-08-09 07:31+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -96,15 +96,15 @@ msgstr "не удалось открыть файл \"%s\" для чтения: #: ../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/twophase.c:1353 access/transam/xlog.c:3459 +#: access/transam/xlog.c:4323 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 +#: replication/logical/reorderbuffer.c:5243 +#: replication/logical/snapbuild.c:2099 replication/slot.c:2232 +#: replication/slot.c:2273 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 @@ -112,10 +112,10 @@ msgid "could not read file \"%s\": %m" msgstr "не удалось прочитать файл \"%s\": %m" #: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 -#: access/transam/xlog.c:3482 access/transam/xlog.c:4346 +#: access/transam/xlog.c:3464 access/transam/xlog.c:4328 #: 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 +#: replication/logical/snapbuild.c:2104 replication/slot.c:2236 +#: replication/slot.c:2277 replication/walsender.c:664 #: utils/cache/relmapper.c:833 #, c-format msgid "could not read file \"%s\": read %d of %zu" @@ -126,17 +126,17 @@ msgstr "не удалось прочитать файл \"%s\" (прочитан #: 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 +#: access/transam/twophase.c:1784 access/transam/xlog.c:3305 +#: access/transam/xlog.c:3499 access/transam/xlog.c:3504 +#: access/transam/xlog.c:3640 access/transam/xlog.c:4293 +#: access/transam/xlog.c:5228 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 +#: replication/logical/reorderbuffer.c:5295 +#: replication/logical/snapbuild.c:1866 replication/logical/snapbuild.c:1990 +#: replication/slot.c:2122 replication/slot.c:2284 replication/walsender.c:674 +#: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:825 +#: storage/file/fd.c:3750 storage/file/fd.c:3856 utils/cache/relmapper.c:841 #: utils/cache/relmapper.c:956 #, c-format msgid "could not close file \"%s\": %m" @@ -165,31 +165,31 @@ msgstr "" #: ../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/twophase.c:1309 access/transam/xlog.c:3212 +#: access/transam/xlog.c:3375 access/transam/xlog.c:3414 +#: access/transam/xlog.c:3607 access/transam/xlog.c:4313 #: 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 +#: replication/logical/reorderbuffer.c:3896 +#: replication/logical/reorderbuffer.c:4450 +#: replication/logical/reorderbuffer.c:5223 +#: replication/logical/snapbuild.c:1821 replication/logical/snapbuild.c:1931 +#: replication/slot.c:2204 replication/walsender.c:632 +#: replication/walsender.c:3085 storage/file/copydir.c:151 +#: storage/file/fd.c:800 storage/file/fd.c:3507 storage/file/fd.c:3737 +#: storage/file/fd.c:3827 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 +#: utils/init/miscinit.c:1791 utils/misc/guc.c:4782 utils/misc/guc.c:4832 #, 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:1757 access/transam/twophase.c:1766 -#: access/transam/xlog.c:9280 access/transam/xlogfuncs.c:698 +#: access/transam/xlog.c:9306 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 @@ -203,12 +203,12 @@ msgstr "не удалось записать файл \"%s\": %m" #: 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 +#: access/transam/xlog.c:3298 access/transam/xlog.c:3493 +#: access/transam/xlog.c:4286 access/transam/xlog.c:8681 +#: access/transam/xlog.c:8726 backup/basebackup_server.c:207 +#: commands/dbcommands.c:514 replication/logical/snapbuild.c:1859 +#: replication/slot.c:2108 replication/slot.c:2214 storage/file/fd.c:817 +#: storage/file/fd.c:3848 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" @@ -222,21 +222,22 @@ msgstr "не удалось синхронизировать с ФС файл \" #: ../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 +#: access/transam/xlogrecovery.c:564 lib/dshash.c:253 libpq/auth.c:1360 +#: libpq/auth.c:1404 libpq/auth.c:1961 libpq/be-secure-gssapi.c:534 +#: libpq/be-secure-gssapi.c:714 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 +#: replication/logical/logical.c:212 replication/walsender.c:839 +#: storage/buffer/localbuf.c:606 storage/file/fd.c:909 storage/file/fd.c:1440 +#: storage/file/fd.c:1601 storage/file/fd.c:2528 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/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 @@ -320,7 +321,7 @@ msgstr "нехватка памяти\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" -#: ../common/file_utils.c:76 storage/file/fd.c:3516 +#: ../common/file_utils.c:76 storage/file/fd.c:3513 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "не удалось синхронизировать с ФС файл \"%s\": %m" @@ -332,8 +333,8 @@ msgstr "не удалось синхронизировать с ФС файл \" #: 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 +#: replication/logical/snapbuild.c:1717 replication/logical/snapbuild.c:2220 +#: storage/file/fd.c:1965 storage/file/fd.c:2051 storage/file/fd.c:3561 #: 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 @@ -348,22 +349,22 @@ msgstr "эта сборка программы не поддерживает м #: ../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 +#: storage/file/fd.c:2930 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 +#: ../common/pgfnames.c:69 ../common/rmtree.c:106 storage/file/fd.c:2942 #, 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:1831 replication/slot.c:936 -#: replication/slot.c:1998 replication/slot.c:2140 storage/file/fd.c:838 +#: replication/logical/snapbuild.c:1878 replication/slot.c:936 +#: replication/slot.c:1994 replication/slot.c:2136 storage/file/fd.c:835 #: utils/time/snapmgr.c:1255 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" @@ -373,92 +374,92 @@ msgstr "не удалось переименовать файл \"%s\" в \"%s\" msgid "internal error" msgstr "внутренняя ошибка" -#: ../common/jsonapi.c:2121 +#: ../common/jsonapi.c:2124 msgid "Recursive descent parser cannot use incremental lexer." msgstr "" "Инкрементальный лексический анализатор не подходит для нисходящего " "рекурсивного разбора." -#: ../common/jsonapi.c:2123 +#: ../common/jsonapi.c:2126 msgid "Incremental parser requires incremental lexer." msgstr "" "Для инкрементального разбора требуется инкрементальный лексический " "анализатор." -#: ../common/jsonapi.c:2125 +#: ../common/jsonapi.c:2128 msgid "JSON nested too deep, maximum permitted depth is 6400." msgstr "" "Слишком большая вложенность JSON, максимальная допустимая глубина: 6400." -#: ../common/jsonapi.c:2127 +#: ../common/jsonapi.c:2130 #, c-format msgid "Escape sequence \"\\%.*s\" is invalid." msgstr "Неверная спецпоследовательность: \"\\%.*s\"." -#: ../common/jsonapi.c:2131 +#: ../common/jsonapi.c:2134 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Символ с кодом 0x%02x необходимо экранировать." -#: ../common/jsonapi.c:2135 +#: ../common/jsonapi.c:2138 #, c-format msgid "Expected end of input, but found \"%.*s\"." msgstr "Ожидался конец текста, но обнаружено продолжение \"%.*s\"." -#: ../common/jsonapi.c:2138 +#: ../common/jsonapi.c:2141 #, c-format msgid "Expected array element or \"]\", but found \"%.*s\"." msgstr "Ожидался элемент массива или \"]\", но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:2141 +#: ../common/jsonapi.c:2144 #, c-format msgid "Expected \",\" or \"]\", but found \"%.*s\"." msgstr "Ожидалась \",\" или \"]\", но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:2144 +#: ../common/jsonapi.c:2147 #, c-format msgid "Expected \":\", but found \"%.*s\"." msgstr "Ожидалось \":\", но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:2147 +#: ../common/jsonapi.c:2150 #, c-format msgid "Expected JSON value, but found \"%.*s\"." msgstr "Ожидалось значение JSON, но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:2150 +#: ../common/jsonapi.c:2153 msgid "The input string ended unexpectedly." msgstr "Неожиданный конец входной строки." -#: ../common/jsonapi.c:2152 +#: ../common/jsonapi.c:2155 #, c-format msgid "Expected string or \"}\", but found \"%.*s\"." msgstr "Ожидалась строка или \"}\", но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:2155 +#: ../common/jsonapi.c:2158 #, c-format msgid "Expected \",\" or \"}\", but found \"%.*s\"." msgstr "Ожидалась \",\" или \"}\", но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:2158 +#: ../common/jsonapi.c:2161 #, c-format msgid "Expected string, but found \"%.*s\"." msgstr "Ожидалась строка, но обнаружено \"%.*s\"." -#: ../common/jsonapi.c:2161 +#: ../common/jsonapi.c:2164 #, c-format msgid "Token \"%.*s\" is invalid." msgstr "Ошибочный элемент \"%.*s\"." -#: ../common/jsonapi.c:2164 jsonpath_scan.l:608 +#: ../common/jsonapi.c:2167 jsonpath_scan.l:608 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 нельзя преобразовать в текст." -#: ../common/jsonapi.c:2166 +#: ../common/jsonapi.c:2169 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "За \"\\u\" должны следовать четыре шестнадцатеричные цифры." -#: ../common/jsonapi.c:2169 +#: ../common/jsonapi.c:2172 msgid "" "Unicode escape values cannot be used for code point values above 007F when " "the encoding is not UTF8." @@ -466,19 +467,19 @@ msgstr "" "Спецкоды Unicode для значений выше 007F можно использовать только с " "кодировкой UTF8." -#: ../common/jsonapi.c:2178 +#: ../common/jsonapi.c:2181 #, 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 +#: ../common/jsonapi.c:2188 jsonpath_scan.l:641 #, c-format msgid "Unicode high surrogate must not follow a high surrogate." msgstr "" "Старшее слово суррогата Unicode не может следовать за другим старшим словом." -#: ../common/jsonapi.c:2187 jsonpath_scan.l:652 jsonpath_scan.l:662 +#: ../common/jsonapi.c:2190 jsonpath_scan.l:652 jsonpath_scan.l:662 #: jsonpath_scan.l:713 #, c-format msgid "Unicode low surrogate must follow a high surrogate." @@ -664,8 +665,8 @@ 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 +#: utils/misc/guc.c:3283 utils/misc/guc.c:4712 utils/misc/guc.c:6942 +#: utils/misc/guc.c:6983 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "неверное значение для параметра \"%s\": \"%s\"" @@ -730,10 +731,10 @@ msgstr "не удалось получить код выхода от подпр #: 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 +#: replication/logical/reorderbuffer.c:4719 +#: replication/logical/snapbuild.c:1759 replication/logical/snapbuild.c:2193 +#: replication/slot.c:2188 storage/file/fd.c:875 storage/file/fd.c:3375 +#: storage/file/fd.c:3437 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 @@ -741,8 +742,8 @@ 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 +#: commands/tablespace.c:815 commands/tablespace.c:905 storage/file/fd.c:3367 +#: storage/file/fd.c:3776 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "ошибка при удалении каталога \"%s\": %m" @@ -782,7 +783,7 @@ msgstr "" msgid "could not look up effective user ID %ld: %s" msgstr "выяснить эффективный идентификатор пользователя (%ld) не удалось: %s" -#: ../common/username.c:45 libpq/auth.c:1888 +#: ../common/username.c:45 libpq/auth.c:1896 msgid "user does not exist" msgstr "пользователь не существует" @@ -925,7 +926,7 @@ msgstr "" "запрос на расчёт сводки диапазона BRIN для индекса \"%s\" страницы %u не был " "записан" -#: access/brin/brin.c:1385 access/brin/brin.c:1493 access/gin/ginfast.c:1040 +#: 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 @@ -934,34 +935,34 @@ msgstr "" msgid "recovery is in progress" msgstr "идёт процесс восстановления" -#: access/brin/brin.c:1386 access/brin/brin.c:1494 +#: 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:1391 access/brin/brin.c:1499 +#: 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:1436 access/brin/brin.c:1525 +#: 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:1452 access/brin/brin.c:1541 +#: 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.c:1461 access/brin/brin.c:1557 access/gin/ginfast.c:1085 +#: access/brin/brin.c:1463 access/brin/brin.c:1559 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 +#: 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 @@ -972,7 +973,7 @@ 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/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\"" @@ -1145,67 +1146,72 @@ msgstr "превышен предел пользовательских типо msgid "RESET must not include values for parameters" msgstr "В RESET не должно передаваться значение параметров" -#: access/common/reloptions.c:1263 +#: access/common/reloptions.c:1264 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "нераспознанное пространство имён параметров \"%s\"" -#: access/common/reloptions.c:1300 commands/variable.c:1214 +#: access/common/reloptions.c:1294 commands/foreigncmds.c:86 +#, c-format +msgid "invalid option name \"%s\": must not contain \"=\"" +msgstr "некорректное имя параметра \"%s\": имя не может содержать \"=\"" + +#: access/common/reloptions.c:1309 commands/variable.c:1214 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "таблицы со свойством WITH OIDS не поддерживаются" -#: access/common/reloptions.c:1468 +#: access/common/reloptions.c:1477 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "нераспознанный параметр \"%s\"" -#: access/common/reloptions.c:1580 +#: access/common/reloptions.c:1589 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "параметр \"%s\" указан неоднократно" -#: access/common/reloptions.c:1596 +#: access/common/reloptions.c:1605 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "неверное значение для логического параметра \"%s\": %s" -#: access/common/reloptions.c:1608 +#: access/common/reloptions.c:1617 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "неверное значение для целочисленного параметра \"%s\": %s" -#: access/common/reloptions.c:1614 access/common/reloptions.c:1634 +#: access/common/reloptions.c:1623 access/common/reloptions.c:1643 #, c-format msgid "value %s out of bounds for option \"%s\"" msgstr "значение %s вне допустимых пределов параметра \"%s\"" -#: access/common/reloptions.c:1616 +#: access/common/reloptions.c:1625 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "Допускаются значения только от \"%d\" до \"%d\"." -#: access/common/reloptions.c:1628 +#: access/common/reloptions.c:1637 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "неверное значение для численного параметра \"%s\": %s" -#: access/common/reloptions.c:1636 +#: access/common/reloptions.c:1645 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "Допускаются значения только от \"%f\" до \"%f\"." -#: access/common/reloptions.c:1658 +#: access/common/reloptions.c:1667 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "неверное значение для параметра-перечисления \"%s\": %s" -#: access/common/reloptions.c:1989 +#: access/common/reloptions.c:1998 #, c-format msgid "cannot specify storage parameters for a partitioned table" msgstr "задать параметры хранения для секционированной таблицы нельзя" -#: access/common/reloptions.c:1990 +#: access/common/reloptions.c:1999 #, c-format msgid "Specify storage parameters for its leaf partitions instead." msgstr "Задайте параметры хранения для её конечных секций." @@ -1250,19 +1256,19 @@ 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:147 executor/execExpr.c:2200 -#: utils/adt/arrayfuncs.c:4016 utils/adt/arrayfuncs.c:6712 +#: 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" @@ -1315,7 +1321,7 @@ msgstr "" msgid "Please REINDEX it." msgstr "Пожалуйста, выполните REINDEX для него." -#: access/gist/gist.c:1196 +#: access/gist/gist.c:1203 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" msgstr "исправление неполного разделения в индексе \"%s\" (блок: %u)" @@ -1373,9 +1379,9 @@ msgstr "" "не удалось определить, какое правило сортировки использовать для хеширования " "строк" -#: 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 +#: 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:18242 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 @@ -1436,39 +1442,39 @@ msgid "" msgstr "" "в семействе операторов \"%s\" метода доступа %s нет межтипового оператора(ов)" -#: access/heap/heapam.c:2206 +#: access/heap/heapam.c:2241 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "вставлять кортежи в параллельном исполнителе нельзя" -#: access/heap/heapam.c:2725 +#: access/heap/heapam.c:2764 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "удалять кортежи во время параллельных операций нельзя" -#: access/heap/heapam.c:2772 +#: access/heap/heapam.c:2811 #, c-format msgid "attempted to delete invisible tuple" msgstr "попытка удаления невидимого кортежа" -#: access/heap/heapam.c:3220 access/heap/heapam.c:6501 access/index/genam.c:818 +#: access/heap/heapam.c:3261 access/heap/heapam.c:6542 access/index/genam.c:818 #, c-format msgid "cannot update tuples during a parallel operation" msgstr "изменять кортежи во время параллельных операций нельзя" -#: access/heap/heapam.c:3397 +#: access/heap/heapam.c:3438 #, c-format msgid "attempted to update invisible tuple" msgstr "попытка изменения невидимого кортежа" -#: access/heap/heapam.c:4908 access/heap/heapam.c:4946 -#: access/heap/heapam.c:5211 access/heap/heapam_handler.c:468 +#: access/heap/heapam.c:4949 access/heap/heapam.c:4987 +#: access/heap/heapam.c:5252 access/heap/heapam_handler.c:468 #, c-format msgid "could not obtain lock on row in relation \"%s\"" msgstr "не удалось получить блокировку строки в таблице \"%s\"" -#: access/heap/heapam.c:6314 commands/trigger.c:3340 -#: executor/nodeModifyTable.c:2376 executor/nodeModifyTable.c:2467 +#: access/heap/heapam.c:6355 commands/trigger.c:3427 +#: executor/nodeModifyTable.c:2399 executor/nodeModifyTable.c:2490 #, c-format msgid "" "tuple to be updated was already modified by an operation triggered by the " @@ -1498,13 +1504,13 @@ msgstr "не удалось записать в файл \"%s\" (записан #: 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/xlog.c:3237 access/transam/xlog.c:3428 +#: access/transam/xlog.c:4265 access/transam/xlog.c:9295 #: 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 +#: replication/slot.c:2055 storage/file/copydir.c:157 storage/smgr/md.c:230 #: utils/time/snapmgr.c:1234 #, c-format msgid "could not create file \"%s\": %m" @@ -1517,15 +1523,15 @@ msgstr "не удалось обрезать файл \"%s\" до нужного #: 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 +#: access/transam/xlog.c:3287 access/transam/xlog.c:3484 +#: access/transam/xlog.c:4277 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 +#: replication/logical/origin.c:676 replication/logical/snapbuild.c:1835 +#: replication/slot.c:2090 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/misc/guc.c:4522 utils/misc/guc.c:5680 utils/misc/guc.c:5698 #: utils/time/snapmgr.c:1239 utils/time/snapmgr.c:1246 #, c-format msgid "could not write to file \"%s\": %m" @@ -1699,14 +1705,14 @@ msgstr "" msgid "system usage: %s" msgstr "нагрузка системы: %s" -#: access/heap/vacuumlazy.c:2170 +#: access/heap/vacuumlazy.c:2178 #, c-format msgid "table \"%s\": removed %lld dead item identifiers in %u pages" msgstr "" "таблица \"%s\": удалено мёртвых идентификаторов элементов: %lld, на " "страницах: %u" -#: access/heap/vacuumlazy.c:2324 +#: access/heap/vacuumlazy.c:2332 #, c-format msgid "" "bypassing nonessential maintenance of table \"%s.%s.%s\" as a failsafe after " @@ -1715,12 +1721,12 @@ msgstr "" "несущественная операция обслуживания таблицы \"%s.%s.%s\" пропускается в " "качестве меры защиты после %d сканирований индекса" -#: access/heap/vacuumlazy.c:2327 +#: access/heap/vacuumlazy.c:2335 #, c-format msgid "The table's relfrozenxid or relminmxid is too far in the past." msgstr "Значение relfrozenxid или relminmxid таблицы слишком далеко в прошлом." -#: access/heap/vacuumlazy.c:2328 +#: access/heap/vacuumlazy.c:2336 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or " @@ -1733,23 +1739,23 @@ msgstr "" "Также можно рассмотреть другие способы обеспечения производительности " "VACUUM, соответствующей скорости выделения идентификаторов транзакций." -#: access/heap/vacuumlazy.c:2590 +#: access/heap/vacuumlazy.c:2598 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "\"%s\": остановка усечения из-за конфликтующего запроса блокировки" -#: access/heap/vacuumlazy.c:2660 +#: access/heap/vacuumlazy.c:2668 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "таблица \"%s\": усечение (было страниц: %u, стало: %u)" -#: access/heap/vacuumlazy.c:2722 +#: access/heap/vacuumlazy.c:2730 #, c-format msgid "table \"%s\": suspending truncate due to conflicting lock request" msgstr "" "таблица \"%s\": приостановка усечения из-за конфликтующего запроса блокировки" -#: access/heap/vacuumlazy.c:2841 +#: access/heap/vacuumlazy.c:2849 #, c-format msgid "" "disabling parallel option of vacuum on \"%s\" --- cannot vacuum temporary " @@ -1758,47 +1764,47 @@ msgstr "" "отключение параллельного режима очистки \"%s\" --- создавать временные " "таблицы в параллельном режиме нельзя" -#: access/heap/vacuumlazy.c:3108 +#: access/heap/vacuumlazy.c:3116 #, c-format msgid "while scanning block %u offset %u of relation \"%s.%s\"" msgstr "при сканировании блока %u (смещение %u) отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3111 +#: access/heap/vacuumlazy.c:3119 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "при сканировании блока %u отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3115 +#: access/heap/vacuumlazy.c:3123 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "при сканировании отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3123 +#: access/heap/vacuumlazy.c:3131 #, c-format msgid "while vacuuming block %u offset %u of relation \"%s.%s\"" msgstr "при очистке блока %u (смещение %u) отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3126 +#: access/heap/vacuumlazy.c:3134 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "при очистке блока %u отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3130 +#: access/heap/vacuumlazy.c:3138 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "при очистке отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3135 commands/vacuumparallel.c:1112 +#: access/heap/vacuumlazy.c:3143 commands/vacuumparallel.c:1112 #, c-format msgid "while vacuuming index \"%s\" of relation \"%s.%s\"" msgstr "при очистке индекса \"%s\" отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3140 commands/vacuumparallel.c:1118 +#: access/heap/vacuumlazy.c:3148 commands/vacuumparallel.c:1118 #, c-format msgid "while cleaning up index \"%s\" of relation \"%s.%s\"" msgstr "при уборке индекса \"%s\" отношения \"%s.%s\"" -#: access/heap/vacuumlazy.c:3146 +#: access/heap/vacuumlazy.c:3154 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "при усечении отношения \"%s.%s\" до %u блок." @@ -1824,8 +1830,8 @@ 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:17873 commands/tablecmds.c:19762 +#: commands/indexcmds.c:2885 commands/tablecmds.c:281 commands/tablecmds.c:305 +#: commands/tablecmds.c:17937 commands/tablecmds.c:19834 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\" - это не индекс" @@ -1879,7 +1885,7 @@ msgstr "" "Причиной тому могло быть прерывание операции VACUUM в версии 9.3 или старее, " "до обновления. Этот индекс нужно перестроить (REINDEX)." -#: access/nbtree/nbtutils.c:5108 +#: access/nbtree/nbtutils.c:5114 #, c-format msgid "" "index row size %zu exceeds btree version %u maximum %zu for index \"%s\"" @@ -1887,12 +1893,12 @@ msgstr "" "размер строки индекса (%zu) больше предельного для btree версии %u размера " "(%zu) (индекс \"%s\")" -#: access/nbtree/nbtutils.c:5114 +#: access/nbtree/nbtutils.c:5120 #, c-format msgid "Index row references tuple (%u,%u) in relation \"%s\"." msgstr "Строка индекса ссылается на кортеж (%u,%u) в отношении \"%s\"." -#: access/nbtree/nbtutils.c:5118 +#: access/nbtree/nbtutils.c:5124 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1948,7 +1954,7 @@ msgstr "" "в семействе операторов \"%s\" метода доступа %s нет опорной функции %d для " "типа %s" -#: access/table/tableam.c:255 +#: access/table/tableam.c:256 #, c-format msgid "tid (%u, %u) is not valid for relation \"%s\"" msgstr "идентификатор кортежа (%u, %u) недопустим для отношения \"%s\"" @@ -2496,8 +2502,8 @@ msgstr "" "в файле \"%s\"" #: access/transam/twophase.c:1419 access/transam/xlogrecovery.c:565 -#: postmaster/walsummarizer.c:936 replication/logical/logical.c:211 -#: replication/walsender.c:836 +#: postmaster/walsummarizer.c:936 replication/logical/logical.c:213 +#: replication/walsender.c:840 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Не удалось разместить обработчик журнала транзакций." @@ -2586,7 +2592,7 @@ msgstr "" "Для WAL-записи %X/%X найден файл состояния двухфазной фиксации, но эта " "транзакция уже была восстановлена с диска." -#: access/transam/twophase.c:2524 storage/file/fd.c:514 utils/fmgr/dfmgr.c:209 +#: access/transam/twophase.c:2524 storage/file/fd.c:511 utils/fmgr/dfmgr.c:209 #, c-format msgid "could not access file \"%s\": %m" msgstr "ошибка при обращении к файлу \"%s\": %m" @@ -2773,7 +2779,7 @@ msgstr "откатиться к точке сохранения во время msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "в одной транзакции не может быть больше 2^32-1 подтранзакций" -#: access/transam/xlog.c:1542 +#: access/transam/xlog.c:1543 #, c-format msgid "" "request to flush past end of generated WAL; request %X/%X, current position " @@ -2782,7 +2788,7 @@ msgstr "" "запрос на сброс данных за концом сгенерированного WAL; запрошена позиция %X/" "%X, текущая позиция %X/%X" -#: access/transam/xlog.c:1769 +#: access/transam/xlog.c:1770 #, c-format msgid "" "cannot read past end of generated WAL: requested %X/%X, current position %X/" @@ -2791,69 +2797,64 @@ msgstr "" "чтение за концом сгенерированного WAL невозможно: запрошена позиция %X/%X, " "текущая позиция %X/%X" -#: access/transam/xlog.c:2210 access/transam/xlog.c:4501 +#: access/transam/xlog.c:2211 access/transam/xlog.c:4483 #, 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 "\"%s\" must be set to -1 during binary upgrade mode." -msgstr "Параметр \"%s\" должен быть равен -1 в режиме двоичного обновления." - -#: access/transam/xlog.c:2477 +#: access/transam/xlog.c:2459 #, 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 +#: access/transam/xlog.c:3721 access/transam/xlogutils.c:831 +#: replication/walsender.c:3079 #, c-format msgid "requested WAL segment %s has already been removed" msgstr "запрошенный сегмент WAL %s уже удалён" -#: access/transam/xlog.c:4061 +#: access/transam/xlog.c:4043 #, c-format msgid "could not rename file \"%s\": %m" msgstr "не удалось переименовать файл \"%s\": %m" -#: access/transam/xlog.c:4104 access/transam/xlog.c:4115 -#: access/transam/xlog.c:4136 +#: access/transam/xlog.c:4086 access/transam/xlog.c:4097 +#: access/transam/xlog.c:4118 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "требуемый каталог WAL \"%s\" не существует" -#: access/transam/xlog.c:4121 access/transam/xlog.c:4142 +#: access/transam/xlog.c:4103 access/transam/xlog.c:4124 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "создаётся отсутствующий каталог WAL \"%s\"" -#: access/transam/xlog.c:4125 access/transam/xlog.c:4145 +#: access/transam/xlog.c:4107 access/transam/xlog.c:4127 #: commands/dbcommands.c:3262 #, c-format msgid "could not create missing directory \"%s\": %m" msgstr "не удалось создать отсутствующий каталог \"%s\": %m" -#: access/transam/xlog.c:4212 +#: access/transam/xlog.c:4194 #, c-format msgid "could not generate secret authorization token" msgstr "не удалось сгенерировать случайное число для аутентификации" -#: 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:4345 access/transam/xlog.c:4355 +#: access/transam/xlog.c:4381 access/transam/xlog.c:4389 +#: access/transam/xlog.c:4397 access/transam/xlog.c:4403 +#: access/transam/xlog.c:4411 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: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:4364 +#: access/transam/xlog.c:4346 #, c-format msgid "" "The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x), " @@ -2862,7 +2863,7 @@ msgstr "" "Кластер баз данных был инициализирован с PG_CONTROL_VERSION %d (0x%08x), но " "сервер скомпилирован с PG_CONTROL_VERSION %d (0x%08x)." -#: access/transam/xlog.c:4368 +#: access/transam/xlog.c:4350 #, c-format msgid "" "This could be a problem of mismatched byte ordering. It looks like you need " @@ -2871,7 +2872,7 @@ msgstr "" "Возможно, проблема вызвана разным порядком байт. Кажется, вам надо выполнить " "initdb." -#: access/transam/xlog.c:4374 +#: access/transam/xlog.c:4356 #, c-format msgid "" "The database cluster was initialized with PG_CONTROL_VERSION %d, but the " @@ -2880,18 +2881,18 @@ msgstr "" "Кластер баз данных был инициализирован с PG_CONTROL_VERSION %d, но сервер " "скомпилирован с PG_CONTROL_VERSION %d." -#: access/transam/xlog.c:4377 access/transam/xlog.c:4403 -#: access/transam/xlog.c:4411 access/transam/xlog.c:4417 +#: access/transam/xlog.c:4359 access/transam/xlog.c:4385 +#: access/transam/xlog.c:4393 access/transam/xlog.c:4399 #, c-format msgid "It looks like you need to initdb." msgstr "Кажется, вам надо выполнить initdb." -#: access/transam/xlog.c:4389 +#: access/transam/xlog.c:4371 #, c-format msgid "incorrect checksum in control file" msgstr "ошибка контрольной суммы в файле pg_control" -#: access/transam/xlog.c:4400 +#: access/transam/xlog.c:4382 #, c-format msgid "" "The database cluster was initialized with CATALOG_VERSION_NO %d, but the " @@ -2900,7 +2901,7 @@ msgstr "" "Кластер баз данных был инициализирован с CATALOG_VERSION_NO %d, но сервер " "скомпилирован с CATALOG_VERSION_NO %d." -#: access/transam/xlog.c:4408 +#: access/transam/xlog.c:4390 #, c-format msgid "" "The database cluster was initialized with MAXALIGN %d, but the server was " @@ -2909,7 +2910,7 @@ msgstr "" "Кластер баз данных был инициализирован с MAXALIGN %d, но сервер " "скомпилирован с MAXALIGN %d." -#: access/transam/xlog.c:4416 +#: access/transam/xlog.c:4398 #, c-format msgid "" "The database cluster appears to use a different floating-point number format " @@ -2918,7 +2919,7 @@ msgstr "" "Кажется, в кластере баз данных и в программе сервера используются разные " "форматы чисел с плавающей точкой." -#: access/transam/xlog.c:4422 +#: access/transam/xlog.c:4404 #, c-format msgid "" "The database cluster was initialized with BLCKSZ %d, but the server was " @@ -2927,16 +2928,16 @@ msgstr "" "Кластер баз данных был инициализирован с BLCKSZ %d, но сервер скомпилирован " "с BLCKSZ %d." -#: 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 +#: access/transam/xlog.c:4407 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:4464 +#: access/transam/xlog.c:4472 #, c-format msgid "It looks like you need to recompile or initdb." msgstr "Кажется, вам надо перекомпилировать сервер или выполнить initdb." -#: access/transam/xlog.c:4430 +#: access/transam/xlog.c:4412 #, c-format msgid "" "The database cluster was initialized with RELSEG_SIZE %d, but the server was " @@ -2945,7 +2946,7 @@ msgstr "" "Кластер баз данных был инициализирован с RELSEG_SIZE %d, но сервер " "скомпилирован с RELSEG_SIZE %d." -#: access/transam/xlog.c:4438 +#: access/transam/xlog.c:4420 #, c-format msgid "" "The database cluster was initialized with XLOG_BLCKSZ %d, but the server was " @@ -2954,7 +2955,7 @@ msgstr "" "Кластер баз данных был инициализирован с XLOG_BLCKSZ %d, но сервер " "скомпилирован с XLOG_BLCKSZ %d." -#: access/transam/xlog.c:4446 +#: access/transam/xlog.c:4428 #, c-format msgid "" "The database cluster was initialized with NAMEDATALEN %d, but the server was " @@ -2963,7 +2964,7 @@ msgstr "" "Кластер баз данных был инициализирован с NAMEDATALEN %d, но сервер " "скомпилирован с NAMEDATALEN %d." -#: access/transam/xlog.c:4454 +#: access/transam/xlog.c:4436 #, c-format msgid "" "The database cluster was initialized with INDEX_MAX_KEYS %d, but the server " @@ -2972,7 +2973,7 @@ msgstr "" "Кластер баз данных был инициализирован с INDEX_MAX_KEYS %d, но сервер " "скомпилирован с INDEX_MAX_KEYS %d." -#: access/transam/xlog.c:4462 +#: access/transam/xlog.c:4444 #, c-format msgid "" "The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d, but the " @@ -2981,7 +2982,7 @@ msgstr "" "Кластер баз данных был инициализирован с TOAST_MAX_CHUNK_SIZE %d, но сервер " "скомпилирован с TOAST_MAX_CHUNK_SIZE %d." -#: access/transam/xlog.c:4470 +#: access/transam/xlog.c:4452 #, c-format msgid "" "The database cluster was initialized with LOBLKSIZE %d, but the server was " @@ -2990,7 +2991,7 @@ msgstr "" "Кластер баз данных был инициализирован с LOBLKSIZE %d, но сервер " "скомпилирован с LOBLKSIZE %d." -#: access/transam/xlog.c:4480 +#: access/transam/xlog.c:4462 #, c-format msgid "" "The database cluster was initialized without USE_FLOAT8_BYVAL but the server " @@ -2999,7 +3000,7 @@ msgstr "" "Кластер баз данных был инициализирован без USE_FLOAT8_BYVAL, но сервер " "скомпилирован с USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4488 +#: access/transam/xlog.c:4470 #, c-format msgid "" "The database cluster was initialized with USE_FLOAT8_BYVAL but the server " @@ -3008,7 +3009,7 @@ msgstr "" "Кластер баз данных был инициализирован с USE_FLOAT8_BYVAL, но сервер был " "скомпилирован без USE_FLOAT8_BYVAL." -#: access/transam/xlog.c:4497 +#: access/transam/xlog.c:4479 #, c-format msgid "invalid WAL segment size in control file (%d byte)" msgid_plural "invalid WAL segment size in control file (%d bytes)" @@ -3016,45 +3017,45 @@ msgstr[0] "управляющий файл содержит неверный р msgstr[1] "управляющий файл содержит неверный размер сегмента WAL (%d Б)" msgstr[2] "управляющий файл содержит неверный размер сегмента WAL (%d Б)" -#: access/transam/xlog.c:4510 +#: access/transam/xlog.c:4492 #, 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:4514 +#: access/transam/xlog.c:4496 #, 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:4662 catalog/namespace.c:4696 +#: access/transam/xlog.c:4644 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 +#: replication/slot.c:2442 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 +#: access/transam/xlog.c:4690 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 +#: access/transam/xlog.c:5111 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "не удалось записать начальный файл журнала предзаписи: %m" -#: access/transam/xlog.c:5137 +#: access/transam/xlog.c:5119 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "не удалось сбросить на диск начальный файл журнала предзаписи: %m" -#: access/transam/xlog.c:5143 +#: access/transam/xlog.c:5125 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "не удалось закрыть начальный файл журнала предзаписи: %m" -#: access/transam/xlog.c:5368 +#: access/transam/xlog.c:5350 #, c-format msgid "" "WAL was generated with \"wal_level=minimal\", cannot continue recovering" @@ -3062,13 +3063,13 @@ msgstr "" "WAL был создан с параметром \"wal_level=minimal\", продолжение " "восстановления невозможно" -#: access/transam/xlog.c:5369 +#: access/transam/xlog.c:5351 #, c-format msgid "" "This happens if you temporarily set \"wal_level=minimal\" on the server." msgstr "Это происходит, если вы на время устанавливали \"wal_level=minimal\"." -#: access/transam/xlog.c:5370 +#: access/transam/xlog.c:5352 #, c-format msgid "" "Use a backup taken after setting \"wal_level\" to higher than \"minimal\"." @@ -3076,32 +3077,32 @@ msgstr "" "Используйте резервную копию, сделанную после переключения \"wal_level\" на " "любой уровень выше \"minimal\"." -#: access/transam/xlog.c:5435 +#: access/transam/xlog.c:5417 #, c-format msgid "control file contains invalid checkpoint location" msgstr "файл pg_control содержит неправильную позицию контрольной точки" -#: access/transam/xlog.c:5446 +#: access/transam/xlog.c:5428 #, c-format msgid "database system was shut down at %s" msgstr "система БД была выключена: %s" -#: access/transam/xlog.c:5452 +#: access/transam/xlog.c:5434 #, c-format msgid "database system was shut down in recovery at %s" msgstr "система БД была выключена в процессе восстановления: %s" -#: access/transam/xlog.c:5458 +#: access/transam/xlog.c:5440 #, c-format msgid "database system shutdown was interrupted; last known up at %s" msgstr "выключение системы БД было прервано; последний момент работы: %s" -#: access/transam/xlog.c:5464 +#: access/transam/xlog.c:5446 #, c-format msgid "database system was interrupted while in recovery at %s" msgstr "работа системы БД была прервана во время восстановления: %s" -#: access/transam/xlog.c:5466 +#: access/transam/xlog.c:5448 #, c-format msgid "" "This probably means that some data is corrupted and you will have to use the " @@ -3110,14 +3111,14 @@ msgstr "" "Это скорее всего означает, что некоторые данные повреждены и вам придётся " "восстановить БД из последней резервной копии." -#: access/transam/xlog.c:5472 +#: access/transam/xlog.c:5454 #, c-format msgid "database system was interrupted while in recovery at log time %s" msgstr "" "работа системы БД была прервана в процессе восстановления, время в журнале: " "%s" -#: access/transam/xlog.c:5474 +#: access/transam/xlog.c:5456 #, c-format msgid "" "If this has occurred more than once some data might be corrupted and you " @@ -3126,22 +3127,22 @@ msgstr "" "Если это происходит постоянно, возможно, какие-то данные были испорчены и " "для восстановления стоит выбрать более раннюю точку." -#: access/transam/xlog.c:5480 +#: access/transam/xlog.c:5462 #, c-format msgid "database system was interrupted; last known up at %s" msgstr "работа системы БД была прервана; последний момент работы: %s" -#: access/transam/xlog.c:5487 +#: access/transam/xlog.c:5469 #, c-format msgid "control file contains invalid database cluster state" msgstr "файл pg_control содержит неверный код состояния кластера" -#: access/transam/xlog.c:5875 +#: access/transam/xlog.c:5857 #, c-format msgid "WAL ends before end of online backup" msgstr "WAL закончился без признака окончания копирования" -#: access/transam/xlog.c:5876 +#: access/transam/xlog.c:5858 #, c-format msgid "" "All WAL generated while online backup was taken must be available at " @@ -3150,40 +3151,40 @@ msgstr "" "Все журналы WAL, созданные во время резервного копирования \"на ходу\", " "должны быть в наличии для восстановления." -#: access/transam/xlog.c:5880 +#: access/transam/xlog.c:5862 #, c-format msgid "WAL ends before consistent recovery point" msgstr "WAL закончился до согласованной точки восстановления" -#: access/transam/xlog.c:5926 +#: access/transam/xlog.c:5908 #, c-format msgid "selected new timeline ID: %u" msgstr "выбранный ID новой линии времени: %u" -#: access/transam/xlog.c:5959 +#: access/transam/xlog.c:5941 #, c-format msgid "archive recovery complete" msgstr "восстановление архива завершено" -#: access/transam/xlog.c:6612 +#: access/transam/xlog.c:6594 #, c-format msgid "shutting down" msgstr "выключение" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6651 +#: access/transam/xlog.c:6633 #, 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:6663 +#: access/transam/xlog.c:6645 #, 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:6728 +#: access/transam/xlog.c:6710 #, c-format msgid "" "restartpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d " @@ -3198,7 +3199,7 @@ msgstr "" "lsn=%X/%X, lsn redo=%X/%X" # well-spelled: синхр -#: access/transam/xlog.c:6751 +#: access/transam/xlog.c:6733 #, c-format msgid "" "checkpoint complete: wrote %d buffers (%.1f%%); %d WAL file(s) added, %d " @@ -3212,7 +3213,7 @@ msgstr "" "=%ld.%03d сек., средняя=%ld.%03d сек.; расстояние=%d kB, ожидалось=%d kB; " "lsn=%X/%X, lsn redo=%X/%X" -#: access/transam/xlog.c:7233 +#: access/transam/xlog.c:7225 #, c-format msgid "" "concurrent write-ahead log activity while database system is shutting down" @@ -3220,64 +3221,64 @@ msgstr "" "во время выключения системы баз данных отмечена активность в журнале " "предзаписи" -#: access/transam/xlog.c:7818 +#: access/transam/xlog.c:7840 #, c-format msgid "recovery restart point at %X/%X" msgstr "точка перезапуска восстановления в позиции %X/%X" -#: access/transam/xlog.c:7820 +#: access/transam/xlog.c:7842 #, c-format msgid "Last completed transaction was at log time %s." msgstr "Последняя завершённая транзакция была выполнена в %s." -#: access/transam/xlog.c:8082 +#: access/transam/xlog.c:8108 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "точка восстановления \"%s\" создана в позиции %X/%X" -#: access/transam/xlog.c:8289 +#: access/transam/xlog.c:8315 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "" "резервное копирование \"на ходу\" было отменено, продолжить восстановление " "нельзя" -#: access/transam/xlog.c:8347 +#: access/transam/xlog.c:8373 #, c-format msgid "unexpected timeline ID %u (should be %u) in shutdown checkpoint record" msgstr "" "неожиданный ID линии времени %u (должен быть %u) в записи точки выключения" -#: access/transam/xlog.c:8405 +#: access/transam/xlog.c:8431 #, c-format msgid "unexpected timeline ID %u (should be %u) in online checkpoint record" msgstr "" "неожиданный ID линии времени %u (должен быть %u) в записи точки активности" -#: access/transam/xlog.c:8434 +#: access/transam/xlog.c:8460 #, c-format msgid "unexpected timeline ID %u (should be %u) in end-of-recovery record" msgstr "" "неожиданный ID линии времени %u (должен быть %u) в записи конец-" "восстановления" -#: access/transam/xlog.c:8705 +#: access/transam/xlog.c:8731 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "не удалось синхронизировать с ФС файл сквозной записи %s: %m" -#: access/transam/xlog.c:8710 +#: access/transam/xlog.c:8736 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "не удалось синхронизировать с ФС данные (fdatasync) файла \"%s\": %m" -#: access/transam/xlog.c:8797 access/transam/xlog.c:9133 +#: access/transam/xlog.c:8823 access/transam/xlog.c:9159 #, c-format msgid "WAL level not sufficient for making an online backup" msgstr "" "Выбранный уровень WAL недостаточен для резервного копирования \"на ходу\"" -#: access/transam/xlog.c:8798 access/transam/xlogfuncs.c:248 +#: access/transam/xlog.c:8824 access/transam/xlogfuncs.c:248 #, c-format msgid "" "\"wal_level\" must be set to \"replica\" or \"logical\" at server start." @@ -3285,12 +3286,12 @@ msgstr "" "Параметр \"wal_level\" должен иметь значение \"replica\" или \"logical\" при " "запуске сервера." -#: access/transam/xlog.c:8803 +#: access/transam/xlog.c:8829 #, c-format msgid "backup label too long (max %d bytes)" msgstr "длина метки резервной копии превышает предел (%d байт)" -#: access/transam/xlog.c:8924 +#: access/transam/xlog.c:8950 #, c-format msgid "" "WAL generated with \"full_page_writes=off\" was replayed since last " @@ -3299,7 +3300,7 @@ msgstr "" "после последней точки перезапуска был воспроизведён WAL, созданный в режиме " "\"full_page_writes=off\"" -#: access/transam/xlog.c:8926 access/transam/xlog.c:9222 +#: access/transam/xlog.c:8952 access/transam/xlog.c:9248 #, c-format msgid "" "This means that the backup being taken on the standby is corrupt and should " @@ -3311,28 +3312,28 @@ msgstr "" "CHECKPOINT на ведущем сервере, а затем попробуйте резервное копирование \"на " "ходу\" ещё раз." -#: access/transam/xlog.c:9006 backup/basebackup.c:1417 utils/adt/misc.c:354 +#: access/transam/xlog.c:9032 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 +#: access/transam/xlog.c:9039 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 +#: access/transam/xlog.c:9160 #, 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 +#: access/transam/xlog.c:9198 backup/basebackup.c:1281 #, c-format msgid "the standby was promoted during online backup" msgstr "" "ведомый сервер был повышен в процессе резервного копирования \"на ходу\"" -#: access/transam/xlog.c:9173 backup/basebackup.c:1282 +#: access/transam/xlog.c:9199 backup/basebackup.c:1282 #, c-format msgid "" "This means that the backup being taken is corrupt and should not be used. " @@ -3341,7 +3342,7 @@ msgstr "" "Это означает, что создаваемая резервная копия испорчена и использовать её не " "следует. Попробуйте резервное копирование \"на ходу\" ещё раз." -#: access/transam/xlog.c:9220 +#: access/transam/xlog.c:9246 #, c-format msgid "" "WAL generated with \"full_page_writes=off\" was replayed during online backup" @@ -3349,13 +3350,13 @@ msgstr "" "в процессе резервного копирования \"на ходу\" был воспроизведён WAL, " "созданный в режиме \"full_page_writes=off\"" -#: access/transam/xlog.c:9336 +#: access/transam/xlog.c:9362 #, c-format msgid "base backup done, waiting for required WAL segments to be archived" msgstr "" "базовое копирование выполнено, ожидается архивация нужных сегментов WAL" -#: access/transam/xlog.c:9350 +#: access/transam/xlog.c:9376 #, c-format msgid "" "still waiting for all required WAL segments to be archived (%d seconds " @@ -3363,7 +3364,7 @@ msgid "" msgstr "" "продолжается ожидание архивации всех нужных сегментов WAL (прошло %d сек.)" -#: access/transam/xlog.c:9352 +#: access/transam/xlog.c:9378 #, c-format msgid "" "Check that your \"archive_command\" is executing properly. You can safely " @@ -3374,12 +3375,12 @@ msgstr "" "копирования можно отменить безопасно, но резервная копия базы будет " "непригодна без всех сегментов WAL." -#: access/transam/xlog.c:9359 +#: access/transam/xlog.c:9385 #, c-format msgid "all required WAL segments have been archived" msgstr "все нужные сегменты WAL заархивированы" -#: access/transam/xlog.c:9363 +#: access/transam/xlog.c:9389 #, c-format msgid "" "WAL archiving is not enabled; you must ensure that all required WAL segments " @@ -3388,7 +3389,7 @@ msgstr "" "архивация WAL не настроена; вы должны обеспечить копирование всех требуемых " "сегментов WAL другими средствами для получения резервной копии" -#: access/transam/xlog.c:9402 +#: access/transam/xlog.c:9428 #, c-format msgid "aborting backup due to backend exiting before pg_backup_stop was called" msgstr "" @@ -3561,52 +3562,52 @@ msgstr "" msgid "contrecord is requested by %X/%X" msgstr "в позиции %X/%X запрошено продолжение записи" -#: access/transam/xlogreader.c:669 access/transam/xlogreader.c:1134 +#: access/transam/xlogreader.c:669 access/transam/xlogreader.c:1144 #, 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 +#: access/transam/xlogreader.c:759 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "нет флага contrecord в позиции %X/%X" -#: access/transam/xlogreader.c:771 +#: access/transam/xlogreader.c:772 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "неверная длина contrecord: %u (ожидалась %lld) в позиции %X/%X" -#: access/transam/xlogreader.c:1142 +#: access/transam/xlogreader.c:1152 #, 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 +#: access/transam/xlogreader.c:1165 access/transam/xlogreader.c:1181 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "запись с неверной ссылкой назад %X/%X в позиции %X/%X" -#: access/transam/xlogreader.c:1209 +#: access/transam/xlogreader.c:1219 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "" "некорректная контрольная сумма данных менеджера ресурсов в записи в позиции " "%X/%X" -#: access/transam/xlogreader.c:1243 +#: access/transam/xlogreader.c:1253 #, c-format 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:1258 access/transam/xlogreader.c:1300 +#: access/transam/xlogreader.c:1268 access/transam/xlogreader.c:1310 #, c-format 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:1274 +#: access/transam/xlogreader.c:1284 #, c-format msgid "" "WAL file is from different database system: WAL file database system " @@ -3615,7 +3616,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: в нём указан идентификатор системы БД " "%llu, а идентификатор системы pg_control: %llu" -#: access/transam/xlogreader.c:1282 +#: access/transam/xlogreader.c:1292 #, c-format msgid "" "WAL file is from different database system: incorrect segment size in page " @@ -3624,7 +3625,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный размер сегмента в заголовке " "страницы" -#: access/transam/xlogreader.c:1288 +#: access/transam/xlogreader.c:1298 #, c-format msgid "" "WAL file is from different database system: incorrect XLOG_BLCKSZ in page " @@ -3633,12 +3634,12 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный XLOG_BLCKSZ в заголовке " "страницы" -#: access/transam/xlogreader.c:1320 +#: access/transam/xlogreader.c:1330 #, 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" -#: access/transam/xlogreader.c:1346 +#: access/transam/xlogreader.c:1356 #, c-format msgid "" "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, " @@ -3647,23 +3648,23 @@ msgstr "" "нарушение последовательности ID линии времени %u (после %u) в сегменте WAL " "%s, LSN %X/%X, смещение %u" -#: access/transam/xlogreader.c:1749 +#: access/transam/xlogreader.c:1759 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "идентификатор блока %u идёт не по порядку в позиции %X/%X" -#: access/transam/xlogreader.c:1773 +#: access/transam/xlogreader.c:1783 #, 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 +#: access/transam/xlogreader.c:1790 #, 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 +#: access/transam/xlogreader.c:1826 #, c-format msgid "" "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at " @@ -3672,21 +3673,21 @@ msgstr "" "BKPIMAGE_HAS_HOLE установлен, но для пропуска заданы смещение %u и длина %u " "при длине образа блока %u в позиции %X/%X" -#: access/transam/xlogreader.c:1832 +#: access/transam/xlogreader.c:1842 #, 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 +#: access/transam/xlogreader.c:1856 #, 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 +#: access/transam/xlogreader.c:1871 #, c-format msgid "" "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image " @@ -3695,41 +3696,41 @@ msgstr "" "ни BKPIMAGE_HAS_HOLE, ни BKPIMAGE_COMPRESSED не установлены, но длина образа " "блока равна %u в позиции %X/%X" -#: access/transam/xlogreader.c:1877 +#: access/transam/xlogreader.c:1887 #, 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 +#: access/transam/xlogreader.c:1899 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "неверный идентификатор блока %u в позиции %X/%X" -#: access/transam/xlogreader.c:1956 +#: access/transam/xlogreader.c:1966 #, c-format msgid "record with invalid length at %X/%X" msgstr "запись с неверной длиной в позиции %X/%X" -#: access/transam/xlogreader.c:1982 +#: access/transam/xlogreader.c:1992 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "не удалось найти копию блока с ID %d в записи журнала WAL" -#: access/transam/xlogreader.c:2066 +#: access/transam/xlogreader.c:2076 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "" "не удалось восстановить образ в позиции %X/%X с указанным неверным блоком %d" -#: access/transam/xlogreader.c:2073 +#: access/transam/xlogreader.c:2083 #, 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 +#: access/transam/xlogreader.c:2110 access/transam/xlogreader.c:2127 #, c-format msgid "" "could not restore image at %X/%X compressed with %s not supported by build, " @@ -3738,7 +3739,7 @@ msgstr "" "не удалось восстановить образ в позиции %X/%X, сжатый методом %s, который не " "поддерживается этой сборкой, блок %d" -#: access/transam/xlogreader.c:2126 +#: access/transam/xlogreader.c:2136 #, c-format msgid "" "could not restore image at %X/%X compressed with unknown method, block %d" @@ -3746,7 +3747,7 @@ msgstr "" "не удалось восстановить образ в позиции %X/%X, сжатый неизвестным методом, " "блок %d" -#: access/transam/xlogreader.c:2134 +#: access/transam/xlogreader.c:2144 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "не удалось развернуть образ в позиции %X/%X, блок %d" @@ -4679,7 +4680,7 @@ 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 +#: commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:1982 #: storage/file/copydir.c:47 #, c-format msgid "could not create directory \"%s\": %m" @@ -4917,19 +4918,19 @@ msgstr "предложение IN SCHEMA нельзя использовать #: 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 +#: 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:14403 commands/tablecmds.c:17030 commands/trigger.c:943 #: 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 +#: parser/parse_utilcmd.c:3449 parser/parse_utilcmd.c:3491 utils/adt/acl.c:2940 #: utils/adt/ruleutils.c:2812 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" @@ -4940,15 +4941,15 @@ msgstr "столбец \"%s\" в таблице \"%s\" не существует msgid "\"%s\" is an index" msgstr "\"%s\" - это индекс" -#: catalog/aclchk.c:1869 commands/tablecmds.c:14496 commands/tablecmds.c:17882 +#: catalog/aclchk.c:1869 commands/tablecmds.c:14560 commands/tablecmds.c:17946 #, 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 +#: commands/tablecmds.c:17910 utils/adt/acl.c:2124 utils/adt/acl.c:2154 +#: utils/adt/acl.c:2187 utils/adt/acl.c:2223 utils/adt/acl.c:2254 +#: utils/adt/acl.c:2285 #, c-format msgid "\"%s\" is not a sequence" msgstr "\"%s\" - это не последовательность" @@ -5494,14 +5495,14 @@ msgstr "удалить объект %s нельзя, так как от него #: 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 +#: commands/tablecmds.c:15152 commands/tablespace.c:460 commands/user.c:1302 +#: commands/vacuum.c:212 commands/view.c:441 executor/execExprInterp.c:4655 +#: executor/execExprInterp.c:4663 libpq/auth.c:332 +#: 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 +#: utils/misc/guc.c:3210 utils/misc/guc.c:3285 utils/misc/guc.c:6836 +#: utils/misc/guc.c:6870 utils/misc/guc.c:6904 utils/misc/guc.c:6947 +#: utils/misc/guc.c:6989 #, c-format msgid "%s" msgstr "%s" @@ -5536,50 +5537,50 @@ msgstr "константу типа %s здесь использовать не msgid "column %d of relation \"%s\" does not exist" msgstr "столбец %d отношения \"%s\" не существует" -#: catalog/heap.c:325 +#: catalog/heap.c:326 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "нет прав для создания отношения \"%s.%s\"" -#: catalog/heap.c:327 +#: catalog/heap.c:328 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "Изменение системного каталога в текущем состоянии запрещено." -#: catalog/heap.c:467 commands/tablecmds.c:2495 commands/tablecmds.c:2917 +#: 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:485 commands/tablecmds.c:7432 +#: 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:501 +#: 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:579 +#: catalog/heap.c:580 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "столбец \"%s\" ключа разбиения имеет псевдотип %s" -#: catalog/heap.c:584 +#: catalog/heap.c:585 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "столбец \"%s\" имеет псевдотип %s" -#: catalog/heap.c:615 +#: 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:670 +#: catalog/heap.c:671 #, c-format msgid "" "no collation was derived for partition key column %s with collatable type %s" @@ -5587,20 +5588,20 @@ msgstr "" "для входящего в ключ разбиения столбца \"%s\" с сортируемым типом %s не " "удалось получить правило сортировки" -#: catalog/heap.c:676 commands/createas.c:198 commands/createas.c:505 +#: 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:1161 catalog/index.c:899 commands/createas.c:401 +#: 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:1177 catalog/pg_type.c:434 catalog/pg_type.c:805 +#: 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 @@ -5608,7 +5609,7 @@ msgstr "отношение \"%s\" уже существует" msgid "type \"%s\" already exists" msgstr "тип \"%s\" уже существует" -#: catalog/heap.c:1178 +#: catalog/heap.c:1179 #, c-format msgid "" "A relation has an associated type of the same name, so you must use a name " @@ -5617,54 +5618,54 @@ msgstr "" "С отношением уже связан тип с таким же именем; выберите имя, не " "конфликтующее с существующими типами." -#: catalog/heap.c:1218 +#: catalog/heap.c:1219 #, c-format msgid "toast relfilenumber value not set when in binary upgrade mode" msgstr "" "значение relfilenumber для TOAST не задано в режиме двоичного обновления" -#: catalog/heap.c:1229 +#: 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:1239 +#: catalog/heap.c:1240 #, c-format msgid "relfilenumber value not set when in binary upgrade mode" msgstr "значение relfilenumber не задано в режиме двоичного обновления" -#: catalog/heap.c:2130 +#: catalog/heap.c:2185 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "" "добавить ограничение NO INHERIT к секционированной таблице \"%s\" нельзя" -#: catalog/heap.c:2402 +#: catalog/heap.c:2452 #, c-format msgid "check constraint \"%s\" already exists" msgstr "ограничение-проверка \"%s\" уже существует" -#: catalog/heap.c:2574 catalog/index.c:913 catalog/pg_constraint.c:724 -#: commands/tablecmds.c:9356 +#: 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:2581 +#: catalog/heap.c:2631 #, c-format msgid "" "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "" "ограничение \"%s\" конфликтует с ненаследуемым ограничением таблицы \"%s\"" -#: catalog/heap.c:2592 +#: catalog/heap.c:2642 #, c-format msgid "" "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "" "ограничение \"%s\" конфликтует с наследуемым ограничением таблицы \"%s\"" -#: catalog/heap.c:2602 +#: catalog/heap.c:2652 #, c-format msgid "" "constraint \"%s\" conflicts with NOT VALID constraint on relation \"%s\"" @@ -5672,71 +5673,71 @@ msgstr "" "ограничение \"%s\" конфликтует с непроверенным (NOT VALID) ограничением " "таблицы \"%s\"" -#: catalog/heap.c:2607 +#: catalog/heap.c:2657 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "слияние ограничения \"%s\" с унаследованным определением" -#: catalog/heap.c:2633 catalog/pg_constraint.c:853 commands/tablecmds.c:3074 +#: catalog/heap.c:2683 catalog/pg_constraint.c:854 commands/tablecmds.c:3074 #: commands/tablecmds.c:3377 commands/tablecmds.c:7089 -#: commands/tablecmds.c:15907 commands/tablecmds.c:16038 +#: commands/tablecmds.c:15971 commands/tablecmds.c:16102 #, c-format msgid "too many inheritance parents" msgstr "слишком много родителей в иерархии наследования" -#: catalog/heap.c:2717 +#: catalog/heap.c:2767 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "" "использовать генерируемый столбец \"%s\" в выражении генерируемого столбца " "нельзя" -#: catalog/heap.c:2719 +#: catalog/heap.c:2769 #, c-format msgid "A generated column cannot reference another generated column." msgstr "" "Генерируемый столбец не может ссылаться на другой генерируемый столбец." -#: catalog/heap.c:2725 +#: catalog/heap.c:2775 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "" "в выражении генерируемого столбца нельзя использовать переменные «вся строка»" -#: catalog/heap.c:2726 +#: catalog/heap.c:2776 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "" "Это сделало бы генерируемый столбец зависимым от собственного значения." -#: catalog/heap.c:2781 +#: catalog/heap.c:2831 #, c-format msgid "generation expression is not immutable" msgstr "генерирующее выражение не является постоянным" -#: catalog/heap.c:2809 rewrite/rewriteHandler.c:1276 +#: 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:2814 commands/prepare.c:331 parser/analyze.c:2758 +#: 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:2861 +#: catalog/heap.c:2911 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "в ограничении-проверке можно ссылаться только на таблицу \"%s\"" -#: catalog/heap.c:3167 +#: catalog/heap.c:3217 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "неподдерживаемое сочетание внешнего ключа с ON COMMIT" -#: catalog/heap.c:3168 +#: catalog/heap.c:3218 #, c-format msgid "" "Table \"%s\" references \"%s\", but they do not have the same ON COMMIT " @@ -5744,17 +5745,17 @@ msgid "" msgstr "" "Таблица \"%s\" ссылается на \"%s\", и для них задан разный режим ON COMMIT." -#: catalog/heap.c:3173 +#: catalog/heap.c:3223 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "опустошить таблицу, на которую ссылается внешний ключ, нельзя" -#: catalog/heap.c:3174 +#: catalog/heap.c:3224 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Таблица \"%s\" ссылается на \"%s\"." -#: catalog/heap.c:3176 +#: catalog/heap.c:3226 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "" @@ -5839,12 +5840,12 @@ msgstr "DROP INDEX CONCURRENTLY должен быть первым действ msgid "cannot reindex temporary tables of other sessions" msgstr "переиндексировать временные таблицы других сеансов нельзя" -#: catalog/index.c:3679 commands/indexcmds.c:3626 +#: catalog/index.c:3679 commands/indexcmds.c:3660 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "перестроить нерабочий индекс в таблице TOAST нельзя" -#: catalog/index.c:3695 commands/indexcmds.c:3504 commands/indexcmds.c:3650 +#: catalog/index.c:3695 commands/indexcmds.c:3538 commands/indexcmds.c:3684 #: commands/tablecmds.c:3581 #, c-format msgid "cannot move system relation \"%s\"" @@ -5863,7 +5864,7 @@ msgstr "" "пропускается" #: catalog/namespace.c:462 catalog/namespace.c:666 catalog/namespace.c:758 -#: commands/trigger.c:5729 +#: commands/trigger.c:5817 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "ссылки между базами не реализованы: \"%s.%s.%s\"" @@ -5947,7 +5948,7 @@ msgid "cross-database references are not implemented: %s" msgstr "ссылки между базами не реализованы: %s" #: catalog/namespace.c:3335 parser/parse_expr.c:875 parser/parse_target.c:1266 -#: gram.y:19181 gram.y:19221 +#: gram.y:19188 gram.y:19228 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неверное полное имя (слишком много компонентов): %s" @@ -6000,25 +6001,25 @@ msgstr "создавать временные таблицы во время п #: 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 +#: commands/tablecmds.c:12966 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\" - это не таблица" #: catalog/objectaddress.c:1378 commands/tablecmds.c:269 -#: commands/tablecmds.c:17851 commands/view.c:114 +#: commands/tablecmds.c:17915 commands/view.c:114 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\" - это не представление" #: catalog/objectaddress.c:1385 commands/matview.c:199 commands/tablecmds.c:275 -#: commands/tablecmds.c:17856 +#: commands/tablecmds.c:17920 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\" - это не материализованное представление" #: catalog/objectaddress.c:1392 commands/tablecmds.c:293 -#: commands/tablecmds.c:17861 +#: commands/tablecmds.c:17925 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\" - это не сторонняя таблица" @@ -6042,7 +6043,7 @@ msgstr "" #: 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 +#: utils/adt/acl.c:4577 #, c-format msgid "type \"%s\" does not exist" msgstr "тип \"%s\" не существует" @@ -6062,8 +6063,9 @@ msgstr "функция %d (%s, %s) из семейства %s не сущест msgid "user mapping for user \"%s\" on server \"%s\" does not exist" msgstr "сопоставление для пользователя \"%s\" на сервере \"%s\" не существует" -#: catalog/objectaddress.c:1834 commands/foreigncmds.c:430 -#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:713 +#: catalog/objectaddress.c:1834 commands/foreigncmds.c:441 +#: commands/foreigncmds.c:1004 commands/foreigncmds.c:1367 +#: foreign/foreign.c:713 #, c-format msgid "server \"%s\" does not exist" msgstr "сервер \"%s\" не существует" @@ -6734,17 +6736,17 @@ msgstr "правило сортировки \"%s\" уже существует" msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "правило сортировки \"%s\" для кодировки \"%s\" уже существует" -#: catalog/pg_constraint.c:732 +#: catalog/pg_constraint.c:733 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "ограничение \"%s\" для домена %s уже существует" -#: catalog/pg_constraint.c:932 catalog/pg_constraint.c:1025 +#: 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:1125 +#: catalog/pg_constraint.c:1126 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "ограничение \"%s\" для домена %s не существует" @@ -6841,7 +6843,7 @@ msgstr "" "отсоединения." #: catalog/pg_inherits.c:595 commands/tablecmds.c:4800 -#: commands/tablecmds.c:16153 +#: commands/tablecmds.c:16217 #, c-format msgid "" "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending " @@ -7199,12 +7201,12 @@ msgstr "" "изменить владельца объектов, принадлежащих роли %s, нельзя, так как они " "нужны системе баз данных" -#: catalog/pg_subscription.c:438 +#: catalog/pg_subscription.c:463 #, c-format msgid "could not drop relation mapping for subscription \"%s\"" msgstr "удалить сопоставление отношений для подписки \"%s\" не получилось" -#: catalog/pg_subscription.c:440 +#: catalog/pg_subscription.c:465 #, c-format msgid "" "Table synchronization for relation \"%s\" is in progress and is in state " @@ -7214,7 +7216,7 @@ msgstr "Выполняется синхронизация отношения \"% #. translator: first %s is a SQL ALTER command and second %s is a #. SQL DROP command #. -#: catalog/pg_subscription.c:447 +#: catalog/pg_subscription.c:472 #, c-format msgid "" "Use %s to enable subscription if not already enabled or use %s to drop the " @@ -7378,12 +7380,12 @@ msgstr "" msgid "event trigger \"%s\" already exists" msgstr "событийный триггер \"%s\" уже существует" -#: commands/alter.c:86 commands/foreigncmds.c:593 +#: commands/alter.c:86 commands/foreigncmds.c:604 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "обёртка сторонних данных \"%s\" уже существует" -#: commands/alter.c:89 commands/foreigncmds.c:884 +#: commands/alter.c:89 commands/foreigncmds.c:895 #, c-format msgid "server \"%s\" already exists" msgstr "сервер \"%s\" уже существует" @@ -7488,7 +7490,7 @@ 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 +#: commands/foreigncmds.c:500 commands/proclang.c:78 commands/trigger.c:703 #: parser/parse_clause.c:943 #, c-format msgid "function %s must return type %s" @@ -7619,7 +7621,7 @@ msgstr "кластеризовать временные таблицы друг msgid "there is no previously clustered index for table \"%s\"" msgstr "таблица \"%s\" ранее не кластеризовалась по какому-либо индексу" -#: commands/cluster.c:191 commands/tablecmds.c:14797 commands/tablecmds.c:16729 +#: commands/cluster.c:191 commands/tablecmds.c:14861 commands/tablecmds.c:16793 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "индекс \"%s\" для таблицы \"%s\" не существует" @@ -7634,7 +7636,7 @@ msgstr "кластеризовать разделяемый каталог не msgid "cannot vacuum temporary tables of other sessions" msgstr "очищать временные таблицы других сеансов нельзя" -#: commands/cluster.c:513 commands/tablecmds.c:16739 +#: commands/cluster.c:513 commands/tablecmds.c:16803 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\" не является индексом таблицы \"%s\"" @@ -7706,13 +7708,13 @@ msgid "collation attribute \"%s\" not recognized" msgstr "атрибут COLLATION \"%s\" не распознан" #: commands/collationcmds.c:123 commands/collationcmds.c:129 -#: commands/define.c:388 commands/tablecmds.c:8129 +#: 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 +#: 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 "конфликтующие или избыточные параметры" @@ -7783,9 +7785,9 @@ 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/tablecmds.c:7938 commands/tablecmds.c:7948 +#: commands/tablecmds.c:7950 commands/tablecmds.c:14563 +#: commands/tablecmds.c:17948 commands/tablecmds.c:17969 #: commands/typecmds.c:3787 commands/typecmds.c:3872 commands/typecmds.c:4226 #, c-format msgid "Use %s instead." @@ -8081,7 +8083,7 @@ msgstr "Генерируемые столбцы нельзя использов msgid "column \"%s\" does not exist" msgstr "столбец \"%s\" не существует" -#: commands/copy.c:963 commands/tablecmds.c:2552 commands/trigger.c:951 +#: commands/copy.c:963 commands/tablecmds.c:2552 commands/trigger.c:952 #: parser/parse_target.c:1083 parser/parse_target.c:1094 #, c-format msgid "column \"%s\" specified more than once" @@ -8246,17 +8248,17 @@ 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 +#: 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 replication/walsender.c:772 +#: 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 replication/walsender.c:803 +#: commands/copyfromparse.c:317 replication/walsender.c:807 #, c-format msgid "COPY from stdin failed: %s" msgstr "ошибка при вводе данных COPY из stdin: %s" @@ -9028,7 +9030,7 @@ msgstr "Используйте DROP AGGREGATE для удаления агрег #: 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 +#: commands/tablecmds.c:17225 tcop/utility.c:1325 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "отношение \"%s\" не существует, пропускается" @@ -9153,7 +9155,7 @@ msgstr "правило \"%s\" для отношения \"%s\" не сущест msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "обёртка сторонних данных \"%s\" не существует, пропускается" -#: commands/dropcmds.c:448 commands/foreigncmds.c:1360 +#: commands/dropcmds.c:448 commands/foreigncmds.c:1371 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "сервер \"%s\" не существует, пропускается" @@ -9606,68 +9608,68 @@ msgstr "тип мультидиапазона для типа данных %s н msgid "file \"%s\" is too large" msgstr "файл \"%s\" слишком большой" -#: commands/foreigncmds.c:148 commands/foreigncmds.c:157 +#: commands/foreigncmds.c:159 commands/foreigncmds.c:168 #, c-format msgid "option \"%s\" not found" msgstr "нераспознанный параметр \"%s\"" -#: commands/foreigncmds.c:167 +#: commands/foreigncmds.c:178 #, c-format msgid "option \"%s\" provided more than once" msgstr "параметр \"%s\" указан неоднократно" -#: commands/foreigncmds.c:221 commands/foreigncmds.c:229 +#: commands/foreigncmds.c:232 commands/foreigncmds.c:240 #, c-format msgid "permission denied to change owner of foreign-data wrapper \"%s\"" msgstr "нет прав для изменения владельца обёртки сторонних данных \"%s\"" -#: commands/foreigncmds.c:223 +#: commands/foreigncmds.c:234 #, c-format msgid "Must be superuser to change owner of a foreign-data wrapper." msgstr "" "Для смены владельца обёртки сторонних данных нужно быть суперпользователем." -#: commands/foreigncmds.c:231 +#: commands/foreigncmds.c:242 #, 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:691 +#: commands/foreigncmds.c:302 commands/foreigncmds.c:718 foreign/foreign.c:691 #, c-format msgid "foreign-data wrapper \"%s\" does not exist" msgstr "обёртка сторонних данных \"%s\" не существует" -#: commands/foreigncmds.c:325 +#: commands/foreigncmds.c:336 #, c-format msgid "foreign-data wrapper with OID %u does not exist" msgstr "обёртка сторонних данных с OID %u не существует" -#: commands/foreigncmds.c:462 +#: commands/foreigncmds.c:473 #, c-format msgid "foreign server with OID %u does not exist" msgstr "сторонний сервер с OID %u не существует" -#: commands/foreigncmds.c:580 +#: commands/foreigncmds.c:591 #, c-format msgid "permission denied to create foreign-data wrapper \"%s\"" msgstr "нет прав для создания обёртки сторонних данных \"%s\"" -#: commands/foreigncmds.c:582 +#: commands/foreigncmds.c:593 #, c-format msgid "Must be superuser to create a foreign-data wrapper." msgstr "Для создания обёртки сторонних данных нужно быть суперпользователем." -#: commands/foreigncmds.c:697 +#: commands/foreigncmds.c:708 #, c-format msgid "permission denied to alter foreign-data wrapper \"%s\"" msgstr "нет прав для изменения обёртки сторонних данных \"%s\"" -#: commands/foreigncmds.c:699 +#: commands/foreigncmds.c:710 #, c-format msgid "Must be superuser to alter a foreign-data wrapper." msgstr "Для изменения обёртки сторонних данных нужно быть суперпользователем." -#: commands/foreigncmds.c:730 +#: commands/foreigncmds.c:741 #, c-format msgid "" "changing the foreign-data wrapper handler can change behavior of existing " @@ -9676,7 +9678,7 @@ msgstr "" "при изменении обработчика в обёртке сторонних данных может измениться " "поведение существующих сторонних таблиц" -#: commands/foreigncmds.c:745 +#: commands/foreigncmds.c:756 #, c-format msgid "" "changing the foreign-data wrapper validator can cause the options for " @@ -9685,46 +9687,46 @@ msgstr "" "при изменении функции проверки в обёртке сторонних данных параметры " "зависимых объектов могут стать неверными" -#: commands/foreigncmds.c:876 +#: commands/foreigncmds.c:887 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "сервер \"%s\" уже существует, пропускается" -#: commands/foreigncmds.c:1144 +#: commands/foreigncmds.c:1155 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "" "сопоставление пользователя \"%s\" для сервера \"%s\" уже существует, " "пропускается" -#: commands/foreigncmds.c:1154 +#: commands/foreigncmds.c:1165 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "сопоставление пользователя \"%s\" для сервера \"%s\" уже существует" -#: commands/foreigncmds.c:1254 commands/foreigncmds.c:1374 +#: commands/foreigncmds.c:1265 commands/foreigncmds.c:1385 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "сопоставление пользователя \"%s\" для сервера \"%s\" не существует" -#: commands/foreigncmds.c:1379 +#: commands/foreigncmds.c:1390 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "" "сопоставление пользователя \"%s\" для сервера \"%s\" не существует, " "пропускается" -#: commands/foreigncmds.c:1507 foreign/foreign.c:404 +#: commands/foreigncmds.c:1518 foreign/foreign.c:404 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "обёртка сторонних данных \"%s\" не имеет обработчика" -#: commands/foreigncmds.c:1513 +#: commands/foreigncmds.c:1524 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "обёртка сторонних данных \"%s\" не поддерживает IMPORT FOREIGN SCHEMA" -#: commands/foreigncmds.c:1615 +#: commands/foreigncmds.c:1626 #, c-format msgid "importing foreign table \"%s\"" msgstr "импорт сторонней таблицы \"%s\"" @@ -10290,8 +10292,8 @@ msgstr "включаемые столбцы не поддерживают ука msgid "could not determine which collation to use for index expression" msgstr "не удалось определить правило сортировки для индексного выражения" -#: 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 +#: commands/indexcmds.c:2028 commands/tablecmds.c:18249 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" @@ -10333,8 +10335,8 @@ msgstr "метод доступа \"%s\" не поддерживает сорт msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "метод доступа \"%s\" не поддерживает параметр NULLS FIRST/LAST" -#: commands/indexcmds.c:2210 commands/tablecmds.c:18210 -#: commands/tablecmds.c:18216 commands/typecmds.c:2311 +#: commands/indexcmds.c:2210 commands/tablecmds.c:18274 +#: commands/tablecmds.c:18280 commands/typecmds.c:2311 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "" @@ -10367,72 +10369,72 @@ msgid "there are multiple default operator classes for data type %s" msgstr "" "для типа данных %s определено несколько классов операторов по умолчанию" -#: commands/indexcmds.c:2681 +#: commands/indexcmds.c:2715 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "нераспознанный параметр REINDEX: \"%s\"" -#: commands/indexcmds.c:2913 +#: commands/indexcmds.c:2947 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "" "в таблице \"%s\" нет индексов, которые можно переиндексировать неблокирующим " "способом" -#: commands/indexcmds.c:2927 +#: commands/indexcmds.c:2961 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "в таблице \"%s\" нет индексов для переиндексации" -#: commands/indexcmds.c:2974 commands/indexcmds.c:3485 -#: commands/indexcmds.c:3615 +#: commands/indexcmds.c:3008 commands/indexcmds.c:3519 +#: commands/indexcmds.c:3649 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "Переиндексировать системные каталоги неблокирующим способом нельзя" -#: commands/indexcmds.c:2998 +#: commands/indexcmds.c:3032 #, c-format msgid "can only reindex the currently open database" msgstr "переиндексировать можно только текущую базу данных" -#: commands/indexcmds.c:3090 +#: commands/indexcmds.c:3124 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "" "все системные каталоги пропускаются, так как их нельзя переиндексировать " "неблокирующим способом" -#: commands/indexcmds.c:3123 +#: commands/indexcmds.c:3157 #, c-format msgid "cannot move system relations, skipping all" msgstr "переместить системные отношения нельзя, все они пропускаются" -#: commands/indexcmds.c:3169 +#: commands/indexcmds.c:3203 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "при переиндексировании секционированной таблицы \"%s.%s\"" -#: commands/indexcmds.c:3172 +#: commands/indexcmds.c:3206 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "при перестроении секционированного индекса \"%s.%s\"" -#: commands/indexcmds.c:3365 commands/indexcmds.c:4241 +#: commands/indexcmds.c:3399 commands/indexcmds.c:4283 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "таблица \"%s.%s\" переиндексирована" -#: commands/indexcmds.c:3517 commands/indexcmds.c:3570 +#: commands/indexcmds.c:3551 commands/indexcmds.c:3604 #, c-format msgid "skipping reindex of invalid index \"%s.%s\"" msgstr "индекс \"%s.%s\" — нерабочий, переиндексация пропускается" -#: commands/indexcmds.c:3520 commands/indexcmds.c:3573 +#: commands/indexcmds.c:3554 commands/indexcmds.c:3607 #, c-format msgid "Use DROP INDEX or REINDEX INDEX." msgstr "Выполните DROP INDEX или REINDEX INDEX." -#: commands/indexcmds.c:3524 +#: commands/indexcmds.c:3558 #, c-format msgid "" "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" @@ -10440,24 +10442,24 @@ msgstr "" "перестроить индекс ограничения-исключения \"%s.%s\" неблокирующим способом " "нельзя, он пропускается" -#: commands/indexcmds.c:3680 +#: commands/indexcmds.c:3714 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "переиндексировать отношение такого типа неблокирующим способом нельзя" -#: commands/indexcmds.c:3698 +#: commands/indexcmds.c:3732 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "" "переместить отношение, не являющееся разделяемым, в табличное пространство " "\"%s\" нельзя" -#: commands/indexcmds.c:4222 commands/indexcmds.c:4234 +#: commands/indexcmds.c:4264 commands/indexcmds.c:4276 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "индекс \"%s.%s\" был перестроен" -#: commands/indexcmds.c:4224 commands/indexcmds.c:4243 +#: commands/indexcmds.c:4266 commands/indexcmds.c:4285 #, c-format msgid "%s." msgstr "%s." @@ -10474,7 +10476,7 @@ msgstr "" "CONCURRENTLY нельзя использовать, когда материализованное представление не " "наполнено" -#: commands/matview.c:212 gram.y:18918 +#: commands/matview.c:212 gram.y:18925 #, c-format msgid "%s and %s options cannot be used together" msgstr "параметры %s и %s исключают друг друга" @@ -10820,9 +10822,9 @@ 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 +#: commands/tablecmds.c:9670 commands/tablecmds.c:17836 +#: commands/tablecmds.c:17871 commands/trigger.c:317 commands/trigger.c:1333 +#: commands/trigger.c:1443 rewrite/rewriteDefine.c:268 #: rewrite/rewriteDefine.c:779 rewrite/rewriteRemove.c:74 #, c-format msgid "permission denied: \"%s\" is a system catalog" @@ -10876,7 +10878,7 @@ msgstr "" "HOLD" #: commands/portalcmds.c:189 commands/portalcmds.c:242 -#: executor/execCurrent.c:70 utils/adt/xml.c:2936 utils/adt/xml.c:3106 +#: executor/execCurrent.c:70 utils/adt/xml.c:2938 utils/adt/xml.c:3108 #, c-format msgid "cursor \"%s\" does not exist" msgstr "курсор \"%s\" не существует" @@ -11325,8 +11327,8 @@ msgstr "" msgid "cannot change ownership of identity sequence" msgstr "сменить владельца последовательности идентификации нельзя" -#: commands/sequence.c:1671 commands/tablecmds.c:14486 -#: commands/tablecmds.c:17181 +#: commands/sequence.c:1671 commands/tablecmds.c:14550 +#: commands/tablecmds.c:17245 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "Последовательность \"%s\" связана с таблицей \"%s\"." @@ -11408,12 +11410,12 @@ msgstr "повторяющееся имя столбца в определени msgid "duplicate expression in statistics definition" msgstr "повторяющееся выражение в определении статистики" -#: commands/statscmds.c:628 commands/tablecmds.c:8620 +#: commands/statscmds.c:628 commands/tablecmds.c:8653 #, c-format msgid "statistics target %d is too low" msgstr "ориентир статистики слишком мал (%d)" -#: commands/statscmds.c:636 commands/tablecmds.c:8628 +#: commands/statscmds.c:636 commands/tablecmds.c:8661 #, c-format msgid "lowering statistics target to %d" msgstr "ориентир статистики снижается до %d" @@ -11476,8 +11478,8 @@ 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 +#: commands/subscriptioncmds.c:1524 replication/logical/tablesync.c:1371 +#: replication/logical/worker.c:4524 #, c-format msgid "could not connect to the publisher: %s" msgstr "не удалось подключиться к серверу публикации: %s" @@ -11615,13 +11617,13 @@ msgstr "слот репликации \"%s\" на сервере публика msgid "subscription with OID %u does not exist" msgstr "подписка с OID %u не существует" -#: commands/subscriptioncmds.c:2076 commands/subscriptioncmds.c:2201 +#: 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:2112 +#: commands/subscriptioncmds.c:2115 #, c-format msgid "" "subscription \"%s\" requested copy_data with origin = NONE but might copy " @@ -11630,7 +11632,7 @@ msgstr "" "для подписки \"%s\" выбран режим copy_data с origin = NONE, но в неё могут " "попасть данные из другого источника" -#: commands/subscriptioncmds.c:2114 +#: commands/subscriptioncmds.c:2117 #, c-format msgid "" "The subscription being created subscribes to a publication (%s) that " @@ -11648,7 +11650,7 @@ msgstr[2] "" "Создаваемая подписка связана с публикациями (%s), содержащими таблицы, в " "которые записывают другие подписки." -#: commands/subscriptioncmds.c:2117 +#: commands/subscriptioncmds.c:2120 #, c-format msgid "" "Verify that initial data copied from the publisher tables did not come from " @@ -11657,7 +11659,7 @@ msgstr "" "Убедитесь, что начальные данные, скопированные из таблиц публикации, " "поступили не из других источников." -#: commands/subscriptioncmds.c:2223 replication/logical/tablesync.c:906 +#: commands/subscriptioncmds.c:2226 replication/logical/tablesync.c:932 #: replication/pgoutput/pgoutput.c:1143 #, c-format msgid "" @@ -11667,7 +11669,7 @@ msgstr "" "использовать различные списки столбцов таблицы \"%s.%s\" в разных " "публикациях нельзя" -#: commands/subscriptioncmds.c:2273 +#: commands/subscriptioncmds.c:2276 #, c-format msgid "" "could not connect to publisher when attempting to drop replication slot " @@ -11677,7 +11679,7 @@ msgstr "" "\"%s\": %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:2276 +#: commands/subscriptioncmds.c:2279 #, c-format msgid "" "Use %s to disable the subscription, and then use %s to disassociate it from " @@ -11686,27 +11688,27 @@ msgstr "" "Выполните %s, чтобы отключить подписку, а затем выполните %s, чтобы отвязать " "её от слота." -#: commands/subscriptioncmds.c:2307 +#: commands/subscriptioncmds.c:2310 #, c-format msgid "publication name \"%s\" used more than once" msgstr "имя публикации \"%s\" используется неоднократно" -#: commands/subscriptioncmds.c:2351 +#: commands/subscriptioncmds.c:2354 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "публикация \"%s\" уже имеется в подписке \"%s\"" -#: commands/subscriptioncmds.c:2365 +#: commands/subscriptioncmds.c:2368 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "публикация \"%s\" отсутствует в подписке \"%s\"" -#: commands/subscriptioncmds.c:2376 +#: commands/subscriptioncmds.c:2379 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "удалить все публикации из подписки нельзя" -#: commands/subscriptioncmds.c:2433 +#: commands/subscriptioncmds.c:2436 #, c-format msgid "%s requires a Boolean value or \"parallel\"" msgstr "%s требует логическое значение или \"parallel\"" @@ -11769,7 +11771,7 @@ msgstr "" "Выполните DROP MATERIALIZED VIEW для удаления материализованного " "представления." -#: commands/tablecmds.c:279 commands/tablecmds.c:303 commands/tablecmds.c:19805 +#: commands/tablecmds.c:279 commands/tablecmds.c:303 commands/tablecmds.c:19877 #: parser/parse_utilcmd.c:2251 #, c-format msgid "index \"%s\" does not exist" @@ -11793,8 +11795,8 @@ msgstr "\"%s\" - это не тип" msgid "Use DROP TYPE to remove a type." msgstr "Выполните DROP TYPE для удаления типа." -#: commands/tablecmds.c:291 commands/tablecmds.c:14325 -#: commands/tablecmds.c:16886 +#: commands/tablecmds.c:291 commands/tablecmds.c:14389 +#: commands/tablecmds.c:16950 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "сторонняя таблица \"%s\" не существует" @@ -11820,7 +11822,7 @@ msgstr "" "в рамках операции с ограничениями по безопасности нельзя создать временную " "таблицу" -#: commands/tablecmds.c:801 commands/tablecmds.c:15745 +#: commands/tablecmds.c:801 commands/tablecmds.c:15809 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "отношение \"%s\" наследуется неоднократно" @@ -11845,7 +11847,7 @@ msgstr "создать стороннюю секцию для секционир msgid "Table \"%s\" contains indexes that are unique." msgstr "Таблица \"%s\" содержит индексы, являющиеся уникальными." -#: commands/tablecmds.c:1338 commands/tablecmds.c:13341 +#: commands/tablecmds.c:1338 commands/tablecmds.c:13382 #, c-format msgid "too many array dimensions" msgstr "слишком много размерностей массива" @@ -11900,7 +11902,7 @@ msgstr "опустошить стороннюю таблицу \"%s\" нельз msgid "cannot truncate temporary tables of other sessions" msgstr "временные таблицы других сеансов нельзя опустошить" -#: commands/tablecmds.c:2606 commands/tablecmds.c:15642 +#: commands/tablecmds.c:2606 commands/tablecmds.c:15706 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "наследование от секционированной таблицы \"%s\" не допускается" @@ -11925,18 +11927,18 @@ msgstr "" "создать временное отношение в качестве секции постоянного отношения \"%s\" " "нельзя" -#: commands/tablecmds.c:2640 commands/tablecmds.c:15621 +#: commands/tablecmds.c:2640 commands/tablecmds.c:15685 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "временное отношение \"%s\" не может наследоваться" -#: commands/tablecmds.c:2650 commands/tablecmds.c:15629 +#: commands/tablecmds.c:2650 commands/tablecmds.c:15693 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "наследование от временного отношения другого сеанса невозможно" #: commands/tablecmds.c:2791 commands/tablecmds.c:2845 -#: commands/tablecmds.c:13024 parser/parse_utilcmd.c:1265 +#: 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 @@ -12265,12 +12267,12 @@ msgstr "добавить столбец в типизированную табл msgid "cannot add column to a partition" msgstr "добавить столбец в секцию нельзя" -#: commands/tablecmds.c:7072 commands/tablecmds.c:15860 +#: commands/tablecmds.c:7072 commands/tablecmds.c:15924 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "дочерняя таблица \"%s\" имеет другой тип для столбца \"%s\"" -#: commands/tablecmds.c:7078 commands/tablecmds.c:15866 +#: commands/tablecmds.c:7078 commands/tablecmds.c:15930 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "" @@ -12287,22 +12289,22 @@ msgid "cannot recursively add identity column to table that has child tables" msgstr "" "добавить столбец идентификации в таблицу, у которой есть дочерние, нельзя" -#: commands/tablecmds.c:7362 +#: commands/tablecmds.c:7395 #, c-format msgid "column must be added to child tables too" msgstr "столбец также должен быть добавлен к дочерним таблицам" -#: commands/tablecmds.c:7440 +#: commands/tablecmds.c:7473 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "столбец \"%s\" отношения \"%s\" уже существует, пропускается" -#: commands/tablecmds.c:7447 +#: commands/tablecmds.c:7480 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "столбец \"%s\" отношения \"%s\" уже существует" -#: commands/tablecmds.c:7513 commands/tablecmds.c:12652 +#: commands/tablecmds.c:7546 commands/tablecmds.c:12693 #, c-format msgid "" "cannot remove constraint from only the partitioned table when partitions " @@ -12311,73 +12313,73 @@ msgstr "" "удалить ограничение только из секционированной таблицы, когда существуют " "секции, нельзя" -#: 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 +#: 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: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 +#: 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:14412 commands/tablecmds.c:17039 #, c-format msgid "cannot alter system column \"%s\"" msgstr "системный столбец \"%s\" нельзя изменить" -#: commands/tablecmds.c:7556 commands/tablecmds.c:7902 +#: 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:7597 +#: commands/tablecmds.c:7630 #, c-format msgid "column \"%s\" is in a primary key" msgstr "столбец \"%s\" входит в первичный ключ" -#: commands/tablecmds.c:7602 +#: commands/tablecmds.c:7635 #, c-format msgid "column \"%s\" is in index used as replica identity" msgstr "столбец \"%s\" входит в индекс, используемый для идентификации реплики" -#: commands/tablecmds.c:7625 +#: commands/tablecmds.c:7658 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "столбец \"%s\" в родительской таблице помечен как NOT NULL" -#: commands/tablecmds.c:7825 commands/tablecmds.c:9533 +#: commands/tablecmds.c:7858 commands/tablecmds.c:9566 #, c-format msgid "constraint must be added to child tables too" msgstr "ограничение также должно быть добавлено к дочерним таблицам" -#: commands/tablecmds.c:7826 +#: 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:7911 +#: commands/tablecmds.c:7944 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "столбец \"%s\" отношения \"%s\" является генерируемым" -#: commands/tablecmds.c:8005 +#: commands/tablecmds.c:8038 #, c-format msgid "cannot add identity to a column of only the partitioned table" msgstr "" "сделать столбцом идентификации столбец одной лишь секционированной таблицы " "нельзя" -#: commands/tablecmds.c:8011 +#: commands/tablecmds.c:8044 #, c-format msgid "cannot add identity to a column of a partition" msgstr "сделать столбцом идентификации столбец одной секции нельзя" -#: commands/tablecmds.c:8039 +#: commands/tablecmds.c:8072 #, c-format msgid "" "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity " @@ -12386,74 +12388,74 @@ msgstr "" "столбец \"%s\" отношения \"%s\" должен быть объявлен как NOT NULL, чтобы его " "можно было сделать столбцом идентификации" -#: commands/tablecmds.c:8045 +#: commands/tablecmds.c:8078 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "столбец \"%s\" отношения \"%s\" уже является столбцом идентификации" -#: commands/tablecmds.c:8051 +#: commands/tablecmds.c:8084 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "столбец \"%s\" отношения \"%s\" уже имеет значение по умолчанию" -#: commands/tablecmds.c:8112 +#: commands/tablecmds.c:8145 #, c-format msgid "cannot change identity column of only the partitioned table" msgstr "" "изменить столбец идентификации для одной лишь секционированной таблицы нельзя" -#: commands/tablecmds.c:8118 +#: commands/tablecmds.c:8151 #, c-format msgid "cannot change identity column of a partition" msgstr "изменить столбец идентификации для одной секции нельзя" -#: commands/tablecmds.c:8163 commands/tablecmds.c:8259 +#: 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:8229 +#: commands/tablecmds.c:8262 #, c-format msgid "cannot drop identity from a column of only the partitioned table" msgstr "" "лишить свойства идентификации столбец одной лишь секционированной таблицы " "нельзя" -#: commands/tablecmds.c:8235 +#: commands/tablecmds.c:8268 #, c-format msgid "cannot drop identity from a column of a partition" msgstr "лишить свойства идентификации столбец одной секции нельзя" -#: commands/tablecmds.c:8264 +#: commands/tablecmds.c:8297 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "" "столбец \"%s\" отношения \"%s\" не является столбцом идентификации, " "пропускается" -#: commands/tablecmds.c:8358 +#: commands/tablecmds.c:8391 #, c-format msgid "column \"%s\" of relation \"%s\" is not a generated column" msgstr "столбец \"%s\" отношения \"%s\" не является генерируемым столбцом" -#: commands/tablecmds.c:8456 +#: 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:8478 +#: commands/tablecmds.c:8511 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "нельзя удалить генерирующее выражение из наследуемого столбца" -#: commands/tablecmds.c:8517 +#: commands/tablecmds.c:8550 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "" "столбец \"%s\" отношения \"%s\" не является сохранённым генерируемым столбцом" -#: commands/tablecmds.c:8522 +#: commands/tablecmds.c:8555 #, c-format msgid "" "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" @@ -12461,53 +12463,53 @@ msgstr "" "столбец \"%s\" отношения \"%s\" пропускается, так как не является " "сохранённым генерируемым столбцом" -#: commands/tablecmds.c:8600 +#: commands/tablecmds.c:8633 #, c-format msgid "cannot refer to non-index column by number" msgstr "по номеру можно ссылаться только на столбец в индексе" -#: commands/tablecmds.c:8652 +#: commands/tablecmds.c:8685 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "столбец с номером %d отношения \"%s\" не существует" -#: commands/tablecmds.c:8671 +#: commands/tablecmds.c:8704 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "изменить статистику включённого столбца \"%s\" индекса \"%s\" нельзя" -#: commands/tablecmds.c:8676 +#: commands/tablecmds.c:8709 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "" "изменить статистику столбца \"%s\" (не выражения) индекса \"%s\" нельзя" -#: commands/tablecmds.c:8678 +#: commands/tablecmds.c:8711 #, c-format msgid "Alter statistics on table column instead." msgstr "Вместо этого измените статистику для столбца в таблице." -#: commands/tablecmds.c:8924 +#: commands/tablecmds.c:8957 #, c-format msgid "cannot drop column from typed table" msgstr "нельзя удалить столбец в типизированной таблице" -#: commands/tablecmds.c:8987 +#: commands/tablecmds.c:9020 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "столбец \"%s\" в таблице\"%s\" не существует, пропускается" -#: commands/tablecmds.c:9000 +#: commands/tablecmds.c:9033 #, c-format msgid "cannot drop system column \"%s\"" msgstr "нельзя удалить системный столбец \"%s\"" -#: commands/tablecmds.c:9010 +#: commands/tablecmds.c:9043 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "нельзя удалить наследованный столбец \"%s\"" -#: commands/tablecmds.c:9023 +#: commands/tablecmds.c:9056 #, c-format msgid "" "cannot drop column \"%s\" because it is part of the partition key of " @@ -12516,7 +12518,7 @@ msgstr "" "удалить столбец \"%s\" нельзя, так как он входит в ключ разбиения отношения " "\"%s\"" -#: commands/tablecmds.c:9048 +#: commands/tablecmds.c:9081 #, c-format msgid "" "cannot drop column from only the partitioned table when partitions exist" @@ -12524,7 +12526,7 @@ msgstr "" "удалить столбец только из секционированной таблицы, когда существуют секции, " "нельзя" -#: commands/tablecmds.c:9253 +#: commands/tablecmds.c:9286 #, c-format msgid "" "ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned " @@ -12533,14 +12535,14 @@ msgstr "" "ALTER TABLE / ADD CONSTRAINT USING INDEX не поддерживается с " "секционированными таблицами" -#: commands/tablecmds.c:9278 +#: 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:9615 +#: commands/tablecmds.c:9648 #, c-format msgid "" "cannot use ONLY for foreign key on partitioned table \"%s\" referencing " @@ -12549,7 +12551,7 @@ msgstr "" "нельзя использовать ONLY для стороннего ключа в секционированной таблице " "\"%s\", ссылающегося на отношение \"%s\"" -#: commands/tablecmds.c:9621 +#: commands/tablecmds.c:9654 #, c-format msgid "" "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing " @@ -12558,25 +12560,25 @@ msgstr "" "нельзя добавить с характеристикой NOT VALID сторонний ключ в " "секционированной таблице \"%s\", ссылающийся на отношение \"%s\"" -#: commands/tablecmds.c:9624 +#: commands/tablecmds.c:9657 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "" "Эта функциональность с секционированными таблицами пока не поддерживается." -#: commands/tablecmds.c:9631 commands/tablecmds.c:10092 +#: commands/tablecmds.c:9664 commands/tablecmds.c:10146 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "указанный объект \"%s\" не является таблицей" -#: commands/tablecmds.c:9654 +#: commands/tablecmds.c:9687 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "" "ограничения в постоянных таблицах могут ссылаться только на постоянные " "таблицы" -#: commands/tablecmds.c:9661 +#: commands/tablecmds.c:9694 #, c-format msgid "" "constraints on unlogged tables may reference only permanent or unlogged " @@ -12585,13 +12587,13 @@ msgstr "" "ограничения в нежурналируемых таблицах могут ссылаться только на постоянные " "или нежурналируемые таблицы" -#: commands/tablecmds.c:9667 +#: commands/tablecmds.c:9700 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "" "ограничения во временных таблицах могут ссылаться только на временные таблицы" -#: commands/tablecmds.c:9671 +#: commands/tablecmds.c:9704 #, c-format msgid "" "constraints on temporary tables must involve temporary tables of this session" @@ -12599,7 +12601,7 @@ msgstr "" "ограничения во временных таблицах должны ссылаться только на временные " "таблицы текущего сеанса" -#: commands/tablecmds.c:9735 commands/tablecmds.c:9741 +#: commands/tablecmds.c:9769 commands/tablecmds.c:9775 #, c-format msgid "" "invalid %s action for foreign key constraint containing generated column" @@ -12607,22 +12609,22 @@ msgstr "" "некорректное действие %s для ограничения внешнего ключа, содержащего " "генерируемый столбец" -#: commands/tablecmds.c:9757 +#: commands/tablecmds.c:9791 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "число столбцов в источнике и назначении внешнего ключа не совпадает" -#: commands/tablecmds.c:9864 +#: commands/tablecmds.c:9898 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "ограничение внешнего ключа \"%s\" нельзя реализовать" -#: commands/tablecmds.c:9866 +#: 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:10035 +#: commands/tablecmds.c:10075 #, c-format msgid "" "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" @@ -12630,13 +12632,13 @@ msgstr "" "столбец \"%s\", фигурирующий в действии ON DELETE SET, должен входить во " "внешний ключ" -#: commands/tablecmds.c:10392 commands/tablecmds.c:10832 +#: 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:10815 +#: commands/tablecmds.c:10856 #, c-format msgid "" "cannot attach table \"%s\" as a partition because it is referenced by " @@ -12645,34 +12647,34 @@ msgstr "" "присоединить таблицу \"%s\" в качестве секции нельзя, так как на неё " "ссылается внешний ключ \"%s\"" -#: commands/tablecmds.c:11416 commands/tablecmds.c:11697 -#: commands/tablecmds.c:12609 commands/tablecmds.c:12683 +#: 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:11423 +#: commands/tablecmds.c:11464 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "ограничение \"%s\" в таблице \"%s\" не является внешним ключом" -#: commands/tablecmds.c:11461 +#: commands/tablecmds.c:11502 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "изменить ограничение \"%s\" таблицы \"%s\" нельзя" -#: commands/tablecmds.c:11464 +#: commands/tablecmds.c:11505 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "" "Ограничение \"%s\" является производным от ограничения \"%s\" таблицы \"%s\"." -#: commands/tablecmds.c:11466 +#: commands/tablecmds.c:11507 #, c-format msgid "You may alter the constraint it derives from instead." msgstr "Вместо этого вы можете изменить родительское ограничение." -#: commands/tablecmds.c:11705 +#: commands/tablecmds.c:11746 #, c-format msgid "" "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" @@ -12680,51 +12682,51 @@ msgstr "" "ограничение \"%s\" в таблице \"%s\" не является внешним ключом или " "ограничением-проверкой" -#: commands/tablecmds.c:11782 +#: commands/tablecmds.c:11823 #, c-format msgid "constraint must be validated on child tables too" msgstr "ограничение также должно соблюдаться в дочерних таблицах" -#: commands/tablecmds.c:11869 +#: commands/tablecmds.c:11910 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "столбец \"%s\", указанный в ограничении внешнего ключа, не существует" -#: commands/tablecmds.c:11875 +#: commands/tablecmds.c:11916 #, c-format msgid "system columns cannot be used in foreign keys" msgstr "системные столбцы нельзя использовать во внешних ключах" -#: commands/tablecmds.c:11879 +#: commands/tablecmds.c:11920 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "во внешнем ключе не может быть больше %d столбцов" -#: commands/tablecmds.c:11944 +#: commands/tablecmds.c:11985 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "" "использовать откладываемый первичный ключ в целевой внешней таблице \"%s\" " "нельзя" -#: commands/tablecmds.c:11961 +#: commands/tablecmds.c:12002 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "в целевой внешней таблице \"%s\" нет первичного ключа" -#: commands/tablecmds.c:12029 +#: commands/tablecmds.c:12070 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "в списке столбцов внешнего ключа не должно быть повторений" -#: commands/tablecmds.c:12121 +#: commands/tablecmds.c:12162 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "" "использовать откладываемое ограничение уникальности в целевой внешней " "таблице \"%s\" нельзя" -#: commands/tablecmds.c:12126 +#: commands/tablecmds.c:12167 #, c-format msgid "" "there is no unique constraint matching given keys for referenced table \"%s\"" @@ -12732,39 +12734,39 @@ msgstr "" "в целевой внешней таблице \"%s\" нет ограничения уникальности, " "соответствующего данным ключам" -#: commands/tablecmds.c:12565 +#: commands/tablecmds.c:12606 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "удалить наследованное ограничение \"%s\" таблицы \"%s\" нельзя" -#: commands/tablecmds.c:12615 +#: commands/tablecmds.c:12656 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "ограничение \"%s\" в таблице \"%s\" не существует, пропускается" -#: commands/tablecmds.c:12790 +#: commands/tablecmds.c:12831 #, c-format msgid "cannot alter column type of typed table" msgstr "изменить тип столбца в типизированной таблице нельзя" -#: commands/tablecmds.c:12816 +#: commands/tablecmds.c:12857 #, 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 +#: commands/tablecmds.c:12858 commands/tablecmds.c:18092 +#: commands/tablecmds.c:18182 commands/trigger.c:657 #: rewrite/rewriteHandler.c:941 rewrite/rewriteHandler.c:976 #, c-format msgid "Column \"%s\" is a generated column." msgstr "Столбец \"%s\" является генерируемым." -#: commands/tablecmds.c:12827 +#: commands/tablecmds.c:12868 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "изменить наследованный столбец \"%s\" нельзя" -#: commands/tablecmds.c:12836 +#: commands/tablecmds.c:12877 #, c-format msgid "" "cannot alter column \"%s\" because it is part of the partition key of " @@ -12773,7 +12775,7 @@ msgstr "" "изменить столбец \"%s\" нельзя, так как он входит в ключ разбиения отношения " "\"%s\"" -#: commands/tablecmds.c:12886 +#: commands/tablecmds.c:12927 #, c-format msgid "" "result of USING clause for column \"%s\" cannot be cast automatically to " @@ -12781,45 +12783,45 @@ msgid "" msgstr "" "результат USING для столбца \"%s\" нельзя автоматически привести к типу %s" -#: commands/tablecmds.c:12889 +#: commands/tablecmds.c:12930 #, c-format msgid "You might need to add an explicit cast." msgstr "Возможно, необходимо добавить явное приведение." -#: commands/tablecmds.c:12893 +#: 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:12897 +#: commands/tablecmds.c:12938 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Возможно, необходимо указать \"USING %s::%s\"." -#: commands/tablecmds.c:12996 +#: commands/tablecmds.c:13037 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "изменить наследованный столбец \"%s\" отношения \"%s\" нельзя" -#: commands/tablecmds.c:13025 +#: commands/tablecmds.c:13066 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "Выражение USING ссылается на тип всей строки таблицы." -#: commands/tablecmds.c:13036 +#: commands/tablecmds.c:13077 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "" "тип наследованного столбца \"%s\" должен быть изменён и в дочерних таблицах" -#: commands/tablecmds.c:13161 +#: commands/tablecmds.c:13202 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "нельзя изменить тип столбца \"%s\" дважды" -#: commands/tablecmds.c:13199 +#: commands/tablecmds.c:13240 #, c-format msgid "" "generation expression for column \"%s\" cannot be cast automatically to type " @@ -12828,160 +12830,160 @@ msgstr "" "генерирующее выражение для столбца \"%s\" нельзя автоматически привести к " "типу %s" -#: commands/tablecmds.c:13204 +#: commands/tablecmds.c:13245 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "" "значение по умолчанию для столбца \"%s\" нельзя автоматически привести к " "типу %s" -#: commands/tablecmds.c:13508 +#: commands/tablecmds.c:13549 #, c-format msgid "cannot alter type of a column used by a function or procedure" msgstr "изменить тип столбца, задействованного в функции или процедуре, нельзя" -#: commands/tablecmds.c:13509 commands/tablecmds.c:13524 -#: commands/tablecmds.c:13544 commands/tablecmds.c:13563 -#: commands/tablecmds.c:13622 +#: 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:13523 +#: commands/tablecmds.c:13564 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "" "изменить тип столбца, задействованного в представлении или правиле, нельзя" -#: commands/tablecmds.c:13543 +#: commands/tablecmds.c:13584 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "изменить тип столбца, задействованного в определении триггера, нельзя" -#: commands/tablecmds.c:13562 +#: commands/tablecmds.c:13603 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "изменить тип столбца, задействованного в определении политики, нельзя" -#: commands/tablecmds.c:13593 +#: commands/tablecmds.c:13634 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "изменить тип столбца, задействованного в генерируемом столбце, нельзя" -#: commands/tablecmds.c:13594 +#: commands/tablecmds.c:13635 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "Столбец \"%s\" используется генерируемым столбцом \"%s\"." -#: commands/tablecmds.c:13621 +#: commands/tablecmds.c:13662 #, 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 +#: commands/tablecmds.c:14520 commands/tablecmds.c:14532 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "сменить владельца индекса \"%s\" нельзя" -#: commands/tablecmds.c:14458 commands/tablecmds.c:14470 +#: commands/tablecmds.c:14522 commands/tablecmds.c:14534 #, c-format msgid "Change the ownership of the index's table instead." msgstr "Однако возможно сменить владельца таблицы, содержащей этот индекс." -#: commands/tablecmds.c:14484 +#: commands/tablecmds.c:14548 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "сменить владельца последовательности \"%s\" нельзя" -#: commands/tablecmds.c:14509 +#: commands/tablecmds.c:14573 #, c-format msgid "cannot change owner of relation \"%s\"" msgstr "сменить владельца отношения \"%s\" нельзя" -#: commands/tablecmds.c:14976 +#: commands/tablecmds.c:15040 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "в одной инструкции не может быть несколько подкоманд SET TABLESPACE" -#: commands/tablecmds.c:15053 +#: commands/tablecmds.c:15117 #, c-format msgid "cannot set options for relation \"%s\"" msgstr "задать параметры отношения \"%s\" нельзя" -#: commands/tablecmds.c:15087 commands/view.c:440 +#: commands/tablecmds.c:15151 commands/view.c:440 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "" "WITH CHECK OPTION поддерживается только с автообновляемыми представлениями" -#: commands/tablecmds.c:15338 +#: commands/tablecmds.c:15402 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "" "в табличных пространствах есть только таблицы, индексы и материализованные " "представления" -#: commands/tablecmds.c:15350 +#: commands/tablecmds.c:15414 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "перемещать объекты в/из табличного пространства pg_global нельзя" -#: commands/tablecmds.c:15442 +#: commands/tablecmds.c:15506 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "" "обработка прерывается из-за невозможности заблокировать отношение \"%s.%s\"" -#: commands/tablecmds.c:15458 +#: commands/tablecmds.c:15522 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "в табличном пространстве \"%s\" не найдены подходящие отношения" -#: commands/tablecmds.c:15580 +#: commands/tablecmds.c:15644 #, c-format msgid "cannot change inheritance of typed table" msgstr "изменить наследование типизированной таблицы нельзя" -#: commands/tablecmds.c:15585 commands/tablecmds.c:16085 +#: commands/tablecmds.c:15649 commands/tablecmds.c:16149 #, c-format msgid "cannot change inheritance of a partition" msgstr "изменить наследование секции нельзя" -#: commands/tablecmds.c:15590 +#: commands/tablecmds.c:15654 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "изменить наследование секционированной таблицы нельзя" -#: commands/tablecmds.c:15636 +#: commands/tablecmds.c:15700 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "наследование для временного отношения другого сеанса невозможно" -#: commands/tablecmds.c:15649 +#: commands/tablecmds.c:15713 #, c-format msgid "cannot inherit from a partition" msgstr "наследование от секции невозможно" -#: commands/tablecmds.c:15671 commands/tablecmds.c:18529 +#: commands/tablecmds.c:15735 commands/tablecmds.c:18593 #, c-format msgid "circular inheritance not allowed" msgstr "циклическое наследование недопустимо" -#: commands/tablecmds.c:15672 commands/tablecmds.c:18530 +#: commands/tablecmds.c:15736 commands/tablecmds.c:18594 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\" уже является потомком \"%s\"." -#: commands/tablecmds.c:15685 +#: commands/tablecmds.c:15749 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "" "триггер \"%s\" не позволяет таблице \"%s\" стать потомком в иерархии " "наследования" -#: commands/tablecmds.c:15687 +#: commands/tablecmds.c:15751 #, c-format msgid "" "ROW triggers with transition tables are not supported in inheritance " @@ -12990,34 +12992,34 @@ msgstr "" "Триггеры ROW с переходными таблицами не поддерживаются в иерархиях " "наследования." -#: commands/tablecmds.c:15876 +#: commands/tablecmds.c:15940 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "столбец \"%s\" в дочерней таблице должен быть помечен как NOT NULL" -#: commands/tablecmds.c:15885 +#: commands/tablecmds.c:15949 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "столбец \"%s\" в дочерней таблице должен быть генерируемым" -#: commands/tablecmds.c:15889 +#: commands/tablecmds.c:15953 #, c-format msgid "column \"%s\" in child table must not be a generated column" msgstr "столбец \"%s\" в дочерней таблице должен быть не генерируемым" -#: commands/tablecmds.c:15927 +#: commands/tablecmds.c:15991 #, c-format msgid "child table is missing column \"%s\"" msgstr "в дочерней таблице не хватает столбца \"%s\"" -#: commands/tablecmds.c:16008 +#: commands/tablecmds.c:16072 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "" "дочерняя таблица \"%s\" содержит другое определение ограничения-проверки " "\"%s\"" -#: commands/tablecmds.c:16015 +#: commands/tablecmds.c:16079 #, c-format msgid "" "constraint \"%s\" conflicts with non-inherited constraint on child table " @@ -13026,7 +13028,7 @@ msgstr "" "ограничение \"%s\" конфликтует с ненаследуемым ограничением дочерней таблицы " "\"%s\"" -#: commands/tablecmds.c:16025 +#: commands/tablecmds.c:16089 #, c-format msgid "" "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" @@ -13034,82 +13036,82 @@ msgstr "" "ограничение \"%s\" конфликтует с непроверенным (NOT VALID) ограничением " "дочерней таблицы \"%s\"" -#: commands/tablecmds.c:16063 +#: commands/tablecmds.c:16127 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "в дочерней таблице не хватает ограничения \"%s\"" -#: commands/tablecmds.c:16149 +#: commands/tablecmds.c:16213 #, 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 +#: commands/tablecmds.c:16242 commands/tablecmds.c:16288 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "отношение \"%s\" не является секцией отношения \"%s\"" -#: commands/tablecmds.c:16230 +#: commands/tablecmds.c:16294 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "отношение \"%s\" не является предком отношения \"%s\"" -#: commands/tablecmds.c:16457 +#: commands/tablecmds.c:16521 #, c-format msgid "typed tables cannot inherit" msgstr "типизированные таблицы не могут наследоваться" -#: commands/tablecmds.c:16487 +#: commands/tablecmds.c:16551 #, c-format msgid "table is missing column \"%s\"" msgstr "в таблице не хватает столбца \"%s\"" -#: commands/tablecmds.c:16498 +#: commands/tablecmds.c:16562 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "таблица содержит столбец \"%s\", тогда как тип требует \"%s\"" -#: commands/tablecmds.c:16507 +#: commands/tablecmds.c:16571 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "таблица \"%s\" содержит столбец \"%s\" другого типа" -#: commands/tablecmds.c:16521 +#: commands/tablecmds.c:16585 #, c-format msgid "table has extra column \"%s\"" msgstr "таблица содержит лишний столбец \"%s\"" -#: commands/tablecmds.c:16573 +#: commands/tablecmds.c:16637 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\" - это не типизированная таблица" -#: commands/tablecmds.c:16747 +#: commands/tablecmds.c:16811 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "" "для идентификации реплики нельзя использовать неуникальный индекс \"%s\"" -#: commands/tablecmds.c:16753 +#: commands/tablecmds.c:16817 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "" "для идентификации реплики нельзя использовать не непосредственный индекс " "\"%s\"" -#: commands/tablecmds.c:16759 +#: commands/tablecmds.c:16823 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "" "для идентификации реплики нельзя использовать индекс с выражением \"%s\"" -#: commands/tablecmds.c:16765 +#: commands/tablecmds.c:16829 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "для идентификации реплики нельзя использовать частичный индекс \"%s\"" -#: commands/tablecmds.c:16782 +#: commands/tablecmds.c:16846 #, c-format msgid "" "index \"%s\" cannot be used as replica identity because column %d is a " @@ -13118,7 +13120,7 @@ msgstr "" "индекс \"%s\" нельзя использовать для идентификации реплики, так как столбец " "%d - системный" -#: commands/tablecmds.c:16789 +#: commands/tablecmds.c:16853 #, c-format msgid "" "index \"%s\" cannot be used as replica identity because column \"%s\" is " @@ -13127,13 +13129,13 @@ msgstr "" "индекс \"%s\" нельзя использовать для идентификации реплики, так как столбец " "\"%s\" допускает NULL" -#: commands/tablecmds.c:17041 +#: commands/tablecmds.c:17105 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "" "изменить состояние журналирования таблицы %s нельзя, так как она временная" -#: commands/tablecmds.c:17065 +#: commands/tablecmds.c:17129 #, c-format msgid "" "cannot change table \"%s\" to unlogged because it is part of a publication" @@ -13141,12 +13143,12 @@ msgstr "" "таблицу \"%s\" нельзя сделать нежурналируемой, так как она включена в " "публикацию" -#: commands/tablecmds.c:17067 +#: commands/tablecmds.c:17131 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Нежурналируемые отношения не поддерживают репликацию." -#: commands/tablecmds.c:17112 +#: commands/tablecmds.c:17176 #, c-format msgid "" "could not change table \"%s\" to logged because it references unlogged table " @@ -13155,7 +13157,7 @@ msgstr "" "не удалось сделать таблицу \"%s\" журналируемой, так как она ссылается на " "нежурналируемую таблицу \"%s\"" -#: commands/tablecmds.c:17122 +#: commands/tablecmds.c:17186 #, c-format msgid "" "could not change table \"%s\" to unlogged because it references logged table " @@ -13164,91 +13166,91 @@ msgstr "" "не удалось сделать таблицу \"%s\" нежурналируемой, так как она ссылается на " "журналируемую таблицу \"%s\"" -#: commands/tablecmds.c:17180 +#: commands/tablecmds.c:17244 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "переместить последовательность с владельцем в другую схему нельзя" -#: commands/tablecmds.c:17288 +#: commands/tablecmds.c:17352 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "отношение \"%s\" уже существует в схеме \"%s\"" -#: commands/tablecmds.c:17713 +#: commands/tablecmds.c:17777 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "\"%s\" - это не таблица и не материализованное представление" -#: commands/tablecmds.c:17866 +#: commands/tablecmds.c:17930 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\" - это не составной тип" -#: commands/tablecmds.c:17896 +#: commands/tablecmds.c:17960 #, c-format msgid "cannot change schema of index \"%s\"" msgstr "сменить схему индекса \"%s\" нельзя" -#: commands/tablecmds.c:17898 commands/tablecmds.c:17912 +#: commands/tablecmds.c:17962 commands/tablecmds.c:17976 #, c-format msgid "Change the schema of the table instead." msgstr "Однако возможно сменить владельца таблицы." -#: commands/tablecmds.c:17902 +#: commands/tablecmds.c:17966 #, c-format msgid "cannot change schema of composite type \"%s\"" msgstr "сменить схему составного типа \"%s\" нельзя" -#: commands/tablecmds.c:17910 +#: commands/tablecmds.c:17974 #, c-format msgid "cannot change schema of TOAST table \"%s\"" msgstr "сменить схему TOAST-таблицы \"%s\" нельзя" -#: commands/tablecmds.c:17942 +#: commands/tablecmds.c:18006 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "стратегия секционирования по списку не поддерживает несколько столбцов" -#: commands/tablecmds.c:18008 +#: commands/tablecmds.c:18072 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "столбец \"%s\", упомянутый в ключе секционирования, не существует" -#: commands/tablecmds.c:18016 +#: commands/tablecmds.c:18080 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "системный столбец \"%s\" нельзя использовать в ключе секционирования" -#: commands/tablecmds.c:18027 commands/tablecmds.c:18117 +#: commands/tablecmds.c:18091 commands/tablecmds.c:18181 #, c-format msgid "cannot use generated column in partition key" msgstr "генерируемый столбец нельзя использовать в ключе секционирования" -#: commands/tablecmds.c:18100 +#: commands/tablecmds.c:18164 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "" "выражения ключей секционирования не могут содержать ссылки на системный " "столбец" -#: commands/tablecmds.c:18147 +#: commands/tablecmds.c:18211 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "" "функции в выражении ключа секционирования должны быть помечены как IMMUTABLE" -#: commands/tablecmds.c:18156 +#: commands/tablecmds.c:18220 #, c-format msgid "cannot use constant expression as partition key" msgstr "" "в качестве ключа секционирования нельзя использовать константное выражение" -#: commands/tablecmds.c:18177 +#: commands/tablecmds.c:18241 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "не удалось определить правило сортировки для выражения секционирования" -#: commands/tablecmds.c:18212 +#: commands/tablecmds.c:18276 #, c-format msgid "" "You must specify a hash operator class or define a default hash operator " @@ -13257,7 +13259,7 @@ msgstr "" "Вы должны указать класс операторов хеширования или определить класс " "операторов хеширования по умолчанию для этого типа данных." -#: commands/tablecmds.c:18218 +#: commands/tablecmds.c:18282 #, c-format msgid "" "You must specify a btree operator class or define a default btree operator " @@ -13266,27 +13268,27 @@ msgstr "" "Вы должны указать класс операторов B-дерева или определить класс операторов " "B-дерева по умолчанию для этого типа данных." -#: commands/tablecmds.c:18469 +#: commands/tablecmds.c:18533 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\" уже является секцией" -#: commands/tablecmds.c:18475 +#: commands/tablecmds.c:18539 #, c-format msgid "cannot attach a typed table as partition" msgstr "подключить типизированную таблицу в качестве секции нельзя" -#: commands/tablecmds.c:18491 +#: commands/tablecmds.c:18555 #, c-format msgid "cannot attach inheritance child as partition" msgstr "подключить потомок в иерархии наследования в качестве секции нельзя" -#: commands/tablecmds.c:18505 +#: commands/tablecmds.c:18569 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "подключить родитель в иерархии наследования в качестве секции нельзя" -#: commands/tablecmds.c:18539 +#: commands/tablecmds.c:18603 #, c-format msgid "" "cannot attach a temporary relation as partition of permanent relation \"%s\"" @@ -13294,7 +13296,7 @@ msgstr "" "подключить временное отношение в качестве секции постоянного отношения " "\"%s\" нельзя" -#: commands/tablecmds.c:18547 +#: commands/tablecmds.c:18611 #, c-format msgid "" "cannot attach a permanent relation as partition of temporary relation \"%s\"" @@ -13302,102 +13304,102 @@ msgstr "" "подключить постоянное отношение в качестве секции временного отношения " "\"%s\" нельзя" -#: commands/tablecmds.c:18555 +#: commands/tablecmds.c:18619 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "подключить секцию к временному отношению в другом сеансе нельзя" -#: commands/tablecmds.c:18562 +#: commands/tablecmds.c:18626 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "" "подключить временное отношение из другого сеанса в качестве секции нельзя" -#: commands/tablecmds.c:18582 +#: commands/tablecmds.c:18646 #, c-format msgid "table \"%s\" being attached contains an identity column \"%s\"" msgstr "присоединяемая таблица \"%s\" содержит столбец идентификации \"%s\"" -#: commands/tablecmds.c:18584 +#: commands/tablecmds.c:18648 #, c-format msgid "The new partition may not contain an identity column." msgstr "Новая секция не может содержать столбец идентификации." -#: commands/tablecmds.c:18592 +#: commands/tablecmds.c:18656 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "" "таблица \"%s\" содержит столбец \"%s\", отсутствующий в родителе \"%s\"" -#: commands/tablecmds.c:18595 +#: commands/tablecmds.c:18659 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "" "Новая секция может содержать только столбцы, имеющиеся в родительской " "таблице." -#: commands/tablecmds.c:18607 +#: commands/tablecmds.c:18671 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "триггер \"%s\" не позволяет сделать таблицу \"%s\" секцией" -#: commands/tablecmds.c:18609 +#: commands/tablecmds.c:18673 #, c-format msgid "ROW triggers with transition tables are not supported on partitions." msgstr "Триггеры ROW с переходными таблицами для секций не поддерживаются." -#: commands/tablecmds.c:18785 +#: commands/tablecmds.c:18849 #, c-format msgid "" "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "" "нельзя присоединить стороннюю таблицу \"%s\" в качестве секции таблицы \"%s\"" -#: commands/tablecmds.c:18788 +#: commands/tablecmds.c:18852 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "Секционированная таблица \"%s\" содержит уникальные индексы." -#: commands/tablecmds.c:19110 +#: commands/tablecmds.c:19174 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "" "секции нельзя отсоединять в режиме CONCURRENTLY, когда существует секция по " "умолчанию" -#: commands/tablecmds.c:19219 +#: commands/tablecmds.c:19283 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "секционированная таблица \"%s\" была параллельно удалена" -#: commands/tablecmds.c:19225 +#: commands/tablecmds.c:19289 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "секция \"%s\" была параллельно удалена" -#: commands/tablecmds.c:19839 commands/tablecmds.c:19859 -#: commands/tablecmds.c:19880 commands/tablecmds.c:19899 -#: commands/tablecmds.c:19941 +#: commands/tablecmds.c:19911 commands/tablecmds.c:19931 +#: commands/tablecmds.c:19952 commands/tablecmds.c:19971 +#: commands/tablecmds.c:20013 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "нельзя присоединить индекс \"%s\" в качестве секции индекса \"%s\"" -#: commands/tablecmds.c:19842 +#: commands/tablecmds.c:19914 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "Индекс \"%s\" уже присоединён к другому индексу." -#: commands/tablecmds.c:19862 +#: commands/tablecmds.c:19934 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "Индекс \"%s\" не является индексом какой-либо секции таблицы \"%s\"." -#: commands/tablecmds.c:19883 +#: commands/tablecmds.c:19955 #, c-format msgid "The index definitions do not match." msgstr "Определения индексов не совпадают." -#: commands/tablecmds.c:19902 +#: commands/tablecmds.c:19974 #, c-format msgid "" "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint " @@ -13406,27 +13408,27 @@ msgstr "" "Индекс \"%s\" принадлежит ограничению в таблице \"%s\", но для индекса " "\"%s\" ограничения нет." -#: commands/tablecmds.c:19944 +#: commands/tablecmds.c:20016 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "К секции \"%s\" уже присоединён другой индекс." -#: commands/tablecmds.c:20180 +#: commands/tablecmds.c:20252 #, c-format msgid "column data type %s does not support compression" msgstr "тим данных столбца %s не поддерживает сжатие" -#: commands/tablecmds.c:20187 +#: commands/tablecmds.c:20259 #, c-format msgid "invalid compression method \"%s\"" msgstr "неверный метод сжатия \"%s\"" -#: commands/tablecmds.c:20213 +#: commands/tablecmds.c:20285 #, c-format msgid "invalid storage type \"%s\"" msgstr "неверный тип хранилища \"%s\"" -#: commands/tablecmds.c:20223 +#: commands/tablecmds.c:20295 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "тип данных столбца %s совместим только с хранилищем PLAIN" @@ -13556,22 +13558,22 @@ msgstr "удалить каталоги табличного пространс msgid "You can remove the directories manually if necessary." msgstr "При необходимости вы можете удалить их вручную." -#: commands/trigger.c:225 commands/trigger.c:236 +#: commands/trigger.c:226 commands/trigger.c:237 #, c-format msgid "\"%s\" is a table" msgstr "\"%s\" - это таблица" -#: commands/trigger.c:227 commands/trigger.c:238 +#: commands/trigger.c:228 commands/trigger.c:239 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "У таблиц не может быть триггеров INSTEAD OF." -#: commands/trigger.c:259 +#: commands/trigger.c:260 #, c-format msgid "\"%s\" is a partitioned table" msgstr "\"%s\" - секционированная таблица" -#: commands/trigger.c:261 +#: commands/trigger.c:262 #, c-format msgid "" "ROW triggers with transition tables are not supported on partitioned tables." @@ -13579,88 +13581,88 @@ msgstr "" "Триггеры ROW с переходными таблицами не поддерживаются в секционированных " "таблицах." -#: commands/trigger.c:273 commands/trigger.c:280 commands/trigger.c:444 +#: commands/trigger.c:274 commands/trigger.c:281 commands/trigger.c:445 #, c-format msgid "\"%s\" is a view" msgstr "\"%s\" - это представление" -#: commands/trigger.c:275 +#: commands/trigger.c:276 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." msgstr "У представлений не может быть строковых триггеров BEFORE/AFTER." -#: commands/trigger.c:282 +#: commands/trigger.c:283 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "У представлений не может быть триггеров TRUNCATE." -#: commands/trigger.c:290 commands/trigger.c:302 commands/trigger.c:437 +#: commands/trigger.c:291 commands/trigger.c:303 commands/trigger.c:438 #, c-format msgid "\"%s\" is a foreign table" msgstr "\"%s\" - сторонняя таблица" -#: commands/trigger.c:292 +#: commands/trigger.c:293 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "У сторонних таблиц не может быть триггеров INSTEAD OF." -#: commands/trigger.c:304 +#: commands/trigger.c:305 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "У сторонних таблиц не может быть ограничивающих триггеров." -#: commands/trigger.c:309 commands/trigger.c:1325 commands/trigger.c:1432 +#: commands/trigger.c:310 commands/trigger.c:1326 commands/trigger.c:1433 #, c-format msgid "relation \"%s\" cannot have triggers" msgstr "в отношении \"%s\" не может быть триггеров" -#: commands/trigger.c:380 +#: commands/trigger.c:381 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "триггеры TRUNCATE FOR EACH ROW не поддерживаются" -#: commands/trigger.c:388 +#: commands/trigger.c:389 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "триггеры INSTEAD OF должны иметь тип FOR EACH ROW" -#: commands/trigger.c:392 +#: commands/trigger.c:393 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "триггеры INSTEAD OF несовместимы с условиями WHEN" -#: commands/trigger.c:396 +#: commands/trigger.c:397 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "для триггеров INSTEAD OF нельзя задать список столбцов" -#: commands/trigger.c:425 +#: commands/trigger.c:426 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" msgstr "" "указание переменной типа кортеж в предложении REFERENCING не поддерживается" -#: commands/trigger.c:426 +#: commands/trigger.c:427 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." msgstr "Используйте OLD TABLE или NEW TABLE для именования переходных таблиц." -#: commands/trigger.c:439 +#: commands/trigger.c:440 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "Триггеры сторонних таблиц не могут использовать переходные таблицы." -#: commands/trigger.c:446 +#: commands/trigger.c:447 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "Триггеры представлений не могут использовать переходные таблицы." -#: commands/trigger.c:462 +#: commands/trigger.c:463 #, c-format msgid "ROW triggers with transition tables are not supported on partitions" msgstr "триггеры ROW с переходными таблицами для секций не поддерживаются" -#: commands/trigger.c:466 +#: commands/trigger.c:467 #, c-format msgid "" "ROW triggers with transition tables are not supported on inheritance children" @@ -13668,17 +13670,17 @@ msgstr "" "триггеры ROW с переходными таблицами для потомков в иерархии наследования не " "поддерживаются" -#: commands/trigger.c:472 +#: commands/trigger.c:473 #, c-format msgid "transition table name can only be specified for an AFTER trigger" msgstr "имя переходной таблицы можно задать только для триггера AFTER" -#: commands/trigger.c:477 +#: commands/trigger.c:478 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "триггеры TRUNCATE с переходными таблицами не поддерживаются" -#: commands/trigger.c:494 +#: commands/trigger.c:495 #, c-format msgid "" "transition tables cannot be specified for triggers with more than one event" @@ -13686,127 +13688,127 @@ msgstr "" "переходные таблицы нельзя задать для триггеров, назначаемых для нескольких " "событий" -#: commands/trigger.c:505 +#: commands/trigger.c:506 #, c-format msgid "transition tables cannot be specified for triggers with column lists" msgstr "переходные таблицы нельзя задать для триггеров со списками столбцов" -#: commands/trigger.c:522 +#: commands/trigger.c:523 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" msgstr "NEW TABLE можно задать только для триггеров INSERT или UPDATE" -#: commands/trigger.c:527 +#: commands/trigger.c:528 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE нельзя задать несколько раз" -#: commands/trigger.c:537 +#: commands/trigger.c:538 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" msgstr "OLD TABLE можно задать только для триггеров DELETE или UPDATE" -#: commands/trigger.c:542 +#: commands/trigger.c:543 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE нельзя задать несколько раз" -#: commands/trigger.c:552 +#: commands/trigger.c:553 #, 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 +#: commands/trigger.c:617 commands/trigger.c:630 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" msgstr "" "в условии WHEN для операторного триггера нельзя ссылаться на значения " "столбцов" -#: commands/trigger.c:621 +#: commands/trigger.c:622 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" msgstr "в условии WHEN для триггера INSERT нельзя ссылаться на значения OLD" -#: commands/trigger.c:634 +#: commands/trigger.c:635 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" msgstr "в условии WHEN для триггера DELETE нельзя ссылаться на значения NEW" -#: commands/trigger.c:639 +#: commands/trigger.c:640 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" msgstr "" "в условии WHEN для триггера BEFORE нельзя ссылаться на системные столбцы NEW" -#: commands/trigger.c:647 commands/trigger.c:655 +#: commands/trigger.c:648 commands/trigger.c:656 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" msgstr "" "в условии WHEN для триггера BEFORE нельзя ссылаться на генерируемые столбцы " "NEW" -#: commands/trigger.c:648 +#: commands/trigger.c:649 #, c-format msgid "A whole-row reference is used and the table contains generated columns." msgstr "" "Используется ссылка на всю строку таблицы, а таблица содержит генерируемые " "столбцы." -#: commands/trigger.c:763 commands/trigger.c:1607 +#: commands/trigger.c:764 commands/trigger.c:1608 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "триггер \"%s\" для отношения \"%s\" уже существует" -#: commands/trigger.c:776 +#: commands/trigger.c:777 #, c-format msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" msgstr "триггер \"%s\" для отношения \"%s\" является внутренним или дочерним" -#: commands/trigger.c:795 +#: commands/trigger.c:796 #, 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 +#: commands/trigger.c:1398 commands/trigger.c:1551 commands/trigger.c:1832 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "триггер \"%s\" для таблицы \"%s\" не существует" -#: commands/trigger.c:1522 +#: commands/trigger.c:1523 #, c-format msgid "cannot rename trigger \"%s\" on table \"%s\"" msgstr "переименовать триггер \"%s\" в таблице \"%s\" нельзя" -#: commands/trigger.c:1524 +#: commands/trigger.c:1525 #, c-format msgid "Rename the trigger on the partitioned table \"%s\" instead." msgstr "Однако можно переименовать триггер в секционированной таблице \"%s\"." -#: commands/trigger.c:1624 +#: commands/trigger.c:1625 #, c-format msgid "renamed trigger \"%s\" on relation \"%s\"" msgstr "триггер \"%s\" в отношении \"%s\" переименован" -#: commands/trigger.c:1770 +#: commands/trigger.c:1771 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "нет доступа: \"%s\" - это системный триггер" -#: commands/trigger.c:2379 +#: commands/trigger.c:2382 #, c-format msgid "trigger function %u returned null value" msgstr "триггерная функция %u вернула значение NULL" -#: commands/trigger.c:2439 commands/trigger.c:2657 commands/trigger.c:2910 -#: commands/trigger.c:3263 +#: commands/trigger.c:2442 commands/trigger.c:2669 commands/trigger.c:2959 +#: commands/trigger.c:3349 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "триггер BEFORE STATEMENT не может возвращать значение" -#: commands/trigger.c:2515 +#: commands/trigger.c:2518 #, c-format msgid "" "moving row to another partition during a BEFORE FOR EACH ROW trigger is not " @@ -13814,7 +13816,7 @@ msgid "" msgstr "" "в триггере BEFORE FOR EACH ROW нельзя перемещать строку в другую секцию" -#: commands/trigger.c:2516 +#: commands/trigger.c:2519 #, c-format msgid "" "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." @@ -13822,10 +13824,15 @@ msgstr "" "До выполнения триггера \"%s\" строка должна была находиться в секции \"%s." "%s\"." -#: 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 +#: commands/trigger.c:2548 commands/trigger.c:2827 commands/trigger.c:3190 +#, c-format +msgid "cannot collect transition tuples from child foreign tables" +msgstr "собрать переходные кортежи из дочерних сторонних таблиц нельзя" + +#: commands/trigger.c:3428 executor/nodeModifyTable.c:1563 +#: executor/nodeModifyTable.c:1637 executor/nodeModifyTable.c:2400 +#: executor/nodeModifyTable.c:2491 executor/nodeModifyTable.c:3155 +#: executor/nodeModifyTable.c:3325 #, c-format msgid "" "Consider using an AFTER trigger instead of a BEFORE trigger to propagate " @@ -13834,34 +13841,34 @@ msgstr "" "Возможно, для распространения изменений в другие строки следует использовать " "триггер AFTER вместо BEFORE." -#: 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 +#: commands/trigger.c:3470 executor/nodeLockRows.c:228 +#: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:335 +#: executor/nodeModifyTable.c:1579 executor/nodeModifyTable.c:2417 +#: executor/nodeModifyTable.c:2641 #, c-format msgid "could not serialize access due to concurrent update" msgstr "не удалось сериализовать доступ из-за параллельного изменения" -#: commands/trigger.c:3390 executor/nodeModifyTable.c:1647 -#: executor/nodeModifyTable.c:2485 executor/nodeModifyTable.c:2642 -#: executor/nodeModifyTable.c:3150 +#: commands/trigger.c:3478 executor/nodeModifyTable.c:1669 +#: executor/nodeModifyTable.c:2508 executor/nodeModifyTable.c:2665 +#: executor/nodeModifyTable.c:3173 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "не удалось сериализовать доступ из-за параллельного удаления" -#: commands/trigger.c:4599 +#: commands/trigger.c:4687 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" msgstr "" "в рамках операции с ограничениями по безопасности нельзя вызвать отложенный " "триггер" -#: commands/trigger.c:5780 +#: commands/trigger.c:5868 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "ограничение \"%s\" не является откладываемым" -#: commands/trigger.c:5803 +#: commands/trigger.c:5891 #, c-format msgid "constraint \"%s\" does not exist" msgstr "ограничение \"%s\" не существует" @@ -14372,7 +14379,7 @@ msgid "" msgstr "Создавать роли с атрибутом %s могут только роли с атрибутом %s." #: 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 +#: utils/adt/acl.c:5591 utils/adt/acl.c:5597 gram.y:17317 gram.y:17363 #, c-format msgid "role name \"%s\" is reserved" msgstr "имя роли \"%s\" зарезервировано" @@ -14481,8 +14488,8 @@ msgstr "использовать специальную роль в DROP ROLE н #: 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/acl.c:382 utils/adt/acl.c:402 utils/adt/acl.c:5446 +#: utils/adt/acl.c:5494 utils/adt/acl.c:5522 utils/adt/acl.c:5541 #: utils/adt/regproc.c:1571 utils/init/miscinit.c:799 #, c-format msgid "role \"%s\" does not exist" @@ -14699,127 +14706,127 @@ msgid "" msgstr "" "Только роли с правами роли \"%s\" могут отзывать права от имени этой роли." -#: commands/user.c:2491 utils/adt/acl.c:1324 +#: commands/user.c:2491 utils/adt/acl.c:1341 #, c-format msgid "dependent privileges exist" msgstr "существуют зависимые права" -#: commands/user.c:2492 utils/adt/acl.c:1325 +#: commands/user.c:2492 utils/adt/acl.c:1342 #, c-format msgid "Use CASCADE to revoke them too." msgstr "Используйте CASCADE, чтобы отозвать и их." -#: commands/vacuum.c:134 +#: commands/vacuum.c:135 #, c-format 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/vacuum.c:209 +#: commands/vacuum.c:210 #, c-format 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:219 +#: commands/vacuum.c:220 #, c-format msgid "unrecognized ANALYZE option \"%s\"" msgstr "нераспознанный параметр ANALYZE: \"%s\"" -#: commands/vacuum.c:259 +#: commands/vacuum.c:260 #, c-format msgid "parallel option requires a value between 0 and %d" msgstr "для параметра parallel требуется значение от 0 до %d" -#: commands/vacuum.c:271 +#: commands/vacuum.c:272 #, c-format msgid "parallel workers for vacuum must be between 0 and %d" msgstr "" "число параллельных исполнителей для выполнения очистки должно быть от 0 до %d" -#: commands/vacuum.c:292 +#: commands/vacuum.c:293 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "нераспознанный параметр VACUUM: \"%s\"" -#: commands/vacuum.c:318 +#: commands/vacuum.c:319 #, c-format msgid "VACUUM FULL cannot be performed in parallel" msgstr "VACUUM FULL нельзя выполнять в параллельном режиме" -#: commands/vacuum.c:329 +#: commands/vacuum.c:330 #, c-format msgid "BUFFER_USAGE_LIMIT cannot be specified for VACUUM FULL" msgstr "параметр BUFFER_USAGE_LIMIT нельзя задавать для VACUUM FULL" -#: commands/vacuum.c:343 +#: commands/vacuum.c:344 #, c-format msgid "ANALYZE option must be specified when a column list is provided" msgstr "если задаётся список столбцов, необходимо указать ANALYZE" -#: commands/vacuum.c:355 +#: commands/vacuum.c:356 #, c-format msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" msgstr "Параметр VACUUM DISABLE_PAGE_SKIPPING нельзя использовать с FULL" -#: commands/vacuum.c:362 +#: commands/vacuum.c:363 #, c-format msgid "PROCESS_TOAST required with VACUUM FULL" msgstr "VACUUM FULL работает только с PROCESS_TOAST" -#: commands/vacuum.c:371 +#: commands/vacuum.c:372 #, c-format msgid "ONLY_DATABASE_STATS cannot be specified with a list of tables" msgstr "ONLY_DATABASE_STATS нельзя задавать со списком таблиц" -#: commands/vacuum.c:380 +#: commands/vacuum.c:381 #, c-format msgid "ONLY_DATABASE_STATS cannot be specified with other VACUUM options" msgstr "ONLY_DATABASE_STATS нельзя задавать с другими параметрами VACUUM" -#: commands/vacuum.c:515 +#: commands/vacuum.c:516 #, c-format msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%s нельзя выполнить в ходе VACUUM или ANALYZE" -#: commands/vacuum.c:730 +#: commands/vacuum.c:741 #, c-format msgid "permission denied to vacuum \"%s\", skipping it" msgstr "нет доступа для очистки отношения \"%s\", оно пропускается" -#: commands/vacuum.c:743 +#: commands/vacuum.c:754 #, c-format msgid "permission denied to analyze \"%s\", skipping it" msgstr "нет доступа для анализа отношения \"%s\", оно пропускается" -#: commands/vacuum.c:821 commands/vacuum.c:918 +#: commands/vacuum.c:832 commands/vacuum.c:929 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "очистка \"%s\" пропускается --- блокировка недоступна" -#: commands/vacuum.c:826 +#: commands/vacuum.c:837 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "очистка \"%s\" пропускается --- это отношение более не существует" -#: commands/vacuum.c:842 commands/vacuum.c:923 +#: commands/vacuum.c:853 commands/vacuum.c:934 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "анализ \"%s\" пропускается --- блокировка недоступна" -#: commands/vacuum.c:847 +#: commands/vacuum.c:858 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "анализ \"%s\" пропускается --- это отношение более не существует" -#: commands/vacuum.c:1139 +#: commands/vacuum.c:1150 #, c-format msgid "cutoff for removing and freezing tuples is far in the past" msgstr "момент отсечки для удаления и замораживания кортежей далеко в прошлом" -#: commands/vacuum.c:1140 commands/vacuum.c:1145 +#: commands/vacuum.c:1151 commands/vacuum.c:1156 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -14831,42 +14838,42 @@ msgstr "" "Возможно, вам также придётся зафиксировать или откатить старые " "подготовленные транзакции и удалить неиспользуемые слоты репликации." -#: commands/vacuum.c:1144 +#: commands/vacuum.c:1155 #, c-format msgid "cutoff for freezing multixacts is far in the past" msgstr "момент отсечки для замораживания мультитранзакций далеко в прошлом" -#: commands/vacuum.c:1900 +#: commands/vacuum.c:1911 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "" "есть базы данных, которые не очищались на протяжении более чем 2 миллиардов " "транзакций" -#: commands/vacuum.c:1901 +#: commands/vacuum.c:1912 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "" "Возможно, вы уже потеряли данные в результате зацикливания ID транзакций." -#: commands/vacuum.c:2080 +#: commands/vacuum.c:2098 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "" "\"%s\" пропускается --- очищать не таблицы или специальные системные таблицы " "нельзя" -#: commands/vacuum.c:2512 +#: commands/vacuum.c:2545 #, c-format msgid "scanned index \"%s\" to remove %lld row versions" msgstr "просканирован индекс \"%s\", удалено версий строк: %lld" -#: commands/vacuum.c:2531 +#: commands/vacuum.c:2564 #, c-format msgid "index \"%s\" now contains %.0f row versions in %u pages" msgstr "индекс \"%s\" теперь содержит версий строк: %.0f, в страницах: %u" -#: commands/vacuum.c:2535 +#: commands/vacuum.c:2568 #, c-format msgid "" "%.0f index row versions were removed.\n" @@ -15167,27 +15174,27 @@ msgid "no value found for parameter %d" msgstr "не найдено значение параметра %d" #: 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 +#: executor/execExprInterp.c:4851 executor/execExprInterp.c:4868 +#: executor/execExprInterp.c:4967 executor/nodeModifyTable.c:204 +#: executor/nodeModifyTable.c:223 executor/nodeModifyTable.c:240 +#: executor/nodeModifyTable.c:250 executor/nodeModifyTable.c:260 #, c-format msgid "table row type and query-specified row type do not match" msgstr "тип строки таблицы отличается от типа строки-результата запроса" -#: executor/execExpr.c:643 executor/nodeModifyTable.c:204 +#: executor/execExpr.c:643 executor/nodeModifyTable.c:205 #, c-format msgid "Query has too many columns." msgstr "Запрос возвращает больше столбцов." -#: executor/execExpr.c:650 executor/nodeModifyTable.c:232 +#: executor/execExpr.c:650 executor/nodeModifyTable.c:224 #, 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 +#: executor/execExpr.c:656 executor/execExprInterp.c:4869 +#: executor/nodeModifyTable.c:251 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "" @@ -15282,7 +15289,7 @@ msgstr "" #: 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/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)" @@ -15304,7 +15311,7 @@ msgstr "" #: 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/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 @@ -15342,7 +15349,7 @@ msgstr "по заданному пути не найден элемент SQL/JS msgid "could not coerce %s expression (%s) to the RETURNING type" msgstr "привести выражение %s (%s) к типу RETURNING не удалось" -#: executor/execExprInterp.c:4853 +#: executor/execExprInterp.c:4852 #, c-format msgid "Table row contains %d attribute, but query expects %d." msgid_plural "Table row contains %d attributes, but query expects %d." @@ -15350,7 +15357,7 @@ msgstr[0] "Строка таблицы содержит %d атрибут, а в msgstr[1] "Строка таблицы содержит %d атрибута, а в запросе ожидается %d." msgstr[2] "Строка таблицы содержит %d атрибутов, а в запросе ожидается %d." -#: executor/execExprInterp.c:4969 executor/execSRF.c:977 +#: executor/execExprInterp.c:4968 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "" @@ -15466,7 +15473,7 @@ msgstr "блокировать строки в представлении \"%s\" msgid "cannot lock rows in materialized view \"%s\"" msgstr "блокировать строки в материализованном представлении \"%s\" нельзя" -#: executor/execMain.c:1177 executor/execMain.c:2687 +#: executor/execMain.c:1177 executor/execMain.c:2689 #: executor/nodeLockRows.c:135 #, c-format msgid "cannot lock rows in foreign table \"%s\"" @@ -15583,10 +15590,10 @@ msgstr "параллельное изменение; следует повтор msgid "concurrent delete, retrying" msgstr "параллельное удаление; следует повторная попытка" -#: executor/execReplication.c:352 parser/parse_cte.c:302 +#: 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:6426 +#: 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" @@ -15870,12 +15877,18 @@ msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "" "FULL JOIN поддерживается только с условиями, допускающими соединение слиянием" -#: executor/nodeModifyTable.c:240 +#: executor/nodeModifyTable.c:241 +#, c-format +msgid "Query provides a value for a generated column at ordinal position %d." +msgstr "" +"Запрос выдаёт значение для генерируемого столбца (с порядковым номером %d)." + +#: executor/nodeModifyTable.c:261 #, c-format msgid "Query has too few columns." msgstr "Запрос возвращает меньше столбцов." -#: executor/nodeModifyTable.c:1540 executor/nodeModifyTable.c:1614 +#: executor/nodeModifyTable.c:1562 executor/nodeModifyTable.c:1636 #, c-format msgid "" "tuple to be deleted was already modified by an operation triggered by the " @@ -15884,12 +15897,12 @@ msgstr "" "кортеж, который должен быть удалён, уже модифицирован в операции, вызванной " "текущей командой" -#: executor/nodeModifyTable.c:1769 +#: executor/nodeModifyTable.c:1791 #, c-format msgid "invalid ON UPDATE specification" msgstr "неверное указание ON UPDATE" -#: executor/nodeModifyTable.c:1770 +#: executor/nodeModifyTable.c:1792 #, c-format msgid "" "The result tuple would appear in a different partition than the original " @@ -15898,7 +15911,7 @@ msgstr "" "Результирующий кортеж окажется перемещённым из секции исходного кортежа в " "другую." -#: executor/nodeModifyTable.c:2226 +#: executor/nodeModifyTable.c:2249 #, c-format msgid "" "cannot move tuple across partitions when a non-root ancestor of the source " @@ -15907,26 +15920,26 @@ msgstr "" "нельзя переместить кортеж между секциями, когда внешний ключ непосредственно " "ссылается на предка исходной секции, который не является корнем иерархии" -#: executor/nodeModifyTable.c:2227 +#: executor/nodeModifyTable.c:2250 #, c-format msgid "" "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." msgstr "" "Внешний ключ ссылается на предка \"%s\", а не на корневого предка \"%s\"." -#: executor/nodeModifyTable.c:2230 +#: executor/nodeModifyTable.c:2253 #, 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 +#: executor/nodeModifyTable.c:2619 executor/nodeModifyTable.c:3161 +#: executor/nodeModifyTable.c:3331 #, c-format msgid "%s command cannot affect row a second time" msgstr "команда %s не может подействовать на строку дважды" -#: executor/nodeModifyTable.c:2598 +#: executor/nodeModifyTable.c:2621 #, c-format msgid "" "Ensure that no rows proposed for insertion within the same command have " @@ -15935,7 +15948,7 @@ msgstr "" "Проверьте, не содержат ли строки, которые должна добавить команда, " "дублирующиеся значения, подпадающие под ограничения." -#: executor/nodeModifyTable.c:3131 executor/nodeModifyTable.c:3301 +#: executor/nodeModifyTable.c:3154 executor/nodeModifyTable.c:3324 #, c-format msgid "" "tuple to be updated or deleted was already modified by an operation " @@ -15944,14 +15957,14 @@ msgstr "" "кортеж, который должен быть изменён или удалён, уже модифицирован в " "операции, вызванной текущей командой" -#: executor/nodeModifyTable.c:3140 executor/nodeModifyTable.c:3310 +#: executor/nodeModifyTable.c:3163 executor/nodeModifyTable.c:3333 #, c-format msgid "Ensure that not more than one source row matches any one target row." msgstr "" "Проверьте, не может ли какой-либо целевой строке соответствовать более одной " "исходной строки." -#: executor/nodeModifyTable.c:3209 +#: executor/nodeModifyTable.c:3232 #, c-format msgid "" "tuple to be merged was already moved to another partition due to concurrent " @@ -16120,7 +16133,7 @@ msgstr "не удалось передать кортеж в очередь в msgid "user mapping not found for user \"%s\", server \"%s\"" msgstr "сопоставление для пользователя \"%s\", сервера \"%s\" не найдено" -#: foreign/foreign.c:336 optimizer/plan/createplan.c:7153 +#: foreign/foreign.c:336 optimizer/plan/createplan.c:7155 #: optimizer/util/plancat.c:540 #, c-format msgid "access to non-system foreign table is restricted" @@ -16320,94 +16333,94 @@ msgstr "Некорректное подтверждение в последне msgid "Garbage found at the end of client-final-message." msgstr "Мусор в конце последнего сообщения клиента." -#: libpq/auth.c:269 +#: libpq/auth.c:277 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "" "пользователь \"%s\" не прошёл проверку подлинности: не разрешённый компьютер" -#: libpq/auth.c:272 +#: libpq/auth.c:280 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (\"trust\")" -#: libpq/auth.c:275 +#: libpq/auth.c:283 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (Ident)" -#: libpq/auth.c:278 +#: libpq/auth.c:286 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (Peer)" -#: libpq/auth.c:283 +#: libpq/auth.c:291 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (по паролю)" -#: libpq/auth.c:288 +#: libpq/auth.c:296 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (GSSAPI)" -#: libpq/auth.c:291 +#: libpq/auth.c:299 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (SSPI)" -#: libpq/auth.c:294 +#: libpq/auth.c:302 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (PAM)" -#: libpq/auth.c:297 +#: libpq/auth.c:305 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (BSD)" -#: libpq/auth.c:300 +#: libpq/auth.c:308 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (LDAP)" -#: libpq/auth.c:303 +#: libpq/auth.c:311 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (по сертификату)" -#: libpq/auth.c:306 +#: libpq/auth.c:314 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "пользователь \"%s\" не прошёл проверку подлинности (RADIUS)" -#: libpq/auth.c:309 +#: libpq/auth.c:317 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "" "пользователь \"%s\" не прошёл проверку подлинности: неверный метод проверки" -#: libpq/auth.c:313 +#: libpq/auth.c:321 #, c-format msgid "Connection matched file \"%s\" line %d: \"%s\"" msgstr "Подключение соответствует строке %2$d в \"%1$s\": \"%3$s\"" -#: libpq/auth.c:357 +#: libpq/auth.c:365 #, c-format msgid "authentication identifier set more than once" msgstr "аутентификационный идентификатор указан повторно" -#: libpq/auth.c:358 +#: libpq/auth.c:366 #, c-format msgid "previous identifier: \"%s\"; new identifier: \"%s\"" msgstr "предыдущий идентификатор: \"%s\"; новый: \"%s\"" -#: libpq/auth.c:368 +#: libpq/auth.c:376 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" msgstr "соединение аутентифицировано: идентификатор=\"%s\" метод=%s (%s:%d)" -#: libpq/auth.c:408 +#: libpq/auth.c:416 #, c-format msgid "" "client certificates can only be checked if a root certificate store is " @@ -16416,25 +16429,25 @@ msgstr "" "сертификаты клиентов могут проверяться, только если доступно хранилище " "корневых сертификатов" -#: libpq/auth.c:419 +#: libpq/auth.c:427 #, c-format msgid "connection requires a valid client certificate" msgstr "для подключения требуется годный сертификат клиента" -#: libpq/auth.c:450 libpq/auth.c:496 +#: libpq/auth.c:458 libpq/auth.c:504 msgid "GSS encryption" msgstr "Шифрование GSS" -#: libpq/auth.c:453 libpq/auth.c:499 +#: libpq/auth.c:461 libpq/auth.c:507 msgid "SSL encryption" msgstr "Шифрование SSL" -#: libpq/auth.c:455 libpq/auth.c:501 +#: libpq/auth.c:463 libpq/auth.c:509 msgid "no encryption" msgstr "без шифрования" #. translator: last %s describes encryption state -#: libpq/auth.c:461 +#: libpq/auth.c:469 #, c-format msgid "" "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" @@ -16443,7 +16456,7 @@ msgstr "" "пользователь \"%s\", \"%s\"" #. translator: last %s describes encryption state -#: libpq/auth.c:468 +#: libpq/auth.c:476 #, c-format msgid "" "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database " @@ -16452,38 +16465,38 @@ msgstr "" "pg_hba.conf отвергает подключение: компьютер \"%s\", пользователь \"%s\", " "база данных \"%s\", %s" -#: libpq/auth.c:506 +#: libpq/auth.c:514 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "" "IP-адрес клиента разрешается в \"%s\", соответствует прямому преобразованию." -#: libpq/auth.c:509 +#: libpq/auth.c:517 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "" "IP-адрес клиента разрешается в \"%s\", прямое преобразование не проверялось." -#: libpq/auth.c:512 +#: libpq/auth.c:520 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "" "IP-адрес клиента разрешается в \"%s\", это не соответствует прямому " "преобразованию." -#: libpq/auth.c:515 +#: libpq/auth.c:523 #, c-format msgid "Could not translate client host name \"%s\" to IP address: %s." msgstr "" "Преобразовать имя клиентского компьютера \"%s\" в IP-адрес не удалось: %s." -#: libpq/auth.c:520 +#: libpq/auth.c:528 #, 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 +#: libpq/auth.c:536 #, c-format msgid "" "no pg_hba.conf entry for replication connection from host \"%s\", user " @@ -16493,242 +16506,242 @@ msgstr "" "компьютера \"%s\" для пользователя \"%s\", %s" #. translator: last %s describes encryption state -#: libpq/auth.c:536 +#: libpq/auth.c:544 #, 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 +#: libpq/auth.c:664 #, c-format msgid "connection authenticated: user=\"%s\" method=%s (%s:%d)" msgstr "соединение аутентифицировано: пользователь=\"%s\" метод=%s (%s:%d)" -#: libpq/auth.c:725 +#: libpq/auth.c:733 #, c-format msgid "expected password response, got message type %d" msgstr "ожидался ответ с паролем, но получено сообщение %d" -#: libpq/auth.c:746 +#: libpq/auth.c:754 #, c-format msgid "invalid password packet size" msgstr "неверный размер пакета с паролем" -#: libpq/auth.c:764 +#: libpq/auth.c:772 #, c-format msgid "empty password returned by client" msgstr "клиент возвратил пустой пароль" -#: libpq/auth.c:892 +#: libpq/auth.c:900 #, c-format msgid "could not generate random MD5 salt" msgstr "не удалось сгенерировать случайную соль для MD5" -#: libpq/auth.c:943 libpq/be-secure-gssapi.c:540 +#: libpq/auth.c:951 libpq/be-secure-gssapi.c:550 #, c-format msgid "could not set environment: %m" msgstr "не удалось задать переменную окружения: %m" -#: libpq/auth.c:982 +#: libpq/auth.c:990 #, c-format msgid "expected GSS response, got message type %d" msgstr "ожидался ответ GSS, но получено сообщение %d" -#: libpq/auth.c:1048 +#: libpq/auth.c:1056 msgid "accepting GSS security context failed" msgstr "принять контекст безопасности GSS не удалось" -#: libpq/auth.c:1089 +#: libpq/auth.c:1097 msgid "retrieving GSS user name failed" msgstr "получить имя пользователя GSS не удалось" -#: libpq/auth.c:1235 +#: libpq/auth.c:1243 msgid "could not acquire SSPI credentials" msgstr "не удалось получить удостоверение SSPI" -#: libpq/auth.c:1260 +#: libpq/auth.c:1268 #, c-format msgid "expected SSPI response, got message type %d" msgstr "ожидался ответ SSPI, но получено сообщение %d" -#: libpq/auth.c:1338 +#: libpq/auth.c:1346 msgid "could not accept SSPI security context" msgstr "принять контекст безопасности SSPI не удалось" -#: libpq/auth.c:1379 +#: libpq/auth.c:1387 msgid "could not get token from SSPI security context" msgstr "не удалось получить маркер из контекста безопасности SSPI" -#: libpq/auth.c:1515 libpq/auth.c:1534 +#: libpq/auth.c:1523 libpq/auth.c:1542 #, c-format msgid "could not translate name" msgstr "не удалось преобразовать имя" -#: libpq/auth.c:1547 +#: libpq/auth.c:1555 #, c-format msgid "realm name too long" msgstr "имя области слишком длинное" -#: libpq/auth.c:1562 +#: libpq/auth.c:1570 #, c-format msgid "translated account name too long" msgstr "преобразованное имя учётной записи слишком длинное" -#: libpq/auth.c:1741 +#: libpq/auth.c:1749 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "не удалось создать сокет для подключения к серверу Ident: %m" -#: libpq/auth.c:1756 +#: libpq/auth.c:1764 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "не удалось привязаться к локальному адресу \"%s\": %m" -#: libpq/auth.c:1768 +#: libpq/auth.c:1776 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "не удалось подключиться к серверу Ident по адресу \"%s\", порт %s: %m" -#: libpq/auth.c:1790 +#: libpq/auth.c:1798 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "" "не удалось отправить запрос серверу Ident по адресу \"%s\", порт %s: %m" -#: libpq/auth.c:1807 +#: libpq/auth.c:1815 #, 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 +#: libpq/auth.c:1825 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "неверно форматированный ответ от сервера Ident: \"%s\"" -#: libpq/auth.c:1870 +#: libpq/auth.c:1878 #, c-format msgid "peer authentication is not supported on this platform" msgstr "проверка подлинности peer в этой ОС не поддерживается" -#: libpq/auth.c:1874 +#: libpq/auth.c:1882 #, c-format msgid "could not get peer credentials: %m" msgstr "не удалось получить данные пользователя через механизм peer: %m" -#: libpq/auth.c:1886 +#: libpq/auth.c:1894 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "найти локального пользователя по идентификатору (%ld) не удалось: %s" -#: libpq/auth.c:1988 +#: libpq/auth.c:1996 #, c-format msgid "error from underlying PAM layer: %s" msgstr "ошибка в нижележащем слое PAM: %s" -#: libpq/auth.c:1999 +#: libpq/auth.c:2007 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" msgstr "неподдерживаемое сообщение ответа PAM %d/\"%s\"" -#: libpq/auth.c:2056 +#: libpq/auth.c:2064 #, c-format msgid "could not create PAM authenticator: %s" msgstr "не удалось создать аутентификатор PAM: %s" -#: libpq/auth.c:2067 +#: libpq/auth.c:2075 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "ошибка в pam_set_item(PAM_USER): %s" -#: libpq/auth.c:2099 +#: libpq/auth.c:2107 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "ошибка в pam_set_item(PAM_RHOST): %s" -#: libpq/auth.c:2111 +#: libpq/auth.c:2119 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "ошибка в pam_set_item(PAM_CONV): %s" -#: libpq/auth.c:2124 +#: libpq/auth.c:2132 #, c-format msgid "pam_authenticate failed: %s" msgstr "ошибка в pam_authenticate: %s" -#: libpq/auth.c:2137 +#: libpq/auth.c:2145 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "ошибка в pam_acct_mgmt: %s" -#: libpq/auth.c:2148 +#: libpq/auth.c:2156 #, c-format msgid "could not release PAM authenticator: %s" msgstr "не удалось освободить аутентификатор PAM: %s" -#: libpq/auth.c:2228 +#: libpq/auth.c:2236 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "не удалось инициализировать LDAP (код ошибки: %d)" -#: libpq/auth.c:2265 +#: libpq/auth.c:2273 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "не удалось извлечь имя домена из ldapbasedn" -#: libpq/auth.c:2273 +#: libpq/auth.c:2281 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "для аутентификации LDAP не удалось найти записи DNS SRV для \"%s\"" -#: libpq/auth.c:2275 +#: libpq/auth.c:2283 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Задайте имя сервера LDAP явным образом." -#: libpq/auth.c:2327 +#: libpq/auth.c:2335 #, c-format msgid "could not initialize LDAP: %s" msgstr "не удалось инициализировать LDAP: %s" -#: libpq/auth.c:2337 +#: libpq/auth.c:2345 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "протокол ldaps с текущей библиотекой LDAP не поддерживается" -#: libpq/auth.c:2345 +#: libpq/auth.c:2353 #, c-format msgid "could not initialize LDAP: %m" msgstr "не удалось инициализировать LDAP: %m" -#: libpq/auth.c:2355 +#: libpq/auth.c:2363 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "не удалось задать версию протокола LDAP: %s" -#: libpq/auth.c:2371 +#: libpq/auth.c:2379 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "не удалось начать сеанс LDAP TLS: %s" -#: libpq/auth.c:2448 +#: libpq/auth.c:2456 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "LDAP-сервер не задан и значение ldapbasedn не определено" -#: libpq/auth.c:2455 +#: libpq/auth.c:2463 #, c-format msgid "LDAP server not specified" msgstr "LDAP-сервер не определён" -#: libpq/auth.c:2517 +#: libpq/auth.c:2525 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "недопустимый символ в имени пользователя для проверки подлинности LDAP" -#: libpq/auth.c:2534 +#: libpq/auth.c:2542 #, c-format msgid "" "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": " @@ -16737,28 +16750,28 @@ msgstr "" "не удалось выполнить начальную привязку LDAP для ldapbinddn \"%s\" на " "сервере \"%s\": %s" -#: libpq/auth.c:2564 +#: libpq/auth.c:2572 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "" "не удалось выполнить LDAP-поиск по фильтру \"%s\" на сервере \"%s\": %s" -#: libpq/auth.c:2580 +#: libpq/auth.c:2588 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "в LDAP нет пользователя \"%s\"" -#: libpq/auth.c:2581 +#: libpq/auth.c:2589 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "LDAP-поиск по фильтру \"%s\" на сервере \"%s\" не вернул результатов" -#: libpq/auth.c:2585 +#: libpq/auth.c:2593 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "пользователь LDAP \"%s\" не уникален" -#: libpq/auth.c:2586 +#: libpq/auth.c:2594 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned %d entry." msgid_plural "" @@ -16767,7 +16780,7 @@ msgstr[0] "LDAP-поиск по фильтру \"%s\" на сервере \"%s\" msgstr[1] "LDAP-поиск по фильтру \"%s\" на сервере \"%s\" вернул %d записи." msgstr[2] "LDAP-поиск по фильтру \"%s\" на сервере \"%s\" вернул %d записей." -#: libpq/auth.c:2606 +#: libpq/auth.c:2614 #, c-format msgid "" "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" @@ -16775,18 +16788,18 @@ msgstr "" "не удалось получить dn для первого результата, соответствующего \"%s\" на " "сервере \"%s\": %s" -#: libpq/auth.c:2633 +#: libpq/auth.c:2641 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "" "ошибка при регистрации в LDAP пользователя \"%s\" на сервере \"%s\": %s" -#: libpq/auth.c:2665 +#: libpq/auth.c:2673 #, c-format msgid "LDAP diagnostics: %s" msgstr "Диагностика LDAP: %s" -#: libpq/auth.c:2703 +#: libpq/auth.c:2711 #, c-format msgid "" "certificate authentication failed for user \"%s\": client certificate " @@ -16795,7 +16808,7 @@ msgstr "" "ошибка проверки подлинности пользователя \"%s\" по сертификату: сертификат " "клиента не содержит имя пользователя" -#: libpq/auth.c:2724 +#: libpq/auth.c:2732 #, c-format msgid "" "certificate authentication failed for user \"%s\": unable to retrieve " @@ -16804,7 +16817,7 @@ msgstr "" "пользователь \"%s\" не прошёл проверку подлинности по сертификату: не " "удалось получить DN субъекта" -#: libpq/auth.c:2747 +#: libpq/auth.c:2755 #, c-format msgid "" "certificate validation (clientcert=verify-full) failed for user \"%s\": DN " @@ -16813,7 +16826,7 @@ msgstr "" "проверка сертификата (clientcert=verify-full) для пользователя \"%s\" не " "прошла: отличается DN" -#: libpq/auth.c:2752 +#: libpq/auth.c:2760 #, c-format msgid "" "certificate validation (clientcert=verify-full) failed for user \"%s\": CN " @@ -16822,99 +16835,99 @@ msgstr "" "проверка сертификата (clientcert=verify-full) для пользователя \"%s\" не " "прошла: отличается CN" -#: libpq/auth.c:2854 +#: libpq/auth.c:2862 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS-сервер не определён" -#: libpq/auth.c:2861 +#: libpq/auth.c:2869 #, c-format msgid "RADIUS secret not specified" msgstr "секрет RADIUS не определён" # well-spelled: симв -#: libpq/auth.c:2875 +#: libpq/auth.c:2883 #, c-format msgid "" "RADIUS authentication does not support passwords longer than %d characters" msgstr "проверка подлинности RADIUS не поддерживает пароли длиннее %d симв." -#: libpq/auth.c:2977 libpq/hba.c:2352 +#: libpq/auth.c:2985 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 +#: libpq/auth.c:2999 #, c-format msgid "could not generate random encryption vector" msgstr "не удалось сгенерировать случайный вектор шифрования" -#: libpq/auth.c:3028 +#: libpq/auth.c:3036 #, c-format msgid "could not perform MD5 encryption of password: %s" msgstr "не удалось вычислить MD5-хеш пароля: %s" -#: libpq/auth.c:3055 +#: libpq/auth.c:3063 #, c-format msgid "could not create RADIUS socket: %m" msgstr "не удалось создать сокет RADIUS: %m" -#: libpq/auth.c:3071 +#: libpq/auth.c:3079 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "не удалось привязаться к локальному сокету RADIUS: %m" -#: libpq/auth.c:3081 +#: libpq/auth.c:3089 #, c-format msgid "could not send RADIUS packet: %m" msgstr "не удалось отправить пакет RADIUS: %m" -#: libpq/auth.c:3115 libpq/auth.c:3141 +#: libpq/auth.c:3123 libpq/auth.c:3149 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "превышено время ожидания ответа RADIUS от %s" -#: libpq/auth.c:3134 +#: libpq/auth.c:3142 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "не удалось проверить состояние сокета RADIUS: %m" -#: libpq/auth.c:3164 +#: libpq/auth.c:3172 #, c-format msgid "could not read RADIUS response: %m" msgstr "не удалось прочитать ответ RADIUS: %m" -#: libpq/auth.c:3172 +#: libpq/auth.c:3180 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "ответ RADIUS от %s был отправлен с неверного порта: %d" -#: libpq/auth.c:3180 +#: libpq/auth.c:3188 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "слишком короткий ответ RADIUS от %s: %d" -#: libpq/auth.c:3187 +#: libpq/auth.c:3195 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "в ответе RADIUS от %s испорчена длина: %d (фактическая длина %d)" -#: libpq/auth.c:3195 +#: libpq/auth.c:3203 #, 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 +#: libpq/auth.c:3228 #, c-format msgid "could not perform MD5 encryption of received packet: %s" msgstr "не удалось вычислить MD5-хеш для принятого пакета: %s" -#: libpq/auth.c:3230 +#: libpq/auth.c:3238 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "ответ RADIUS от %s содержит неверную подпись MD5" -#: libpq/auth.c:3248 +#: libpq/auth.c:3256 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "ответ RADIUS от %s содержит неверный код (%d) для пользователя \"%s\"" @@ -17017,44 +17030,39 @@ msgstr "" "он принадлежит пользователю сервера, либо u=rw,g=r (0640) или более строгие, " "если он принадлежит root." -#: libpq/be-secure-gssapi.c:201 +#: libpq/be-secure-gssapi.c:208 msgid "GSSAPI wrap error" msgstr "ошибка обёртывания сообщения в GSSAPI" -#: libpq/be-secure-gssapi.c:208 +#: libpq/be-secure-gssapi.c:215 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "исходящее сообщение GSSAPI не будет защищено" -#: libpq/be-secure-gssapi.c:215 libpq/be-secure-gssapi.c:634 +#: libpq/be-secure-gssapi.c:222 libpq/be-secure-gssapi.c:644 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "сервер попытался передать чрезмерно большой пакет GSSAPI (%zu > %zu)" -#: libpq/be-secure-gssapi.c:351 +#: libpq/be-secure-gssapi.c:358 libpq/be-secure-gssapi.c:585 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %zu)" msgstr "клиент передал чрезмерно большой пакет GSSAPI (%zu > %zu)" -#: libpq/be-secure-gssapi.c:389 +#: libpq/be-secure-gssapi.c:396 msgid "GSSAPI unwrap error" msgstr "ошибка развёртывания сообщения в GSSAPI" -#: libpq/be-secure-gssapi.c:396 +#: libpq/be-secure-gssapi.c:403 #, 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 +#: libpq/be-secure-gssapi.c:610 msgid "could not accept GSSAPI security context" msgstr "принять контекст безопасности GSSAPI не удалось" -#: libpq/be-secure-gssapi.c:701 +#: libpq/be-secure-gssapi.c:728 msgid "GSSAPI size check error" msgstr "ошибка проверки размера в GSSAPI" @@ -18236,14 +18244,14 @@ msgstr "расширенный тип узла \"%s\" уже существуе msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "методы расширенного узла \"%s\" не зарегистрированы" -#: nodes/makefuncs.c:152 statistics/extended_stats.c:2310 +#: 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: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 +#: 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" @@ -18259,7 +18267,7 @@ msgstr "портал \"%s\" с параметрами: %s" msgid "unnamed portal with parameters: %s" msgstr "неименованный портал с параметрами: %s" -#: optimizer/path/joinrels.c:972 +#: optimizer/path/joinrels.c:973 #, c-format msgid "" "FULL JOIN is only supported with merge-joinable or hash-joinable join " @@ -18268,7 +18276,7 @@ msgstr "" "FULL JOIN поддерживается только с условиями, допускающими соединение " "слиянием или хеш-соединение" -#: optimizer/plan/createplan.c:7175 parser/parse_merge.c:203 +#: optimizer/plan/createplan.c:7177 parser/parse_merge.c:203 #: rewrite/rewriteHandler.c:1680 #, c-format msgid "cannot execute MERGE on relation \"%s\"" @@ -18287,13 +18295,13 @@ msgstr "%s не может применяться к NULL-содержащей msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s несовместимо с UNION/INTERSECT/EXCEPT" -#: optimizer/plan/planner.c:2121 optimizer/plan/planner.c:4108 +#: 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:2122 optimizer/plan/planner.c:4109 -#: optimizer/plan/planner.c:4790 optimizer/prep/prepunion.c:1320 +#: 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 " @@ -18302,27 +18310,27 @@ msgstr "" "Одни типы данных поддерживают только хеширование, а другие - только " "сортировку." -#: optimizer/plan/planner.c:4789 +#: optimizer/plan/planner.c:4832 #, c-format msgid "could not implement DISTINCT" msgstr "не удалось реализовать DISTINCT" -#: optimizer/plan/planner.c:6134 +#: optimizer/plan/planner.c:6177 #, c-format msgid "could not implement window PARTITION BY" msgstr "не удалось реализовать PARTITION BY для окна" -#: optimizer/plan/planner.c:6135 +#: optimizer/plan/planner.c:6178 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Столбцы, разбивающие окна, должны иметь сортируемые типы данных." -#: optimizer/plan/planner.c:6139 +#: optimizer/plan/planner.c:6182 #, c-format msgid "could not implement window ORDER BY" msgstr "не удалось реализовать ORDER BY для окна" -#: optimizer/plan/planner.c:6140 +#: optimizer/plan/planner.c:6183 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Столбцы, сортирующие окна, должны иметь сортируемые типы данных." @@ -18838,7 +18846,7 @@ msgstr "" "вызовы агрегатных функций не могут включать вызовы функций, возвращающих " "множества" -#: parser/parse_agg.c:780 parser/parse_expr.c:1762 parser/parse_expr.c:2245 +#: parser/parse_agg.c:780 parser/parse_expr.c:1762 parser/parse_expr.c:2253 #: parser/parse_func.c:885 #, c-format msgid "" @@ -19299,8 +19307,8 @@ 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:3405 -#: parser/parse_expr.c:3634 parser/parse_target.c:998 +#: 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 нельзя" @@ -19537,17 +19545,17 @@ msgstr "рекурсивная ссылка на запрос \"%s\" не дол msgid "recursive reference to query \"%s\" must not appear within EXCEPT" msgstr "рекурсивная ссылка на запрос \"%s\" не должна фигурировать в EXCEPT" -#: parser/parse_cte.c:136 +#: parser/parse_cte.c:137 #, c-format msgid "WITH query name \"%s\" specified more than once" msgstr "имя запроса WITH \"%s\" указано неоднократно" -#: parser/parse_cte.c:308 +#: parser/parse_cte.c:309 #, c-format msgid "could not identify an inequality operator for type %s" msgstr "не удалось найти оператор неравенства для типа %s" -#: parser/parse_cte.c:335 +#: parser/parse_cte.c:336 #, c-format msgid "" "WITH clause containing a data-modifying statement must be at the top level" @@ -19555,7 +19563,7 @@ msgstr "" "предложение WITH, содержащее оператор, изменяющий данные, должно быть на " "верхнем уровне" -#: parser/parse_cte.c:384 +#: parser/parse_cte.c:385 #, c-format msgid "" "recursive query \"%s\" column %d has type %s in non-recursive term but type " @@ -19564,12 +19572,12 @@ msgstr "" "в рекурсивном запросе \"%s\" столбец %d имеет тип %s в нерекурсивной части, " "но в результате тип %s" -#: parser/parse_cte.c:390 +#: 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:395 +#: parser/parse_cte.c:396 #, c-format msgid "" "recursive query \"%s\" column %d has collation \"%s\" in non-recursive term " @@ -19578,43 +19586,43 @@ msgstr "" "в рекурсивном запросе \"%s\" у столбца %d правило сортировки \"%s\" в не " "рекурсивной части, но в результате правило \"%s\"" -#: parser/parse_cte.c:399 +#: 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:420 +#: parser/parse_cte.c:421 #, c-format msgid "WITH query is not recursive" msgstr "запрос WITH не рекурсивный" -#: parser/parse_cte.c:451 +#: 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:456 +#: 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:471 +#: parser/parse_cte.c:472 #, c-format msgid "search column \"%s\" not in WITH query column list" msgstr "столбец поиска \"%s\" отсутствует в списке столбцов запроса WITH" -#: parser/parse_cte.c:478 +#: parser/parse_cte.c:479 #, c-format msgid "search column \"%s\" specified more than once" msgstr "столбец поиска \"%s\" указан неоднократно" -#: parser/parse_cte.c:487 +#: parser/parse_cte.c:488 #, c-format msgid "" "search sequence column name \"%s\" already used in WITH query column list" @@ -19622,64 +19630,64 @@ msgstr "" "имя столбца последовательности поиска \"%s\" уже используется в списке " "столбцов запроса WITH" -#: parser/parse_cte.c:504 +#: parser/parse_cte.c:505 #, c-format msgid "cycle column \"%s\" not in WITH query column list" msgstr "столбец цикла \"%s\" отсутствует в списке столбцов запроса WITH" -#: parser/parse_cte.c:511 +#: parser/parse_cte.c:512 #, c-format msgid "cycle column \"%s\" specified more than once" msgstr "столбец цикла \"%s\" указан неоднократно" -#: parser/parse_cte.c:520 +#: 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:527 +#: 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:535 +#: 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:545 +#: 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:552 +#: 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:636 +#: 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:816 +#: parser/parse_cte.c:882 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "взаимная рекурсия между элементами WITH не реализована" -#: parser/parse_cte.c:868 +#: parser/parse_cte.c:934 #, c-format msgid "recursive query \"%s\" must not contain data-modifying statements" msgstr "" "рекурсивный запрос \"%s\" не должен содержать операторов, изменяющих данные" -#: parser/parse_cte.c:876 +#: parser/parse_cte.c:942 #, c-format msgid "" "recursive query \"%s\" does not have the form non-recursive-term UNION [ALL] " @@ -19688,27 +19696,27 @@ msgstr "" "рекурсивный запрос \"%s\" должен иметь форму {нерекурсивная часть} UNION " "[ALL] {рекурсивная часть}" -#: parser/parse_cte.c:911 +#: parser/parse_cte.c:977 #, c-format msgid "ORDER BY in a recursive query is not implemented" msgstr "ORDER BY в рекурсивном запросе не поддерживается" -#: parser/parse_cte.c:917 +#: parser/parse_cte.c:983 #, c-format msgid "OFFSET in a recursive query is not implemented" msgstr "OFFSET в рекурсивном запросе не поддерживается" -#: parser/parse_cte.c:923 +#: parser/parse_cte.c:989 #, c-format msgid "LIMIT in a recursive query is not implemented" msgstr "LIMIT в рекурсивном запросе не поддерживается" -#: parser/parse_cte.c:929 +#: 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:1008 +#: parser/parse_cte.c:1074 #, c-format msgid "recursive reference to query \"%s\" must not appear more than once" msgstr "рекурсивная ссылка на запрос \"%s\" указана неоднократно" @@ -19768,13 +19776,13 @@ msgid "there is no parameter $%d" msgstr "параметр $%d не существует" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1103 parser/parse_expr.c:3065 +#: parser/parse_expr.c:1103 parser/parse_expr.c:3073 #, c-format msgid "%s requires = operator to yield boolean" msgstr "для %s требуется, чтобы оператор = возвращал логическое значение" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1109 parser/parse_expr.c:3072 +#: parser/parse_expr.c:1109 parser/parse_expr.c:3080 #, c-format msgid "%s must not return a set" msgstr "%s не должна возвращать множество" @@ -19801,7 +19809,7 @@ msgstr "" "SELECT или выражение ROW()" #. 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 +#: 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" @@ -19858,7 +19866,7 @@ msgstr "в условии COPY FROM WHERE нельзя использовать msgid "cannot use subquery in column generation expression" msgstr "в выражении генерируемого столбца нельзя использовать подзапросы" -#: parser/parse_expr.c:1914 parser/parse_expr.c:3764 +#: parser/parse_expr.c:1914 parser/parse_expr.c:3772 #, c-format msgid "subquery must return only one column" msgstr "подзапрос должен вернуть только один столбец" @@ -19873,178 +19881,178 @@ msgstr "в подзапросе слишком много столбцов" msgid "subquery has too few columns" msgstr "в подзапросе недостаточно столбцов" -#: parser/parse_expr.c:2086 +#: parser/parse_expr.c:2094 #, c-format msgid "cannot determine type of empty array" msgstr "тип пустого массива определить нельзя" -#: parser/parse_expr.c:2087 +#: 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:2101 +#: parser/parse_expr.c:2109 #, c-format msgid "could not find element type for data type %s" msgstr "не удалось определить тип элемента для типа данных %s" -#: parser/parse_expr.c:2184 +#: parser/parse_expr.c:2192 #, c-format msgid "ROW expressions can have at most %d entries" msgstr "число элементов в выражениях ROW ограничено %d" -#: parser/parse_expr.c:2389 +#: parser/parse_expr.c:2397 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "вместо значения XML-атрибута без имени должен указываться столбец" -#: parser/parse_expr.c:2390 +#: parser/parse_expr.c:2398 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "вместо значения XML-элемента без имени должен указываться столбец" -#: parser/parse_expr.c:2405 +#: parser/parse_expr.c:2413 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "имя XML-атрибута \"%s\" указано неоднократно" -#: parser/parse_expr.c:2513 +#: parser/parse_expr.c:2521 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "привести результат XMLSERIALIZE к типу %s нельзя" -#: parser/parse_expr.c:2827 parser/parse_expr.c:3023 +#: 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:2837 +#: parser/parse_expr.c:2845 #, c-format msgid "cannot compare rows of zero length" msgstr "строки нулевой длины сравнивать нельзя" -#: parser/parse_expr.c:2862 +#: parser/parse_expr.c:2870 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "" "оператор сравнения строк должен выдавать результат логического типа, а не %s" -#: parser/parse_expr.c:2869 +#: parser/parse_expr.c:2877 #, c-format msgid "row comparison operator must not return a set" msgstr "оператор сравнения строк не должен возвращать множество" -#: parser/parse_expr.c:2928 parser/parse_expr.c:2969 +#: 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:2930 +#: parser/parse_expr.c:2938 #, c-format msgid "" "Row comparison operators must be associated with btree operator families." msgstr "" "Операторы сравнения строк должны быть связаны с семейством операторов btree." -#: parser/parse_expr.c:2971 +#: parser/parse_expr.c:2979 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "Оказалось несколько равноценных кандидатур." -#: parser/parse_expr.c:3306 +#: 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:3370 +#: 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:3371 +#: 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:3460 +#: parser/parse_expr.c:3468 #, c-format msgid "cannot use JSON format with non-string output types" msgstr "формат JSON можно использовать, только если возвращаемый тип строковый" -#: parser/parse_expr.c:3473 +#: parser/parse_expr.c:3481 #, c-format msgid "cannot set JSON encoding for non-bytea output types" msgstr "" "кодировку JSON можно использовать, только если возвращаемый тип — bytea" -#: parser/parse_expr.c:3478 +#: parser/parse_expr.c:3486 #, c-format msgid "unsupported JSON encoding" msgstr "неподдерживаемая кодировка JSON" -#: parser/parse_expr.c:3479 +#: parser/parse_expr.c:3487 #, c-format msgid "Only UTF8 JSON encoding is supported." msgstr "Для JSON поддерживается только кодировка UTF-8." -#: parser/parse_expr.c:3516 +#: 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:3521 +#: 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:3849 parser/parse_func.c:866 +#: 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:4072 +#: 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:4092 +#: parser/parse_expr.c:4100 #, c-format msgid "cannot use type %s in IS JSON predicate" msgstr "в предикате IS JSON нельзя использовать тип %s" -#: parser/parse_expr.c:4118 parser/parse_expr.c:4239 +#: 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:4120 +#: parser/parse_expr.c:4128 #, c-format msgid "Try returning json or jsonb." msgstr "Попробуйте возвратить тип json или jsonb." -#: parser/parse_expr.c:4168 +#: 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:4242 +#: parser/parse_expr.c:4250 #, c-format msgid "Try returning a string type or bytea." msgstr "Попробуйте возвратить строковый тип или bytea." -#: parser/parse_expr.c:4307 +#: parser/parse_expr.c:4315 #, c-format msgid "cannot specify FORMAT JSON in RETURNING clause of %s()" msgstr "FORMAT JSON не может указываться в предложении RETURNING %s()" -#: parser/parse_expr.c:4320 +#: parser/parse_expr.c:4328 #, c-format msgid "" "SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used" @@ -20052,8 +20060,8 @@ msgstr "" "когда используется WITH WRAPPER, поведение QUOTES в SQL/JSON задать нельзя" #. 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_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" @@ -20061,7 +20069,7 @@ 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 +#: parser/parse_expr.c:4345 parser/parse_expr.c:4374 #, c-format msgid "" "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is " @@ -20073,14 +20081,14 @@ msgstr "" #. 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 +#: 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:4347 parser/parse_expr.c:4376 +#: parser/parse_expr.c:4355 parser/parse_expr.c:4384 #, c-format msgid "" "Only ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, or DEFAULT expression is " @@ -20089,13 +20097,13 @@ msgstr "" "В %s для форматируемых столбцов допускается только ERROR, NULL, EMPTY ARRAY, " "EMPTY OBJECT или выражение DEFAULT." -#: parser/parse_expr.c:4395 +#: 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:4405 +#: parser/parse_expr.c:4413 #, c-format msgid "" "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for EXISTS columns." @@ -20104,13 +20112,13 @@ msgstr "" #. 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 +#: 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:4433 parser/parse_expr.c:4459 +#: 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." @@ -20118,12 +20126,12 @@ msgstr "" "В %s для скалярных столбцов допускается только ERROR, NULL или выражение " "DEFAULT." -#: parser/parse_expr.c:4489 +#: 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:4707 +#: parser/parse_expr.c:4715 #, c-format msgid "" "can only specify a constant, non-aggregate function, or operator expression " @@ -20132,22 +20140,22 @@ msgstr "" "в DEFAULT может задаваться только константа, вызов не агрегатной функции или " "выражение с оператором" -#: parser/parse_expr.c:4712 +#: parser/parse_expr.c:4720 #, c-format msgid "DEFAULT expression must not contain column references" msgstr "выражения в DEFAULT не могут содержать ссылки на столбцы" -#: parser/parse_expr.c:4717 +#: parser/parse_expr.c:4725 #, c-format msgid "DEFAULT expression must not return a set" msgstr "выражение в DEFAULT не может возвращать множество" -#: parser/parse_expr.c:4793 parser/parse_expr.c:4802 +#: 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:4796 +#: parser/parse_expr.c:4804 #, c-format msgid "You will need to explicitly cast the expression to type %s." msgstr "Приведите выражение к типу %s явно." @@ -21748,32 +21756,32 @@ msgid "autovacuum worker took too long to start; canceled" msgstr "процесс автоочистки запускался слишком долго; его запуск отменён" # skip-rule: capital-letter-first -#: postmaster/autovacuum.c:2203 +#: postmaster/autovacuum.c:2218 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "автоочистка: удаление устаревшей врем. таблицы \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2439 +#: postmaster/autovacuum.c:2461 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "автоматическая очистка таблицы \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2442 +#: postmaster/autovacuum.c:2464 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "автоматический анализ таблицы \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2636 +#: postmaster/autovacuum.c:2660 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "обработка рабочей записи для отношения \"%s.%s.%s\"" -#: postmaster/autovacuum.c:3254 +#: postmaster/autovacuum.c:3291 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "автоочистка не запущена из-за неправильной конфигурации" -#: postmaster/autovacuum.c:3255 +#: postmaster/autovacuum.c:3292 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Включите параметр \"track_counts\"." @@ -21857,12 +21865,12 @@ msgstr[1] "" msgstr[2] "" "Максимально возможное число фоновых процессов при текущих параметрах: %d." -#: postmaster/bgworker.c:931 postmaster/checkpointer.c:445 +#: postmaster/bgworker.c:931 postmaster/checkpointer.c:448 #, c-format msgid "Consider increasing the configuration parameter \"%s\"." msgstr "Возможно, стоит увеличить параметр \"%s\"." -#: postmaster/checkpointer.c:441 +#: postmaster/checkpointer.c:444 #, c-format msgid "checkpoints are occurring too frequently (%d second apart)" msgid_plural "checkpoints are occurring too frequently (%d seconds apart)" @@ -21870,12 +21878,12 @@ msgstr[0] "контрольные точки происходят слишком msgstr[1] "контрольные точки происходят слишком часто (через %d сек.)" msgstr[2] "контрольные точки происходят слишком часто (через %d сек.)" -#: postmaster/checkpointer.c:1067 +#: postmaster/checkpointer.c:1073 #, c-format msgid "checkpoint request failed" msgstr "сбой при запросе контрольной точки" -#: postmaster/checkpointer.c:1068 +#: postmaster/checkpointer.c:1074 #, c-format msgid "Consult recent messages in the server log for details." msgstr "Смотрите подробности в протоколе сервера." @@ -22748,7 +22756,7 @@ msgstr "" "применяющий процесс логической репликации будет сериализовывать остальное " "содержимое удалённой транзакции %u в файл" -#: replication/logical/decode.c:177 replication/logical/logical.c:141 +#: replication/logical/decode.c:177 replication/logical/logical.c:143 #, c-format msgid "" "logical decoding on standby requires \"wal_level\" >= \"logical\" on the " @@ -22757,19 +22765,19 @@ msgstr "" "для логического декодирования на ведомом сервере требуется \"wal_level\" >= " "\"logical\" на ведущем" -#: replication/logical/launcher.c:334 +#: replication/logical/launcher.c:347 #, c-format msgid "cannot start logical replication workers when max_replication_slots = 0" msgstr "" "нельзя запустить процессы-обработчики логической репликации при " "max_replication_slots = 0" -#: replication/logical/launcher.c:427 +#: replication/logical/launcher.c:440 #, c-format msgid "out of logical replication worker slots" msgstr "недостаточно слотов для процессов логической репликации" -#: replication/logical/launcher.c:428 replication/logical/launcher.c:514 +#: replication/logical/launcher.c:441 replication/logical/launcher.c:527 #: 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 @@ -22778,18 +22786,18 @@ msgstr "недостаточно слотов для процессов логи msgid "You might need to increase \"%s\"." msgstr "Возможно, следует увеличить параметр \"%s\"." -#: replication/logical/launcher.c:513 +#: replication/logical/launcher.c:526 #, c-format msgid "out of background worker slots" msgstr "недостаточно слотов для фоновых рабочих процессов" -#: replication/logical/launcher.c:720 +#: replication/logical/launcher.c:733 #, c-format msgid "logical replication worker slot %d is empty, cannot attach" msgstr "" "слот обработчика логической репликации %d пуст, подключиться к нему нельзя" -#: replication/logical/launcher.c:729 +#: replication/logical/launcher.c:742 #, c-format msgid "" "logical replication worker slot %d is already used by another worker, cannot " @@ -22798,28 +22806,28 @@ msgstr "" "слот обработчика логической репликации %d уже занят другим процессом, " "подключиться к нему нельзя" -#: replication/logical/logical.c:121 +#: replication/logical/logical.c:123 #, c-format msgid "logical decoding requires \"wal_level\" >= \"logical\"" msgstr "для логического декодирования требуется \"wal_level\" >= \"logical\"" -#: replication/logical/logical.c:126 +#: replication/logical/logical.c:128 #, c-format msgid "logical decoding requires a database connection" msgstr "для логического декодирования требуется подключение к БД" -#: replication/logical/logical.c:365 replication/logical/logical.c:519 +#: replication/logical/logical.c:367 replication/logical/logical.c:521 #, c-format msgid "cannot use physical replication slot for logical decoding" msgstr "" "физический слот репликации нельзя использовать для логического декодирования" -#: replication/logical/logical.c:370 replication/logical/logical.c:529 +#: replication/logical/logical.c:372 replication/logical/logical.c:531 #, c-format msgid "replication slot \"%s\" was not created in this database" msgstr "слот репликации \"%s\" создан не в этой базе данных" -#: replication/logical/logical.c:377 +#: replication/logical/logical.c:379 #, c-format msgid "" "cannot create logical replication slot in transaction that has performed " @@ -22827,29 +22835,29 @@ msgid "" msgstr "" "нельзя создать слот логической репликации в транзакции, осуществляющей запись" -#: replication/logical/logical.c:540 +#: replication/logical/logical.c:542 #, c-format msgid "cannot use replication slot \"%s\" for logical decoding" msgstr "" "слот репликации \"%s\" нельзя использовать для логического декодирования" -#: replication/logical/logical.c:542 replication/slot.c:798 +#: replication/logical/logical.c:544 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 +#: replication/logical/logical.c:545 #, c-format msgid "Specify another replication slot." msgstr "Укажите другой слот репликации." -#: replication/logical/logical.c:554 replication/logical/logical.c:561 +#: replication/logical/logical.c:556 replication/logical/logical.c:563 #, c-format msgid "can no longer get changes from replication slot \"%s\"" msgstr "из слота репликации \"%s\" больше нельзя получать изменения" -#: replication/logical/logical.c:556 +#: replication/logical/logical.c:558 #, c-format msgid "" "This slot has been invalidated because it exceeded the maximum reserved size." @@ -22857,48 +22865,48 @@ msgstr "" "Этот слот был аннулирован из-за превышения максимального зарезервированного " "размера." -#: replication/logical/logical.c:563 +#: replication/logical/logical.c:565 #, c-format msgid "" "This slot has been invalidated because it was conflicting with recovery." msgstr "Этот слот был аннулирован из-за конфликта с восстановлением." -#: replication/logical/logical.c:628 +#: replication/logical/logical.c:630 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "начинается логическое декодирование для слота \"%s\"" -#: replication/logical/logical.c:630 +#: replication/logical/logical.c:632 #, c-format msgid "Streaming transactions committing after %X/%X, reading WAL from %X/%X." msgstr "Передача транзакций, фиксируемых после %X/%X, чтение WAL с %X/%X." -#: replication/logical/logical.c:778 +#: replication/logical/logical.c:780 #, 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:784 +#: replication/logical/logical.c:786 #, c-format msgid "slot \"%s\", output plugin \"%s\", in the %s callback" msgstr "слот \"%s\", модуль вывода \"%s\", в обработчике %s" -#: replication/logical/logical.c:955 replication/logical/logical.c:1000 -#: replication/logical/logical.c:1045 replication/logical/logical.c:1091 +#: replication/logical/logical.c:957 replication/logical/logical.c:1002 +#: replication/logical/logical.c:1047 replication/logical/logical.c:1093 #, c-format 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 +#: replication/logical/logical.c:1325 replication/logical/logical.c:1374 +#: replication/logical/logical.c:1415 replication/logical/logical.c:1501 +#: replication/logical/logical.c:1550 #, c-format msgid "logical streaming requires a %s callback" msgstr "для логической потоковой репликации требуется обработчик %s" -#: replication/logical/logical.c:1458 +#: replication/logical/logical.c:1460 #, c-format msgid "logical streaming at prepare time requires a %s callback" msgstr "" @@ -23016,7 +23024,7 @@ msgstr "" "репликации с ID %d" #: replication/logical/origin.c:957 replication/logical/origin.c:1158 -#: replication/slot.c:2384 +#: replication/slot.c:2397 #, c-format msgid "Increase \"max_replication_slots\" and try again." msgstr "Увеличьте параметр \"max_replication_slots\" и повторите попытку." @@ -23087,19 +23095,19 @@ msgstr "" msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "целевое отношение логической репликации \"%s.%s\" не существует" -#: replication/logical/reorderbuffer.c:3999 +#: replication/logical/reorderbuffer.c:4129 #, c-format msgid "could not write to data file for XID %u: %m" msgstr "не удалось записать в файл данных для XID %u: %m" -#: replication/logical/reorderbuffer.c:4345 -#: replication/logical/reorderbuffer.c:4370 +#: replication/logical/reorderbuffer.c:4475 +#: replication/logical/reorderbuffer.c:4500 #, c-format msgid "could not read from reorderbuffer spill file: %m" msgstr "не удалось прочитать файл подкачки буфера пересортировки: %m" -#: replication/logical/reorderbuffer.c:4349 -#: replication/logical/reorderbuffer.c:4374 +#: replication/logical/reorderbuffer.c:4479 +#: replication/logical/reorderbuffer.c:4504 #, c-format msgid "" "could not read from reorderbuffer spill file: read %d instead of %u bytes" @@ -23107,52 +23115,46 @@ msgstr "" "не удалось прочитать файл подкачки буфера пересортировки (прочитано байт: " "%d, требовалось: %u)" -#: replication/logical/reorderbuffer.c:4624 +#: replication/logical/reorderbuffer.c:4754 #, 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:5120 +#: replication/logical/reorderbuffer.c:5250 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "не удалось прочитать файл \"%s\" (прочитано байт: %d, требовалось: %d)" -#: replication/logical/slotsync.c:215 +#: replication/logical/slotsync.c:215 replication/logical/slotsync.c:579 #, c-format -msgid "" -"could not synchronize replication slot \"%s\" because remote slot precedes " -"local slot" -msgstr "" -"синхронизировать слот репликации \"%s\" не удалось, так как состояние " -"удалённого слота предшествует локальному" +msgid "could not synchronize replication slot \"%s\"" +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." +"Synchronization could lead to data loss, because the remote slot needs WAL " +"at LSN %X/%X and catalog xmin %u, but the standby has LSN %X/%X and catalog " +"xmin %u." msgstr "" -"Для удалённого слота текущий LSN %X/%X и xmin каталога %u, тогда как для " -"локального — LSN %X/%X и xmin каталога %u." +"Синхронизация могла привести к потере данных, так как удалённый слот требует " +"WAL в позиции 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." +"Synchronization could lead to data loss, because the standby could not build " +"a consistent snapshot to decode WALs at LSN %X/%X." msgstr "" -"При логическом декодировании не удалось найти точку согласованности от LSN " -"локального слота %X/%X." +"Синхронизация могла привести к потере данных, так как резервный сервер не " +"смог получить согласованный снимок для декодирования WAL в позиции LSN %X/%X." #: replication/logical/slotsync.c:589 #, c-format @@ -23218,7 +23220,7 @@ msgid "" "replication slot synchronization requires \"%s\" to be specified in \"%s\"" msgstr "для синхронизации слотов репликации требуется указание \"%s\" в \"%s\"" -#: replication/logical/slotsync.c:1050 +#: replication/logical/slotsync.c:1048 #, c-format msgid "replication slot synchronization requires \"wal_level\" >= \"logical\"" msgstr "" @@ -23280,7 +23282,7 @@ msgstr "многопоточная синхронизация слотов ре msgid "slot sync worker started" msgstr "рабочий процесс синхронизации слотов запущен" -#: replication/logical/slotsync.c:1466 replication/slotfuncs.c:900 +#: replication/logical/slotsync.c:1466 replication/slotfuncs.c:926 #: replication/walreceiver.c:307 #, c-format msgid "could not connect to the primary server: %s" @@ -23304,63 +23306,63 @@ msgstr[1] "" msgstr[2] "" "экспортирован снимок логического декодирования: \"%s\" (ид. транзакций: %u)" -#: replication/logical/snapbuild.c:1404 replication/logical/snapbuild.c:1501 -#: replication/logical/snapbuild.c:2017 +#: replication/logical/snapbuild.c:1451 replication/logical/snapbuild.c:1548 +#: replication/logical/snapbuild.c:2064 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "процесс логического декодирования достиг точки согласованности в %X/%X" -#: replication/logical/snapbuild.c:1406 +#: replication/logical/snapbuild.c:1453 #, c-format msgid "There are no running transactions." msgstr "Больше активных транзакций нет." -#: replication/logical/snapbuild.c:1453 +#: replication/logical/snapbuild.c:1500 #, c-format msgid "logical decoding found initial starting point at %X/%X" msgstr "" "процесс логического декодирования нашёл начальную стартовую точку в %X/%X" -#: replication/logical/snapbuild.c:1455 replication/logical/snapbuild.c:1479 +#: replication/logical/snapbuild.c:1502 replication/logical/snapbuild.c:1526 #, c-format msgid "Waiting for transactions (approximately %d) older than %u to end." msgstr "Ожидание транзакций (примерно %d), старее %u до конца." -#: replication/logical/snapbuild.c:1477 +#: replication/logical/snapbuild.c:1524 #, c-format msgid "logical decoding found initial consistent point at %X/%X" msgstr "" "при логическом декодировании найдена начальная точка согласованности в %X/%X" -#: replication/logical/snapbuild.c:1503 +#: replication/logical/snapbuild.c:1550 #, c-format msgid "There are no old transactions anymore." msgstr "Больше старых транзакций нет." -#: replication/logical/snapbuild.c:1904 +#: replication/logical/snapbuild.c:1951 #, c-format msgid "snapbuild state file \"%s\" has wrong magic number: %u instead of %u" msgstr "" "файл состояния snapbuild \"%s\" имеет неправильную сигнатуру (%u вместо %u)" -#: replication/logical/snapbuild.c:1910 +#: replication/logical/snapbuild.c:1957 #, c-format msgid "snapbuild state file \"%s\" has unsupported version: %u instead of %u" msgstr "" "файл состояния snapbuild \"%s\" имеет неправильную версию (%u вместо %u)" -#: replication/logical/snapbuild.c:1951 +#: replication/logical/snapbuild.c:1998 #, c-format msgid "checksum mismatch for snapbuild state file \"%s\": is %u, should be %u" msgstr "" "в файле состояния snapbuild \"%s\" неверная контрольная сумма (%u вместо %u)" -#: replication/logical/snapbuild.c:2019 +#: replication/logical/snapbuild.c:2066 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "Логическое декодирование начнётся с сохранённого снимка." -#: replication/logical/snapbuild.c:2126 +#: replication/logical/snapbuild.c:2173 #, c-format msgid "could not parse file name \"%s\"" msgstr "не удалось разобрать имя файла \"%s\"" @@ -23374,7 +23376,7 @@ msgstr "" "процесс синхронизации таблицы при логической репликации для подписки \"%s\", " "таблицы \"%s\" закончил обработку" -#: replication/logical/tablesync.c:641 +#: replication/logical/tablesync.c:667 #, c-format msgid "" "logical replication apply worker for subscription \"%s\" will restart so " @@ -23383,25 +23385,25 @@ msgstr "" "применяющий процесс логической репликации для подписки \"%s\" будет " "перезапущен, чтобы можно было включить режим two_phase" -#: replication/logical/tablesync.c:827 replication/logical/tablesync.c:969 +#: replication/logical/tablesync.c:853 replication/logical/tablesync.c:995 #, c-format msgid "could not fetch table info for table \"%s.%s\" from publisher: %s" msgstr "" "не удалось получить информацию о таблице \"%s.%s\" с сервера публикации: %s" -#: replication/logical/tablesync.c:834 +#: replication/logical/tablesync.c:860 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "таблица \"%s.%s\" не найдена на сервере публикации" -#: replication/logical/tablesync.c:892 +#: replication/logical/tablesync.c:918 #, c-format msgid "could not fetch column list info for table \"%s.%s\" from publisher: %s" msgstr "" "не удалось получить информацию о списке столбцов таблицы \"%s.%s\" с сервера " "публикации: %s" -#: replication/logical/tablesync.c:1071 +#: replication/logical/tablesync.c:1097 #, c-format msgid "" "could not fetch table WHERE clause info for table \"%s.%s\" from publisher: " @@ -23410,25 +23412,25 @@ msgstr "" "не удалось получить информацию о предложении WHERE таблицы \"%s.%s\" с " "сервера публикации: %s" -#: replication/logical/tablesync.c:1230 +#: replication/logical/tablesync.c:1256 #, c-format msgid "could not start initial contents copy for table \"%s.%s\": %s" msgstr "" "не удалось начать копирование начального содержимого таблицы \"%s.%s\": %s" -#: replication/logical/tablesync.c:1429 +#: replication/logical/tablesync.c:1455 #, c-format msgid "table copy could not start transaction on publisher: %s" msgstr "" "при копировании таблицы не удалось начать транзакцию на сервере публикации: " "%s" -#: replication/logical/tablesync.c:1472 +#: replication/logical/tablesync.c:1498 #, c-format msgid "replication origin \"%s\" already exists" msgstr "источник репликации \"%s\" уже существует" -#: replication/logical/tablesync.c:1505 replication/logical/worker.c:2361 +#: replication/logical/tablesync.c:1531 replication/logical/worker.c:2363 #, c-format msgid "" "user \"%s\" cannot replicate into relation with row-level security enabled: " @@ -23437,14 +23439,14 @@ msgstr "" "пользователь \"%s\" не может реплицировать данные в отношение с включённой " "защитой на уровне строк: \"%s\"" -#: replication/logical/tablesync.c:1518 +#: replication/logical/tablesync.c:1544 #, c-format msgid "table copy could not finish transaction on publisher: %s" msgstr "" "при копировании таблицы не удалось завершить транзакцию на сервере " "публикации: %s" -#: replication/logical/worker.c:481 +#: replication/logical/worker.c:483 #, c-format msgid "" "logical replication parallel apply worker for subscription \"%s\" will stop" @@ -23452,7 +23454,7 @@ msgstr "" "параллельный применяющий процесс логической репликации для подписки \"%s\" " "будет остановлен" -#: replication/logical/worker.c:483 +#: replication/logical/worker.c:485 #, c-format msgid "" "Cannot handle streamed replication transactions using parallel apply workers " @@ -23462,13 +23464,13 @@ msgstr "" "транзакций репликации, передаваемых в потоке, пока все таблицы не " "синхронизированы." -#: replication/logical/worker.c:852 replication/logical/worker.c:967 +#: 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:2500 +#: replication/logical/worker.c:2506 #, c-format msgid "" "publisher did not send replica identity column expected by the logical " @@ -23477,7 +23479,7 @@ msgstr "" "сервер публикации не передал столбец идентификации реплики, ожидаемый для " "целевого отношения логической репликации \"%s.%s\"" -#: replication/logical/worker.c:2507 +#: replication/logical/worker.c:2513 #, c-format msgid "" "logical replication target relation \"%s.%s\" has neither REPLICA IDENTITY " @@ -23488,22 +23490,22 @@ msgstr "" "IDENTITY, ни ключа PRIMARY KEY, и публикуемое отношение не имеет " "характеристики REPLICA IDENTITY FULL" -#: replication/logical/worker.c:3371 +#: replication/logical/worker.c:3384 #, c-format msgid "invalid logical replication message type \"??? (%d)\"" msgstr "неверный тип сообщения логической репликации \"??? (%d)\"" -#: replication/logical/worker.c:3543 +#: replication/logical/worker.c:3556 #, c-format msgid "data stream from publisher has ended" msgstr "поток данных с сервера публикации закончился" -#: replication/logical/worker.c:3697 +#: replication/logical/worker.c:3710 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "завершение обработчика логической репликации из-за тайм-аута" -#: replication/logical/worker.c:3891 +#: replication/logical/worker.c:3904 #, c-format msgid "" "logical replication worker for subscription \"%s\" will stop because the " @@ -23512,7 +23514,7 @@ msgstr "" "процесс логической репликации для подписки \"%s\" будет остановлен, так как " "подписка была удалена" -#: replication/logical/worker.c:3905 +#: replication/logical/worker.c:3918 #, c-format msgid "" "logical replication worker for subscription \"%s\" will stop because the " @@ -23521,7 +23523,7 @@ msgstr "" "процесс логической репликации для подписки \"%s\" будет остановлен, так как " "подписка была отключена" -#: replication/logical/worker.c:3936 +#: replication/logical/worker.c:3949 #, c-format msgid "" "logical replication parallel apply worker for subscription \"%s\" will stop " @@ -23530,7 +23532,7 @@ msgstr "" "параллельный применяющий процесс логической репликации для подписки \"%s\" " "будет остановлен вследствие изменения параметров" -#: replication/logical/worker.c:3940 +#: replication/logical/worker.c:3953 #, c-format msgid "" "logical replication worker for subscription \"%s\" will restart because of a " @@ -23539,7 +23541,7 @@ msgstr "" "процесс логической репликации для подписки \"%s\" будет перезапущен " "вследствие изменения параметров" -#: replication/logical/worker.c:3954 +#: replication/logical/worker.c:3967 #, c-format msgid "" "logical replication parallel apply worker for subscription \"%s\" will stop " @@ -23549,7 +23551,7 @@ msgstr "" "подписки \"%s\" будет остановлен, потому что владелец подписки был лишён " "прав суперпользователя" -#: replication/logical/worker.c:3958 +#: replication/logical/worker.c:3971 #, c-format msgid "" "logical replication worker for subscription \"%s\" will restart because the " @@ -23558,12 +23560,12 @@ msgstr "" "процесс логической репликации для подписки \"%s\" будет перезапущен, потому " "что владелец подписки был лишён прав суперпользователя" -#: replication/logical/worker.c:4478 +#: replication/logical/worker.c:4499 #, c-format msgid "subscription has no replication slot set" msgstr "для подписки не задан слот репликации" -#: replication/logical/worker.c:4591 +#: replication/logical/worker.c:4620 #, c-format msgid "" "logical replication worker for subscription %u will not start because the " @@ -23572,7 +23574,7 @@ msgstr "" "процесс логической репликации для подписки %u не будет запущен, так как " "подписка была удалена при старте" -#: replication/logical/worker.c:4607 +#: replication/logical/worker.c:4636 #, c-format msgid "" "logical replication worker for subscription \"%s\" will not start because " @@ -23581,7 +23583,7 @@ msgstr "" "процесс логической репликации для подписки \"%s\" не будет запущен, так как " "подписка была отключена при старте" -#: replication/logical/worker.c:4631 +#: replication/logical/worker.c:4660 #, c-format msgid "" "logical replication table synchronization worker for subscription \"%s\", " @@ -23590,35 +23592,35 @@ msgstr "" "процесс синхронизации таблицы при логической репликации для подписки \"%s\", " "таблицы \"%s\" запущен" -#: replication/logical/worker.c:4636 +#: replication/logical/worker.c:4665 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "" "запускается применяющий процесс логической репликации для подписки \"%s\"" -#: replication/logical/worker.c:4758 +#: replication/logical/worker.c:4795 #, c-format msgid "subscription \"%s\" has been disabled because of an error" msgstr "подписка \"%s\" была отключена из-за ошибки" -#: replication/logical/worker.c:4806 +#: replication/logical/worker.c:4843 #, c-format msgid "logical replication starts skipping transaction at LSN %X/%X" msgstr "" "обработчик логической репликации начинает пропускать транзакцию с LSN %X/%X" -#: replication/logical/worker.c:4820 +#: replication/logical/worker.c:4857 #, c-format msgid "logical replication completed skipping transaction at LSN %X/%X" msgstr "" "обработчик логической репликации завершил пропуск транзакции с LSN %X/%X" -#: replication/logical/worker.c:4902 +#: replication/logical/worker.c:4945 #, c-format msgid "skip-LSN of subscription \"%s\" cleared" msgstr "значение skip-LSN для подписки \"%s\" очищено" -#: replication/logical/worker.c:4903 +#: replication/logical/worker.c:4946 #, c-format msgid "" "Remote transaction's finish WAL location (LSN) %X/%X did not match skip-LSN " @@ -23627,7 +23629,7 @@ msgstr "" "Позиция завершения удалённой транзакции в WAL (LSN) %X/%X не совпала со " "значением skip-LSN %X/%X." -#: replication/logical/worker.c:4940 +#: replication/logical/worker.c:4974 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -23636,7 +23638,7 @@ msgstr "" "обработка внешних данных для источника репликации \"%s\" в контексте " "сообщения типа \"%s\"" -#: replication/logical/worker.c:4944 +#: replication/logical/worker.c:4978 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -23645,7 +23647,7 @@ msgstr "" "обработка внешних данных из источника репликации \"%s\" в контексте " "сообщения типа \"%s\" в транзакции %u" -#: replication/logical/worker.c:4949 +#: replication/logical/worker.c:4983 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -23654,7 +23656,7 @@ msgstr "" "обработка внешних данных для источника репликации \"%s\" в контексте " "сообщения типа \"%s\" в транзакции %u, конечная позиция %X/%X" -#: replication/logical/worker.c:4960 +#: replication/logical/worker.c:4994 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -23664,7 +23666,7 @@ msgstr "" "сообщения типа \"%s\" для целевого отношения репликации \"%s.%s\" в " "транзакции %u" -#: replication/logical/worker.c:4967 +#: replication/logical/worker.c:5001 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -23675,7 +23677,7 @@ msgstr "" "сообщения типа \"%s\" для целевого отношения репликации \"%s.%s\" в " "транзакции %u, конечная позиция %X/%X" -#: replication/logical/worker.c:4978 +#: replication/logical/worker.c:5012 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -23686,7 +23688,7 @@ msgstr "" "сообщения типа \"%s\" для целевого отношения репликации \"%s.%s\", столбца " "\"%s\", в транзакции %u" -#: replication/logical/worker.c:4986 +#: replication/logical/worker.c:5020 #, c-format msgid "" "processing remote data for replication origin \"%s\" during message type " @@ -23819,7 +23821,7 @@ msgstr "используются все слоты репликации" msgid "Free one or increase \"max_replication_slots\"." msgstr "Освободите ненужный или увеличьте параметр \"max_replication_slots\"." -#: replication/slot.c:560 replication/slot.c:2450 replication/slotfuncs.c:661 +#: replication/slot.c:560 replication/slot.c:2463 replication/slotfuncs.c:661 #: utils/activity/pgstat_replslot.c:56 utils/adt/genfile.c:728 #, c-format msgid "replication slot \"%s\" does not exist" @@ -23870,7 +23872,7 @@ msgstr "изменить слот репликации \"%s\" нельзя" msgid "cannot enable failover for a replication slot on the standby" msgstr "сделать переносимым слот репликации на ведомом сервере нельзя" -#: replication/slot.c:969 replication/slot.c:1927 replication/slot.c:2311 +#: replication/slot.c:969 replication/slot.c:1923 replication/slot.c:2307 #, c-format msgid "could not remove directory \"%s\"" msgstr "ошибка при удалении каталога \"%s\"" @@ -23929,67 +23931,81 @@ msgstr "завершение процесса %d для освобождения msgid "invalidating obsolete replication slot \"%s\"" msgstr "аннулирование устаревшего слота репликации \"%s\"" -#: replication/slot.c:2249 +#: replication/slot.c:2245 #, c-format msgid "replication slot file \"%s\" has wrong magic number: %u instead of %u" msgstr "" "файл слота репликации \"%s\" имеет неправильную сигнатуру (%u вместо %u)" -#: replication/slot.c:2256 +#: replication/slot.c:2252 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "файл состояния snapbuild \"%s\" имеет неподдерживаемую версию %u" -#: replication/slot.c:2263 +#: replication/slot.c:2259 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "у файла слота репликации \"%s\" неверная длина: %u" -#: replication/slot.c:2299 +#: replication/slot.c:2295 #, c-format msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "" "в файле слота репликации \"%s\" неверная контрольная сумма (%u вместо %u)" -#: replication/slot.c:2333 +#: replication/slot.c:2331 #, c-format msgid "logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"" msgstr "" "существует слот логической репликации \"%s\", но \"wal_level\" < \"logical\"" -#: replication/slot.c:2335 +#: replication/slot.c:2333 #, c-format msgid "Change \"wal_level\" to be \"logical\" or higher." msgstr "Смените \"wal_level\" на \"logical\" или более высокий уровень." -#: replication/slot.c:2339 +#: replication/slot.c:2345 +#, c-format +msgid "" +"logical replication slot \"%s\" exists on the standby, but \"hot_standby\" = " +"\"off\"" +msgstr "" +"на ведомом сервере существует слот логической репликации \"%s\", но " +"\"hot_standby\" = \"off\"" + +#: replication/slot.c:2347 +#, c-format +msgid "Change \"hot_standby\" to be \"on\"." +msgstr "Смените значение \"hot_standby\" на \"on\"." + +#: replication/slot.c:2352 #, c-format msgid "" "physical replication slot \"%s\" exists, but \"wal_level\" < \"replica\"" msgstr "" "существует слот физической репликации \"%s\", но \"wal_level\" < \"replica\"" -#: replication/slot.c:2341 +#: replication/slot.c:2354 #, c-format msgid "Change \"wal_level\" to be \"replica\" or higher." msgstr "Смените \"wal_level\" на \"replica\" или более высокий уровень." -#: replication/slot.c:2383 +#: replication/slot.c:2396 #, c-format msgid "too many replication slots active before shutdown" msgstr "перед завершением активно слишком много слотов репликации" -#: replication/slot.c:2458 +#: replication/slot.c:2471 #, c-format msgid "\"%s\" is not a physical replication slot" msgstr "\"%s\" не является слотом физической репликации" -#: replication/slot.c:2635 +#: replication/slot.c:2650 #, 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 +#: replication/slot.c:2652 replication/slot.c:2686 replication/slot.c:2701 #, c-format msgid "" "Logical replication is waiting on the standby associated with replication " @@ -23998,30 +24014,30 @@ msgstr "" "Логическая репликация ожидает резервного сервера, связанного со слотом " "репликации \"%s\"." -#: replication/slot.c:2639 +#: replication/slot.c:2654 #, c-format msgid "Create the replication slot \"%s\" or amend parameter \"%s\"." msgstr "Создайте слот репликации \"%s\" или опустите параметр \"%s\"." -#: replication/slot.c:2649 +#: replication/slot.c:2664 #, c-format msgid "cannot specify logical replication slot \"%s\" in parameter \"%s\"" msgstr "" "слот логической репликации \"%s\" не может быть указан в параметре \"%s\"" -#: replication/slot.c:2651 +#: replication/slot.c:2666 #, c-format msgid "" "Logical replication is waiting for correction on replication slot \"%s\"." msgstr "Логическая репликация ожидает исправления слота репликации \"%s\"." -#: replication/slot.c:2653 +#: replication/slot.c:2668 #, c-format msgid "Remove the logical replication slot \"%s\" from parameter \"%s\"." msgstr "" "Удалите указание слота логической репликации \"%s\" из параметра \"%s\"." -#: replication/slot.c:2669 +#: replication/slot.c:2684 #, c-format msgid "" "physical replication slot \"%s\" specified in parameter \"%s\" has been " @@ -24030,14 +24046,14 @@ msgstr "" "слот физической репликации \"%s\", указанный в параметре \"%s\", был " "аннулирован" -#: replication/slot.c:2673 +#: replication/slot.c:2688 #, c-format msgid "" "Drop and recreate the replication slot \"%s\", or amend parameter \"%s\"." msgstr "" "Удалите и пересоздайте слот репликации \"%s\" или опустите параметр \"%s\"." -#: replication/slot.c:2684 +#: replication/slot.c:2699 #, c-format msgid "" "replication slot \"%s\" specified in parameter \"%s\" does not have " @@ -24046,7 +24062,7 @@ msgstr "" "у слота репликации \"%s\", указанного в параметре \"%s\", нулевое значение " "active_pid" -#: replication/slot.c:2688 +#: replication/slot.c:2703 #, c-format msgid "" "Start the standby associated with the replication slot \"%s\", or amend " @@ -24098,12 +24114,17 @@ msgstr "" msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "скопировать слот репликации, для которого не резервируется WAL, нельзя" -#: replication/slotfuncs.c:768 +#: 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:770 +#: replication/slotfuncs.c:782 #, c-format msgid "" "The source replication slot was modified incompatibly during the copy " @@ -24112,26 +24133,36 @@ msgstr "" "Исходный слот репликации был модифицирован несовместимым образом во время " "копирования." -#: replication/slotfuncs.c:776 +#: replication/slotfuncs.c:788 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "" "скопировать слот логической репликации \"%s\" в незавершённом состоянии " "нельзя" -#: replication/slotfuncs.c:778 +#: replication/slotfuncs.c:790 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "" "Повторите попытку, когда для исходного слота репликации будет определена " "позиция confirmed_flush_lsn." -#: replication/slotfuncs.c:877 +#: 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 +#: replication/syncrep.c:304 #, c-format msgid "" "canceling the wait for synchronous replication and terminating connection " @@ -24140,7 +24171,7 @@ msgstr "" "отмена ожидания синхронной репликации и закрытие соединения по команде " "администратора" -#: replication/syncrep.c:262 replication/syncrep.c:279 +#: replication/syncrep.c:305 replication/syncrep.c:322 #, c-format msgid "" "The transaction has already committed locally, but might not have been " @@ -24149,29 +24180,29 @@ msgstr "" "Транзакция уже была зафиксирована локально, но, возможно, не была " "реплицирована на резервный сервер." -#: replication/syncrep.c:278 +#: replication/syncrep.c:321 #, c-format msgid "canceling wait for synchronous replication due to user request" msgstr "отмена ожидания синхронной репликации по запросу пользователя" -#: replication/syncrep.c:485 +#: replication/syncrep.c:528 #, c-format msgid "standby \"%s\" is now a synchronous standby with priority %d" msgstr "резервный сервер \"%s\" стал синхронным с приоритетом %d" -#: replication/syncrep.c:489 +#: replication/syncrep.c:532 #, c-format msgid "standby \"%s\" is now a candidate for quorum synchronous standby" msgstr "" "резервный сервер \"%s\" стал кандидатом для включения в кворум синхронных " "резервных" -#: replication/syncrep.c:1013 +#: replication/syncrep.c:1080 #, c-format msgid "\"synchronous_standby_names\" parser failed" msgstr "ошибка при разборе \"synchronous_standby_names\"" -#: replication/syncrep.c:1019 +#: replication/syncrep.c:1086 #, c-format msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "число синхронных резервных серверов (%d) должно быть больше нуля" @@ -24251,40 +24282,40 @@ msgstr "загрузка файла истории для линии време msgid "could not write to WAL segment %s at offset %d, length %lu: %m" msgstr "не удалось записать в сегмент WAL %s (смещение %d, длина %lu): %m" -#: replication/walsender.c:531 +#: replication/walsender.c:535 #, c-format msgid "cannot use %s with a logical replication slot" msgstr "использовать %s со слотом логической репликации нельзя" -#: replication/walsender.c:635 storage/smgr/md.c:1735 +#: 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:639 +#: replication/walsender.c:643 #, c-format msgid "could not seek to beginning of file \"%s\": %m" msgstr "не удалось перейти к началу файла \"%s\": %m" -#: replication/walsender.c:853 +#: replication/walsender.c:857 #, c-format msgid "cannot use a logical replication slot for physical replication" msgstr "" "слот логической репликации нельзя использовать для физической репликации" -#: replication/walsender.c:919 +#: 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:922 +#: 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:966 +#: replication/walsender.c:970 #, c-format msgid "" "requested starting point %X/%X is ahead of the WAL flush position of this " @@ -24293,73 +24324,73 @@ msgstr "" "запрошенная начальная точка %X/%X впереди позиции сброшенных данных журнала " "на этом сервере (%X/%X)" -#: replication/walsender.c:1160 +#: 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:1266 +#: 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:1276 +#: 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:1282 +#: 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:1287 +#: 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:1293 +#: 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:1299 +#: replication/walsender.c:1303 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s требуется вызывать не в подтранзакции" -#: replication/walsender.c:1472 +#: replication/walsender.c:1476 #, c-format msgid "terminating walsender process after promotion" msgstr "завершение процесса передачи журнала после повышения" -#: replication/walsender.c:2000 +#: replication/walsender.c:2015 #, c-format msgid "cannot execute new commands while WAL sender is in stopping mode" msgstr "" "нельзя выполнять новые команды, пока процесс передачи WAL находится в режиме " "остановки" -#: replication/walsender.c:2035 +#: replication/walsender.c:2050 #, c-format msgid "cannot execute SQL commands in WAL sender for physical replication" msgstr "" "нельзя выполнять команды SQL в процессе, передающем WAL для физической " "репликации" -#: replication/walsender.c:2068 +#: replication/walsender.c:2083 #, c-format msgid "received replication command: %s" msgstr "получена команда репликации: %s" -#: replication/walsender.c:2076 tcop/fastpath.c:209 tcop/postgres.c:1142 +#: 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 @@ -24369,22 +24400,22 @@ msgid "" msgstr "" "текущая транзакция прервана, команды до конца блока транзакции игнорируются" -#: replication/walsender.c:2233 replication/walsender.c:2268 +#: replication/walsender.c:2248 replication/walsender.c:2283 #, c-format msgid "unexpected EOF on standby connection" msgstr "неожиданный обрыв соединения с резервным сервером" -#: replication/walsender.c:2256 +#: replication/walsender.c:2271 #, c-format msgid "invalid standby message type \"%c\"" msgstr "неверный тип сообщения резервного сервера: \"%c\"" -#: replication/walsender.c:2345 +#: replication/walsender.c:2360 #, c-format msgid "unexpected message type \"%c\"" msgstr "неожиданный тип сообщения \"%c\"" -#: replication/walsender.c:2759 +#: replication/walsender.c:2778 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "завершение процесса передачи журнала из-за тайм-аута репликации" @@ -25036,17 +25067,17 @@ msgstr "" "Эта ситуация может возникать из-за ошибок в ядре; возможно, вам следует " "обновить ОС." -#: storage/buffer/bufmgr.c:5653 +#: storage/buffer/bufmgr.c:5654 #, c-format msgid "could not write block %u of %s" msgstr "не удалось запись блок %u файла %s" -#: storage/buffer/bufmgr.c:5655 +#: storage/buffer/bufmgr.c:5656 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Множественные сбои - возможно, постоянная ошибка записи." -#: storage/buffer/bufmgr.c:5677 storage/buffer/bufmgr.c:5697 +#: storage/buffer/bufmgr.c:5678 storage/buffer/bufmgr.c:5698 #, c-format msgid "writing block %u of relation %s" msgstr "запись блока %u отношения %s" @@ -25105,105 +25136,105 @@ msgstr "ошибка удаления набора файлов \"%s\": %m" 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 +#: storage/file/fd.c:580 storage/file/fd.c:652 storage/file/fd.c:688 #, c-format msgid "could not flush dirty data: %m" msgstr "не удалось сбросить грязные данные: %m" -#: storage/file/fd.c:613 +#: storage/file/fd.c:610 #, c-format msgid "could not determine dirty data size: %m" msgstr "не удалось определить размер грязных данных: %m" -#: storage/file/fd.c:665 +#: storage/file/fd.c:662 #, c-format msgid "could not munmap() while flushing data: %m" msgstr "ошибка в munmap() при сбросе данных на диск: %m" -#: storage/file/fd.c:983 +#: storage/file/fd.c:980 #, c-format msgid "getrlimit failed: %m" msgstr "ошибка в getrlimit(): %m" -#: storage/file/fd.c:1073 +#: storage/file/fd.c:1070 #, c-format msgid "insufficient file descriptors available to start server process" msgstr "недостаточно дескрипторов файлов для запуска серверного процесса" -#: storage/file/fd.c:1074 +#: storage/file/fd.c:1071 #, 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 +#: storage/file/fd.c:1159 storage/file/fd.c:2615 storage/file/fd.c:2724 +#: storage/file/fd.c:2875 #, c-format msgid "out of file descriptors: %m; release and retry" msgstr "нехватка дескрипторов файлов: %m; освободите их и повторите попытку" -#: storage/file/fd.c:1536 +#: storage/file/fd.c:1533 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "временный файл: путь \"%s\", размер %lu" -#: storage/file/fd.c:1675 +#: storage/file/fd.c:1672 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "не удалось создать временный каталог \"%s\": %m" -#: storage/file/fd.c:1682 +#: storage/file/fd.c:1679 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "не удалось создать временный подкаталог \"%s\": %m" -#: storage/file/fd.c:1879 +#: storage/file/fd.c:1876 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "не удалось создать временный файл \"%s\": %m" -#: storage/file/fd.c:1915 +#: storage/file/fd.c:1912 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "не удалось открыть временный файл \"%s\": %m" -#: storage/file/fd.c:1956 +#: storage/file/fd.c:1953 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "ошибка удаления временного файла \"%s\": %m" -#: storage/file/fd.c:2044 +#: storage/file/fd.c:2041 #, c-format msgid "could not delete file \"%s\": %m" msgstr "ошибка удаления файла \"%s\": %m" -#: storage/file/fd.c:2234 +#: storage/file/fd.c:2231 #, 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 +#: storage/file/fd.c:2591 storage/file/fd.c:2650 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open file \"%s\"" msgstr "превышен предел maxAllocatedDescs (%d) при попытке открыть файл \"%s\"" -#: storage/file/fd.c:2698 +#: storage/file/fd.c:2695 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to execute command \"%s\"" msgstr "" "превышен предел maxAllocatedDescs (%d) при попытке выполнить команду \"%s\"" -#: storage/file/fd.c:2854 +#: storage/file/fd.c:2851 #, c-format msgid "exceeded maxAllocatedDescs (%d) while trying to open directory \"%s\"" msgstr "" "превышен предел maxAllocatedDescs (%d) при попытке открыть каталог \"%s\"" -#: storage/file/fd.c:3384 +#: storage/file/fd.c:3381 #, c-format msgid "unexpected file found in temporary-files directory: \"%s\"" msgstr "в каталоге временных файлов обнаружен неуместный файл: \"%s\"" -#: storage/file/fd.c:3502 +#: storage/file/fd.c:3499 #, c-format msgid "" "syncing data directory (syncfs), elapsed time: %ld.%02d s, current path: %s" @@ -25211,7 +25242,7 @@ msgstr "" "синхронизация каталога данных (syncfs), прошло времени: %ld.%02d с, текущий " "путь: %s" -#: storage/file/fd.c:3729 +#: storage/file/fd.c:3726 #, c-format msgid "" "syncing data directory (pre-fsync), elapsed time: %ld.%02d s, current path: " @@ -25220,7 +25251,7 @@ msgstr "" "синхронизация каталога данных (подготовка к fsync), прошло времени: %ld.%02d " "с, текущий путь: %s" -#: storage/file/fd.c:3761 +#: storage/file/fd.c:3758 #, c-format msgid "" "syncing data directory (fsync), elapsed time: %ld.%02d s, current path: %s" @@ -25228,22 +25259,22 @@ msgstr "" "синхронизация каталога данных (fsync), прошло времени: %ld.%02d с, текущий " "путь: %s" -#: storage/file/fd.c:3950 +#: storage/file/fd.c:3947 #, c-format msgid "\"debug_io_direct\" is not supported on this platform." msgstr "Параметр \"debug_io_direct\" не поддерживается в этой ОС." -#: storage/file/fd.c:3964 +#: storage/file/fd.c:3961 #, c-format msgid "Invalid list syntax in parameter \"%s\"" msgstr "Неверный формат списка в параметре \"%s\"." -#: storage/file/fd.c:3984 +#: storage/file/fd.c:3981 #, c-format msgid "Invalid option \"%s\"" msgstr "Неверный параметр \"%s\"." -#: storage/file/fd.c:3997 +#: storage/file/fd.c:3994 #, c-format msgid "" "\"debug_io_direct\" is not supported for WAL because XLOG_BLCKSZ is too small" @@ -25251,7 +25282,7 @@ msgstr "" "режим \"debug_io_direct\" не поддерживается для WAL из-за слишком маленького " "размера XLOG_BLCKSZ" -#: storage/file/fd.c:4004 +#: storage/file/fd.c:4001 #, c-format msgid "" "\"debug_io_direct\" is not supported for data because BLCKSZ is too small" @@ -25433,7 +25464,7 @@ msgstr "неверный размер сообщения %zu в очереди #: 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 +#: utils/hash/dynahash.c:1096 #, c-format msgid "out of shared memory" msgstr "нехватка разделяемой памяти" @@ -25631,108 +25662,108 @@ msgstr "обнаружена взаимоблокировка" msgid "See server log for query details." msgstr "Подробности запроса смотрите в протоколе сервера." -#: storage/lmgr/lmgr.c:848 +#: storage/lmgr/lmgr.c:854 #, c-format msgid "while updating tuple (%u,%u) in relation \"%s\"" msgstr "при изменении кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:851 +#: storage/lmgr/lmgr.c:857 #, c-format msgid "while deleting tuple (%u,%u) in relation \"%s\"" msgstr "при удалении кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:854 +#: storage/lmgr/lmgr.c:860 #, c-format msgid "while locking tuple (%u,%u) in relation \"%s\"" msgstr "при блокировке кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:857 +#: storage/lmgr/lmgr.c:863 #, c-format msgid "while locking updated version (%u,%u) of tuple in relation \"%s\"" msgstr "при блокировке изменённой версии (%u,%u) кортежа в отношении \"%s\"" -#: storage/lmgr/lmgr.c:860 +#: storage/lmgr/lmgr.c:866 #, c-format msgid "while inserting index tuple (%u,%u) in relation \"%s\"" msgstr "при добавлении кортежа индекса (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:863 +#: storage/lmgr/lmgr.c:869 #, c-format msgid "while checking uniqueness of tuple (%u,%u) in relation \"%s\"" msgstr "при проверке уникальности кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:866 +#: storage/lmgr/lmgr.c:872 #, c-format msgid "while rechecking updated tuple (%u,%u) in relation \"%s\"" msgstr "при перепроверке изменённого кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:869 +#: storage/lmgr/lmgr.c:875 #, c-format msgid "while checking exclusion constraint on tuple (%u,%u) in relation \"%s\"" msgstr "" "при проверке ограничения-исключения для кортежа (%u,%u) в отношении \"%s\"" -#: storage/lmgr/lmgr.c:1239 +#: storage/lmgr/lmgr.c:1245 #, c-format msgid "relation %u of database %u" msgstr "отношение %u базы данных %u" -#: storage/lmgr/lmgr.c:1245 +#: storage/lmgr/lmgr.c:1251 #, c-format msgid "extension of relation %u of database %u" msgstr "расширение отношения %u базы данных %u" -#: storage/lmgr/lmgr.c:1251 +#: storage/lmgr/lmgr.c:1257 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid базы %u" -#: storage/lmgr/lmgr.c:1256 +#: storage/lmgr/lmgr.c:1262 #, c-format msgid "page %u of relation %u of database %u" msgstr "страница %u отношения %u базы данных %u" -#: storage/lmgr/lmgr.c:1263 +#: storage/lmgr/lmgr.c:1269 #, c-format msgid "tuple (%u,%u) of relation %u of database %u" msgstr "кортеж (%u,%u) отношения %u базы данных %u" -#: storage/lmgr/lmgr.c:1271 +#: storage/lmgr/lmgr.c:1277 #, c-format msgid "transaction %u" msgstr "транзакция %u" -#: storage/lmgr/lmgr.c:1276 +#: storage/lmgr/lmgr.c:1282 #, c-format msgid "virtual transaction %d/%u" msgstr "виртуальная транзакция %d/%u" -#: storage/lmgr/lmgr.c:1282 +#: storage/lmgr/lmgr.c:1288 #, c-format msgid "speculative token %u of transaction %u" msgstr "спекулятивный маркер %u транзакции %u" -#: storage/lmgr/lmgr.c:1288 +#: storage/lmgr/lmgr.c:1294 #, c-format msgid "object %u of class %u of database %u" msgstr "объект %u класса %u базы данных %u" -#: storage/lmgr/lmgr.c:1296 +#: storage/lmgr/lmgr.c:1302 #, c-format msgid "user lock [%u,%u,%u]" msgstr "пользовательская блокировка [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1303 +#: storage/lmgr/lmgr.c:1309 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "рекомендательная блокировка [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1311 +#: storage/lmgr/lmgr.c:1317 #, c-format msgid "remote transaction %u of subscription %u of database %u" msgstr "удалённая транзакция %u подписки %u в базе данных %u" -#: storage/lmgr/lmgr.c:1318 +#: storage/lmgr/lmgr.c:1324 #, c-format msgid "unrecognized locktag type %d" msgstr "нераспознанный тип блокировки %d" @@ -26549,12 +26580,12 @@ msgstr "" "число форматов результатов в сообщении Bind (%d) не равно числу столбцов в " "запросе (%d)" -#: tcop/pquery.c:942 tcop/pquery.c:1696 +#: tcop/pquery.c:942 tcop/pquery.c:1687 #, c-format msgid "cursor can only scan forward" msgstr "курсор может сканировать только вперёд" -#: tcop/pquery.c:943 tcop/pquery.c:1697 +#: tcop/pquery.c:943 tcop/pquery.c:1688 #, c-format msgid "Declare it with SCROLL option to enable backward scan." msgstr "Добавьте в его объявление SCROLL, чтобы он мог перемещаться назад." @@ -26724,55 +26755,55 @@ 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 "неверный флаг аффиксов \"%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:749 utils/adt/regexp.c:223 jsonpath_gram.y:629 +#: 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: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 gram.y:18742 gram.y:18759 #, c-format msgid "syntax error" msgstr "ошибка синтаксиса" -#: 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 "не удалось открыть файл аффиксов \"%s\": %m" -#: tsearch/spell.c:1277 +#: tsearch/spell.c:1280 #, c-format msgid "" "Ispell dictionary supports only \"default\", \"long\", and \"num\" flag " @@ -26781,22 +26812,22 @@ 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:194 utils/adt/tsvector.c:277 utils/adt/tsvector_op.c:1126 +#: 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)" @@ -26863,38 +26894,38 @@ msgstr "%s должно быть >= 0" msgid "could not unlink permanent statistics file \"%s\": %m" msgstr "ошибка удаления постоянного файла статистики \"%s\": %m" -#: utils/activity/pgstat.c:1255 +#: utils/activity/pgstat.c:1254 #, c-format msgid "invalid statistics kind: \"%s\"" msgstr "неверный вид статистики: \"%s\"" -#: utils/activity/pgstat.c:1335 +#: utils/activity/pgstat.c:1334 #, c-format msgid "could not open temporary statistics file \"%s\": %m" msgstr "не удалось открыть временный файл статистики \"%s\": %m" -#: utils/activity/pgstat.c:1455 +#: utils/activity/pgstat.c:1454 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "не удалось записать во временный файл статистики \"%s\": %m" -#: utils/activity/pgstat.c:1464 +#: utils/activity/pgstat.c:1463 #, c-format msgid "could not close temporary statistics file \"%s\": %m" msgstr "не удалось закрыть временный файл статистики \"%s\": %m" -#: utils/activity/pgstat.c:1472 +#: 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:1521 +#: utils/activity/pgstat.c:1520 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "не удалось открыть файл статистики \"%s\": %m" -#: utils/activity/pgstat.c:1683 +#: utils/activity/pgstat.c:1682 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "файл статистики \"%s\" испорчен" @@ -26919,102 +26950,102 @@ msgstr "событие ожидания \"%s\" в типе \"%s\" уже сущ msgid "too many custom wait events" msgstr "слишком много пользовательских событий ожидания" -#: utils/adt/acl.c:183 utils/adt/name.c:93 +#: utils/adt/acl.c:200 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "слишком длинный идентификатор" -#: utils/adt/acl.c:184 utils/adt/name.c:94 +#: utils/adt/acl.c:201 utils/adt/name.c:94 #, c-format msgid "Identifier must be less than %d characters." msgstr "Идентификатор должен быть короче %d байт." -#: utils/adt/acl.c:272 +#: utils/adt/acl.c:289 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "нераспознанное ключевое слово: \"%s\"" -#: utils/adt/acl.c:273 +#: utils/adt/acl.c:290 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "Ключевым словом ACL должно быть \"group\" или \"user\"." -#: utils/adt/acl.c:281 +#: utils/adt/acl.c:298 #, c-format msgid "missing name" msgstr "отсутствует имя" -#: utils/adt/acl.c:282 +#: utils/adt/acl.c:299 #, c-format msgid "A name must follow the \"group\" or \"user\" key word." msgstr "За ключевыми словами \"group\" или \"user\" должно следовать имя." -#: utils/adt/acl.c:288 +#: utils/adt/acl.c:305 #, c-format msgid "missing \"=\" sign" msgstr "отсутствует знак \"=\"" -#: utils/adt/acl.c:350 +#: utils/adt/acl.c:367 #, c-format msgid "invalid mode character: must be one of \"%s\"" msgstr "неверный символ режима: должен быть один из \"%s\"" -#: utils/adt/acl.c:380 +#: utils/adt/acl.c:397 #, c-format msgid "a name must follow the \"/\" sign" msgstr "за знаком \"/\" должно следовать имя" -#: utils/adt/acl.c:392 +#: utils/adt/acl.c:409 #, c-format msgid "defaulting grantor to user ID %u" msgstr "назначившим права считается пользователь с ID %u" -#: utils/adt/acl.c:578 +#: utils/adt/acl.c:595 #, c-format msgid "ACL array contains wrong data type" msgstr "Массив ACL содержит неверный тип данных" -#: utils/adt/acl.c:582 +#: utils/adt/acl.c:599 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "Массивы ACL должны быть одномерными" -#: utils/adt/acl.c:586 +#: utils/adt/acl.c:603 #, c-format msgid "ACL arrays must not contain null values" msgstr "Массивы ACL не должны содержать значения null" -#: utils/adt/acl.c:615 +#: utils/adt/acl.c:632 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "лишний мусор в конце спецификации ACL" -#: utils/adt/acl.c:1263 +#: utils/adt/acl.c:1280 #, c-format msgid "grant options cannot be granted back to your own grantor" msgstr "привилегию назначения прав нельзя вернуть тому, кто назначил её вам" -#: utils/adt/acl.c:1579 +#: utils/adt/acl.c:1596 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert больше не поддерживается" -#: utils/adt/acl.c:1589 +#: utils/adt/acl.c:1606 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove больше не поддерживается" -#: utils/adt/acl.c:1709 +#: utils/adt/acl.c:1726 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "нераспознанный тип прав: \"%s\"" -#: utils/adt/acl.c:3550 utils/adt/regproc.c:100 utils/adt/regproc.c:265 +#: utils/adt/acl.c:3567 utils/adt/regproc.c:100 utils/adt/regproc.c:265 #, c-format msgid "function \"%s\" does not exist" msgstr "функция \"%s\" не существует" -#: utils/adt/acl.c:5196 +#: utils/adt/acl.c:5213 #, c-format msgid "must be able to SET ROLE \"%s\"" msgstr "нужны права для выполнения SET ROLE \"%s\"" @@ -27040,7 +27071,7 @@ msgstr "тип входных данных не является массиво #: 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/int8.c:1256 utils/adt/numeric.c:1918 utils/adt/numeric.c:4455 #: 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 @@ -27204,7 +27235,7 @@ msgid "Unexpected end of input." msgstr "Неожиданный конец ввода." #: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3499 -#: utils/adt/arrayfuncs.c:6106 +#: utils/adt/arrayfuncs.c:6108 #, c-format msgid "invalid number of dimensions: %d" msgstr "неверное число размерностей: %d" @@ -27245,8 +27276,8 @@ 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:2915 utils/adt/arrayfuncs.c:6092 -#: utils/adt/arrayfuncs.c:6118 utils/adt/arrayfuncs.c:6129 +#: 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 @@ -27327,42 +27358,42 @@ msgstr "аккумулировать NULL-массивы нельзя" msgid "cannot accumulate empty arrays" msgstr "аккумулировать пустые массивы нельзя" -#: utils/adt/arrayfuncs.c:5990 utils/adt/arrayfuncs.c:6030 +#: 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:6093 utils/adt/arrayfuncs.c:6119 +#: utils/adt/arrayfuncs.c:6095 utils/adt/arrayfuncs.c:6121 #, c-format msgid "Dimension array must be one dimensional." msgstr "Массив размерностей должен быть одномерным." -#: utils/adt/arrayfuncs.c:6098 utils/adt/arrayfuncs.c:6124 +#: utils/adt/arrayfuncs.c:6100 utils/adt/arrayfuncs.c:6126 #, c-format msgid "dimension values cannot be null" msgstr "значения размерностей не могут быть null" -#: utils/adt/arrayfuncs.c:6130 +#: utils/adt/arrayfuncs.c:6132 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "Массив нижних границ и массив размерностей имеют разные размеры." -#: utils/adt/arrayfuncs.c:6411 +#: utils/adt/arrayfuncs.c:6413 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "удаление элементов из многомерных массивов не поддерживается" -#: utils/adt/arrayfuncs.c:6688 +#: utils/adt/arrayfuncs.c:6690 #, c-format msgid "thresholds must be one-dimensional array" msgstr "границы должны задаваться одномерным массивом" -#: utils/adt/arrayfuncs.c:6693 +#: utils/adt/arrayfuncs.c:6695 #, c-format msgid "thresholds array must not contain NULLs" msgstr "массив границ не должен содержать NULL" -#: utils/adt/arrayfuncs.c:6926 +#: utils/adt/arrayfuncs.c:6928 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "число удаляемых элементов должно быть от 0 до %d" @@ -27411,8 +27442,8 @@ msgstr "преобразование кодировки из %s в ASCII не п #: 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/network.c:99 utils/adt/numeric.c:803 utils/adt/numeric.c:7222 +#: utils/adt/numeric.c:7425 utils/adt/numeric.c:8372 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 @@ -27433,10 +27464,10 @@ msgstr "денежное значение вне диапазона" #: 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 +#: utils/adt/numeric.c:3192 utils/adt/numeric.c:3215 utils/adt/numeric.c:3300 +#: utils/adt/numeric.c:3318 utils/adt/numeric.c:3414 utils/adt/numeric.c:8921 +#: utils/adt/numeric.c:9234 utils/adt/numeric.c:9582 utils/adt/numeric.c:9698 +#: utils/adt/numeric.c:11209 utils/adt/timestamp.c:3713 #, c-format msgid "division by zero" msgstr "деление на ноль" @@ -27483,7 +27514,7 @@ 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:2552 +#: utils/adt/rangetypes.c:1584 utils/adt/rangetypes.c:1599 utils/adt/xml.c:2554 #, c-format msgid "date out of range" msgstr "дата вне диапазона" @@ -27557,8 +27588,8 @@ msgstr "единица \"%s\" для типа %s не распознана" #: 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 +#: utils/adt/timestamp.c:6456 utils/adt/timestamp.c:6497 utils/adt/xml.c:2576 +#: utils/adt/xml.c:2583 utils/adt/xml.c:2603 utils/adt/xml.c:2610 #, c-format msgid "timestamp out of range" msgstr "timestamp вне диапазона" @@ -27590,7 +27621,7 @@ 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/int.c:717 utils/adt/int8.c:413 utils/adt/numeric.c:2596 #: utils/adt/timestamp.c:3810 utils/adt/timestamp.c:3847 #: utils/adt/timestamp.c:3888 #, c-format @@ -27786,34 +27817,34 @@ 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:4593 utils/adt/numeric.c:4598 +#: utils/adt/int8.c:1277 utils/adt/numeric.c:4594 utils/adt/numeric.c:4599 #, c-format msgid "smallint out of range" msgstr "smallint вне диапазона" -#: utils/adt/float.c:1447 utils/adt/numeric.c:3709 utils/adt/numeric.c:10112 +#: utils/adt/float.c:1447 utils/adt/numeric.c:3710 utils/adt/numeric.c:10113 #, c-format msgid "cannot take square root of a negative number" msgstr "извлечь квадратный корень отрицательного числа нельзя" -#: utils/adt/float.c:1515 utils/adt/numeric.c:3997 utils/adt/numeric.c:4109 +#: utils/adt/float.c:1515 utils/adt/numeric.c:3998 utils/adt/numeric.c:4110 #, c-format msgid "zero raised to a negative power is undefined" msgstr "ноль в отрицательной степени даёт неопределённость" -#: utils/adt/float.c:1519 utils/adt/numeric.c:4001 utils/adt/numeric.c:11003 +#: utils/adt/float.c:1519 utils/adt/numeric.c:4002 utils/adt/numeric.c:11004 #, 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:3909 -#: utils/adt/numeric.c:10783 +#: utils/adt/float.c:1695 utils/adt/float.c:1728 utils/adt/numeric.c:3910 +#: utils/adt/numeric.c:10784 #, c-format msgid "cannot take logarithm of zero" msgstr "вычислить логарифм нуля нельзя" -#: 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 +#: utils/adt/float.c:1699 utils/adt/float.c:1732 utils/adt/numeric.c:3848 +#: utils/adt/numeric.c:3905 utils/adt/numeric.c:10788 #, c-format msgid "cannot take logarithm of a negative number" msgstr "вычислить логарифм отрицательного числа нельзя" @@ -27827,22 +27858,22 @@ msgstr "вычислить логарифм отрицательного чис msgid "input is out of range" msgstr "введённое значение вне диапазона" -#: utils/adt/float.c:4000 utils/adt/numeric.c:1857 +#: utils/adt/float.c:4000 utils/adt/numeric.c:1858 #, c-format msgid "count must be greater than zero" msgstr "счётчик должен быть больше нуля" -#: utils/adt/float.c:4005 utils/adt/numeric.c:1868 +#: utils/adt/float.c:4005 utils/adt/numeric.c:1869 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "операнд, нижняя и верхняя границы не могут быть NaN" -#: utils/adt/float.c:4011 utils/adt/numeric.c:1873 +#: utils/adt/float.c:4011 utils/adt/numeric.c:1874 #, c-format msgid "lower and upper bounds must be finite" msgstr "нижняя и верхняя границы должны быть конечными" -#: utils/adt/float.c:4077 utils/adt/numeric.c:1887 +#: utils/adt/float.c:4077 utils/adt/numeric.c:1888 #, c-format msgid "lower bound cannot equal upper bound" msgstr "нижняя граница не может равняться верхней" @@ -28220,7 +28251,7 @@ msgstr "размер шага не может быть нулевым" #: 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/int8.c:1312 utils/adt/int8.c:1347 utils/adt/numeric.c:4543 #: utils/adt/rangetypes.c:1535 utils/adt/rangetypes.c:1548 #: utils/adt/varbit.c:1676 #, c-format @@ -28275,7 +28306,7 @@ msgstr "массив должен иметь два столбца" msgid "mismatched array dimensions" msgstr "неподходящие размерности массива" -#: utils/adt/json.c:1702 utils/adt/jsonb_util.c:1956 +#: utils/adt/json.c:1702 utils/adt/jsonb_util.c:1962 #, c-format msgid "duplicate JSON object key value" msgstr "повторяющиеся ключи в объекте JSON" @@ -28342,23 +28373,23 @@ msgstr "привести объект jsonb к типу %s нельзя" msgid "cannot cast jsonb array or object to type %s" msgstr "привести массив или объект jsonb к типу %s нельзя" -#: utils/adt/jsonb_util.c:756 +#: utils/adt/jsonb_util.c:753 #, c-format msgid "number of jsonb object pairs exceeds the maximum allowed (%zu)" msgstr "число пар объекта jsonb превышает предел (%zu)" -#: utils/adt/jsonb_util.c:797 +#: utils/adt/jsonb_util.c:794 #, c-format msgid "number of jsonb array elements exceeds the maximum allowed (%zu)" msgstr "число элементов массива jsonb превышает предел (%zu)" -#: utils/adt/jsonb_util.c:1671 utils/adt/jsonb_util.c:1691 +#: utils/adt/jsonb_util.c:1677 utils/adt/jsonb_util.c:1697 #, 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 +#: utils/adt/jsonb_util.c:1758 utils/adt/jsonb_util.c:1793 +#: utils/adt/jsonb_util.c:1813 #, c-format msgid "total size of jsonb object elements exceeds the maximum of %d bytes" msgstr "общий размер элементов объекта jsonb превышает предел (%d байт)" @@ -28939,12 +28970,12 @@ msgstr "недетерминированные правила сортировк msgid "LIKE pattern must not end with escape character" msgstr "шаблон LIKE не должен заканчиваться защитным символом" -#: utils/adt/like_match.c:293 utils/adt/regexp.c:800 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:803 #, c-format msgid "invalid escape string" msgstr "неверный защитный символ" -#: utils/adt/like_match.c:294 utils/adt/regexp.c:801 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:804 #, c-format msgid "Escape string must be empty or one character." msgstr "Защитный символ должен быть пустым или состоять из одного байта." @@ -29160,10 +29191,10 @@ msgstr "результат вне диапазона" msgid "cannot subtract inet values of different sizes" msgstr "нельзя вычитать значения inet разного размера" -#: 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 +#: utils/adt/numeric.c:793 utils/adt/numeric.c:3660 utils/adt/numeric.c:7217 +#: utils/adt/numeric.c:7420 utils/adt/numeric.c:7892 utils/adt/numeric.c:10587 +#: utils/adt/numeric.c:11062 utils/adt/numeric.c:11156 +#: utils/adt/numeric.c:11291 #, c-format msgid "value overflows numeric format" msgstr "значение переполняет формат numeric" @@ -29228,54 +29259,54 @@ msgstr "размер шага не может быть NaN" msgid "step size cannot be infinity" msgstr "размер шага не может быть бесконечностью" -#: utils/adt/numeric.c:3649 +#: utils/adt/numeric.c:3650 #, c-format msgid "factorial of a negative number is undefined" msgstr "факториал отрицательного числа даёт неопределённость" -#: utils/adt/numeric.c:4256 +#: utils/adt/numeric.c:4257 #, c-format msgid "lower bound cannot be NaN" msgstr "нижняя граница не может быть NaN" -#: utils/adt/numeric.c:4260 +#: utils/adt/numeric.c:4261 #, c-format msgid "lower bound cannot be infinity" msgstr "нижняя граница не может быть бесконечностью" -#: utils/adt/numeric.c:4267 +#: utils/adt/numeric.c:4268 #, c-format msgid "upper bound cannot be NaN" msgstr "верхняя граница не может быть NaN" -#: utils/adt/numeric.c:4271 +#: utils/adt/numeric.c:4272 #, 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 +#: utils/adt/numeric.c:4433 utils/adt/numeric.c:4521 utils/adt/numeric.c:4581 +#: utils/adt/numeric.c:4777 #, c-format msgid "cannot convert NaN to %s" msgstr "нельзя преобразовать NaN в %s" -#: utils/adt/numeric.c:4436 utils/adt/numeric.c:4524 utils/adt/numeric.c:4584 -#: utils/adt/numeric.c:4780 +#: utils/adt/numeric.c:4437 utils/adt/numeric.c:4525 utils/adt/numeric.c:4585 +#: utils/adt/numeric.c:4781 #, c-format msgid "cannot convert infinity to %s" msgstr "нельзя представить бесконечность в %s" -#: utils/adt/numeric.c:4789 +#: utils/adt/numeric.c:4790 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn вне диапазона" -#: utils/adt/numeric.c:7981 utils/adt/numeric.c:8032 +#: utils/adt/numeric.c:7982 utils/adt/numeric.c:8033 #, c-format msgid "numeric field overflow" msgstr "переполнение поля numeric" -#: utils/adt/numeric.c:7982 +#: utils/adt/numeric.c:7983 #, c-format msgid "" "A field with precision %d, scale %d must round to an absolute value less " @@ -29284,13 +29315,13 @@ msgstr "" "Поле с точностью %d, порядком %d должно округляться до абсолютного значения " "меньше чем %s%d." -#: utils/adt/numeric.c:8033 +#: utils/adt/numeric.c:8034 #, 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/numeric.c:11360 utils/adt/pseudorandomfuncs.c:135 #: utils/adt/pseudorandomfuncs.c:159 #, c-format msgid "lower bound must be less than or equal to upper bound" @@ -29623,7 +29654,7 @@ msgstr "Слишком много запятых." msgid "Junk after right parenthesis or bracket." msgstr "Мусор после правой скобки." -#: utils/adt/regexp.c:304 utils/adt/regexp.c:1996 utils/adt/varlena.c:4273 +#: utils/adt/regexp.c:304 utils/adt/regexp.c:2022 utils/adt/varlena.c:4273 #, c-format msgid "regular expression failed: %s" msgstr "ошибка в регулярном выражении: %s" @@ -29642,15 +29673,15 @@ msgstr "" "Если вы хотите вызвать regexp_replace() с параметром start, явно приведите " "четвёртый аргумент к целочисленному типу." -#: 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 +#: utils/adt/regexp.c:716 utils/adt/regexp.c:725 utils/adt/regexp.c:1108 +#: utils/adt/regexp.c:1172 utils/adt/regexp.c:1181 utils/adt/regexp.c:1190 +#: utils/adt/regexp.c:1199 utils/adt/regexp.c:1879 utils/adt/regexp.c:1888 +#: utils/adt/regexp.c:1897 utils/misc/guc.c:6831 utils/misc/guc.c:6865 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "неверное значение параметра \"%s\": %d" -#: utils/adt/regexp.c:936 +#: utils/adt/regexp.c:939 #, c-format msgid "" "SQL regular expression may not contain more than two escape-double-quote " @@ -29660,19 +29691,19 @@ 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 +#: utils/adt/regexp.c:1119 utils/adt/regexp.c:1210 utils/adt/regexp.c:1297 +#: utils/adt/regexp.c:1336 utils/adt/regexp.c:1724 utils/adt/regexp.c:1779 +#: utils/adt/regexp.c:1908 #, c-format msgid "%s does not support the \"global\" option" msgstr "%s не поддерживает режим \"global\"" -#: utils/adt/regexp.c:1312 +#: utils/adt/regexp.c:1338 #, c-format msgid "Use the regexp_matches function instead." msgstr "Вместо неё используйте функцию regexp_matches." -#: utils/adt/regexp.c:1500 +#: utils/adt/regexp.c:1526 #, c-format msgid "too many regular expression matches" msgstr "слишком много совпадений для регулярного выражения" @@ -29698,8 +29729,8 @@ msgid "Use NONE to denote the missing argument of a unary operator." msgstr "" "Чтобы обозначить отсутствующий аргумент унарного оператора, укажите NONE." -#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10509 -#: utils/adt/ruleutils.c:10722 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10526 +#: utils/adt/ruleutils.c:10739 #, c-format msgid "too many arguments" msgstr "слишком много аргументов" @@ -30129,12 +30160,12 @@ msgstr "массив весов не может содержать null" msgid "weight out of range" msgstr "вес вне диапазона" -#: utils/adt/tsvector.c:216 +#: utils/adt/tsvector.c:213 #, c-format msgid "word is too long (%ld bytes, max %ld bytes)" msgstr "слово слишком длинное (%ld Б, при максимуме %ld)" -#: utils/adt/tsvector.c:223 +#: utils/adt/tsvector.c:220 #, c-format msgid "string is too long for tsvector (%ld bytes, max %ld bytes)" msgstr "строка слишком длинна для tsvector (%ld Б, при максимуме %ld)" @@ -30445,32 +30476,32 @@ msgstr "ошибка в XML-комментарии" msgid "not an XML document" msgstr "не XML-документ" -#: utils/adt/xml.c:1008 utils/adt/xml.c:1031 +#: utils/adt/xml.c:1020 utils/adt/xml.c:1043 #, c-format msgid "invalid XML processing instruction" msgstr "неправильная XML-инструкция обработки (PI)" -#: utils/adt/xml.c:1009 +#: utils/adt/xml.c:1021 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "назначением XML-инструкции обработки (PI) не может быть \"%s\"." -#: utils/adt/xml.c:1032 +#: utils/adt/xml.c:1044 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "XML-инструкция обработки (PI) не может содержать \"?>\"." -#: utils/adt/xml.c:1111 +#: utils/adt/xml.c:1123 #, c-format msgid "xmlvalidate is not implemented" msgstr "функция xmlvalidate не реализована" -#: utils/adt/xml.c:1167 +#: utils/adt/xml.c:1179 #, c-format msgid "could not initialize XML library" msgstr "не удалось инициализировать библиотеку XML" -#: utils/adt/xml.c:1168 +#: utils/adt/xml.c:1180 #, c-format msgid "" "libxml2 has incompatible char type: sizeof(char)=%zu, sizeof(xmlChar)=%zu." @@ -30478,12 +30509,12 @@ msgstr "" "В libxml2 оказался несовместимый тип char: sizeof(char)=%zu, " "sizeof(xmlChar)=%zu." -#: utils/adt/xml.c:1254 +#: utils/adt/xml.c:1266 #, c-format msgid "could not set up XML error handler" msgstr "не удалось установить обработчик XML-ошибок" -#: utils/adt/xml.c:1255 +#: utils/adt/xml.c:1267 #, c-format msgid "" "This probably indicates that the version of libxml2 being used is not " @@ -30492,99 +30523,99 @@ msgstr "" "Возможно, это означает, что используемая версия libxml2 несовместима с " "заголовочными файлами libxml2, с которыми был собран PostgreSQL." -#: utils/adt/xml.c:2281 +#: utils/adt/xml.c:2283 msgid "Invalid character value." msgstr "Неверный символ." -#: utils/adt/xml.c:2284 +#: utils/adt/xml.c:2286 msgid "Space required." msgstr "Требуется пробел." -#: utils/adt/xml.c:2287 +#: utils/adt/xml.c:2289 msgid "standalone accepts only 'yes' or 'no'." msgstr "значениями атрибута standalone могут быть только 'yes' и 'no'." -#: utils/adt/xml.c:2290 +#: utils/adt/xml.c:2292 msgid "Malformed declaration: missing version." msgstr "Ошибочное объявление: не указана версия." -#: utils/adt/xml.c:2293 +#: utils/adt/xml.c:2295 msgid "Missing encoding in text declaration." msgstr "В объявлении не указана кодировка." -#: utils/adt/xml.c:2296 +#: utils/adt/xml.c:2298 msgid "Parsing XML declaration: '?>' expected." msgstr "Ошибка при разборе XML-объявления: ожидается '?>'." -#: utils/adt/xml.c:2299 +#: utils/adt/xml.c:2301 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "Нераспознанный код ошибки libxml: %d." -#: utils/adt/xml.c:2553 +#: utils/adt/xml.c:2555 #, c-format msgid "XML does not support infinite date values." msgstr "XML не поддерживает бесконечность в датах." -#: utils/adt/xml.c:2575 utils/adt/xml.c:2602 +#: utils/adt/xml.c:2577 utils/adt/xml.c:2604 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XML не поддерживает бесконечность в timestamp." -#: utils/adt/xml.c:3018 +#: utils/adt/xml.c:3020 #, c-format msgid "invalid query" msgstr "неверный запрос" -#: utils/adt/xml.c:3110 +#: utils/adt/xml.c:3112 #, c-format msgid "portal \"%s\" does not return tuples" msgstr "портал \"%s\" не возвращает кортежи" -#: utils/adt/xml.c:4362 +#: utils/adt/xml.c:4364 #, c-format msgid "invalid array for XML namespace mapping" msgstr "неправильный массив с сопоставлениями пространств имён XML" -#: utils/adt/xml.c:4363 +#: utils/adt/xml.c:4365 #, c-format msgid "" "The array must be two-dimensional with length of the second axis equal to 2." msgstr "Массив должен быть двухмерным и содержать 2 элемента по второй оси." -#: utils/adt/xml.c:4387 +#: utils/adt/xml.c:4389 #, c-format msgid "empty XPath expression" msgstr "пустое выражение XPath" -#: utils/adt/xml.c:4439 +#: utils/adt/xml.c:4441 #, c-format msgid "neither namespace name nor URI may be null" msgstr "ни префикс, ни URI пространства имён не может быть null" -#: utils/adt/xml.c:4446 +#: utils/adt/xml.c:4448 #, c-format msgid "could not register XML namespace with name \"%s\" and URI \"%s\"" msgstr "" "не удалось зарегистрировать пространство имён XML с префиксом \"%s\" и URI " "\"%s\"" -#: utils/adt/xml.c:4795 +#: utils/adt/xml.c:4797 #, c-format msgid "DEFAULT namespace is not supported" msgstr "пространство имён DEFAULT не поддерживается" -#: utils/adt/xml.c:4824 +#: utils/adt/xml.c:4826 #, c-format msgid "row path filter must not be empty string" msgstr "путь отбираемых строк не должен быть пустым" -#: utils/adt/xml.c:4858 +#: utils/adt/xml.c:4860 #, c-format msgid "column path filter must not be empty string" msgstr "путь отбираемого столбца не должен быть пустым" -#: utils/adt/xml.c:5005 +#: utils/adt/xml.c:5007 #, c-format msgid "more than one value returned by column XPath expression" msgstr "выражение XPath, отбирающее столбец, возвратило более одного значения" @@ -31087,7 +31118,7 @@ msgstr "" msgid "could not write lock file \"%s\": %m" msgstr "не удалось записать файл блокировки \"%s\": %m" -#: utils/init/miscinit.c:1591 utils/init/miscinit.c:1733 utils/misc/guc.c:5765 +#: utils/init/miscinit.c:1591 utils/init/miscinit.c:1733 utils/misc/guc.c:5770 #, c-format msgid "could not read from file \"%s\": %m" msgstr "не удалось прочитать файл \"%s\": %m" @@ -31394,7 +31425,7 @@ msgstr "ошибка в bind_textdomain_codeset" msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "неверная последовательность байт для кодировки \"%s\": %s" -#: utils/mb/mbutils.c:1751 +#: utils/mb/mbutils.c:1759 #, c-format msgid "" "character with byte sequence %s in encoding \"%s\" has no equivalent in " @@ -31590,7 +31621,7 @@ 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 +#: utils/misc/guc.c:6767 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "нет прав для изменения параметра \"%s\"" @@ -31617,12 +31648,12 @@ msgstr "параметр \"%s\" нельзя сбросить" 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 +#: utils/misc/guc.c:4370 utils/misc/guc.c:4418 utils/misc/guc.c:5455 #, 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 +#: utils/misc/guc.c:4371 utils/misc/guc.c:4419 utils/misc/guc.c:5456 #, c-format msgid "" "Only roles with privileges of the \"%s\" role may examine this parameter." @@ -31638,47 +31669,47 @@ msgstr "команда ALTER SYSTEM запрещена в этом окруже msgid "permission denied to perform ALTER SYSTEM RESET ALL" msgstr "нет прав для выполнения ALTER SYSTEM RESET ALL" -#: utils/misc/guc.c:4740 +#: utils/misc/guc.c:4745 #, c-format msgid "parameter value for ALTER SYSTEM must not contain a newline" msgstr "значение параметра для ALTER SYSTEM не должно быть многострочным" -#: utils/misc/guc.c:4785 +#: utils/misc/guc.c:4790 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "не удалось разобрать содержимое файла \"%s\"" -#: utils/misc/guc.c:4967 +#: utils/misc/guc.c:4972 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "попытка переопределить параметр \"%s\"" -#: utils/misc/guc.c:5306 +#: utils/misc/guc.c:5311 #, c-format msgid "invalid configuration parameter name \"%s\", removing it" msgstr "неверное имя параметра конфигурации: \"%s\", он удаляется" -#: utils/misc/guc.c:5308 +#: utils/misc/guc.c:5313 #, c-format msgid "\"%s\" is now a reserved prefix." msgstr "Теперь \"%s\" — зарезервированный префикс." -#: utils/misc/guc.c:6179 +#: utils/misc/guc.c:6184 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "при назначении параметру \"%s\" значения \"%s\"" -#: utils/misc/guc.c:6348 +#: utils/misc/guc.c:6353 #, c-format msgid "parameter \"%s\" could not be set" msgstr "параметр \"%s\" нельзя установить" -#: utils/misc/guc.c:6438 +#: utils/misc/guc.c:6443 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "не удалось разобрать значение параметра \"%s\"" -#: utils/misc/guc.c:6888 +#: utils/misc/guc.c:6899 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "неверное значение параметра \"%s\": %g" @@ -34909,109 +34940,114 @@ msgstr "" msgid "unrecognized column option \"%s\"" msgstr "нераспознанный параметр столбца \"%s\"" -#: gram.y:14147 +#: gram.y:14098 +#, c-format +msgid "option name \"%s\" cannot be used in XMLTABLE" +msgstr "имя параметра \"%s\" не может использоваться в XMLTABLE" + +#: gram.y:14154 #, c-format msgid "only string constants are supported in JSON_TABLE path specification" msgstr "в указании пути JSON_TABLE поддерживаются только строковые константы" -#: gram.y:14469 +#: gram.y:14476 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "тип float должен иметь точность минимум 1 бит" -#: gram.y:14478 +#: gram.y:14485 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "тип float должен иметь точность меньше 54 бит" -#: gram.y:14995 +#: gram.y:15002 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "неверное число параметров в левой части выражения OVERLAPS" -#: gram.y:15000 +#: gram.y:15007 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "неверное число параметров в правой части выражения OVERLAPS" -#: gram.y:15177 +#: gram.y:15184 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "предикат UNIQUE ещё не реализован" -#: gram.y:15591 +#: gram.y:15598 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "ORDER BY с WITHIN GROUP можно указать только один раз" -#: gram.y:15596 +#: gram.y:15603 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "DISTINCT нельзя использовать с WITHIN GROUP" -#: gram.y:15601 +#: gram.y:15608 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "VARIADIC нельзя использовать с WITHIN GROUP" -#: gram.y:16328 gram.y:16352 +#: gram.y:16335 gram.y:16359 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "началом рамки не может быть UNBOUNDED FOLLOWING" -#: gram.y:16333 +#: gram.y:16340 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "" "рамка, начинающаяся со следующей строки, не может заканчиваться текущей" -#: gram.y:16357 +#: gram.y:16364 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "концом рамки не может быть UNBOUNDED PRECEDING" -#: gram.y:16363 +#: gram.y:16370 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "" "рамка, начинающаяся с текущей строки, не может иметь предшествующих строк" -#: gram.y:16370 +#: gram.y:16377 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "" "рамка, начинающаяся со следующей строки, не может иметь предшествующих строк" -#: gram.y:16919 +#: gram.y:16926 #, c-format msgid "unrecognized JSON encoding: %s" msgstr "нераспознанная кодировка JSON: %s" -#: gram.y:17243 +#: gram.y:17250 #, c-format msgid "type modifier cannot have parameter name" msgstr "параметр функции-модификатора типа должен быть безымянным" -#: gram.y:17249 +#: gram.y:17256 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "модификатор типа не может включать ORDER BY" -#: gram.y:17317 gram.y:17324 gram.y:17331 +#: gram.y:17324 gram.y:17331 gram.y:17338 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s нельзя использовать здесь как имя роли" -#: gram.y:17421 gram.y:18906 +#: gram.y:17428 gram.y:18913 #, c-format msgid "WITH TIES cannot be specified without ORDER BY clause" msgstr "WITH TIES нельзя задать без предложения ORDER BY" -#: gram.y:18597 gram.y:18772 +#: gram.y:18604 gram.y:18779 msgid "improper use of \"*\"" msgstr "недопустимое использование \"*\"" -#: gram.y:18836 +#: gram.y:18843 #, c-format msgid "" "an ordered-set aggregate with a VARIADIC direct argument must have one " @@ -35020,70 +35056,70 @@ msgstr "" "сортирующая агрегатная функция с непосредственным аргументом VARIADIC должна " "иметь один агрегатный аргумент VARIADIC того же типа данных" -#: gram.y:18873 +#: gram.y:18880 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "ORDER BY можно указать только один раз" -#: gram.y:18884 +#: gram.y:18891 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "OFFSET можно указать только один раз" -#: gram.y:18893 +#: gram.y:18900 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "LIMIT можно указать только один раз" -#: gram.y:18902 +#: gram.y:18909 #, c-format msgid "multiple limit options not allowed" msgstr "параметры LIMIT можно указать только один раз" -#: gram.y:18929 +#: gram.y:18936 #, c-format msgid "multiple WITH clauses not allowed" msgstr "WITH можно указать только один раз" -#: gram.y:19122 +#: gram.y:19129 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "в табличных функциях не может быть аргументов OUT и INOUT" -#: gram.y:19255 +#: gram.y:19262 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "COLLATE можно указать только один раз" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:19293 gram.y:19306 +#: gram.y:19300 gram.y:19313 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "ограничения %s не могут иметь характеристики DEFERRABLE" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:19319 +#: gram.y:19326 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "ограничения %s не могут иметь характеристики NOT VALID" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:19332 +#: gram.y:19339 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "ограничения %s не могут иметь характеристики NO INHERIT" -#: gram.y:19354 +#: gram.y:19361 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "нераспознанная стратегия секционирования \"%s\"" -#: gram.y:19378 +#: gram.y:19385 #, c-format msgid "invalid publication object list" msgstr "неверный список объектов публикации" -#: gram.y:19379 +#: gram.y:19386 #, c-format msgid "" "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table " @@ -35092,22 +35128,22 @@ msgstr "" "Перед именем отдельной таблицы или схемы нужно указать TABLE либо TABLES IN " "SCHEMA." -#: gram.y:19395 +#: gram.y:19402 #, c-format msgid "invalid table name" msgstr "неверное имя таблицы" -#: gram.y:19416 +#: gram.y:19423 #, c-format msgid "WHERE clause not allowed for schema" msgstr "предложение WHERE не допускается для схемы" -#: gram.y:19423 +#: gram.y:19430 #, c-format msgid "column specification not allowed for schema" msgstr "указание столбца не допускается для схемы" -#: gram.y:19437 +#: gram.y:19444 #, c-format msgid "invalid schema name" msgstr "неверное имя схемы" @@ -35363,6 +35399,30 @@ msgstr "нестандартное использование спецсимво msgid "Use the escape string syntax for escapes, e.g., E'\\r\\n'." msgstr "Используйте для записи спецсимволов синтаксис спецстрок E'\\r\\n'." +#, c-format +#~ msgid "\"%s\" must be set to -1 during binary upgrade mode." +#~ msgstr "Параметр \"%s\" должен быть равен -1 в режиме двоичного обновления." + +#, c-format +#~ msgid "oversize GSSAPI packet sent by the client (%zu > %d)" +#~ msgstr "клиент передал чрезмерно большой пакет GSSAPI (%zu > %d)" + +#, c-format +#~ msgid "" +#~ "could not synchronize replication slot \"%s\" because remote slot " +#~ "precedes local slot" +#~ msgstr "" +#~ "синхронизировать слот репликации \"%s\" не удалось, так как состояние " +#~ "удалённого слота предшествует локальному" + +#, c-format +#~ msgid "" +#~ "Logical decoding could not find consistent point from local slot's LSN %X/" +#~ "%X." +#~ msgstr "" +#~ "При логическом декодировании не удалось найти точку согласованности от " +#~ "LSN локального слота %X/%X." + #, c-format #~ msgid "cannot use RETURNING type %s in %s" #~ msgstr "использовать в RETURNING тип %s в %s нельзя" @@ -38148,9 +38208,6 @@ msgstr "Используйте для записи спецсимволов си #~ msgid "cannot copy to foreign table \"%s\"" #~ msgstr "копировать в стороннюю таблицу \"%s\" нельзя" -#~ msgid "cannot route inserted tuples to a foreign table" -#~ msgstr "направить вставляемые кортежи в стороннюю таблицу нельзя" - #~ msgid "unrecognized function attribute \"%s\" ignored" #~ msgstr "нераспознанный атрибут функции \"%s\" --- игнорируется" diff --git a/src/backend/po/sv.po b/src/backend/po/sv.po index db87d04a3c232..0ec316deecbcf 100644 --- a/src/backend/po/sv.po +++ b/src/backend/po/sv.po @@ -23,8 +23,8 @@ 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:46+0000\n" -"PO-Revision-Date: 2025-02-12 20:52+0100\n" +"POT-Creation-Date: 2025-08-09 05:15+0000\n" +"PO-Revision-Date: 2025-08-09 20:15+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -104,15 +104,15 @@ msgstr "kunde inte öppna filen \"%s\" för läsning: %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:1353 access/transam/xlog.c:3477 -#: access/transam/xlog.c:4341 access/transam/xlogrecovery.c:1238 +#: access/transam/twophase.c:1353 access/transam/xlog.c:3459 +#: access/transam/xlog.c:4323 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 +#: replication/logical/reorderbuffer.c:5243 +#: replication/logical/snapbuild.c:2099 replication/slot.c:2232 +#: replication/slot.c:2273 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 @@ -120,10 +120,10 @@ msgid "could not read file \"%s\": %m" msgstr "kunde inte läsa fil \"%s\": %m" #: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 -#: access/transam/xlog.c:3482 access/transam/xlog.c:4346 +#: access/transam/xlog.c:3464 access/transam/xlog.c:4328 #: 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 +#: replication/logical/snapbuild.c:2104 replication/slot.c:2236 +#: replication/slot.c:2277 replication/walsender.c:664 #: utils/cache/relmapper.c:833 #, c-format msgid "could not read file \"%s\": read %d of %zu" @@ -134,17 +134,17 @@ msgstr "kunde inte läsa fil \"%s\": läste %d av %zu" #: 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 +#: access/transam/twophase.c:1784 access/transam/xlog.c:3305 +#: access/transam/xlog.c:3499 access/transam/xlog.c:3504 +#: access/transam/xlog.c:3640 access/transam/xlog.c:4293 +#: access/transam/xlog.c:5228 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 +#: replication/logical/reorderbuffer.c:5295 +#: replication/logical/snapbuild.c:1866 replication/logical/snapbuild.c:1990 +#: replication/slot.c:2122 replication/slot.c:2284 replication/walsender.c:674 +#: storage/file/copydir.c:208 storage/file/copydir.c:213 storage/file/fd.c:825 +#: storage/file/fd.c:3750 storage/file/fd.c:3856 utils/cache/relmapper.c:841 #: utils/cache/relmapper.c:956 #, c-format msgid "could not close file \"%s\": %m" @@ -172,31 +172,31 @@ msgstr "" #: ../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/twophase.c:1309 access/transam/xlog.c:3212 +#: access/transam/xlog.c:3375 access/transam/xlog.c:3414 +#: access/transam/xlog.c:3607 access/transam/xlog.c:4313 #: 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 +#: replication/logical/reorderbuffer.c:3896 +#: replication/logical/reorderbuffer.c:4450 +#: replication/logical/reorderbuffer.c:5223 +#: replication/logical/snapbuild.c:1821 replication/logical/snapbuild.c:1931 +#: replication/slot.c:2204 replication/walsender.c:632 +#: replication/walsender.c:3085 storage/file/copydir.c:151 +#: storage/file/fd.c:800 storage/file/fd.c:3507 storage/file/fd.c:3737 +#: storage/file/fd.c:3827 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 +#: utils/init/miscinit.c:1791 utils/misc/guc.c:4782 utils/misc/guc.c:4832 #, c-format msgid "could not open file \"%s\": %m" msgstr "kunde inte öppna fil \"%s\": %m" #: ../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 +#: access/transam/xlog.c:9306 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 @@ -210,12 +210,12 @@ msgstr "kunde inte skriva fil \"%s\": %m" #: 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 +#: access/transam/xlog.c:3298 access/transam/xlog.c:3493 +#: access/transam/xlog.c:4286 access/transam/xlog.c:8681 +#: access/transam/xlog.c:8726 backup/basebackup_server.c:207 +#: commands/dbcommands.c:514 replication/logical/snapbuild.c:1859 +#: replication/slot.c:2108 replication/slot.c:2214 storage/file/fd.c:817 +#: storage/file/fd.c:3848 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" @@ -229,21 +229,22 @@ msgstr "kunde inte fsync:a fil \"%s\": %m" #: ../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 +#: access/transam/xlogrecovery.c:564 lib/dshash.c:253 libpq/auth.c:1360 +#: libpq/auth.c:1404 libpq/auth.c:1961 libpq/be-secure-gssapi.c:534 +#: libpq/be-secure-gssapi.c:714 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 +#: replication/logical/logical.c:212 replication/walsender.c:839 +#: storage/buffer/localbuf.c:606 storage/file/fd.c:909 storage/file/fd.c:1440 +#: storage/file/fd.c:1601 storage/file/fd.c:2528 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/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 @@ -327,7 +328,7 @@ msgstr "slut på minne\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "kan inte duplicera null-pekare (internt fel)\n" -#: ../common/file_utils.c:76 storage/file/fd.c:3516 +#: ../common/file_utils.c:76 storage/file/fd.c:3513 #, c-format msgid "could not synchronize file system for file \"%s\": %m" msgstr "kan inte synkronisera filsystemet för fil \"%s\": %m" @@ -339,8 +340,8 @@ msgstr "kan inte synkronisera filsystemet för fil \"%s\": %m" #: 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 +#: replication/logical/snapbuild.c:1717 replication/logical/snapbuild.c:2220 +#: storage/file/fd.c:1965 storage/file/fd.c:2051 storage/file/fd.c:3561 #: 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 @@ -355,22 +356,22 @@ 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 +#: storage/file/fd.c:2930 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:169 ../common/file_utils.c:315 -#: ../common/pgfnames.c:69 ../common/rmtree.c:106 storage/file/fd.c:2945 +#: ../common/pgfnames.c:69 ../common/rmtree.c:106 storage/file/fd.c:2942 #, c-format msgid "could not read directory \"%s\": %m" msgstr "kunde inte läsa katalog \"%s\": %m" #: ../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 +#: replication/logical/snapbuild.c:1878 replication/slot.c:936 +#: replication/slot.c:1994 replication/slot.c:2136 storage/file/fd.c:835 #: utils/time/snapmgr.c:1255 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" @@ -380,101 +381,101 @@ msgstr "kunde inte döpa om fil \"%s\" till \"%s\": %m" msgid "internal error" msgstr "internt fel" -#: ../common/jsonapi.c:2121 +#: ../common/jsonapi.c:2124 msgid "Recursive descent parser cannot use incremental lexer." msgstr "Recursive-descent-parser kan inte använda inkrementell lexer." -#: ../common/jsonapi.c:2123 +#: ../common/jsonapi.c:2126 msgid "Incremental parser requires incremental lexer." msgstr "Inkrementell parser kräver en inkrementell lexer." -#: ../common/jsonapi.c:2125 +#: ../common/jsonapi.c:2128 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 +#: ../common/jsonapi.c:2130 #, c-format msgid "Escape sequence \"\\%.*s\" is invalid." msgstr "Escape-sekvens \"\\%.*s\" är ogiltig." -#: ../common/jsonapi.c:2131 +#: ../common/jsonapi.c:2134 #, 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 +#: ../common/jsonapi.c:2138 #, c-format msgid "Expected end of input, but found \"%.*s\"." msgstr "Förväntade slut på indata, men hittade \"%.*s\"." -#: ../common/jsonapi.c:2138 +#: ../common/jsonapi.c:2141 #, c-format msgid "Expected array element or \"]\", but found \"%.*s\"." msgstr "Färväntade array-element eller \"]\", men hittade \"%.*s\"." -#: ../common/jsonapi.c:2141 +#: ../common/jsonapi.c:2144 #, c-format msgid "Expected \",\" or \"]\", but found \"%.*s\"." msgstr "Förväntade \",\" eller \"]\", men hittade \"%.*s\"." -#: ../common/jsonapi.c:2144 +#: ../common/jsonapi.c:2147 #, c-format msgid "Expected \":\", but found \"%.*s\"." msgstr "Förväntade sig \":\" men hittade \"%.*s\"." -#: ../common/jsonapi.c:2147 +#: ../common/jsonapi.c:2150 #, c-format msgid "Expected JSON value, but found \"%.*s\"." msgstr "Förväntade JSON-värde, men hittade \"%.*s\"." -#: ../common/jsonapi.c:2150 +#: ../common/jsonapi.c:2153 msgid "The input string ended unexpectedly." msgstr "Indatasträngen avslutades oväntat." -#: ../common/jsonapi.c:2152 +#: ../common/jsonapi.c:2155 #, c-format msgid "Expected string or \"}\", but found \"%.*s\"." msgstr "Färväntade sträng eller \"}\", men hittade \"%.*s\"." -#: ../common/jsonapi.c:2155 +#: ../common/jsonapi.c:2158 #, c-format msgid "Expected \",\" or \"}\", but found \"%.*s\"." msgstr "Förväntade sig \",\" eller \"}\" men hittade \"%.*s\"." -#: ../common/jsonapi.c:2158 +#: ../common/jsonapi.c:2161 #, c-format msgid "Expected string, but found \"%.*s\"." msgstr "Förväntade sträng, men hittade \"%.*s\"." -#: ../common/jsonapi.c:2161 +#: ../common/jsonapi.c:2164 #, c-format msgid "Token \"%.*s\" is invalid." msgstr "Token \"%.*s\" är ogiltig." -#: ../common/jsonapi.c:2164 jsonpath_scan.l:608 +#: ../common/jsonapi.c:2167 jsonpath_scan.l:608 #, c-format msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 kan inte konverteras till text." -#: ../common/jsonapi.c:2166 +#: ../common/jsonapi.c:2169 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\" måste följas av fyra hexdecimala siffror." -#: ../common/jsonapi.c:2169 +#: ../common/jsonapi.c:2172 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 +#: ../common/jsonapi.c:2181 #, 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 +#: ../common/jsonapi.c:2188 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:2187 jsonpath_scan.l:652 jsonpath_scan.l:662 +#: ../common/jsonapi.c:2190 jsonpath_scan.l:652 jsonpath_scan.l:662 #: jsonpath_scan.l:713 #, c-format msgid "Unicode low surrogate must follow a high surrogate." @@ -660,8 +661,8 @@ 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 +#: utils/misc/guc.c:3283 utils/misc/guc.c:4712 utils/misc/guc.c:6942 +#: utils/misc/guc.c:6983 #, c-format msgid "invalid value for parameter \"%s\": \"%s\"" msgstr "ogiltigt värde för parameter \"%s\": \"%s\"" @@ -725,10 +726,10 @@ msgstr "kunde inte hämta statuskod för underprocess: felkod %lu" #: 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 +#: replication/logical/reorderbuffer.c:4719 +#: replication/logical/snapbuild.c:1759 replication/logical/snapbuild.c:2193 +#: replication/slot.c:2188 storage/file/fd.c:875 storage/file/fd.c:3375 +#: storage/file/fd.c:3437 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 @@ -736,8 +737,8 @@ msgid "could not remove file \"%s\": %m" msgstr "kunde inte ta bort fil \"%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 +#: commands/tablespace.c:815 commands/tablespace.c:905 storage/file/fd.c:3367 +#: storage/file/fd.c:3776 #, c-format msgid "could not remove directory \"%s\": %m" msgstr "kunde inte ta bort katalog \"%s\": %m" @@ -775,7 +776,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:1888 +#: ../common/username.c:45 libpq/auth.c:1896 msgid "user does not exist" msgstr "användaren finns inte" @@ -907,7 +908,7 @@ msgstr "kunde inte kontrollera access-token-medlemskap: felkod %lu\n" 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:1385 access/brin/brin.c:1493 access/gin/ginfast.c:1040 +#: 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 @@ -916,34 +917,34 @@ msgstr "förfrågan efter BRIN-intervallsummering för index \"%s\" sida %u har msgid "recovery is in progress" msgstr "återställning pågår" -#: access/brin/brin.c:1386 access/brin/brin.c:1494 +#: access/brin/brin.c:1388 access/brin/brin.c:1496 #, 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:1391 access/brin/brin.c:1499 +#: access/brin/brin.c:1393 access/brin/brin.c:1501 #, c-format msgid "block number out of range: %lld" msgstr "blocknummer är utanför giltigt intervall: %lld" -#: access/brin/brin.c:1436 access/brin/brin.c:1525 +#: access/brin/brin.c:1438 access/brin/brin.c:1527 #, c-format msgid "\"%s\" is not a BRIN index" msgstr "\"%s\" är inte ett BRIN-index" -#: access/brin/brin.c:1452 access/brin/brin.c:1541 +#: access/brin/brin.c:1454 access/brin/brin.c:1543 #, 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.c:1461 access/brin/brin.c:1557 access/gin/ginfast.c:1085 +#: access/brin/brin.c:1463 access/brin/brin.c:1559 access/gin/ginfast.c:1085 #: parser/parse_utilcmd.c:2277 #, c-format msgid "index \"%s\" is not valid" msgstr "index \"%s\" är inte giltigt" -#: 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 +#: 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 @@ -954,7 +955,7 @@ msgstr "kan inte acceptera ett värde av type %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/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\"" @@ -1092,67 +1093,72 @@ msgstr "överskriden gräns för användardefinierade relationsparametertyper" msgid "RESET must not include values for parameters" msgstr "RESET får inte ha med värden på parametrar" -#: access/common/reloptions.c:1263 +#: access/common/reloptions.c:1264 #, c-format msgid "unrecognized parameter namespace \"%s\"" msgstr "okänd parameternamnrymd \"%s\"" -#: access/common/reloptions.c:1300 commands/variable.c:1214 +#: access/common/reloptions.c:1294 commands/foreigncmds.c:86 +#, c-format +msgid "invalid option name \"%s\": must not contain \"=\"" +msgstr "ogiltigt flaggnamn \"%s\": får inte innehålla \"=\"" + +#: access/common/reloptions.c:1309 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:1468 +#: access/common/reloptions.c:1477 #, c-format msgid "unrecognized parameter \"%s\"" msgstr "okänd parameter \"%s\"" -#: access/common/reloptions.c:1580 +#: access/common/reloptions.c:1589 #, c-format msgid "parameter \"%s\" specified more than once" msgstr "parameter \"%s\" angiven mer än en gång" -#: access/common/reloptions.c:1596 +#: access/common/reloptions.c:1605 #, c-format msgid "invalid value for boolean option \"%s\": %s" msgstr "ogiltigt värde för booleansk flagga \"%s\": \"%s\"" -#: access/common/reloptions.c:1608 +#: access/common/reloptions.c:1617 #, c-format msgid "invalid value for integer option \"%s\": %s" msgstr "ogiltigt värde för heltalsflagga \"%s\": \"%s\"" -#: access/common/reloptions.c:1614 access/common/reloptions.c:1634 +#: access/common/reloptions.c:1623 access/common/reloptions.c:1643 #, 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:1616 +#: access/common/reloptions.c:1625 #, c-format msgid "Valid values are between \"%d\" and \"%d\"." msgstr "Giltiga värden är mellan \"%d\" och \"%d\"." -#: access/common/reloptions.c:1628 +#: access/common/reloptions.c:1637 #, c-format msgid "invalid value for floating point option \"%s\": %s" msgstr "ogiltigt värde för flyttalsflagga \"%s\": %s" -#: access/common/reloptions.c:1636 +#: access/common/reloptions.c:1645 #, c-format msgid "Valid values are between \"%f\" and \"%f\"." msgstr "Giltiga värden är mellan \"%f\" och \"%f\"." -#: access/common/reloptions.c:1658 +#: access/common/reloptions.c:1667 #, c-format msgid "invalid value for enum option \"%s\": %s" msgstr "ogiltigt värde för enum-flagga \"%s\": %s" -#: access/common/reloptions.c:1989 +#: access/common/reloptions.c:1998 #, 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 +#: access/common/reloptions.c:1999 #, c-format msgid "Specify storage parameters for its leaf partitions instead." msgstr "Ange lagringsparametrar för dess löv-partition istället." @@ -1197,18 +1203,18 @@ msgstr "kan inte flytta temporära index tillhörande andra sessioner" msgid "failed to re-find tuple within index \"%s\"" msgstr "misslyckades att återfinna tuple i index \"%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 "gamla GIN-index stöder inte hela-index-scan eller sökningar efter null" -#: access/gin/ginscan.c:432 +#: access/gin/ginscan.c:437 #, c-format msgid "To fix this, do REINDEX INDEX \"%s\"." msgstr "För att fixa detta, kör REINDEX INDEX \"%s\"." #: access/gin/ginutil.c:147 executor/execExpr.c:2200 -#: utils/adt/arrayfuncs.c:4016 utils/adt/arrayfuncs.c:6712 +#: 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" @@ -1250,7 +1256,7 @@ msgstr "Detta orsakas av en inkomplett siduppdelning under krashåterställning msgid "Please REINDEX it." msgstr "Var vänlig och kör REINDEX på det." -#: access/gist/gist.c:1196 +#: access/gist/gist.c:1203 #, c-format msgid "fixing incomplete split in index \"%s\", block %u" msgstr "lagar ofärdig split i index \"%s\", block %u" @@ -1293,9 +1299,9 @@ msgstr "operatorfamiljen \"%s\" för accessmetod %s innehåller en inkorrekt ORD 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: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 +#: 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:18242 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 @@ -1350,39 +1356,39 @@ 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:2206 +#: access/heap/heapam.c:2241 #, 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:2725 +#: access/heap/heapam.c:2764 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "kan inte radera tupler under en parallell operation" -#: access/heap/heapam.c:2772 +#: access/heap/heapam.c:2811 #, c-format msgid "attempted to delete invisible tuple" msgstr "försökte ta bort en osynlig tuple" -#: access/heap/heapam.c:3220 access/heap/heapam.c:6501 access/index/genam.c:818 +#: access/heap/heapam.c:3261 access/heap/heapam.c:6542 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:3397 +#: access/heap/heapam.c:3438 #, c-format msgid "attempted to update invisible tuple" msgstr "försökte uppdatera en osynlig tuple" -#: access/heap/heapam.c:4908 access/heap/heapam.c:4946 -#: access/heap/heapam.c:5211 access/heap/heapam_handler.c:468 +#: access/heap/heapam.c:4949 access/heap/heapam.c:4987 +#: access/heap/heapam.c:5252 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.c:6314 commands/trigger.c:3340 -#: executor/nodeModifyTable.c:2376 executor/nodeModifyTable.c:2467 +#: access/heap/heapam.c:6355 commands/trigger.c:3427 +#: executor/nodeModifyTable.c:2399 executor/nodeModifyTable.c:2490 #, 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" @@ -1404,13 +1410,13 @@ msgstr "kunde inte skriva till fil \"%s\", skrev %d av %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:3255 access/transam/xlog.c:3446 -#: access/transam/xlog.c:4283 access/transam/xlog.c:9269 +#: access/transam/xlog.c:3237 access/transam/xlog.c:3428 +#: access/transam/xlog.c:4265 access/transam/xlog.c:9295 #: 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 +#: replication/slot.c:2055 storage/file/copydir.c:157 storage/smgr/md.c:230 #: utils/time/snapmgr.c:1234 #, c-format msgid "could not create file \"%s\": %m" @@ -1423,15 +1429,15 @@ msgstr "kunde inte trunkera fil \"%s\" till %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:3305 access/transam/xlog.c:3502 -#: access/transam/xlog.c:4295 commands/dbcommands.c:506 +#: access/transam/xlog.c:3287 access/transam/xlog.c:3484 +#: access/transam/xlog.c:4277 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 +#: replication/logical/origin.c:676 replication/logical/snapbuild.c:1835 +#: replication/slot.c:2090 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/misc/guc.c:4522 utils/misc/guc.c:5680 utils/misc/guc.c:5698 #: utils/time/snapmgr.c:1239 utils/time/snapmgr.c:1246 #, c-format msgid "could not write to file \"%s\": %m" @@ -1563,22 +1569,22 @@ msgstr "WAL-användning: %lld poster, %lld hela sidor, %llu bytes\n" msgid "system usage: %s" msgstr "systemanvändning: %s" -#: access/heap/vacuumlazy.c:2170 +#: access/heap/vacuumlazy.c:2178 #, 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:2324 +#: access/heap/vacuumlazy.c:2332 #, 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:2327 +#: access/heap/vacuumlazy.c:2335 #, 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:2328 +#: access/heap/vacuumlazy.c:2336 #, c-format msgid "" "Consider increasing configuration parameter \"maintenance_work_mem\" or \"autovacuum_work_mem\".\n" @@ -1587,67 +1593,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:2590 +#: access/heap/vacuumlazy.c:2598 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "\"%s\": stoppar trunkering pga konfliktande låskrav" -#: access/heap/vacuumlazy.c:2660 +#: access/heap/vacuumlazy.c:2668 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "tabell \"%s\": trunkerade %u till %u sidor" -#: access/heap/vacuumlazy.c:2722 +#: access/heap/vacuumlazy.c:2730 #, 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:2841 +#: access/heap/vacuumlazy.c:2849 #, 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:3108 +#: access/heap/vacuumlazy.c:3116 #, 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:3111 +#: access/heap/vacuumlazy.c:3119 #, 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:3115 +#: access/heap/vacuumlazy.c:3123 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "vid skanning av relation \"%s.%s\"" -#: access/heap/vacuumlazy.c:3123 +#: access/heap/vacuumlazy.c:3131 #, 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:3126 +#: access/heap/vacuumlazy.c:3134 #, 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:3130 +#: access/heap/vacuumlazy.c:3138 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "vid vacuum av relation \"%s.%s\"" -#: access/heap/vacuumlazy.c:3135 commands/vacuumparallel.c:1112 +#: access/heap/vacuumlazy.c:3143 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:3140 commands/vacuumparallel.c:1118 +#: access/heap/vacuumlazy.c:3148 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:3146 +#: access/heap/vacuumlazy.c:3154 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "vid trunkering av relation \"%s.%s\" till %u block" @@ -1673,8 +1679,8 @@ 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 +#: commands/indexcmds.c:2885 commands/tablecmds.c:281 commands/tablecmds.c:305 +#: commands/tablecmds.c:17937 commands/tablecmds.c:19834 #, c-format msgid "\"%s\" is not an index" msgstr "\"%s\" är inte ett index" @@ -1720,17 +1726,17 @@ msgstr "index \"%s\" innehåller en halvdöd intern sida" 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:5108 +#: access/nbtree/nbtutils.c:5114 #, 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:5114 +#: access/nbtree/nbtutils.c:5120 #, 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:5118 +#: access/nbtree/nbtutils.c:5124 #, c-format msgid "" "Values larger than 1/3 of a buffer page cannot be indexed.\n" @@ -1771,7 +1777,7 @@ 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/tableam.c:255 +#: access/table/tableam.c:256 #, c-format msgid "tid (%u, %u) is not valid for relation \"%s\"" msgstr "tid (%u, %u) är inte giltigt för relation \"%s\"" @@ -2220,8 +2226,8 @@ 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:1419 access/transam/xlogrecovery.c:565 -#: postmaster/walsummarizer.c:936 replication/logical/logical.c:211 -#: replication/walsender.c:836 +#: postmaster/walsummarizer.c:936 replication/logical/logical.c:213 +#: replication/walsender.c:840 #, c-format msgid "Failed while allocating a WAL reading processor." msgstr "Misslyckades vid allokering av en WAL-läs-processor." @@ -2298,7 +2304,7 @@ msgstr "kunde inte återställa tvåfas-statusfil för transaktion %u" 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 +#: access/transam/twophase.c:2524 storage/file/fd.c:511 utils/fmgr/dfmgr.c:209 #, c-format msgid "could not access file \"%s\": %m" msgstr "kunde inte komma åt filen \"%s\": %m" @@ -2462,464 +2468,459 @@ msgstr "kan inte rulla tillbaka till sparpunkt 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/xlog.c:1542 +#: access/transam/xlog.c:1543 #, 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" -#: access/transam/xlog.c:1769 +#: access/transam/xlog.c:1770 #, c-format 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:2210 access/transam/xlog.c:4501 +#: access/transam/xlog.c:2211 access/transam/xlog.c:4483 #, 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." -#: 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:2477 +#: access/transam/xlog.c:2459 #, 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" -#: access/transam/xlog.c:3739 access/transam/xlogutils.c:831 -#: replication/walsender.c:3045 +#: access/transam/xlog.c:3721 access/transam/xlogutils.c:831 +#: replication/walsender.c:3079 #, 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:4061 +#: access/transam/xlog.c:4043 #, c-format msgid "could not rename file \"%s\": %m" msgstr "kunde inte byta namn på fil \"%s\": %m" -#: access/transam/xlog.c:4104 access/transam/xlog.c:4115 -#: access/transam/xlog.c:4136 +#: access/transam/xlog.c:4086 access/transam/xlog.c:4097 +#: access/transam/xlog.c:4118 #, c-format msgid "required WAL directory \"%s\" does not exist" msgstr "krävd WAL-katalog \"%s\" finns inte" -#: access/transam/xlog.c:4121 access/transam/xlog.c:4142 +#: access/transam/xlog.c:4103 access/transam/xlog.c:4124 #, c-format msgid "creating missing WAL directory \"%s\"" msgstr "skapar saknad WAL-katalog \"%s\"" -#: access/transam/xlog.c:4125 access/transam/xlog.c:4145 +#: access/transam/xlog.c:4107 access/transam/xlog.c:4127 #: 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:4212 +#: access/transam/xlog.c:4194 #, c-format msgid "could not generate secret authorization token" msgstr "kunde inte generera hemligt auktorisationstoken" -#: 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:4345 access/transam/xlog.c:4355 +#: access/transam/xlog.c:4381 access/transam/xlog.c:4389 +#: access/transam/xlog.c:4397 access/transam/xlog.c:4403 +#: access/transam/xlog.c:4411 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: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:4364 +#: access/transam/xlog.c:4346 #, 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:4368 +#: access/transam/xlog.c:4350 #, 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:4374 +#: access/transam/xlog.c:4356 #, 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:4377 access/transam/xlog.c:4403 -#: access/transam/xlog.c:4411 access/transam/xlog.c:4417 +#: access/transam/xlog.c:4359 access/transam/xlog.c:4385 +#: access/transam/xlog.c:4393 access/transam/xlog.c:4399 #, c-format msgid "It looks like you need to initdb." msgstr "Du behöver troligen köra initdb." -#: access/transam/xlog.c:4389 +#: access/transam/xlog.c:4371 #, c-format msgid "incorrect checksum in control file" msgstr "ogiltig kontrollsumma kontrollfil" -#: access/transam/xlog.c:4400 +#: access/transam/xlog.c:4382 #, 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:4408 +#: access/transam/xlog.c:4390 #, 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:4416 +#: access/transam/xlog.c:4398 #, 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:4422 +#: access/transam/xlog.c:4404 #, 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: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 +#: access/transam/xlog.c:4407 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:4464 +#: access/transam/xlog.c:4472 #, 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:4430 +#: access/transam/xlog.c:4412 #, 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:4438 +#: access/transam/xlog.c:4420 #, 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:4446 +#: access/transam/xlog.c:4428 #, 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:4454 +#: access/transam/xlog.c:4436 #, 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:4462 +#: access/transam/xlog.c:4444 #, 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:4470 +#: access/transam/xlog.c:4452 #, 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:4480 +#: access/transam/xlog.c:4462 #, 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:4488 +#: access/transam/xlog.c:4470 #, 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:4497 +#: access/transam/xlog.c:4479 #, 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] "ogiltigt WAL-segmentstorlek i kontrollfil (%d byte)" msgstr[1] "ogiltigt WAL-segmentstorlek i kontrollfil (%d byte)" -#: access/transam/xlog.c:4510 +#: access/transam/xlog.c:4492 #, 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:4514 +#: access/transam/xlog.c:4496 #, 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:4662 catalog/namespace.c:4696 +#: access/transam/xlog.c:4644 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 +#: replication/slot.c:2442 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 +#: access/transam/xlog.c:4690 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 +#: access/transam/xlog.c:5111 #, 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:5137 +#: access/transam/xlog.c:5119 #, 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:5143 +#: access/transam/xlog.c:5125 #, 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:5368 +#: access/transam/xlog.c:5350 #, 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" -#: access/transam/xlog.c:5369 +#: access/transam/xlog.c:5351 #, 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." -#: access/transam/xlog.c:5370 +#: access/transam/xlog.c:5352 #, 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\"." -#: access/transam/xlog.c:5435 +#: access/transam/xlog.c:5417 #, c-format msgid "control file contains invalid checkpoint location" msgstr "kontrollfil innehåller ogiltig checkpoint-position" -#: access/transam/xlog.c:5446 +#: access/transam/xlog.c:5428 #, c-format msgid "database system was shut down at %s" msgstr "databassystemet stängdes ner vid %s" -#: access/transam/xlog.c:5452 +#: access/transam/xlog.c:5434 #, 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:5458 +#: access/transam/xlog.c:5440 #, 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:5464 +#: access/transam/xlog.c:5446 #, 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:5466 +#: access/transam/xlog.c:5448 #, 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:5472 +#: access/transam/xlog.c:5454 #, 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:5474 +#: access/transam/xlog.c:5456 #, 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:5480 +#: access/transam/xlog.c:5462 #, 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:5487 +#: access/transam/xlog.c:5469 #, c-format msgid "control file contains invalid database cluster state" msgstr "kontrollfil innehåller ogiltigt databasklustertillstånd" -#: access/transam/xlog.c:5875 +#: access/transam/xlog.c:5857 #, c-format msgid "WAL ends before end of online backup" msgstr "WAL slutar före sluttiden av online-backup:en" -#: access/transam/xlog.c:5876 +#: access/transam/xlog.c:5858 #, 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:5880 +#: access/transam/xlog.c:5862 #, c-format msgid "WAL ends before consistent recovery point" msgstr "WAL avslutas innan konstistent återställningspunkt" -#: access/transam/xlog.c:5926 +#: access/transam/xlog.c:5908 #, c-format msgid "selected new timeline ID: %u" msgstr "valt nytt tidslinje-ID: %u" -#: access/transam/xlog.c:5959 +#: access/transam/xlog.c:5941 #, c-format msgid "archive recovery complete" msgstr "arkivåterställning klar" -#: access/transam/xlog.c:6612 +#: access/transam/xlog.c:6594 #, c-format msgid "shutting down" msgstr "stänger ner" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6651 +#: access/transam/xlog.c:6633 #, 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:6663 +#: access/transam/xlog.c:6645 #, 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:6728 +#: access/transam/xlog.c:6710 #, 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 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:6751 +#: access/transam/xlog.c:6733 #, 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 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:7233 +#: access/transam/xlog.c:7225 #, 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:7818 +#: access/transam/xlog.c:7840 #, c-format msgid "recovery restart point at %X/%X" msgstr "återställningens omstartspunkt vid %X/%X" -#: access/transam/xlog.c:7820 +#: access/transam/xlog.c:7842 #, c-format msgid "Last completed transaction was at log time %s." msgstr "Senaste kompletta transaktionen var vid loggtid %s" -#: access/transam/xlog.c:8082 +#: access/transam/xlog.c:8108 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "återställningspunkt \"%s\" skapad vid %X/%X" -#: access/transam/xlog.c:8289 +#: access/transam/xlog.c:8315 #, 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:8347 +#: access/transam/xlog.c:8373 #, 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:8405 +#: access/transam/xlog.c:8431 #, 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:8434 +#: access/transam/xlog.c:8460 #, 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:8705 +#: access/transam/xlog.c:8731 #, 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:8710 +#: access/transam/xlog.c:8736 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "kunde inte fdatasync:a fil \"%s\": %m" -#: access/transam/xlog.c:8797 access/transam/xlog.c:9133 +#: access/transam/xlog.c:8823 access/transam/xlog.c:9159 #, 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:8798 access/transam/xlogfuncs.c:248 +#: access/transam/xlog.c:8824 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." -#: access/transam/xlog.c:8803 +#: access/transam/xlog.c:8829 #, c-format msgid "backup label too long (max %d bytes)" msgstr "backup-etikett för lång (max %d byte)" -#: access/transam/xlog.c:8924 +#: access/transam/xlog.c:8950 #, 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 sedan senaste omstartpunkten" -#: access/transam/xlog.c:8926 access/transam/xlog.c:9222 +#: access/transam/xlog.c:8952 access/transam/xlog.c:9248 #, 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." -#: access/transam/xlog.c:9006 backup/basebackup.c:1417 utils/adt/misc.c:354 +#: access/transam/xlog.c:9032 backup/basebackup.c:1417 utils/adt/misc.c:354 #, c-format msgid "could not read symbolic link \"%s\": %m" msgstr "kan inte läsa symbolisk länk \"%s\": %m" -#: access/transam/xlog.c:9013 backup/basebackup.c:1422 utils/adt/misc.c:359 +#: access/transam/xlog.c:9039 backup/basebackup.c:1422 utils/adt/misc.c:359 #, c-format 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:9134 +#: access/transam/xlog.c:9160 #, 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." -#: access/transam/xlog.c:9172 backup/basebackup.c:1281 +#: access/transam/xlog.c:9198 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:9173 backup/basebackup.c:1282 +#: access/transam/xlog.c:9199 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:9220 +#: access/transam/xlog.c:9246 #, 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" -#: access/transam/xlog.c:9336 +#: access/transam/xlog.c:9362 #, 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:9350 +#: access/transam/xlog.c:9376 #, 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:9352 +#: access/transam/xlog.c:9378 #, 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ändbar utan att alla WAL-segment finns." -#: access/transam/xlog.c:9359 +#: access/transam/xlog.c:9385 #, c-format msgid "all required WAL segments have been archived" msgstr "alla krävda WAL-segments har arkiverats" -#: access/transam/xlog.c:9363 +#: access/transam/xlog.c:9389 #, 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:9402 +#: access/transam/xlog.c:9428 #, 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" @@ -3076,147 +3077,147 @@ msgstr "ogiltig postlängd vid %X/%X: förväntade minst %u, fick %u" msgid "contrecord is requested by %X/%X" msgstr "contrecord är begärd vid %X/%X" -#: access/transam/xlogreader.c:669 access/transam/xlogreader.c:1134 +#: access/transam/xlogreader.c:669 access/transam/xlogreader.c:1144 #, c-format 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:758 +#: access/transam/xlogreader.c:759 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "det finns ingen contrecord-flagga vid %X/%X" -#: access/transam/xlogreader.c:771 +#: access/transam/xlogreader.c:772 #, 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:1142 +#: access/transam/xlogreader.c:1152 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "ogiltigt resurshanterar-ID %u vid %X/%X" -#: access/transam/xlogreader.c:1155 access/transam/xlogreader.c:1171 +#: access/transam/xlogreader.c:1165 access/transam/xlogreader.c:1181 #, 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:1209 +#: access/transam/xlogreader.c:1219 #, 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:1243 +#: access/transam/xlogreader.c:1253 #, c-format 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:1258 access/transam/xlogreader.c:1300 +#: access/transam/xlogreader.c:1268 access/transam/xlogreader.c:1310 #, c-format 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:1274 +#: access/transam/xlogreader.c:1284 #, 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:1282 +#: access/transam/xlogreader.c:1292 #, 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" -#: access/transam/xlogreader.c:1288 +#: access/transam/xlogreader.c:1298 #, 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" -#: access/transam/xlogreader.c:1320 +#: access/transam/xlogreader.c:1330 #, c-format 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" -#: access/transam/xlogreader.c:1346 +#: access/transam/xlogreader.c:1356 #, c-format 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:1749 +#: access/transam/xlogreader.c:1759 #, 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:1773 +#: access/transam/xlogreader.c:1783 #, 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:1780 +#: access/transam/xlogreader.c:1790 #, 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:1816 +#: access/transam/xlogreader.c:1826 #, 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 blockavbildlängd %u vid %X/%X" -#: access/transam/xlogreader.c:1832 +#: access/transam/xlogreader.c:1842 #, 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:1846 +#: access/transam/xlogreader.c:1856 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "BKPIMAGE_COMPRESSED är satt men blockavbildlängd %u vid %X/%X" -#: access/transam/xlogreader.c:1861 +#: access/transam/xlogreader.c:1871 #, 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 blockavbildlängd är %u vid %X/%X" -#: access/transam/xlogreader.c:1877 +#: access/transam/xlogreader.c:1887 #, 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:1889 +#: access/transam/xlogreader.c:1899 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "ogiltig block_id %u vid %X/%X" -#: access/transam/xlogreader.c:1956 +#: access/transam/xlogreader.c:1966 #, c-format msgid "record with invalid length at %X/%X" msgstr "post med ogiltig längd vid %X/%X" -#: access/transam/xlogreader.c:1982 +#: access/transam/xlogreader.c:1992 #, 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:2066 +#: access/transam/xlogreader.c:2076 #, 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:2073 +#: access/transam/xlogreader.c:2083 #, 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" -#: access/transam/xlogreader.c:2100 access/transam/xlogreader.c:2117 +#: access/transam/xlogreader.c:2110 access/transam/xlogreader.c:2127 #, 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, komprimerad med %s stöds inte av bygget, block %d" -#: access/transam/xlogreader.c:2126 +#: access/transam/xlogreader.c:2136 #, 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" -#: access/transam/xlogreader.c:2134 +#: access/transam/xlogreader.c:2144 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "kunde inte packa upp avbild vid %X/%X, block %d" @@ -3994,7 +3995,7 @@ msgstr "relativ sökväg tillåts inte för backup som sparas på servern" #: 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 +#: commands/tablespace.c:593 commands/tablespace.c:638 replication/slot.c:1982 #: storage/file/copydir.c:47 #, c-format msgid "could not create directory \"%s\": %m" @@ -4228,19 +4229,19 @@ msgstr "kan inte använda IN SCHEMA-klausul samtidigt som GRANT/REVOKE ON SCHEMA #: 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 +#: 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:14403 commands/tablecmds.c:17030 commands/trigger.c:943 #: 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 +#: parser/parse_utilcmd.c:3449 parser/parse_utilcmd.c:3491 utils/adt/acl.c:2940 #: utils/adt/ruleutils.c:2812 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" @@ -4251,15 +4252,15 @@ msgstr "kolumn \"%s\" i relation \"%s\" existerar inte" msgid "\"%s\" is an index" msgstr "\"%s\" är ett index" -#: catalog/aclchk.c:1869 commands/tablecmds.c:14496 commands/tablecmds.c:17882 +#: catalog/aclchk.c:1869 commands/tablecmds.c:14560 commands/tablecmds.c:17946 #, 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 +#: commands/tablecmds.c:17910 utils/adt/acl.c:2124 utils/adt/acl.c:2154 +#: utils/adt/acl.c:2187 utils/adt/acl.c:2223 utils/adt/acl.c:2254 +#: utils/adt/acl.c:2285 #, c-format msgid "\"%s\" is not a sequence" msgstr "\"%s\" är inte en sekvens" @@ -4784,14 +4785,14 @@ msgstr "kan inte ta bort %s eftersom andra objekt beror på den" #: 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 +#: commands/tablecmds.c:15152 commands/tablespace.c:460 commands/user.c:1302 +#: commands/vacuum.c:212 commands/view.c:441 executor/execExprInterp.c:4655 +#: executor/execExprInterp.c:4663 libpq/auth.c:332 +#: 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 +#: utils/misc/guc.c:3210 utils/misc/guc.c:3285 utils/misc/guc.c:6836 +#: utils/misc/guc.c:6870 utils/misc/guc.c:6904 utils/misc/guc.c:6947 +#: utils/misc/guc.c:6989 #, c-format msgid "%s" msgstr "%s" @@ -4824,66 +4825,66 @@ msgstr "konstant av typen %s kan inte användas här" msgid "column %d of relation \"%s\" does not exist" msgstr "kolumn %d i relation \"%s\" finns inte" -#: catalog/heap.c:325 +#: catalog/heap.c:326 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "rättighet saknas för att skapa \"%s.%s\"" -#: catalog/heap.c:327 +#: catalog/heap.c:328 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "Systemkatalogändringar är för tillfället inte tillåtna." -#: catalog/heap.c:467 commands/tablecmds.c:2495 commands/tablecmds.c:2917 +#: 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 "tabeller kan ha som mest %d kolumner" -#: catalog/heap.c:485 commands/tablecmds.c:7432 +#: catalog/heap.c:486 commands/tablecmds.c:7465 #, 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:501 +#: catalog/heap.c:502 #, 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:579 +#: catalog/heap.c:580 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "partitionsnyckelkolumn \"%s\" har pseudo-typ %s" -#: catalog/heap.c:584 +#: catalog/heap.c:585 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "kolumn \"%s\" har pseudo-typ %s" -#: catalog/heap.c:615 +#: catalog/heap.c:616 #, 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:670 +#: catalog/heap.c:671 #, 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:676 commands/createas.c:198 commands/createas.c:505 +#: 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 "ingen jämförelse kunde härledas för kolumn \"%s\" med jämförelsetyp %s" -#: catalog/heap.c:1161 catalog/index.c:899 commands/createas.c:401 +#: catalog/heap.c:1162 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:1177 catalog/pg_type.c:434 catalog/pg_type.c:805 +#: 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 @@ -4891,132 +4892,132 @@ msgstr "relationen \"%s\" finns redan" msgid "type \"%s\" already exists" msgstr "typen \"%s\" existerar redan" -#: catalog/heap.c:1178 +#: 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 "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:1218 +#: catalog/heap.c:1219 #, c-format 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:1229 +#: catalog/heap.c:1230 #, 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:1239 +#: catalog/heap.c:1240 #, c-format 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:2130 +#: catalog/heap.c:2185 #, 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:2402 +#: catalog/heap.c:2452 #, c-format msgid "check constraint \"%s\" already exists" msgstr "check-villkor \"%s\" finns redan" -#: catalog/heap.c:2574 catalog/index.c:913 catalog/pg_constraint.c:724 -#: commands/tablecmds.c:9356 +#: 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 "integritetsvillkor \"%s\" för relation \"%s\" finns redan" -#: catalog/heap.c:2581 +#: catalog/heap.c:2631 #, 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:2592 +#: catalog/heap.c:2642 #, 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:2602 +#: catalog/heap.c:2652 #, 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:2607 +#: catalog/heap.c:2657 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "slår samman villkor \"%s\" med ärvd definition" -#: catalog/heap.c:2633 catalog/pg_constraint.c:853 commands/tablecmds.c:3074 +#: catalog/heap.c:2683 catalog/pg_constraint.c:854 commands/tablecmds.c:3074 #: commands/tablecmds.c:3377 commands/tablecmds.c:7089 -#: commands/tablecmds.c:15907 commands/tablecmds.c:16038 +#: commands/tablecmds.c:15971 commands/tablecmds.c:16102 #, c-format msgid "too many inheritance parents" msgstr "för många föräldrar i arv" -#: catalog/heap.c:2717 +#: catalog/heap.c:2767 #, 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:2719 +#: catalog/heap.c:2769 #, 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:2725 +#: catalog/heap.c:2775 #, 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:2726 +#: catalog/heap.c:2776 #, 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:2781 +#: catalog/heap.c:2831 #, c-format msgid "generation expression is not immutable" msgstr "genereringsuttryck är inte immutable" -#: catalog/heap.c:2809 rewrite/rewriteHandler.c:1276 +#: 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 "kolumn \"%s\" har typ %s men default-uttryck har typen %s" -#: catalog/heap.c:2814 commands/prepare.c:331 parser/analyze.c:2758 +#: 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 "Du måste skriva om eller typomvandla uttrycket." -#: catalog/heap.c:2861 +#: catalog/heap.c:2911 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "bara tabell \"%s\" kan refereras i check-villkoret" -#: catalog/heap.c:3167 +#: catalog/heap.c:3217 #, 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:3168 +#: catalog/heap.c:3218 #, 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:3173 +#: catalog/heap.c:3223 #, 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:3174 +#: catalog/heap.c:3224 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Tabell \"%s\" refererar till \"%s\"." -#: catalog/heap.c:3176 +#: catalog/heap.c:3226 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "Trunkera tabellen \"%s\" samtidigt, eller använd TRUNCATE ... CASCADE." @@ -5092,12 +5093,12 @@ msgstr "DROP INDEX CONCURRENTLY måste vara första operationen i transaktion" msgid "cannot reindex temporary tables of other sessions" msgstr "kan inte omindexera temporära tabeller som tillhör andra sessioner" -#: catalog/index.c:3679 commands/indexcmds.c:3626 +#: catalog/index.c:3679 commands/indexcmds.c:3660 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "kan inte omindexera angivet index i TOAST-tabell" -#: catalog/index.c:3695 commands/indexcmds.c:3504 commands/indexcmds.c:3650 +#: catalog/index.c:3695 commands/indexcmds.c:3538 commands/indexcmds.c:3684 #: commands/tablecmds.c:3581 #, c-format msgid "cannot move system relation \"%s\"" @@ -5114,7 +5115,7 @@ 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:462 catalog/namespace.c:666 catalog/namespace.c:758 -#: commands/trigger.c:5729 +#: commands/trigger.c:5817 #, c-format msgid "cross-database references are not implemented: \"%s.%s.%s\"" msgstr "referenser till andra databaser är inte implementerat: \"%s.%s.%s\"" @@ -5197,7 +5198,7 @@ msgstr "textsökkonfiguration \"%s\" finns inte" msgid "cross-database references are not implemented: %s" msgstr "referenser till andra databaser är inte implementerat: %s" -#: catalog/namespace.c:3335 gram.y:19181 gram.y:19221 parser/parse_expr.c:875 +#: catalog/namespace.c:3335 gram.y:19188 gram.y:19228 parser/parse_expr.c:875 #: parser/parse_target.c:1266 #, c-format msgid "improper qualified name (too many dotted names): %s" @@ -5251,25 +5252,25 @@ msgstr "kan inte skapa temporära tabeller under en parallell operation" #: 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 +#: commands/tablecmds.c:12966 #, c-format msgid "\"%s\" is not a table" msgstr "\"%s\" är inte en tabell" #: catalog/objectaddress.c:1378 commands/tablecmds.c:269 -#: commands/tablecmds.c:17851 commands/view.c:114 +#: commands/tablecmds.c:17915 commands/view.c:114 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\" är inte en vy" #: catalog/objectaddress.c:1385 commands/matview.c:199 commands/tablecmds.c:275 -#: commands/tablecmds.c:17856 +#: commands/tablecmds.c:17920 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\" är inte en materialiserad vy" #: catalog/objectaddress.c:1392 commands/tablecmds.c:293 -#: commands/tablecmds.c:17861 +#: commands/tablecmds.c:17925 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\" är inte en främmande tabell" @@ -5292,7 +5293,7 @@ msgstr "standardvärde för kolumn \"%s\" i relation \"%s\" existerar inte" #: 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 +#: utils/adt/acl.c:4577 #, c-format msgid "type \"%s\" does not exist" msgstr "typen \"%s\" existerar inte" @@ -5312,8 +5313,9 @@ msgstr "funktion %d (%s, %s) för %s finns inte" 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:1834 commands/foreigncmds.c:430 -#: commands/foreigncmds.c:993 commands/foreigncmds.c:1356 foreign/foreign.c:713 +#: catalog/objectaddress.c:1834 commands/foreigncmds.c:441 +#: commands/foreigncmds.c:1004 commands/foreigncmds.c:1367 +#: foreign/foreign.c:713 #, c-format msgid "server \"%s\" does not exist" msgstr "server \"%s\" finns inte" @@ -5950,17 +5952,17 @@ msgstr "jämförelse \"%s\" finns redan" msgid "collation \"%s\" for encoding \"%s\" already exists" msgstr "jämförelse \"%s\" för kodning \"%s\" finns redan" -#: catalog/pg_constraint.c:732 +#: catalog/pg_constraint.c:733 #, c-format msgid "constraint \"%s\" for domain %s already exists" msgstr "villkor \"%s\" för domän %s finns redan" -#: catalog/pg_constraint.c:932 catalog/pg_constraint.c:1025 +#: catalog/pg_constraint.c:933 catalog/pg_constraint.c:1026 #, c-format msgid "constraint \"%s\" for table \"%s\" does not exist" msgstr "integritetsvillkor \"%s\" för tabell \"%s\" existerar inte" -#: catalog/pg_constraint.c:1125 +#: catalog/pg_constraint.c:1126 #, c-format msgid "constraint \"%s\" for domain %s does not exist" msgstr "villkor \"%s\" för domänen %s finns inte" @@ -6046,7 +6048,7 @@ msgid "The partition is being detached concurrently or has an unfinished detach. msgstr "Partitionen kopplas loss parallellt eller har en bortkoppling som inte är slutförd." #: catalog/pg_inherits.c:595 commands/tablecmds.c:4800 -#: commands/tablecmds.c:16153 +#: commands/tablecmds.c:16217 #, c-format msgid "Use ALTER TABLE ... DETACH PARTITION ... FINALIZE to complete the pending detach operation." msgstr "Använd ALTER TABLE ... DETACH PARTITION ... FINALIZE för att slutföra den pågående bortkopplingsoperationen." @@ -6377,12 +6379,12 @@ msgstr "kan inte ta bort objekt ägda av %s eftersom de krävs av databassysteme msgid "cannot reassign ownership of objects owned by %s because they are required by the database system" msgstr "kan inte byta ägare på objekt som ägs av %s då dessa krävas av databassystemet" -#: catalog/pg_subscription.c:438 +#: catalog/pg_subscription.c:463 #, c-format msgid "could not drop relation mapping for subscription \"%s\"" msgstr "kunde inte slänga relationsmappning för prenumeration \"%s\"" -#: catalog/pg_subscription.c:440 +#: catalog/pg_subscription.c:465 #, c-format msgid "Table synchronization for relation \"%s\" is in progress and is in state \"%c\"." msgstr "Tabellsynkronisering för relation \"%s\" pågår och är i läget \"%c\"." @@ -6390,7 +6392,7 @@ msgstr "Tabellsynkronisering för relation \"%s\" pågår och är i läget \"%c\ #. translator: first %s is a SQL ALTER command and second %s is a #. SQL DROP command #. -#: catalog/pg_subscription.c:447 +#: catalog/pg_subscription.c:472 #, c-format msgid "Use %s to enable subscription if not already enabled or use %s to drop the subscription." msgstr "Använd %s för att slå på prenumerationen om den inte redan är på eller använd %s för att slänga prenumerationen." @@ -6536,12 +6538,12 @@ msgstr "parameter \"%s\" måste vara READ_ONLY, SHAREABLE eller READ_WRITE" msgid "event trigger \"%s\" already exists" msgstr "händelsetrigger \"%s\" finns redan" -#: commands/alter.c:86 commands/foreigncmds.c:593 +#: commands/alter.c:86 commands/foreigncmds.c:604 #, c-format msgid "foreign-data wrapper \"%s\" already exists" msgstr "främmande data-omvandlare \"%s\" finns redan" -#: commands/alter.c:89 commands/foreigncmds.c:884 +#: commands/alter.c:89 commands/foreigncmds.c:895 #, c-format msgid "server \"%s\" already exists" msgstr "servern \"%s\" finns redan" @@ -6642,7 +6644,7 @@ msgid "handler function is not specified" msgstr "hanterarfunktion ej angiven" #: commands/amcmds.c:264 commands/event_trigger.c:200 -#: commands/foreigncmds.c:489 commands/proclang.c:78 commands/trigger.c:702 +#: commands/foreigncmds.c:500 commands/proclang.c:78 commands/trigger.c:703 #: parser/parse_clause.c:943 #, c-format msgid "function %s must return type %s" @@ -6748,7 +6750,7 @@ msgstr "kan inte klustra temporära tabeller för andra sessioner" msgid "there is no previously clustered index for table \"%s\"" msgstr "det finns inget tidigare klustrat index för tabell \"%s\"" -#: commands/cluster.c:191 commands/tablecmds.c:14797 commands/tablecmds.c:16729 +#: commands/cluster.c:191 commands/tablecmds.c:14861 commands/tablecmds.c:16793 #, c-format msgid "index \"%s\" for table \"%s\" does not exist" msgstr "index \"%s\" för tabell \"%s\" finns inte" @@ -6763,7 +6765,7 @@ msgstr "kan inte klustra en delad katalog" msgid "cannot vacuum temporary tables of other sessions" msgstr "kan inte städa temporära tabeller för andra sessioner" -#: commands/cluster.c:513 commands/tablecmds.c:16739 +#: commands/cluster.c:513 commands/tablecmds.c:16803 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\" är inte ett index för tabell \"%s\"" @@ -6828,13 +6830,13 @@ msgid "collation attribute \"%s\" not recognized" msgstr "jämförelsesattribut \"%s\" känns inte igen" #: commands/collationcmds.c:123 commands/collationcmds.c:129 -#: commands/define.c:388 commands/tablecmds.c:8129 +#: 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 +#: 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 "motstridiga eller redundanta inställningar" @@ -6903,9 +6905,9 @@ msgstr "kan inte refresha versionen på standardjämförelse" #. 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/tablecmds.c:7938 commands/tablecmds.c:7948 +#: commands/tablecmds.c:7950 commands/tablecmds.c:14563 +#: commands/tablecmds.c:17948 commands/tablecmds.c:17969 #: commands/typecmds.c:3787 commands/typecmds.c:3872 commands/typecmds.c:4226 #, c-format msgid "Use %s instead." @@ -7182,7 +7184,7 @@ msgstr "Genererade kolumner kan inte användas i COPY." msgid "column \"%s\" does not exist" msgstr "kolumnen \"%s\" existerar inte" -#: commands/copy.c:963 commands/tablecmds.c:2552 commands/trigger.c:951 +#: commands/copy.c:963 commands/tablecmds.c:2552 commands/trigger.c:952 #: parser/parse_target.c:1083 parser/parse_target.c:1094 #, c-format msgid "column \"%s\" specified more than once" @@ -7333,17 +7335,17 @@ msgid "could not read from COPY file: %m" msgstr "kunde inte läsa från COPY-fil: %m" #: commands/copyfromparse.c:278 commands/copyfromparse.c:303 -#: replication/walsender.c:756 replication/walsender.c:782 tcop/postgres.c:381 +#: 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 "oväntat EOF från klientanslutning med öppen transaktion" -#: commands/copyfromparse.c:294 replication/walsender.c:772 +#: commands/copyfromparse.c:294 replication/walsender.c:776 #, c-format msgid "unexpected message type 0x%02X during COPY from stdin" msgstr "oväntad meddelandetyp 0x%02X under COPY från stdin" -#: commands/copyfromparse.c:317 replication/walsender.c:803 +#: commands/copyfromparse.c:317 replication/walsender.c:807 #, c-format msgid "COPY from stdin failed: %s" msgstr "COPY från stdin misslyckades: %s" @@ -8014,7 +8016,7 @@ msgstr "Använd DROP AGGREGATE för att ta bort aggregatfunktioner." #: 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 +#: commands/tablecmds.c:17225 tcop/utility.c:1325 #, c-format msgid "relation \"%s\" does not exist, skipping" msgstr "relation \"%s\" finns inte, hoppar över" @@ -8139,7 +8141,7 @@ msgstr "regel \"%s\" för relation \"%s\" finns inte, hoppar över" msgid "foreign-data wrapper \"%s\" does not exist, skipping" msgstr "främmande data-omvandlare \"%s\" finns inte, hoppar över" -#: commands/dropcmds.c:448 commands/foreigncmds.c:1360 +#: commands/dropcmds.c:448 commands/foreigncmds.c:1371 #, c-format msgid "server \"%s\" does not exist, skipping" msgstr "servern \"%s\" finns inte, hoppar över" @@ -8549,112 +8551,112 @@ msgstr "kunde inte hitta multirange-typ för datatyp %s" msgid "file \"%s\" is too large" msgstr "filen \"%s\" är för stor" -#: commands/foreigncmds.c:148 commands/foreigncmds.c:157 +#: commands/foreigncmds.c:159 commands/foreigncmds.c:168 #, c-format msgid "option \"%s\" not found" msgstr "flaggan \"%s\" hittades inte" -#: commands/foreigncmds.c:167 +#: commands/foreigncmds.c:178 #, c-format msgid "option \"%s\" provided more than once" msgstr "flaggan \"%s\" angiven mer än en gång" -#: commands/foreigncmds.c:221 commands/foreigncmds.c:229 +#: commands/foreigncmds.c:232 commands/foreigncmds.c:240 #, c-format msgid "permission denied to change owner of foreign-data wrapper \"%s\"" msgstr "rättighet saknas för att byta ägare på främmande data-omvandlare \"%s\"" -#: commands/foreigncmds.c:223 +#: commands/foreigncmds.c:234 #, c-format msgid "Must be superuser to change owner of a foreign-data wrapper." msgstr "Måste vara superuser för att byta ägare på en främmande data-omvandlare." -#: commands/foreigncmds.c:231 +#: commands/foreigncmds.c:242 #, c-format msgid "The owner of a foreign-data wrapper must be a superuser." msgstr "Ägaren av en främmande data-omvandlare måste vara en superuser." -#: commands/foreigncmds.c:291 commands/foreigncmds.c:707 foreign/foreign.c:691 +#: commands/foreigncmds.c:302 commands/foreigncmds.c:718 foreign/foreign.c:691 #, c-format msgid "foreign-data wrapper \"%s\" does not exist" msgstr "främmande data-omvandlare \"%s\" finns inte" -#: commands/foreigncmds.c:325 +#: commands/foreigncmds.c:336 #, c-format msgid "foreign-data wrapper with OID %u does not exist" msgstr "främmande data-omvandlare med OID %u finns inte" -#: commands/foreigncmds.c:462 +#: commands/foreigncmds.c:473 #, c-format msgid "foreign server with OID %u does not exist" msgstr "främmande server med OID %u finns inte" -#: commands/foreigncmds.c:580 +#: commands/foreigncmds.c:591 #, c-format msgid "permission denied to create foreign-data wrapper \"%s\"" msgstr "rättighet saknas för att skapa främmande data-omvandlare \"%s\"" -#: commands/foreigncmds.c:582 +#: commands/foreigncmds.c:593 #, c-format msgid "Must be superuser to create a foreign-data wrapper." msgstr "Måste vara superuser för att skapa främmande data-omvandlare." -#: commands/foreigncmds.c:697 +#: commands/foreigncmds.c:708 #, c-format msgid "permission denied to alter foreign-data wrapper \"%s\"" msgstr "rättighet saknas för att ändra främmande data-omvandlare \"%s\"" -#: commands/foreigncmds.c:699 +#: commands/foreigncmds.c:710 #, c-format msgid "Must be superuser to alter a foreign-data wrapper." msgstr "Måste vara superuser för att ändra främmande data-omvandlare." -#: commands/foreigncmds.c:730 +#: commands/foreigncmds.c:741 #, c-format msgid "changing the foreign-data wrapper handler can change behavior of existing foreign tables" msgstr "att ändra främmande data-omvandlares hanterare kan byta beteende på existerande främmande tabeller" -#: commands/foreigncmds.c:745 +#: commands/foreigncmds.c:756 #, c-format msgid "changing the foreign-data wrapper validator can cause the options for dependent objects to become invalid" msgstr "att ändra främmande data-omvandlares validator kan göra att flaggor för beroende objekt invalideras" -#: commands/foreigncmds.c:876 +#: commands/foreigncmds.c:887 #, c-format msgid "server \"%s\" already exists, skipping" msgstr "server \"%s\" finns redan, hoppar över" -#: commands/foreigncmds.c:1144 +#: commands/foreigncmds.c:1155 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\", skipping" msgstr "användarmappning för \"%s\" finns redan för server \"%s\", hoppar över" -#: commands/foreigncmds.c:1154 +#: commands/foreigncmds.c:1165 #, c-format msgid "user mapping for \"%s\" already exists for server \"%s\"" msgstr "användarmappning för \"%s\" finns redan för server \"%s\"" -#: commands/foreigncmds.c:1254 commands/foreigncmds.c:1374 +#: commands/foreigncmds.c:1265 commands/foreigncmds.c:1385 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\"" msgstr "användarmappning för \"%s\" finns inte för servern \"%s\"" -#: commands/foreigncmds.c:1379 +#: commands/foreigncmds.c:1390 #, c-format msgid "user mapping for \"%s\" does not exist for server \"%s\", skipping" msgstr "användarmappning för \"%s\" finns inte för servern \"%s\", hoppar över" -#: commands/foreigncmds.c:1507 foreign/foreign.c:404 +#: commands/foreigncmds.c:1518 foreign/foreign.c:404 #, c-format msgid "foreign-data wrapper \"%s\" has no handler" msgstr "främmande data-omvandlare \"%s\" har ingen hanterare" -#: commands/foreigncmds.c:1513 +#: commands/foreigncmds.c:1524 #, c-format msgid "foreign-data wrapper \"%s\" does not support IMPORT FOREIGN SCHEMA" msgstr "främmande data-omvandlare \"%s\" stöder inte IMPORT FOREIGN SCHEMA" -#: commands/foreigncmds.c:1615 +#: commands/foreigncmds.c:1626 #, c-format msgid "importing foreign table \"%s\"" msgstr "importerar främmande tabell \"%s\"" @@ -9178,8 +9180,8 @@ msgstr "inkluderad kolumn stöder inte NULLS FIRST/LAST-flaggor" msgid "could not determine which collation to use for index expression" msgstr "kunde inte bestämma vilken jämförelse (collation) som skulle användas för indexuttryck" -#: 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 +#: commands/indexcmds.c:2028 commands/tablecmds.c:18249 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" @@ -9215,8 +9217,8 @@ msgstr "accessmetod \"%s\" stöder inte ASC/DESC-flaggor" msgid "access method \"%s\" does not support NULLS FIRST/LAST options" msgstr "accessmetod \"%s\" stöder inte NULLS FIRST/LAST-flaggor" -#: commands/indexcmds.c:2210 commands/tablecmds.c:18210 -#: commands/tablecmds.c:18216 commands/typecmds.c:2311 +#: commands/indexcmds.c:2210 commands/tablecmds.c:18274 +#: commands/tablecmds.c:18280 commands/typecmds.c:2311 #, c-format msgid "data type %s has no default operator class for access method \"%s\"" msgstr "datatyp %s har ingen standardoperatorklass för accessmetod \"%s\"" @@ -9242,88 +9244,88 @@ msgstr "operatorklass \"%s\" accepterar inte datatypen %s" msgid "there are multiple default operator classes for data type %s" msgstr "det finns flera standardoperatorklasser för datatypen %s" -#: commands/indexcmds.c:2681 +#: commands/indexcmds.c:2715 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "okänd REINDEX-flagga \"%s\"" -#: commands/indexcmds.c:2913 +#: commands/indexcmds.c:2947 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "tabell \"%s\" har inga index som kan reindexeras parallellt" -#: commands/indexcmds.c:2927 +#: commands/indexcmds.c:2961 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "tabell \"%s\" har inga index som kan omindexeras" -#: commands/indexcmds.c:2974 commands/indexcmds.c:3485 -#: commands/indexcmds.c:3615 +#: commands/indexcmds.c:3008 commands/indexcmds.c:3519 +#: commands/indexcmds.c:3649 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "kan inte omindexera systemkataloger parallellt" -#: commands/indexcmds.c:2998 +#: commands/indexcmds.c:3032 #, c-format msgid "can only reindex the currently open database" msgstr "kan bara omindexera den aktiva databasen" -#: commands/indexcmds.c:3090 +#: commands/indexcmds.c:3124 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "kan inte omindexera systemkataloger parallellt, hoppar över alla" -#: commands/indexcmds.c:3123 +#: commands/indexcmds.c:3157 #, c-format msgid "cannot move system relations, skipping all" msgstr "kan inte flytta systemrelationer, hoppar över alla" -#: commands/indexcmds.c:3169 +#: commands/indexcmds.c:3203 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "vid omindexering av partitionerad tabell \"%s.%s\"" -#: commands/indexcmds.c:3172 +#: commands/indexcmds.c:3206 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "vid omindexering av partitionerat index \"%s.%s\"" -#: commands/indexcmds.c:3365 commands/indexcmds.c:4241 +#: commands/indexcmds.c:3399 commands/indexcmds.c:4283 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "tabell \"%s.%s\" omindexerades" -#: commands/indexcmds.c:3517 commands/indexcmds.c:3570 +#: commands/indexcmds.c:3551 commands/indexcmds.c:3604 #, c-format msgid "skipping reindex of invalid index \"%s.%s\"" msgstr "hoppar över omindexering av ogiltigt index \"%s.%s\"" -#: commands/indexcmds.c:3520 commands/indexcmds.c:3573 +#: commands/indexcmds.c:3554 commands/indexcmds.c:3607 #, c-format msgid "Use DROP INDEX or REINDEX INDEX." msgstr "Använd DROP INDEX eller REINDEX INDEX." -#: commands/indexcmds.c:3524 +#: commands/indexcmds.c:3558 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "kan inte parallellt omindexera uteslutningsvillkorsindex \"%s.%s\", hoppar över" -#: commands/indexcmds.c:3680 +#: commands/indexcmds.c:3714 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "kan inte parallellt omindexera denna sorts relation" -#: commands/indexcmds.c:3698 +#: commands/indexcmds.c:3732 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "kan inte flytta ickedelad relation till tabellutryumme \"%s\"" -#: commands/indexcmds.c:4222 commands/indexcmds.c:4234 +#: commands/indexcmds.c:4264 commands/indexcmds.c:4276 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "index \"%s.%s\" omindexerades" -#: commands/indexcmds.c:4224 commands/indexcmds.c:4243 +#: commands/indexcmds.c:4266 commands/indexcmds.c:4285 #, c-format msgid "%s." msgstr "%s." @@ -9338,7 +9340,7 @@ msgstr "kan inte låsa relationen \"%s\"" msgid "CONCURRENTLY cannot be used when the materialized view is not populated" msgstr "CONCURRENTLY kan inte användas när den materialiserade vyn inte är populerad" -#: commands/matview.c:212 gram.y:18918 +#: commands/matview.c:212 gram.y:18925 #, c-format msgid "%s and %s options cannot be used together" msgstr "flaggorna %s och %s kan inte användas ihop" @@ -9655,9 +9657,9 @@ msgstr "operatorattribut \"%s\" kan inte ändras när det redan har satts" #: 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 +#: commands/tablecmds.c:9670 commands/tablecmds.c:17836 +#: commands/tablecmds.c:17871 commands/trigger.c:317 commands/trigger.c:1333 +#: commands/trigger.c:1443 rewrite/rewriteDefine.c:268 #: rewrite/rewriteDefine.c:779 rewrite/rewriteRemove.c:74 #, c-format msgid "permission denied: \"%s\" is a system catalog" @@ -9709,7 +9711,7 @@ msgid "cannot create a cursor WITH HOLD within security-restricted operation" msgstr "kan inte skapa en WITH HOLD-markör i en säkerhetsbegränsad operation" #: commands/portalcmds.c:189 commands/portalcmds.c:242 -#: executor/execCurrent.c:70 utils/adt/xml.c:2936 utils/adt/xml.c:3106 +#: executor/execCurrent.c:70 utils/adt/xml.c:2938 utils/adt/xml.c:3108 #, c-format msgid "cursor \"%s\" does not exist" msgstr "markör \"%s\" existerar inte" @@ -10106,8 +10108,8 @@ msgstr "tabellen måste vara i samma schema som tabellen den är länkad till" msgid "cannot change ownership of identity sequence" msgstr "kan inte byta ägare på identitetssekvens" -#: commands/sequence.c:1671 commands/tablecmds.c:14486 -#: commands/tablecmds.c:17181 +#: commands/sequence.c:1671 commands/tablecmds.c:14550 +#: commands/tablecmds.c:17245 #, c-format msgid "Sequence \"%s\" is linked to table \"%s\"." msgstr "Sekvens \"%s\" är länkad till tabell \"%s\"" @@ -10177,12 +10179,12 @@ msgstr "duplicerade kolumnnamn i statistikdefinition" msgid "duplicate expression in statistics definition" msgstr "duplicerade uttryck i statistikdefinition" -#: commands/statscmds.c:628 commands/tablecmds.c:8620 +#: commands/statscmds.c:628 commands/tablecmds.c:8653 #, c-format msgid "statistics target %d is too low" msgstr "statistikmålet %d är för lågt" -#: commands/statscmds.c:636 commands/tablecmds.c:8628 +#: commands/statscmds.c:636 commands/tablecmds.c:8661 #, c-format msgid "lowering statistics target to %d" msgstr "minskar statistikmålet till %d" @@ -10244,8 +10246,8 @@ msgid "Only roles with privileges of the \"%s\" role may create subscriptions." msgstr "Bara roller med rättigheter från rollen \"%s\" får skapa prenumerationer" #: commands/subscriptioncmds.c:758 commands/subscriptioncmds.c:891 -#: commands/subscriptioncmds.c:1524 replication/logical/tablesync.c:1345 -#: replication/logical/worker.c:4503 +#: commands/subscriptioncmds.c:1524 replication/logical/tablesync.c:1371 +#: replication/logical/worker.c:4524 #, c-format msgid "could not connect to the publisher: %s" msgstr "kunde inte ansluta till publicerare: %s" @@ -10352,66 +10354,66 @@ msgstr "kunde inte slänga replikeringsslotten \"%s\" på publicerare: %s" msgid "subscription with OID %u does not exist" msgstr "prenumeration med OID %u existerar inte" -#: commands/subscriptioncmds.c:2076 commands/subscriptioncmds.c:2201 +#: commands/subscriptioncmds.c:2079 commands/subscriptioncmds.c:2204 #, c-format msgid "could not receive list of replicated tables from the publisher: %s" msgstr "kunde inte ta emot lista med replikerade tabeller från publiceraren: %s" -#: commands/subscriptioncmds.c:2112 +#: 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 "prenumeration \"%s\" begärde copy_data med origin = NONE men kan kopiera data från en annan källa" -#: commands/subscriptioncmds.c:2114 +#: 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] "Prenumerationen som skapas läser från publlicering (%s) som innehåller tabell som skrivs till från andra prenumerationer." msgstr[1] "Prenumerationen som skapas läser från publliceringar (%s) som innehåller tabell som skrivs till från andra prenumerationer." -#: commands/subscriptioncmds.c:2117 +#: commands/subscriptioncmds.c:2120 #, c-format msgid "Verify that initial data copied from the publisher tables did not come from other origins." msgstr "Kontrollera att den initiala datan som kopieras från publicerade tabeller inte kom från andra källor." -#: commands/subscriptioncmds.c:2223 replication/logical/tablesync.c:906 +#: commands/subscriptioncmds.c:2226 replication/logical/tablesync.c:932 #: replication/pgoutput/pgoutput.c:1143 #, c-format msgid "cannot use different column lists for table \"%s.%s\" in different publications" msgstr "kunde inte ha olika kolumnlistor för tabellen \"%s.%s\" i olika publiceringar" -#: commands/subscriptioncmds.c:2273 +#: commands/subscriptioncmds.c:2276 #, c-format msgid "could not connect to publisher when attempting to drop replication slot \"%s\": %s" msgstr "kunde inte ansluta till publicerare vid försök att slänga replikeringsslot \"%s\": %s" #. translator: %s is an SQL ALTER command -#: commands/subscriptioncmds.c:2276 +#: commands/subscriptioncmds.c:2279 #, c-format msgid "Use %s to disable the subscription, and then use %s to disassociate it from the slot." msgstr "Använd %s för att stänga av prenumerationen och sedan %s för att dissociera den från slotten." -#: commands/subscriptioncmds.c:2307 +#: commands/subscriptioncmds.c:2310 #, c-format msgid "publication name \"%s\" used more than once" msgstr "publiceringsnamn \"%s\" använt mer än en gång" -#: commands/subscriptioncmds.c:2351 +#: commands/subscriptioncmds.c:2354 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "publicering \"%s\" finns redan i prenumerationen \"%s\"" -#: commands/subscriptioncmds.c:2365 +#: commands/subscriptioncmds.c:2368 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "publicering \"%s\" finns inte i prenumerationen \"%s\"" -#: commands/subscriptioncmds.c:2376 +#: commands/subscriptioncmds.c:2379 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "kan inte slänga alla publiceringar från en prenumeration" -#: commands/subscriptioncmds.c:2433 +#: commands/subscriptioncmds.c:2436 #, c-format msgid "%s requires a Boolean value or \"parallel\"" msgstr "%s kräver ett booleskt värde eller \"parallel\"" @@ -10472,7 +10474,7 @@ msgstr "materialiserad vy \"%s\" finns inte, hoppar över" msgid "Use DROP MATERIALIZED VIEW to remove a materialized view." msgstr "Använd DROP MATERIALIZED VIEW för att ta bort en materialiserad vy." -#: commands/tablecmds.c:279 commands/tablecmds.c:303 commands/tablecmds.c:19805 +#: commands/tablecmds.c:279 commands/tablecmds.c:303 commands/tablecmds.c:19877 #: parser/parse_utilcmd.c:2251 #, c-format msgid "index \"%s\" does not exist" @@ -10496,8 +10498,8 @@ msgstr "\"%s\" är inte en typ" msgid "Use DROP TYPE to remove a type." msgstr "Använd DROP TYPE för att ta bort en typ." -#: commands/tablecmds.c:291 commands/tablecmds.c:14325 -#: commands/tablecmds.c:16886 +#: commands/tablecmds.c:291 commands/tablecmds.c:14389 +#: commands/tablecmds.c:16950 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "främmande tabell \"%s\" finns inte" @@ -10521,7 +10523,7 @@ msgstr "ON COMMIT kan bara användas på temporära tabeller" msgid "cannot create temporary table within security-restricted operation" msgstr "kan inte skapa temporär tabell i en säkerhetsbegränsad operation" -#: commands/tablecmds.c:801 commands/tablecmds.c:15745 +#: commands/tablecmds.c:801 commands/tablecmds.c:15809 #, c-format msgid "relation \"%s\" would be inherited from more than once" msgstr "relationen \"%s\" skulle ärvas mer än en gång" @@ -10546,7 +10548,7 @@ msgstr "kan inte skapa främmande partition för partitionerad tabell \"%s\"" msgid "Table \"%s\" contains indexes that are unique." msgstr "Tabell \"%s\" innehåller index som är unika." -#: commands/tablecmds.c:1338 commands/tablecmds.c:13341 +#: commands/tablecmds.c:1338 commands/tablecmds.c:13382 #, c-format msgid "too many array dimensions" msgstr "för många array-dimensioner" @@ -10597,7 +10599,7 @@ msgstr "kan inte trunkera främmande tabell \"%s\"" msgid "cannot truncate temporary tables of other sessions" msgstr "kan inte trunkera temporära tabeller tillhörande andra sessioner" -#: commands/tablecmds.c:2606 commands/tablecmds.c:15642 +#: commands/tablecmds.c:2606 commands/tablecmds.c:15706 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "kan inte ärva från partitionerad tabell \"%s\"" @@ -10618,18 +10620,18 @@ msgstr "ärvd relation \"%s\" är inte en tabell eller främmande tabell" msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" msgstr "kan inte skapa en temporär relation som partition till en permanent relation \"%s\"" -#: commands/tablecmds.c:2640 commands/tablecmds.c:15621 +#: commands/tablecmds.c:2640 commands/tablecmds.c:15685 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "kan inte ärva från en temporär relation \"%s\"" -#: commands/tablecmds.c:2650 commands/tablecmds.c:15629 +#: commands/tablecmds.c:2650 commands/tablecmds.c:15693 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "kan inte ärva från en temporär relation i en annan session" #: commands/tablecmds.c:2791 commands/tablecmds.c:2845 -#: commands/tablecmds.c:13024 parser/parse_utilcmd.c:1265 +#: 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 @@ -10923,12 +10925,12 @@ msgstr "kan inte lägga till kolumn till typad tabell" msgid "cannot add column to a partition" msgstr "kan inte lägga till kolumn till partition" -#: commands/tablecmds.c:7072 commands/tablecmds.c:15860 +#: commands/tablecmds.c:7072 commands/tablecmds.c:15924 #, c-format msgid "child table \"%s\" has different type for column \"%s\"" msgstr "barntabell \"%s\" har annan typ på kolumn \"%s\"" -#: commands/tablecmds.c:7078 commands/tablecmds.c:15866 +#: commands/tablecmds.c:7078 commands/tablecmds.c:15930 #, c-format msgid "child table \"%s\" has different collation for column \"%s\"" msgstr "barntabell \"%s\" har annan jämförelse (collation) på kolumn \"%s\"" @@ -10943,980 +10945,980 @@ msgstr "slår samman definitionen av kolumn \"%s\" för barn \"%s\"" msgid "cannot recursively add identity column to table that has child tables" msgstr "kan inte rekursivt lägga till identitetskolumn till tabell som har barntabeller" -#: commands/tablecmds.c:7362 +#: commands/tablecmds.c:7395 #, c-format msgid "column must be added to child tables too" msgstr "kolumnen måste läggas till i barntabellerna också" -#: commands/tablecmds.c:7440 +#: commands/tablecmds.c:7473 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "kolumn \"%s\" i relation \"%s\" finns redan, hoppar över" -#: commands/tablecmds.c:7447 +#: commands/tablecmds.c:7480 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "kolumn \"%s\" i relation \"%s\" finns redan" -#: commands/tablecmds.c:7513 commands/tablecmds.c:12652 +#: commands/tablecmds.c:7546 commands/tablecmds.c:12693 #, c-format msgid "cannot remove constraint from only the partitioned table when partitions exist" msgstr "kan inte ta bort villkor från bara den partitionerade tabellen när partitioner finns" -#: 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 +#: 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 "Ange inte nyckelordet ONLY." -#: 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 +#: 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:14412 commands/tablecmds.c:17039 #, c-format msgid "cannot alter system column \"%s\"" msgstr "kan inte ändra systemkolumn \"%s\"" -#: commands/tablecmds.c:7556 commands/tablecmds.c:7902 +#: commands/tablecmds.c:7589 commands/tablecmds.c:7935 #, c-format msgid "column \"%s\" of relation \"%s\" is an identity column" msgstr "kolumn \"%s\" i relation \"%s\" är en identitetskolumn" -#: commands/tablecmds.c:7597 +#: commands/tablecmds.c:7630 #, c-format msgid "column \"%s\" is in a primary key" msgstr "kolumn \"%s\" är del av en primärnyckel" -#: commands/tablecmds.c:7602 +#: commands/tablecmds.c:7635 #, c-format msgid "column \"%s\" is in index used as replica identity" msgstr "kolumnen \"%s\" finns i ett index som används som replikaidentitet" -#: commands/tablecmds.c:7625 +#: commands/tablecmds.c:7658 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "kolumn \"%s\" är markerad NOT NULL i föräldratabellen" -#: commands/tablecmds.c:7825 commands/tablecmds.c:9533 +#: commands/tablecmds.c:7858 commands/tablecmds.c:9566 #, c-format msgid "constraint must be added to child tables too" msgstr "villkoret måste läggas till i barntabellerna också" -#: commands/tablecmds.c:7826 +#: commands/tablecmds.c:7859 #, c-format msgid "Column \"%s\" of relation \"%s\" is not already NOT NULL." msgstr "Kolumn \"%s\" i relation \"%s\" är inte redan NOT NULL." -#: commands/tablecmds.c:7911 +#: commands/tablecmds.c:7944 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "kolumn \"%s\" i relation \"%s\" är en genererad kolumn" -#: commands/tablecmds.c:8005 +#: commands/tablecmds.c:8038 #, c-format msgid "cannot add identity to a column of only the partitioned table" msgstr "kan inte lägga till identitet för kolumn i bara den partitionerade tabellen" -#: commands/tablecmds.c:8011 +#: commands/tablecmds.c:8044 #, c-format msgid "cannot add identity to a column of a partition" msgstr "kan inte lägga till identitet för kolumn i en partition" -#: commands/tablecmds.c:8039 +#: commands/tablecmds.c:8072 #, c-format msgid "column \"%s\" of relation \"%s\" must be declared NOT NULL before identity can be added" msgstr "kolumn \"%s\" i relation \"%s\" måste deklareras NOT NULL innan identitet kan läggas till" -#: commands/tablecmds.c:8045 +#: commands/tablecmds.c:8078 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "kolumn \"%s\" i relation \"%s\" är redan en identitetskolumn" -#: commands/tablecmds.c:8051 +#: commands/tablecmds.c:8084 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "kolumn \"%s\" i relation \"%s\" har redan ett standardvärde" -#: commands/tablecmds.c:8112 +#: commands/tablecmds.c:8145 #, c-format msgid "cannot change identity column of only the partitioned table" msgstr "kan inte ändra identitetskolumn för bara den partitionerade tabellen" -#: commands/tablecmds.c:8118 +#: commands/tablecmds.c:8151 #, c-format msgid "cannot change identity column of a partition" msgstr "kan inte ändra identitetskolumn för en partition" -#: commands/tablecmds.c:8163 commands/tablecmds.c:8259 +#: commands/tablecmds.c:8196 commands/tablecmds.c:8292 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column" msgstr "kolumn \"%s\" i relation \"%s\" är inte en identitetkolumn" -#: commands/tablecmds.c:8229 +#: commands/tablecmds.c:8262 #, c-format msgid "cannot drop identity from a column of only the partitioned table" msgstr "kan inte slänga identitetskolumn från bara den partitionerade tabellen" -#: commands/tablecmds.c:8235 +#: commands/tablecmds.c:8268 #, c-format msgid "cannot drop identity from a column of a partition" msgstr "kan inte slänga identitetskolumn för en partition" -#: commands/tablecmds.c:8264 +#: commands/tablecmds.c:8297 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "kolumn \"%s\" i relation \"%s\" är inte en identitetkolumn, hoppar över" -#: commands/tablecmds.c:8358 +#: commands/tablecmds.c:8391 #, c-format msgid "column \"%s\" of relation \"%s\" is not a generated column" msgstr "kolumn \"%s\" i relation \"%s\" är inte en genererad kolumn" -#: commands/tablecmds.c:8456 +#: commands/tablecmds.c:8489 #, c-format msgid "ALTER TABLE / DROP EXPRESSION must be applied to child tables too" msgstr "ALTER TABLE / DROP EXPRESSION måste appliceras på barntabellerna också" -#: commands/tablecmds.c:8478 +#: commands/tablecmds.c:8511 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "kan inte slänga genererat uttryck på ärvd kolumn" -#: commands/tablecmds.c:8517 +#: commands/tablecmds.c:8550 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "kolumn \"%s\" i relation \"%s\" är inte en lagrad genererad kolumn" -#: commands/tablecmds.c:8522 +#: commands/tablecmds.c:8555 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column, skipping" msgstr "kolumn \"%s\" i relation \"%s\" är inte en lagrad genererad kolumn, hoppar över" -#: commands/tablecmds.c:8600 +#: commands/tablecmds.c:8633 #, c-format msgid "cannot refer to non-index column by number" msgstr "kan inte referera per nummer till en icke-index-kolumn " -#: commands/tablecmds.c:8652 +#: commands/tablecmds.c:8685 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "kolumnnummer %d i relation \"%s\" finns inte" -#: commands/tablecmds.c:8671 +#: commands/tablecmds.c:8704 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "kan inte ändra statistik på inkluderad kolumn \"%s\" i index \"%s\"" -#: commands/tablecmds.c:8676 +#: commands/tablecmds.c:8709 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "kan inte ändra statistik på icke-villkorskolumn \"%s\" i index \"%s\"" -#: commands/tablecmds.c:8678 +#: commands/tablecmds.c:8711 #, c-format msgid "Alter statistics on table column instead." msgstr "Ändra statistik på tabellkolumn istället." -#: commands/tablecmds.c:8924 +#: commands/tablecmds.c:8957 #, c-format msgid "cannot drop column from typed table" msgstr "kan inte ta bort kolumn från typad tabell" -#: commands/tablecmds.c:8987 +#: commands/tablecmds.c:9020 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "kolumn \"%s\" i relation \"%s\" finns inte, hoppar över" -#: commands/tablecmds.c:9000 +#: commands/tablecmds.c:9033 #, c-format msgid "cannot drop system column \"%s\"" msgstr "kan inte ta bort systemkolumn \"%s\"" -#: commands/tablecmds.c:9010 +#: commands/tablecmds.c:9043 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "kan inte ta bort ärvd kolumn \"%s\"" -#: commands/tablecmds.c:9023 +#: commands/tablecmds.c:9056 #, c-format msgid "cannot drop column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "kan inte slänga kolumnen \"%s\" då den är del av partitionsnyckeln för relationen \"%s\"" -#: commands/tablecmds.c:9048 +#: commands/tablecmds.c:9081 #, c-format msgid "cannot drop column from only the partitioned table when partitions exist" msgstr "kan inte slänga kolumn från bara den partitionerade tabellen när partitioner finns" -#: commands/tablecmds.c:9253 +#: 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 stöds inte på partionerade tabeller" -#: commands/tablecmds.c:9278 +#: 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 kommer byta namn på index \"%s\" till \"%s\"" -#: commands/tablecmds.c:9615 +#: commands/tablecmds.c:9648 #, c-format msgid "cannot use ONLY for foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "kan inte använda ONLY på främmande nyckel för partitionerad tabell \"%s\" som refererar till relationen \"%s\"" -#: commands/tablecmds.c:9621 +#: commands/tablecmds.c:9654 #, c-format msgid "cannot add NOT VALID foreign key on partitioned table \"%s\" referencing relation \"%s\"" msgstr "kan inte lägga till NOT VALID främmande nyckel till partitionerad tabell \"%s\" som refererar till relationen \"%s\"" -#: commands/tablecmds.c:9624 +#: commands/tablecmds.c:9657 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "Denna finess stöds inte än på partitionerade tabeller." -#: commands/tablecmds.c:9631 commands/tablecmds.c:10092 +#: commands/tablecmds.c:9664 commands/tablecmds.c:10146 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "refererad relation \"%s\" är inte en tabell" -#: commands/tablecmds.c:9654 +#: commands/tablecmds.c:9687 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "villkor på permanenta tabeller får bara referera till permanenta tabeller" -#: commands/tablecmds.c:9661 +#: commands/tablecmds.c:9694 #, c-format msgid "constraints on unlogged tables may reference only permanent or unlogged tables" msgstr "villkor på ologgade tabeller får bara referera till permanenta eller ologgade tabeller" -#: commands/tablecmds.c:9667 +#: commands/tablecmds.c:9700 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "villkor på temporära tabeller får bara referera till temporära tabeller" -#: commands/tablecmds.c:9671 +#: commands/tablecmds.c:9704 #, c-format msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "villkor på temporära tabeller får bara ta med temporära tabeller från denna session" -#: commands/tablecmds.c:9735 commands/tablecmds.c:9741 +#: commands/tablecmds.c:9769 commands/tablecmds.c:9775 #, c-format msgid "invalid %s action for foreign key constraint containing generated column" msgstr "ogiltig %s-aktion för främmande nyckelvillkor som innehåller genererad kolumn" -#: commands/tablecmds.c:9757 +#: commands/tablecmds.c:9791 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "antalet refererande och refererade kolumner för främmande nyckel stämmer ej överens" -#: commands/tablecmds.c:9864 +#: commands/tablecmds.c:9898 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "främmande nyckelvillkor \"%s\" kan inte implementeras" -#: commands/tablecmds.c:9866 +#: commands/tablecmds.c:9900 #, c-format msgid "Key columns \"%s\" and \"%s\" are of incompatible types: %s and %s." msgstr "Nyckelkolumner \"%s\" och \"%s\" har inkompatibla typer %s och %s." -#: commands/tablecmds.c:10035 +#: commands/tablecmds.c:10075 #, c-format msgid "column \"%s\" referenced in ON DELETE SET action must be part of foreign key" msgstr "kolumn \"%s\" refererad i ON DELETE SET-aktion måste vara en del av en främmande nyckel" -#: commands/tablecmds.c:10392 commands/tablecmds.c:10832 +#: 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 "främmande nyckel-villkor stöds inte för främmande tabeller" -#: commands/tablecmds.c:10815 +#: commands/tablecmds.c:10856 #, c-format msgid "cannot attach table \"%s\" as a partition because it is referenced by foreign key \"%s\"" msgstr "kan inte ansluta tabell \"%s\" som en partition då den refereras av främmande nyckel \"%s\"" -#: commands/tablecmds.c:11416 commands/tablecmds.c:11697 -#: commands/tablecmds.c:12609 commands/tablecmds.c:12683 +#: 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 "villkor \"%s\" i relation \"%s\" finns inte" -#: commands/tablecmds.c:11423 +#: commands/tablecmds.c:11464 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "villkor \"%s\" i relation \"%s\" är inte ett främmande nyckelvillkor" -#: commands/tablecmds.c:11461 +#: commands/tablecmds.c:11502 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" msgstr "kan inte ändra villkoret \"%s\" i relation \"%s\"" -#: commands/tablecmds.c:11464 +#: commands/tablecmds.c:11505 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "Villkoret \"%s\" är härlett från villkoret \"%s\" i relation \"%s\"" -#: commands/tablecmds.c:11466 +#: commands/tablecmds.c:11507 #, c-format msgid "You may alter the constraint it derives from instead." msgstr "Du kan istället ändra på villkoret det är härlett från." -#: commands/tablecmds.c:11705 +#: commands/tablecmds.c:11746 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key or check constraint" msgstr "villkor \"%s\" i relation \"%s\" är inte en främmande nyckel eller ett check-villkor" -#: commands/tablecmds.c:11782 +#: commands/tablecmds.c:11823 #, c-format msgid "constraint must be validated on child tables too" msgstr "villkoret måste valideras för barntabellerna också" -#: commands/tablecmds.c:11869 +#: commands/tablecmds.c:11910 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "kolumn \"%s\" som refereras till i främmande nyckelvillkor finns inte" -#: commands/tablecmds.c:11875 +#: commands/tablecmds.c:11916 #, c-format msgid "system columns cannot be used in foreign keys" msgstr "systemkolumner kan inte användas i främmande nycklar" -#: commands/tablecmds.c:11879 +#: commands/tablecmds.c:11920 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "kan inte ha mer än %d nycklar i en främmande nyckel" -#: commands/tablecmds.c:11944 +#: commands/tablecmds.c:11985 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "kan inte använda en \"deferrable\" primärnyckel för refererad tabell \"%s\"" -#: commands/tablecmds.c:11961 +#: commands/tablecmds.c:12002 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "det finns ingen primärnyckel för refererad tabell \"%s\"" -#: commands/tablecmds.c:12029 +#: commands/tablecmds.c:12070 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "främmande nyckel-refererade kolumnlistor får inte innehålla duplikat" -#: commands/tablecmds.c:12121 +#: commands/tablecmds.c:12162 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "kan inte använda ett \"deferrable\" unikt integritetsvillkor för refererad tabell \"%s\"" -#: commands/tablecmds.c:12126 +#: commands/tablecmds.c:12167 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "finns inget unique-villkor som matchar de givna nycklarna i den refererade tabellen \"%s\"" -#: commands/tablecmds.c:12565 +#: commands/tablecmds.c:12606 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "kan inte ta bort ärvt villkor \"%s\" i relation \"%s\"" -#: commands/tablecmds.c:12615 +#: commands/tablecmds.c:12656 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "villkor \"%s\" i relation \"%s\" finns inte, hoppar över" -#: commands/tablecmds.c:12790 +#: commands/tablecmds.c:12831 #, c-format msgid "cannot alter column type of typed table" msgstr "kan inte ändra kolumntyp på typad tabell" -#: commands/tablecmds.c:12816 +#: commands/tablecmds.c:12857 #, c-format msgid "cannot specify USING when altering type of generated column" msgstr "kan inte ange USING när man ändrar typ på en genererad kolumn" -#: commands/tablecmds.c:12817 commands/tablecmds.c:18028 -#: commands/tablecmds.c:18118 commands/trigger.c:656 +#: commands/tablecmds.c:12858 commands/tablecmds.c:18092 +#: commands/tablecmds.c:18182 commands/trigger.c:657 #: rewrite/rewriteHandler.c:941 rewrite/rewriteHandler.c:976 #, c-format msgid "Column \"%s\" is a generated column." msgstr "Kolumnen \"%s\" är en genererad kolumn." -#: commands/tablecmds.c:12827 +#: commands/tablecmds.c:12868 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "kan inte ändra ärvd kolumn \"%s\"" -#: commands/tablecmds.c:12836 +#: commands/tablecmds.c:12877 #, c-format msgid "cannot alter column \"%s\" because it is part of the partition key of relation \"%s\"" msgstr "kan inte ändra kolumnen \"%s\" då den är del av partitionsnyckeln för relationen \"%s\"" -#: commands/tablecmds.c:12886 +#: commands/tablecmds.c:12927 #, c-format msgid "result of USING clause for column \"%s\" cannot be cast automatically to type %s" msgstr "resultatet av USING-klausul för kolumn \"%s\" kan inte automatiskt typomvandlas till typen %s" -#: commands/tablecmds.c:12889 +#: commands/tablecmds.c:12930 #, c-format msgid "You might need to add an explicit cast." msgstr "Du kan behöva lägga till en explicit typomvandling." -#: commands/tablecmds.c:12893 +#: commands/tablecmds.c:12934 #, c-format msgid "column \"%s\" cannot be cast automatically to type %s" msgstr "kolumn \"%s\" kan inte automatiskt typomvandlas till typ %s" #. translator: USING is SQL, don't translate it -#: commands/tablecmds.c:12897 +#: commands/tablecmds.c:12938 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Du kan behöva ange \"USING %s::%s\"." -#: commands/tablecmds.c:12996 +#: commands/tablecmds.c:13037 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "kan inte ändra ärvd kolumn \"%s\" i relation \"%s\"" -#: commands/tablecmds.c:13025 +#: commands/tablecmds.c:13066 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "USING-uttryck innehåller en hela-raden-tabellreferens." -#: commands/tablecmds.c:13036 +#: commands/tablecmds.c:13077 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "typen av den ärvda kolumnen \"%s\" måste ändras i barntabellerna också" -#: commands/tablecmds.c:13161 +#: commands/tablecmds.c:13202 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "kan inte ändra typen på kolumn \"%s\" två gånger" -#: commands/tablecmds.c:13199 +#: commands/tablecmds.c:13240 #, c-format msgid "generation expression for column \"%s\" cannot be cast automatically to type %s" msgstr "genereringsuttryck för kolumn \"%s\" kan inte automatiskt typomvandlas till typ %s" -#: commands/tablecmds.c:13204 +#: commands/tablecmds.c:13245 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "\"default\" för kolumn \"%s\" kan inte automatiskt typomvandlas till typ \"%s\"" -#: commands/tablecmds.c:13508 +#: commands/tablecmds.c:13549 #, c-format msgid "cannot alter type of a column used by a function or procedure" msgstr "kan inte ändra typ på en kolumn som används av en funktion eller procedur" -#: commands/tablecmds.c:13509 commands/tablecmds.c:13524 -#: commands/tablecmds.c:13544 commands/tablecmds.c:13563 -#: commands/tablecmds.c:13622 +#: 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 beror på kolumn \"%s\"" -#: commands/tablecmds.c:13523 +#: commands/tablecmds.c:13564 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "kan inte ändra typ på en kolumn som används av en vy eller en regel" -#: commands/tablecmds.c:13543 +#: commands/tablecmds.c:13584 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "kan inte ändra typ på en kolumn som används i en triggerdefinition" -#: commands/tablecmds.c:13562 +#: commands/tablecmds.c:13603 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "kan inte ändra typ på en kolumn som används av i en policydefinition" -#: commands/tablecmds.c:13593 +#: commands/tablecmds.c:13634 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "kan inte ändra typ på en kolumn som används av en genererad kolumn" -#: commands/tablecmds.c:13594 +#: commands/tablecmds.c:13635 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "Kolumn \"%s\" används av genererad kolumn \"%s\"." -#: commands/tablecmds.c:13621 +#: commands/tablecmds.c:13662 #, c-format msgid "cannot alter type of a column used by a publication WHERE clause" msgstr "kan inte ändra typ på en kolumn som används av en publicerings WHERE-klausul" -#: commands/tablecmds.c:14456 commands/tablecmds.c:14468 +#: commands/tablecmds.c:14520 commands/tablecmds.c:14532 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "kan inte byta ägare på index \"%s\"" -#: commands/tablecmds.c:14458 commands/tablecmds.c:14470 +#: commands/tablecmds.c:14522 commands/tablecmds.c:14534 #, c-format msgid "Change the ownership of the index's table instead." msgstr "Byt ägare på indexets tabell istället." -#: commands/tablecmds.c:14484 +#: commands/tablecmds.c:14548 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "kan inte byta ägare på sekvens \"%s\"" -#: commands/tablecmds.c:14509 +#: commands/tablecmds.c:14573 #, c-format msgid "cannot change owner of relation \"%s\"" msgstr "kan inte byta ägare på relationen \"%s\"" -#: commands/tablecmds.c:14976 +#: commands/tablecmds.c:15040 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "kan inte ha flera underkommandon SET TABLESPACE" -#: commands/tablecmds.c:15053 +#: commands/tablecmds.c:15117 #, c-format msgid "cannot set options for relation \"%s\"" msgstr "kan inte sätta inställningar på relationen \"%s\"" -#: commands/tablecmds.c:15087 commands/view.c:440 +#: commands/tablecmds.c:15151 commands/view.c:440 #, c-format msgid "WITH CHECK OPTION is supported only on automatically updatable views" msgstr "WITH CHECK OPTION stöds bara på automatiskt uppdateringsbara vyer" -#: commands/tablecmds.c:15338 +#: commands/tablecmds.c:15402 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "bara tabeller, index och materialiserade vyer finns i tablespace:er" -#: commands/tablecmds.c:15350 +#: commands/tablecmds.c:15414 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "kan inte flytta relationer in eller ut från tablespace pg_global" -#: commands/tablecmds.c:15442 +#: commands/tablecmds.c:15506 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "avbryter då lås på relation \"%s.%s\" inte är tillgängligt" -#: commands/tablecmds.c:15458 +#: commands/tablecmds.c:15522 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr "inga matchande relationer i tablespace \"%s\" hittades" -#: commands/tablecmds.c:15580 +#: commands/tablecmds.c:15644 #, c-format msgid "cannot change inheritance of typed table" msgstr "kan inte ändra arv på en typad tabell" -#: commands/tablecmds.c:15585 commands/tablecmds.c:16085 +#: commands/tablecmds.c:15649 commands/tablecmds.c:16149 #, c-format msgid "cannot change inheritance of a partition" msgstr "kan inte ändra arv på en partition" -#: commands/tablecmds.c:15590 +#: commands/tablecmds.c:15654 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "kan inte ändra arv på en partitionerad tabell" -#: commands/tablecmds.c:15636 +#: commands/tablecmds.c:15700 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "kan inte ärva av en temporär tabell för en annan session" -#: commands/tablecmds.c:15649 +#: commands/tablecmds.c:15713 #, c-format msgid "cannot inherit from a partition" msgstr "kan inte ärva från en partition" -#: commands/tablecmds.c:15671 commands/tablecmds.c:18529 +#: commands/tablecmds.c:15735 commands/tablecmds.c:18593 #, c-format msgid "circular inheritance not allowed" msgstr "cirkulärt arv är inte tillåtet" -#: commands/tablecmds.c:15672 commands/tablecmds.c:18530 +#: commands/tablecmds.c:15736 commands/tablecmds.c:18594 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\" är redan ett barn till \"%s\"" -#: commands/tablecmds.c:15685 +#: commands/tablecmds.c:15749 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "trigger \"%s\" förhindrar tabell \"%s\" från att bli ett arvsbarn" -#: commands/tablecmds.c:15687 +#: commands/tablecmds.c:15751 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." msgstr "ROW-triggrar med övergångstabeller stöds inte i arvshierarkier." -#: commands/tablecmds.c:15876 +#: commands/tablecmds.c:15940 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "kolumn \"%s\" i barntabell måste vara markerad NOT NULL" -#: commands/tablecmds.c:15885 +#: commands/tablecmds.c:15949 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "kolumn \"%s\" i barntabell måste vara en genererad kolumn" -#: commands/tablecmds.c:15889 +#: commands/tablecmds.c:15953 #, c-format msgid "column \"%s\" in child table must not be a generated column" msgstr "kolumn \"%s\" i barntabell kan inte vara en genererad kolumn" -#: commands/tablecmds.c:15927 +#: commands/tablecmds.c:15991 #, c-format msgid "child table is missing column \"%s\"" msgstr "barntabell saknar kolumn \"%s\"" -#: commands/tablecmds.c:16008 +#: commands/tablecmds.c:16072 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "barntabell \"%s\" har annan definition av check-villkor \"%s\"" -#: commands/tablecmds.c:16015 +#: commands/tablecmds.c:16079 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "villkor \"%s\" står i konflikt med icke-ärvt villkor på barntabell \"%s\"" -#: commands/tablecmds.c:16025 +#: commands/tablecmds.c:16089 #, c-format msgid "constraint \"%s\" conflicts with NOT VALID constraint on child table \"%s\"" msgstr "villkor \"%s\" står i konflikt med NOT VALID-villkor på barntabell \"%s\"" -#: commands/tablecmds.c:16063 +#: commands/tablecmds.c:16127 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "barntabell saknar riktighetsvillkor \"%s\"" -#: commands/tablecmds.c:16149 +#: commands/tablecmds.c:16213 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "partition \"%s\" har redan en pågående bortkoppling i partitionerad tabell \"%s.%s\"" -#: commands/tablecmds.c:16178 commands/tablecmds.c:16224 +#: commands/tablecmds.c:16242 commands/tablecmds.c:16288 #, c-format msgid "relation \"%s\" is not a partition of relation \"%s\"" msgstr "relationen \"%s\" är inte partition av relationen \"%s\"" -#: commands/tablecmds.c:16230 +#: commands/tablecmds.c:16294 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "relationen \"%s\" är inte en förälder till relationen \"%s\"" -#: commands/tablecmds.c:16457 +#: commands/tablecmds.c:16521 #, c-format msgid "typed tables cannot inherit" msgstr "typade tabeller kan inte ärva" -#: commands/tablecmds.c:16487 +#: commands/tablecmds.c:16551 #, c-format msgid "table is missing column \"%s\"" msgstr "tabell saknar kolumn \"%s\"" -#: commands/tablecmds.c:16498 +#: commands/tablecmds.c:16562 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "tabell har kolumn \"%s\" där typen kräver \"%s\"" -#: commands/tablecmds.c:16507 +#: commands/tablecmds.c:16571 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "tabell \"%s\" har annan typ på kolumn \"%s\"" -#: commands/tablecmds.c:16521 +#: commands/tablecmds.c:16585 #, c-format msgid "table has extra column \"%s\"" msgstr "tabell har extra kolumn \"%s\"" -#: commands/tablecmds.c:16573 +#: commands/tablecmds.c:16637 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\" är inte en typad tabell" -#: commands/tablecmds.c:16747 +#: commands/tablecmds.c:16811 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "kan inte använda icke-unikt index \"%s\" som replikaidentitet" -#: commands/tablecmds.c:16753 +#: commands/tablecmds.c:16817 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "kan inte använda icke-immediate-index \"%s\" som replikaidentitiet" -#: commands/tablecmds.c:16759 +#: commands/tablecmds.c:16823 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "kan inte använda uttrycksindex \"%s\" som replikaidentitiet" -#: commands/tablecmds.c:16765 +#: commands/tablecmds.c:16829 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "kan inte använda partiellt index \"%s\" som replikaidentitiet" -#: commands/tablecmds.c:16782 +#: commands/tablecmds.c:16846 #, c-format msgid "index \"%s\" cannot be used as replica identity because column %d is a system column" msgstr "index \"%s\" kan inte användas som replikaidentitet då kolumn %d är en systemkolumn" -#: commands/tablecmds.c:16789 +#: commands/tablecmds.c:16853 #, c-format msgid "index \"%s\" cannot be used as replica identity because column \"%s\" is nullable" msgstr "index \"%s\" kan inte användas som replikaidentitet då kolumn \"%s\" kan vare null" -#: commands/tablecmds.c:17041 +#: commands/tablecmds.c:17105 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "kan inte ändra loggningsstatus för tabell \"%s\" då den är temporär" -#: commands/tablecmds.c:17065 +#: commands/tablecmds.c:17129 #, c-format msgid "cannot change table \"%s\" to unlogged because it is part of a publication" msgstr "kan inte ändra tabell \"%s\" till ologgad då den är del av en publicering" -#: commands/tablecmds.c:17067 +#: commands/tablecmds.c:17131 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Ologgade relatrioner kan inte replikeras." -#: commands/tablecmds.c:17112 +#: commands/tablecmds.c:17176 #, c-format msgid "could not change table \"%s\" to logged because it references unlogged table \"%s\"" msgstr "kunde inte ändra tabell \"%s\" till loggad då den refererar till ologgad tabell \"%s\"" -#: commands/tablecmds.c:17122 +#: commands/tablecmds.c:17186 #, c-format msgid "could not change table \"%s\" to unlogged because it references logged table \"%s\"" msgstr "kunde inte ändra tabell \"%s\" till ologgad då den refererar till loggad tabell \"%s\"" -#: commands/tablecmds.c:17180 +#: commands/tablecmds.c:17244 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "kan inte flytta en ägd sekvens till ett annan schema." -#: commands/tablecmds.c:17288 +#: commands/tablecmds.c:17352 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "relationen \"%s\" finns redan i schema \"%s\"" -#: commands/tablecmds.c:17713 +#: commands/tablecmds.c:17777 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "\"%s\" är inte en tabell eller materialiserad vy" -#: commands/tablecmds.c:17866 +#: commands/tablecmds.c:17930 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\" är inte en composite-typ" -#: commands/tablecmds.c:17896 +#: commands/tablecmds.c:17960 #, c-format msgid "cannot change schema of index \"%s\"" msgstr "kan inte byta schema på indexet \"%s\"" -#: commands/tablecmds.c:17898 commands/tablecmds.c:17912 +#: commands/tablecmds.c:17962 commands/tablecmds.c:17976 #, c-format msgid "Change the schema of the table instead." msgstr "Byt ägare på tabellen istället." -#: commands/tablecmds.c:17902 +#: commands/tablecmds.c:17966 #, c-format msgid "cannot change schema of composite type \"%s\"" msgstr "kan inte byta schema på composite-typen \"%s\"." -#: commands/tablecmds.c:17910 +#: commands/tablecmds.c:17974 #, c-format msgid "cannot change schema of TOAST table \"%s\"" msgstr "kan inte byta schema på TOAST-tabellen \"%s\"" -#: commands/tablecmds.c:17942 +#: commands/tablecmds.c:18006 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "kan inte använda list-partioneringsstrategi med mer än en kolumn" -#: commands/tablecmds.c:18008 +#: commands/tablecmds.c:18072 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "kolumn \"%s\" angiven i partitioneringsnyckel existerar inte" -#: commands/tablecmds.c:18016 +#: commands/tablecmds.c:18080 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "kan inte använda systemkolumn \"%s\" i partitioneringsnyckel" -#: commands/tablecmds.c:18027 commands/tablecmds.c:18117 +#: commands/tablecmds.c:18091 commands/tablecmds.c:18181 #, c-format msgid "cannot use generated column in partition key" msgstr "kan inte använda genererad kolumn i partitioneringsnyckel" -#: commands/tablecmds.c:18100 +#: commands/tablecmds.c:18164 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "partitioneringsnyckeluttryck kan inte innehålla systemkolumnreferenser" -#: commands/tablecmds.c:18147 +#: commands/tablecmds.c:18211 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "funktioner i partitioneringsuttryck måste vara markerade IMMUTABLE" -#: commands/tablecmds.c:18156 +#: commands/tablecmds.c:18220 #, c-format msgid "cannot use constant expression as partition key" msgstr "kan inte använda konstant uttryck som partitioneringsnyckel" -#: commands/tablecmds.c:18177 +#: commands/tablecmds.c:18241 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "kunde inte lista vilken jämförelse (collation) som skulle användas för partitionsuttryck" -#: commands/tablecmds.c:18212 +#: commands/tablecmds.c:18276 #, c-format msgid "You must specify a hash operator class or define a default hash operator class for the data type." msgstr "Du måste ange en hash-operatorklass eller definiera en default hash-operatorklass för datatypen." -#: commands/tablecmds.c:18218 +#: commands/tablecmds.c:18282 #, c-format msgid "You must specify a btree operator class or define a default btree operator class for the data type." msgstr "Du måste ange en btree-operatorklass eller definiera en default btree-operatorklass för datatypen." -#: commands/tablecmds.c:18469 +#: commands/tablecmds.c:18533 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\" är redan en partition" -#: commands/tablecmds.c:18475 +#: commands/tablecmds.c:18539 #, c-format msgid "cannot attach a typed table as partition" msgstr "kan inte ansluta en typad tabell som partition" -#: commands/tablecmds.c:18491 +#: commands/tablecmds.c:18555 #, c-format msgid "cannot attach inheritance child as partition" msgstr "kan inte ansluta ett arvsbarn som partition" -#: commands/tablecmds.c:18505 +#: commands/tablecmds.c:18569 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "kan inte ansluta en arvsförälder som partition" -#: commands/tablecmds.c:18539 +#: commands/tablecmds.c:18603 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "kan inte ansluta en temporär relation som partition till en permanent relation \"%s\"" -#: commands/tablecmds.c:18547 +#: commands/tablecmds.c:18611 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "kan inte ansluta en permanent relation som partition till en temporär relation \"%s\"" -#: commands/tablecmds.c:18555 +#: commands/tablecmds.c:18619 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "kan inte ansluta en partition från en temporär relation som tillhör en annan session" -#: commands/tablecmds.c:18562 +#: commands/tablecmds.c:18626 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "kan inte ansluta en temporär relation tillhörande en annan session som partition" -#: commands/tablecmds.c:18582 +#: commands/tablecmds.c:18646 #, c-format msgid "table \"%s\" being attached contains an identity column \"%s\"" msgstr "tabell \"%s\" som ansluts innehåller en identitetskolumn \"%s\"" -#: commands/tablecmds.c:18584 +#: commands/tablecmds.c:18648 #, c-format msgid "The new partition may not contain an identity column." msgstr "Den nya partitionen får inte innehålla en identitetskolumn." -#: commands/tablecmds.c:18592 +#: commands/tablecmds.c:18656 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "tabell \"%s\" innehåller kolumn \"%s\" som inte finns i föräldern \"%s\"" -#: commands/tablecmds.c:18595 +#: commands/tablecmds.c:18659 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "Den nya partitionen får bara innehålla kolumner som finns i föräldern." -#: commands/tablecmds.c:18607 +#: commands/tablecmds.c:18671 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "trigger \"%s\" förhindrar att tabell \"%s\" blir en partition" -#: commands/tablecmds.c:18609 +#: commands/tablecmds.c:18673 #, c-format msgid "ROW triggers with transition tables are not supported on partitions." msgstr "ROW-triggrar med övergångstabeller stöds inte för partitioner." -#: commands/tablecmds.c:18785 +#: commands/tablecmds.c:18849 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "kan inte ansluta främmande tabell \"%s\" som en partition till partitionerad tabell \"%s\"" -#: commands/tablecmds.c:18788 +#: commands/tablecmds.c:18852 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "Partitionerad tabell \"%s\" innehåller unika index." -#: commands/tablecmds.c:19110 +#: commands/tablecmds.c:19174 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "kan inte parallellt koppla bort en partitionerad tabell när en default-partition finns" -#: commands/tablecmds.c:19219 +#: commands/tablecmds.c:19283 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "partitionerad tabell \"%s\" togs bort parallellt" -#: commands/tablecmds.c:19225 +#: commands/tablecmds.c:19289 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "partition \"%s\" togs bort parallellt" -#: commands/tablecmds.c:19839 commands/tablecmds.c:19859 -#: commands/tablecmds.c:19880 commands/tablecmds.c:19899 -#: commands/tablecmds.c:19941 +#: commands/tablecmds.c:19911 commands/tablecmds.c:19931 +#: commands/tablecmds.c:19952 commands/tablecmds.c:19971 +#: commands/tablecmds.c:20013 #, c-format msgid "cannot attach index \"%s\" as a partition of index \"%s\"" msgstr "kan inte ansluta index \"%s\" som en partition till index \"%s\"" -#: commands/tablecmds.c:19842 +#: commands/tablecmds.c:19914 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "Index \"%s\" är redan ansluten till ett annat index." -#: commands/tablecmds.c:19862 +#: commands/tablecmds.c:19934 #, c-format msgid "Index \"%s\" is not an index on any partition of table \"%s\"." msgstr "Index \"%s\" är inte ett index för någon partition av tabell \"%s\"." -#: commands/tablecmds.c:19883 +#: commands/tablecmds.c:19955 #, c-format msgid "The index definitions do not match." msgstr "Indexdefinitionerna matchar inte." -#: commands/tablecmds.c:19902 +#: commands/tablecmds.c:19974 #, c-format msgid "The index \"%s\" belongs to a constraint in table \"%s\" but no constraint exists for index \"%s\"." msgstr "Indexet \"%s\" tillhör ett villkor på tabell \"%s\" men det finns inga villkor för indexet \"%s\"." -#: commands/tablecmds.c:19944 +#: commands/tablecmds.c:20016 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "Ett annat index är redan anslutet för partition \"%s\"." -#: commands/tablecmds.c:20180 +#: commands/tablecmds.c:20252 #, c-format msgid "column data type %s does not support compression" msgstr "kolumndatatypen %s stöder inte komprimering" -#: commands/tablecmds.c:20187 +#: commands/tablecmds.c:20259 #, c-format msgid "invalid compression method \"%s\"" msgstr "ogiltig komprimeringsmetod \"%s\"" -#: commands/tablecmds.c:20213 +#: commands/tablecmds.c:20285 #, c-format msgid "invalid storage type \"%s\"" msgstr "ogiltig lagringstyp \"%s\"" -#: commands/tablecmds.c:20223 +#: commands/tablecmds.c:20295 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "kolumndatatyp %s kan bara ha lagringsmetod PLAIN" @@ -12043,281 +12045,286 @@ msgstr "kataloger för %u kan inte tas bort" msgid "You can remove the directories manually if necessary." msgstr "Du kan ta bort dessa kataloger på egen hand om nödvändigt." -#: commands/trigger.c:225 commands/trigger.c:236 +#: commands/trigger.c:226 commands/trigger.c:237 #, c-format msgid "\"%s\" is a table" msgstr "\"%s\" är en tabell" -#: commands/trigger.c:227 commands/trigger.c:238 +#: commands/trigger.c:228 commands/trigger.c:239 #, c-format msgid "Tables cannot have INSTEAD OF triggers." msgstr "Tabeller kan inte ha INSTEAD OF-triggrar." -#: commands/trigger.c:259 +#: commands/trigger.c:260 #, c-format msgid "\"%s\" is a partitioned table" msgstr "\"%s\" är en partitionerad tabell" -#: commands/trigger.c:261 +#: commands/trigger.c:262 #, c-format msgid "ROW triggers with transition tables are not supported on partitioned tables." msgstr "ROW-triggrar med övergångstabeller stöds inte för partitionerade tabeller." -#: commands/trigger.c:273 commands/trigger.c:280 commands/trigger.c:444 +#: commands/trigger.c:274 commands/trigger.c:281 commands/trigger.c:445 #, c-format msgid "\"%s\" is a view" msgstr "\"%s\" är en vy" -#: commands/trigger.c:275 +#: commands/trigger.c:276 #, c-format msgid "Views cannot have row-level BEFORE or AFTER triggers." msgstr "Vyer kan inte ha BEFORE- eller AFTER-triggrar på radnivå." -#: commands/trigger.c:282 +#: commands/trigger.c:283 #, c-format msgid "Views cannot have TRUNCATE triggers." msgstr "Vyer kan inte ha TRUNCATE-triggrar." -#: commands/trigger.c:290 commands/trigger.c:302 commands/trigger.c:437 +#: commands/trigger.c:291 commands/trigger.c:303 commands/trigger.c:438 #, c-format msgid "\"%s\" is a foreign table" msgstr "\"%s\" är en främmande tabell" -#: commands/trigger.c:292 +#: commands/trigger.c:293 #, c-format msgid "Foreign tables cannot have INSTEAD OF triggers." msgstr "Främmande tabeller kan inte ha INSTEAD OF-triggrar." -#: commands/trigger.c:304 +#: commands/trigger.c:305 #, c-format msgid "Foreign tables cannot have constraint triggers." msgstr "Främmande tabeller kan inte ha villkorstriggrar." -#: commands/trigger.c:309 commands/trigger.c:1325 commands/trigger.c:1432 +#: commands/trigger.c:310 commands/trigger.c:1326 commands/trigger.c:1433 #, c-format msgid "relation \"%s\" cannot have triggers" msgstr "relationen \"%s\" kan inte ha triggrar" -#: commands/trigger.c:380 +#: commands/trigger.c:381 #, c-format msgid "TRUNCATE FOR EACH ROW triggers are not supported" msgstr "TRUNCATE FOR EACH ROW-triggrar stöds inte" -#: commands/trigger.c:388 +#: commands/trigger.c:389 #, c-format msgid "INSTEAD OF triggers must be FOR EACH ROW" msgstr "INSTEAD OF-trigger måste vara FOR EACH ROW" -#: commands/trigger.c:392 +#: commands/trigger.c:393 #, c-format msgid "INSTEAD OF triggers cannot have WHEN conditions" msgstr "INSTEAD OF-trigger kan inte ha WHEN-villkor" -#: commands/trigger.c:396 +#: commands/trigger.c:397 #, c-format msgid "INSTEAD OF triggers cannot have column lists" msgstr "INSTEAD OF-trigger kan inte ha en kolumnlista" -#: commands/trigger.c:425 +#: commands/trigger.c:426 #, c-format msgid "ROW variable naming in the REFERENCING clause is not supported" msgstr "ROW-variabel namngiven i REFERENCING-klausul stöds inte" -#: commands/trigger.c:426 +#: commands/trigger.c:427 #, c-format msgid "Use OLD TABLE or NEW TABLE for naming transition tables." msgstr "Använd OLD TABLE eller NEW TABLE för att namnge övergångstabeller." -#: commands/trigger.c:439 +#: commands/trigger.c:440 #, c-format msgid "Triggers on foreign tables cannot have transition tables." msgstr "Triggrar på främmande tabeller kan inte ha övergångstabeller." -#: commands/trigger.c:446 +#: commands/trigger.c:447 #, c-format msgid "Triggers on views cannot have transition tables." msgstr "Triggrar på vyer kan inte ha övergångstabeller." -#: commands/trigger.c:462 +#: commands/trigger.c:463 #, c-format msgid "ROW triggers with transition tables are not supported on partitions" msgstr "ROW-triggrar med övergångstabeller stöds inte för partitioner" -#: commands/trigger.c:466 +#: commands/trigger.c:467 #, c-format msgid "ROW triggers with transition tables are not supported on inheritance children" msgstr "ROW-triggrar med övergångstabeller stöds inte på arvsbarn" -#: commands/trigger.c:472 +#: commands/trigger.c:473 #, c-format msgid "transition table name can only be specified for an AFTER trigger" msgstr "övergångstabellnamn kan bara anges för en AFTER-trigger" -#: commands/trigger.c:477 +#: commands/trigger.c:478 #, c-format msgid "TRUNCATE triggers with transition tables are not supported" msgstr "TRUNCATE-triggrar med övergångstabeller stöds inte" -#: commands/trigger.c:494 +#: commands/trigger.c:495 #, c-format msgid "transition tables cannot be specified for triggers with more than one event" msgstr "övergångstabeller kan inte anges för triggrar med mer än ett event" -#: commands/trigger.c:505 +#: commands/trigger.c:506 #, c-format msgid "transition tables cannot be specified for triggers with column lists" msgstr "övergångstabeller kan inte anges för triggrar med kolumnlistor" -#: commands/trigger.c:522 +#: commands/trigger.c:523 #, c-format msgid "NEW TABLE can only be specified for an INSERT or UPDATE trigger" msgstr "NEW TABLE kan bara anges för en INSERT- eller UPDATE-trigger" -#: commands/trigger.c:527 +#: commands/trigger.c:528 #, c-format msgid "NEW TABLE cannot be specified multiple times" msgstr "NEW TABLE kan inte anges flera gånger" -#: commands/trigger.c:537 +#: commands/trigger.c:538 #, c-format msgid "OLD TABLE can only be specified for a DELETE or UPDATE trigger" msgstr "OLD TABLE kan bara anges för en DELETE- eller UPDATE-trigger" -#: commands/trigger.c:542 +#: commands/trigger.c:543 #, c-format msgid "OLD TABLE cannot be specified multiple times" msgstr "OLD TABLE får inte anges flera gånger" -#: commands/trigger.c:552 +#: commands/trigger.c:553 #, c-format msgid "OLD TABLE name and NEW TABLE name cannot be the same" msgstr "OLD TABLE-namn och NEW TABLE-namn får inte vara samma" -#: commands/trigger.c:616 commands/trigger.c:629 +#: commands/trigger.c:617 commands/trigger.c:630 #, c-format msgid "statement trigger's WHEN condition cannot reference column values" msgstr "satstriggrars WHEN-villkor kan inte referera till kolumnvärden" -#: commands/trigger.c:621 +#: commands/trigger.c:622 #, c-format msgid "INSERT trigger's WHEN condition cannot reference OLD values" msgstr "INSERT-triggrars WHEN-villkor kan inte referera till OLD-värden" -#: commands/trigger.c:634 +#: commands/trigger.c:635 #, c-format msgid "DELETE trigger's WHEN condition cannot reference NEW values" msgstr "DELETE-triggrars WHEN-villkor kan inte referera till NEW-värden" -#: commands/trigger.c:639 +#: commands/trigger.c:640 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW system columns" msgstr "BEFORE-triggrars WHEN-villkor kan inte referera till NEW-systemkolumner" -#: commands/trigger.c:647 commands/trigger.c:655 +#: commands/trigger.c:648 commands/trigger.c:656 #, c-format msgid "BEFORE trigger's WHEN condition cannot reference NEW generated columns" msgstr "BEFORE-triggrars WHEN-villkor kan inte referera till genererade NEW-kolumner" -#: commands/trigger.c:648 +#: commands/trigger.c:649 #, c-format msgid "A whole-row reference is used and the table contains generated columns." msgstr "En hela-raden-referens används och tabellen innehåller genererade kolumner." -#: commands/trigger.c:763 commands/trigger.c:1607 +#: commands/trigger.c:764 commands/trigger.c:1608 #, c-format msgid "trigger \"%s\" for relation \"%s\" already exists" msgstr "trigger \"%s\" för relation \"%s\" existerar redan" -#: commands/trigger.c:776 +#: commands/trigger.c:777 #, c-format msgid "trigger \"%s\" for relation \"%s\" is an internal or a child trigger" msgstr "trigger \"%s\" för relation \"%s\" är en intern eller barntrigger" -#: commands/trigger.c:795 +#: commands/trigger.c:796 #, c-format msgid "trigger \"%s\" for relation \"%s\" is a constraint trigger" msgstr "trigger \"%s\" för relation \"%s\" är en villkorstrigger" -#: commands/trigger.c:1397 commands/trigger.c:1550 commands/trigger.c:1831 +#: commands/trigger.c:1398 commands/trigger.c:1551 commands/trigger.c:1832 #, c-format msgid "trigger \"%s\" for table \"%s\" does not exist" msgstr "trigger \"%s\" för tabell \"%s\" finns inte" -#: commands/trigger.c:1522 +#: commands/trigger.c:1523 #, c-format msgid "cannot rename trigger \"%s\" on table \"%s\"" msgstr "kan inte byta namn på triggern \"%s\" på tabell \"%s\"" -#: commands/trigger.c:1524 +#: commands/trigger.c:1525 #, c-format msgid "Rename the trigger on the partitioned table \"%s\" instead." msgstr "Byt istället namn på triggern i den partitionerade tabellen \"%s\"." -#: commands/trigger.c:1624 +#: commands/trigger.c:1625 #, c-format msgid "renamed trigger \"%s\" on relation \"%s\"" msgstr "bytte namn på triggern \"%s\" i relationen \"%s\"" -#: commands/trigger.c:1770 +#: commands/trigger.c:1771 #, c-format msgid "permission denied: \"%s\" is a system trigger" msgstr "rättighet saknas: \"%s\" är en systemtrigger" -#: commands/trigger.c:2379 +#: commands/trigger.c:2382 #, c-format msgid "trigger function %u returned null value" msgstr "triggerfunktionen %u returnerade null-värde" -#: commands/trigger.c:2439 commands/trigger.c:2657 commands/trigger.c:2910 -#: commands/trigger.c:3263 +#: commands/trigger.c:2442 commands/trigger.c:2669 commands/trigger.c:2959 +#: commands/trigger.c:3349 #, c-format msgid "BEFORE STATEMENT trigger cannot return a value" msgstr "BEFORE STATEMENT-trigger kan inte returnera ett värde" -#: commands/trigger.c:2515 +#: commands/trigger.c:2518 #, c-format msgid "moving row to another partition during a BEFORE FOR EACH ROW trigger is not supported" msgstr "flytta en rad från en annan partition under en BEFORE FOR EACH ROW-trigger stöds inte" -#: commands/trigger.c:2516 +#: commands/trigger.c:2519 #, c-format msgid "Before executing trigger \"%s\", the row was to be in partition \"%s.%s\"." msgstr "Innan exekvering av triggern \"%s\" så var raden i partition \"%s.%s\"." -#: 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 +#: commands/trigger.c:2548 commands/trigger.c:2827 commands/trigger.c:3190 +#, c-format +msgid "cannot collect transition tuples from child foreign tables" +msgstr "kan inte samla in övergångstupler från främmande barntabeller" + +#: commands/trigger.c:3428 executor/nodeModifyTable.c:1563 +#: executor/nodeModifyTable.c:1637 executor/nodeModifyTable.c:2400 +#: executor/nodeModifyTable.c:2491 executor/nodeModifyTable.c:3155 +#: executor/nodeModifyTable.c:3325 #, c-format msgid "Consider using an AFTER trigger instead of a BEFORE trigger to propagate changes to other rows." msgstr "Överväg att använda en AFTER-trigger istället för en BEFORE-trigger för att propagera ändringar till andra rader." -#: 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 +#: commands/trigger.c:3470 executor/nodeLockRows.c:228 +#: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:335 +#: executor/nodeModifyTable.c:1579 executor/nodeModifyTable.c:2417 +#: executor/nodeModifyTable.c:2641 #, c-format msgid "could not serialize access due to concurrent update" msgstr "kunde inte serialisera åtkomst på grund av samtidig uppdatering" -#: commands/trigger.c:3390 executor/nodeModifyTable.c:1647 -#: executor/nodeModifyTable.c:2485 executor/nodeModifyTable.c:2642 -#: executor/nodeModifyTable.c:3150 +#: commands/trigger.c:3478 executor/nodeModifyTable.c:1669 +#: executor/nodeModifyTable.c:2508 executor/nodeModifyTable.c:2665 +#: executor/nodeModifyTable.c:3173 #, c-format msgid "could not serialize access due to concurrent delete" msgstr "kunde inte serialisera åtkomst på grund av samtidig borttagning" -#: commands/trigger.c:4599 +#: commands/trigger.c:4687 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" msgstr "kan inte trigga uppskjuten trigger i en säkerhetsbegränsad operation" -#: commands/trigger.c:5780 +#: commands/trigger.c:5868 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "integritetsvillkor \"%s\" är inte \"deferrable\"" -#: commands/trigger.c:5803 +#: commands/trigger.c:5891 #, c-format msgid "constraint \"%s\" does not exist" msgstr "integritetsvillkor \"%s\" existerar inte" @@ -12785,8 +12792,8 @@ msgstr "Bara roller med attributet %s får skapa roller." msgid "Only roles with the %s attribute may create roles with the %s attribute." msgstr "Bara roller med attributet %s får skapa roller med attributet %s." -#: 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 +#: commands/user.c:354 commands/user.c:1386 commands/user.c:1393 gram.y:17317 +#: gram.y:17363 utils/adt/acl.c:5591 utils/adt/acl.c:5597 #, c-format msgid "role name \"%s\" is reserved" msgstr "rollnamnet \"%s\" är reserverat" @@ -12881,8 +12888,8 @@ msgstr "kan inte används speciell rollangivelse i DROP ROLE" #: 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/acl.c:382 utils/adt/acl.c:402 utils/adt/acl.c:5446 +#: utils/adt/acl.c:5494 utils/adt/acl.c:5522 utils/adt/acl.c:5541 #: utils/adt/regproc.c:1571 utils/init/miscinit.c:799 #, c-format msgid "role \"%s\" does not exist" @@ -13073,122 +13080,122 @@ msgstr "rättighet saknas att ta bort rättighet som utfärdats av roll \"%s\"" msgid "Only roles with privileges of role \"%s\" may revoke privileges granted by this role." msgstr "Bara roller med rättigheter från rollen \"%s\" får ta bort rättigheter som delats ut av den rollen." -#: commands/user.c:2491 utils/adt/acl.c:1324 +#: commands/user.c:2491 utils/adt/acl.c:1341 #, c-format msgid "dependent privileges exist" msgstr "det finns beroende privilegier" -#: commands/user.c:2492 utils/adt/acl.c:1325 +#: commands/user.c:2492 utils/adt/acl.c:1342 #, c-format msgid "Use CASCADE to revoke them too." msgstr "Använd CASCADE för att återkalla dem med." -#: commands/vacuum.c:134 +#: commands/vacuum.c:135 #, c-format msgid "\"vacuum_buffer_usage_limit\" must be 0 or between %d kB and %d kB" msgstr "\"vacuum_buffer_usage_limit\" måste vara 0 eller mellan %d kB och %d kB" -#: commands/vacuum.c:209 +#: commands/vacuum.c:210 #, c-format msgid "BUFFER_USAGE_LIMIT option must be 0 or between %d kB and %d kB" msgstr "flaggan BUFFER_USAGE_LIMIT måste vara 0 eller mellan %d kB och %d kB" -#: commands/vacuum.c:219 +#: commands/vacuum.c:220 #, c-format msgid "unrecognized ANALYZE option \"%s\"" msgstr "okänd ANALYZE-flagga \"%s\"" -#: commands/vacuum.c:259 +#: commands/vacuum.c:260 #, c-format msgid "parallel option requires a value between 0 and %d" msgstr "parallell-flaggan kräver ett värde mellan 0 och %d" -#: commands/vacuum.c:271 +#: commands/vacuum.c:272 #, c-format msgid "parallel workers for vacuum must be between 0 and %d" msgstr "parallella arbetare för vacuum måste vara mellan 0 och %d" -#: commands/vacuum.c:292 +#: commands/vacuum.c:293 #, c-format msgid "unrecognized VACUUM option \"%s\"" msgstr "okänd VACUUM-flagga \"%s\"" -#: commands/vacuum.c:318 +#: commands/vacuum.c:319 #, c-format msgid "VACUUM FULL cannot be performed in parallel" msgstr "'VACUUM FULL kan inte köras parallellt" -#: commands/vacuum.c:329 +#: commands/vacuum.c:330 #, c-format msgid "BUFFER_USAGE_LIMIT cannot be specified for VACUUM FULL" msgstr "BUFFER_USAGE_LIMIT kan inte anges för VACUUM FULL" -#: commands/vacuum.c:343 +#: commands/vacuum.c:344 #, c-format msgid "ANALYZE option must be specified when a column list is provided" msgstr "ANALYZE-flaggan måste anges när en kolumnlista används" -#: commands/vacuum.c:355 +#: commands/vacuum.c:356 #, c-format msgid "VACUUM option DISABLE_PAGE_SKIPPING cannot be used with FULL" msgstr "VACUUM-flagga DISABLE_PAGE_SKIPPING kan inte anges med FULL" -#: commands/vacuum.c:362 +#: commands/vacuum.c:363 #, c-format msgid "PROCESS_TOAST required with VACUUM FULL" msgstr "PROCESS_TOAST krävs med VACUUM FULL" -#: commands/vacuum.c:371 +#: commands/vacuum.c:372 #, c-format msgid "ONLY_DATABASE_STATS cannot be specified with a list of tables" msgstr "ONLY_DATABASE_STATS kan inte anges med en lista av tabeller" -#: commands/vacuum.c:380 +#: commands/vacuum.c:381 #, c-format msgid "ONLY_DATABASE_STATS cannot be specified with other VACUUM options" msgstr "ONLY_DATABASE_STATS kan inte anges tillsammans med andra VACUUM-flaggor" -#: commands/vacuum.c:515 +#: commands/vacuum.c:516 #, c-format msgid "%s cannot be executed from VACUUM or ANALYZE" msgstr "%s kan inte köras från VACUUM eller ANALYZE" -#: commands/vacuum.c:730 +#: commands/vacuum.c:741 #, c-format msgid "permission denied to vacuum \"%s\", skipping it" msgstr "rättighet saknas för att städa \"%s\", hoppar över det" -#: commands/vacuum.c:743 +#: commands/vacuum.c:754 #, c-format msgid "permission denied to analyze \"%s\", skipping it" msgstr "rättighet saknas för att analysera \"%s\", hoppar över det" -#: commands/vacuum.c:821 commands/vacuum.c:918 +#: commands/vacuum.c:832 commands/vacuum.c:929 #, c-format msgid "skipping vacuum of \"%s\" --- lock not available" msgstr "hoppar över vacuum av \"%s\" --- lås ej tillgängligt" -#: commands/vacuum.c:826 +#: commands/vacuum.c:837 #, c-format msgid "skipping vacuum of \"%s\" --- relation no longer exists" msgstr "hoppar över vacuum av \"%s\" --- relationen finns inte längre" -#: commands/vacuum.c:842 commands/vacuum.c:923 +#: commands/vacuum.c:853 commands/vacuum.c:934 #, c-format msgid "skipping analyze of \"%s\" --- lock not available" msgstr "hoppar över analys av \"%s\" --- lås ej tillgängligt" -#: commands/vacuum.c:847 +#: commands/vacuum.c:858 #, c-format msgid "skipping analyze of \"%s\" --- relation no longer exists" msgstr "hoppar över analys av \"%s\" --- relationen finns inte längre" -#: commands/vacuum.c:1139 +#: commands/vacuum.c:1150 #, c-format msgid "cutoff for removing and freezing tuples is far in the past" msgstr "gräns för borttagning och frysande av tupler är i dåtid" -#: commands/vacuum.c:1140 commands/vacuum.c:1145 +#: commands/vacuum.c:1151 commands/vacuum.c:1156 #, c-format msgid "" "Close open transactions soon to avoid wraparound problems.\n" @@ -13197,37 +13204,37 @@ msgstr "" "Stäng öppna transaktioner för att undvika problem med wraparound.\n" "Du kan också behöva commit:a eller rulla tillbaka gamla förberedda transaktiooner alternativt slänga stillastående replikeringsslottar." -#: commands/vacuum.c:1144 +#: commands/vacuum.c:1155 #, c-format msgid "cutoff for freezing multixacts is far in the past" msgstr "gräns för frysning av multixact är från dåtid" -#: commands/vacuum.c:1900 +#: commands/vacuum.c:1911 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "några databaser har inte städats (vacuum) på över 2 miljarder transaktioner" -#: commands/vacuum.c:1901 +#: commands/vacuum.c:1912 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "Du kan redan ha fått dataförlust på grund av transaktions-wraparound." -#: commands/vacuum.c:2080 +#: commands/vacuum.c:2098 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "hoppar över \"%s\" --- kan inte köra vacuum på icke-tabeller eller speciella systemtabeller" -#: commands/vacuum.c:2512 +#: commands/vacuum.c:2545 #, c-format msgid "scanned index \"%s\" to remove %lld row versions" msgstr "genomsökte index \"%s\" för att ta bort %lld radversioner" -#: commands/vacuum.c:2531 +#: commands/vacuum.c:2564 #, c-format msgid "index \"%s\" now contains %.0f row versions in %u pages" msgstr "index \"%s\" innehåller nu %.0f radversioner i %u sidor" -#: commands/vacuum.c:2535 +#: commands/vacuum.c:2568 #, c-format msgid "" "%.0f index row versions were removed.\n" @@ -13479,26 +13486,26 @@ msgid "no value found for parameter %d" msgstr "hittade inget värde för parameter %d" #: 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 +#: executor/execExprInterp.c:4851 executor/execExprInterp.c:4868 +#: executor/execExprInterp.c:4967 executor/nodeModifyTable.c:204 +#: executor/nodeModifyTable.c:223 executor/nodeModifyTable.c:240 +#: executor/nodeModifyTable.c:250 executor/nodeModifyTable.c:260 #, c-format msgid "table row type and query-specified row type do not match" msgstr "tabellens radtyp och frågans radtyp matchar inte" -#: executor/execExpr.c:643 executor/nodeModifyTable.c:204 +#: executor/execExpr.c:643 executor/nodeModifyTable.c:205 #, c-format msgid "Query has too many columns." msgstr "Fråga har för många kolumner." -#: executor/execExpr.c:650 executor/nodeModifyTable.c:232 +#: executor/execExpr.c:650 executor/nodeModifyTable.c:224 #, c-format msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "Fråga levererar ett värde för en borttagen kolumn vid position %d." -#: executor/execExpr.c:656 executor/execExprInterp.c:4870 -#: executor/nodeModifyTable.c:215 +#: executor/execExpr.c:656 executor/execExprInterp.c:4869 +#: executor/nodeModifyTable.c:251 #, c-format msgid "Table has type %s at ordinal position %d, but query expects %s." msgstr "Tabellen har typ %s vid position %d, men frågan förväntar sig %s." @@ -13583,7 +13590,7 @@ msgstr "Array med elementtyp %s kan inte inkluderas i ARRAY-konstruktion med ele #: 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/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)" @@ -13602,7 +13609,7 @@ msgstr "flerdimensionella vektorer måste ha array-uttryck av passande dimension #: 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/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 @@ -13640,14 +13647,14 @@ msgstr "ingen SQL/JSON-post hittades i angiven sökväg" msgid "could not coerce %s expression (%s) to the RETURNING type" msgstr "kunde inte omvandla %s-uttryck (%s) till typen för RETURNING" -#: executor/execExprInterp.c:4853 +#: executor/execExprInterp.c:4852 #, 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] "Tabellrad har %d attribut, men frågan förväntar sig %d." msgstr[1] "Tabellrad har %d attribut, men frågan förväntar sig %d." -#: executor/execExprInterp.c:4969 executor/execSRF.c:977 +#: executor/execExprInterp.c:4968 executor/execSRF.c:977 #, c-format msgid "Physical storage mismatch on dropped attribute at ordinal position %d." msgstr "Fysisk lagrings matchar inte för borttaget attribut på position %d." @@ -13757,7 +13764,7 @@ msgstr "kan inte låsa rader i vy \"%s\"" msgid "cannot lock rows in materialized view \"%s\"" msgstr "kan inte låsa rader i materialiserad vy \"%s\"" -#: executor/execMain.c:1177 executor/execMain.c:2687 +#: executor/execMain.c:1177 executor/execMain.c:2689 #: executor/nodeLockRows.c:135 #, c-format msgid "cannot lock rows in foreign table \"%s\"" @@ -13849,10 +13856,10 @@ msgstr "samtidig uppdatering, försöker igen" msgid "concurrent delete, retrying" msgstr "samtidig borttagning, försöker igen" -#: executor/execReplication.c:352 parser/parse_cte.c:302 +#: 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:6426 +#: 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" @@ -14095,64 +14102,69 @@ msgstr "RIGHT JOIN stöds bara med merge-joinbara join-villor" msgid "FULL JOIN is only supported with merge-joinable join conditions" msgstr "FULL JOIN stöds bara med merge-joinbara join-villkor" -#: executor/nodeModifyTable.c:240 +#: executor/nodeModifyTable.c:241 +#, c-format +msgid "Query provides a value for a generated column at ordinal position %d." +msgstr "Fråga levererar ett värde för en genererad kolumn vid position %d." + +#: executor/nodeModifyTable.c:261 #, c-format msgid "Query has too few columns." msgstr "Frågan har för få kolumner" -#: executor/nodeModifyTable.c:1540 executor/nodeModifyTable.c:1614 +#: executor/nodeModifyTable.c:1562 executor/nodeModifyTable.c:1636 #, c-format msgid "tuple to be deleted was already modified by an operation triggered by the current command" msgstr "tupel som skall tas bort hade redan ändrats av en operation som triggats av aktuellt kommando" -#: executor/nodeModifyTable.c:1769 +#: executor/nodeModifyTable.c:1791 #, c-format msgid "invalid ON UPDATE specification" msgstr "ogiltig ON UPDATE-angivelse" -#: executor/nodeModifyTable.c:1770 +#: executor/nodeModifyTable.c:1792 #, c-format msgid "The result tuple would appear in a different partition than the original tuple." msgstr "Resultattupeln kommer dyka upp i en annan partition än originaltupeln." -#: executor/nodeModifyTable.c:2226 +#: executor/nodeModifyTable.c:2249 #, 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 "kan inte flytta en tupel mellan partitioner när en icke-root-förälder av källpartitionen direkt refereras av en främmande nyckel" -#: executor/nodeModifyTable.c:2227 +#: executor/nodeModifyTable.c:2250 #, c-format msgid "A foreign key points to ancestor \"%s\" but not the root ancestor \"%s\"." msgstr "En främmande nyckel pekar på förfadern \"%s\" men inte på root-förfadern \"%s\"." -#: executor/nodeModifyTable.c:2230 +#: executor/nodeModifyTable.c:2253 #, c-format msgid "Consider defining the foreign key on table \"%s\"." msgstr "Överväg att skapa den främmande nyckeln på tabellen \"%s\"." #. translator: %s is a SQL command name -#: executor/nodeModifyTable.c:2596 executor/nodeModifyTable.c:3138 -#: executor/nodeModifyTable.c:3308 +#: executor/nodeModifyTable.c:2619 executor/nodeModifyTable.c:3161 +#: executor/nodeModifyTable.c:3331 #, c-format msgid "%s command cannot affect row a second time" msgstr "%s-kommandot kan inte påverka raden en andra gång" -#: executor/nodeModifyTable.c:2598 +#: executor/nodeModifyTable.c:2621 #, c-format msgid "Ensure that no rows proposed for insertion within the same command have duplicate constrained values." msgstr "Säkerställ att inga rader föreslagna för \"insert\" inom samma kommando har upprepade villkorsvärden." -#: executor/nodeModifyTable.c:3131 executor/nodeModifyTable.c:3301 +#: executor/nodeModifyTable.c:3154 executor/nodeModifyTable.c:3324 #, c-format msgid "tuple to be updated or deleted was already modified by an operation triggered by the current command" msgstr "tupel som skall uppdateras eller raderas hade redan ändrats av en operation som triggats av aktuellt kommando" -#: executor/nodeModifyTable.c:3140 executor/nodeModifyTable.c:3310 +#: executor/nodeModifyTable.c:3163 executor/nodeModifyTable.c:3333 #, c-format msgid "Ensure that not more than one source row matches any one target row." msgstr "Säkerställ att inte mer än en källrad matchar någon målrad." -#: executor/nodeModifyTable.c:3209 +#: executor/nodeModifyTable.c:3232 #, c-format msgid "tuple to be merged was already moved to another partition due to concurrent update" msgstr "tupel som skall slås samman har redan flyttats till en annan partition på grund av samtidig update" @@ -14315,7 +14327,7 @@ msgstr "kunde inte skicka tupel till kö i delat minne: %m" msgid "user mapping not found for user \"%s\", server \"%s\"" msgstr "användarmappning hittades inte för användare \"%s\", server \"%s\"" -#: foreign/foreign.c:336 optimizer/plan/createplan.c:7153 +#: foreign/foreign.c:336 optimizer/plan/createplan.c:7155 #: optimizer/util/plancat.c:540 #, c-format msgid "access to non-system foreign table is restricted" @@ -14530,200 +14542,205 @@ msgstr "motstridiga eller överflödiga NULL / NOT NULL-deklarationer för kolum msgid "unrecognized column option \"%s\"" msgstr "okänd kolumnflagga \"%s\"" -#: gram.y:14147 +#: gram.y:14098 +#, c-format +msgid "option name \"%s\" cannot be used in XMLTABLE" +msgstr "flaggnamn \"%s\" kan inte användas i XMLTABLE" + +#: gram.y:14154 #, c-format msgid "only string constants are supported in JSON_TABLE path specification" msgstr "enbart strängkonstanter stöds i angiven sökväg för JSON_TABLE" -#: gram.y:14469 +#: gram.y:14476 #, c-format msgid "precision for type float must be at least 1 bit" msgstr "precisionen för typen float måste vara minst 1 bit" -#: gram.y:14478 +#: gram.y:14485 #, c-format msgid "precision for type float must be less than 54 bits" msgstr "precisionen för typen float måste vara mindre än 54 bits" -#: gram.y:14995 +#: gram.y:15002 #, c-format msgid "wrong number of parameters on left side of OVERLAPS expression" msgstr "fel antal parametrar på vänster sida om OVERLAPS-uttryck" -#: gram.y:15000 +#: gram.y:15007 #, c-format msgid "wrong number of parameters on right side of OVERLAPS expression" msgstr "fel antal parametrar på höger sida om OVERLAPS-uttryck" -#: gram.y:15177 +#: gram.y:15184 #, c-format msgid "UNIQUE predicate is not yet implemented" msgstr "UNIQUE-predikat är inte implementerat ännu" -#: gram.y:15591 +#: gram.y:15598 #, c-format msgid "cannot use multiple ORDER BY clauses with WITHIN GROUP" msgstr "kan inte ha multipla ORDER BY-klausuler med WITHIN GROUP" -#: gram.y:15596 +#: gram.y:15603 #, c-format msgid "cannot use DISTINCT with WITHIN GROUP" msgstr "kan inte använda DISTINCT med WITHIN GROUP" -#: gram.y:15601 +#: gram.y:15608 #, c-format msgid "cannot use VARIADIC with WITHIN GROUP" msgstr "kan inte använda VARIADIC med WITHIN GROUP" -#: gram.y:16328 gram.y:16352 +#: gram.y:16335 gram.y:16359 #, c-format msgid "frame start cannot be UNBOUNDED FOLLOWING" msgstr "fönsterramstart kan inte vara UNBOUNDED FOLLOWING" -#: gram.y:16333 +#: gram.y:16340 #, c-format msgid "frame starting from following row cannot end with current row" msgstr "fönsterram som startar på efterföljande rad kan inte sluta på nuvarande rad" -#: gram.y:16357 +#: gram.y:16364 #, c-format msgid "frame end cannot be UNBOUNDED PRECEDING" msgstr "fönsterramslut kan inte vara UNBOUNDED PRECEDING" -#: gram.y:16363 +#: gram.y:16370 #, c-format msgid "frame starting from current row cannot have preceding rows" msgstr "fönsterram som startar på aktuell rad kan inte ha föregående rader" -#: gram.y:16370 +#: gram.y:16377 #, c-format msgid "frame starting from following row cannot have preceding rows" msgstr "fönsterram som startar på efterföljande rad kan inte ha föregående rader" -#: gram.y:16919 +#: gram.y:16926 #, c-format msgid "unrecognized JSON encoding: %s" msgstr "okänd JSON-kodning: %s" -#: gram.y:17243 +#: gram.y:17250 #, c-format msgid "type modifier cannot have parameter name" msgstr "typmodifierare kan inte ha paremeternamn" -#: gram.y:17249 +#: gram.y:17256 #, c-format msgid "type modifier cannot have ORDER BY" msgstr "typmodifierare kan inte ha ORDER BY" -#: gram.y:17317 gram.y:17324 gram.y:17331 +#: gram.y:17324 gram.y:17331 gram.y:17338 #, c-format msgid "%s cannot be used as a role name here" msgstr "%s kan inte användas som ett rollnamn här" -#: gram.y:17421 gram.y:18906 +#: gram.y:17428 gram.y:18913 #, c-format msgid "WITH TIES cannot be specified without ORDER BY clause" msgstr "WITH TIES kan inte anges utan en ORDER BY-klausul" -#: gram.y:18597 gram.y:18772 +#: gram.y:18604 gram.y:18779 msgid "improper use of \"*\"" msgstr "felaktig användning av \"*\"" -#: gram.y:18735 gram.y:18752 tsearch/spell.c:963 tsearch/spell.c:980 -#: tsearch/spell.c:997 tsearch/spell.c:1014 tsearch/spell.c:1079 +#: gram.y:18742 gram.y:18759 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 "syntaxfel" -#: gram.y:18836 +#: gram.y:18843 #, c-format msgid "an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type" msgstr "ett sorterad-mängd-aggregat med ett direkt VARIADIC-argument måste ha ett aggregerat VARIADIC-argument av samma datatype" -#: gram.y:18873 +#: gram.y:18880 #, c-format msgid "multiple ORDER BY clauses not allowed" msgstr "multipla ORDER BY-klausuler tillåts inte" -#: gram.y:18884 +#: gram.y:18891 #, c-format msgid "multiple OFFSET clauses not allowed" msgstr "multipla OFFSET-klausuler tillåts inte" -#: gram.y:18893 +#: gram.y:18900 #, c-format msgid "multiple LIMIT clauses not allowed" msgstr "multipla LIMIT-klausuler tillåts inte" -#: gram.y:18902 +#: gram.y:18909 #, c-format msgid "multiple limit options not allowed" msgstr "multipla limit-alternativ tillåts inte" -#: gram.y:18929 +#: gram.y:18936 #, c-format msgid "multiple WITH clauses not allowed" msgstr "multipla WITH-klausuler tillåts inte" -#: gram.y:19122 +#: gram.y:19129 #, c-format msgid "OUT and INOUT arguments aren't allowed in TABLE functions" msgstr "OUT och INOUT-argument tillåts inte i TABLE-funktioner" -#: gram.y:19255 +#: gram.y:19262 #, c-format msgid "multiple COLLATE clauses not allowed" msgstr "multipla COLLATE-klausuler tillåts inte" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:19293 gram.y:19306 +#: gram.y:19300 gram.y:19313 #, c-format msgid "%s constraints cannot be marked DEFERRABLE" msgstr "%s-villkor kan inte markeras DEFERRABLE" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:19319 +#: gram.y:19326 #, c-format msgid "%s constraints cannot be marked NOT VALID" msgstr "%s-villkor kan inte markeras NOT VALID" #. translator: %s is CHECK, UNIQUE, or similar -#: gram.y:19332 +#: gram.y:19339 #, c-format msgid "%s constraints cannot be marked NO INHERIT" msgstr "%s-villkor kan inte markeras NO INHERIT" -#: gram.y:19354 +#: gram.y:19361 #, c-format msgid "unrecognized partitioning strategy \"%s\"" msgstr "okänd partitioneringsstrategi \"%s\"" -#: gram.y:19378 +#: gram.y:19385 #, c-format msgid "invalid publication object list" msgstr "ogiltig objektlista för publicering" -#: gram.y:19379 +#: gram.y:19386 #, c-format msgid "One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name." msgstr "En av TABLE eller ALL TABLES IN SCHEMA måste anges innan en enskild tabell eller ett schemanamn." -#: gram.y:19395 +#: gram.y:19402 #, c-format msgid "invalid table name" msgstr "ogiltigt tabellnamn" -#: gram.y:19416 +#: gram.y:19423 #, c-format msgid "WHERE clause not allowed for schema" msgstr "WHERE-klausul tillåts inte för schema" -#: gram.y:19423 +#: gram.y:19430 #, c-format msgid "column specification not allowed for schema" msgstr "kolumnspecifikation tillåts inte för schema" -#: gram.y:19437 +#: gram.y:19444 #, c-format msgid "invalid schema name" msgstr "ogiltigt schemanamn" @@ -14786,7 +14803,7 @@ msgstr "A list of the problematic subscriptions is in the file:" msgid "Unrecognized flag character \"%.*s\" in LIKE_REGEX predicate." msgstr "okänt flaggtecken \"%.*s\" i LIKE_REGEX-predikat." -#: jsonpath_gram.y:629 tsearch/spell.c:749 utils/adt/regexp.c:223 +#: jsonpath_gram.y:629 tsearch/spell.c:750 utils/adt/regexp.c:223 #, c-format msgid "invalid regular expression: %s" msgstr "ogiltigt reguljärt uttryck: %s" @@ -15021,545 +15038,545 @@ msgstr "Trasigt bevis i klient-slut-meddelande." msgid "Garbage found at the end of client-final-message." msgstr "Hittade skräp i slutet av klient-slut-meddelande." -#: libpq/auth.c:269 +#: libpq/auth.c:277 #, c-format msgid "authentication failed for user \"%s\": host rejected" msgstr "autentisering misslyckades för användare \"%s\": host blockerad" -#: libpq/auth.c:272 +#: libpq/auth.c:280 #, c-format msgid "\"trust\" authentication failed for user \"%s\"" msgstr "\"trust\"-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:275 +#: libpq/auth.c:283 #, c-format msgid "Ident authentication failed for user \"%s\"" msgstr "Ident-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:278 +#: libpq/auth.c:286 #, c-format msgid "Peer authentication failed for user \"%s\"" msgstr "Peer-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:283 +#: libpq/auth.c:291 #, c-format msgid "password authentication failed for user \"%s\"" msgstr "Lösenordsautentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:288 +#: libpq/auth.c:296 #, c-format msgid "GSSAPI authentication failed for user \"%s\"" msgstr "GSSAPI-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:291 +#: libpq/auth.c:299 #, c-format msgid "SSPI authentication failed for user \"%s\"" msgstr "SSPI-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:294 +#: libpq/auth.c:302 #, c-format msgid "PAM authentication failed for user \"%s\"" msgstr "PAM-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:297 +#: libpq/auth.c:305 #, c-format msgid "BSD authentication failed for user \"%s\"" msgstr "BSD-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:300 +#: libpq/auth.c:308 #, c-format msgid "LDAP authentication failed for user \"%s\"" msgstr "LDAP-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:303 +#: libpq/auth.c:311 #, c-format msgid "certificate authentication failed for user \"%s\"" msgstr "certifikat-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:306 +#: libpq/auth.c:314 #, c-format msgid "RADIUS authentication failed for user \"%s\"" msgstr "RADOUS-autentisering misslyckades för användare \"%s\"" -#: libpq/auth.c:309 +#: libpq/auth.c:317 #, c-format msgid "authentication failed for user \"%s\": invalid authentication method" msgstr "autentisering misslyckades för användare \"%s\": okänd autentiseringsmetod" -#: libpq/auth.c:313 +#: libpq/auth.c:321 #, c-format msgid "Connection matched file \"%s\" line %d: \"%s\"" msgstr "Anslutning matchade filen \"%s\", rad %d: \"%s\"" -#: libpq/auth.c:357 +#: libpq/auth.c:365 #, c-format msgid "authentication identifier set more than once" msgstr "identifierare för autentisering satt mer än en gång" -#: libpq/auth.c:358 +#: libpq/auth.c:366 #, c-format msgid "previous identifier: \"%s\"; new identifier: \"%s\"" msgstr "föregående identifierare: \"%s\"; ny identifierare: \"%s\"" -#: libpq/auth.c:368 +#: libpq/auth.c:376 #, c-format msgid "connection authenticated: identity=\"%s\" method=%s (%s:%d)" msgstr "anslutning autentiserad: identitet=\"%s\" metod=%s (%s:%d)" -#: libpq/auth.c:408 +#: libpq/auth.c:416 #, c-format msgid "client certificates can only be checked if a root certificate store is available" msgstr "klientcertifikat kan bara kontrolleras om lagrade root-certifikat finns tillgängligt" -#: libpq/auth.c:419 +#: libpq/auth.c:427 #, c-format msgid "connection requires a valid client certificate" msgstr "Anslutning kräver ett giltigt klientcertifikat" -#: libpq/auth.c:450 libpq/auth.c:496 +#: libpq/auth.c:458 libpq/auth.c:504 msgid "GSS encryption" msgstr "GSS-kryptering" -#: libpq/auth.c:453 libpq/auth.c:499 +#: libpq/auth.c:461 libpq/auth.c:507 msgid "SSL encryption" msgstr "SSL-kryptering" -#: libpq/auth.c:455 libpq/auth.c:501 +#: libpq/auth.c:463 libpq/auth.c:509 msgid "no encryption" msgstr "ingen kryptering" #. translator: last %s describes encryption state -#: libpq/auth.c:461 +#: libpq/auth.c:469 #, c-format msgid "pg_hba.conf rejects replication connection for host \"%s\", user \"%s\", %s" msgstr "pg_hba.conf avvisar replikeringsanslutning för värd \"%s\", användare \"%s\", %s" #. translator: last %s describes encryption state -#: libpq/auth.c:468 +#: libpq/auth.c:476 #, c-format msgid "pg_hba.conf rejects connection for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "pg_hba.conf avvisar anslutning för värd \"%s\", användare \"%s\", databas \"%s\", %s" -#: libpq/auth.c:506 +#: libpq/auth.c:514 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup matches." msgstr "Klient-IP-adress uppslagen till \"%s\", skickat uppslag matchar." -#: libpq/auth.c:509 +#: libpq/auth.c:517 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup not checked." msgstr "Klient-IP-adress uppslagen till \"%s\", skickat uppslag är inte kontrollerat." -#: libpq/auth.c:512 +#: libpq/auth.c:520 #, c-format msgid "Client IP address resolved to \"%s\", forward lookup does not match." msgstr "Klient-IP-adress uppslagen till \"%s\", skickat uppslag matchar inte." -#: libpq/auth.c:515 +#: libpq/auth.c:523 #, c-format msgid "Could not translate client host name \"%s\" to IP address: %s." msgstr "Kunde inte översätta klientvärdnamn \"%s\" till IP-adress: %s" -#: libpq/auth.c:520 +#: libpq/auth.c:528 #, c-format msgid "Could not resolve client IP address to a host name: %s." msgstr "Kunde inte slå upp klient-IP-adress och få värdnamn: %s." #. translator: last %s describes encryption state -#: libpq/auth.c:528 +#: libpq/auth.c:536 #, c-format msgid "no pg_hba.conf entry for replication connection from host \"%s\", user \"%s\", %s" msgstr "ingen rad i pg_hba.conf för replikeringsanslutning från värd \"%s\", användare \"%s\", %s" #. translator: last %s describes encryption state -#: libpq/auth.c:536 +#: libpq/auth.c:544 #, c-format msgid "no pg_hba.conf entry for host \"%s\", user \"%s\", database \"%s\", %s" msgstr "ingen rad i pg_hba.conf för värd \"%s\", användare \"%s\", databas \"%s\", %s" -#: libpq/auth.c:656 +#: libpq/auth.c:664 #, c-format msgid "connection authenticated: user=\"%s\" method=%s (%s:%d)" msgstr "anslutning autentiserad: användare=\"%s\" metod=%s (%s:%d)" -#: libpq/auth.c:725 +#: libpq/auth.c:733 #, c-format msgid "expected password response, got message type %d" msgstr "förväntade lösenordssvar, fick meddelandetyp %d" -#: libpq/auth.c:746 +#: libpq/auth.c:754 #, c-format msgid "invalid password packet size" msgstr "felaktig storlek på lösenordspaket" -#: libpq/auth.c:764 +#: libpq/auth.c:772 #, c-format msgid "empty password returned by client" msgstr "tomt lösenord returnerat av klient" -#: libpq/auth.c:892 +#: libpq/auth.c:900 #, c-format msgid "could not generate random MD5 salt" msgstr "kunde inte generera slumpmässigt MD5-salt" -#: libpq/auth.c:943 libpq/be-secure-gssapi.c:540 +#: libpq/auth.c:951 libpq/be-secure-gssapi.c:550 #, c-format msgid "could not set environment: %m" msgstr "kunde inte sätta omgivningsvariabel: %m" -#: libpq/auth.c:982 +#: libpq/auth.c:990 #, c-format msgid "expected GSS response, got message type %d" msgstr "förväntade GSS-svar, fick meddelandetyp %d" -#: libpq/auth.c:1048 +#: libpq/auth.c:1056 msgid "accepting GSS security context failed" msgstr "accepterande av GSS-säkerhetskontext misslyckades" -#: libpq/auth.c:1089 +#: libpq/auth.c:1097 msgid "retrieving GSS user name failed" msgstr "mottagande av GSS-användarnamn misslyckades" -#: libpq/auth.c:1235 +#: libpq/auth.c:1243 msgid "could not acquire SSPI credentials" msgstr "kunde inte hämta SSPI-referenser" -#: libpq/auth.c:1260 +#: libpq/auth.c:1268 #, c-format msgid "expected SSPI response, got message type %d" msgstr "förväntade SSPI-svar, fick meddelandetyp %d" -#: libpq/auth.c:1338 +#: libpq/auth.c:1346 msgid "could not accept SSPI security context" msgstr "kunde inte acceptera SSPI-säkerhetskontext" -#: libpq/auth.c:1379 +#: libpq/auth.c:1387 msgid "could not get token from SSPI security context" msgstr "kunde inte hämta token från SSPI-säkerhetskontext" -#: libpq/auth.c:1515 libpq/auth.c:1534 +#: libpq/auth.c:1523 libpq/auth.c:1542 #, c-format msgid "could not translate name" msgstr "kunde inte översätta namn" -#: libpq/auth.c:1547 +#: libpq/auth.c:1555 #, c-format msgid "realm name too long" msgstr "realm-namn för långt" -#: libpq/auth.c:1562 +#: libpq/auth.c:1570 #, c-format msgid "translated account name too long" msgstr "översatt kontonamn för långt" -#: libpq/auth.c:1741 +#: libpq/auth.c:1749 #, c-format msgid "could not create socket for Ident connection: %m" msgstr "kunde inte skapa uttag (socket) för Ident-anslutning: %m" -#: libpq/auth.c:1756 +#: libpq/auth.c:1764 #, c-format msgid "could not bind to local address \"%s\": %m" msgstr "kunde inte binda till lokal adress \"%s\": %m" -#: libpq/auth.c:1768 +#: libpq/auth.c:1776 #, c-format msgid "could not connect to Ident server at address \"%s\", port %s: %m" msgstr "kunde inte ansluta till Ident-server på adress \"%s\", port %s: %m" -#: libpq/auth.c:1790 +#: libpq/auth.c:1798 #, c-format msgid "could not send query to Ident server at address \"%s\", port %s: %m" msgstr "kunde inte skicka fråga till Ident-server på adress \"%s\", port %s: %m" -#: libpq/auth.c:1807 +#: libpq/auth.c:1815 #, c-format msgid "could not receive response from Ident server at address \"%s\", port %s: %m" msgstr "kunde inte ta emot svar från Ident-server på adress \"%s\", port %s: %m" -#: libpq/auth.c:1817 +#: libpq/auth.c:1825 #, c-format msgid "invalidly formatted response from Ident server: \"%s\"" msgstr "ogiltigt formatterat svar från Ident-server: \"%s\"" -#: libpq/auth.c:1870 +#: libpq/auth.c:1878 #, c-format msgid "peer authentication is not supported on this platform" msgstr "peer-autentisering stöds inte på denna plattform" -#: libpq/auth.c:1874 +#: libpq/auth.c:1882 #, c-format msgid "could not get peer credentials: %m" msgstr "kunde inte hämta peer-referenser: %m" -#: libpq/auth.c:1886 +#: libpq/auth.c:1894 #, c-format msgid "could not look up local user ID %ld: %s" msgstr "kunde inte slå upp lokalt användar-id %ld: %s" -#: libpq/auth.c:1988 +#: libpq/auth.c:1996 #, c-format msgid "error from underlying PAM layer: %s" msgstr "fel från underliggande PAM-lager: %s" -#: libpq/auth.c:1999 +#: libpq/auth.c:2007 #, c-format msgid "unsupported PAM conversation %d/\"%s\"" msgstr "ej stödd PAM-konversation: %d/\"%s\"" -#: libpq/auth.c:2056 +#: libpq/auth.c:2064 #, c-format msgid "could not create PAM authenticator: %s" msgstr "kunde inte skapa PAM-autentiserare: %s" -#: libpq/auth.c:2067 +#: libpq/auth.c:2075 #, c-format msgid "pam_set_item(PAM_USER) failed: %s" msgstr "pam_set_item(PAM_USER) misslyckades: %s" -#: libpq/auth.c:2099 +#: libpq/auth.c:2107 #, c-format msgid "pam_set_item(PAM_RHOST) failed: %s" msgstr "pam_set_item(PAM_RHOST) misslyckades: %s" -#: libpq/auth.c:2111 +#: libpq/auth.c:2119 #, c-format msgid "pam_set_item(PAM_CONV) failed: %s" msgstr "pam_set_item(PAM_CONV) misslyckades: %s" -#: libpq/auth.c:2124 +#: libpq/auth.c:2132 #, c-format msgid "pam_authenticate failed: %s" msgstr "pam_authenticate misslyckades: %s" -#: libpq/auth.c:2137 +#: libpq/auth.c:2145 #, c-format msgid "pam_acct_mgmt failed: %s" msgstr "pam_acct_mgmt misslyckades: %s" -#: libpq/auth.c:2148 +#: libpq/auth.c:2156 #, c-format msgid "could not release PAM authenticator: %s" msgstr "kunde inte fria PAM-autentiserare: %s" -#: libpq/auth.c:2228 +#: libpq/auth.c:2236 #, c-format msgid "could not initialize LDAP: error code %d" msgstr "kunde inte initiera LDAP: felkod %d" -#: libpq/auth.c:2265 +#: libpq/auth.c:2273 #, c-format msgid "could not extract domain name from ldapbasedn" msgstr "kunde inte extrahera domännamn från ldapbasedn" -#: libpq/auth.c:2273 +#: libpq/auth.c:2281 #, c-format msgid "LDAP authentication could not find DNS SRV records for \"%s\"" msgstr "LDAP-autentisering kunde inte hitta DNS SRV-poster för \"%s\"" -#: libpq/auth.c:2275 +#: libpq/auth.c:2283 #, c-format msgid "Set an LDAP server name explicitly." msgstr "Ange LDAP-servernamnet explicit." -#: libpq/auth.c:2327 +#: libpq/auth.c:2335 #, c-format msgid "could not initialize LDAP: %s" msgstr "kunde inte initiera LDAP: %s" -#: libpq/auth.c:2337 +#: libpq/auth.c:2345 #, c-format msgid "ldaps not supported with this LDAP library" msgstr "ldaps stöds inte med detta LDAP-bibliotek" -#: libpq/auth.c:2345 +#: libpq/auth.c:2353 #, c-format msgid "could not initialize LDAP: %m" msgstr "kunde inte initiera LDAP: %m" -#: libpq/auth.c:2355 +#: libpq/auth.c:2363 #, c-format msgid "could not set LDAP protocol version: %s" msgstr "kunde inte sätta LDAP-protokollversion: %s" -#: libpq/auth.c:2371 +#: libpq/auth.c:2379 #, c-format msgid "could not start LDAP TLS session: %s" msgstr "kunde inte starta LDAP TLS-session: %s" -#: libpq/auth.c:2448 +#: libpq/auth.c:2456 #, c-format msgid "LDAP server not specified, and no ldapbasedn" msgstr "LDAP-server inte angiven och ingen ldapbasedn" -#: libpq/auth.c:2455 +#: libpq/auth.c:2463 #, c-format msgid "LDAP server not specified" msgstr "LDAP-server inte angiven" -#: libpq/auth.c:2517 +#: libpq/auth.c:2525 #, c-format msgid "invalid character in user name for LDAP authentication" msgstr "ogiltigt tecken i användarnamn för LDAP-autentisering" -#: libpq/auth.c:2534 +#: libpq/auth.c:2542 #, c-format msgid "could not perform initial LDAP bind for ldapbinddn \"%s\" on server \"%s\": %s" msgstr "kunde inte utföra initial LDAP-bindning med ldapbinddn \"%s\" på server \"%s\": %s" -#: libpq/auth.c:2564 +#: libpq/auth.c:2572 #, c-format msgid "could not search LDAP for filter \"%s\" on server \"%s\": %s" msgstr "kunde inte söka i LDAP med filter \"%s\" på server \"%s\": %s" -#: libpq/auth.c:2580 +#: libpq/auth.c:2588 #, c-format msgid "LDAP user \"%s\" does not exist" msgstr "LDAP-användare \"%s\" finns inte" -#: libpq/auth.c:2581 +#: libpq/auth.c:2589 #, c-format msgid "LDAP search for filter \"%s\" on server \"%s\" returned no entries." msgstr "LDAP-sökning med filter \"%s\" på server \"%s\" returnerade inga poster." -#: libpq/auth.c:2585 +#: libpq/auth.c:2593 #, c-format msgid "LDAP user \"%s\" is not unique" msgstr "LDAP-användare \"%s\" är inte unik" -#: libpq/auth.c:2586 +#: libpq/auth.c:2594 #, 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ökning med filter \"%s\" på server \"%s\" returnerade %d post." msgstr[1] "LDAP-sökning med filter \"%s\" på server \"%s\" returnerade %d poster." -#: libpq/auth.c:2606 +#: libpq/auth.c:2614 #, c-format msgid "could not get dn for the first entry matching \"%s\" on server \"%s\": %s" msgstr "kunde inte hämta dn för första posten som matchar \"%s\" på värd \"%s\": %s" -#: libpq/auth.c:2633 +#: libpq/auth.c:2641 #, c-format msgid "LDAP login failed for user \"%s\" on server \"%s\": %s" msgstr "LDAP-inloggning misslyckades för användare \"%s\" på värd \"%s\": %s" -#: libpq/auth.c:2665 +#: libpq/auth.c:2673 #, c-format msgid "LDAP diagnostics: %s" msgstr "LDAP-diagnostik: %s" -#: libpq/auth.c:2703 +#: libpq/auth.c:2711 #, c-format msgid "certificate authentication failed for user \"%s\": client certificate contains no user name" msgstr "certifikatautentisering misslyckades för användare \"%s\": klientcertifikatet innehåller inget användarnamn" -#: libpq/auth.c:2724 +#: libpq/auth.c:2732 #, c-format msgid "certificate authentication failed for user \"%s\": unable to retrieve subject DN" msgstr "certifikat-autentisering misslyckades för användare \"%s\": kan inte hämta subject DN" -#: libpq/auth.c:2747 +#: libpq/auth.c:2755 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": DN mismatch" msgstr "certifikat-validering (clientcert=verify-full) misslyckades för användare \"%s\": DN matchade inte" -#: libpq/auth.c:2752 +#: libpq/auth.c:2760 #, c-format msgid "certificate validation (clientcert=verify-full) failed for user \"%s\": CN mismatch" msgstr "certifikat-validering (clientcert=verify-full) misslyckades för användare \"%s\": CN matchade inte" -#: libpq/auth.c:2854 +#: libpq/auth.c:2862 #, c-format msgid "RADIUS server not specified" msgstr "RADIUS-server inte angiven" -#: libpq/auth.c:2861 +#: libpq/auth.c:2869 #, c-format msgid "RADIUS secret not specified" msgstr "RADIUS-hemlighet inte angiven" -#: libpq/auth.c:2875 +#: libpq/auth.c:2883 #, c-format msgid "RADIUS authentication does not support passwords longer than %d characters" msgstr "RADIUS-autentisering stöder inte längre lösenord än %d tecken" -#: libpq/auth.c:2977 libpq/hba.c:2352 +#: libpq/auth.c:2985 libpq/hba.c:2352 #, c-format msgid "could not translate RADIUS server name \"%s\" to address: %s" msgstr "kunde inte översätta RADIUS-värdnamn \"%s\" till adress: %s" -#: libpq/auth.c:2991 +#: libpq/auth.c:2999 #, c-format msgid "could not generate random encryption vector" msgstr "kunde inte generera slumpad kodningsvektor" -#: libpq/auth.c:3028 +#: libpq/auth.c:3036 #, c-format msgid "could not perform MD5 encryption of password: %s" msgstr "kunde inte utföra MD5-kryptering av lösenord: %s" -#: libpq/auth.c:3055 +#: libpq/auth.c:3063 #, c-format msgid "could not create RADIUS socket: %m" msgstr "kunde inte skapa RADIUS-uttag (socket): %m" -#: libpq/auth.c:3071 +#: libpq/auth.c:3079 #, c-format msgid "could not bind local RADIUS socket: %m" msgstr "kunde inte binda lokalt RADIUS-uttag (socket): %m" -#: libpq/auth.c:3081 +#: libpq/auth.c:3089 #, c-format msgid "could not send RADIUS packet: %m" msgstr "kan inte skicka RADIUS-paketet: %m" -#: libpq/auth.c:3115 libpq/auth.c:3141 +#: libpq/auth.c:3123 libpq/auth.c:3149 #, c-format msgid "timeout waiting for RADIUS response from %s" msgstr "timeout vid väntande på RADIUS-svar från %s" -#: libpq/auth.c:3134 +#: libpq/auth.c:3142 #, c-format msgid "could not check status on RADIUS socket: %m" msgstr "kunde inte kontrollera status på RADIUS-uttag (socket): %m" -#: libpq/auth.c:3164 +#: libpq/auth.c:3172 #, c-format msgid "could not read RADIUS response: %m" msgstr "kunde inte läsa RADIUS-svar: %m" -#: libpq/auth.c:3172 +#: libpq/auth.c:3180 #, c-format msgid "RADIUS response from %s was sent from incorrect port: %d" msgstr "RADIUS-svar från %s skickades från fel port: %d" -#: libpq/auth.c:3180 +#: libpq/auth.c:3188 #, c-format msgid "RADIUS response from %s too short: %d" msgstr "RADIUS-svar från %s är för kort: %d" -#: libpq/auth.c:3187 +#: libpq/auth.c:3195 #, c-format msgid "RADIUS response from %s has corrupt length: %d (actual length %d)" msgstr "RADIUS-svar från %s har felaktig längd: %d (riktig längd %d)" -#: libpq/auth.c:3195 +#: libpq/auth.c:3203 #, c-format msgid "RADIUS response from %s is to a different request: %d (should be %d)" msgstr "RADIUS-svar från %s tillhör en annan förfrågan: %d (skall vara %d)" -#: libpq/auth.c:3220 +#: libpq/auth.c:3228 #, c-format msgid "could not perform MD5 encryption of received packet: %s" msgstr "kunde inte utföra MD5-kryptering på mottaget paket: %s" -#: libpq/auth.c:3230 +#: libpq/auth.c:3238 #, c-format msgid "RADIUS response from %s has incorrect MD5 signature" msgstr "RADIUS-svar från %s har inkorrekt MD5-signatur" -#: libpq/auth.c:3248 +#: libpq/auth.c:3256 #, c-format msgid "RADIUS response from %s has invalid code (%d) for user \"%s\"" msgstr "RADIUS-svar från %s har ogiltig kod (%d) för användare \"%s\"" @@ -15651,44 +15668,39 @@ msgstr "privat nyckelfil \"%s\" har grupp eller världsaccess" 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 "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." -#: libpq/be-secure-gssapi.c:201 +#: libpq/be-secure-gssapi.c:208 msgid "GSSAPI wrap error" msgstr "GSSAPI-fel vid inpackning" -#: libpq/be-secure-gssapi.c:208 +#: libpq/be-secure-gssapi.c:215 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "utående GSSAPI-meddelande skulle inte använda sekretess" -#: libpq/be-secure-gssapi.c:215 libpq/be-secure-gssapi.c:634 +#: libpq/be-secure-gssapi.c:222 libpq/be-secure-gssapi.c:644 #, c-format msgid "server tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "servern försöke skicka för stort GSSAPI-paket (%zu > %zu)" -#: libpq/be-secure-gssapi.c:351 +#: libpq/be-secure-gssapi.c:358 libpq/be-secure-gssapi.c:585 #, c-format msgid "oversize GSSAPI packet sent by the client (%zu > %zu)" msgstr "för stort GSSAPI-paket skickat av klienten (%zu > %zu)" -#: libpq/be-secure-gssapi.c:389 +#: libpq/be-secure-gssapi.c:396 msgid "GSSAPI unwrap error" msgstr "GSSAPI-fel vid uppackning" -#: libpq/be-secure-gssapi.c:396 +#: libpq/be-secure-gssapi.c:403 #, c-format msgid "incoming GSSAPI message did not use confidentiality" msgstr "inkommande GSSAPI-meddelande använde inte sekretess" -#: 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:600 +#: libpq/be-secure-gssapi.c:610 msgid "could not accept GSSAPI security context" msgstr "kunde inte acceptera GSSSPI-säkerhetskontext" -#: libpq/be-secure-gssapi.c:701 +#: libpq/be-secure-gssapi.c:728 msgid "GSSAPI size check error" msgstr "GSSAPI-fel vid kontroll av storlek" @@ -16781,14 +16793,14 @@ msgstr "utökningsbar nodtyp \"%s\" finns redan" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "ExtensibleNodeMethods \"%s\" har inte registerats" -#: nodes/makefuncs.c:152 statistics/extended_stats.c:2310 +#: 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 "relationen \"%s\" har ingen composite-typ" #: 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 +#: 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" @@ -16804,12 +16816,12 @@ msgstr "portal \"%s\" med parametrar: %s" msgid "unnamed portal with parameters: %s" msgstr "ej namngiven portal med parametrar: %s" -#: optimizer/path/joinrels.c:972 +#: optimizer/path/joinrels.c:973 #, 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:7175 parser/parse_merge.c:203 +#: optimizer/plan/createplan.c:7177 parser/parse_merge.c:203 #: rewrite/rewriteHandler.c:1680 #, c-format msgid "cannot execute MERGE on relation \"%s\"" @@ -16828,38 +16840,38 @@ msgstr "%s kan inte appliceras på den nullbara sidan av en outer join" msgid "%s is not allowed with UNION/INTERSECT/EXCEPT" msgstr "%s tillåts inte med UNION/INTERSECT/EXCEPT" -#: optimizer/plan/planner.c:2121 optimizer/plan/planner.c:4108 +#: optimizer/plan/planner.c:2121 optimizer/plan/planner.c:4151 #, c-format msgid "could not implement GROUP BY" msgstr "kunde inte implementera GROUP BY" -#: optimizer/plan/planner.c:2122 optimizer/plan/planner.c:4109 -#: optimizer/plan/planner.c:4790 optimizer/prep/prepunion.c:1320 +#: 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 "Några av datatyperna stöder bara hash:ning medan andra bara stöder sortering." -#: optimizer/plan/planner.c:4789 +#: optimizer/plan/planner.c:4832 #, c-format msgid "could not implement DISTINCT" msgstr "kunde inte implementera DISTINCT" -#: optimizer/plan/planner.c:6134 +#: optimizer/plan/planner.c:6177 #, c-format msgid "could not implement window PARTITION BY" msgstr "kunde inte implementera fönster-PARTITION BY" -#: optimizer/plan/planner.c:6135 +#: optimizer/plan/planner.c:6178 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Fönsterpartitioneringskolumner måsta ha en sorterbar datatyp." -#: optimizer/plan/planner.c:6139 +#: optimizer/plan/planner.c:6182 #, c-format msgid "could not implement window ORDER BY" msgstr "kunde inte implementera fönster-ORDER BY" -#: optimizer/plan/planner.c:6140 +#: optimizer/plan/planner.c:6183 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Fönsterordningskolumner måste ha en sorterbar datatyp." @@ -17335,7 +17347,7 @@ msgstr "yttre aggregat kan inte innehålla inre variabel i sitt direkta argument msgid "aggregate function calls cannot contain set-returning function calls" msgstr "aggregatfunktionsanrop kan inte innehålla mängdreturnerande funktionsanrop" -#: parser/parse_agg.c:780 parser/parse_expr.c:1762 parser/parse_expr.c:2245 +#: 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." @@ -17732,8 +17744,8 @@ 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:2146 parser/parse_expr.c:2754 parser/parse_expr.c:3405 -#: parser/parse_expr.c:3634 parser/parse_target.c:998 +#: 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 "kan inte omvandla typ %s till %s" @@ -17928,147 +17940,147 @@ 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:136 +#: parser/parse_cte.c:137 #, 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:308 +#: parser/parse_cte.c:309 #, 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:335 +#: parser/parse_cte.c:336 #, 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:384 +#: 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 "rekursiv fråga \"%s\" kolumn %d har typ %s i den ickerekursiva termen med typ %s totalt sett" -#: parser/parse_cte.c:390 +#: parser/parse_cte.c:391 #, 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:395 +#: 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 "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:399 +#: parser/parse_cte.c:400 #, 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:420 +#: parser/parse_cte.c:421 #, c-format msgid "WITH query is not recursive" msgstr "WITH-fråga är inte rekursiv" -#: parser/parse_cte.c:451 +#: 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 "med en SEARCH- eller CYCLE-klausul så måste vänstersidan av en UNION vara en SELECT" -#: parser/parse_cte.c:456 +#: 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 "med en SEARCH- eller CYCLE-klausul så måste högersidan av en UNION vara en SELECT" -#: parser/parse_cte.c:471 +#: parser/parse_cte.c:472 #, 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:478 +#: parser/parse_cte.c:479 #, c-format msgid "search column \"%s\" specified more than once" msgstr "sökkolumn \"%s\" angiven mer än en gång" -#: parser/parse_cte.c:487 +#: parser/parse_cte.c:488 #, 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:504 +#: parser/parse_cte.c:505 #, 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:511 +#: parser/parse_cte.c:512 #, c-format msgid "cycle column \"%s\" specified more than once" msgstr "cycle-kolumn \"%s\" angiven mer än en gång" -#: parser/parse_cte.c:520 +#: parser/parse_cte.c:521 #, 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:527 +#: parser/parse_cte.c:528 #, 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:535 +#: parser/parse_cte.c:536 #, 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:545 +#: parser/parse_cte.c:546 #, 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:552 +#: parser/parse_cte.c:553 #, 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:636 +#: parser/parse_cte.c:637 #, 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:816 +#: parser/parse_cte.c:882 #, c-format msgid "mutual recursion between WITH items is not implemented" msgstr "ömsesidig rekursion mellan WITH-poster är inte implementerat" -#: parser/parse_cte.c:868 +#: parser/parse_cte.c:934 #, 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:876 +#: parser/parse_cte.c:942 #, 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:911 +#: parser/parse_cte.c:977 #, 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:917 +#: parser/parse_cte.c:983 #, 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:923 +#: parser/parse_cte.c:989 #, 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:929 +#: parser/parse_cte.c:995 #, 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:1008 +#: parser/parse_cte.c:1074 #, 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" @@ -18126,13 +18138,13 @@ msgid "there is no parameter $%d" msgstr "det finns ingen parameter $%d" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1103 parser/parse_expr.c:3065 +#: parser/parse_expr.c:1103 parser/parse_expr.c:3073 #, c-format 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:1109 parser/parse_expr.c:3072 +#: parser/parse_expr.c:1109 parser/parse_expr.c:3080 #, c-format msgid "%s must not return a set" msgstr "%s får inte returnera en mängd" @@ -18153,7 +18165,7 @@ msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() ex 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:1760 parser/parse_expr.c:2243 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 "mängdreturnerande funktioner tillåts inte i %s" @@ -18210,7 +18222,7 @@ msgstr "kan inte använda subfråga i COPY FROM WHERE-villkor" msgid "cannot use subquery in column generation expression" msgstr "kan inte använda subfråga i kolumngenereringsuttryck" -#: parser/parse_expr.c:1914 parser/parse_expr.c:3764 +#: parser/parse_expr.c:1914 parser/parse_expr.c:3772 #, c-format msgid "subquery must return only one column" msgstr "underfråga kan bara returnera en kolumn" @@ -18225,174 +18237,174 @@ msgstr "underfråga har för många kolumner" msgid "subquery has too few columns" msgstr "underfråga har för få kolumner" -#: parser/parse_expr.c:2086 +#: parser/parse_expr.c:2094 #, c-format msgid "cannot determine type of empty array" msgstr "kan inte bestämma typen av en tom array" -#: parser/parse_expr.c:2087 +#: parser/parse_expr.c:2095 #, 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:2101 +#: parser/parse_expr.c:2109 #, 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:2184 +#: parser/parse_expr.c:2192 #, c-format msgid "ROW expressions can have at most %d entries" msgstr "ROW-uttryck kan ha som mest %d poster" -#: parser/parse_expr.c:2389 +#: parser/parse_expr.c:2397 #, 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:2390 +#: parser/parse_expr.c:2398 #, 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:2405 +#: parser/parse_expr.c:2413 #, 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:2513 +#: parser/parse_expr.c:2521 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "kan inte typomvandla XMLSERIALIZE-resultat till %s" -#: parser/parse_expr.c:2827 parser/parse_expr.c:3023 +#: parser/parse_expr.c:2835 parser/parse_expr.c:3031 #, c-format msgid "unequal number of entries in row expressions" msgstr "olika antal element i raduttryck" -#: parser/parse_expr.c:2837 +#: parser/parse_expr.c:2845 #, c-format msgid "cannot compare rows of zero length" msgstr "kan inte jämföra rader med längden noll" -#: parser/parse_expr.c:2862 +#: parser/parse_expr.c:2870 #, 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:2869 +#: parser/parse_expr.c:2877 #, 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:2928 parser/parse_expr.c:2969 +#: parser/parse_expr.c:2936 parser/parse_expr.c:2977 #, 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:2930 +#: parser/parse_expr.c:2938 #, 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:2971 +#: parser/parse_expr.c:2979 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "Det finns flera lika sannolika kandidater." -#: parser/parse_expr.c:3306 +#: parser/parse_expr.c:3314 #, 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 +#: parser/parse_expr.c:3378 #, 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 +#: parser/parse_expr.c:3379 #, 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 +#: parser/parse_expr.c:3468 #, 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 +#: parser/parse_expr.c:3481 #, 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 +#: parser/parse_expr.c:3486 #, c-format msgid "unsupported JSON encoding" msgstr "ej stödd JSON-kodning" -#: parser/parse_expr.c:3479 +#: parser/parse_expr.c:3487 #, c-format msgid "Only UTF8 JSON encoding is supported." msgstr "Enbart JSON-kodningen UTF8 stöds." -#: parser/parse_expr.c:3516 +#: parser/parse_expr.c:3524 #, 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 +#: parser/parse_expr.c:3529 #, 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 +#: parser/parse_expr.c:3857 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 +#: parser/parse_expr.c:4080 #, 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 +#: parser/parse_expr.c:4100 #, 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 +#: parser/parse_expr.c:4126 parser/parse_expr.c:4247 #, 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 +#: parser/parse_expr.c:4128 #, c-format msgid "Try returning json or jsonb." msgstr "Försök returnera json eller jsonb." -#: parser/parse_expr.c:4168 +#: parser/parse_expr.c:4176 #, 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 +#: parser/parse_expr.c:4250 #, 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 +#: parser/parse_expr.c:4315 #, 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 +#: 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 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_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" @@ -18400,7 +18412,7 @@ 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 +#: 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 "Bara uttrycken ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT eller DEFAULT tillåts i %s för %s." @@ -18408,68 +18420,68 @@ msgstr "Bara uttrycken ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT eller DEFAULT till #. 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 +#: 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 "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 +#: 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 "Bara uttrycken ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT eller DEFAULT tillåts i %s för formatterade kolumner." -#: parser/parse_expr.c:4395 +#: parser/parse_expr.c:4403 #, 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 +#: parser/parse_expr.c:4413 #, 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 +#: 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 "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 +#: 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 "Bara uttrycken ERROR, NULL eller DEFAULT tillåts i %s för skalära kolumner." -#: parser/parse_expr.c:4489 +#: parser/parse_expr.c:4497 #, 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 +#: parser/parse_expr.c:4715 #, 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 +#: parser/parse_expr.c:4720 #, c-format msgid "DEFAULT expression must not contain column references" msgstr "DEFAULT-uttryck får inte innehålla kolumnreferenser" -#: parser/parse_expr.c:4717 +#: parser/parse_expr.c:4725 #, 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 +#: parser/parse_expr.c:4801 parser/parse_expr.c:4810 #, 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 +#: parser/parse_expr.c:4804 #, c-format msgid "You will need to explicitly cast the expression to type %s." msgstr "Du måste explicit omvandla uttrycket till typen %s." @@ -19804,32 +19816,32 @@ msgstr "Misslyckat systemanrop var MapViewOfFileEx." 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:2203 +#: postmaster/autovacuum.c:2218 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "autovacuum: slänger övergiven temptabell \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2439 +#: postmaster/autovacuum.c:2461 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "automatisk vacuum av tabell \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2442 +#: postmaster/autovacuum.c:2464 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "automatisk analys av tabell \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2636 +#: postmaster/autovacuum.c:2660 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "processar arbetspost för relation \"%s.%s.%s\"" -#: postmaster/autovacuum.c:3254 +#: postmaster/autovacuum.c:3291 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "autovacuum har inte startats på grund av en felkonfigurering" -#: postmaster/autovacuum.c:3255 +#: postmaster/autovacuum.c:3292 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Slå på flaggan \"track_counts\"." @@ -19886,24 +19898,24 @@ msgid_plural "Up to %d background workers can be registered with the current set 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:931 postmaster/checkpointer.c:445 +#: postmaster/bgworker.c:931 postmaster/checkpointer.c:448 #, c-format msgid "Consider increasing the configuration parameter \"%s\"." msgstr "Överväg att öka konfigurationsparametern \"%s\"." -#: postmaster/checkpointer.c:441 +#: postmaster/checkpointer.c:444 #, 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:1067 +#: postmaster/checkpointer.c:1073 #, c-format msgid "checkpoint request failed" msgstr "checkpoint-behgäran misslyckades" -#: postmaster/checkpointer.c:1068 +#: postmaster/checkpointer.c:1074 #, c-format msgid "Consult recent messages in the server log for details." msgstr "Se senaste meddelanden i serverloggen för mer information." @@ -20709,22 +20721,22 @@ msgstr "kunde inte skicka data till kö i delat minne" 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 +#: replication/logical/decode.c:177 replication/logical/logical.c:143 #, 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 +#: replication/logical/launcher.c:347 #, 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:427 +#: replication/logical/launcher.c:440 #, c-format msgid "out of logical replication worker slots" msgstr "slut på logiska replikeringsarbetarslots" -#: replication/logical/launcher.c:428 replication/logical/launcher.c:514 +#: replication/logical/launcher.c:441 replication/logical/launcher.c:527 #: 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 @@ -20733,111 +20745,111 @@ msgstr "slut på logiska replikeringsarbetarslots" msgid "You might need to increase \"%s\"." msgstr "Du kan behöva öka \"%s\"." -#: replication/logical/launcher.c:513 +#: replication/logical/launcher.c:526 #, c-format msgid "out of background worker slots" msgstr "slut på bakgrundsarbetarslots" -#: replication/logical/launcher.c:720 +#: replication/logical/launcher.c:733 #, 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:729 +#: replication/logical/launcher.c:742 #, 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:121 +#: replication/logical/logical.c:123 #, c-format msgid "logical decoding requires \"wal_level\" >= \"logical\"" msgstr "logisk avkodning kräver \"wal_level\" >= \"logical\"" -#: replication/logical/logical.c:126 +#: replication/logical/logical.c:128 #, c-format msgid "logical decoding requires a database connection" msgstr "logisk avkodning kräver en databasanslutning" -#: replication/logical/logical.c:365 replication/logical/logical.c:519 +#: replication/logical/logical.c:367 replication/logical/logical.c:521 #, 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:370 replication/logical/logical.c:529 +#: replication/logical/logical.c:372 replication/logical/logical.c:531 #, 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:377 +#: replication/logical/logical.c:379 #, 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:540 +#: replication/logical/logical.c:542 #, 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/logical/logical.c:544 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 +#: replication/logical/logical.c:545 #, c-format msgid "Specify another replication slot." msgstr "Ange en annan replikeringsslot." -#: replication/logical/logical.c:554 replication/logical/logical.c:561 +#: replication/logical/logical.c:556 replication/logical/logical.c:563 #, 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 +#: replication/logical/logical.c:558 #, 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 +#: replication/logical/logical.c:565 #, 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 +#: replication/logical/logical.c:630 #, c-format msgid "starting logical decoding for slot \"%s\"" msgstr "startar logisk avkodning för slot \"%s\"" -#: replication/logical/logical.c:630 +#: replication/logical/logical.c:632 #, 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:778 +#: replication/logical/logical.c:780 #, 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:784 +#: replication/logical/logical.c:786 #, 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:955 replication/logical/logical.c:1000 -#: replication/logical/logical.c:1045 replication/logical/logical.c:1091 +#: replication/logical/logical.c:957 replication/logical/logical.c:1002 +#: replication/logical/logical.c:1047 replication/logical/logical.c:1093 #, 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:1323 replication/logical/logical.c:1372 -#: replication/logical/logical.c:1413 replication/logical/logical.c:1499 -#: replication/logical/logical.c:1548 +#: replication/logical/logical.c:1325 replication/logical/logical.c:1374 +#: replication/logical/logical.c:1415 replication/logical/logical.c:1501 +#: replication/logical/logical.c:1550 #, c-format msgid "logical streaming requires a %s callback" msgstr "logisk strömning kräven en %s-callback" -#: replication/logical/logical.c:1458 +#: replication/logical/logical.c:1460 #, 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" @@ -20934,7 +20946,7 @@ msgid "could not find free replication state slot for replication origin with ID msgstr "kunde inte hitta ledig replikerings-state-slot för replikerings-origin med ID %d" #: replication/logical/origin.c:957 replication/logical/origin.c:1158 -#: replication/slot.c:2384 +#: replication/slot.c:2397 #, c-format msgid "Increase \"max_replication_slots\" and try again." msgstr "Öka \"max_replication_slots\" och försök igen." @@ -20987,57 +20999,52 @@ msgstr "destinationsrelation \"%s.%s\" för logisk replikering använder systemk msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "destinationsrelation \"%s.%s\" för logisk replikering finns inte" -#: replication/logical/reorderbuffer.c:3999 +#: replication/logical/reorderbuffer.c:4129 #, 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:4345 -#: replication/logical/reorderbuffer.c:4370 +#: replication/logical/reorderbuffer.c:4475 +#: replication/logical/reorderbuffer.c:4500 #, 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:4349 -#: replication/logical/reorderbuffer.c:4374 +#: replication/logical/reorderbuffer.c:4479 +#: replication/logical/reorderbuffer.c:4504 #, 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:4624 +#: replication/logical/reorderbuffer.c:4754 #, 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:5120 +#: replication/logical/reorderbuffer.c:5250 #, 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/slotsync.c:215 +#: replication/logical/slotsync.c:215 replication/logical/slotsync.c:579 #, 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" +msgid "could not synchronize replication slot \"%s\"" +msgstr "kunde inte synkronisera replikeringsslot \"%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 "Fjärrslotten har LSN %X/%X och katalog-xmin %u men lokala slotten har LSN %X/%X och katalog-xmin %u." +msgid "Synchronization could lead to data loss, because the remote slot needs WAL at LSN %X/%X and catalog xmin %u, but the standby has LSN %X/%X and catalog xmin %u." +msgstr "Synkronisering kan leda till dataförlust eftersom fjärrslotten kräver WAL vid LSN %X/%X och katalog-xmin %u men standby 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" +msgid "Synchronization could lead to data loss, because the standby could not build a consistent snapshot to decode WALs at LSN %X/%X." +msgstr "Synkronisering kan leda till dataförlust eftersom standby:en inte kunde skapa en konsistent snapshot för att avkoda WAL vid LSN %X/%X." #: replication/logical/slotsync.c:589 #, c-format @@ -21088,7 +21095,7 @@ msgstr "replikeringsslot \"%s\" angiven av %s finns inte på den primära server 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 +#: replication/logical/slotsync.c:1048 #, c-format msgid "replication slot synchronization requires \"wal_level\" >= \"logical\"" msgstr "synkronisering av replikeringsslot kräver at \"wal_level\" >= \"logical\"" @@ -21136,7 +21143,7 @@ msgstr "kan inte synkronisera replikeringsslottar parallellt" msgid "slot sync worker started" msgstr "arbetare för slot-synk startad" -#: replication/logical/slotsync.c:1466 replication/slotfuncs.c:900 +#: replication/logical/slotsync.c:1466 replication/slotfuncs.c:926 #: replication/walreceiver.c:307 #, c-format msgid "could not connect to the primary server: %s" @@ -21154,58 +21161,58 @@ 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:1404 replication/logical/snapbuild.c:1501 -#: replication/logical/snapbuild.c:2017 +#: replication/logical/snapbuild.c:1451 replication/logical/snapbuild.c:1548 +#: replication/logical/snapbuild.c:2064 #, c-format msgid "logical decoding found consistent point at %X/%X" msgstr "logisk avkodning hittade konsistent punkt vid %X/%X" -#: replication/logical/snapbuild.c:1406 +#: replication/logical/snapbuild.c:1453 #, c-format msgid "There are no running transactions." msgstr "Det finns inga körande transaktioner." -#: replication/logical/snapbuild.c:1453 +#: replication/logical/snapbuild.c:1500 #, 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:1455 replication/logical/snapbuild.c:1479 +#: replication/logical/snapbuild.c:1502 replication/logical/snapbuild.c:1526 #, 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:1477 +#: replication/logical/snapbuild.c:1524 #, 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:1503 +#: replication/logical/snapbuild.c:1550 #, c-format msgid "There are no old transactions anymore." msgstr "Det finns inte längre några gamla transaktioner." -#: replication/logical/snapbuild.c:1904 +#: replication/logical/snapbuild.c:1951 #, 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:1910 +#: replication/logical/snapbuild.c:1957 #, 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:1951 +#: replication/logical/snapbuild.c:1998 #, 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:2019 +#: replication/logical/snapbuild.c:2066 #, c-format msgid "Logical decoding will begin using saved snapshot." msgstr "Logisk avkodning kommer starta med sparat snapshot." -#: replication/logical/snapbuild.c:2126 +#: replication/logical/snapbuild.c:2173 #, c-format msgid "could not parse file name \"%s\"" msgstr "kunde inte parsa filnamn \"%s\"" @@ -21215,207 +21222,207 @@ msgstr "kunde inte parsa filnamn \"%s\"" 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:641 +#: replication/logical/tablesync.c:667 #, 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:827 replication/logical/tablesync.c:969 +#: replication/logical/tablesync.c:853 replication/logical/tablesync.c:995 #, 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:834 +#: replication/logical/tablesync.c:860 #, c-format msgid "table \"%s.%s\" not found on publisher" msgstr "tabell \"%s.%s\" hittades inte hos publicerare" -#: replication/logical/tablesync.c:892 +#: replication/logical/tablesync.c:918 #, 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:1071 +#: replication/logical/tablesync.c:1097 #, 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:1230 +#: replication/logical/tablesync.c:1256 #, 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:1429 +#: replication/logical/tablesync.c:1455 #, 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:1472 +#: replication/logical/tablesync.c:1498 #, c-format msgid "replication origin \"%s\" already exists" msgstr "replikeringsurspring \"%s\" finns redan" -#: replication/logical/tablesync.c:1505 replication/logical/worker.c:2361 +#: replication/logical/tablesync.c:1531 replication/logical/worker.c:2363 #, 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 +#: replication/logical/tablesync.c:1544 #, 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:481 +#: replication/logical/worker.c:483 #, c-format 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 +#: replication/logical/worker.c:485 #, 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:852 replication/logical/worker.c:967 +#: replication/logical/worker.c:854 replication/logical/worker.c:969 #, c-format msgid "incorrect binary data format in logical replication column %d" msgstr "inkorrekt binärt dataformat i logisk replikeringskolumn %d" -#: replication/logical/worker.c:2500 +#: 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 "publicerare skickade inte identitetskolumn för replika som förväntades av den logiska replikeringens målrelation \"%s.%s\"" -#: replication/logical/worker.c:2507 +#: 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 "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:3371 +#: replication/logical/worker.c:3384 #, c-format msgid "invalid logical replication message type \"??? (%d)\"" msgstr "ogiltig logisk replikeringsmeddelandetyp \"??? (%d)\"" -#: replication/logical/worker.c:3543 +#: replication/logical/worker.c:3556 #, c-format msgid "data stream from publisher has ended" msgstr "dataströmmen från publiceraren har avslutats" -#: replication/logical/worker.c:3697 +#: replication/logical/worker.c:3710 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "avslutar logisk replikeringsarbetare på grund av timeout" -#: replication/logical/worker.c:3891 +#: replication/logical/worker.c:3904 #, 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 +#: replication/logical/worker.c:3918 #, 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 +#: replication/logical/worker.c:3949 #, 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 +#: replication/logical/worker.c:3953 #, c-format 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:3954 +#: 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 "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:3958 +#: 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 "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:4478 +#: replication/logical/worker.c:4499 #, c-format msgid "subscription has no replication slot set" msgstr "prenumeration har ingen replikeringsslot angiven" -#: replication/logical/worker.c:4591 +#: replication/logical/worker.c:4620 #, c-format 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:4607 +#: replication/logical/worker.c:4636 #, c-format 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:4631 +#: replication/logical/worker.c:4660 #, 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:4636 +#: replication/logical/worker.c:4665 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "logiska replikeringens ändringsapplicerare för prenumeration \"%s\" har startat" -#: replication/logical/worker.c:4758 +#: replication/logical/worker.c:4795 #, 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:4806 +#: replication/logical/worker.c:4843 #, 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:4820 +#: replication/logical/worker.c:4857 #, 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:4902 +#: replication/logical/worker.c:4945 #, c-format msgid "skip-LSN of subscription \"%s\" cleared" msgstr "överhoppnings-LSN för logiska prenumerationen \"%s\" har nollställts" -#: replication/logical/worker.c:4903 +#: replication/logical/worker.c:4946 #, 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:4940 +#: replication/logical/worker.c:4974 #, 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:4944 +#: replication/logical/worker.c:4978 #, 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:4949 +#: replication/logical/worker.c:4983 #, 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:4960 +#: replication/logical/worker.c:4994 #, 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 +#: replication/logical/worker.c:5001 #, 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:4978 +#: replication/logical/worker.c:5012 #, 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 +#: replication/logical/worker.c:5020 #, 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" @@ -21520,7 +21527,7 @@ msgstr "alla replikeringsslots används" msgid "Free one or increase \"max_replication_slots\"." msgstr "Frigör en eller öka \"max_replication_slots\"." -#: replication/slot.c:560 replication/slot.c:2450 replication/slotfuncs.c:661 +#: replication/slot.c:560 replication/slot.c:2463 replication/slotfuncs.c:661 #: utils/activity/pgstat_replslot.c:56 utils/adt/genfile.c:728 #, c-format msgid "replication slot \"%s\" does not exist" @@ -21571,7 +21578,7 @@ msgstr "kan inte ändra replikeringsslot \"%s\"" 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 +#: replication/slot.c:969 replication/slot.c:1923 replication/slot.c:2307 #, c-format msgid "could not remove directory \"%s\"" msgstr "kunde inte ta bort katalog \"%s\"" @@ -21622,102 +21629,112 @@ msgstr "avslutar process %d för att frigöra replikeringsslot \"%s\"" msgid "invalidating obsolete replication slot \"%s\"" msgstr "invaliderar obsolet replikeringssslot \"%s\"" -#: replication/slot.c:2249 +#: replication/slot.c:2245 #, 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:2256 +#: replication/slot.c:2252 #, c-format msgid "replication slot file \"%s\" has unsupported version %u" msgstr "replikeringsslotfil \"%s\" har en icke stödd version %u" -#: replication/slot.c:2263 +#: replication/slot.c:2259 #, c-format msgid "replication slot file \"%s\" has corrupted length %u" msgstr "replikeringsslotfil \"%s\" har felaktig längd %u" -#: replication/slot.c:2299 +#: replication/slot.c:2295 #, 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:2333 +#: replication/slot.c:2331 #, c-format msgid "logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"" msgstr "logisk replikeringsslot \"%s\" finns men \"wal_level\" < \"replica\"" -#: replication/slot.c:2335 +#: replication/slot.c:2333 #, c-format msgid "Change \"wal_level\" to be \"logical\" or higher." msgstr "Ändra \"wal_level\" till \"logical\" eller högre." -#: replication/slot.c:2339 +#: replication/slot.c:2345 +#, c-format +msgid "logical replication slot \"%s\" exists on the standby, but \"hot_standby\" = \"off\"" +msgstr "logisk replikeringsslot \"%s\" finns på standby men \"hot_standby\" = \"off\"" + +#: replication/slot.c:2347 +#, c-format +msgid "Change \"hot_standby\" to be \"on\"." +msgstr "Ändra \"hot_standby\" till \"on\"." + +#: replication/slot.c:2352 #, c-format msgid "physical replication slot \"%s\" exists, but \"wal_level\" < \"replica\"" msgstr "fysisk replikeringsslot \"%s\" finns men \"wal_level\" < \"replica\"" -#: replication/slot.c:2341 +#: replication/slot.c:2354 #, c-format msgid "Change \"wal_level\" to be \"replica\" or higher." msgstr "Ändra \"wal_level\" till \"replica\" eller högre." -#: replication/slot.c:2383 +#: replication/slot.c:2396 #, c-format msgid "too many replication slots active before shutdown" msgstr "för många aktiva replikeringsslottar innan nerstängning" -#: replication/slot.c:2458 +#: replication/slot.c:2471 #, c-format msgid "\"%s\" is not a physical replication slot" msgstr "\"%s\" är inte en fysisk replikeringsslot" -#: replication/slot.c:2635 +#: replication/slot.c:2650 #, 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 +#: replication/slot.c:2652 replication/slot.c:2686 replication/slot.c:2701 #, 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 +#: replication/slot.c:2654 #, c-format msgid "Create the replication slot \"%s\" or amend parameter \"%s\"." msgstr "Skapa replikeringsslotten \"%s\" eller ändra parametern \"%s\"" -#: replication/slot.c:2649 +#: replication/slot.c:2664 #, 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 +#: replication/slot.c:2666 #, 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 +#: replication/slot.c:2668 #, 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 +#: replication/slot.c:2684 #, 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 +#: replication/slot.c:2688 #, 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 +#: replication/slot.c:2699 #, 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 +#: replication/slot.c:2703 #, 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\"." @@ -21757,62 +21774,77 @@ msgstr "kan inte kopiera logisk replikeringsslot \"%s\" som en fysisk replikerin 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:768 +#: replication/slotfuncs.c:688 +#, c-format +msgid "cannot copy invalidated replication slot \"%s\"" +msgstr "kan inte kopiera replikeringsslot \"%s\" som blivit ogiltig" + +#: replication/slotfuncs.c:780 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "kunde inte kopiera replikeringsslot \"%s\"" -#: replication/slotfuncs.c:770 +#: replication/slotfuncs.c:782 #, 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:776 +#: replication/slotfuncs.c:788 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "kan inte kopiera ej slutförd replikeringsslot \"%s\"" -#: replication/slotfuncs.c:778 +#: replication/slotfuncs.c:790 #, 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/slotfuncs.c:877 +#: replication/slotfuncs.c:802 +#, c-format +msgid "cannot copy replication slot \"%s\"" +msgstr "kan inte kopiera replikeringsslot \"%s\"" + +#: replication/slotfuncs.c:804 +#, c-format +msgid "The source replication slot was invalidated during the copy operation." +msgstr "Källreplikeringsslotten gjordes ogiltig under copy-operationen." + +#: replication/slotfuncs.c:903 #, 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 +#: replication/syncrep.c:304 #, 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:262 replication/syncrep.c:279 +#: 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 "Transaktionen har redan commit:ats lokalt men har kanske inte replikerats till standby:en." -#: replication/syncrep.c:278 +#: replication/syncrep.c:321 #, 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:485 +#: replication/syncrep.c:528 #, c-format 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:489 +#: replication/syncrep.c:532 #, 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:1013 +#: replication/syncrep.c:1080 #, c-format msgid "\"synchronous_standby_names\" parser failed" msgstr "\"synchronous_standby_names\"-parser misslyckades" -#: replication/syncrep.c:1019 +#: replication/syncrep.c:1086 #, c-format msgid "number of synchronous standbys (%d) must be greater than zero" msgstr "antal synkrona standbys (%d) måste vara fler än noll" @@ -21887,125 +21919,125 @@ msgstr "hämtar tidslinjehistorikfil för tidslinje %u från primära servern" 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:531 +#: replication/walsender.c:535 #, c-format msgid "cannot use %s with a logical replication slot" msgstr "kan inte använda %s med logisk replikeringsslot" -#: replication/walsender.c:635 storage/smgr/md.c:1735 +#: replication/walsender.c:639 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:639 +#: replication/walsender.c:643 #, 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:853 +#: replication/walsender.c:857 #, 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:919 +#: replication/walsender.c:923 #, 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:922 +#: replication/walsender.c:926 #, 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:966 +#: 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 "efterfrågad startpunkt %X/%X är längre fram än denna servers flush:ade WAL-skrivposition %X/%X" -#: replication/walsender.c:1160 +#: replication/walsender.c:1164 #, 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:1266 +#: replication/walsender.c:1270 #, 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:1276 +#: replication/walsender.c:1280 #, 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:1282 +#: replication/walsender.c:1286 #, 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:1287 +#: replication/walsender.c:1291 #, 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 +#: replication/walsender.c:1297 #, 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:1299 +#: replication/walsender.c:1303 #, c-format msgid "%s must not be called in a subtransaction" msgstr "%s får inte anropas i en undertransaktion" -#: replication/walsender.c:1472 +#: replication/walsender.c:1476 #, c-format msgid "terminating walsender process after promotion" msgstr "stänger ner walsender-process efter befordran" -#: replication/walsender.c:2000 +#: replication/walsender.c:2015 #, 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:2035 +#: replication/walsender.c:2050 #, 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:2068 +#: replication/walsender.c:2083 #, c-format msgid "received replication command: %s" msgstr "tog emot replikeringskommando: %s" -#: replication/walsender.c:2076 tcop/fastpath.c:209 tcop/postgres.c:1142 +#: 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 "aktuella transaktionen har avbrutits, alla kommandon ignoreras tills slutet på transaktionen" -#: replication/walsender.c:2233 replication/walsender.c:2268 +#: replication/walsender.c:2248 replication/walsender.c:2283 #, c-format msgid "unexpected EOF on standby connection" msgstr "oväntat EOF från standby-anslutning" -#: replication/walsender.c:2256 +#: replication/walsender.c:2271 #, c-format msgid "invalid standby message type \"%c\"" msgstr "ogiltigt standby-meddelandetyp \"%c\"" -#: replication/walsender.c:2345 +#: replication/walsender.c:2360 #, c-format msgid "unexpected message type \"%c\"" msgstr "oväntad meddelandetyp \"%c\"" -#: replication/walsender.c:2759 +#: replication/walsender.c:2778 #, c-format msgid "terminating walsender process due to replication timeout" msgstr "avslutar walsender-process på grund av replikerings-timeout" @@ -22651,17 +22683,17 @@ msgstr "oväntad data efter EOF i block %u för relation %s" 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:5653 +#: storage/buffer/bufmgr.c:5654 #, c-format msgid "could not write block %u of %s" msgstr "kunde inte skriva block %u av %s" -#: storage/buffer/bufmgr.c:5655 +#: storage/buffer/bufmgr.c:5656 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Multipla fel --- skrivfelet kan vara permanent." -#: storage/buffer/bufmgr.c:5677 storage/buffer/bufmgr.c:5697 +#: storage/buffer/bufmgr.c:5678 storage/buffer/bufmgr.c:5698 #, c-format msgid "writing block %u of relation %s" msgstr "skriver block %u i relation %s" @@ -22711,139 +22743,139 @@ msgstr "kunde inte radera filmängd \"%s\": %m" msgid "could not truncate file \"%s\": %m" msgstr "kunde inte trunkera fil \"%s\": %m" -#: storage/file/fd.c:583 storage/file/fd.c:655 storage/file/fd.c:691 +#: storage/file/fd.c:580 storage/file/fd.c:652 storage/file/fd.c:688 #, c-format msgid "could not flush dirty data: %m" msgstr "kunde inte flush:a smutsig data: %m" -#: storage/file/fd.c:613 +#: storage/file/fd.c:610 #, c-format msgid "could not determine dirty data size: %m" msgstr "kunde inte lista ut storlek på smutsig data: %m" -#: storage/file/fd.c:665 +#: storage/file/fd.c:662 #, 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:983 +#: storage/file/fd.c:980 #, c-format msgid "getrlimit failed: %m" msgstr "getrlimit misslyckades: %m" -#: storage/file/fd.c:1073 +#: storage/file/fd.c:1070 #, 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:1074 +#: storage/file/fd.c:1071 #, c-format msgid "System allows %d, server needs at least %d." msgstr "Systemet tillåter %d, servern behöver minst %d." -#: storage/file/fd.c:1162 storage/file/fd.c:2618 storage/file/fd.c:2727 -#: storage/file/fd.c:2878 +#: storage/file/fd.c:1159 storage/file/fd.c:2615 storage/file/fd.c:2724 +#: storage/file/fd.c:2875 #, 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:1536 +#: storage/file/fd.c:1533 #, c-format msgid "temporary file: path \"%s\", size %lu" msgstr "temporär fil: sökväg \"%s\", storlek %lu" -#: storage/file/fd.c:1675 +#: storage/file/fd.c:1672 #, c-format msgid "cannot create temporary directory \"%s\": %m" msgstr "kunde inte skapa temporär katalog \"%s\": %m" -#: storage/file/fd.c:1682 +#: storage/file/fd.c:1679 #, c-format msgid "cannot create temporary subdirectory \"%s\": %m" msgstr "kunde inte skapa temporär underkatalog \"%s\": %m" -#: storage/file/fd.c:1879 +#: storage/file/fd.c:1876 #, c-format msgid "could not create temporary file \"%s\": %m" msgstr "kan inte skapa temporär fil \"%s\": %m" -#: storage/file/fd.c:1915 +#: storage/file/fd.c:1912 #, 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:1956 +#: storage/file/fd.c:1953 #, c-format msgid "could not unlink temporary file \"%s\": %m" msgstr "kunde inte unlink:a temporär fil \"%s\": %m" -#: storage/file/fd.c:2044 +#: storage/file/fd.c:2041 #, c-format msgid "could not delete file \"%s\": %m" msgstr "kunde inte radera fil \"%s\": %m" -#: storage/file/fd.c:2234 +#: storage/file/fd.c:2231 #, 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:2594 storage/file/fd.c:2653 +#: storage/file/fd.c:2591 storage/file/fd.c:2650 #, 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:2698 +#: storage/file/fd.c:2695 #, 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:2854 +#: storage/file/fd.c:2851 #, 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:3384 +#: storage/file/fd.c:3381 #, 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:3502 +#: storage/file/fd.c:3499 #, 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:3729 +#: storage/file/fd.c:3726 #, 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:3761 +#: storage/file/fd.c:3758 #, 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 +#: storage/file/fd.c:3947 #, 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 +#: storage/file/fd.c:3961 #, c-format msgid "Invalid list syntax in parameter \"%s\"" msgstr "Ogiltigt listsyntax för parameter \"%s\"" -#: storage/file/fd.c:3984 +#: storage/file/fd.c:3981 #, c-format msgid "Invalid option \"%s\"" msgstr "Ogiltig flagga \"%s\"" -#: storage/file/fd.c:3997 +#: storage/file/fd.c:3994 #, 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 +#: storage/file/fd.c:4001 #, 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" @@ -23000,7 +23032,7 @@ msgstr "ogiltig meddelandestorlek %zu i kö i delat minne" #: 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 +#: utils/hash/dynahash.c:1096 #, c-format msgid "out of shared memory" msgstr "slut på delat minne" @@ -23177,107 +23209,107 @@ msgstr "deadlock upptäckt" msgid "See server log for query details." msgstr "Se server-logg för frågedetaljer." -#: storage/lmgr/lmgr.c:848 +#: storage/lmgr/lmgr.c:854 #, 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:851 +#: storage/lmgr/lmgr.c:857 #, 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:854 +#: storage/lmgr/lmgr.c:860 #, 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:857 +#: storage/lmgr/lmgr.c:863 #, 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:860 +#: storage/lmgr/lmgr.c:866 #, 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:863 +#: storage/lmgr/lmgr.c:869 #, 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:866 +#: storage/lmgr/lmgr.c:872 #, 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:869 +#: storage/lmgr/lmgr.c:875 #, 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:1239 +#: storage/lmgr/lmgr.c:1245 #, c-format msgid "relation %u of database %u" msgstr "relation %u i databasen %u" -#: storage/lmgr/lmgr.c:1245 +#: storage/lmgr/lmgr.c:1251 #, c-format msgid "extension of relation %u of database %u" msgstr "utökning av relation %u i databas %u" -#: storage/lmgr/lmgr.c:1251 +#: storage/lmgr/lmgr.c:1257 #, c-format msgid "pg_database.datfrozenxid of database %u" msgstr "pg_database.datfrozenxid för databas %u" -#: storage/lmgr/lmgr.c:1256 +#: storage/lmgr/lmgr.c:1262 #, c-format msgid "page %u of relation %u of database %u" msgstr "sida %u i relation %u i databas %u" -#: storage/lmgr/lmgr.c:1263 +#: storage/lmgr/lmgr.c:1269 #, 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:1271 +#: storage/lmgr/lmgr.c:1277 #, c-format msgid "transaction %u" msgstr "transaktion %u" -#: storage/lmgr/lmgr.c:1276 +#: storage/lmgr/lmgr.c:1282 #, c-format msgid "virtual transaction %d/%u" msgstr "vituell transaktion %d/%u" -#: storage/lmgr/lmgr.c:1282 +#: storage/lmgr/lmgr.c:1288 #, c-format msgid "speculative token %u of transaction %u" msgstr "spekulativ token %u för transaktion %u" -#: storage/lmgr/lmgr.c:1288 +#: storage/lmgr/lmgr.c:1294 #, c-format msgid "object %u of class %u of database %u" msgstr "objekt %u av klass %u i databas %u" -#: storage/lmgr/lmgr.c:1296 +#: storage/lmgr/lmgr.c:1302 #, c-format msgid "user lock [%u,%u,%u]" msgstr "användarlås [%u,%u,%u]" -#: storage/lmgr/lmgr.c:1303 +#: storage/lmgr/lmgr.c:1309 #, c-format msgid "advisory lock [%u,%u,%u,%u]" msgstr "rådgivande lås [%u,%u,%u,%u]" -#: storage/lmgr/lmgr.c:1311 +#: storage/lmgr/lmgr.c:1317 #, 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 +#: storage/lmgr/lmgr.c:1324 #, c-format msgid "unrecognized locktag type %d" msgstr "okänd låsetikettyp %d" @@ -23978,12 +24010,12 @@ 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:942 tcop/pquery.c:1696 +#: tcop/pquery.c:942 tcop/pquery.c:1687 #, c-format msgid "cursor can only scan forward" msgstr "markör kan bara hoppa framåt" -#: tcop/pquery.c:943 tcop/pquery.c:1697 +#: tcop/pquery.c:943 tcop/pquery.c:1688 #, 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." @@ -24149,64 +24181,64 @@ msgstr "okänd synonymordboksparameter: \"%s\"" msgid "missing Dictionary parameter" msgstr "saknar ordlistparameter" -#: 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 "ogiltig affix-flagga \"%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-flaggan \"%s\" är utanför giltigt intervall" -#: tsearch/spell.c:415 +#: tsearch/spell.c:416 #, c-format msgid "invalid character in affix flag \"%s\"" msgstr "ogiltigt tecken i affix-flagga \"%s\"" -#: tsearch/spell.c:435 +#: tsearch/spell.c:436 #, c-format msgid "invalid affix flag \"%s\" with \"long\" flag value" msgstr "ogiltig affix-flagga \"%s\" med flaggvärdet \"long\"" -#: tsearch/spell.c:525 +#: tsearch/spell.c:526 #, c-format msgid "could not open dictionary file \"%s\": %m" msgstr "kunde inte öppna ordboksfil \"%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 "ogiltigt affix-alias \"%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 "kunde inte öppna affix-fil \"%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-ordbok stöder bara flaggorna \"default\", \"long\" och \"num\"" -#: tsearch/spell.c:1321 +#: tsearch/spell.c:1324 #, c-format msgid "invalid number of flag vector aliases" msgstr "ogiltigt antal alias i flaggvektor" -#: tsearch/spell.c:1344 +#: tsearch/spell.c:1347 #, c-format msgid "number of aliases exceeds specified number %d" msgstr "antalet alias överskriver angivet antal %d" -#: tsearch/spell.c:1559 +#: tsearch/spell.c:1562 #, 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:194 utils/adt/tsvector.c:277 utils/adt/tsvector_op.c:1126 +#: 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 "strängen är för lång för tsvector (%d byte, max %d byte)" @@ -24273,37 +24305,37 @@ msgstr "%s måste vara >= 0" msgid "could not unlink permanent statistics file \"%s\": %m" msgstr "kunde inte radera permanent statistikfil \"%s\": %m" -#: utils/activity/pgstat.c:1255 +#: utils/activity/pgstat.c:1254 #, c-format msgid "invalid statistics kind: \"%s\"" msgstr "ogiltig statistiktyp \"%s\"" -#: utils/activity/pgstat.c:1335 +#: utils/activity/pgstat.c:1334 #, c-format msgid "could not open temporary statistics file \"%s\": %m" msgstr "kunde inte öppna temporär statistikfil \"%s\": %m" -#: utils/activity/pgstat.c:1455 +#: utils/activity/pgstat.c:1454 #, c-format msgid "could not write temporary statistics file \"%s\": %m" msgstr "kunde inte skriva temporär statistikfil \"%s\": %m" -#: utils/activity/pgstat.c:1464 +#: utils/activity/pgstat.c:1463 #, 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:1472 +#: utils/activity/pgstat.c:1471 #, 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:1521 +#: utils/activity/pgstat.c:1520 #, c-format msgid "could not open statistics file \"%s\": %m" msgstr "kunde inte öppna statistikfil \"%s\": %m" -#: utils/activity/pgstat.c:1683 +#: utils/activity/pgstat.c:1682 #, c-format msgid "corrupted statistics file \"%s\"" msgstr "korrupt statistikfil \"%s\"" @@ -24328,102 +24360,102 @@ msgstr "wait event \"%s\" finns redan i type \"%s\"" msgid "too many custom wait events" msgstr "för många egendefinierade wait event" -#: utils/adt/acl.c:183 utils/adt/name.c:93 +#: utils/adt/acl.c:200 utils/adt/name.c:93 #, c-format msgid "identifier too long" msgstr "identifieraren för lång" -#: utils/adt/acl.c:184 utils/adt/name.c:94 +#: utils/adt/acl.c:201 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:272 +#: utils/adt/acl.c:289 #, c-format msgid "unrecognized key word: \"%s\"" msgstr "okänt nyckelord: \"%s\"" -#: utils/adt/acl.c:273 +#: utils/adt/acl.c:290 #, c-format msgid "ACL key word must be \"group\" or \"user\"." msgstr "ACL-nyckelord måste vara \"group\" eller \"user\"." -#: utils/adt/acl.c:281 +#: utils/adt/acl.c:298 #, c-format msgid "missing name" msgstr "namn saknas" -#: utils/adt/acl.c:282 +#: utils/adt/acl.c:299 #, 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:288 +#: utils/adt/acl.c:305 #, c-format msgid "missing \"=\" sign" msgstr "saknar \"=\"-tecken" -#: utils/adt/acl.c:350 +#: utils/adt/acl.c:367 #, 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:380 +#: utils/adt/acl.c:397 #, c-format msgid "a name must follow the \"/\" sign" msgstr "ett namn måste följa på tecknet \"/\"" -#: utils/adt/acl.c:392 +#: utils/adt/acl.c:409 #, c-format msgid "defaulting grantor to user ID %u" msgstr "sätter fullmaktsgivaranvändar-ID till standardvärdet %u" -#: utils/adt/acl.c:578 +#: utils/adt/acl.c:595 #, c-format msgid "ACL array contains wrong data type" msgstr "ACL-array innehåller fel datatyp" -#: utils/adt/acl.c:582 +#: utils/adt/acl.c:599 #, c-format msgid "ACL arrays must be one-dimensional" msgstr "ACL-array:er måste vara endimensionella" -#: utils/adt/acl.c:586 +#: utils/adt/acl.c:603 #, 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:615 +#: utils/adt/acl.c:632 #, c-format msgid "extra garbage at the end of the ACL specification" msgstr "skräp vid slutet av ACL-angivelse" -#: utils/adt/acl.c:1263 +#: utils/adt/acl.c:1280 #, 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:1579 +#: utils/adt/acl.c:1596 #, c-format msgid "aclinsert is no longer supported" msgstr "aclinsert stöds inte länge" -#: utils/adt/acl.c:1589 +#: utils/adt/acl.c:1606 #, c-format msgid "aclremove is no longer supported" msgstr "aclremove stöds inte längre" -#: utils/adt/acl.c:1709 +#: utils/adt/acl.c:1726 #, c-format msgid "unrecognized privilege type: \"%s\"" msgstr "okänd privilegietyp: \"%s\"" -#: utils/adt/acl.c:3550 utils/adt/regproc.c:100 utils/adt/regproc.c:265 +#: utils/adt/acl.c:3567 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:5196 +#: utils/adt/acl.c:5213 #, c-format msgid "must be able to SET ROLE \"%s\"" msgstr "måste kunna utföra SET ROLE \"%s\"" @@ -24449,7 +24481,7 @@ msgstr "indatatyp är inte en array" #: 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/int8.c:1256 utils/adt/numeric.c:1918 utils/adt/numeric.c:4455 #: 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 @@ -24608,7 +24640,7 @@ msgid "Unexpected end of input." msgstr "oväntat slut på indata." #: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3499 -#: utils/adt/arrayfuncs.c:6106 +#: utils/adt/arrayfuncs.c:6108 #, c-format msgid "invalid number of dimensions: %d" msgstr "felaktigt antal dimensioner: %d" @@ -24647,8 +24679,8 @@ msgstr "slice av fixlängd-array är inte implementerat" #: 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/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 @@ -24725,42 +24757,42 @@ msgstr "kan inte ackumulera null-array:er" msgid "cannot accumulate empty arrays" msgstr "kan inte ackumulera tomma array:er" -#: utils/adt/arrayfuncs.c:5990 utils/adt/arrayfuncs.c:6030 +#: utils/adt/arrayfuncs.c:5992 utils/adt/arrayfuncs.c:6032 #, 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:6093 utils/adt/arrayfuncs.c:6119 +#: utils/adt/arrayfuncs.c:6095 utils/adt/arrayfuncs.c:6121 #, c-format msgid "Dimension array must be one dimensional." msgstr "Dimensionsarray måste vara endimensionell." -#: utils/adt/arrayfuncs.c:6098 utils/adt/arrayfuncs.c:6124 +#: utils/adt/arrayfuncs.c:6100 utils/adt/arrayfuncs.c:6126 #, c-format msgid "dimension values cannot be null" msgstr "dimensionsvärden kan inte vara null" -#: utils/adt/arrayfuncs.c:6130 +#: utils/adt/arrayfuncs.c:6132 #, 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:6411 +#: utils/adt/arrayfuncs.c:6413 #, 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:6688 +#: utils/adt/arrayfuncs.c:6690 #, c-format msgid "thresholds must be one-dimensional array" msgstr "gränsvärden måste vara en endimensionell array" -#: utils/adt/arrayfuncs.c:6693 +#: utils/adt/arrayfuncs.c:6695 #, 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:6926 +#: utils/adt/arrayfuncs.c:6928 #, 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" @@ -24809,8 +24841,8 @@ msgstr "kodningskonvertering från %s till ASCII stöds inte" #: 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/network.c:99 utils/adt/numeric.c:803 utils/adt/numeric.c:7222 +#: utils/adt/numeric.c:7425 utils/adt/numeric.c:8372 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 @@ -24831,10 +24863,10 @@ msgstr "money utanför giltigt intervall" #: 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 +#: utils/adt/numeric.c:3192 utils/adt/numeric.c:3215 utils/adt/numeric.c:3300 +#: utils/adt/numeric.c:3318 utils/adt/numeric.c:3414 utils/adt/numeric.c:8921 +#: utils/adt/numeric.c:9234 utils/adt/numeric.c:9582 utils/adt/numeric.c:9698 +#: utils/adt/numeric.c:11209 utils/adt/timestamp.c:3713 #, c-format msgid "division by zero" msgstr "division med noll" @@ -24881,7 +24913,7 @@ msgid "date out of range: \"%s\"" msgstr "datum utanför giltigt intervall \"%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:2552 +#: utils/adt/rangetypes.c:1584 utils/adt/rangetypes.c:1599 utils/adt/xml.c:2554 #, c-format msgid "date out of range" msgstr "datum utanför giltigt intervall" @@ -24955,8 +24987,8 @@ msgstr "enheten \"%s\" känns inte igen för typen %s" #: 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 +#: utils/adt/timestamp.c:6456 utils/adt/timestamp.c:6497 utils/adt/xml.c:2576 +#: utils/adt/xml.c:2583 utils/adt/xml.c:2603 utils/adt/xml.c:2610 #, c-format msgid "timestamp out of range" msgstr "timestamp utanför giltigt intervall" @@ -24988,7 +25020,7 @@ 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/int.c:717 utils/adt/int8.c:413 utils/adt/numeric.c:2596 #: utils/adt/timestamp.c:3810 utils/adt/timestamp.c:3847 #: utils/adt/timestamp.c:3888 #, c-format @@ -25166,34 +25198,34 @@ msgstr "\"%s\" är utanför giltigt intervall för typen 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:4593 utils/adt/numeric.c:4598 +#: utils/adt/int8.c:1277 utils/adt/numeric.c:4594 utils/adt/numeric.c:4599 #, c-format msgid "smallint out of range" msgstr "smallint utanför sitt intervall" -#: utils/adt/float.c:1447 utils/adt/numeric.c:3709 utils/adt/numeric.c:10112 +#: utils/adt/float.c:1447 utils/adt/numeric.c:3710 utils/adt/numeric.c:10113 #, c-format msgid "cannot take square root of a negative number" msgstr "kan inte ta kvadratroten av ett negativt tal" -#: utils/adt/float.c:1515 utils/adt/numeric.c:3997 utils/adt/numeric.c:4109 +#: utils/adt/float.c:1515 utils/adt/numeric.c:3998 utils/adt/numeric.c:4110 #, 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:1519 utils/adt/numeric.c:4001 utils/adt/numeric.c:11003 +#: utils/adt/float.c:1519 utils/adt/numeric.c:4002 utils/adt/numeric.c:11004 #, 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:1695 utils/adt/float.c:1728 utils/adt/numeric.c:3909 -#: utils/adt/numeric.c:10783 +#: utils/adt/float.c:1695 utils/adt/float.c:1728 utils/adt/numeric.c:3910 +#: utils/adt/numeric.c:10784 #, c-format msgid "cannot take logarithm of zero" msgstr "kan inte ta logartimen av noll" -#: 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 +#: utils/adt/float.c:1699 utils/adt/float.c:1732 utils/adt/numeric.c:3848 +#: utils/adt/numeric.c:3905 utils/adt/numeric.c:10788 #, c-format msgid "cannot take logarithm of a negative number" msgstr "kan inte ta logaritmen av ett negativt tal" @@ -25207,22 +25239,22 @@ msgstr "kan inte ta logaritmen av ett negativt tal" msgid "input is out of range" msgstr "indata är utanför giltigt intervall" -#: utils/adt/float.c:4000 utils/adt/numeric.c:1857 +#: utils/adt/float.c:4000 utils/adt/numeric.c:1858 #, c-format msgid "count must be greater than zero" msgstr "antal måste vara större än noll" -#: utils/adt/float.c:4005 utils/adt/numeric.c:1868 +#: utils/adt/float.c:4005 utils/adt/numeric.c:1869 #, c-format msgid "operand, lower bound, and upper bound cannot be NaN" msgstr "operand, undre gräns och övre gräns kan inte vara NaN" -#: utils/adt/float.c:4011 utils/adt/numeric.c:1873 +#: utils/adt/float.c:4011 utils/adt/numeric.c:1874 #, c-format msgid "lower and upper bounds must be finite" msgstr "undre och övre gräns måste vara ändliga" -#: utils/adt/float.c:4077 utils/adt/numeric.c:1887 +#: utils/adt/float.c:4077 utils/adt/numeric.c:1888 #, c-format msgid "lower bound cannot equal upper bound" msgstr "undre gräns kan inte vara samma som övre gräns" @@ -25587,7 +25619,7 @@ msgstr "stegstorleken kan inte vara noll" #: 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/int8.c:1312 utils/adt/int8.c:1347 utils/adt/numeric.c:4543 #: utils/adt/rangetypes.c:1535 utils/adt/rangetypes.c:1548 #: utils/adt/varbit.c:1676 #, c-format @@ -25641,7 +25673,7 @@ msgstr "array:en måste ha två kolumner" msgid "mismatched array dimensions" msgstr "array-dimensionerna stämmer inte" -#: utils/adt/json.c:1702 utils/adt/jsonb_util.c:1956 +#: utils/adt/json.c:1702 utils/adt/jsonb_util.c:1962 #, c-format msgid "duplicate JSON object key value" msgstr "duplicerat nyckelvärde i JSON objekt" @@ -25706,23 +25738,23 @@ msgstr "kan inte typomvandla jsonb-objekt till typ %s" 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:756 +#: utils/adt/jsonb_util.c:753 #, 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:797 +#: utils/adt/jsonb_util.c:794 #, 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:1671 utils/adt/jsonb_util.c:1691 +#: utils/adt/jsonb_util.c:1677 utils/adt/jsonb_util.c:1697 #, c-format 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:1752 utils/adt/jsonb_util.c:1787 -#: utils/adt/jsonb_util.c:1807 +#: utils/adt/jsonb_util.c:1758 utils/adt/jsonb_util.c:1793 +#: utils/adt/jsonb_util.c:1813 #, c-format 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" @@ -26215,12 +26247,12 @@ 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:800 +#: utils/adt/like_match.c:293 utils/adt/regexp.c:803 #, c-format msgid "invalid escape string" msgstr "ogiltig escape-sträng" -#: utils/adt/like_match.c:294 utils/adt/regexp.c:801 +#: utils/adt/like_match.c:294 utils/adt/regexp.c:804 #, c-format msgid "Escape string must be empty or one character." msgstr "Escape-sträng måste vara tom eller ett tecken." @@ -26431,10 +26463,10 @@ msgstr "resultatet är utanför giltigt intervall" msgid "cannot subtract inet values of different sizes" msgstr "kan inte subtrahera inet-värden av olika storlek" -#: 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 +#: utils/adt/numeric.c:793 utils/adt/numeric.c:3660 utils/adt/numeric.c:7217 +#: utils/adt/numeric.c:7420 utils/adt/numeric.c:7892 utils/adt/numeric.c:10587 +#: utils/adt/numeric.c:11062 utils/adt/numeric.c:11156 +#: utils/adt/numeric.c:11291 #, c-format msgid "value overflows numeric format" msgstr "overflow på värde i formatet numeric" @@ -26499,64 +26531,64 @@ msgstr "stegstorlek får inte vara NaN" msgid "step size cannot be infinity" msgstr "stegstorlek får inte vara oändligt" -#: utils/adt/numeric.c:3649 +#: utils/adt/numeric.c:3650 #, c-format msgid "factorial of a negative number is undefined" msgstr "fakultet av ett negativt tal är odefinierat" -#: utils/adt/numeric.c:4256 +#: utils/adt/numeric.c:4257 #, c-format msgid "lower bound cannot be NaN" msgstr "undre gräns kan inte vara NaN" -#: utils/adt/numeric.c:4260 +#: utils/adt/numeric.c:4261 #, c-format msgid "lower bound cannot be infinity" msgstr "undre gräns kan inte vara oändlig" -#: utils/adt/numeric.c:4267 +#: utils/adt/numeric.c:4268 #, c-format msgid "upper bound cannot be NaN" msgstr "övre gräns kan inte vara NaN" -#: utils/adt/numeric.c:4271 +#: utils/adt/numeric.c:4272 #, c-format msgid "upper bound cannot be infinity" msgstr "övre gräns kan inte vara oändlig" -#: utils/adt/numeric.c:4432 utils/adt/numeric.c:4520 utils/adt/numeric.c:4580 -#: utils/adt/numeric.c:4776 +#: utils/adt/numeric.c:4433 utils/adt/numeric.c:4521 utils/adt/numeric.c:4581 +#: utils/adt/numeric.c:4777 #, c-format msgid "cannot convert NaN to %s" msgstr "kan inte konvertera NaN till %s" -#: utils/adt/numeric.c:4436 utils/adt/numeric.c:4524 utils/adt/numeric.c:4584 -#: utils/adt/numeric.c:4780 +#: utils/adt/numeric.c:4437 utils/adt/numeric.c:4525 utils/adt/numeric.c:4585 +#: utils/adt/numeric.c:4781 #, c-format msgid "cannot convert infinity to %s" msgstr "kan inte konvertera oändlighet till %s" -#: utils/adt/numeric.c:4789 +#: utils/adt/numeric.c:4790 #, c-format msgid "pg_lsn out of range" msgstr "pg_lsn är utanför giltigt intervall" -#: utils/adt/numeric.c:7981 utils/adt/numeric.c:8032 +#: utils/adt/numeric.c:7982 utils/adt/numeric.c:8033 #, c-format msgid "numeric field overflow" msgstr "overflow i numeric-fält" -#: utils/adt/numeric.c:7982 +#: utils/adt/numeric.c:7983 #, 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:8033 +#: utils/adt/numeric.c:8034 #, 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/numeric.c:11359 utils/adt/pseudorandomfuncs.c:135 +#: utils/adt/numeric.c:11360 utils/adt/pseudorandomfuncs.c:135 #: utils/adt/pseudorandomfuncs.c:159 #, c-format msgid "lower bound must be less than or equal to upper bound" @@ -26861,7 +26893,7 @@ msgstr "För många komman." msgid "Junk after right parenthesis or bracket." msgstr "Skräp efter höger parentes eller hakparentes." -#: utils/adt/regexp.c:304 utils/adt/regexp.c:1996 utils/adt/varlena.c:4273 +#: utils/adt/regexp.c:304 utils/adt/regexp.c:2022 utils/adt/varlena.c:4273 #, c-format msgid "regular expression failed: %s" msgstr "reguljärt uttryck misslyckades: %s" @@ -26876,33 +26908,33 @@ msgstr "ogiltigt flagga till reguljärt uttryck: \"%.*s\"" 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: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 +#: utils/adt/regexp.c:716 utils/adt/regexp.c:725 utils/adt/regexp.c:1108 +#: utils/adt/regexp.c:1172 utils/adt/regexp.c:1181 utils/adt/regexp.c:1190 +#: utils/adt/regexp.c:1199 utils/adt/regexp.c:1879 utils/adt/regexp.c:1888 +#: utils/adt/regexp.c:1897 utils/misc/guc.c:6831 utils/misc/guc.c:6865 #, c-format msgid "invalid value for parameter \"%s\": %d" msgstr "ogiltigt värde för parameter \"%s\": %d" -#: utils/adt/regexp.c:936 +#: utils/adt/regexp.c:939 #, 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: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 +#: utils/adt/regexp.c:1119 utils/adt/regexp.c:1210 utils/adt/regexp.c:1297 +#: utils/adt/regexp.c:1336 utils/adt/regexp.c:1724 utils/adt/regexp.c:1779 +#: utils/adt/regexp.c:1908 #, c-format msgid "%s does not support the \"global\" option" msgstr "%s stöder inte \"global\"-flaggan" -#: utils/adt/regexp.c:1312 +#: utils/adt/regexp.c:1338 #, c-format msgid "Use the regexp_matches function instead." msgstr "Använd regexp_matches-funktionen istället." -#: utils/adt/regexp.c:1500 +#: utils/adt/regexp.c:1526 #, c-format msgid "too many regular expression matches" msgstr "för många reguljära uttryck matchar" @@ -26917,8 +26949,8 @@ msgstr "mer än en funktion med namn %s" msgid "more than one operator named %s" msgstr "mer än en operator med namn %s" -#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10509 -#: utils/adt/ruleutils.c:10722 +#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10526 +#: utils/adt/ruleutils.c:10739 #, c-format msgid "too many arguments" msgstr "för många argument" @@ -27310,12 +27342,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:216 +#: utils/adt/tsvector.c:213 #, 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:223 +#: utils/adt/tsvector.c:220 #, 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)" @@ -27617,136 +27649,136 @@ msgstr "ogiltigt XML-kommentar" msgid "not an XML document" msgstr "inget XML-dokument" -#: utils/adt/xml.c:1008 utils/adt/xml.c:1031 +#: utils/adt/xml.c:1020 utils/adt/xml.c:1043 #, c-format msgid "invalid XML processing instruction" msgstr "ogiltig XML-processinstruktion" -#: utils/adt/xml.c:1009 +#: utils/adt/xml.c:1021 #, c-format msgid "XML processing instruction target name cannot be \"%s\"." msgstr "XML-processinstruktions målnamn kan inte vara \"%s\"." -#: utils/adt/xml.c:1032 +#: utils/adt/xml.c:1044 #, c-format msgid "XML processing instruction cannot contain \"?>\"." msgstr "XML-processinstruktion kan inte innehålla \"?>\"." -#: utils/adt/xml.c:1111 +#: utils/adt/xml.c:1123 #, c-format msgid "xmlvalidate is not implemented" msgstr "xmlvalidate är inte implementerat" -#: utils/adt/xml.c:1167 +#: utils/adt/xml.c:1179 #, c-format msgid "could not initialize XML library" msgstr "kunde inte initiera XML-bibliotek" -#: utils/adt/xml.c:1168 +#: utils/adt/xml.c:1180 #, 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:1254 +#: utils/adt/xml.c:1266 #, c-format msgid "could not set up XML error handler" msgstr "kunde inte ställa in XML-felhanterare" -#: utils/adt/xml.c:1255 +#: utils/adt/xml.c:1267 #, 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:2281 +#: utils/adt/xml.c:2283 msgid "Invalid character value." msgstr "Ogiltigt teckenvärde." -#: utils/adt/xml.c:2284 +#: utils/adt/xml.c:2286 msgid "Space required." msgstr "Mellanslag krävs." -#: utils/adt/xml.c:2287 +#: utils/adt/xml.c:2289 msgid "standalone accepts only 'yes' or 'no'." msgstr "standalone tillåter bara 'yes' eller 'no'." -#: utils/adt/xml.c:2290 +#: utils/adt/xml.c:2292 msgid "Malformed declaration: missing version." msgstr "Felaktig deklaration: saknar version." -#: utils/adt/xml.c:2293 +#: utils/adt/xml.c:2295 msgid "Missing encoding in text declaration." msgstr "Saknar kodning i textdeklaration." -#: utils/adt/xml.c:2296 +#: utils/adt/xml.c:2298 msgid "Parsing XML declaration: '?>' expected." msgstr "Parsar XML-deklaration: förväntade sig '?>'" -#: utils/adt/xml.c:2299 +#: utils/adt/xml.c:2301 #, c-format msgid "Unrecognized libxml error code: %d." msgstr "Okänd libxml-felkod: %d." -#: utils/adt/xml.c:2553 +#: utils/adt/xml.c:2555 #, c-format msgid "XML does not support infinite date values." msgstr "XML stöder inte oändliga datumvärden." -#: utils/adt/xml.c:2575 utils/adt/xml.c:2602 +#: utils/adt/xml.c:2577 utils/adt/xml.c:2604 #, c-format msgid "XML does not support infinite timestamp values." msgstr "XML stöder inte oändliga timestamp-värden." -#: utils/adt/xml.c:3018 +#: utils/adt/xml.c:3020 #, c-format msgid "invalid query" msgstr "ogiltig fråga" -#: utils/adt/xml.c:3110 +#: utils/adt/xml.c:3112 #, c-format msgid "portal \"%s\" does not return tuples" msgstr "portalen \"%s\" returnerar inga tupler" -#: utils/adt/xml.c:4362 +#: utils/adt/xml.c:4364 #, c-format msgid "invalid array for XML namespace mapping" msgstr "ogiltig array till XML-namnrymdmappning" -#: utils/adt/xml.c:4363 +#: utils/adt/xml.c:4365 #, 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:4387 +#: utils/adt/xml.c:4389 #, c-format msgid "empty XPath expression" msgstr "tomt XPath-uttryck" -#: utils/adt/xml.c:4439 +#: utils/adt/xml.c:4441 #, c-format msgid "neither namespace name nor URI may be null" msgstr "varken namnrymdnamn eller URI får vara null" -#: utils/adt/xml.c:4446 +#: utils/adt/xml.c:4448 #, 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:4795 +#: utils/adt/xml.c:4797 #, c-format msgid "DEFAULT namespace is not supported" msgstr "namnrymden DEFAULT stöds inte" -#: utils/adt/xml.c:4824 +#: utils/adt/xml.c:4826 #, 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:4858 +#: utils/adt/xml.c:4860 #, 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:5005 +#: utils/adt/xml.c:5007 #, c-format msgid "more than one value returned by column XPath expression" msgstr "mer än ett värde returnerades från kolumns XPath-uttryck" @@ -28216,7 +28248,7 @@ msgstr "Filen verkar ha lämnats kvar av misstag, men kan inte tas bort. Ta bort msgid "could not write lock file \"%s\": %m" msgstr "kunde inte skriva låsfil \"%s\": %m" -#: utils/init/miscinit.c:1591 utils/init/miscinit.c:1733 utils/misc/guc.c:5765 +#: utils/init/miscinit.c:1591 utils/init/miscinit.c:1733 utils/misc/guc.c:5770 #, c-format msgid "could not read from file \"%s\": %m" msgstr "kunde inte läsa från fil \"%s\": %m" @@ -28486,7 +28518,7 @@ msgstr "bind_textdomain_codeset misslyckades" msgid "invalid byte sequence for encoding \"%s\": %s" msgstr "ogiltigt byte-sekvens för kodning \"%s\": %s" -#: utils/mb/mbutils.c:1751 +#: utils/mb/mbutils.c:1759 #, 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\"" @@ -28647,7 +28679,7 @@ 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 +#: utils/misc/guc.c:6767 #, c-format msgid "permission denied to set parameter \"%s\"" msgstr "rättighet saknas för att sätta parameter \"%s\"" @@ -28672,12 +28704,12 @@ msgstr "parametern \"%s\" kunde inte återställas" 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 +#: utils/misc/guc.c:4370 utils/misc/guc.c:4418 utils/misc/guc.c:5455 #, 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 +#: utils/misc/guc.c:4371 utils/misc/guc.c:4419 utils/misc/guc.c:5456 #, 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." @@ -28692,47 +28724,47 @@ msgstr "ALTER SYSTEM tillåts inte i denna miljö" 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 +#: utils/misc/guc.c:4745 #, 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 +#: utils/misc/guc.c:4790 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "kunde inte parsa innehållet i fil \"%s\"" -#: utils/misc/guc.c:4967 +#: utils/misc/guc.c:4972 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "försök att omdefiniera parameter \"%s\"" -#: utils/misc/guc.c:5306 +#: utils/misc/guc.c:5311 #, c-format msgid "invalid configuration parameter name \"%s\", removing it" msgstr "ogiltigt konfigurationsparameternamn \"%s\", tas bort" -#: utils/misc/guc.c:5308 +#: utils/misc/guc.c:5313 #, c-format msgid "\"%s\" is now a reserved prefix." msgstr "\"%s\" är nu ett reserverat prefix." -#: utils/misc/guc.c:6179 +#: utils/misc/guc.c:6184 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "vid sättande av parameter \"%s\" till \"%s\"" -#: utils/misc/guc.c:6348 +#: utils/misc/guc.c:6353 #, c-format msgid "parameter \"%s\" could not be set" msgstr "parameter \"%s\" kunde inte sättas" -#: utils/misc/guc.c:6438 +#: utils/misc/guc.c:6443 #, 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 +#: utils/misc/guc.c:6899 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "ogiltigt värde för parameter \"%s\": %g" @@ -28791,7 +28823,7 @@ msgstr "Resursanvändning / Disk" #: utils/misc/guc_tables.c:684 msgid "Resource Usage / Kernel Resources" -msgstr "Resursanvändning / Kärnresurser" +msgstr "Resursanvändning / Kernel-resurser" #: utils/misc/guc_tables.c:685 msgid "Resource Usage / Cost-Based Vacuum Delay" @@ -31065,3 +31097,7 @@ msgstr "en serialiserbar transaktion som inte är read-only kan inte importera e #, c-format msgid "cannot import a snapshot from a different database" msgstr "kan inte importera en snapshot från en annan databas" + +#, c-format +msgid "oversize GSSAPI packet sent by the client (%zu > %d)" +msgstr "för stort GSSAPI-paket skickat av klienten (%zu > %d)" diff --git a/src/backend/po/uk.po b/src/backend/po/uk.po index 6c4c0add9ee56..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: 2024-09-23 10:41+0000\n" -"PO-Revision-Date: 2024-09-23 19:38\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" @@ -88,13 +88,13 @@ msgstr "не вдалося відкрити файл \"%s\" для читанн #: ../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:3476 -#: access/transam/xlog.c:4340 access/transam/xlogrecovery.c:1238 +#: 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:5108 +#: 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 @@ -104,7 +104,7 @@ msgid "could not read file \"%s\": %m" msgstr "не вдалося прочитати файл \"%s\": %m" #: ../common/controldata_utils.c:116 ../common/controldata_utils.c:119 -#: access/transam/xlog.c:3481 access/transam/xlog.c:4345 +#: 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 @@ -117,14 +117,14 @@ msgstr "не вдалося прочитати файл \"%s\": прочитан #: ../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:3322 -#: access/transam/xlog.c:3516 access/transam/xlog.c:3521 -#: access/transam/xlog.c:3657 access/transam/xlog.c:4310 -#: access/transam/xlog.c:5245 commands/copyfrom.c:1799 commands/copyto.c:325 +#: 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:5160 +#: 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 @@ -152,33 +152,33 @@ msgstr "можлива помилка у послідовності байтів #: ../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:3229 -#: access/transam/xlog.c:3392 access/transam/xlog.c:3431 -#: access/transam/xlog.c:3624 access/transam/xlog.c:4330 -#: access/transam/xlogrecovery.c:4263 access/transam/xlogrecovery.c:4366 +#: 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:3761 -#: replication/logical/reorderbuffer.c:4315 -#: replication/logical/reorderbuffer.c:5088 +#: 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:1526 utils/init/miscinit.c:1660 -#: utils/init/miscinit.c:1737 utils/misc/guc.c:4736 utils/misc/guc.c:4786 +#: 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:246 ../common/controldata_utils.c:249 -#: access/transam/twophase.c:1766 access/transam/twophase.c:1775 -#: access/transam/xlog.c:9255 access/transam/xlogfuncs.c:698 +#: 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:4125 +#: 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 @@ -189,14 +189,14 @@ msgstr "не вдалося записати файл \"%s\": %m" #: ../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:3315 access/transam/xlog.c:3510 -#: access/transam/xlog.c:4303 access/transam/xlog.c:8630 -#: access/transam/xlog.c:8675 backup/basebackup_server.c:207 +#: 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:1329 storage/smgr/md.c:1374 -#: storage/sync/sync.c:446 utils/misc/guc.c:4489 +#: 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" @@ -206,14 +206,14 @@ msgstr "не вдалося fsync файл \"%s\": %m" #: ../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 +#: ../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:3559 postmaster/postmaster.c:4019 -#: postmaster/postmaster.c:4381 postmaster/walsummarizer.c:935 +#: 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 @@ -221,12 +221,12 @@ msgstr "не вдалося fsync файл \"%s\": %m" #: 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:509 -#: utils/adt/pg_locale.c:673 utils/fmgr/dfmgr.c:229 utils/hash/dynahash.c:516 +#: 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:4467 utils/misc/tzparser.c:477 utils/mmgr/aset.c:451 +#: 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 @@ -271,7 +271,7 @@ msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "не вдалося знайти абсолютний шлях \"%s\": %m" #: ../common/exec.c:382 commands/collationcmds.c:876 commands/copyfrom.c:1723 -#: commands/copyto.c:650 libpq/be-secure-common.c:59 +#: commands/copyto.c:654 libpq/be-secure-common.c:59 #, c-format msgid "could not execute command \"%s\": %m" msgstr "не вдалося виконати команду \"%s\": %m" @@ -287,16 +287,16 @@ 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 +#: 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:790 -#: ../port/path.c:807 utils/misc/ps_status.c:193 utils/misc/ps_status.c:201 +#: ../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" @@ -313,11 +313,11 @@ 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 +#: ../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:696 commands/extension.c:3527 commands/tablespace.c:804 +#: 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 @@ -334,7 +334,7 @@ msgstr "ця збірка не підтримує метод синхроніз #: ../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 +#: 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 @@ -480,159 +480,159 @@ msgstr "деталі: " msgid "hint: " msgstr "підказка: " -#: ../common/parse_manifest.c:159 ../common/parse_manifest.c:855 +#: ../common/parse_manifest.c:159 ../common/parse_manifest.c:854 #, c-format msgid "could not initialize checksum of manifest" msgstr "не вдалося ініціалізувати контрольну суму маніфесту" -#: ../common/parse_manifest.c:204 ../common/parse_manifest.c:261 +#: ../common/parse_manifest.c:203 ../common/parse_manifest.c:260 msgid "manifest ended unexpectedly" msgstr "маніфест закінчився несподівано" -#: ../common/parse_manifest.c:210 ../common/parse_manifest.c:862 +#: ../common/parse_manifest.c:209 ../common/parse_manifest.c:861 #, c-format msgid "could not update checksum of manifest" msgstr "не вдалося оновити контрольну суму маніфесту" -#: ../common/parse_manifest.c:302 +#: ../common/parse_manifest.c:301 msgid "unexpected object start" msgstr "неочікуваний початок об'єкта" -#: ../common/parse_manifest.c:337 +#: ../common/parse_manifest.c:336 msgid "unexpected object end" msgstr "неочікуваний кінець об'єкта" -#: ../common/parse_manifest.c:366 +#: ../common/parse_manifest.c:365 msgid "unexpected array start" msgstr "неочікуваний початок масиву" -#: ../common/parse_manifest.c:391 +#: ../common/parse_manifest.c:390 msgid "unexpected array end" msgstr "неочікуваний кінець масиву" -#: ../common/parse_manifest.c:418 +#: ../common/parse_manifest.c:417 msgid "expected version indicator" msgstr "індикатор очікуваної версії" -#: ../common/parse_manifest.c:454 +#: ../common/parse_manifest.c:453 msgid "unrecognized top-level field" msgstr "нерозпізнане поле верхнього рівня" -#: ../common/parse_manifest.c:473 +#: ../common/parse_manifest.c:472 msgid "unexpected file field" msgstr "неочікуване поле файлу" -#: ../common/parse_manifest.c:487 +#: ../common/parse_manifest.c:486 msgid "unexpected WAL range field" msgstr "неочікуване поле діапазону WAL" -#: ../common/parse_manifest.c:493 +#: ../common/parse_manifest.c:492 msgid "unexpected object field" msgstr "неочікуване поле об'єкта" -#: ../common/parse_manifest.c:583 +#: ../common/parse_manifest.c:582 msgid "unexpected scalar" msgstr "неочікуваний скаляр" -#: ../common/parse_manifest.c:609 +#: ../common/parse_manifest.c:608 msgid "manifest version not an integer" msgstr "версія маніфесту не ціле число" -#: ../common/parse_manifest.c:613 +#: ../common/parse_manifest.c:612 msgid "unexpected manifest version" msgstr "неочікувана версія маніфесту" -#: ../common/parse_manifest.c:637 +#: ../common/parse_manifest.c:636 msgid "system identifier in manifest not an integer" msgstr "системний ідентифікатор в маніфесті не ціле число" -#: ../common/parse_manifest.c:662 +#: ../common/parse_manifest.c:661 msgid "missing path name" msgstr "пропущено шлях" -#: ../common/parse_manifest.c:665 +#: ../common/parse_manifest.c:664 msgid "both path name and encoded path name" msgstr "і ім'я шляху, і закодований шлях" -#: ../common/parse_manifest.c:667 +#: ../common/parse_manifest.c:666 msgid "missing size" msgstr "відсутній розмір" -#: ../common/parse_manifest.c:670 +#: ../common/parse_manifest.c:669 msgid "checksum without algorithm" msgstr "контрольна сума без алгоритму" -#: ../common/parse_manifest.c:684 +#: ../common/parse_manifest.c:683 msgid "could not decode file name" msgstr "не вдалося декодувати ім'я файлу" -#: ../common/parse_manifest.c:694 +#: ../common/parse_manifest.c:693 msgid "file size is not an integer" msgstr "розмір файлу не є цілим числом" -#: ../common/parse_manifest.c:700 backup/basebackup.c:870 +#: ../common/parse_manifest.c:699 backup/basebackup.c:870 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "нерозпізнаний алгоритм контрольної суми: \"%s\"" -#: ../common/parse_manifest.c:719 +#: ../common/parse_manifest.c:718 #, c-format msgid "invalid checksum for file \"%s\": \"%s\"" msgstr "неприпустима контрольна сума для файлу \"%s\": \"%s\"" -#: ../common/parse_manifest.c:762 +#: ../common/parse_manifest.c:761 msgid "missing timeline" msgstr "відсутня часова шкала" -#: ../common/parse_manifest.c:764 +#: ../common/parse_manifest.c:763 msgid "missing start LSN" msgstr "відсутній LSN початку" -#: ../common/parse_manifest.c:766 +#: ../common/parse_manifest.c:765 msgid "missing end LSN" msgstr "відсутній LSN кінця" -#: ../common/parse_manifest.c:772 +#: ../common/parse_manifest.c:771 msgid "timeline is not an integer" msgstr "часова лінія не є цілим числом" -#: ../common/parse_manifest.c:775 +#: ../common/parse_manifest.c:774 msgid "could not parse start LSN" msgstr "не вдалося проаналізувати початковий LSN" -#: ../common/parse_manifest.c:778 +#: ../common/parse_manifest.c:777 msgid "could not parse end LSN" msgstr "не вдалося проаналізувати кінцевий LSN" -#: ../common/parse_manifest.c:843 +#: ../common/parse_manifest.c:842 msgid "expected at least 2 lines" msgstr "очікувалося принаймні 2 рядки" -#: ../common/parse_manifest.c:846 +#: ../common/parse_manifest.c:845 msgid "last line not newline-terminated" msgstr "останній рядок не завершений новим рядком" -#: ../common/parse_manifest.c:865 +#: ../common/parse_manifest.c:864 #, c-format msgid "could not finalize checksum of manifest" msgstr "не вдалося остаточно завершити контрольну суму маніфесту" -#: ../common/parse_manifest.c:869 +#: ../common/parse_manifest.c:868 #, c-format msgid "manifest has no checksum" msgstr "у маніфесті немає контрольної суми" -#: ../common/parse_manifest.c:873 +#: ../common/parse_manifest.c:872 #, c-format msgid "invalid manifest checksum: \"%s\"" msgstr "неприпустима контрольна сума маніфесту: \"%s\"" -#: ../common/parse_manifest.c:877 +#: ../common/parse_manifest.c:876 #, c-format msgid "manifest checksum mismatch" msgstr "невідповідність контрольної суми маніфесту" -#: ../common/parse_manifest.c:892 +#: ../common/parse_manifest.c:891 #, c-format msgid "could not parse backup manifest: %s" msgstr "не вдалося проаналізувати маніфест резервної копії: %s" @@ -640,8 +640,8 @@ msgstr "не вдалося проаналізувати маніфест рез #: ../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:4671 utils/misc/guc.c:6896 -#: utils/misc/guc.c:6937 +#: 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\"" @@ -702,10 +702,10 @@ 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/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:4584 +#: 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 @@ -722,15 +722,15 @@ msgstr "не можливо видалити файл \"%s\": %m" msgid "could not remove directory \"%s\": %m" msgstr "не вдалося видалити каталог \"%s\": %m" -#: ../common/scram-common.c:282 +#: ../common/scram-common.c:281 msgid "could not encode salt" msgstr "не вдалося закодувати сіль" -#: ../common/scram-common.c:298 +#: ../common/scram-common.c:297 msgid "could not encode stored key" msgstr "на вдалося закодувати збережений ключ" -#: ../common/scram-common.c:315 +#: ../common/scram-common.c:314 msgid "could not encode server key" msgstr "не вдалося закодувати серверний ключ" @@ -843,7 +843,7 @@ 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: %m\n" msgstr "не вдалося отримати поточний робочий каталог: %m\n" @@ -883,7 +883,7 @@ msgstr "не вдається перевірити членство токену 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/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 @@ -892,34 +892,34 @@ msgstr "запит на підсумок діапазону BRIN для інде msgid "recovery is in progress" msgstr "відновлення у процесі" -#: access/brin/brin.c:1386 access/brin/brin.c:1494 +#: 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:1391 access/brin/brin.c:1499 +#: 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:1436 access/brin/brin.c:1525 +#: 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:1452 access/brin/brin.c:1541 +#: 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.c:1461 access/brin/brin.c:1557 access/gin/ginfast.c:1085 +#: access/brin/brin.c:1463 access/brin/brin.c:1559 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 +#: 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 @@ -1073,7 +1073,7 @@ msgstr "RESET не має містити значення для парамет msgid "unrecognized parameter namespace \"%s\"" msgstr "нерозпізнаний параметр простору імен \"%s\"" -#: access/common/reloptions.c:1300 commands/variable.c:1191 +#: access/common/reloptions.c:1300 commands/variable.c:1214 #, c-format msgid "tables declared WITH OIDS are not supported" msgstr "таблиці, позначені WITH OIDS, не підтримуються" @@ -1173,18 +1173,18 @@ 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:147 executor/execExpr.c:2192 -#: utils/adt/arrayfuncs.c:4016 utils/adt/arrayfuncs.c:6712 +#: 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" @@ -1269,9 +1269,9 @@ msgstr "сімейство операторів \"%s\" з методом дос msgid "could not determine which collation to use for string hashing" msgstr "не вдалося визначити, який параметр сортування використати для обчислення хешу рядків" -#: 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:2048 commands/tablecmds.c:18068 commands/view.c:81 +#: 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 @@ -1326,37 +1326,43 @@ msgstr "сімейство операторів \"%s\" з методом дос msgid "operator family \"%s\" of access method %s is missing cross-type operator(s)" msgstr "сімейство операторів \"%s\" з методом доступу %s не містить міжтипового оператора (ів)" -#: access/heap/heapam.c:2195 +#: access/heap/heapam.c:2206 #, c-format msgid "cannot insert tuples in a parallel worker" msgstr "не вдалося вставити кортежі в паралельного працівника" -#: access/heap/heapam.c:2714 +#: access/heap/heapam.c:2725 #, c-format msgid "cannot delete tuples during a parallel operation" msgstr "не вдалося видалити кортежі під час паралельної операції" -#: access/heap/heapam.c:2761 +#: access/heap/heapam.c:2772 #, c-format msgid "attempted to delete invisible tuple" msgstr "спроба видалити невидимий кортеж" -#: access/heap/heapam.c:3209 access/heap/heapam.c:6082 +#: 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:3337 +#: access/heap/heapam.c:3397 #, c-format msgid "attempted to update invisible tuple" msgstr "спроба оновити невидимий кортеж" -#: access/heap/heapam.c:4726 access/heap/heapam.c:4764 -#: access/heap/heapam.c:5029 access/heap/heapam_handler.c:468 +#: 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.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" @@ -1374,11 +1380,11 @@ msgstr "не вдалося записати до файлу \"%s\", запис #: access/heap/rewriteheap.c:977 access/heap/rewriteheap.c:1094 #: access/transam/timeline.c:329 access/transam/timeline.c:481 -#: access/transam/xlog.c:3254 access/transam/xlog.c:3445 -#: access/transam/xlog.c:4282 access/transam/xlog.c:9244 +#: 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:4112 +#: 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 @@ -1393,15 +1399,15 @@ msgstr "не вдалося скоротити файл \"%s\" до потріб #: access/heap/rewriteheap.c:1122 access/transam/timeline.c:384 #: access/transam/timeline.c:424 access/transam/timeline.c:498 -#: access/transam/xlog.c:3304 access/transam/xlog.c:3501 -#: access/transam/xlog.c:4294 commands/dbcommands.c:506 +#: 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:1601 -#: utils/init/miscinit.c:1612 utils/init/miscinit.c:1620 utils/misc/guc.c:4450 -#: utils/misc/guc.c:4481 utils/misc/guc.c:5634 utils/misc/guc.c:5652 +#: 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" @@ -1533,89 +1539,89 @@ msgstr "Використання WAL: %lld записів, %lld зображен msgid "system usage: %s" msgstr "використання системи: %s" -#: access/heap/vacuumlazy.c:2172 +#: 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:2326 +#: 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:2329 +#: 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:2330 +#: access/heap/vacuumlazy.c:2331 #, 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" "Можливо, вам також доведеться розглянути інші способи, щоб VACUUM не відставав від розподілу ідентифікаторів транзакцій." -#: access/heap/vacuumlazy.c:2592 +#: access/heap/vacuumlazy.c:2593 #, c-format msgid "\"%s\": stopping truncate due to conflicting lock request" msgstr "\"%s\": зупинка скорочення через конфліктний запит блокування" -#: access/heap/vacuumlazy.c:2662 +#: access/heap/vacuumlazy.c:2663 #, c-format msgid "table \"%s\": truncated %u to %u pages" msgstr "таблиця \"%s: скорочена від %u до %u сторінок" -#: access/heap/vacuumlazy.c:2724 +#: access/heap/vacuumlazy.c:2725 #, c-format msgid "table \"%s\": suspending truncate due to conflicting lock request" msgstr "таблиця \"%s: припинення скорочення через конфліктуючий запит блокування" -#: access/heap/vacuumlazy.c:2843 +#: 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:3113 +#: 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:3116 +#: access/heap/vacuumlazy.c:3114 #, c-format msgid "while scanning block %u of relation \"%s.%s\"" msgstr "у процесі сканування блоку %u відношення \"%s.%s\"" -#: access/heap/vacuumlazy.c:3120 +#: access/heap/vacuumlazy.c:3118 #, c-format msgid "while scanning relation \"%s.%s\"" msgstr "у процесі сканування відношення \"%s.%s\"" -#: access/heap/vacuumlazy.c:3128 +#: 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:3131 +#: access/heap/vacuumlazy.c:3129 #, c-format msgid "while vacuuming block %u of relation \"%s.%s\"" msgstr "у процесі очищення блоку %u відношення \"%s.%s\"" -#: access/heap/vacuumlazy.c:3135 +#: access/heap/vacuumlazy.c:3133 #, c-format msgid "while vacuuming relation \"%s.%s\"" msgstr "у процесі очищення відношення \"%s.%s\"" -#: access/heap/vacuumlazy.c:3140 commands/vacuumparallel.c:1113 +#: 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:3145 commands/vacuumparallel.c:1119 +#: 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:3151 +#: access/heap/vacuumlazy.c:3149 #, c-format msgid "while truncating relation \"%s.%s\" to %u blocks" msgstr "у процесі скорочення відношення \"%s.%s\" до %u блоків" @@ -1630,19 +1636,19 @@ msgstr "метод доступу \"%s\" не є типу %s" msgid "index access method \"%s\" does not have a handler" msgstr "для методу доступу індекса \"%s\" не заданий обробник" -#: access/index/genam.c:487 +#: access/index/genam.c:489 #, c-format msgid "transaction aborted during system catalog scan" msgstr "транзакцію перервано під час сканування системного каталогу" -#: access/index/genam.c:655 access/index/indexam.c:82 +#: 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:2878 commands/tablecmds.c:281 commands/tablecmds.c:305 -#: commands/tablecmds.c:17763 commands/tablecmds.c:19574 +#: 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\" не є індексом" @@ -1688,17 +1694,17 @@ msgstr "індекс \"%s\" містить наполовину мертву в 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:5102 +#: 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:5108 +#: 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:5112 +#: access/nbtree/nbtutils.c:5118 #, 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." @@ -1736,7 +1742,7 @@ 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/tableam.c:255 +#: access/table/tableam.c:256 #, c-format msgid "tid (%u, %u) is not valid for relation \"%s\"" msgstr "невірний tid (%u, %u) для відношення \"%s\"" @@ -1746,7 +1752,7 @@ msgstr "невірний tid (%u, %u) для відношення \"%s\"" msgid "\"%s\" cannot be empty." msgstr "\"%s\" не може бути пустим." -#: access/table/tableamapi.c:116 access/transam/xlogrecovery.c:4858 +#: access/table/tableamapi.c:116 access/transam/xlogrecovery.c:4859 #, c-format msgid "\"%s\" is too long (maximum %d characters)." msgstr "\"%s\" занадто довгий (максимум %d символів)." @@ -1898,36 +1904,36 @@ msgstr "неможливо виконати скорочення до MultiXact msgid "invalid MultiXactId: %u" msgstr "неприпустимий MultiXactId: %u" -#: access/transam/parallel.c:731 access/transam/parallel.c:850 +#: access/transam/parallel.c:748 access/transam/parallel.c:867 #, c-format msgid "parallel worker failed to initialize" msgstr "не вдалося виконати ініціалізацію паралельного виконавця" -#: access/transam/parallel.c:732 access/transam/parallel.c:851 +#: 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:912 +#: access/transam/parallel.c:929 #, c-format msgid "postmaster exited during a parallel transaction" msgstr "postmaster завершився під час паралельної транзакції" -#: access/transam/parallel.c:1099 +#: access/transam/parallel.c:1116 #, c-format msgid "lost connection to parallel worker" msgstr "втрачено зв'язок з паралельним виконавцем" -#: access/transam/parallel.c:1155 access/transam/parallel.c:1157 +#: access/transam/parallel.c:1172 access/transam/parallel.c:1174 msgid "parallel worker" msgstr "паралельний виконавець" -#: access/transam/parallel.c:1327 replication/logical/applyparallelworker.c:890 +#: 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:1332 replication/logical/applyparallelworker.c:896 +#: access/transam/parallel.c:1349 replication/logical/applyparallelworker.c:896 #, c-format msgid "invalid magic number in dynamic shared memory segment" msgstr "неприпустиме магічне число в динамічному сегменті спільної пам'яті" @@ -2111,12 +2117,12 @@ msgstr "Встановіть ненульове значення парамет msgid "transaction identifier \"%s\" is already in use" msgstr "ідентифікатор транзакції \"%s\" вже використовується" -#: access/transam/twophase.c:404 access/transam/twophase.c:2540 +#: access/transam/twophase.c:404 access/transam/twophase.c:2531 #, c-format msgid "maximum number of prepared transactions reached" msgstr "досягнуто максимального числа підготованих транзакцій" -#: access/transam/twophase.c:405 access/transam/twophase.c:2541 +#: access/transam/twophase.c:405 access/transam/twophase.c:2532 #, c-format msgid "Increase \"max_prepared_transactions\" (currently %d)." msgstr "Збільшіть \"max_prepared_transactions\" (наразі %d)." @@ -2151,12 +2157,12 @@ msgstr "З'єднайтесь з базою даних, де була підго msgid "prepared transaction with identifier \"%s\" does not exist" msgstr "підготовленої транзакції з ідентифікатором \"%s\" не існує" -#: access/transam/twophase.c:1190 +#: access/transam/twophase.c:1174 #, c-format msgid "two-phase state file maximum length exceeded" msgstr "перевищено граничний розмір файла у 2-фазовому стані" -#: access/transam/twophase.c:1345 +#: access/transam/twophase.c:1329 #, c-format msgid "incorrect size of file \"%s\": %lld byte" msgid_plural "incorrect size of file \"%s\": %lld bytes" @@ -2165,59 +2171,59 @@ msgstr[1] "неправильний розмір файлу \"%s\": %lld бай msgstr[2] "неправильний розмір файлу \"%s\": %lld байтів" msgstr[3] "неправильний розмір файлу \"%s\": %lld байтів" -#: access/transam/twophase.c:1354 +#: access/transam/twophase.c:1338 #, c-format msgid "incorrect alignment of CRC offset for file \"%s\"" msgstr "неправильне вирівнювання зсуву CRC для файлу \"%s\"" -#: access/transam/twophase.c:1372 +#: 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:1387 +#: access/transam/twophase.c:1371 #, c-format msgid "invalid magic number stored in file \"%s\"" msgstr "неприпустиме магічне число, збережене у файлі\"%s\"" -#: access/transam/twophase.c:1393 +#: access/transam/twophase.c:1377 #, c-format msgid "invalid size stored in file \"%s\"" msgstr "неприпустимий розмір, збережений у файлі \"%s\"" -#: access/transam/twophase.c:1405 +#: 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:1435 access/transam/xlogrecovery.c:565 +#: 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:1445 +#: 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:1450 +#: 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:1458 +#: 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:1754 +#: access/transam/twophase.c:1745 #, c-format msgid "could not recreate file \"%s\": %m" msgstr "не вдалося відтворити файл \"%s\": %m" -#: access/transam/twophase.c:1881 +#: 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" @@ -2226,52 +2232,52 @@ msgstr[1] "%u 2-фазовий стан файлів був записаний msgstr[2] "%u 2-фазовий стан файлів був записаний завдяки довготривалим підготовленим транзакціям" msgstr[3] "%u 2-фазовий стан файлів був записаний завдяки довготривалим підготовленим транзакціям" -#: access/transam/twophase.c:2116 +#: access/transam/twophase.c:2107 #, c-format msgid "recovering prepared transaction %u from shared memory" msgstr "відновлення підготовленої транзакції %u із спільної пам'яті" -#: access/transam/twophase.c:2209 +#: access/transam/twophase.c:2200 #, c-format msgid "removing stale two-phase state file for transaction %u" msgstr "видалення застарілого файла 2-фазового стану для транзакції %u" -#: access/transam/twophase.c:2216 +#: 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:2229 +#: access/transam/twophase.c:2220 #, c-format msgid "removing future two-phase state file for transaction %u" msgstr "видалення файлу майбутнього 2-фазового стану для транзакції %u" -#: access/transam/twophase.c:2236 +#: 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:2261 +#: access/transam/twophase.c:2252 #, c-format msgid "corrupted two-phase state file for transaction %u" msgstr "пошкоджений файл двофазного стану для транзакції %u" -#: access/transam/twophase.c:2266 +#: access/transam/twophase.c:2257 #, c-format msgid "corrupted two-phase state in memory for transaction %u" msgstr "пошкоджена пам'ять двофазного стану для транзакції %u" -#: access/transam/twophase.c:2523 +#: access/transam/twophase.c:2514 #, c-format msgid "could not recover two-phase state file for transaction %u" msgstr "не вдалося відновити файл 2-фазового стану для транзакції %u" -#: access/transam/twophase.c:2525 +#: access/transam/twophase.c:2516 #, 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 "Файл 2-фазового стану був знайдений в запису WAL %X/%X, але ця транзакція вже відновлена з диску." -#: access/transam/twophase.c:2533 storage/file/fd.c:514 utils/fmgr/dfmgr.c:209 +#: 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" @@ -2431,172 +2437,172 @@ msgstr "не можна відкотити назад до точки збере msgid "cannot have more than 2^32-1 subtransactions in a transaction" msgstr "в одній транзакції не може бути більше 2^32-1 підтранзакцій" -#: access/transam/xlog.c:1541 +#: 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:1768 +#: 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:2209 access/transam/xlog.c:4500 +#: 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:2227 +#: 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:2476 +#: 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:3738 access/transam/xlogutils.c:831 +#: 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:4060 +#: access/transam/xlog.c:4061 #, c-format msgid "could not rename file \"%s\": %m" msgstr "не вдалося перейменувати файл \"%s\": %m" -#: access/transam/xlog.c:4103 access/transam/xlog.c:4114 -#: access/transam/xlog.c:4135 +#: 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:4120 access/transam/xlog.c:4141 +#: 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:4124 access/transam/xlog.c:4144 -#: commands/dbcommands.c:3259 +#: 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:4211 +#: access/transam/xlog.c:4212 #, c-format msgid "could not generate secret authorization token" msgstr "не вдалося згенерувати секретний токен для авторизації" -#: access/transam/xlog.c:4362 access/transam/xlog.c:4372 -#: access/transam/xlog.c:4398 access/transam/xlog.c:4406 -#: access/transam/xlog.c:4414 access/transam/xlog.c:4420 -#: access/transam/xlog.c:4428 access/transam/xlog.c:4436 -#: access/transam/xlog.c:4444 access/transam/xlog.c:4452 -#: access/transam/xlog.c:4460 access/transam/xlog.c:4468 -#: access/transam/xlog.c:4478 access/transam/xlog.c:4486 -#: utils/init/miscinit.c:1758 +#: 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:4363 +#: 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:4367 +#: 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:4373 +#: 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:4376 access/transam/xlog.c:4402 -#: access/transam/xlog.c:4410 access/transam/xlog.c:4416 +#: 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:4388 +#: access/transam/xlog.c:4389 #, c-format msgid "incorrect checksum in control file" msgstr "помилка контрольної суми у файлі pg_control" -#: access/transam/xlog.c:4399 +#: 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:4407 +#: 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:4415 +#: 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:4421 +#: 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:4424 access/transam/xlog.c:4432 -#: access/transam/xlog.c:4440 access/transam/xlog.c:4448 -#: access/transam/xlog.c:4456 access/transam/xlog.c:4464 -#: access/transam/xlog.c:4472 access/transam/xlog.c:4481 -#: access/transam/xlog.c:4489 +#: 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:4429 +#: 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:4437 +#: 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:4445 +#: 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:4453 +#: 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:4461 +#: 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:4469 +#: 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:4479 +#: 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:4487 +#: 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:4496 +#: access/transam/xlog.c:4497 #, c-format msgid "invalid WAL segment size in control file (%d byte)" msgid_plural "invalid WAL segment size in control file (%d bytes)" @@ -2605,292 +2611,292 @@ msgstr[1] "невірний розмір сегмента WAL у файлі ке msgstr[2] "невірний розмір сегмента WAL у файлі керування (%d байтів)" msgstr[3] "невірний розмір сегмента WAL у файлі керування (%d байтів)" -#: access/transam/xlog.c:4509 +#: 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:4513 +#: 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:4661 catalog/namespace.c:4681 +#: 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 +#: 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:4707 commands/user.c:2545 commands/variable.c:173 +#: 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:5128 +#: access/transam/xlog.c:5129 #, c-format msgid "could not write bootstrap write-ahead log file: %m" msgstr "не вдалося записати початкове завантаження випереджувального журналювання: %m" -#: access/transam/xlog.c:5136 +#: access/transam/xlog.c:5137 #, c-format msgid "could not fsync bootstrap write-ahead log file: %m" msgstr "не вдалося скинути на диск початкове завантаження випереджувального журналювання: %m" -#: access/transam/xlog.c:5142 +#: access/transam/xlog.c:5143 #, c-format msgid "could not close bootstrap write-ahead log file: %m" msgstr "не вдалося закрити початкове завантаження випереджувального журналювання: %m" -#: access/transam/xlog.c:5367 +#: access/transam/xlog.c:5368 #, c-format msgid "WAL was generated with \"wal_level=minimal\", cannot continue recovering" msgstr "WAL був створений з \"wal_level=minimal\", неможливо продовжити відновлення" -#: access/transam/xlog.c:5368 +#: access/transam/xlog.c:5369 #, c-format msgid "This happens if you temporarily set \"wal_level=minimal\" on the server." msgstr "Це трапляється, якщо ви тимчасово встановили \"wal_level=minimal\" на сервері." -#: access/transam/xlog.c:5369 +#: access/transam/xlog.c:5370 #, c-format msgid "Use a backup taken after setting \"wal_level\" to higher than \"minimal\"." msgstr "Використовуйте резервну копію, зроблену після встановлення значення wal_level, що перевищує мінимальний рівень." -#: access/transam/xlog.c:5434 +#: access/transam/xlog.c:5435 #, c-format msgid "control file contains invalid checkpoint location" msgstr "контрольний файл містить недійсне розташування контрольної точки" -#: access/transam/xlog.c:5445 +#: access/transam/xlog.c:5446 #, c-format msgid "database system was shut down at %s" msgstr "система бази даних була вимкнена %s" -#: access/transam/xlog.c:5451 +#: access/transam/xlog.c:5452 #, c-format msgid "database system was shut down in recovery at %s" msgstr "система бази даних завершила роботу у процесі відновлення %s" -#: access/transam/xlog.c:5457 +#: access/transam/xlog.c:5458 #, c-format msgid "database system shutdown was interrupted; last known up at %s" msgstr "завершення роботи бази даних було перервано; останній момент роботи %s" -#: access/transam/xlog.c:5463 +#: access/transam/xlog.c:5464 #, c-format msgid "database system was interrupted while in recovery at %s" msgstr "система бази даних була перервана в процесі відновлення %s" -#: access/transam/xlog.c:5465 +#: 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:5471 +#: 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:5473 +#: 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:5479 +#: access/transam/xlog.c:5480 #, c-format msgid "database system was interrupted; last known up at %s" msgstr "робота системи бази даних була перервана; останній момент роботи %s" -#: access/transam/xlog.c:5486 +#: access/transam/xlog.c:5487 #, c-format msgid "control file contains invalid database cluster state" msgstr "контрольний файл містить недійсний стан кластеру бази даних" -#: access/transam/xlog.c:5874 +#: access/transam/xlog.c:5875 #, c-format msgid "WAL ends before end of online backup" msgstr "WAL завершився до завершення онлайн резервного копіювання" -#: access/transam/xlog.c:5875 +#: 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:5879 +#: access/transam/xlog.c:5880 #, c-format msgid "WAL ends before consistent recovery point" msgstr "WAL завершився до узгодженої точки відновлення" -#: access/transam/xlog.c:5925 +#: access/transam/xlog.c:5926 #, c-format msgid "selected new timeline ID: %u" msgstr "вибрано новий ID часової лінії: %u" -#: access/transam/xlog.c:5958 +#: access/transam/xlog.c:5959 #, c-format msgid "archive recovery complete" msgstr "відновлення архіву завершено" -#: access/transam/xlog.c:6587 +#: access/transam/xlog.c:6612 #, c-format msgid "shutting down" msgstr "завершення роботи" #. translator: the placeholders show checkpoint options -#: access/transam/xlog.c:6626 +#: 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:6638 +#: 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:6703 +#: 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 кб, приблизно=%d кб; lsn=%X/%X, lsn повтору=%X/%X" -#: access/transam/xlog.c:6726 +#: 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 кб, приблизно=%d кб; lsn=%X/%X, lsn повтору=%X/%X" -#: access/transam/xlog.c:7208 +#: access/transam/xlog.c:7233 #, c-format msgid "concurrent write-ahead log activity while database system is shutting down" msgstr "під час того вимкнення БД помічено конкурентну активність у випереджувальному журналюванні" -#: access/transam/xlog.c:7793 +#: access/transam/xlog.c:7818 #, c-format msgid "recovery restart point at %X/%X" msgstr "відновлення збереженої точки %X/%X" -#: access/transam/xlog.c:7795 +#: access/transam/xlog.c:7820 #, c-format msgid "Last completed transaction was at log time %s." msgstr "Остання завершена транзакція була в %s." -#: access/transam/xlog.c:8057 +#: access/transam/xlog.c:8082 #, c-format msgid "restore point \"%s\" created at %X/%X" msgstr "точка відновлення \"%s\" створена в %X/%X" -#: access/transam/xlog.c:8264 +#: access/transam/xlog.c:8289 #, c-format msgid "online backup was canceled, recovery cannot continue" msgstr "онлайн резервне копіювання скасовано, неможливо продовжити відновлення" -#: access/transam/xlog.c:8322 +#: 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:8380 +#: 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:8409 +#: 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:8680 +#: access/transam/xlog.c:8705 #, c-format msgid "could not fsync write-through file \"%s\": %m" msgstr "не вдалосьясинхронізувати файл наскрізного запису %s: %m" -#: access/transam/xlog.c:8685 +#: access/transam/xlog.c:8710 #, c-format msgid "could not fdatasync file \"%s\": %m" msgstr "не вдалося fdatasync файл \"%s\": %m" -#: access/transam/xlog.c:8772 access/transam/xlog.c:9108 +#: 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:8773 access/transam/xlogfuncs.c:248 +#: 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:8778 +#: access/transam/xlog.c:8803 #, c-format msgid "backup label too long (max %d bytes)" msgstr "мітка резервного копіювання задовга (максимум %d байт)" -#: access/transam/xlog.c:8899 +#: 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:8901 access/transam/xlog.c:9197 +#: 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:8981 backup/basebackup.c:1417 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:8988 backup/basebackup.c:1422 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:9109 +#: 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:9147 backup/basebackup.c:1281 +#: access/transam/xlog.c:9172 backup/basebackup.c:1281 #, c-format msgid "the standby was promoted during online backup" msgstr "режим очікування було підвищено у процесі резервного копіювання \"на ходу\"" -#: access/transam/xlog.c:9148 backup/basebackup.c:1282 +#: 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:9195 +#: 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\" було відтворено під час резервного копіювання" -#: access/transam/xlog.c:9311 +#: 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:9325 +#: 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:9327 +#: 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:9334 +#: access/transam/xlog.c:9359 #, c-format msgid "all required WAL segments have been archived" msgstr "усі необхідні сегменти WAL архівовані" -#: access/transam/xlog.c:9338 +#: 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:9377 +#: access/transam/xlog.c:9402 #, c-format msgid "aborting backup due to backend exiting before pg_backup_stop was called" msgstr "припинення резервного копіювання через завершення обслуговуючого процесу до виклику pg_backup_stop" @@ -3057,7 +3063,7 @@ msgstr "неприпустима довжина запису %X/%X: очікув #: 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:771 #, c-format @@ -3526,7 +3532,7 @@ msgstr "пауза в кінці відновлення" msgid "Execute pg_wal_replay_resume() to promote." msgstr "Виконайте pg_wal_replay_resume() для підвищення рівня." -#: access/transam/xlogrecovery.c:2941 access/transam/xlogrecovery.c:4678 +#: access/transam/xlogrecovery.c:2941 access/transam/xlogrecovery.c:4679 #, c-format msgid "recovery has paused" msgstr "відновлення зупинено" @@ -3551,119 +3557,119 @@ msgstr "не вдалося прочитати сегмент журналу %s, 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:4060 +#: access/transam/xlogrecovery.c:4061 #, c-format msgid "invalid checkpoint location" msgstr "невірне розташування контрольної точки" -#: access/transam/xlogrecovery.c:4070 +#: access/transam/xlogrecovery.c:4071 #, c-format msgid "invalid checkpoint record" msgstr "невірний запис контрольної точки" -#: access/transam/xlogrecovery.c:4076 +#: access/transam/xlogrecovery.c:4077 #, c-format msgid "invalid resource manager ID in checkpoint record" msgstr "невірний ID менеджера ресурсів в записі контрольної точки" -#: access/transam/xlogrecovery.c:4084 +#: access/transam/xlogrecovery.c:4085 #, c-format msgid "invalid xl_info in checkpoint record" msgstr "невірний xl_info у записі контрольної точки" -#: access/transam/xlogrecovery.c:4090 +#: access/transam/xlogrecovery.c:4091 #, c-format msgid "invalid length of checkpoint record" msgstr "невірна довжина запису контрольної точки" -#: access/transam/xlogrecovery.c:4144 +#: 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:4158 +#: 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:4177 +#: access/transam/xlogrecovery.c:4178 #, c-format msgid "new target timeline is %u" msgstr "нова цільова лінія часу %u" -#: access/transam/xlogrecovery.c:4380 +#: access/transam/xlogrecovery.c:4381 #, c-format msgid "WAL receiver process shutdown requested" msgstr "Запит на вимкнення процесу приймача WAL" -#: access/transam/xlogrecovery.c:4440 +#: access/transam/xlogrecovery.c:4441 #, c-format msgid "received promote request" msgstr "отримано запит підвищення статусу" -#: access/transam/xlogrecovery.c:4669 +#: 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:4670 access/transam/xlogrecovery.c:4697 -#: access/transam/xlogrecovery.c:4727 +#: 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:4679 +#: access/transam/xlogrecovery.c:4680 #, c-format msgid "If recovery is unpaused, the server will shut down." msgstr "Якщо відновлення не буде зупинено, сервер завершить роботу." -#: access/transam/xlogrecovery.c:4680 +#: 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:4691 +#: access/transam/xlogrecovery.c:4692 #, c-format msgid "promotion is not possible because of insufficient parameter settings" msgstr "підвищення неможливе через недостатнє налаштування параметрів" -#: access/transam/xlogrecovery.c:4701 +#: access/transam/xlogrecovery.c:4702 #, c-format msgid "Restart the server after making the necessary configuration changes." msgstr "Перезапустити сервер після здійснення необхідних змін у конфігурації." -#: access/transam/xlogrecovery.c:4725 +#: access/transam/xlogrecovery.c:4726 #, c-format msgid "recovery aborted because of insufficient parameter settings" msgstr "відновлення перервано через недостатнє налаштування параметрів" -#: access/transam/xlogrecovery.c:4731 +#: access/transam/xlogrecovery.c:4732 #, c-format msgid "You can restart the server after making the necessary configuration changes." msgstr "Ви можете перезапустити сервер, після здійснення необхідних змін у конфігурації." -#: access/transam/xlogrecovery.c:4773 +#: access/transam/xlogrecovery.c:4774 #, c-format msgid "multiple recovery targets specified" msgstr "вказано декілька цілей відновлення" -#: access/transam/xlogrecovery.c:4774 +#: 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:4785 +#: access/transam/xlogrecovery.c:4786 #, c-format msgid "The only allowed value is \"immediate\"." msgstr "Єдиним дозволеним значенням є \"immediate\"." -#: access/transam/xlogrecovery.c:4937 utils/adt/timestamp.c:202 +#: 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:4982 +#: access/transam/xlogrecovery.c:4983 #, c-format msgid "\"recovery_target_timeline\" is not a valid number." msgstr "\"recovery_target_timeline\" не є допустимим числом." @@ -3694,7 +3700,7 @@ msgstr "Команда архівації з помилкою: %s" msgid "archive command was terminated by exception 0x%X" msgstr "команда архівації була перервана винятком 0x%X" -#: archive/shell_archive.c:109 postmaster/postmaster.c:3094 +#: 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\"." @@ -3979,7 +3985,7 @@ msgstr "не вдалося створити каталог \"%s\": %m" msgid "directory \"%s\" exists but is not empty" msgstr "каталог \"%s\" існує, але він не порожній" -#: backup/basebackup_server.c:123 utils/init/postinit.c:1177 +#: backup/basebackup_server.c:123 utils/init/postinit.c:1178 #, c-format msgid "could not access directory \"%s\": %m" msgstr "немає доступу до каталогу \"%s\": %m" @@ -4049,630 +4055,630 @@ msgstr "Спробуйте \"%s --help\" для додаткової інфор msgid "%s: invalid command-line arguments\n" msgstr "%s: невірні аргументи командного рядка\n" -#: catalog/aclchk.c:210 +#: catalog/aclchk.c:211 #, c-format msgid "grant options can only be granted to roles" msgstr "право надання прав можна надавати тільки ролям" -#: catalog/aclchk.c:332 +#: catalog/aclchk.c:333 #, c-format msgid "no privileges were granted for column \"%s\" of relation \"%s\"" msgstr "для стовпця \"%s\" відношення \"%s\" не призначено ніяких прав" -#: catalog/aclchk.c:337 +#: catalog/aclchk.c:338 #, c-format msgid "no privileges were granted for \"%s\"" msgstr "для \"%s\" не призначено ніяких прав" -#: catalog/aclchk.c:345 +#: catalog/aclchk.c:346 #, c-format msgid "not all privileges were granted for column \"%s\" of relation \"%s\"" msgstr "для стовпця \"%s\" відношення \"%s\" призначено не всі права" -#: catalog/aclchk.c:350 +#: catalog/aclchk.c:351 #, c-format msgid "not all privileges were granted for \"%s\"" msgstr "для \"%s\" призначено не всі права" -#: catalog/aclchk.c:361 +#: catalog/aclchk.c:362 #, c-format msgid "no privileges could be revoked for column \"%s\" of relation \"%s\"" msgstr "для стовпця \"%s\" відношення \"%s\" жодні права не можуть бути відкликані" -#: catalog/aclchk.c:366 +#: catalog/aclchk.c:367 #, c-format msgid "no privileges could be revoked for \"%s\"" msgstr "для \"%s\" жодні права не можуть бути відкликані" -#: catalog/aclchk.c:374 +#: 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:379 +#: catalog/aclchk.c:380 #, c-format msgid "not all privileges could be revoked for \"%s\"" msgstr "для \"%s\" не всі права можуть бути відкликані" -#: catalog/aclchk.c:411 +#: catalog/aclchk.c:412 #, c-format msgid "grantor must be current user" msgstr "грантодавець повинен бути поточним користувачем" -#: catalog/aclchk.c:479 catalog/aclchk.c:1054 +#: catalog/aclchk.c:480 catalog/aclchk.c:1055 #, c-format msgid "invalid privilege type %s for relation" msgstr "недійсний тип права %s для відношення" -#: catalog/aclchk.c:483 catalog/aclchk.c:1058 +#: catalog/aclchk.c:484 catalog/aclchk.c:1059 #, c-format msgid "invalid privilege type %s for sequence" msgstr "невірний тип права %s для послідовності" -#: catalog/aclchk.c:487 +#: catalog/aclchk.c:488 #, c-format msgid "invalid privilege type %s for database" msgstr "недійсний тип права %s для бази даних" -#: catalog/aclchk.c:491 +#: catalog/aclchk.c:492 #, c-format msgid "invalid privilege type %s for domain" msgstr "недійсний тип права %s для домену" -#: catalog/aclchk.c:495 catalog/aclchk.c:1062 +#: catalog/aclchk.c:496 catalog/aclchk.c:1063 #, c-format msgid "invalid privilege type %s for function" msgstr "недійсний тип права %s для функції" -#: catalog/aclchk.c:499 +#: catalog/aclchk.c:500 #, c-format msgid "invalid privilege type %s for language" msgstr "недійсний тип права %s для мови" -#: catalog/aclchk.c:503 +#: catalog/aclchk.c:504 #, c-format msgid "invalid privilege type %s for large object" msgstr "недійсний тип права %s для великого об'єкту" -#: catalog/aclchk.c:507 catalog/aclchk.c:1078 +#: catalog/aclchk.c:508 catalog/aclchk.c:1079 #, c-format msgid "invalid privilege type %s for schema" msgstr "недійсний тип привілеїв %s для схеми" -#: catalog/aclchk.c:511 catalog/aclchk.c:1066 +#: catalog/aclchk.c:512 catalog/aclchk.c:1067 #, c-format msgid "invalid privilege type %s for procedure" msgstr "недійсний тип привілеїв %s для процедури" -#: catalog/aclchk.c:515 catalog/aclchk.c:1070 +#: catalog/aclchk.c:516 catalog/aclchk.c:1071 #, c-format msgid "invalid privilege type %s for routine" msgstr "недійсний тип привілею %s для підпрограми" -#: catalog/aclchk.c:519 +#: catalog/aclchk.c:520 #, c-format msgid "invalid privilege type %s for tablespace" msgstr "недійсний тип привілеїв %s для табличного простору" -#: catalog/aclchk.c:523 catalog/aclchk.c:1074 +#: catalog/aclchk.c:524 catalog/aclchk.c:1075 #, c-format msgid "invalid privilege type %s for type" msgstr "недійсний тип привілею %s для типу" -#: catalog/aclchk.c:527 +#: catalog/aclchk.c:528 #, c-format msgid "invalid privilege type %s for foreign-data wrapper" msgstr "недійсний тип привілею %s для джерела сторонніх даних" -#: catalog/aclchk.c:531 +#: catalog/aclchk.c:532 #, c-format msgid "invalid privilege type %s for foreign server" msgstr "недійсний тип привілею %s для стороннього серверу" -#: catalog/aclchk.c:535 +#: catalog/aclchk.c:536 #, c-format msgid "invalid privilege type %s for parameter" msgstr "неприпустимий тип привілею %s для параметру" -#: catalog/aclchk.c:574 +#: catalog/aclchk.c:575 #, c-format msgid "column privileges are only valid for relations" msgstr "привілеї стовпця дійсні лише для зв'язків" -#: catalog/aclchk.c:737 catalog/aclchk.c:3624 catalog/objectaddress.c:1054 +#: 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:1111 +#: catalog/aclchk.c:1112 #, c-format msgid "default privileges cannot be set for columns" msgstr "права за замовчуванням не можна встановити для стовпців" -#: catalog/aclchk.c:1147 +#: catalog/aclchk.c:1148 #, c-format msgid "permission denied to change default privileges" msgstr "немає дозволу для зміни прав за замовчуванням" -#: catalog/aclchk.c:1265 +#: 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:1616 catalog/catalog.c:650 catalog/objectaddress.c:1523 -#: catalog/pg_publication.c:528 commands/analyze.c:380 commands/copy.c:947 -#: commands/sequence.c:1655 commands/tablecmds.c:7518 commands/tablecmds.c:7672 -#: commands/tablecmds.c:7722 commands/tablecmds.c:7796 -#: commands/tablecmds.c:7866 commands/tablecmds.c:7996 -#: commands/tablecmds.c:8125 commands/tablecmds.c:8219 -#: commands/tablecmds.c:8320 commands/tablecmds.c:8447 -#: commands/tablecmds.c:8477 commands/tablecmds.c:8619 -#: commands/tablecmds.c:8712 commands/tablecmds.c:8846 -#: commands/tablecmds.c:8958 commands/tablecmds.c:12695 -#: commands/tablecmds.c:12887 commands/tablecmds.c:13048 -#: commands/tablecmds.c:14237 commands/tablecmds.c:16863 commands/trigger.c:942 +#: 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:2807 +#: utils/adt/ruleutils.c:2812 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist" msgstr "стовпець \"%s\" зв'язку \"%s\" не існує" -#: catalog/aclchk.c:1861 +#: catalog/aclchk.c:1862 #, c-format msgid "\"%s\" is an index" msgstr "\"%s\" є індексом" -#: catalog/aclchk.c:1868 commands/tablecmds.c:14394 commands/tablecmds.c:17772 +#: 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:1876 catalog/objectaddress.c:1363 commands/tablecmds.c:263 -#: commands/tablecmds.c:17736 utils/adt/acl.c:2107 utils/adt/acl.c:2137 +#: 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\" не є послідовністю" -#: catalog/aclchk.c:1914 +#: catalog/aclchk.c:1915 #, c-format msgid "sequence \"%s\" only supports USAGE, SELECT, and UPDATE privileges" msgstr "послідовність \"%s\" підтримує лише привілеї USAGE, SELECT та UPDATE" -#: catalog/aclchk.c:1931 +#: catalog/aclchk.c:1932 #, c-format msgid "invalid privilege type %s for table" msgstr "недійсний тип привілею %s для таблиці" -#: catalog/aclchk.c:2093 +#: catalog/aclchk.c:2097 #, c-format msgid "invalid privilege type %s for column" msgstr "недійсний тип привілею %s для стовпця" -#: catalog/aclchk.c:2106 +#: catalog/aclchk.c:2110 #, c-format msgid "sequence \"%s\" only supports SELECT column privileges" msgstr "послідовність \"%s\" підтримує тільки привілей стовпця SELECT" -#: catalog/aclchk.c:2296 +#: catalog/aclchk.c:2301 #, c-format msgid "language \"%s\" is not trusted" msgstr "мова \"%s\" не є довіреною" -#: catalog/aclchk.c:2298 +#: 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:2449 +#: catalog/aclchk.c:2454 #, c-format msgid "cannot set privileges of array types" msgstr "не можна встановити права для типів масивів" -#: catalog/aclchk.c:2450 +#: catalog/aclchk.c:2455 #, c-format msgid "Set the privileges of the element type instead." msgstr "Замість цього встановіть права для типу елементу." -#: catalog/aclchk.c:2454 +#: catalog/aclchk.c:2459 #, c-format msgid "cannot set privileges of multirange types" msgstr "не можна встановити права для типів множинного діапазону" -#: catalog/aclchk.c:2455 +#: catalog/aclchk.c:2460 #, c-format msgid "Set the privileges of the range type instead." msgstr "Замість цього встановіть права типу діапазону." -#: catalog/aclchk.c:2462 catalog/objectaddress.c:1629 +#: catalog/aclchk.c:2467 catalog/objectaddress.c:1629 #, c-format msgid "\"%s\" is not a domain" msgstr "\"%s\" не є доменом" -#: catalog/aclchk.c:2648 +#: catalog/aclchk.c:2653 #, c-format msgid "unrecognized privilege type \"%s\"" msgstr "нерозпізнаний привілей \"%s\"" -#: catalog/aclchk.c:2715 +#: catalog/aclchk.c:2720 #, c-format msgid "permission denied for aggregate %s" msgstr "немає дозволу для агрегату %s" -#: catalog/aclchk.c:2718 +#: catalog/aclchk.c:2723 #, c-format msgid "permission denied for collation %s" msgstr "немає дозволу для сортування %s" -#: catalog/aclchk.c:2721 +#: catalog/aclchk.c:2726 #, c-format msgid "permission denied for column %s" msgstr "немає дозволу для стовпця %s" -#: catalog/aclchk.c:2724 +#: catalog/aclchk.c:2729 #, c-format msgid "permission denied for conversion %s" msgstr "немає дозволу для перетворення %s" -#: catalog/aclchk.c:2727 +#: catalog/aclchk.c:2732 #, c-format msgid "permission denied for database %s" msgstr "немає доступу для бази даних %s" -#: catalog/aclchk.c:2730 +#: catalog/aclchk.c:2735 #, c-format msgid "permission denied for domain %s" msgstr "немає дозволу для домену %s" -#: catalog/aclchk.c:2733 +#: catalog/aclchk.c:2738 #, c-format msgid "permission denied for event trigger %s" msgstr "немає дозволу для тригера подій %s" -#: catalog/aclchk.c:2736 +#: catalog/aclchk.c:2741 #, c-format msgid "permission denied for extension %s" msgstr "немає дозволу для розширення %s" -#: catalog/aclchk.c:2739 +#: catalog/aclchk.c:2744 #, c-format msgid "permission denied for foreign-data wrapper %s" msgstr "немає дозволу для джерела сторонніх даних %s" -#: catalog/aclchk.c:2742 +#: catalog/aclchk.c:2747 #, c-format msgid "permission denied for foreign server %s" msgstr "немає дозволу для стороннього серверу %s" -#: catalog/aclchk.c:2745 +#: catalog/aclchk.c:2750 #, c-format msgid "permission denied for foreign table %s" msgstr "немає дозволу для сторонньої таблиці %s" -#: catalog/aclchk.c:2748 +#: catalog/aclchk.c:2753 #, c-format msgid "permission denied for function %s" msgstr "немає дозволу для функції %s" -#: catalog/aclchk.c:2751 +#: catalog/aclchk.c:2756 #, c-format msgid "permission denied for index %s" msgstr "немає дозволу для індексу %s" -#: catalog/aclchk.c:2754 +#: catalog/aclchk.c:2759 #, c-format msgid "permission denied for language %s" msgstr "немає дозволу для мови %s" -#: catalog/aclchk.c:2757 +#: catalog/aclchk.c:2762 #, c-format msgid "permission denied for large object %s" msgstr "немає дозволу для великого об'єкту %s" -#: catalog/aclchk.c:2760 +#: catalog/aclchk.c:2765 #, c-format msgid "permission denied for materialized view %s" msgstr "немає дозволу для матеріалізованого подання %s" -#: catalog/aclchk.c:2763 +#: catalog/aclchk.c:2768 #, c-format msgid "permission denied for operator class %s" msgstr "немає дозволу для класу операторів %s" -#: catalog/aclchk.c:2766 +#: catalog/aclchk.c:2771 #, c-format msgid "permission denied for operator %s" msgstr "немає дозволу для оператора %s" -#: catalog/aclchk.c:2769 +#: catalog/aclchk.c:2774 #, c-format msgid "permission denied for operator family %s" msgstr "немає дозволу для сімейства операторів %s" -#: catalog/aclchk.c:2772 +#: catalog/aclchk.c:2777 #, c-format msgid "permission denied for parameter %s" msgstr "дозвіл відхилено для параметру %s" -#: catalog/aclchk.c:2775 +#: catalog/aclchk.c:2780 #, c-format msgid "permission denied for policy %s" msgstr "немає дозволу для політики %s" -#: catalog/aclchk.c:2778 +#: catalog/aclchk.c:2783 #, c-format msgid "permission denied for procedure %s" msgstr "немає дозволу для процедури %s" -#: catalog/aclchk.c:2781 +#: catalog/aclchk.c:2786 #, c-format msgid "permission denied for publication %s" msgstr "немає дозволу для публікації %s" -#: catalog/aclchk.c:2784 +#: catalog/aclchk.c:2789 #, c-format msgid "permission denied for routine %s" msgstr "немає дозволу для підпрограми %s" -#: catalog/aclchk.c:2787 +#: catalog/aclchk.c:2792 #, c-format msgid "permission denied for schema %s" msgstr "немає дозволу для схеми %s" -#: catalog/aclchk.c:2790 commands/sequence.c:654 commands/sequence.c:880 +#: 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:2793 +#: catalog/aclchk.c:2798 #, c-format msgid "permission denied for statistics object %s" msgstr "немає дозволу для об'єкту статистики %s" -#: catalog/aclchk.c:2796 +#: catalog/aclchk.c:2801 #, c-format msgid "permission denied for subscription %s" msgstr "немає дозволу для підписки %s" -#: catalog/aclchk.c:2799 +#: catalog/aclchk.c:2804 #, c-format msgid "permission denied for table %s" msgstr "немає дозволу для таблиці %s" -#: catalog/aclchk.c:2802 +#: catalog/aclchk.c:2807 #, c-format msgid "permission denied for tablespace %s" msgstr "немає дозволу для табличного простору %s" -#: catalog/aclchk.c:2805 +#: catalog/aclchk.c:2810 #, c-format msgid "permission denied for text search configuration %s" msgstr "немає дозволу для конфігурації текстового пошуку %s" -#: catalog/aclchk.c:2808 +#: catalog/aclchk.c:2813 #, c-format msgid "permission denied for text search dictionary %s" msgstr "немає дозволу для словника текстового пошуку %s" -#: catalog/aclchk.c:2811 +#: catalog/aclchk.c:2816 #, c-format msgid "permission denied for type %s" msgstr "немає дозволу для типу %s" -#: catalog/aclchk.c:2814 +#: catalog/aclchk.c:2819 #, c-format msgid "permission denied for view %s" msgstr "немає дозволу для подання %s" -#: catalog/aclchk.c:2850 +#: catalog/aclchk.c:2855 #, c-format msgid "must be owner of aggregate %s" msgstr "треба бути власником агрегату %s" -#: catalog/aclchk.c:2853 +#: catalog/aclchk.c:2858 #, c-format msgid "must be owner of collation %s" msgstr "треба бути власником правил сортування %s" -#: catalog/aclchk.c:2856 +#: catalog/aclchk.c:2861 #, c-format msgid "must be owner of conversion %s" msgstr "треба бути власником перетворення %s" -#: catalog/aclchk.c:2859 +#: catalog/aclchk.c:2864 #, c-format msgid "must be owner of database %s" msgstr "треба бути власником бази даних %s" -#: catalog/aclchk.c:2862 +#: catalog/aclchk.c:2867 #, c-format msgid "must be owner of domain %s" msgstr "треба бути власником домену %s" -#: catalog/aclchk.c:2865 +#: catalog/aclchk.c:2870 #, c-format msgid "must be owner of event trigger %s" msgstr "треба бути власником тригеру подій %s" -#: catalog/aclchk.c:2868 +#: catalog/aclchk.c:2873 #, c-format msgid "must be owner of extension %s" msgstr "треба бути власником розширення %s" -#: catalog/aclchk.c:2871 +#: catalog/aclchk.c:2876 #, c-format msgid "must be owner of foreign-data wrapper %s" msgstr "треба бути власником джерела сторонніх даних %s" -#: catalog/aclchk.c:2874 +#: catalog/aclchk.c:2879 #, c-format msgid "must be owner of foreign server %s" msgstr "треба бути власником стороннього серверу %s" -#: catalog/aclchk.c:2877 +#: catalog/aclchk.c:2882 #, c-format msgid "must be owner of foreign table %s" msgstr "треба бути власником сторонньої таблиці %s" -#: catalog/aclchk.c:2880 +#: catalog/aclchk.c:2885 #, c-format msgid "must be owner of function %s" msgstr "треба бути власником функції %s" -#: catalog/aclchk.c:2883 +#: catalog/aclchk.c:2888 #, c-format msgid "must be owner of index %s" msgstr "треба бути власником індексу %s" -#: catalog/aclchk.c:2886 +#: catalog/aclchk.c:2891 #, c-format msgid "must be owner of language %s" msgstr "треба бути власником мови %s" -#: catalog/aclchk.c:2889 +#: catalog/aclchk.c:2894 #, c-format msgid "must be owner of large object %s" msgstr "треба бути власником великого об'єкту %s" -#: catalog/aclchk.c:2892 +#: catalog/aclchk.c:2897 #, c-format msgid "must be owner of materialized view %s" msgstr "треба бути власником матеріалізованого подання %s" -#: catalog/aclchk.c:2895 +#: catalog/aclchk.c:2900 #, c-format msgid "must be owner of operator class %s" msgstr "треба бути власником класу операторів %s" -#: catalog/aclchk.c:2898 +#: catalog/aclchk.c:2903 #, c-format msgid "must be owner of operator %s" msgstr "треба бути власником оператора %s" -#: catalog/aclchk.c:2901 +#: catalog/aclchk.c:2906 #, c-format msgid "must be owner of operator family %s" msgstr "треба бути власником сімейства операторів %s" -#: catalog/aclchk.c:2904 +#: catalog/aclchk.c:2909 #, c-format msgid "must be owner of procedure %s" msgstr "треба бути власником процедури %s" -#: catalog/aclchk.c:2907 +#: catalog/aclchk.c:2912 #, c-format msgid "must be owner of publication %s" msgstr "треба бути власником публікації %s" -#: catalog/aclchk.c:2910 +#: catalog/aclchk.c:2915 #, c-format msgid "must be owner of routine %s" msgstr "треба бути власником підпрограми %s" -#: catalog/aclchk.c:2913 +#: catalog/aclchk.c:2918 #, c-format msgid "must be owner of sequence %s" msgstr "треба бути власником послідовності %s" -#: catalog/aclchk.c:2916 +#: catalog/aclchk.c:2921 #, c-format msgid "must be owner of subscription %s" msgstr "треба бути власником підписки %s" -#: catalog/aclchk.c:2919 +#: catalog/aclchk.c:2924 #, c-format msgid "must be owner of table %s" msgstr "треба бути власником таблиці %s" -#: catalog/aclchk.c:2922 +#: catalog/aclchk.c:2927 #, c-format msgid "must be owner of type %s" msgstr "треба бути власником типу %s" -#: catalog/aclchk.c:2925 +#: catalog/aclchk.c:2930 #, c-format msgid "must be owner of view %s" msgstr "треба бути власником подання %s" -#: catalog/aclchk.c:2928 +#: catalog/aclchk.c:2933 #, c-format msgid "must be owner of schema %s" msgstr "треба бути власником схеми %s" -#: catalog/aclchk.c:2931 +#: catalog/aclchk.c:2936 #, c-format msgid "must be owner of statistics object %s" msgstr "треба бути власником об'єкту статистики %s" -#: catalog/aclchk.c:2934 +#: catalog/aclchk.c:2939 #, c-format msgid "must be owner of tablespace %s" msgstr "треба бути власником табличного простору %s" -#: catalog/aclchk.c:2937 +#: catalog/aclchk.c:2942 #, c-format msgid "must be owner of text search configuration %s" msgstr "треба бути власником конфігурації текстового пошуку %s" -#: catalog/aclchk.c:2940 +#: catalog/aclchk.c:2945 #, c-format msgid "must be owner of text search dictionary %s" msgstr "треба бути власником словника текстового пошуку %s" -#: catalog/aclchk.c:2954 +#: catalog/aclchk.c:2959 #, c-format msgid "must be owner of relation %s" msgstr "треба бути власником відношення %s" -#: catalog/aclchk.c:3000 +#: catalog/aclchk.c:3005 #, c-format msgid "permission denied for column \"%s\" of relation \"%s\"" msgstr "немає дозволу для стовпця \"%s\" відношення \"%s\"" -#: catalog/aclchk.c:3157 catalog/aclchk.c:4165 catalog/aclchk.c:4196 +#: 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:3240 catalog/aclchk.c:3259 +#: 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:3297 catalog/aclchk.c:3360 catalog/aclchk.c:3999 +#: 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:3545 +#: catalog/aclchk.c:3550 #, c-format msgid "parameter ACL with OID %u does not exist" msgstr "параметр ACL з OID %u не існує" -#: catalog/aclchk.c:3718 commands/collationcmds.c:853 +#: 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:3792 catalog/aclchk.c:3819 catalog/aclchk.c:3848 +#: 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:468 +#: catalog/catalog.c:477 #, c-format msgid "still searching for an unused OID in relation \"%s\"" msgstr "все ще шукаю невикористаний OID у відношенні \"%s\"" -#: catalog/catalog.c:470 +#: 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." @@ -4681,7 +4687,7 @@ msgstr[1] "OID кандидати буле перевірені %llu рази, msgstr[2] "OID кандидати буле перевірені %llu разів, але невикористаного OID все ще не знайдено." msgstr[3] "OID кандидати буле перевірені %llu разів, але невикористаного OID все ще не знайдено." -#: catalog/catalog.c:495 +#: 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" @@ -4690,27 +4696,27 @@ msgstr[1] "новий OID було призначено у відношенні msgstr[2] "новий OID було призначено у відношенні \"%s\" після %llu повторних спроб" msgstr[3] "новий OID було призначено у відношенні \"%s\" після %llu повторних спроб" -#: catalog/catalog.c:628 catalog/catalog.c:695 +#: catalog/catalog.c:637 catalog/catalog.c:704 #, c-format msgid "must be superuser to call %s()" msgstr "для виклику %s() потрібно бути суперкористувачем" -#: catalog/catalog.c:637 +#: catalog/catalog.c:646 #, c-format msgid "pg_nextoid() can only be used on system catalogs" msgstr "pg_nextoid() можна використовувати лише для системних каталогів" -#: catalog/catalog.c:642 parser/parse_utilcmd.c:2270 +#: 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:659 +#: catalog/catalog.c:668 #, c-format msgid "column \"%s\" is not of type oid" msgstr "стовпець \"%s\" повинен мати тип oid" -#: catalog/catalog.c:666 +#: catalog/catalog.c:675 #, c-format msgid "index \"%s\" is not the index for column \"%s\"" msgstr "індекс \"%s\" не є індексом для стовпця \"%s\"" @@ -4761,15 +4767,15 @@ 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:1442 -#: commands/tablecmds.c:14986 commands/tablespace.c:460 commands/user.c:1302 -#: commands/vacuum.c:211 commands/view.c:441 executor/execExprInterp.c:4643 -#: executor/execExprInterp.c:4651 libpq/auth.c:324 +#: 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:1427 utils/misc/guc.c:3169 -#: utils/misc/guc.c:3210 utils/misc/guc.c:3285 utils/misc/guc.c:6790 -#: utils/misc/guc.c:6824 utils/misc/guc.c:6858 utils/misc/guc.c:6901 -#: utils/misc/guc.c:6943 +#: 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" @@ -4804,66 +4810,66 @@ msgstr "константа типу %s не може бути використа msgid "column %d of relation \"%s\" does not exist" msgstr "стовпець %d відношення \"%s\" не існує" -#: catalog/heap.c:325 +#: catalog/heap.c:326 #, c-format msgid "permission denied to create \"%s.%s\"" msgstr "немає дозволу для створення \"%s.%s\"" -#: catalog/heap.c:327 +#: catalog/heap.c:328 #, c-format msgid "System catalog modifications are currently disallowed." msgstr "Змінення системного каталогу наразі заборонено." -#: catalog/heap.c:467 commands/tablecmds.c:2478 commands/tablecmds.c:2900 -#: commands/tablecmds.c:7140 +#: 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:485 commands/tablecmds.c:7409 +#: 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:501 +#: 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:579 +#: catalog/heap.c:580 #, c-format msgid "partition key column %s has pseudo-type %s" msgstr "стовпець ключа секціонування %s має псевдотип %s" -#: catalog/heap.c:584 +#: catalog/heap.c:585 #, c-format msgid "column \"%s\" has pseudo-type %s" msgstr "стовпець \"%s\" має псевдо-тип %s" -#: catalog/heap.c:615 +#: 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:670 +#: 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:676 commands/createas.c:198 commands/createas.c:505 +#: 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:1161 catalog/index.c:899 commands/createas.c:401 -#: commands/tablecmds.c:4149 +#: 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:1177 catalog/pg_type.c:434 catalog/pg_type.c:805 +#: 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 @@ -4871,132 +4877,132 @@ msgstr "відношення \"%s\" вже існує" msgid "type \"%s\" already exists" msgstr "тип \"%s\" вже існує" -#: catalog/heap.c:1178 +#: 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:1218 +#: catalog/heap.c:1219 #, c-format msgid "toast relfilenumber value not set when in binary upgrade mode" msgstr "значення toast relfilenumber не встановлено в режимі двійкового оновлення" -#: catalog/heap.c:1229 +#: 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:1239 +#: catalog/heap.c:1240 #, c-format msgid "relfilenumber value not set when in binary upgrade mode" msgstr "значення relfilenumber не встановлено в режимі двійкового оновлення" -#: catalog/heap.c:2128 +#: catalog/heap.c:2185 #, c-format msgid "cannot add NO INHERIT constraint to partitioned table \"%s\"" msgstr "не можна додати обмеження NO INHERIT до секціонованої таблиці \"%s\"" -#: catalog/heap.c:2400 +#: catalog/heap.c:2452 #, c-format msgid "check constraint \"%s\" already exists" msgstr "обмеження перевірки \"%s\" вже інсує" -#: catalog/heap.c:2572 catalog/index.c:913 catalog/pg_constraint.c:724 -#: commands/tablecmds.c:9333 +#: 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:2579 +#: catalog/heap.c:2631 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on relation \"%s\"" msgstr "обмеження \"%s\" конфліктує з неуспадкованим обмеженням відношення \"%s\"" -#: catalog/heap.c:2590 +#: catalog/heap.c:2642 #, c-format msgid "constraint \"%s\" conflicts with inherited constraint on relation \"%s\"" msgstr "обмеження \"%s\" конфліктує з успадкованим обмеженням відношення \"%s\"" -#: catalog/heap.c:2600 +#: 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:2605 +#: catalog/heap.c:2657 #, c-format msgid "merging constraint \"%s\" with inherited definition" msgstr "злиття обмеження \"%s\" з успадкованим визначенням" -#: catalog/heap.c:2631 catalog/pg_constraint.c:853 commands/tablecmds.c:3057 -#: commands/tablecmds.c:3360 commands/tablecmds.c:7066 -#: commands/tablecmds.c:15804 commands/tablecmds.c:15935 +#: 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:2715 +#: catalog/heap.c:2767 #, c-format msgid "cannot use generated column \"%s\" in column generation expression" msgstr "в виразі створення стовпця не можна використовувати згенерований стовпець \"%s\"" -#: catalog/heap.c:2717 +#: catalog/heap.c:2769 #, c-format msgid "A generated column cannot reference another generated column." msgstr "Згенерований стовпець не може посилатися на інший згенерований стовпець." -#: catalog/heap.c:2723 +#: catalog/heap.c:2775 #, c-format msgid "cannot use whole-row variable in column generation expression" msgstr "у виразі створення стовпців не можна використовувати змінну усього рядка" -#: catalog/heap.c:2724 +#: catalog/heap.c:2776 #, c-format msgid "This would cause the generated column to depend on its own value." msgstr "Це призведе до того, що згенерований стовпець буде залежати від власного значення." -#: catalog/heap.c:2779 +#: catalog/heap.c:2831 #, c-format msgid "generation expression is not immutable" msgstr "вираз генерації не є незмінним" -#: catalog/heap.c:2807 rewrite/rewriteHandler.c:1282 +#: 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:2812 commands/prepare.c:331 parser/analyze.c:2758 +#: 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:1287 +#: 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:2859 +#: catalog/heap.c:2911 #, c-format msgid "only table \"%s\" can be referenced in check constraint" msgstr "в обмеженні-перевірці можна посилатися лише на таблицю \"%s\"" -#: catalog/heap.c:3165 +#: catalog/heap.c:3217 #, c-format msgid "unsupported ON COMMIT and foreign key combination" msgstr "непідтримуване поєднання зовнішнього ключа з ON COMMIT" -#: catalog/heap.c:3166 +#: 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:3171 +#: catalog/heap.c:3223 #, c-format msgid "cannot truncate a table referenced in a foreign key constraint" msgstr "скоротити таблицю, на яку посилається зовнішній ключ, не можливо" -#: catalog/heap.c:3172 +#: catalog/heap.c:3224 #, c-format msgid "Table \"%s\" references \"%s\"." msgstr "Таблиця \"%s\" посилається на \"%s\"." -#: catalog/heap.c:3174 +#: catalog/heap.c:3226 #, c-format msgid "Truncate table \"%s\" at the same time, or use TRUNCATE ... CASCADE." msgstr "Скоротіть таблицю \"%s\" паралельно або використайте TRUNCATE ... CASCADE." @@ -5057,7 +5063,7 @@ msgstr "ввідношення \"%s\" вже існує, пропускаємо" msgid "pg_class index OID value not set when in binary upgrade mode" msgstr "значення OID індекса в pg_class не встановлено в режимі двійкового оновлення" -#: catalog/index.c:951 utils/cache/relcache.c:3790 +#: catalog/index.c:951 utils/cache/relcache.c:3791 #, c-format msgid "index relfilenumber value not set when in binary upgrade mode" msgstr "значення індексу relfilenumber не встановлено в режимі двійкового оновлення" @@ -5067,189 +5073,189 @@ msgstr "значення індексу relfilenumber не встановлен msgid "DROP INDEX CONCURRENTLY must be first action in transaction" msgstr "DROP INDEX CONCURRENTLY повинен бути першою дією в транзакції" -#: catalog/index.c:3670 +#: catalog/index.c:3668 #, c-format msgid "cannot reindex temporary tables of other sessions" msgstr "повторно індексувати тимчасові таблиці інших сеансів не можна" -#: catalog/index.c:3681 commands/indexcmds.c:3653 +#: catalog/index.c:3679 commands/indexcmds.c:3626 #, c-format msgid "cannot reindex invalid index on TOAST table" msgstr "переіндексувати неприпустимий індекс в таблиці TOAST не можна" -#: catalog/index.c:3697 commands/indexcmds.c:3531 commands/indexcmds.c:3677 -#: commands/tablecmds.c:3564 +#: 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:3834 +#: catalog/index.c:3832 #, c-format msgid "index \"%s\" was reindexed" msgstr "індекс \"%s\" був перебудований" -#: catalog/index.c:4000 +#: catalog/index.c:3998 #, c-format msgid "cannot reindex invalid index \"%s.%s\" on TOAST table, skipping" msgstr "переіндексувати неприпустимий індекс \"%s.%s\" в таблиці TOAST не можна, пропускається" -#: catalog/namespace.c:447 catalog/namespace.c:651 catalog/namespace.c:743 -#: commands/trigger.c:5731 +#: 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:504 +#: catalog/namespace.c:519 #, c-format msgid "temporary tables cannot specify a schema name" msgstr "для тимчасових таблиць ім'я схеми не вказується" -#: catalog/namespace.c:585 +#: catalog/namespace.c:600 #, 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 +#: 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:618 parser/parse_relation.c:1430 +#: catalog/namespace.c:633 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 +#: 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:689 catalog/namespace.c:3507 commands/extension.c:1607 +#: 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:841 catalog/namespace.c:854 +#: catalog/namespace.c:856 catalog/namespace.c:869 #, c-format msgid "cannot create relations in temporary schemas of other sessions" msgstr "неможливо створити відношення в тимчасових схемах з інших сеансів" -#: catalog/namespace.c:845 +#: catalog/namespace.c:860 #, c-format msgid "cannot create temporary relation in non-temporary schema" msgstr "неможливо створити тимчасове відношення в не тимчасовій схемі" -#: catalog/namespace.c:860 +#: catalog/namespace.c:875 #, c-format msgid "only temporary relations may be created in temporary schemas" msgstr "в тимчасових схемах можуть бути створені тільки тимчасові відношення" -#: catalog/namespace.c:2604 +#: catalog/namespace.c:2619 #, c-format msgid "statistics object \"%s\" does not exist" msgstr "об'єкт статистики \"%s\" не існує" -#: catalog/namespace.c:2746 +#: catalog/namespace.c:2761 #, c-format msgid "text search parser \"%s\" does not exist" msgstr "парсер текстового пошуку \"%s\" не існує" -#: catalog/namespace.c:2891 utils/adt/regproc.c:1459 +#: catalog/namespace.c:2906 utils/adt/regproc.c:1459 #, c-format msgid "text search dictionary \"%s\" does not exist" msgstr "словник текстового пошуку \"%s\" не існує" -#: catalog/namespace.c:3037 +#: catalog/namespace.c:3052 #, c-format msgid "text search template \"%s\" does not exist" msgstr "шаблон текстового пошуку \"%s\" не існує" -#: catalog/namespace.c:3182 commands/tsearchcmds.c:1168 +#: 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:3314 parser/parse_expr.c:868 parser/parse_target.c:1259 +#: 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:3320 parser/parse_expr.c:875 parser/parse_target.c:1266 +#: 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:3450 +#: catalog/namespace.c:3465 #, c-format msgid "cannot move objects into or out of temporary schemas" msgstr "не можна переміщати об'єкти в або з тимчасових схем" -#: catalog/namespace.c:3456 +#: catalog/namespace.c:3471 #, 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:1387 utils/adt/regproc.c:1688 +#: 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:3560 +#: catalog/namespace.c:3575 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "неправильне ім'я зв'язку (забагато компонентів): %s" -#: catalog/namespace.c:4001 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 "правило сортування \"%s\" для кодування \"%s\" не існує" -#: catalog/namespace.c:4056 +#: catalog/namespace.c:4071 #, c-format msgid "conversion \"%s\" does not exist" msgstr "перетворення\"%s\" не існує" -#: catalog/namespace.c:4397 +#: catalog/namespace.c:4412 #, c-format msgid "permission denied to create temporary tables in database \"%s\"" msgstr "немає дозволу для створення тимчасових таблиць в базі даних \"%s\"" -#: catalog/namespace.c:4413 +#: catalog/namespace.c:4428 #, c-format msgid "cannot create temporary tables during recovery" msgstr "не можна створити тимчасові таблиці під час відновлення" -#: catalog/namespace.c:4419 +#: catalog/namespace.c:4434 #, 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:2310 -#: commands/tablecmds.c:12823 +#: 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:1378 commands/tablecmds.c:269 -#: commands/tablecmds.c:17741 commands/view.c:114 +#: commands/tablecmds.c:17882 commands/view.c:114 #, c-format msgid "\"%s\" is not a view" msgstr "\"%s\" не є поданням" #: catalog/objectaddress.c:1385 commands/matview.c:199 commands/tablecmds.c:275 -#: commands/tablecmds.c:17746 +#: commands/tablecmds.c:17887 #, c-format msgid "\"%s\" is not a materialized view" msgstr "\"%s\" не є матеріалізованим поданням" #: catalog/objectaddress.c:1392 commands/tablecmds.c:293 -#: commands/tablecmds.c:17751 +#: commands/tablecmds.c:17892 #, c-format msgid "\"%s\" is not a foreign table" msgstr "\"%s\" не є сторонньою таблицею" @@ -5398,74 +5404,74 @@ msgid "unrecognized object type \"%s\"" msgstr "нерозпізнаний тип об'єкту \"%s\"" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:2903 +#: catalog/objectaddress.c:2928 #, c-format msgid "column %s of %s" msgstr "стовпець %s з %s" -#: catalog/objectaddress.c:2918 +#: catalog/objectaddress.c:2943 #, c-format msgid "function %s" msgstr "функція %s" -#: catalog/objectaddress.c:2931 +#: catalog/objectaddress.c:2956 #, c-format msgid "type %s" msgstr "тип %s" -#: catalog/objectaddress.c:2968 +#: catalog/objectaddress.c:2993 #, c-format msgid "cast from %s to %s" msgstr "приведення від %s до %s" -#: catalog/objectaddress.c:3001 +#: catalog/objectaddress.c:3026 #, c-format msgid "collation %s" msgstr "сортування %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3032 +#: catalog/objectaddress.c:3057 #, c-format msgid "constraint %s on %s" msgstr "обмеження %s на %s" -#: catalog/objectaddress.c:3038 +#: catalog/objectaddress.c:3063 #, c-format msgid "constraint %s" msgstr "обмеження %s" -#: catalog/objectaddress.c:3070 +#: catalog/objectaddress.c:3095 #, c-format msgid "conversion %s" msgstr "перетворення %s" #. translator: %s is typically "column %s of table %s" -#: catalog/objectaddress.c:3092 +#: catalog/objectaddress.c:3117 #, c-format msgid "default value for %s" msgstr "значення за замовчуванням для %s" -#: catalog/objectaddress.c:3103 +#: catalog/objectaddress.c:3128 #, c-format msgid "language %s" msgstr "мова %s" -#: catalog/objectaddress.c:3111 +#: catalog/objectaddress.c:3136 #, c-format msgid "large object %u" msgstr "великий об'єкт %u" -#: catalog/objectaddress.c:3124 +#: catalog/objectaddress.c:3149 #, c-format msgid "operator %s" msgstr "оператор %s" -#: catalog/objectaddress.c:3161 +#: catalog/objectaddress.c:3186 #, c-format msgid "operator class %s for access method %s" msgstr "клас операторів %s для методу доступу %s" -#: catalog/objectaddress.c:3189 +#: catalog/objectaddress.c:3214 #, c-format msgid "access method %s" msgstr "метод доступу %s" @@ -5474,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:3238 +#: catalog/objectaddress.c:3269 #, c-format msgid "operator %d (%s, %s) of %s: %s" msgstr "оператор %d (%s, %s) з %s: %s" @@ -5483,236 +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:3295 +#: 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:3347 +#: 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:3393 +#: catalog/objectaddress.c:3434 #, c-format msgid "trigger %s on %s" msgstr "тригер %s на %s" -#: catalog/objectaddress.c:3413 +#: catalog/objectaddress.c:3454 #, c-format msgid "schema %s" msgstr "схема %s" -#: catalog/objectaddress.c:3441 +#: catalog/objectaddress.c:3482 #, c-format msgid "statistics object %s" msgstr "об'єкт статистики %s" -#: catalog/objectaddress.c:3472 +#: catalog/objectaddress.c:3513 #, c-format msgid "text search parser %s" msgstr "парсер текстового пошуку %s" -#: catalog/objectaddress.c:3503 +#: catalog/objectaddress.c:3544 #, c-format msgid "text search dictionary %s" msgstr "словник текстового пошуку %s" -#: catalog/objectaddress.c:3534 +#: catalog/objectaddress.c:3575 #, c-format msgid "text search template %s" msgstr "шаблон текстового пошуку %s" -#: catalog/objectaddress.c:3565 +#: catalog/objectaddress.c:3606 #, c-format msgid "text search configuration %s" msgstr "конфігурація текстового пошуку %s" -#: catalog/objectaddress.c:3578 +#: catalog/objectaddress.c:3619 #, c-format msgid "role %s" msgstr "роль %s" -#: catalog/objectaddress.c:3615 catalog/objectaddress.c:5464 +#: catalog/objectaddress.c:3656 catalog/objectaddress.c:5505 #, c-format msgid "membership of role %s in role %s" msgstr "членство ролі %s в ролі %s" -#: catalog/objectaddress.c:3636 +#: catalog/objectaddress.c:3677 #, c-format msgid "database %s" msgstr "база даних %s" -#: catalog/objectaddress.c:3652 +#: catalog/objectaddress.c:3693 #, c-format msgid "tablespace %s" msgstr "табличний простір %s" -#: catalog/objectaddress.c:3663 +#: catalog/objectaddress.c:3704 #, c-format msgid "foreign-data wrapper %s" msgstr "джерело сторонніх даних %s" -#: catalog/objectaddress.c:3673 +#: catalog/objectaddress.c:3714 #, c-format msgid "server %s" msgstr "сервер %s" -#: catalog/objectaddress.c:3706 +#: catalog/objectaddress.c:3747 #, c-format msgid "user mapping for %s on server %s" msgstr "зіставлення користувача для %s на сервері %s" -#: catalog/objectaddress.c:3758 +#: 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:3762 +#: catalog/objectaddress.c:3803 #, c-format msgid "default privileges on new relations belonging to role %s" msgstr "права за замовчуванням для нових відношень, що належать ролі %s" -#: catalog/objectaddress.c:3768 +#: 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:3772 +#: catalog/objectaddress.c:3813 #, c-format msgid "default privileges on new sequences belonging to role %s" msgstr "права за замовчуванням для нових послідовностей, що належать ролі %s" -#: catalog/objectaddress.c:3778 +#: 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:3782 +#: catalog/objectaddress.c:3823 #, c-format msgid "default privileges on new functions belonging to role %s" msgstr "права за замовчуванням для нових функцій, що належать ролі %s" -#: catalog/objectaddress.c:3788 +#: 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:3792 +#: catalog/objectaddress.c:3833 #, c-format msgid "default privileges on new types belonging to role %s" msgstr "права за замовчуванням для нових типів, що належать ролі %s" -#: catalog/objectaddress.c:3798 +#: catalog/objectaddress.c:3839 #, c-format msgid "default privileges on new schemas belonging to role %s" msgstr "права за замовчуванням для нових схем, що належать ролі %s" -#: catalog/objectaddress.c:3805 +#: catalog/objectaddress.c:3846 #, c-format msgid "default privileges belonging to role %s in schema %s" msgstr "права за замовчуванням, що належать ролі %s в схемі %s" -#: catalog/objectaddress.c:3809 +#: catalog/objectaddress.c:3850 #, c-format msgid "default privileges belonging to role %s" msgstr "права за замовчуванням належать ролі %s" -#: catalog/objectaddress.c:3831 +#: catalog/objectaddress.c:3872 #, c-format msgid "extension %s" msgstr "розширення %s" -#: catalog/objectaddress.c:3848 +#: catalog/objectaddress.c:3889 #, c-format msgid "event trigger %s" msgstr "тригер подій %s" -#: catalog/objectaddress.c:3872 +#: catalog/objectaddress.c:3913 #, c-format msgid "parameter %s" msgstr "параметр %s" #. translator: second %s is, e.g., "table %s" -#: catalog/objectaddress.c:3915 +#: catalog/objectaddress.c:3956 #, c-format msgid "policy %s on %s" msgstr "політика %s на %s" -#: catalog/objectaddress.c:3929 +#: catalog/objectaddress.c:3970 #, c-format msgid "publication %s" msgstr "публікація %s" -#: catalog/objectaddress.c:3942 +#: 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:3973 +#: catalog/objectaddress.c:4014 #, c-format msgid "publication of %s in publication %s" msgstr "відношення публікації %s в публікації %s" -#: catalog/objectaddress.c:3986 +#: catalog/objectaddress.c:4027 #, c-format msgid "subscription %s" msgstr "підписка %s" -#: catalog/objectaddress.c:4007 +#: catalog/objectaddress.c:4048 #, c-format msgid "transform for %s language %s" msgstr "трансформація для %s мови %s" -#: catalog/objectaddress.c:4076 +#: catalog/objectaddress.c:4117 #, c-format msgid "table %s" msgstr "таблиця %s" -#: catalog/objectaddress.c:4081 +#: catalog/objectaddress.c:4122 #, c-format msgid "index %s" msgstr "індекс %s" -#: catalog/objectaddress.c:4085 +#: catalog/objectaddress.c:4126 #, c-format msgid "sequence %s" msgstr "послідовність %s" -#: catalog/objectaddress.c:4089 +#: catalog/objectaddress.c:4130 #, c-format msgid "toast table %s" msgstr "таблиця toast %s" -#: catalog/objectaddress.c:4093 +#: catalog/objectaddress.c:4134 #, c-format msgid "view %s" msgstr "подання %s" -#: catalog/objectaddress.c:4097 +#: catalog/objectaddress.c:4138 #, c-format msgid "materialized view %s" msgstr "матеріалізоване подання %s" -#: catalog/objectaddress.c:4101 +#: catalog/objectaddress.c:4142 #, c-format msgid "composite type %s" msgstr "складений тип %s" -#: catalog/objectaddress.c:4105 +#: catalog/objectaddress.c:4146 #, c-format msgid "foreign table %s" msgstr "зовнішня таблиця %s" -#: catalog/objectaddress.c:4110 +#: catalog/objectaddress.c:4151 #, c-format msgid "relation %s" msgstr "відношення %s" -#: catalog/objectaddress.c:4151 +#: catalog/objectaddress.c:4192 #, c-format msgid "operator family %s for access method %s" msgstr "сімейство операторів %s для методу доступу %s" @@ -5756,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:2992 +#: catalog/pg_aggregate.c:352 executor/nodeWindowAgg.c:2991 #, c-format msgid "strictness of aggregate's forward and inverse transition functions must match" msgstr "пряма й інвертована функції переходу агрегату повинні мати однакову суворість" @@ -6027,8 +6033,8 @@ msgstr "не можна відключити розділ \"%s\"" msgid "The partition is being detached concurrently or has an unfinished detach." msgstr "Розділ відключається одночасно або має незакінчене відключення." -#: catalog/pg_inherits.c:595 commands/tablecmds.c:4777 -#: commands/tablecmds.c:16050 +#: 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 щоб завершити очікувану операцію відключення." @@ -6422,7 +6428,7 @@ msgstr "Помилка під час створення багатодіапаз 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 +#: catalog/storage.c:533 storage/buffer/bufmgr.c:1540 #, c-format msgid "invalid page in block %u of relation %s" msgstr "неприпустима сторінка в блоці %u відношення %s" @@ -6517,86 +6523,86 @@ msgstr "параметр \"parallel\" має мати значення SAFE, RES 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 +#: commands/alter.c:83 commands/event_trigger.c:191 #, c-format msgid "event trigger \"%s\" already exists" msgstr "тригер подій \"%s\" вже існує" -#: commands/alter.c:85 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:88 commands/foreigncmds.c:884 +#: commands/alter.c:89 commands/foreigncmds.c:884 #, c-format msgid "server \"%s\" already exists" msgstr "сервер \"%s\" вже існує" -#: commands/alter.c:91 commands/proclang.c:131 +#: commands/alter.c:92 commands/proclang.c:131 #, c-format msgid "language \"%s\" already exists" msgstr "мова \"%s\" вже існує" -#: commands/alter.c:94 commands/publicationcmds.c:764 +#: commands/alter.c:95 commands/publicationcmds.c:764 #, c-format msgid "publication \"%s\" already exists" msgstr "публікація \"%s\" вже існує" -#: commands/alter.c:97 commands/subscriptioncmds.c:669 +#: commands/alter.c:98 commands/subscriptioncmds.c:669 #, c-format msgid "subscription \"%s\" already exists" msgstr "підписка \"%s\" вже існує" -#: commands/alter.c:120 +#: commands/alter.c:121 #, c-format msgid "conversion \"%s\" already exists in schema \"%s\"" msgstr "перетворення \"%s\" вже існує в схемі \"%s\"" -#: commands/alter.c:124 +#: commands/alter.c:125 #, c-format msgid "statistics object \"%s\" already exists in schema \"%s\"" msgstr "об'єкт статистики \"%s\" вже існує в схемі \"%s\"" -#: commands/alter.c:128 +#: commands/alter.c:129 #, c-format msgid "text search parser \"%s\" already exists in schema \"%s\"" msgstr "парсер текстового пошуку \"%s\" вже існує в схемі \"%s\"" -#: commands/alter.c:132 +#: commands/alter.c:133 #, c-format msgid "text search dictionary \"%s\" already exists in schema \"%s\"" msgstr "словник текстового пошуку \"%s\" вже існує в схемі \"%s\"" -#: commands/alter.c:136 +#: commands/alter.c:137 #, c-format msgid "text search template \"%s\" already exists in schema \"%s\"" msgstr "шаблон текстового пошуку \"%s\" вже існує в схемі \"%s\"" -#: commands/alter.c:140 +#: commands/alter.c:141 #, c-format msgid "text search configuration \"%s\" already exists in schema \"%s\"" msgstr "конфігурація текстового пошуку \"%s\" вже існує в схемі \"%s\"" -#: commands/alter.c:213 +#: commands/alter.c:214 #, c-format msgid "must be superuser to rename %s" msgstr "перейменувати %s може тільки суперкористувач" -#: commands/alter.c:255 commands/subscriptioncmds.c:648 +#: 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:256 commands/subscriptioncmds.c:649 +#: 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:734 +#: commands/alter.c:735 #, c-format msgid "must be superuser to set schema of %s" msgstr "встановити схему об'єкту %s може тільки суперкористувач" @@ -6616,8 +6622,8 @@ msgstr "Тільки суперкористувач може створити м msgid "access method \"%s\" already exists" msgstr "метод доступу \"%s\" вже існує" -#: commands/amcmds.c:154 commands/indexcmds.c:222 commands/indexcmds.c:842 -#: commands/opclasscmds.c:374 commands/opclasscmds.c:832 +#: 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\" не існує" @@ -6734,7 +6740,7 @@ msgstr "не можна кластеризувати тимчасові табл msgid "there is no previously clustered index for table \"%s\"" msgstr "немає попереднього кластеризованого індексу для таблиці \"%s\"" -#: commands/cluster.c:191 commands/tablecmds.c:14695 commands/tablecmds.c:16626 +#: 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\" не існує" @@ -6749,7 +6755,7 @@ msgstr "не можна кластеризувати спільний катал msgid "cannot vacuum temporary tables of other sessions" msgstr "не можна очищати тимчасові таблиці з інших сеансів" -#: commands/cluster.c:513 commands/tablecmds.c:16636 +#: commands/cluster.c:513 commands/tablecmds.c:16770 #, c-format msgid "\"%s\" is not an index for table \"%s\"" msgstr "\"%s\" не є індексом для таблиці \"%s\"" @@ -6812,11 +6818,11 @@ msgid "collation attribute \"%s\" not recognized" msgstr "атрибут collation \"%s\" не розпізнаний" #: commands/collationcmds.c:123 commands/collationcmds.c:129 -#: commands/define.c:388 commands/tablecmds.c:8106 -#: 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 +#: 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 @@ -6887,25 +6893,25 @@ 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:7882 commands/tablecmds.c:7892 -#: commands/tablecmds.c:7894 commands/tablecmds.c:14397 -#: commands/tablecmds.c:17774 commands/tablecmds.c:17795 +#: 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:2567 +#: commands/collationcmds.c:480 commands/dbcommands.c:2566 #, c-format msgid "changing version from %s to %s" msgstr "зміна версії з %s на %s" -#: commands/collationcmds.c:495 commands/dbcommands.c:2580 +#: commands/collationcmds.c:495 commands/dbcommands.c:2579 #, c-format msgid "version has not changed" msgstr "версію не змінено" -#: commands/collationcmds.c:528 commands/dbcommands.c:2746 +#: commands/collationcmds.c:528 commands/dbcommands.c:2749 #, c-format msgid "database with OID %u does not exist" msgstr "база даних з OID %u не існує" @@ -6925,12 +6931,12 @@ msgstr "імпортувати систмені правила сортуван msgid "no usable system locales were found" msgstr "придатні системні локалі не знайдені" -#: commands/comment.c:61 commands/dbcommands.c:1665 commands/dbcommands.c:1892 -#: commands/dbcommands.c:2002 commands/dbcommands.c:2200 -#: commands/dbcommands.c:2438 commands/dbcommands.c:2529 -#: commands/dbcommands.c:2650 commands/dbcommands.c:3158 -#: utils/init/postinit.c:1033 utils/init/postinit.c:1097 -#: utils/init/postinit.c:1170 +#: 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\" не існує" @@ -7037,8 +7043,8 @@ msgstr "%s потребує Boolean або \"відповідність\"" #. 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:796 -#: commands/copy.c:811 commands/copy.c:837 commands/copy.c:847 +#: 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" @@ -7065,7 +7071,7 @@ msgstr "аргументом функції \"%s\" повинен бути сп msgid "argument to option \"%s\" must be a valid encoding name" msgstr "аргументом функції \"%s\" повинне бути припустиме ім'я коду" -#: commands/copy.c:642 commands/dbcommands.c:866 commands/dbcommands.c:2386 +#: commands/copy.c:642 commands/dbcommands.c:866 commands/dbcommands.c:2381 #, c-format msgid "option \"%s\" not recognized" msgstr "параметр \"%s\" не розпізнано" @@ -7109,7 +7115,7 @@ msgstr "роздільник COPY не може бути \"%s\"" #. 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:790 commands/copy.c:804 +#: commands/copy.c:791 commands/copy.c:807 #, c-format msgid "COPY %s requires CSV mode" msgstr "Для COPY %s потрібен режим CSV" @@ -7130,35 +7136,35 @@ msgid "COPY escape must be a single one-byte character" msgstr "вихід для COPY повинен бути однобайтовим символом" #. translator: %s is the name of a COPY option, e.g. NULL -#: commands/copy.c:819 commands/copy.c:855 +#: commands/copy.c:823 commands/copy.c:859 #, c-format msgid "COPY delimiter character must not appear in the %s specification" msgstr "символ розділювача для COPY не повинен з'являтися в специфікації %s" #. translator: %s is the name of a COPY option, e.g. NULL -#: commands/copy.c:828 commands/copy.c:864 +#: commands/copy.c:832 commands/copy.c:868 #, c-format msgid "CSV quote character must not appear in the %s specification" msgstr "лапки CSV не повинні з'являтися у специфікації %s" -#: commands/copy.c:873 +#: commands/copy.c:877 #, c-format msgid "NULL specification and DEFAULT specification cannot be the same" msgstr "Специфікація NULL і специфікація DEFAULT не може співпадати" -#: commands/copy.c:935 +#: commands/copy.c:939 #, c-format msgid "column \"%s\" is a generated column" msgstr "стовпець \"%s\" є згенерованим стовпцем" -#: commands/copy.c:937 +#: commands/copy.c:941 #, c-format msgid "Generated columns cannot be used in COPY." msgstr "Згенеровані стовпці не можна використовувати в COPY." -#: commands/copy.c:952 commands/indexcmds.c:1917 commands/statscmds.c:239 -#: commands/tablecmds.c:2509 commands/tablecmds.c:2980 -#: commands/tablecmds.c:3788 parser/parse_relation.c:3692 +#: 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 @@ -7166,7 +7172,7 @@ msgstr "Згенеровані стовпці не можна використо msgid "column \"%s\" does not exist" msgstr "стовпця \"%s\" не існує" -#: commands/copy.c:959 commands/tablecmds.c:2535 commands/trigger.c:951 +#: 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" @@ -7253,7 +7259,7 @@ 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:597 +#: 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" @@ -7268,7 +7274,7 @@ msgstr "функції за замовчуванням перетворення 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:1755 commands/copyto.c:702 +#: commands/copyfrom.c:1755 commands/copyto.c:706 #, c-format msgid "\"%s\" is a directory" msgstr "\"%s\" - каталог" @@ -7518,7 +7524,7 @@ msgstr "умовні правила DO INSTEAD не підтримуються #: 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:483 @@ -7531,27 +7537,32 @@ msgstr "складові правила DO INSTEAD не підтримуютьс msgid "COPY (SELECT INTO) is not supported" msgstr "COPY (SELECT INTO) не підтримується" -#: commands/copyto.c:511 +#: 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:540 +#: commands/copyto.c:544 #, c-format msgid "relation referenced by COPY statement has changed" msgstr "відношення, згадане в операторі COPY, змінилось" -#: commands/copyto.c:667 +#: commands/copyto.c:671 #, c-format msgid "relative path not allowed for COPY to file" msgstr "при виконанні COPY в файл не можна вказувати відносний шлях" -#: commands/copyto.c:686 +#: commands/copyto.c:690 #, c-format msgid "could not open file \"%s\" for writing: %m" msgstr "не вдалося відкрити файл \"%s\" для запису: %m" -#: commands/copyto.c:689 +#: 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." @@ -7596,7 +7607,7 @@ msgstr "%s не є вірним ім'ям кодування" msgid "unrecognized locale provider: %s" msgstr "нерозпізнаний постачальник локалів: %s" -#: commands/dbcommands.c:944 commands/dbcommands.c:2419 commands/user.c:299 +#: commands/dbcommands.c:944 commands/dbcommands.c:2414 commands/user.c:299 #: commands/user.c:739 #, c-format msgid "invalid connection limit: %d" @@ -7617,8 +7628,8 @@ msgstr "шаблону бази даних \"%s\" не існує" msgid "cannot use invalid database \"%s\" as template" msgstr "не можна використовувати невірну базу даних \"%s\" в якості шаблону" -#: commands/dbcommands.c:1000 commands/dbcommands.c:2448 -#: utils/init/postinit.c:1112 +#: 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 для видалення невірних баз даних." @@ -7763,7 +7774,7 @@ msgstr "Шаблон бази даних було створено за допо 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:2048 +#: commands/dbcommands.c:1298 commands/dbcommands.c:2041 #, c-format msgid "pg_global cannot be used as default tablespace" msgstr "pg_global не можна використати в якості табличного простору за замовчуванням" @@ -7778,7 +7789,7 @@ msgstr "не вдалося призначити новий табличний msgid "There is a conflict because database \"%s\" already has some tables in this tablespace." msgstr "БД \"%s\" вже містить таблиці, що знаходяться в цьому табличному просторі." -#: commands/dbcommands.c:1356 commands/dbcommands.c:1921 +#: commands/dbcommands.c:1356 commands/dbcommands.c:1912 #, c-format msgid "database \"%s\" already exists" msgstr "база даних \"%s\" вже існує" @@ -7799,7 +7810,7 @@ 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 +#: utils/adt/pg_locale.c:2588 #, c-format msgid "encoding \"%s\" does not match locale \"%s\"" msgstr "кодування \"%s\" не відповідає локалі \"%s\"" @@ -7857,59 +7868,59 @@ msgstr[1] "Знайдено підписки %d." msgstr[2] "Знайдено підписок %d." msgstr[3] "Знайдено підписок %d." -#: commands/dbcommands.c:1754 commands/dbcommands.c:1943 -#: commands/dbcommands.c:2070 +#: 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:1903 +#: commands/dbcommands.c:1894 #, c-format msgid "permission denied to rename database" msgstr "немає дозволу для перейменування бази даних" -#: commands/dbcommands.c:1932 +#: commands/dbcommands.c:1923 #, c-format msgid "current database cannot be renamed" msgstr "поточна база даних не може бути перейменована" -#: commands/dbcommands.c:2026 +#: commands/dbcommands.c:2019 #, c-format msgid "cannot change the tablespace of the currently open database" msgstr "неможливо змінити табличний простір наразі відкритої бази даних" -#: commands/dbcommands.c:2132 +#: commands/dbcommands.c:2125 #, c-format msgid "some relations of database \"%s\" are already in tablespace \"%s\"" msgstr "деякі відношення бази даних \"%s\" вже є в табличному просторі \"%s\"" -#: commands/dbcommands.c:2134 +#: 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:2261 commands/dbcommands.c:2996 -#: commands/dbcommands.c:3296 commands/dbcommands.c:3409 +#: 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:2322 +#: commands/dbcommands.c:2317 #, c-format msgid "unrecognized DROP DATABASE option \"%s\"" msgstr "нерозпізнаний параметр DROP DATABASE \"%s\"" -#: commands/dbcommands.c:2400 +#: commands/dbcommands.c:2395 #, c-format msgid "option \"%s\" cannot be specified with other options" msgstr "параметр \"%s\" не може бути вказаним з іншими параметрами" -#: commands/dbcommands.c:2447 +#: commands/dbcommands.c:2443 #, c-format msgid "cannot alter invalid database \"%s\"" msgstr "неможливо змінити невірну базу даних \"%s\"" -#: commands/dbcommands.c:2464 +#: commands/dbcommands.c:2460 #, c-format msgid "cannot disallow connections for current database" msgstr "не можна заборонити з'єднання для поточної бази даних" @@ -7919,12 +7930,12 @@ msgstr "не можна заборонити з'єднання для поточ msgid "permission denied to change owner of database" msgstr "немає дозволу для зміни власника бази даних" -#: commands/dbcommands.c:3102 +#: 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:3105 +#: 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." @@ -7933,7 +7944,7 @@ msgstr[1] "Є %d інші сеанси з використанням цієї б msgstr[2] "Є %d інших сеансів з використанням цієї бази даних." msgstr[3] "Є %d інших сеансів з використанням цієї бази даних." -#: commands/dbcommands.c:3110 storage/ipc/procarray.c:3859 +#: 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." @@ -7942,12 +7953,12 @@ msgstr[1] "З цією базою даних пов'язані %d підгото msgstr[2] "З цією базою даних пов'язані %d підготовлених транзакцій." msgstr[3] "З цією базою даних пов'язані %d підготовлених транзакцій." -#: commands/dbcommands.c:3252 +#: commands/dbcommands.c:3255 #, c-format msgid "missing directory \"%s\"" msgstr "відсутній каталог \"%s\"" -#: commands/dbcommands.c:3310 commands/tablespace.c:184 +#: commands/dbcommands.c:3313 commands/tablespace.c:184 #: commands/tablespace.c:633 #, c-format msgid "could not stat directory \"%s\": %m" @@ -7991,7 +8002,7 @@ msgid "invalid argument for %s: \"%s\"" msgstr "невірний аргумент для %s: \"%s\"" #: commands/dropcmds.c:96 commands/functioncmds.c:1382 -#: utils/adt/ruleutils.c:2905 +#: utils/adt/ruleutils.c:2910 #, c-format msgid "\"%s\" is an aggregate function" msgstr "\"%s\" є функцією агрегату" @@ -8001,14 +8012,14 @@ msgstr "\"%s\" є функцією агрегату" msgid "Use DROP AGGREGATE to drop aggregate functions." msgstr "Використайте DROP AGGREGATE, щоб видалити агрегатні функції." -#: commands/dropcmds.c:153 commands/sequence.c:462 commands/tablecmds.c:3872 -#: commands/tablecmds.c:4030 commands/tablecmds.c:4082 -#: commands/tablecmds.c:17058 tcop/utility.c:1325 +#: 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:183 commands/dropcmds.c:282 commands/tablecmds.c:1392 +#: commands/dropcmds.c:183 commands/dropcmds.c:282 commands/tablecmds.c:1409 #, c-format msgid "schema \"%s\" does not exist, skipping" msgstr "схеми \"%s\" не існує, пропускаємо" @@ -8189,38 +8200,38 @@ msgstr "для %s тригери подій не підтримуються" 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 +#: 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:519 +#: commands/event_trigger.c:522 #, c-format msgid "event trigger with OID %u does not exist" msgstr "тригер подій %u з OID не існує" -#: commands/event_trigger.c:549 +#: commands/event_trigger.c:552 #, c-format msgid "permission denied to change owner of event trigger \"%s\"" msgstr "немає дозволу для зміни власника тригера подій \"%s\"" -#: commands/event_trigger.c:551 +#: commands/event_trigger.c:554 #, c-format msgid "The owner of an event trigger must be a superuser." msgstr "Власником тригеру подій може бути тільки суперкористувач." -#: commands/event_trigger.c:1411 +#: 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:1504 commands/event_trigger.c:1525 +#: 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:1938 +#: commands/event_trigger.c:1936 #, c-format msgid "%s can only be called in an event trigger function" msgstr "%s можливо викликати тільки в подієвій тригерній функції" @@ -9018,303 +9029,303 @@ msgstr[1] "процедурі неможливо передати більше % msgstr[2] "процедурі неможливо передати більше %d аргументів" msgstr[3] "процедурі неможливо передати більше %d аргументів" -#: commands/indexcmds.c:648 +#: commands/indexcmds.c:656 #, c-format msgid "must specify at least one column" msgstr "треба вказати хоча б один стовпець" -#: commands/indexcmds.c:652 +#: commands/indexcmds.c:660 #, c-format msgid "cannot use more than %d columns in an index" msgstr "не можна використовувати більше ніж %d стовпців в індексі" -#: commands/indexcmds.c:695 +#: commands/indexcmds.c:703 #, c-format msgid "cannot create index on relation \"%s\"" msgstr "створити індекс для відношення \"%s\" не можна" -#: commands/indexcmds.c:721 +#: commands/indexcmds.c:729 #, c-format msgid "cannot create index on partitioned table \"%s\" concurrently" msgstr "неможливо створити індекс в секційній таблиці \"%s\" паралельним способом" -#: commands/indexcmds.c:731 +#: commands/indexcmds.c:739 #, c-format msgid "cannot create indexes on temporary tables of other sessions" msgstr "неможливо створити індекси в тимчасових таблицях в інших сеансах" -#: commands/indexcmds.c:769 commands/tablecmds.c:801 commands/tablespace.c:1178 +#: 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:801 commands/tablecmds.c:832 commands/tablecmds.c:3571 +#: 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:834 +#: commands/indexcmds.c:842 #, c-format msgid "substituting access method \"gist\" for obsolete method \"rtree\"" msgstr "застарілий метод доступу \"rtree\" підміняється методом \"gist\"" -#: commands/indexcmds.c:855 +#: commands/indexcmds.c:863 #, c-format msgid "access method \"%s\" does not support unique indexes" msgstr "методу доступу \"%s\" не підтримує унікальні індекси" -#: commands/indexcmds.c:860 +#: commands/indexcmds.c:868 #, c-format msgid "access method \"%s\" does not support included columns" msgstr "методу доступу \"%s\" не підтримує включені стовпці" -#: commands/indexcmds.c:865 +#: commands/indexcmds.c:873 #, c-format msgid "access method \"%s\" does not support multicolumn indexes" msgstr "метод доступу \"%s\" не підтримує багатостовпцеві індекси" -#: commands/indexcmds.c:870 +#: commands/indexcmds.c:878 #, c-format msgid "access method \"%s\" does not support exclusion constraints" msgstr "метод доступу \"%s\" не підтримує обмеження-винятки" -#: commands/indexcmds.c:999 +#: commands/indexcmds.c:1007 #, c-format msgid "cannot match partition key to an index using access method \"%s\"" msgstr "не можна зіставити ключ розділу з індексом використовуючи метод доступу \"%s\"" -#: commands/indexcmds.c:1009 +#: commands/indexcmds.c:1017 #, c-format msgid "unsupported %s constraint with partition key definition" msgstr "непідтримуване обмеження \"%s\" з визначенням ключа секціонування" -#: commands/indexcmds.c:1011 +#: commands/indexcmds.c:1019 #, c-format msgid "%s constraints cannot be used when partition keys include expressions." msgstr "обмеження %s не можуть використовуватись, якщо ключі секціонування включають вирази." -#: commands/indexcmds.c:1061 +#: 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:1077 +#: commands/indexcmds.c:1085 #, c-format msgid "unique constraint on partitioned table must include all partitioning columns" msgstr "обмеження унікальності в секціонованій таблиці повинно включати всі стовпці секціонування" -#: commands/indexcmds.c:1078 +#: 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:1097 commands/indexcmds.c:1116 +#: commands/indexcmds.c:1105 commands/indexcmds.c:1124 #, c-format msgid "index creation on system columns is not supported" msgstr "створення індексу для системних стовпців не підтримується" -#: commands/indexcmds.c:1346 tcop/utility.c:1515 +#: commands/indexcmds.c:1354 tcop/utility.c:1515 #, c-format msgid "cannot create unique index on partitioned table \"%s\"" msgstr "не можна створити унікальний індекс в секціонованій таблиці \"%s\"" -#: commands/indexcmds.c:1348 tcop/utility.c:1517 +#: commands/indexcmds.c:1356 tcop/utility.c:1517 #, c-format msgid "Table \"%s\" contains partitions that are foreign tables." msgstr "Таблиця \"%s\" містить секції, які є зовнішніми таблицями." -#: commands/indexcmds.c:1833 +#: commands/indexcmds.c:1806 #, c-format msgid "functions in index predicate must be marked IMMUTABLE" msgstr "функції в предикаті індексу повинні бути позначені як IMMUTABLE" -#: commands/indexcmds.c:1912 parser/parse_utilcmd.c:2519 +#: 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:1936 parser/parse_utilcmd.c:1807 +#: commands/indexcmds.c:1909 parser/parse_utilcmd.c:1807 #, c-format msgid "expressions are not supported in included columns" msgstr "вирази не підтримуються у включених стовпцях " -#: commands/indexcmds.c:1977 +#: commands/indexcmds.c:1950 #, c-format msgid "functions in index expression must be marked IMMUTABLE" msgstr "функції в індексному виразі повинні бути позначені як IMMUTABLE" -#: commands/indexcmds.c:1992 +#: commands/indexcmds.c:1965 #, c-format msgid "including column does not support a collation" msgstr "включені стовпці не підтримують правила сортування" -#: commands/indexcmds.c:1996 +#: commands/indexcmds.c:1969 #, c-format msgid "including column does not support an operator class" msgstr "включені стовпці не підтримують класи операторів" -#: commands/indexcmds.c:2000 +#: commands/indexcmds.c:1973 #, c-format msgid "including column does not support ASC/DESC options" msgstr "включені стовпці не підтримують параметри ASC/DESC" -#: commands/indexcmds.c:2004 +#: commands/indexcmds.c:1977 #, c-format msgid "including column does not support NULLS FIRST/LAST options" msgstr "включені стовпці не підтримують параметри NULLS FIRST/LAST" -#: commands/indexcmds.c:2047 +#: commands/indexcmds.c:2020 #, c-format msgid "could not determine which collation to use for index expression" msgstr "не вдалося визначити, яке правило сортування використати для індексного виразу" -#: commands/indexcmds.c:2055 commands/tablecmds.c:18075 commands/typecmds.c:811 -#: parser/parse_expr.c:2785 parser/parse_type.c:568 parser/parse_utilcmd.c:3771 +#: 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:2122 +#: commands/indexcmds.c:2095 #, c-format msgid "operator %s is not commutative" msgstr "оператор %s не комутативний" -#: commands/indexcmds.c:2124 +#: commands/indexcmds.c:2097 #, c-format msgid "Only commutative operators can be used in exclusion constraints." msgstr "В обмеженнях-виключеннях можуть використовуватись лише комутативні оператори." -#: commands/indexcmds.c:2150 +#: commands/indexcmds.c:2123 #, c-format msgid "operator %s is not a member of operator family \"%s\"" msgstr "оператор %s не є членом сімейства операторів \"%s\"" -#: commands/indexcmds.c:2153 +#: 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:2188 +#: commands/indexcmds.c:2161 #, c-format msgid "access method \"%s\" does not support ASC/DESC options" msgstr "метод доступу \"%s\" не підтримує параметри ASC/DESC" -#: commands/indexcmds.c:2193 +#: 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:2237 commands/tablecmds.c:18100 -#: commands/tablecmds.c:18106 commands/typecmds.c:2311 +#: 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:2239 +#: 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:2268 commands/indexcmds.c:2276 -#: commands/opclasscmds.c:204 +#: 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:2290 commands/typecmds.c:2299 +#: 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:2380 +#: commands/indexcmds.c:2353 #, c-format msgid "there are multiple default operator classes for data type %s" msgstr "для типу даних %s є кілька класів операторів за замовчуванням" -#: commands/indexcmds.c:2708 +#: commands/indexcmds.c:2681 #, c-format msgid "unrecognized REINDEX option \"%s\"" msgstr "нерозпізнаний параметр REINDEX \"%s\"" -#: commands/indexcmds.c:2940 +#: commands/indexcmds.c:2913 #, c-format msgid "table \"%s\" has no indexes that can be reindexed concurrently" msgstr "таблиця \"%s\" не має індексів, які можна переіндексувати паралельно" -#: commands/indexcmds.c:2954 +#: commands/indexcmds.c:2927 #, c-format msgid "table \"%s\" has no indexes to reindex" msgstr "таблиця \"%s\" не має індексів для переіндексування" -#: commands/indexcmds.c:3001 commands/indexcmds.c:3512 -#: commands/indexcmds.c:3642 +#: commands/indexcmds.c:2974 commands/indexcmds.c:3485 +#: commands/indexcmds.c:3615 #, c-format msgid "cannot reindex system catalogs concurrently" msgstr "не можна конкурентно переіндексувати системні каталоги" -#: commands/indexcmds.c:3025 +#: commands/indexcmds.c:2998 #, c-format msgid "can only reindex the currently open database" msgstr "переіндексувати можна тільки наразі відкриту базу даних" -#: commands/indexcmds.c:3117 +#: commands/indexcmds.c:3090 #, c-format msgid "cannot reindex system catalogs concurrently, skipping all" msgstr "не можна конкурентно переіндексувати системні каталоги, пропускаємо" -#: commands/indexcmds.c:3150 +#: commands/indexcmds.c:3123 #, c-format msgid "cannot move system relations, skipping all" msgstr "не можна перемістити системні відношення, пропускаються усі" -#: commands/indexcmds.c:3196 +#: commands/indexcmds.c:3169 #, c-format msgid "while reindexing partitioned table \"%s.%s\"" msgstr "під час переіндексування секціонованої таблиці \"%s.%s\"" -#: commands/indexcmds.c:3199 +#: commands/indexcmds.c:3172 #, c-format msgid "while reindexing partitioned index \"%s.%s\"" msgstr "під час переіндексування секціонованого індексу \"%s.%s\"" -#: commands/indexcmds.c:3392 commands/indexcmds.c:4268 +#: commands/indexcmds.c:3365 commands/indexcmds.c:4241 #, c-format msgid "table \"%s.%s\" was reindexed" msgstr "таблиця \"%s.%s\" була переіндексована" -#: commands/indexcmds.c:3544 commands/indexcmds.c:3597 +#: commands/indexcmds.c:3517 commands/indexcmds.c:3570 #, c-format msgid "skipping reindex of invalid index \"%s.%s\"" msgstr "пропуск пере індексації недійсного індексу \"%s.%s\"" -#: commands/indexcmds.c:3547 commands/indexcmds.c:3600 +#: 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:3551 +#: commands/indexcmds.c:3524 #, c-format msgid "cannot reindex exclusion constraint index \"%s.%s\" concurrently, skipping" msgstr "неможливо переіндексувати індекс обмеження-виключення \"%s.%s\" паралельно, пропускається" -#: commands/indexcmds.c:3707 +#: commands/indexcmds.c:3680 #, c-format msgid "cannot reindex this type of relation concurrently" msgstr "неможливо переіндексувати цей тип відношень паралельон" -#: commands/indexcmds.c:3725 +#: commands/indexcmds.c:3698 #, c-format msgid "cannot move non-shared relation to tablespace \"%s\"" msgstr "не можна перемістити не спільне відношення до табличного простору \"%s\"" -#: commands/indexcmds.c:4249 commands/indexcmds.c:4261 +#: commands/indexcmds.c:4222 commands/indexcmds.c:4234 #, c-format msgid "index \"%s.%s\" was reindexed" msgstr "індекс \"%s.%s\" був перебудований" -#: commands/indexcmds.c:4251 commands/indexcmds.c:4270 +#: commands/indexcmds.c:4224 commands/indexcmds.c:4243 #, c-format msgid "%s." msgstr "%s." @@ -9354,224 +9365,224 @@ msgstr "нові дані для матеріалізованого поданн msgid "Row: %s" msgstr "Рядок: %s" -#: commands/opclasscmds.c:123 +#: commands/opclasscmds.c:124 #, c-format msgid "operator family \"%s\" does not exist for access method \"%s\"" msgstr "сімейство операторів \"%s\" не існує для методу доступу \"%s\"" -#: commands/opclasscmds.c:266 +#: commands/opclasscmds.c:267 #, c-format msgid "operator family \"%s\" for access method \"%s\" already exists" msgstr "сімейство операторів \"%s\" для методу доступу \"%s\" вже існує" -#: commands/opclasscmds.c:415 +#: commands/opclasscmds.c:416 #, c-format msgid "must be superuser to create an operator class" msgstr "тільки суперкористувач може створити клас операторів" -#: commands/opclasscmds.c:492 commands/opclasscmds.c:909 -#: commands/opclasscmds.c:1055 +#: 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:537 commands/opclasscmds.c:959 -#: commands/opclasscmds.c:1071 +#: 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:566 +#: commands/opclasscmds.c:567 #, c-format msgid "storage type specified more than once" msgstr "тип сховища вказано більше одного разу" -#: commands/opclasscmds.c:593 +#: commands/opclasscmds.c:594 #, c-format msgid "storage type cannot be different from data type for access method \"%s\"" msgstr "тип сховища не може відрізнятися від типу даних для методу доступу \"%s\"" -#: commands/opclasscmds.c:609 +#: commands/opclasscmds.c:610 #, c-format msgid "operator class \"%s\" for access method \"%s\" already exists" msgstr "клас операторів \"%s\" для методу доступу \"%s\" вже існує" -#: commands/opclasscmds.c:637 +#: commands/opclasscmds.c:638 #, c-format msgid "could not make operator class \"%s\" be default for type %s" msgstr "клас операторів \"%s\" не вдалося зробити класом за замовчуванням для типу %s" -#: commands/opclasscmds.c:640 +#: commands/opclasscmds.c:641 #, c-format msgid "Operator class \"%s\" already is the default." msgstr "Клас операторів \"%s\" вже є класом за замовчуванням." -#: commands/opclasscmds.c:800 +#: commands/opclasscmds.c:801 #, c-format msgid "must be superuser to create an operator family" msgstr "тільки суперкористувач може створити сімейство операторів" -#: commands/opclasscmds.c:860 +#: commands/opclasscmds.c:861 #, c-format msgid "must be superuser to alter an operator family" msgstr "тільки суперкористувач може змінити сімейство операторів" -#: commands/opclasscmds.c:918 +#: commands/opclasscmds.c:919 #, c-format msgid "operator argument types must be specified in ALTER OPERATOR FAMILY" msgstr "типи аргументу оператора повинні бути вказані в ALTER OPERATOR FAMILY" -#: commands/opclasscmds.c:993 +#: commands/opclasscmds.c:994 #, c-format msgid "STORAGE cannot be specified in ALTER OPERATOR FAMILY" msgstr "STORAGE не може бути вказано в ALTER OPERATOR FAMILY" -#: commands/opclasscmds.c:1127 +#: commands/opclasscmds.c:1128 #, c-format msgid "one or two argument types must be specified" msgstr "треба вказати один або два типи аргументу" -#: commands/opclasscmds.c:1153 +#: commands/opclasscmds.c:1154 #, c-format msgid "index operators must be binary" msgstr "індексні оператори повинні бути бінарними" -#: commands/opclasscmds.c:1172 +#: commands/opclasscmds.c:1173 #, c-format msgid "access method \"%s\" does not support ordering operators" msgstr "метод доступу \"%s\" не підтримує сортувальних операторів" -#: commands/opclasscmds.c:1183 +#: commands/opclasscmds.c:1184 #, c-format msgid "index search operators must return boolean" msgstr "оператори пошуку по індексу повинні повертати логічне значення" -#: commands/opclasscmds.c:1223 +#: 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:1230 +#: 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:1238 +#: commands/opclasscmds.c:1239 #, c-format msgid "invalid operator class options parsing function" msgstr "неприпустима функція розбору параметрів класів операторів" -#: commands/opclasscmds.c:1239 +#: commands/opclasscmds.c:1240 #, c-format msgid "Valid signature of operator class options parsing function is %s." msgstr "Допустимий підпис для функції розбору параметрів класів операторів: %s." -#: commands/opclasscmds.c:1258 +#: commands/opclasscmds.c:1259 #, c-format msgid "btree comparison functions must have two arguments" msgstr "функції порівняння btree повинні мати два аргумента" -#: commands/opclasscmds.c:1262 +#: commands/opclasscmds.c:1263 #, c-format msgid "btree comparison functions must return integer" msgstr "функції порівняння btree повинні повертати ціле число" -#: commands/opclasscmds.c:1279 +#: commands/opclasscmds.c:1280 #, c-format msgid "btree sort support functions must accept type \"internal\"" msgstr "опорні функції сортування btree повинні приймати тип \"internal\"" -#: commands/opclasscmds.c:1283 +#: commands/opclasscmds.c:1284 #, c-format msgid "btree sort support functions must return void" msgstr "опорні функції сортування btree повинні повертати недійсне (void)" -#: commands/opclasscmds.c:1294 +#: commands/opclasscmds.c:1295 #, c-format msgid "btree in_range functions must have five arguments" msgstr "функції in_range для btree повинні приймати п'ять аргументів" -#: commands/opclasscmds.c:1298 +#: commands/opclasscmds.c:1299 #, c-format msgid "btree in_range functions must return boolean" msgstr "функції in_range для btree повинні повертати логічне значення" -#: commands/opclasscmds.c:1314 +#: commands/opclasscmds.c:1315 #, c-format msgid "btree equal image functions must have one argument" msgstr "функції equal image для btree повинні приймати один аргумент" -#: commands/opclasscmds.c:1318 +#: commands/opclasscmds.c:1319 #, c-format msgid "btree equal image functions must return boolean" msgstr "функції equal image для btree повинні повертати логічне значення" -#: commands/opclasscmds.c:1331 +#: commands/opclasscmds.c:1332 #, c-format msgid "btree equal image functions must not be cross-type" msgstr "функції equal image для btree не можуть бути хрестоподібного типу" -#: commands/opclasscmds.c:1341 +#: commands/opclasscmds.c:1342 #, c-format msgid "hash function 1 must have one argument" msgstr "геш-функція 1 повинна приймати один аргумент" -#: commands/opclasscmds.c:1345 +#: commands/opclasscmds.c:1346 #, c-format msgid "hash function 1 must return integer" msgstr "геш-функція 1 повинна повертати ціле число" -#: commands/opclasscmds.c:1352 +#: commands/opclasscmds.c:1353 #, c-format msgid "hash function 2 must have two arguments" msgstr "геш-функція 2 повинна приймати два аргументи" -#: commands/opclasscmds.c:1356 +#: commands/opclasscmds.c:1357 #, c-format msgid "hash function 2 must return bigint" msgstr "геш-функція 2 повинна повертати велике ціле (bigint)" -#: commands/opclasscmds.c:1381 +#: commands/opclasscmds.c:1382 #, c-format msgid "associated data types must be specified for index support function" msgstr "для опорної функції індексів повинні бути вказані пов'язані типи даних" -#: commands/opclasscmds.c:1406 +#: commands/opclasscmds.c:1407 #, c-format msgid "function number %d for (%s,%s) appears more than once" msgstr "номер функції %d для (%s,%s) з'являється більш ніж один раз" -#: commands/opclasscmds.c:1413 +#: commands/opclasscmds.c:1414 #, c-format msgid "operator number %d for (%s,%s) appears more than once" msgstr "номер оператора %d для (%s,%s) з'являється більш ніж один раз" -#: commands/opclasscmds.c:1459 +#: 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:1565 +#: 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:1646 +#: 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:1686 +#: 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:1717 +#: 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:1740 +#: commands/opclasscmds.c:1838 #, c-format msgid "operator family \"%s\" for access method \"%s\" already exists in schema \"%s\"" msgstr "сімейство операторів \"%s\" для методу доступу \"%s\" вже існує в схемі \"%s\"" @@ -9644,10 +9655,10 @@ 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:1723 commands/tablecmds.c:2323 -#: commands/tablecmds.c:3682 commands/tablecmds.c:6582 -#: commands/tablecmds.c:9614 commands/tablecmds.c:17662 -#: commands/tablecmds.c:17697 commands/trigger.c:316 commands/trigger.c:1332 +#: 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 @@ -9746,7 +9757,7 @@ 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 +#: postmaster/postmaster.c:1210 utils/init/miscinit.c:1865 #, c-format msgid "invalid list syntax in parameter \"%s\"" msgstr "неприпустимий синтаксис списку в параметрі \"%s\"" @@ -10097,8 +10108,8 @@ msgstr "послідовність повинна бути в тій самій msgid "cannot change ownership of identity sequence" msgstr "змінити власника послідовності ідентифікації не можна" -#: commands/sequence.c:1671 commands/tablecmds.c:14384 -#: commands/tablecmds.c:17078 +#: 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\"." @@ -10168,12 +10179,12 @@ msgstr "дублювання імені стовпця у визначенні msgid "duplicate expression in statistics definition" msgstr "дублікат виразу у визначенні статистики" -#: commands/statscmds.c:628 commands/tablecmds.c:8597 +#: commands/statscmds.c:628 commands/tablecmds.c:8651 #, c-format msgid "statistics target %d is too low" msgstr "мета статистики занадто мала %d" -#: commands/statscmds.c:636 commands/tablecmds.c:8605 +#: commands/statscmds.c:636 commands/tablecmds.c:8659 #, c-format msgid "lowering statistics target to %d" msgstr "мета статистики знижується до %d" @@ -10188,7 +10199,7 @@ msgstr "об'єкт статистики \"%s.%s\" не існує, пропус msgid "unrecognized subscription parameter: \"%s\"" msgstr "нерозпізнаний параметр підписки: \"%s\"" -#: commands/subscriptioncmds.c:340 replication/pgoutput/pgoutput.c:397 +#: commands/subscriptioncmds.c:340 replication/pgoutput/pgoutput.c:404 #, c-format msgid "unrecognized origin value: \"%s\"" msgstr "нерозпізнане значення походження: \"%s\"" @@ -10238,7 +10249,7 @@ msgstr "Тільки ролі з правами \"%s\" можуть створю #: commands/subscriptioncmds.c:758 commands/subscriptioncmds.c:891 #: commands/subscriptioncmds.c:1524 replication/logical/tablesync.c:1345 -#: replication/logical/worker.c:4503 +#: replication/logical/worker.c:4514 #, c-format msgid "could not connect to the publisher: %s" msgstr "не вдалося підключитись до сервера публікації: %s" @@ -10345,17 +10356,17 @@ msgstr "не вдалося видалити слот реплікації \"%s\ msgid "subscription with OID %u does not exist" msgstr "підписки %u з OID не існує" -#: commands/subscriptioncmds.c:2076 commands/subscriptioncmds.c:2201 +#: 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:2112 +#: 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:2114 +#: 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." @@ -10364,49 +10375,49 @@ msgstr[1] "Створювана підписка підписується на msgstr[2] "Створювана підписка підписується на публікації (%s), яка містить таблиці, до яких записуються інші підписки." msgstr[3] "Створювана підписка підписується на публікації (%s), яка містить таблиці, до яких записуються інші підписки." -#: commands/subscriptioncmds.c:2117 +#: 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:2223 replication/logical/tablesync.c:906 -#: replication/pgoutput/pgoutput.c:1117 +#: 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:2273 +#: 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:2276 +#: commands/subscriptioncmds.c:2279 #, 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 +#: commands/subscriptioncmds.c:2310 #, c-format msgid "publication name \"%s\" used more than once" msgstr "ім'я публікації \"%s\" використовується більше ніж один раз" -#: commands/subscriptioncmds.c:2351 +#: commands/subscriptioncmds.c:2354 #, c-format msgid "publication \"%s\" is already in subscription \"%s\"" msgstr "публікація \"%s\" вже в підписці \"%s\"" -#: commands/subscriptioncmds.c:2365 +#: commands/subscriptioncmds.c:2368 #, c-format msgid "publication \"%s\" is not in subscription \"%s\"" msgstr "публікація \"%s\" не знаходиться в підписці \"%s\"" -#: commands/subscriptioncmds.c:2376 +#: commands/subscriptioncmds.c:2379 #, c-format msgid "cannot drop all the publications from a subscription" msgstr "не можна видалити всі публікації з підписки" -#: commands/subscriptioncmds.c:2433 +#: commands/subscriptioncmds.c:2436 #, c-format msgid "%s requires a Boolean value or \"parallel\"" msgstr "%s потребує логічне значення або \"parallel\"" @@ -10467,7 +10478,7 @@ msgstr "матеріалізоване подання \"%s\" не існує, п 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:19617 +#: 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" @@ -10491,8 +10502,8 @@ msgstr "\"%s\" не є типом" msgid "Use DROP TYPE to remove a type." msgstr "Використайте DROP TYPE, щоб видалити тип." -#: commands/tablecmds.c:291 commands/tablecmds.c:14223 -#: commands/tablecmds.c:16783 +#: commands/tablecmds.c:291 commands/tablecmds.c:14356 +#: commands/tablecmds.c:16917 #, c-format msgid "foreign table \"%s\" does not exist" msgstr "зовнішня таблиця \"%s\" не існує" @@ -10506,1412 +10517,1412 @@ msgstr "зовнішня таблиця \"%s\" не існує, пропуска msgid "Use DROP FOREIGN TABLE to remove a foreign table." msgstr "Використайте DROP FOREIGN TABLE щоб видалити сторонню таблицю." -#: commands/tablecmds.c:717 +#: commands/tablecmds.c:734 #, c-format msgid "ON COMMIT can only be used on temporary tables" msgstr "ON COMMIT можна використовувати лише для тимчасових таблиць" -#: commands/tablecmds.c:748 +#: commands/tablecmds.c:765 #, c-format msgid "cannot create temporary table within security-restricted operation" msgstr "неможливо створити тимчасову таблицю в межах операції з обмеженням безпеки" -#: commands/tablecmds.c:784 commands/tablecmds.c:15642 +#: 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:1050 +#: commands/tablecmds.c:1067 #, c-format msgid "\"%s\" is not partitioned" msgstr "\"%s\" не секціоновано" -#: commands/tablecmds.c:1144 +#: commands/tablecmds.c:1161 #, c-format msgid "cannot partition using more than %d columns" msgstr "число стовпців в ключі секціонування не може перевищувати %d" -#: commands/tablecmds.c:1200 +#: commands/tablecmds.c:1217 #, c-format msgid "cannot create foreign partition of partitioned table \"%s\"" msgstr "не можна створити зовнішню секцію в секціонованій таблиці \"%s\"" -#: commands/tablecmds.c:1202 +#: commands/tablecmds.c:1219 #, c-format msgid "Table \"%s\" contains indexes that are unique." msgstr "Таблиця \"%s\" містить індекси, які унікальні." -#: commands/tablecmds.c:1321 commands/tablecmds.c:13239 +#: commands/tablecmds.c:1338 commands/tablecmds.c:13372 #, c-format msgid "too many array dimensions" msgstr "занадто багато вимірів масиву" -#: commands/tablecmds.c:1326 parser/parse_clause.c:774 +#: 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:1472 +#: commands/tablecmds.c:1489 #, c-format msgid "DROP INDEX CONCURRENTLY does not support dropping multiple objects" msgstr "DROP INDEX CONCURRENTLY не підтримує видалення кількох об'єктів" -#: commands/tablecmds.c:1476 +#: commands/tablecmds.c:1493 #, c-format msgid "DROP INDEX CONCURRENTLY does not support CASCADE" msgstr "DROP INDEX CONCURRENTLY не підтримує режим CASCADE" -#: commands/tablecmds.c:1580 +#: commands/tablecmds.c:1597 #, c-format msgid "cannot drop partitioned index \"%s\" concurrently" msgstr "неможливо видалити секціонований індекс \"%s\" паралельно" -#: commands/tablecmds.c:1868 +#: commands/tablecmds.c:1885 #, c-format msgid "cannot truncate only a partitioned table" msgstr "скоротити тільки секціоновану таблицю не можна" -#: commands/tablecmds.c:1869 +#: 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:1942 +#: commands/tablecmds.c:1959 #, c-format msgid "truncate cascades to table \"%s\"" msgstr "скорочення поширюється на таблицю \"%s\"" -#: commands/tablecmds.c:2303 +#: commands/tablecmds.c:2320 #, c-format msgid "cannot truncate foreign table \"%s\"" msgstr "скоротити зовнішню таблицю \"%s\" не можна" -#: commands/tablecmds.c:2360 +#: commands/tablecmds.c:2377 #, c-format msgid "cannot truncate temporary tables of other sessions" msgstr "тимчасові таблиці інших сеансів не можна скоротити" -#: commands/tablecmds.c:2589 commands/tablecmds.c:15539 +#: commands/tablecmds.c:2606 commands/tablecmds.c:15673 #, c-format msgid "cannot inherit from partitioned table \"%s\"" msgstr "успадкування від секціонованої таблиці \"%s\" не допускається" -#: commands/tablecmds.c:2594 +#: commands/tablecmds.c:2611 #, c-format msgid "cannot inherit from partition \"%s\"" msgstr "успадкування від розділу \"%s\" не допускається" -#: commands/tablecmds.c:2602 parser/parse_utilcmd.c:2481 +#: 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:2614 +#: commands/tablecmds.c:2631 #, c-format msgid "cannot create a temporary relation as partition of permanent relation \"%s\"" msgstr "створити тимчасове відношення як секцію постійного відношення\"%s\" не можна" -#: commands/tablecmds.c:2623 commands/tablecmds.c:15518 +#: commands/tablecmds.c:2640 commands/tablecmds.c:15652 #, c-format msgid "cannot inherit from temporary relation \"%s\"" msgstr "тимчасове відношення \"%s\" не може успадковуватись" -#: commands/tablecmds.c:2633 commands/tablecmds.c:15526 +#: commands/tablecmds.c:2650 commands/tablecmds.c:15660 #, c-format msgid "cannot inherit from temporary relation of another session" msgstr "успадкування від тимчасового відношення іншого сеансу неможливе" -#: commands/tablecmds.c:2774 commands/tablecmds.c:2828 -#: commands/tablecmds.c:12922 parser/parse_utilcmd.c:1265 +#: 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 "cannot convert whole-row table reference" msgstr "перетворити посилання на тип усього рядка таблиці не можна" -#: commands/tablecmds.c:2775 parser/parse_utilcmd.c:1266 +#: commands/tablecmds.c:2792 parser/parse_utilcmd.c:1266 #, c-format msgid "Generation expression for column \"%s\" contains a whole-row reference to table \"%s\"." msgstr "Вираз генерації для стовпця \"%s\" містить посилання на весь рядок на таблицю \"%s\"." -#: commands/tablecmds.c:2829 parser/parse_utilcmd.c:1309 +#: commands/tablecmds.c:2846 parser/parse_utilcmd.c:1309 #, c-format msgid "Constraint \"%s\" contains a whole-row reference to table \"%s\"." msgstr "Обмеження \"%s\" посилається на тип усього рядка в таблиці \"%s\"." -#: commands/tablecmds.c:2939 commands/tablecmds.c:3210 +#: commands/tablecmds.c:2956 commands/tablecmds.c:3227 #, c-format msgid "column \"%s\" inherits from generated column but specifies default" msgstr "стовпець \"%s\" успадковується із згенерованого стовпця, але вказує за замовчуванням" -#: commands/tablecmds.c:2944 commands/tablecmds.c:3215 +#: commands/tablecmds.c:2961 commands/tablecmds.c:3232 #, c-format msgid "column \"%s\" inherits from generated column but specifies identity" msgstr "стовпець \"%s\" успадковується із згенерованого стовпця, але вказує ідентичність" -#: commands/tablecmds.c:2952 commands/tablecmds.c:3223 +#: commands/tablecmds.c:2969 commands/tablecmds.c:3240 #, c-format msgid "child column \"%s\" specifies generation expression" msgstr "дочірній стовпець \"%s\" визначає вираз генерації" -#: commands/tablecmds.c:2954 commands/tablecmds.c:3225 +#: commands/tablecmds.c:2971 commands/tablecmds.c:3242 #, c-format msgid "A child table column cannot be generated unless its parent column is." msgstr "Стовпець дочірньої таблиці не може бути створений, якщо не створено стовпець батьківської таблиці." -#: commands/tablecmds.c:3000 +#: commands/tablecmds.c:3017 #, c-format msgid "column \"%s\" inherits conflicting generation expressions" msgstr "стовпець \"%s\" успадковує конфліктуючи вирази генерації" -#: commands/tablecmds.c:3002 +#: commands/tablecmds.c:3019 #, c-format msgid "To resolve the conflict, specify a generation expression explicitly." msgstr "Щоб вирішити цей конфлікт, явно вкажіть вираз генерації." -#: commands/tablecmds.c:3006 +#: commands/tablecmds.c:3023 #, c-format msgid "column \"%s\" inherits conflicting default values" msgstr "стовпець \"%s\" успадковує конфліктні значення за замовчуванням" -#: commands/tablecmds.c:3008 +#: commands/tablecmds.c:3025 #, c-format msgid "To resolve the conflict, specify a default explicitly." msgstr "Для усунення конфлікту вкажіть бажане значення за замовчуванням." -#: commands/tablecmds.c:3063 +#: commands/tablecmds.c:3080 #, c-format msgid "check constraint name \"%s\" appears multiple times but with different expressions" msgstr "ім'я перевірочного обмеження \"%s\" з'являється декілька разів, але з різними виразами" -#: commands/tablecmds.c:3114 +#: commands/tablecmds.c:3131 #, c-format msgid "merging column \"%s\" with inherited definition" msgstr "злиття стовпця \"%s\" з успадкованим визначенням" -#: commands/tablecmds.c:3118 +#: commands/tablecmds.c:3135 #, c-format msgid "moving and merging column \"%s\" with inherited definition" msgstr "переміщення і злиття стовпця \"%s\" з успадкованим визначенням" -#: commands/tablecmds.c:3119 +#: commands/tablecmds.c:3136 #, c-format msgid "User-specified column moved to the position of the inherited column." msgstr "Визначений користувачем стовпець переміщений в позицію успадкованого стовпця." -#: commands/tablecmds.c:3131 +#: commands/tablecmds.c:3148 #, c-format msgid "column \"%s\" has a type conflict" msgstr "конфлікт типів в стовпці \"%s\"" -#: commands/tablecmds.c:3133 commands/tablecmds.c:3167 -#: commands/tablecmds.c:3183 commands/tablecmds.c:3290 -#: commands/tablecmds.c:3323 commands/tablecmds.c:3339 -#: 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 +#: 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 проти %s" -#: commands/tablecmds.c:3145 +#: commands/tablecmds.c:3162 #, c-format msgid "column \"%s\" has a collation conflict" msgstr "конфлікт правил сортування в стовпці \"%s\"" -#: commands/tablecmds.c:3147 commands/tablecmds.c:3309 -#: commands/tablecmds.c:7057 +#: commands/tablecmds.c:3164 commands/tablecmds.c:3326 +#: commands/tablecmds.c:7080 #, c-format msgid "\"%s\" versus \"%s\"" msgstr "\"%s\" проти \"%s\"" -#: commands/tablecmds.c:3165 +#: commands/tablecmds.c:3182 #, c-format msgid "column \"%s\" has a storage parameter conflict" msgstr "конфлікт параметрів зберігання в стовпці \"%s\"" -#: commands/tablecmds.c:3181 commands/tablecmds.c:3337 +#: commands/tablecmds.c:3198 commands/tablecmds.c:3354 #, c-format msgid "column \"%s\" has a compression method conflict" msgstr "конфлікт методів стиснення в стовпці \"%s\"" -#: commands/tablecmds.c:3276 +#: commands/tablecmds.c:3293 #, c-format msgid "merging multiple inherited definitions of column \"%s\"" msgstr "злиття декількох успадкованих визначень стовпця \"%s\"" -#: commands/tablecmds.c:3288 +#: commands/tablecmds.c:3305 #, c-format msgid "inherited column \"%s\" has a type conflict" msgstr "конфлікт типів в успадкованому стовпці \"%s\"" -#: commands/tablecmds.c:3307 +#: commands/tablecmds.c:3324 #, c-format msgid "inherited column \"%s\" has a collation conflict" msgstr "конфлікт правил сортування в успадкованому стовпці \"%s\"" -#: commands/tablecmds.c:3321 +#: commands/tablecmds.c:3338 #, c-format msgid "inherited column \"%s\" has a storage parameter conflict" msgstr "конфлікт параметрів зберігання в успадкованому стовпці \"%s\"" -#: commands/tablecmds.c:3349 +#: commands/tablecmds.c:3366 #, c-format msgid "inherited column \"%s\" has a generation conflict" msgstr "конфлікт генерування в успадкованому стовпці \"%s\"" -#: commands/tablecmds.c:3580 +#: commands/tablecmds.c:3597 #, c-format msgid "cannot move temporary tables of other sessions" msgstr "переміщувати тимчасові таблиці інших сеансів не можна" -#: commands/tablecmds.c:3650 +#: commands/tablecmds.c:3670 #, c-format msgid "cannot rename column of typed table" msgstr "перейменувати стовпець типізованої таблиці не можна" -#: commands/tablecmds.c:3669 +#: commands/tablecmds.c:3689 #, c-format msgid "cannot rename columns of relation \"%s\"" msgstr "перейменувати стовпці відношення %s не можна" -#: commands/tablecmds.c:3764 +#: commands/tablecmds.c:3784 #, c-format msgid "inherited column \"%s\" must be renamed in child tables too" msgstr "успадкований стовпець \"%s\" повинен бути перейменований в дочірніх таблицях також" -#: commands/tablecmds.c:3796 +#: commands/tablecmds.c:3816 #, c-format msgid "cannot rename system column \"%s\"" msgstr "не можна перейменувати системний стовпець \"%s\"" -#: commands/tablecmds.c:3811 +#: commands/tablecmds.c:3831 #, c-format msgid "cannot rename inherited column \"%s\"" msgstr "не можна перейменувати успадкований стовпець \"%s\"" -#: commands/tablecmds.c:3963 +#: commands/tablecmds.c:3983 #, c-format msgid "inherited constraint \"%s\" must be renamed in child tables too" msgstr "успадковане обмеження \"%s\" повинно бути перейменовано в дочірніх таблицях також" -#: commands/tablecmds.c:3970 +#: 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:4267 +#: 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:4276 +#: commands/tablecmds.c:4299 #, c-format msgid "cannot %s \"%s\" because it has pending trigger events" msgstr "не можна виконати %s \"%s\", тому що з цим об'єктом зв'язані очікуванні події тригерів" -#: commands/tablecmds.c:4302 +#: commands/tablecmds.c:4325 #, c-format msgid "cannot alter temporary tables of other sessions" msgstr "не можна змінювати тимчасові таблиці з інших сеансів" -#: commands/tablecmds.c:4775 +#: commands/tablecmds.c:4798 #, c-format msgid "cannot alter partition \"%s\" with an incomplete detach" msgstr "не можна змінити розділ \"%s\" з неповним відключенням" -#: commands/tablecmds.c:4979 commands/tablecmds.c:4994 +#: commands/tablecmds.c:5002 commands/tablecmds.c:5017 #, c-format msgid "cannot change persistence setting twice" msgstr "неможливо двічі змінити параметр стійкості" -#: commands/tablecmds.c:5015 +#: commands/tablecmds.c:5038 #, c-format msgid "cannot have multiple SET ACCESS METHOD subcommands" msgstr "неможливо мати декілька підкоманд SET ACCESS METHOD" -#: commands/tablecmds.c:5745 +#: commands/tablecmds.c:5768 #, c-format msgid "cannot rewrite system relation \"%s\"" msgstr "перезаписати системне відношення \"%s\" не можна" -#: commands/tablecmds.c:5751 +#: commands/tablecmds.c:5774 #, c-format msgid "cannot rewrite table \"%s\" used as a catalog table" msgstr "перезаписати таблицю \"%s\", що використовується як таблиця каталогу, не можна" -#: commands/tablecmds.c:5763 +#: commands/tablecmds.c:5786 #, c-format msgid "cannot rewrite temporary tables of other sessions" msgstr "неможливо перезаписати тимчасові таблиці інших сеансів" -#: commands/tablecmds.c:6258 +#: commands/tablecmds.c:6281 #, c-format msgid "column \"%s\" of relation \"%s\" contains null values" msgstr "стовпець \"%s\" відношення \"%s\" містить null значення" -#: commands/tablecmds.c:6275 +#: commands/tablecmds.c:6298 #, c-format msgid "check constraint \"%s\" of relation \"%s\" is violated by some row" msgstr "перевірка обмеження \"%s\" відношення \"%s\" порушується деяким рядком" -#: commands/tablecmds.c:6294 partitioning/partbounds.c:3387 +#: 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:6300 +#: 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:6565 +#: commands/tablecmds.c:6588 #, c-format msgid "ALTER action %s cannot be performed on relation \"%s\"" msgstr "Дію ALTER %s не можна виконати на відношенні \"%s\"" -#: commands/tablecmds.c:6820 commands/tablecmds.c:6827 +#: 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:6834 +#: 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:6841 +#: 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:6897 +#: 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:6899 +#: commands/tablecmds.c:6922 #, c-format msgid "Use ALTER ... CASCADE to alter the typed tables too." msgstr "Щоб змінити типізовані таблиці, використайте також ALTER ... CASCADE." -#: commands/tablecmds.c:6945 +#: commands/tablecmds.c:6968 #, c-format msgid "type %s is not a composite type" msgstr "тип %s не є складеним" -#: commands/tablecmds.c:6972 +#: commands/tablecmds.c:6995 #, c-format msgid "cannot add column to typed table" msgstr "неможливо додати стовпець до типізованої таблиці" -#: commands/tablecmds.c:7020 +#: commands/tablecmds.c:7043 #, c-format msgid "cannot add column to a partition" msgstr "неможливо додати стовпець до розділу" -#: commands/tablecmds.c:7049 commands/tablecmds.c:15757 +#: 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:7055 commands/tablecmds.c:15763 +#: 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:7073 +#: commands/tablecmds.c:7096 #, c-format msgid "merging definition of column \"%s\" for child \"%s\"" msgstr "об'єднання визначення стовпця \"%s\" для нащадка \"%s\"" -#: commands/tablecmds.c:7126 +#: commands/tablecmds.c:7149 #, c-format msgid "cannot recursively add identity column to table that has child tables" msgstr "неможливо додати стовпець ідентифікації в таблицю, яка має дочірні таблиці" -#: commands/tablecmds.c:7339 +#: commands/tablecmds.c:7393 #, c-format msgid "column must be added to child tables too" msgstr "стовпець також повинен бути доданий до дочірніх таблиць" -#: commands/tablecmds.c:7417 +#: commands/tablecmds.c:7471 #, c-format msgid "column \"%s\" of relation \"%s\" already exists, skipping" msgstr "стовпець \"%s\" відношення \"%s\" вже існує, пропускається" -#: commands/tablecmds.c:7424 +#: commands/tablecmds.c:7478 #, c-format msgid "column \"%s\" of relation \"%s\" already exists" msgstr "стовпець \"%s\" відношення \"%s\" вже існує" -#: commands/tablecmds.c:7490 commands/tablecmds.c:12550 +#: 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:7491 commands/tablecmds.c:7805 -#: commands/tablecmds.c:7983 commands/tablecmds.c:8090 -#: commands/tablecmds.c:8207 commands/tablecmds.c:9026 -#: commands/tablecmds.c:12551 +#: 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:7527 commands/tablecmds.c:7731 -#: commands/tablecmds.c:7873 commands/tablecmds.c:8005 -#: commands/tablecmds.c:8134 commands/tablecmds.c:8228 -#: commands/tablecmds.c:8329 commands/tablecmds.c:8486 -#: commands/tablecmds.c:8639 commands/tablecmds.c:8720 -#: commands/tablecmds.c:8854 commands/tablecmds.c:12704 -#: commands/tablecmds.c:14246 commands/tablecmds.c:16872 +#: 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:7533 commands/tablecmds.c:7879 +#: 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:7574 +#: commands/tablecmds.c:7628 #, c-format msgid "column \"%s\" is in a primary key" msgstr "стовпець \"%s\" входить до первинного ключа" -#: commands/tablecmds.c:7579 +#: commands/tablecmds.c:7633 #, c-format msgid "column \"%s\" is in index used as replica identity" msgstr "стовпець \"%s\" в індексі, що використовується як ідентифікація репліки" -#: commands/tablecmds.c:7602 +#: commands/tablecmds.c:7656 #, c-format msgid "column \"%s\" is marked NOT NULL in parent table" msgstr "стовпець \"%s\" в батьківській таблиці позначений як NOT NULL" -#: commands/tablecmds.c:7802 commands/tablecmds.c:9510 +#: commands/tablecmds.c:7856 commands/tablecmds.c:9564 #, c-format msgid "constraint must be added to child tables too" msgstr "обмеження повинно бути додано у дочірні таблиці також" -#: commands/tablecmds.c:7803 +#: 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:7888 +#: commands/tablecmds.c:7942 #, c-format msgid "column \"%s\" of relation \"%s\" is a generated column" msgstr "стовпець \"%s\" відношення \"%s\" є згенерованим стовпцем" -#: commands/tablecmds.c:7982 +#: commands/tablecmds.c:8036 #, c-format msgid "cannot add identity to a column of only the partitioned table" msgstr "не може додати ідентифікатор до стовпця лише розділеної таблиці" -#: commands/tablecmds.c:7988 +#: commands/tablecmds.c:8042 #, c-format msgid "cannot add identity to a column of a partition" msgstr "не може додати ідентифікатор до стовпця розділу" -#: commands/tablecmds.c:8016 +#: 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:8022 +#: commands/tablecmds.c:8076 #, c-format msgid "column \"%s\" of relation \"%s\" is already an identity column" msgstr "стовпець \"%s\" відношення \"%s\" вже є стовпцем ідентифікації" -#: commands/tablecmds.c:8028 +#: commands/tablecmds.c:8082 #, c-format msgid "column \"%s\" of relation \"%s\" already has a default value" msgstr "стовпець \"%s\" відношення \"%s\" вже має значення за замовчуванням" -#: commands/tablecmds.c:8089 +#: commands/tablecmds.c:8143 #, c-format msgid "cannot change identity column of only the partitioned table" msgstr "не можна змінювати стовпець ідентичності лише в розбитій на розділи таблиці" -#: commands/tablecmds.c:8095 +#: commands/tablecmds.c:8149 #, c-format msgid "cannot change identity column of a partition" msgstr "не можна змінити стовпець ідентичності розділу" -#: commands/tablecmds.c:8140 commands/tablecmds.c:8236 +#: 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:8206 +#: commands/tablecmds.c:8260 #, c-format msgid "cannot drop identity from a column of only the partitioned table" msgstr "не можна вилучити ідентифікатор зі стовпця лише розбитої на розділи таблиці" -#: commands/tablecmds.c:8212 +#: commands/tablecmds.c:8266 #, c-format msgid "cannot drop identity from a column of a partition" msgstr "не можна вилучити ідентифікатор зі стовпця розділу" -#: commands/tablecmds.c:8241 +#: commands/tablecmds.c:8295 #, c-format msgid "column \"%s\" of relation \"%s\" is not an identity column, skipping" msgstr "стовпець \"%s\" відношення \"%s\" не є стовпцем ідентифікації, пропускається" -#: commands/tablecmds.c:8335 +#: commands/tablecmds.c:8389 #, c-format msgid "column \"%s\" of relation \"%s\" is not a generated column" msgstr "стовпець \"%s\" відношення \"%s\" не є згенерованим стовпцем" -#: commands/tablecmds.c:8433 +#: 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:8455 +#: commands/tablecmds.c:8509 #, c-format msgid "cannot drop generation expression from inherited column" msgstr "не можна видалити вираз генерації з успадкованого стовпця" -#: commands/tablecmds.c:8494 +#: commands/tablecmds.c:8548 #, c-format msgid "column \"%s\" of relation \"%s\" is not a stored generated column" msgstr "стовпець \"%s\" відношення \"%s\" не є збереженим згенерованим стовпцем" -#: commands/tablecmds.c:8499 +#: 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:8577 +#: commands/tablecmds.c:8631 #, c-format msgid "cannot refer to non-index column by number" msgstr "не можна посилатись на неіндексований стовпець за номером" -#: commands/tablecmds.c:8629 +#: commands/tablecmds.c:8683 #, c-format msgid "column number %d of relation \"%s\" does not exist" msgstr "стовпець з номером %d відношення %s не існує" -#: commands/tablecmds.c:8648 +#: commands/tablecmds.c:8702 #, c-format msgid "cannot alter statistics on included column \"%s\" of index \"%s\"" msgstr "змінити статистику включеного стовпця \"%s\" індексу \"%s\" не можна" -#: commands/tablecmds.c:8653 +#: commands/tablecmds.c:8707 #, c-format msgid "cannot alter statistics on non-expression column \"%s\" of index \"%s\"" msgstr "змінити статистику невираженого стовпця \"%s\" індексу \"%s\" не можна" -#: commands/tablecmds.c:8655 +#: commands/tablecmds.c:8709 #, c-format msgid "Alter statistics on table column instead." msgstr "Замість цього змініть статистику стовпця в таблиці." -#: commands/tablecmds.c:8901 +#: commands/tablecmds.c:8955 #, c-format msgid "cannot drop column from typed table" msgstr "не можна видалити стовпець з типізованої таблиці" -#: commands/tablecmds.c:8964 +#: commands/tablecmds.c:9018 #, c-format msgid "column \"%s\" of relation \"%s\" does not exist, skipping" msgstr "стовпець \"%s\" відношення \"%s\" не існує, пропускається" -#: commands/tablecmds.c:8977 +#: commands/tablecmds.c:9031 #, c-format msgid "cannot drop system column \"%s\"" msgstr "не можна видалити системний стовпець \"%s\"" -#: commands/tablecmds.c:8987 +#: commands/tablecmds.c:9041 #, c-format msgid "cannot drop inherited column \"%s\"" msgstr "не можна видалити успадкований стовпець \"%s\"" -#: commands/tablecmds.c:9000 +#: 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:9025 +#: commands/tablecmds.c:9079 #, c-format msgid "cannot drop column from only the partitioned table when partitions exist" msgstr "видалити стовпець тільки з секціонованої таблиці, коли існують секції, не можна" -#: commands/tablecmds.c:9230 +#: 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:9255 +#: 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:9592 +#: 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:9598 +#: 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:9601 +#: commands/tablecmds.c:9655 #, c-format msgid "This feature is not yet supported on partitioned tables." msgstr "Ця функція ще не підтримується з секціонованими таблицями." -#: commands/tablecmds.c:9608 commands/tablecmds.c:10064 +#: commands/tablecmds.c:9662 commands/tablecmds.c:10123 #, c-format msgid "referenced relation \"%s\" is not a table" msgstr "вказане відношення \"%s\" не є таблицею" -#: commands/tablecmds.c:9631 +#: commands/tablecmds.c:9685 #, c-format msgid "constraints on permanent tables may reference only permanent tables" msgstr "обмеження в постійних таблицях можуть посилатись лише на постійні таблиці" -#: commands/tablecmds.c:9638 +#: commands/tablecmds.c:9692 #, c-format msgid "constraints on unlogged tables may reference only permanent or unlogged tables" msgstr "обмеження в нежурнальованих таблицях можуть посилатись тільки на постійні або нежурналюємі таблиці" -#: commands/tablecmds.c:9644 +#: commands/tablecmds.c:9698 #, c-format msgid "constraints on temporary tables may reference only temporary tables" msgstr "обмеження в тимчасових таблицях можуть посилатись лише на тимчасові таблиці" -#: commands/tablecmds.c:9648 +#: commands/tablecmds.c:9702 #, c-format msgid "constraints on temporary tables must involve temporary tables of this session" msgstr "обмеження в тимчасових таблицях повинні посилатись лише на тичасові таблиці поточного сеансу" -#: commands/tablecmds.c:9712 commands/tablecmds.c:9718 +#: 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:9734 +#: commands/tablecmds.c:9788 #, c-format msgid "number of referencing and referenced columns for foreign key disagree" msgstr "число стовпців в джерелі і призначенні зовнішнього ключа не збігається" -#: commands/tablecmds.c:9841 +#: commands/tablecmds.c:9895 #, c-format msgid "foreign key constraint \"%s\" cannot be implemented" msgstr "обмеження зовнішнього ключа \"%s\" не можна реалізувати" -#: commands/tablecmds.c:9843 +#: 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:10000 +#: 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:10274 commands/tablecmds.c:10761 +#: 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:10744 +#: 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:11314 commands/tablecmds.c:11595 -#: commands/tablecmds.c:12507 commands/tablecmds.c:12581 +#: 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:11321 +#: commands/tablecmds.c:11454 #, c-format msgid "constraint \"%s\" of relation \"%s\" is not a foreign key constraint" msgstr "обмеження \"%s\" відношення \"%s\" не є обмеженням зовнішнього ключа" -#: commands/tablecmds.c:11359 +#: commands/tablecmds.c:11492 #, c-format msgid "cannot alter constraint \"%s\" on relation \"%s\"" -msgstr "не можна змінити обмеження \"%s\" відношення \"%s\"" +msgstr "неможливо змінити обмеження \"%s\" відношення \"%s\"" -#: commands/tablecmds.c:11362 +#: commands/tablecmds.c:11495 #, c-format msgid "Constraint \"%s\" is derived from constraint \"%s\" of relation \"%s\"." msgstr "Обмеження \"%s\" походить з обмеження \"%s\" відношення \"%s\"." -#: commands/tablecmds.c:11364 +#: commands/tablecmds.c:11497 #, c-format msgid "You may alter the constraint it derives from instead." msgstr "Натомість ви можете змінити початкове обмеження." -#: commands/tablecmds.c:11603 +#: 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:11680 +#: commands/tablecmds.c:11813 #, c-format msgid "constraint must be validated on child tables too" msgstr "обмеження повинно дотримуватися в дочірніх таблицях також" -#: commands/tablecmds.c:11767 +#: commands/tablecmds.c:11900 #, c-format msgid "column \"%s\" referenced in foreign key constraint does not exist" msgstr "стовпець \"%s\", вказаний в обмеженні зовнішнього ключа, не існує" -#: commands/tablecmds.c:11773 +#: commands/tablecmds.c:11906 #, c-format msgid "system columns cannot be used in foreign keys" msgstr "в зовнішніх ключах не можна використовувати системні стовпці" -#: commands/tablecmds.c:11777 +#: commands/tablecmds.c:11910 #, c-format msgid "cannot have more than %d keys in a foreign key" msgstr "у зовнішньому ключі не може бути більш ніж %d ключів" -#: commands/tablecmds.c:11842 +#: commands/tablecmds.c:11975 #, c-format msgid "cannot use a deferrable primary key for referenced table \"%s\"" msgstr "використовувати затримуваний первинний ключ в цільовій зовнішній таблиці \"%s\" не можна" -#: commands/tablecmds.c:11859 +#: commands/tablecmds.c:11992 #, c-format msgid "there is no primary key for referenced table \"%s\"" msgstr "у цільовій зовнішній таблиці \"%s\" немає первинного ключа" -#: commands/tablecmds.c:11927 +#: commands/tablecmds.c:12060 #, c-format msgid "foreign key referenced-columns list must not contain duplicates" msgstr "у списку стовпців зовнішнього ключа не повинно бути повторень" -#: commands/tablecmds.c:12019 +#: commands/tablecmds.c:12152 #, c-format msgid "cannot use a deferrable unique constraint for referenced table \"%s\"" msgstr "використовувати затримане обмеження унікальності в цільовій зовнішній таблиці \"%s\" не можна" -#: commands/tablecmds.c:12024 +#: commands/tablecmds.c:12157 #, c-format msgid "there is no unique constraint matching given keys for referenced table \"%s\"" msgstr "у цільовій зовнішній таблиці \"%s\" немає обмеження унікальності, відповідного даним ключам" -#: commands/tablecmds.c:12463 +#: commands/tablecmds.c:12596 #, c-format msgid "cannot drop inherited constraint \"%s\" of relation \"%s\"" msgstr "видалити успадковане обмеження \"%s\" відношення \"%s\" не можна" -#: commands/tablecmds.c:12513 +#: commands/tablecmds.c:12646 #, c-format msgid "constraint \"%s\" of relation \"%s\" does not exist, skipping" msgstr "обмеження \"%s\" відношення \"%s\" не існує, пропускається" -#: commands/tablecmds.c:12688 +#: commands/tablecmds.c:12821 #, c-format msgid "cannot alter column type of typed table" msgstr "змінити тип стовпця в типізованій таблиці не можна" -#: commands/tablecmds.c:12714 +#: commands/tablecmds.c:12847 #, c-format msgid "cannot specify USING when altering type of generated column" msgstr "не можна вказати USING під час зміни типу згенерованого стовпця" -#: commands/tablecmds.c:12715 commands/tablecmds.c:17918 -#: commands/tablecmds.c:18008 commands/trigger.c:656 -#: rewrite/rewriteHandler.c:935 rewrite/rewriteHandler.c:970 +#: 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:12725 +#: commands/tablecmds.c:12858 #, c-format msgid "cannot alter inherited column \"%s\"" msgstr "змінити успадкований стовпець \"%s\" не можна" -#: commands/tablecmds.c:12734 +#: 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:12784 +#: 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:12787 +#: commands/tablecmds.c:12920 #, c-format msgid "You might need to add an explicit cast." msgstr "Можливо, необхідно додати явне приведення типу." -#: commands/tablecmds.c:12791 +#: 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:12795 +#: commands/tablecmds.c:12928 #, c-format msgid "You might need to specify \"USING %s::%s\"." msgstr "Можливо, необхідно вказати \"USING %s::%s\"." -#: commands/tablecmds.c:12894 +#: commands/tablecmds.c:13027 #, c-format msgid "cannot alter inherited column \"%s\" of relation \"%s\"" msgstr "не можна змінити успадкований стовпець \"%s\" відношення \"%s\"" -#: commands/tablecmds.c:12923 +#: commands/tablecmds.c:13056 #, c-format msgid "USING expression contains a whole-row table reference." msgstr "Вираз USING містить посилання на тип усього рядка таблиці." -#: commands/tablecmds.c:12934 +#: commands/tablecmds.c:13067 #, c-format msgid "type of inherited column \"%s\" must be changed in child tables too" msgstr "тип успадкованого стовпця \"%s\" повинен бути змінений і в дочірніх таблицях" -#: commands/tablecmds.c:13059 +#: commands/tablecmds.c:13192 #, c-format msgid "cannot alter type of column \"%s\" twice" msgstr "не можна змінити тип стовпця \"%s\" двічі" -#: commands/tablecmds.c:13097 +#: 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:13102 +#: commands/tablecmds.c:13235 #, c-format msgid "default for column \"%s\" cannot be cast automatically to type %s" msgstr "значення за замовчуванням для стовпця \"%s\" не можна автоматично привести до типу %s" -#: commands/tablecmds.c:13406 +#: commands/tablecmds.c:13539 #, c-format msgid "cannot alter type of a column used by a function or procedure" msgstr "неможливо змінити тип стовпця, який використовується функцією або процедурою" -#: commands/tablecmds.c:13407 commands/tablecmds.c:13422 -#: commands/tablecmds.c:13442 commands/tablecmds.c:13461 -#: commands/tablecmds.c:13520 +#: 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:13421 +#: commands/tablecmds.c:13554 #, c-format msgid "cannot alter type of a column used by a view or rule" msgstr "змінити тип стовпця, залученого в поданні або правилі, не можна" -#: commands/tablecmds.c:13441 +#: commands/tablecmds.c:13574 #, c-format msgid "cannot alter type of a column used in a trigger definition" msgstr "неможливо змінити тип стовпця, що використовується у визначенні тригеру" -#: commands/tablecmds.c:13460 +#: commands/tablecmds.c:13593 #, c-format msgid "cannot alter type of a column used in a policy definition" msgstr "неможливо змінити тип стовпця, що використовується у визначенні політики" -#: commands/tablecmds.c:13491 +#: commands/tablecmds.c:13624 #, c-format msgid "cannot alter type of a column used by a generated column" msgstr "змінити тип стовпця, який використовується згенерованим стовпцем, не можна" -#: commands/tablecmds.c:13492 +#: commands/tablecmds.c:13625 #, c-format msgid "Column \"%s\" is used by generated column \"%s\"." msgstr "Стовпець \"%s\" використовується згенерованим стовпцем \"%s\"." -#: commands/tablecmds.c:13519 +#: commands/tablecmds.c:13652 #, c-format msgid "cannot alter type of a column used by a publication WHERE clause" msgstr "неможливо змінити тип стовпця, який використовується публікацією в реченні WHERE" -#: commands/tablecmds.c:14354 commands/tablecmds.c:14366 +#: commands/tablecmds.c:14487 commands/tablecmds.c:14499 #, c-format msgid "cannot change owner of index \"%s\"" msgstr "неможливо змінити власника індексу \"%s\"" -#: commands/tablecmds.c:14356 commands/tablecmds.c:14368 +#: commands/tablecmds.c:14489 commands/tablecmds.c:14501 #, c-format msgid "Change the ownership of the index's table instead." msgstr "Замість цього змініть власника таблиці, що містить цей індекс." -#: commands/tablecmds.c:14382 +#: commands/tablecmds.c:14515 #, c-format msgid "cannot change owner of sequence \"%s\"" msgstr "неможливо змінити власника послідовності \"%s\"" -#: commands/tablecmds.c:14407 +#: commands/tablecmds.c:14540 #, c-format msgid "cannot change owner of relation \"%s\"" msgstr "неможливо змінити власника відношення \"%s\"" -#: commands/tablecmds.c:14874 +#: commands/tablecmds.c:15007 #, c-format msgid "cannot have multiple SET TABLESPACE subcommands" msgstr "в одній інструкції не може бути декілька підкоманд SET TABLESPACE" -#: commands/tablecmds.c:14951 +#: commands/tablecmds.c:15084 #, c-format msgid "cannot set options for relation \"%s\"" msgstr "неможливо встановити параметри відношення \"%s\"" -#: commands/tablecmds.c:14985 commands/view.c:440 +#: 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:15235 +#: commands/tablecmds.c:15369 #, c-format msgid "only tables, indexes, and materialized views exist in tablespaces" msgstr "у табличних просторах існують лише таблиці, індекси та матеріалізовані подання" -#: commands/tablecmds.c:15247 +#: commands/tablecmds.c:15381 #, c-format msgid "cannot move relations in to or out of pg_global tablespace" msgstr "переміщувати відношення у або з табличного простору pg_global не можна" -#: commands/tablecmds.c:15339 +#: commands/tablecmds.c:15473 #, c-format msgid "aborting because lock on relation \"%s.%s\" is not available" msgstr "переривання через блокування відношення \"%s.%s\" неможливе" -#: commands/tablecmds.c:15355 +#: commands/tablecmds.c:15489 #, c-format msgid "no matching relations in tablespace \"%s\" found" msgstr " табличному просторі \"%s\" не знайдені відповідні відносини" -#: commands/tablecmds.c:15477 +#: commands/tablecmds.c:15611 #, c-format msgid "cannot change inheritance of typed table" msgstr "змінити успадкування типізованої таблиці не можна" -#: commands/tablecmds.c:15482 commands/tablecmds.c:15982 +#: commands/tablecmds.c:15616 commands/tablecmds.c:16116 #, c-format msgid "cannot change inheritance of a partition" msgstr "змінити успадкування секції не можна" -#: commands/tablecmds.c:15487 +#: commands/tablecmds.c:15621 #, c-format msgid "cannot change inheritance of partitioned table" msgstr "змінити успадкування секціонованої таблиці не можна" -#: commands/tablecmds.c:15533 +#: commands/tablecmds.c:15667 #, c-format msgid "cannot inherit to temporary relation of another session" msgstr "успадкування для тимчасового відношення іншого сеансу не можливе" -#: commands/tablecmds.c:15546 +#: commands/tablecmds.c:15680 #, c-format msgid "cannot inherit from a partition" msgstr "успадкування від секції неможливе" -#: commands/tablecmds.c:15568 commands/tablecmds.c:18419 +#: commands/tablecmds.c:15702 commands/tablecmds.c:18560 #, c-format msgid "circular inheritance not allowed" msgstr "циклічне успадкування неприпустиме" -#: commands/tablecmds.c:15569 commands/tablecmds.c:18420 +#: commands/tablecmds.c:15703 commands/tablecmds.c:18561 #, c-format msgid "\"%s\" is already a child of \"%s\"." msgstr "\"%s\" вже є нащадком \"%s\"." -#: commands/tablecmds.c:15582 +#: commands/tablecmds.c:15716 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming an inheritance child" msgstr "тригер \"%s\" не дозволяє таблиці \"%s\" стати нащадком успадкування" -#: commands/tablecmds.c:15584 +#: commands/tablecmds.c:15718 #, c-format msgid "ROW triggers with transition tables are not supported in inheritance hierarchies." msgstr "Тригери ROW з перехідними таблицями не підтримуються в ієрархіях успадкування." -#: commands/tablecmds.c:15773 +#: commands/tablecmds.c:15907 #, c-format msgid "column \"%s\" in child table must be marked NOT NULL" msgstr "стовпець \"%s\" в дочірній таблиці має бути позначений як NOT NULL" -#: commands/tablecmds.c:15782 +#: commands/tablecmds.c:15916 #, c-format msgid "column \"%s\" in child table must be a generated column" msgstr "стовпець \"%s\" у дочірній таблиці повинен бути згенерованим стовпцем" -#: commands/tablecmds.c:15786 +#: commands/tablecmds.c:15920 #, c-format msgid "column \"%s\" in child table must not be a generated column" msgstr "стовпець \"%s\" у дочірній таблиці повинен бути не генерованим стовпцем" -#: commands/tablecmds.c:15824 +#: commands/tablecmds.c:15958 #, c-format msgid "child table is missing column \"%s\"" msgstr "у дочірній таблиці не вистачає стовпця \"%s\"" -#: commands/tablecmds.c:15905 +#: commands/tablecmds.c:16039 #, c-format msgid "child table \"%s\" has different definition for check constraint \"%s\"" msgstr "дочірня таблиця \"%s\" має інше визначення перевірочного обмеження \"%s\"" -#: commands/tablecmds.c:15912 +#: commands/tablecmds.c:16046 #, c-format msgid "constraint \"%s\" conflicts with non-inherited constraint on child table \"%s\"" msgstr "обмеження \"%s\" конфліктує з неуспадкованим обмеженням дочірньої таблиці \"%s\"" -#: commands/tablecmds.c:15922 +#: 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:15960 +#: commands/tablecmds.c:16094 #, c-format msgid "child table is missing constraint \"%s\"" msgstr "у дочірній таблиці не вистачає обмеження \"%s\"" -#: commands/tablecmds.c:16046 +#: commands/tablecmds.c:16180 #, c-format msgid "partition \"%s\" already pending detach in partitioned table \"%s.%s\"" msgstr "розділ \"%s\" вже очікує відключення в секціонованій таблиці \"%s.%s\"" -#: commands/tablecmds.c:16075 commands/tablecmds.c:16121 +#: 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:16127 +#: commands/tablecmds.c:16261 #, c-format msgid "relation \"%s\" is not a parent of relation \"%s\"" msgstr "відношення \"%s\" не є предком відношення \"%s\"" -#: commands/tablecmds.c:16354 +#: commands/tablecmds.c:16488 #, c-format msgid "typed tables cannot inherit" msgstr "типізовані таблиці не можуть успадковуватись" -#: commands/tablecmds.c:16384 +#: commands/tablecmds.c:16518 #, c-format msgid "table is missing column \"%s\"" msgstr "у таблиці не вистачає стовпця \"%s\"" -#: commands/tablecmds.c:16395 +#: commands/tablecmds.c:16529 #, c-format msgid "table has column \"%s\" where type requires \"%s\"" msgstr "таблиця містить стовпець \"%s\", а тип потребує \"%s\"" -#: commands/tablecmds.c:16404 +#: commands/tablecmds.c:16538 #, c-format msgid "table \"%s\" has different type for column \"%s\"" msgstr "таблиця \"%s\" містить стовпець \"%s\" іншого типу" -#: commands/tablecmds.c:16418 +#: commands/tablecmds.c:16552 #, c-format msgid "table has extra column \"%s\"" msgstr "таблиця містить зайвий стовпець \"%s\"" -#: commands/tablecmds.c:16470 +#: commands/tablecmds.c:16604 #, c-format msgid "\"%s\" is not a typed table" msgstr "\"%s\" - не типізована таблиця" -#: commands/tablecmds.c:16644 +#: commands/tablecmds.c:16778 #, c-format msgid "cannot use non-unique index \"%s\" as replica identity" msgstr "для ідентифікації репліки не можна використати неунікальний індекс \"%s\"" -#: commands/tablecmds.c:16650 +#: commands/tablecmds.c:16784 #, c-format msgid "cannot use non-immediate index \"%s\" as replica identity" msgstr "для ідентифікації репліки не можна використати небезпосередній індекс \"%s\"" -#: commands/tablecmds.c:16656 +#: commands/tablecmds.c:16790 #, c-format msgid "cannot use expression index \"%s\" as replica identity" msgstr "для ідентифікації репліки не можна використати індекс з виразом \"%s\"" -#: commands/tablecmds.c:16662 +#: commands/tablecmds.c:16796 #, c-format msgid "cannot use partial index \"%s\" as replica identity" msgstr "для ідентифікації репліки не можна використати частковий індекс \"%s\"" -#: commands/tablecmds.c:16679 +#: 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:16686 +#: 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:16938 +#: commands/tablecmds.c:17072 #, c-format msgid "cannot change logged status of table \"%s\" because it is temporary" msgstr "змінити стан журналювання таблиці \"%s\" не можна, тому що вона тимчасова" -#: commands/tablecmds.c:16962 +#: 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:16964 +#: commands/tablecmds.c:17098 #, c-format msgid "Unlogged relations cannot be replicated." msgstr "Нежурнальовані відношення не підтримують реплікацію." -#: commands/tablecmds.c:17009 +#: 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:17019 +#: 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:17077 +#: commands/tablecmds.c:17211 #, c-format msgid "cannot move an owned sequence into another schema" msgstr "перемістити послідовність з власником в іншу схему не можна" -#: commands/tablecmds.c:17182 +#: commands/tablecmds.c:17319 #, c-format msgid "relation \"%s\" already exists in schema \"%s\"" msgstr "відношення \"%s\" вже існує в схемі \"%s\"" -#: commands/tablecmds.c:17603 +#: commands/tablecmds.c:17744 #, c-format msgid "\"%s\" is not a table or materialized view" msgstr "\"%s\" не є таблицею або матеріалізованим поданням" -#: commands/tablecmds.c:17756 +#: commands/tablecmds.c:17897 #, c-format msgid "\"%s\" is not a composite type" msgstr "\"%s\" - не складений тип" -#: commands/tablecmds.c:17786 +#: commands/tablecmds.c:17927 #, c-format msgid "cannot change schema of index \"%s\"" msgstr "змінити схему індексу \"%s\" не можна" -#: commands/tablecmds.c:17788 commands/tablecmds.c:17802 +#: commands/tablecmds.c:17929 commands/tablecmds.c:17943 #, c-format msgid "Change the schema of the table instead." msgstr "Замість цього змініть схему таблиці." -#: commands/tablecmds.c:17792 +#: commands/tablecmds.c:17933 #, c-format msgid "cannot change schema of composite type \"%s\"" msgstr "змінити схему складеного типу \"%s\" не можна" -#: commands/tablecmds.c:17800 +#: commands/tablecmds.c:17941 #, c-format msgid "cannot change schema of TOAST table \"%s\"" msgstr "змінити схему таблиці TOAST \"%s\" не можна" -#: commands/tablecmds.c:17832 +#: commands/tablecmds.c:17973 #, c-format msgid "cannot use \"list\" partition strategy with more than one column" msgstr "стратегія секціонування \"по списку\" не може використовувати декілька стовпців" -#: commands/tablecmds.c:17898 +#: commands/tablecmds.c:18039 #, c-format msgid "column \"%s\" named in partition key does not exist" msgstr "стовпець \"%s\", згаданий в ключі секціонування, не існує" -#: commands/tablecmds.c:17906 +#: commands/tablecmds.c:18047 #, c-format msgid "cannot use system column \"%s\" in partition key" msgstr "системний стовпець \"%s\" не можна використати в ключі секціонування" -#: commands/tablecmds.c:17917 commands/tablecmds.c:18007 +#: commands/tablecmds.c:18058 commands/tablecmds.c:18148 #, c-format msgid "cannot use generated column in partition key" msgstr "використати згенерований стовпець в ключі секції, не можна" -#: commands/tablecmds.c:17990 +#: commands/tablecmds.c:18131 #, c-format msgid "partition key expressions cannot contain system column references" msgstr "вирази ключа секціонування не можуть містити посилання на системний стовпець" -#: commands/tablecmds.c:18037 +#: commands/tablecmds.c:18178 #, c-format msgid "functions in partition key expression must be marked IMMUTABLE" msgstr "функції у виразі ключа секціонування повинні бути позначені як IMMUTABLE" -#: commands/tablecmds.c:18046 +#: commands/tablecmds.c:18187 #, c-format msgid "cannot use constant expression as partition key" msgstr "не можна використати константий вираз як ключ секціонування" -#: commands/tablecmds.c:18067 +#: commands/tablecmds.c:18208 #, c-format msgid "could not determine which collation to use for partition expression" msgstr "не вдалося визначити, яке правило сортування використати для виразу секціонування" -#: commands/tablecmds.c:18102 +#: 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:18108 +#: 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:18359 +#: commands/tablecmds.c:18500 #, c-format msgid "\"%s\" is already a partition" msgstr "\"%s\" вже є секцією" -#: commands/tablecmds.c:18365 +#: commands/tablecmds.c:18506 #, c-format msgid "cannot attach a typed table as partition" msgstr "неможливо підключити типізовану таблицю в якості секції" -#: commands/tablecmds.c:18381 +#: commands/tablecmds.c:18522 #, c-format msgid "cannot attach inheritance child as partition" msgstr "неможливо підключити нащадка успадкування в якості секції" -#: commands/tablecmds.c:18395 +#: commands/tablecmds.c:18536 #, c-format msgid "cannot attach inheritance parent as partition" msgstr "неможливо підключити предка успадкування в якості секції" -#: commands/tablecmds.c:18429 +#: commands/tablecmds.c:18570 #, c-format msgid "cannot attach a temporary relation as partition of permanent relation \"%s\"" msgstr "неможливо підкючити тимчасове відношення в якості секції постійного відношення \"%s\"" -#: commands/tablecmds.c:18437 +#: commands/tablecmds.c:18578 #, c-format msgid "cannot attach a permanent relation as partition of temporary relation \"%s\"" msgstr "неможливо підключити постійне відношення в якості секції тимчасового відношення \"%s\"" -#: commands/tablecmds.c:18445 +#: commands/tablecmds.c:18586 #, c-format msgid "cannot attach as partition of temporary relation of another session" msgstr "неможливо підключити секцію до тимчасового відношення в іншому сеансі" -#: commands/tablecmds.c:18452 +#: commands/tablecmds.c:18593 #, c-format msgid "cannot attach temporary relation of another session as partition" msgstr "неможливо підключити тимчасове відношення з іншого сеансу в якості секції" -#: commands/tablecmds.c:18472 +#: commands/tablecmds.c:18613 #, c-format msgid "table \"%s\" being attached contains an identity column \"%s\"" msgstr "таблиця \"%s\", що додається, містить стовпець ідентичності \"%s\"" -#: commands/tablecmds.c:18474 +#: commands/tablecmds.c:18615 #, c-format msgid "The new partition may not contain an identity column." msgstr "Новий розділ може не містити стовпця ідентичності." -#: commands/tablecmds.c:18482 +#: commands/tablecmds.c:18623 #, c-format msgid "table \"%s\" contains column \"%s\" not found in parent \"%s\"" msgstr "таблиця \"%s\" містить стовпець \"%s\", відсутній в батьківській \"%s\"" -#: commands/tablecmds.c:18485 +#: commands/tablecmds.c:18626 #, c-format msgid "The new partition may contain only the columns present in parent." msgstr "Нова секція може містити лише стовпці, що є у батьківській таблиці." -#: commands/tablecmds.c:18497 +#: commands/tablecmds.c:18638 #, c-format msgid "trigger \"%s\" prevents table \"%s\" from becoming a partition" msgstr "тригер \"%s\" не дозволяє зробити таблицю \"%s\" секцією" -#: commands/tablecmds.c:18499 +#: commands/tablecmds.c:18640 #, c-format msgid "ROW triggers with transition tables are not supported on partitions." msgstr "Тригери ROW з перехідними таблицями не підтримуються для секцій." -#: commands/tablecmds.c:18675 +#: commands/tablecmds.c:18816 #, c-format msgid "cannot attach foreign table \"%s\" as partition of partitioned table \"%s\"" msgstr "не можна підключити зовнішню таблицю \"%s\" в якості секції секціонованої таблиці \"%s\"" -#: commands/tablecmds.c:18678 +#: commands/tablecmds.c:18819 #, c-format msgid "Partitioned table \"%s\" contains unique indexes." msgstr "Секціонована таблиця \"%s\" містить унікальні індекси." -#: commands/tablecmds.c:19000 +#: commands/tablecmds.c:19141 #, c-format msgid "cannot detach partitions concurrently when a default partition exists" msgstr "не можна одночасно відключити розділи, коли існує розділ за замовчуванням" -#: commands/tablecmds.c:19109 +#: commands/tablecmds.c:19250 #, c-format msgid "partitioned table \"%s\" was removed concurrently" msgstr "секціоновану таблицю \"%s\" було видалено одночасно" -#: commands/tablecmds.c:19115 +#: commands/tablecmds.c:19256 #, c-format msgid "partition \"%s\" was removed concurrently" msgstr "розділ \"%s\" було видалено паралельно" -#: commands/tablecmds.c:19651 commands/tablecmds.c:19671 -#: commands/tablecmds.c:19692 commands/tablecmds.c:19711 -#: commands/tablecmds.c:19753 +#: 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:19654 +#: commands/tablecmds.c:19873 #, c-format msgid "Index \"%s\" is already attached to another index." msgstr "Індекс \"%s\" вже підключений до іншого індексу." -#: commands/tablecmds.c:19674 +#: 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:19695 +#: commands/tablecmds.c:19914 #, c-format msgid "The index definitions do not match." msgstr "Визначення індексів не співпадають." -#: commands/tablecmds.c:19714 +#: 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:19756 +#: commands/tablecmds.c:19975 #, c-format msgid "Another index is already attached for partition \"%s\"." msgstr "До секції \"%s\" вже підключений інший індекс." -#: commands/tablecmds.c:19992 +#: commands/tablecmds.c:20211 #, c-format msgid "column data type %s does not support compression" msgstr "тип даних стовпця %s не підтримує стискання" -#: commands/tablecmds.c:19999 +#: commands/tablecmds.c:20218 #, c-format msgid "invalid compression method \"%s\"" msgstr "неприпустимий метод стискання \"%s\"" -#: commands/tablecmds.c:20025 +#: commands/tablecmds.c:20244 #, c-format msgid "invalid storage type \"%s\"" msgstr "неприпустимий тип сховища \"%s\"" -#: commands/tablecmds.c:20035 +#: commands/tablecmds.c:20254 #, c-format msgid "column data type %s can only have storage PLAIN" msgstr "тип даних стовпця %s може мати тільки сховище PLAIN" @@ -12279,46 +12290,40 @@ msgstr "переміщення рядка до іншої секції під ч 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:2373 -#: executor/nodeModifyTable.c:2456 -#, 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:1541 -#: executor/nodeModifyTable.c:1615 executor/nodeModifyTable.c:2374 -#: executor/nodeModifyTable.c:2457 executor/nodeModifyTable.c:3093 -#: executor/nodeModifyTable.c:3254 +#: 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:3382 executor/nodeLockRows.c:228 #: executor/nodeLockRows.c:237 executor/nodeModifyTable.c:314 -#: executor/nodeModifyTable.c:1557 executor/nodeModifyTable.c:2391 -#: executor/nodeModifyTable.c:2599 +#: 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:3390 executor/nodeModifyTable.c:1647 -#: executor/nodeModifyTable.c:2474 executor/nodeModifyTable.c:2623 -#: executor/nodeModifyTable.c:3111 +#: 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:4601 +#: commands/trigger.c:4599 #, c-format msgid "cannot fire deferred trigger within security-restricted operation" msgstr "не можна виконати відкладений тригер в межах операції з обмеженням по безпеці" -#: commands/trigger.c:5782 +#: commands/trigger.c:5780 #, c-format msgid "constraint \"%s\" is not deferrable" msgstr "обмеження \"%s\" не є відкладеним" -#: commands/trigger.c:5805 +#: commands/trigger.c:5803 #, c-format msgid "constraint \"%s\" does not exist" msgstr "обмеження \"%s\" не існує" @@ -12847,8 +12852,8 @@ msgstr "Щоб змінити пароль іншої ролі, поточний #: commands/user.c:825 #, c-format -msgid "Only roles with the %s option on role \"%s\" may add members." -msgstr "Тільки ролі з опцією %s на роль \"%s\" можуть додавати учасників." +msgid "Only roles with the %s option on role \"%s\" may add or drop members." +msgstr "Тільки ролі з опцією %s на роль \"%s\" можуть додавати чи видаляти учасників." #: commands/user.c:870 #, c-format @@ -12880,11 +12885,11 @@ msgstr "Тільки ролі з атрибутом %s та опцією %s на 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 +#: 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:762 +#: utils/adt/regproc.c:1571 utils/init/miscinit.c:799 #, c-format msgid "role \"%s\" does not exist" msgstr "роль \"%s\" не існує" @@ -13201,32 +13206,32 @@ msgstr "Завершіть відкриті транзакції якнайшв msgid "cutoff for freezing multixacts is far in the past" msgstr "відсікання для заморожування мультитранзакцій залишилося далеко в минулому" -#: commands/vacuum.c:1890 +#: commands/vacuum.c:1900 #, c-format msgid "some databases have not been vacuumed in over 2 billion transactions" msgstr "деякі бази даних не очищалися протягом більш ніж 2 мільярдів транзакцій" -#: commands/vacuum.c:1891 +#: commands/vacuum.c:1901 #, c-format msgid "You might have already suffered transaction-wraparound data loss." msgstr "Можливо, ви вже втратили дані в результаті зациклення транзакцій." -#: commands/vacuum.c:2070 +#: commands/vacuum.c:2080 #, c-format msgid "skipping \"%s\" --- cannot vacuum non-tables or special system tables" msgstr "пропускається \"%s\" --- очищати не таблиці або спеціальні системні таблиці не можна" -#: commands/vacuum.c:2502 +#: commands/vacuum.c:2512 #, c-format msgid "scanned index \"%s\" to remove %lld row versions" -msgstr "" +msgstr "просканований індекс \"%s\", видалено версій рядків %lld" -#: commands/vacuum.c:2521 +#: commands/vacuum.c:2531 #, c-format msgid "index \"%s\" now contains %.0f row versions in %u pages" msgstr "індекс \"%s\" наразі містить %.0f версій рядків у %u сторінках" -#: commands/vacuum.c:2525 +#: commands/vacuum.c:2535 #, c-format msgid "%.0f index row versions were removed.\n" "%u index pages were newly deleted.\n" @@ -13235,7 +13240,7 @@ msgstr "%.0f версій індексних рядків було видале "%u індексних сторінок щойно видалено.\n" "%u індексних сторінок наразі видалено, з яких %u наразі можна використовувати повторно." -#: commands/vacuumparallel.c:708 +#: 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)" @@ -13244,7 +13249,7 @@ msgstr[1] "запущено %d паралельних виконавців оч msgstr[2] "запущено %d паралельних виконавців очистки для очищення індексу (заплановано: %d)" msgstr[3] "запущено %d паралельних виконавців очистки для очищення індексу (заплановано: %d)" -#: commands/vacuumparallel.c:714 +#: 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)" @@ -13308,7 +13313,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:1680 +#: commands/variable.c:606 storage/lmgr/predicate.c:1685 #, c-format msgid "cannot use serializable mode in a hot standby" msgstr "використовувати серіалізований режим в hot standby не можна" @@ -13341,44 +13346,44 @@ msgstr "Змінити клієнтське кодування зараз нем #: commands/variable.c:781 #, c-format msgid "cannot change \"client_encoding\" during a parallel operation" -msgstr "" +msgstr "змінити клієнтське кодування під час паралельної операції неможливо" -#: commands/variable.c:863 +#: commands/variable.c:876 #, c-format msgid "permission will be denied to set session authorization \"%s\"" msgstr "буде відмовлено у встановленні авторизації сеансу \"%s\"" -#: commands/variable.c:868 +#: commands/variable.c:881 #, c-format msgid "permission denied to set session authorization \"%s\"" msgstr "відмовлено у встановленні авторизації сеансу \"%s\"" -#: commands/variable.c:972 +#: commands/variable.c:991 #, c-format msgid "permission will be denied to set role \"%s\"" -msgstr "немає прав для встановлення ролі \"%s\"" +msgstr "немає дозволу для встановлення ролі \"%s\"" -#: commands/variable.c:977 +#: commands/variable.c:996 #, c-format msgid "permission denied to set role \"%s\"" msgstr "немає прав для встановлення ролі \"%s\"" -#: commands/variable.c:1177 +#: commands/variable.c:1200 #, c-format msgid "Bonjour is not supported by this build" msgstr "Bonjour не підтримується даною збіркою" -#: commands/variable.c:1205 +#: commands/variable.c:1228 #, c-format msgid "\"effective_io_concurrency\" must be set to 0 on platforms that lack posix_fadvise()." -msgstr "" +msgstr "\"значення effective_io_concurrency повинне дорівнювати 0 (нулю) на платформах, де відсутній posix_fadvise()." -#: commands/variable.c:1218 +#: commands/variable.c:1241 #, c-format msgid "\"maintenance_io_concurrency\" must be set to 0 on platforms that lack posix_fadvise()." -msgstr "" +msgstr "\"maintenance_io_concurrency повинне бути встановлене на 0, на платформах які не мають posix_fadvise()." -#: commands/variable.c:1231 +#: commands/variable.c:1254 #, c-format msgid "SSL is not supported by this build" msgstr "SSL не підтримується даною збіркою" @@ -13469,19 +13474,19 @@ msgstr "курсор \"%s\" не розташовується у рядку" msgid "cursor \"%s\" is not a simply updatable scan of table \"%s\"" msgstr "курсор \"%s\" - не просте оновлюване сканування таблиці \"%s\"" -#: executor/execCurrent.c:280 executor/execExprInterp.c:2543 +#: 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:2555 +#: executor/execCurrent.c:292 executor/execExprInterp.c:2567 #, c-format msgid "no value found for parameter %d" msgstr "не знайдено значення для параметру %d" #: executor/execExpr.c:642 executor/execExpr.c:649 executor/execExpr.c:655 -#: executor/execExprInterp.c:4840 executor/execExprInterp.c:4857 -#: executor/execExprInterp.c:4956 executor/nodeModifyTable.c:203 +#: 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 @@ -13498,7 +13503,7 @@ msgstr "Запит повертає дуже багато стовпців." msgid "Query provides a value for a dropped column at ordinal position %d." msgstr "Запит надає значення для видаленого стовпця з порядковим номером %d." -#: executor/execExpr.c:656 executor/execExprInterp.c:4858 +#: 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." @@ -13509,17 +13514,17 @@ msgstr "Таблиця має тип %s у порядковому розташу msgid "window function calls cannot be nested" msgstr "виклики віконних функцій не можуть бути вкладеними" -#: executor/execExpr.c:1641 +#: executor/execExpr.c:1649 #, c-format msgid "target type is not an array" msgstr "цільовий тип не є масивом" -#: executor/execExpr.c:1981 +#: executor/execExpr.c:1989 #, c-format msgid "ROW() column has type %s instead of type %s" msgstr "Стовпець ROW() має тип %s замість %s" -#: executor/execExpr.c:2643 executor/execSRF.c:718 parser/parse_func.c:138 +#: 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" @@ -13529,39 +13534,39 @@ msgstr[1] "функції не можна передати більше ніж % msgstr[2] "функції не можна передати більше ніж %d аргументів" msgstr[3] "функції не можна передати більше ніж %d аргументів" -#: executor/execExpr.c:2670 executor/execSRF.c:738 executor/functions.c:1068 +#: 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:3076 parser/parse_node.c:272 parser/parse_node.c:322 +#: 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:3204 executor/execExpr.c:3226 +#: executor/execExpr.c:3214 executor/execExpr.c:3236 #, c-format msgid "type %s does not support subscripted assignment" msgstr "тип %s не підтримує вказані присвоєння за підпискою" -#: executor/execExprInterp.c:2007 +#: executor/execExprInterp.c:2019 #, c-format msgid "attribute %d of type %s has been dropped" msgstr "атрибут %d типу %s був видалений" -#: executor/execExprInterp.c:2013 +#: executor/execExprInterp.c:2025 #, c-format msgid "attribute %d of type %s has wrong type" msgstr "атрибут %d типу %s має неправильний тип" -#: executor/execExprInterp.c:2015 executor/execExprInterp.c:3214 -#: executor/execExprInterp.c:3260 +#: 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:2095 utils/adt/expandedrecord.c:99 +#: 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 @@ -13569,35 +13574,35 @@ msgstr "Таблиця має тип %s, але запит очікував %s." msgid "type %s is not composite" msgstr "тип %s не є складеним" -#: executor/execExprInterp.c:2698 +#: executor/execExprInterp.c:2710 #, c-format msgid "WHERE CURRENT OF is not supported for this table type" msgstr "WHERE CURRENT OF для таблиць такого типу не підтримується" -#: executor/execExprInterp.c:2911 +#: executor/execExprInterp.c:2923 #, c-format msgid "cannot merge incompatible arrays" msgstr "не можна об'єднати несумісні масиви" -#: executor/execExprInterp.c:2912 +#: 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:2933 utils/adt/arrayfuncs.c:1305 +#: 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/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:2953 executor/execExprInterp.c:2988 +#: executor/execExprInterp.c:2965 executor/execExprInterp.c:3000 #, c-format msgid "multidimensional arrays must have array expressions with matching dimensions" msgstr "для багатовимірних масивів повинні задаватись вирази з відповідними вимірами" -#: executor/execExprInterp.c:2965 utils/adt/array_expanded.c:274 +#: 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 @@ -13605,45 +13610,45 @@ msgstr "для багатовимірних масивів повинні зад #: 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/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:3213 executor/execExprInterp.c:3259 +#: executor/execExprInterp.c:3225 executor/execExprInterp.c:3271 #, c-format msgid "attribute %d has wrong type" msgstr "атрибут %d має неправильний тип" -#: executor/execExprInterp.c:3845 utils/adt/domains.c:158 +#: 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:3860 utils/adt/domains.c:196 +#: 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:4435 +#: executor/execExprInterp.c:4447 #, c-format msgid "no SQL/JSON item found for specified path of column \"%s\"" -msgstr "" +msgstr "не знайдено елемента SQL/JSON для вказаного шляху стовпця \"%s\"" -#: executor/execExprInterp.c:4440 +#: executor/execExprInterp.c:4452 #, c-format msgid "no SQL/JSON item found for specified path" -msgstr "" +msgstr "не знайдено елемента SQL/JSON для вказаного шляху" #. translator: first %s is a SQL/JSON clause (e.g. ON ERROR) -#: executor/execExprInterp.c:4640 executor/execExprInterp.c:4648 +#: executor/execExprInterp.c:4652 executor/execExprInterp.c:4660 #, c-format msgid "could not coerce %s expression (%s) to the RETURNING type" -msgstr "" +msgstr "не вдалося привести %s вираз (%s) до типу RETURNING" -#: executor/execExprInterp.c:4841 +#: 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." @@ -13652,7 +13657,7 @@ msgstr[1] "Рядок таблиці містить %d атрибути, але msgstr[2] "Рядок таблиці містить %d атрибутів, але запит очікував %d." msgstr[3] "Рядок таблиці містить %d атрибутів, але запит очікував %d." -#: executor/execExprInterp.c:4957 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." @@ -13692,139 +13697,139 @@ msgstr "Ключ %s конфліктує з існуючим ключем %s." msgid "Key conflicts with existing key." msgstr "Ключ конфліктує з існуючим ключем." -#: executor/execMain.c:1043 +#: executor/execMain.c:1039 #, c-format msgid "cannot change sequence \"%s\"" msgstr "послідовність \"%s\" не можна змінити" -#: executor/execMain.c:1049 +#: executor/execMain.c:1045 #, c-format msgid "cannot change TOAST relation \"%s\"" msgstr "TOAST-відношення \"%s\" не можна змінити" -#: executor/execMain.c:1068 +#: executor/execMain.c:1064 #, c-format msgid "cannot change materialized view \"%s\"" msgstr "змінити матеріалізоване подання \"%s\" не можна" -#: executor/execMain.c:1080 +#: executor/execMain.c:1076 #, c-format msgid "cannot insert into foreign table \"%s\"" msgstr "вставляти дані в зовнішню таблицю \"%s\" не можна" -#: executor/execMain.c:1086 +#: executor/execMain.c:1082 #, c-format msgid "foreign table \"%s\" does not allow inserts" msgstr "зовнішня таблиця \"%s\" не допускає додавання даних" -#: executor/execMain.c:1093 +#: executor/execMain.c:1089 #, c-format msgid "cannot update foreign table \"%s\"" msgstr "оновити зовнішню таблицю \"%s\" не можна" -#: executor/execMain.c:1099 +#: executor/execMain.c:1095 #, c-format msgid "foreign table \"%s\" does not allow updates" msgstr "зовнішня таблиця \"%s\" не дозволяє оновлення" -#: executor/execMain.c:1106 +#: executor/execMain.c:1102 #, c-format msgid "cannot delete from foreign table \"%s\"" msgstr "видаляти дані з зовнішньої таблиці \"%s\" не можна" -#: executor/execMain.c:1112 +#: executor/execMain.c:1108 #, c-format msgid "foreign table \"%s\" does not allow deletes" msgstr "зовнішня таблиця \"%s\" не дозволяє видалення даних" -#: executor/execMain.c:1123 +#: executor/execMain.c:1119 #, c-format msgid "cannot change relation \"%s\"" msgstr "відношення \"%s\" не можна змінити" -#: executor/execMain.c:1150 +#: executor/execMain.c:1146 #, c-format msgid "cannot lock rows in sequence \"%s\"" msgstr "блокувати рядки в послідовності \"%s\" не можна" -#: executor/execMain.c:1157 +#: executor/execMain.c:1153 #, c-format msgid "cannot lock rows in TOAST relation \"%s\"" msgstr "блокувати рядки в TOAST-відношенні \"%s\" не можна" -#: executor/execMain.c:1164 +#: executor/execMain.c:1160 #, c-format msgid "cannot lock rows in view \"%s\"" msgstr "блокувати рядки в поданні \"%s\" не можна" -#: executor/execMain.c:1172 +#: executor/execMain.c:1168 #, c-format msgid "cannot lock rows in materialized view \"%s\"" msgstr "блокувати рядки в матеріалізованому поданні \"%s\" не можна" -#: executor/execMain.c:1181 executor/execMain.c:2686 +#: 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:1187 +#: executor/execMain.c:1183 #, c-format msgid "cannot lock rows in relation \"%s\"" msgstr "блокувати рядки у відношенні \"%s\" не можна" -#: executor/execMain.c:1900 +#: executor/execMain.c:1901 #, c-format msgid "new row for relation \"%s\" violates partition constraint" msgstr "новий рядок для відношення \"%s\" порушує обмеження секції" -#: executor/execMain.c:1902 executor/execMain.c:1986 executor/execMain.c:2037 -#: executor/execMain.c:2147 +#: 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:1983 +#: 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:2035 +#: executor/execMain.c:2036 #, c-format msgid "new row for relation \"%s\" violates check constraint \"%s\"" msgstr "новий рядок для відношення \"%s\" порушує перевірне обмеження перевірку \"%s\"" -#: executor/execMain.c:2145 +#: executor/execMain.c:2146 #, c-format msgid "new row violates check option for view \"%s\"" msgstr "новий рядок порушує параметр перевірки для подання \"%s\"" -#: executor/execMain.c:2155 +#: executor/execMain.c:2156 #, c-format msgid "new row violates row-level security policy \"%s\" for table \"%s\"" msgstr "новий рядок порушує політику захисту на рівні рядків \"%s\" для таблиці \"%s\"" -#: executor/execMain.c:2160 +#: executor/execMain.c:2161 #, c-format msgid "new row violates row-level security policy for table \"%s\"" msgstr "новий рядок порушує політику захисту на рівні рядків для таблиці \"%s\"" -#: executor/execMain.c:2168 +#: 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:2173 +#: 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:2180 +#: 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:2185 +#: executor/execMain.c:2186 #, c-format msgid "new row violates row-level security policy (USING expression) for table \"%s\"" msgstr "новий рядок порушує політику захисту на рівні рядків (вираз USING) для таблиці \"%s\"" @@ -13857,53 +13862,53 @@ 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:3852 -#: utils/adt/arrayfuncs.c:4407 utils/adt/arrayfuncs.c:6426 +#: 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:683 executor/execReplication.c:689 +#: executor/execReplication.c:687 executor/execReplication.c:693 #, c-format msgid "cannot update table \"%s\"" msgstr "оновити таблицю \"%s\" не можна" -#: executor/execReplication.c:685 executor/execReplication.c:697 +#: 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:691 executor/execReplication.c:703 +#: 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:695 executor/execReplication.c:701 +#: executor/execReplication.c:699 executor/execReplication.c:705 #, c-format msgid "cannot delete from table \"%s\"" msgstr "видалити дані з таблиці \"%s\" не можна" -#: executor/execReplication.c:721 +#: 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:723 +#: 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:727 +#: 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:729 +#: 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:745 +#: executor/execReplication.c:749 #, c-format msgid "cannot use relation \"%s.%s\" as logical replication target" msgstr "використовувати відношення \"%s.%s\" як ціль логічної реплікації, не можна" @@ -13961,12 +13966,12 @@ msgstr "не можна отримати системний стовпець в #: executor/execTuples.c:163 executor/execTuples.c:580 #, c-format msgid "don't have transaction information for this type of tuple" -msgstr "" +msgstr "немає інформації про транзакцію для цього типу кортежу" #: executor/execTuples.c:390 executor/execTuples.c:794 #, c-format msgid "don't have a storage tuple in this context" -msgstr "" +msgstr "в цьому контексті немає сховища кортежів" #: executor/execUtils.c:713 #, c-format @@ -13995,7 +14000,7 @@ msgid "%s is not allowed in an SQL function" msgstr "функція SQL не дозволяє використання %s" #. translator: %s is a SQL statement name -#: executor/functions.c:527 executor/spi.c:1741 executor/spi.c:2651 +#: 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" @@ -14025,7 +14030,7 @@ msgstr "невідповідність типу повернення в функ #: executor/functions.c:1700 #, c-format msgid "Function's final statement must be SELECT or INSERT/UPDATE/DELETE/MERGE RETURNING." -msgstr "" +msgstr "Останнім оператором у функції повинен бути SELECT або INSERT/UPDATE/DELETE/MERGE RETURNING." #: executor/functions.c:1738 #, c-format @@ -14057,7 +14062,7 @@ msgstr "Останній оператор вертає дуже мало сто msgid "return type %s is not supported for SQL functions" msgstr "для SQL функцій тип повернення %s не підтримується" -#: executor/nodeAgg.c:3936 executor/nodeWindowAgg.c:2976 +#: executor/nodeAgg.c:3936 executor/nodeWindowAgg.c:2975 #, c-format msgid "aggregate %u needs to have compatible input type and transition type" msgstr "агрегатна функція %u повинна мати сумісні тип введення і тип переходу" @@ -14138,31 +14143,31 @@ msgid "Consider defining the foreign key on table \"%s\"." msgstr "Розгляньте визначення зовнішнього ключа для таблиці \"%s\"." #. translator: %s is a SQL command name -#: executor/nodeModifyTable.c:2577 executor/nodeModifyTable.c:3099 -#: executor/nodeModifyTable.c:3260 +#: 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:2579 +#: 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:3092 executor/nodeModifyTable.c:3253 +#: 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:3101 executor/nodeModifyTable.c:3262 +#: 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:3170 +#: executor/nodeModifyTable.c:3209 #, c-format msgid "tuple to be merged was already moved to another partition due to concurrent update" -msgstr "" +msgstr "кортеж, який підлягає об'єднанню, вже переміщено в іншу секцію в результаті паралельного оновлення" #: executor/nodeSamplescan.c:244 #, c-format @@ -14230,7 +14235,7 @@ msgstr "зсув кінця рамки не повинен бути null" msgid "frame ending offset must not be negative" msgstr "зсув кінця рамки не повинен бути негативним" -#: executor/nodeWindowAgg.c:2892 +#: executor/nodeWindowAgg.c:2891 #, c-format msgid "aggregate function %s does not support use as a window function" msgstr "агрегатна функція %s не підтримує використання в якості віконної функції" @@ -14265,49 +14270,49 @@ msgstr "Перевірте наявність виклику \"SPI_finish\"." msgid "subtransaction left non-empty SPI stack" msgstr "підтранзакція залишила непорожню групу SPI" -#: executor/spi.c:1599 +#: 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:1609 +#: executor/spi.c:1612 #, c-format msgid "cannot open %s query as cursor" msgstr "неможливо відкрити запит %s як курсор" -#: executor/spi.c:1715 +#: 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:1716 parser/analyze.c:2928 +#: executor/spi.c:1719 parser/analyze.c:2928 #, c-format msgid "Scrollable cursors must be READ ONLY." msgstr "Курсори з прокручуванням повинні бути READ ONLY." -#: executor/spi.c:2490 +#: 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:2564 +#: executor/spi.c:2570 #, c-format msgid "%s query does not return tuples" msgstr "%s запит не повертає кортежі" -#: executor/spi.c:2981 +#: executor/spi.c:2987 #, c-format msgid "SQL expression \"%s\"" msgstr "SQL вираз \"%s\"" -#: executor/spi.c:2986 +#: executor/spi.c:2992 #, c-format msgid "PL/pgSQL assignment \"%s\"" msgstr "PL/pgSQL присвоєння \"%s\"" -#: executor/spi.c:2989 +#: executor/spi.c:2995 #, c-format msgid "SQL statement \"%s\"" msgstr "SQL-оператор \"%s\"" @@ -14326,7 +14331,7 @@ msgstr "зіставлення користувача не знайдено дл #: optimizer/util/plancat.c:540 #, c-format msgid "access to non-system foreign table is restricted" -msgstr "" +msgstr "доступ до не системної сторонньої таблиці обмежено" #: foreign/foreign.c:660 #, c-format @@ -15302,7 +15307,7 @@ msgstr "нерозпізнаний код помилки SSL: %d" #: libpq/be-secure-openssl.c:622 #, c-format msgid "received SSL connection request with unexpected ALPN protocol" -msgstr "" +msgstr "отримано запит на підключення SSL з несподіваним протоколом ALPN" #: libpq/be-secure-openssl.c:666 #, c-format @@ -15509,7 +15514,7 @@ msgstr "запис hostssl не збігається, тому що проток #: libpq/hba.c:1381 #, c-format msgid "Set \"ssl = on\" in postgresql.conf." -msgstr "" +msgstr "Встановіть \"ssl = on\" в postgresql.conf." #: libpq/hba.c:1389 #, c-format @@ -15980,220 +15985,220 @@ msgstr "неприпустимий рядок в повідомленні" msgid "invalid message format" msgstr "неприпустимий формат повідомлення" -#: main/main.c:234 +#: main/main.c:236 #, c-format msgid "%s: WSAStartup failed: %d\n" msgstr "%s: помилка WSAStartup: %d\n" -#: main/main.c:322 +#: main/main.c:324 #, c-format msgid "%s is the PostgreSQL server.\n\n" msgstr "%s - сервер PostgreSQL.\n\n" -#: main/main.c:323 +#: main/main.c:325 #, c-format msgid "Usage:\n" " %s [OPTION]...\n\n" msgstr "Використання:\n" " %s [OPTION]...\n\n" -#: main/main.c:324 +#: main/main.c:326 #, c-format msgid "Options:\n" msgstr "Параметри:\n" -#: main/main.c:325 +#: main/main.c:327 #, c-format msgid " -B NBUFFERS number of shared buffers\n" msgstr " -B NBUFFERS число спільних буферів\n" -#: main/main.c:326 +#: main/main.c:328 #, c-format msgid " -c NAME=VALUE set run-time parameter\n" msgstr " -c NAME=VALUE встановити параметр під час виконання\n" -#: main/main.c:327 +#: 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:328 +#: main/main.c:330 #, c-format msgid " -d 1-5 debugging level\n" msgstr " -d 1-5 рівень налагодження\n" -#: main/main.c:329 +#: main/main.c:331 #, c-format msgid " -D DATADIR database directory\n" msgstr " -D DATADIR каталог бази даних\n" -#: main/main.c:330 +#: main/main.c:332 #, c-format msgid " -e use European date input format (DMY)\n" msgstr " -e використати європейський формат дат (DMY)\n" -#: main/main.c:331 +#: main/main.c:333 #, c-format msgid " -F turn fsync off\n" msgstr " -F вимкнути fsync\n" -#: main/main.c:332 +#: 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:333 +#: main/main.c:335 #, c-format msgid " -i enable TCP/IP connections (deprecated)\n" msgstr " -i активувати підключення TCP/IP (застаріле)\n" -#: main/main.c:334 +#: main/main.c:336 #, c-format msgid " -k DIRECTORY Unix-domain socket location\n" msgstr " -k DIRECTORY розташування Unix-сокетів\n" -#: main/main.c:336 +#: main/main.c:338 #, c-format msgid " -l enable SSL connections\n" msgstr " -l активувати SSL-підключення\n" -#: main/main.c:338 +#: main/main.c:340 #, c-format msgid " -N MAX-CONNECT maximum number of allowed connections\n" msgstr " -N MAX-CONNECT максимальне число дозволених підключень\n" -#: main/main.c:339 +#: main/main.c:341 #, c-format msgid " -p PORT port number to listen on\n" msgstr " -p PORT номер порту для прослуховування\n" -#: main/main.c:340 +#: main/main.c:342 #, c-format msgid " -s show statistics after each query\n" msgstr " -s відображувати статистику після кожного запиту\n" -#: main/main.c:341 +#: 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:342 +#: main/main.c:344 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивести інформацію про версію і вийти\n" -#: main/main.c:343 +#: main/main.c:345 #, c-format msgid " --NAME=VALUE set run-time parameter\n" msgstr " --NAME=VALUE встановити параметр під час виконання\n" -#: main/main.c:344 +#: main/main.c:346 #, c-format msgid " --describe-config describe configuration parameters, then exit\n" msgstr " --describe-config описати параметри конфігурації і вийти\n" -#: main/main.c:345 +#: main/main.c:347 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати довідку і вийти\n" -#: main/main.c:347 +#: main/main.c:349 #, c-format msgid "\n" "Developer options:\n" msgstr "\n" "Параметри для розробників:\n" -#: main/main.c:348 +#: 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:349 +#: main/main.c:351 #, c-format msgid " -O allow system table structure changes\n" msgstr " -O дозволити змінювати структуру системних таблиць\n" -#: main/main.c:350 +#: main/main.c:352 #, c-format msgid " -P disable system indexes\n" msgstr " -P вимкнути системні індекси\n" -#: main/main.c:351 +#: 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:352 +#: main/main.c:354 #, c-format msgid " -T send SIGABRT to all backend processes if one dies\n" msgstr " -T надіслати SIGABRT усім внутрішнім процесам, якщо один вимкнеться\n" -#: main/main.c:353 +#: 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:355 +#: main/main.c:357 #, c-format msgid "\n" "Options for single-user mode:\n" msgstr "\n" "Параметри для однокористувацького режиму:\n" -#: main/main.c:356 +#: main/main.c:358 #, c-format msgid " --single selects single-user mode (must be first argument)\n" msgstr " --single установка однокористувацького режиму (цей аргумент повинен бути першим)\n" -#: main/main.c:357 +#: main/main.c:359 #, c-format msgid " DBNAME database name (defaults to user name)\n" msgstr " DBNAME ім’я бази даних (за замовчуванням - ім'я користувача)\n" -#: main/main.c:358 +#: main/main.c:360 #, c-format msgid " -d 0-5 override debugging level\n" msgstr " -d 0-5 змінити рівень налагодження\n" -#: main/main.c:359 +#: main/main.c:361 #, c-format msgid " -E echo statement before execution\n" msgstr " -E інструкція відлуння перед виконанням\n" -#: main/main.c:360 +#: main/main.c:362 #, c-format msgid " -j do not use newline as interactive query delimiter\n" msgstr " -j не використовувати новий рядок як роздільник інтерактивних запитів\n" -#: main/main.c:361 main/main.c:367 +#: 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:363 +#: main/main.c:365 #, c-format msgid "\n" "Options for bootstrapping mode:\n" msgstr "\n" "Параметри для режиму початкового завантаження:\n" -#: main/main.c:364 +#: main/main.c:366 #, c-format msgid " --boot selects bootstrapping mode (must be first argument)\n" msgstr " --boot установка режиму початкового завантаження (цей аргумент повинен бути першим)\n" -#: main/main.c:365 +#: main/main.c:367 #, c-format msgid " --check selects check mode (must be first argument)\n" msgstr " --check обирає режим перевірки (має бути першим аргументом)\n" -#: main/main.c:366 +#: main/main.c:368 #, c-format msgid " DBNAME database name (mandatory argument in bootstrapping mode)\n" msgstr " DBNAME ім'я бази даних (обов'язковий аргумент у режимі початкового завантаження)\n" -#: main/main.c:369 +#: main/main.c:371 #, c-format msgid "\n" "Please read the documentation for the complete list of run-time\n" @@ -16204,12 +16209,12 @@ msgstr "\n" "Будь-ласка прочитайте інструкцію для повного списку параметрів конфігурації виконання і їх встановлення у командний рядок або в файл конфігурації.\n\n" "Про помилки повідомляйте <%s>.\n" -#: main/main.c:373 +#: main/main.c:375 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашня сторінка %s: <%s>\n" -#: main/main.c:384 +#: main/main.c:386 #, 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" @@ -16218,12 +16223,12 @@ msgid "\"root\" execution of the PostgreSQL server is not permitted.\n" msgstr "Запускати сервер PostgreSQL під іменем \"root\" не дозволено.\n" "Для запобігання компрометації системи безпеки сервер повинен запускати непривілейований користувач. Дивіться документацію, щоб дізнатися більше про те, як правильно запустити сервер.\n" -#: main/main.c:401 +#: main/main.c:403 #, c-format msgid "%s: real and effective user IDs must match\n" msgstr "%s: дійсний і ефективний ID користувача повинні збігатися\n" -#: main/main.c:408 +#: main/main.c:410 #, c-format msgid "Execution of PostgreSQL by a user with administrative permissions is not\n" "permitted.\n" @@ -16243,14 +16248,14 @@ msgstr "розширений тип вузла \"%s\" вже існує" msgid "ExtensibleNodeMethods \"%s\" was not registered" msgstr "Методи розширеного вузла \"%s\" не зареєстровані" -#: nodes/makefuncs.c:152 statistics/extended_stats.c:2310 +#: 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: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 +#: 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" @@ -16266,13 +16271,13 @@ msgstr "портал \"%s\" з параметрами: %s" msgid "unnamed portal with parameters: %s" msgstr "портал без імені з параметрами: %s" -#: optimizer/path/joinrels.c:972 +#: 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:1696 +#: rewrite/rewriteHandler.c:1680 #, c-format msgid "cannot execute MERGE on relation \"%s\"" msgstr "не можна виконати MERGE для відношення \"%s\"" @@ -16284,44 +16289,44 @@ 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:1386 parser/analyze.c:1771 parser/analyze.c:2029 +#: 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:2127 optimizer/plan/planner.c:4113 +#: 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:2128 optimizer/plan/planner.c:4114 -#: optimizer/plan/planner.c:4795 optimizer/prep/prepunion.c:1320 +#: 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:4794 +#: optimizer/plan/planner.c:4789 #, c-format msgid "could not implement DISTINCT" msgstr "не вдалося реалізувати DISTINCT" -#: optimizer/plan/planner.c:6139 +#: optimizer/plan/planner.c:6134 #, c-format msgid "could not implement window PARTITION BY" msgstr "не вдалося реалізувати PARTITION BY для вікна" -#: optimizer/plan/planner.c:6140 +#: optimizer/plan/planner.c:6135 #, c-format msgid "Window partitioning columns must be of sortable datatypes." msgstr "Стовпці, що розділяють вікна, повинні мати типи даних з можливістю сортування." -#: optimizer/plan/planner.c:6144 +#: optimizer/plan/planner.c:6139 #, c-format msgid "could not implement window ORDER BY" msgstr "не вдалося реалізувати ORDER BY для вікна" -#: optimizer/plan/planner.c:6145 +#: optimizer/plan/planner.c:6140 #, c-format msgid "Window ordering columns must be of sortable datatypes." msgstr "Стовпці, що впорядковують вікна, повинні мати типи даних з можливістю сортування." @@ -16342,7 +16347,7 @@ msgstr "Усі стовпці повинні мати типи даних з м msgid "could not implement %s" msgstr "не вдалося реалізувати %s" -#: optimizer/util/clauses.c:4951 +#: optimizer/util/clauses.c:4963 #, c-format msgid "SQL function \"%s\" during inlining" msgstr "Впроваджена в код SQL-функція \"%s\"" @@ -16799,7 +16804,7 @@ msgstr "агрегат зовнішнього рівня не може міст msgid "aggregate function calls cannot contain set-returning function calls" msgstr "виклики агрегатної функції не можуть містити викликів функції, що повертають множину" -#: parser/parse_agg.c:780 parser/parse_expr.c:1762 parser/parse_expr.c:2245 +#: 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." @@ -17198,8 +17203,8 @@ 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:3405 -#: parser/parse_expr.c:3634 parser/parse_target.c:998 +#: 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" @@ -17234,121 +17239,121 @@ 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 +#: 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 +#: 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:632 utils/fmgr/funcapi.c:697 +#: 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" -#: 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 "Результат внутрішнього типу потребує ввести як мінімум один внутрішній тип." @@ -17592,13 +17597,13 @@ msgid "there is no parameter $%d" msgstr "параметр $%d не існує" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1103 parser/parse_expr.c:3065 +#: parser/parse_expr.c:1103 parser/parse_expr.c:3073 #, c-format msgid "%s requires = operator to yield boolean" -msgstr "" +msgstr "%s потребує, щоб оператор = повертав логічне значення" #. translator: %s is name of a SQL construct, eg NULLIF -#: parser/parse_expr.c:1109 parser/parse_expr.c:3072 +#: parser/parse_expr.c:1109 parser/parse_expr.c:3080 #, c-format msgid "%s must not return a set" msgstr "%s не повинна повертати набір" @@ -17606,7 +17611,7 @@ 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 "" +msgstr "MERGE_ACTION() можна використовувати лише в списку RETURNING для команди MERGE" #: parser/parse_expr.c:1519 parser/parse_expr.c:1551 #, c-format @@ -17619,7 +17624,7 @@ msgid "source for a multiple-column UPDATE item must be a sub-SELECT or ROW() ex msgstr "джерелом для елементу UPDATE з декількома стовпцями повинен бути вкладений SELECT або вираз ROW()" #. 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 +#: 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" @@ -17676,7 +17681,7 @@ msgstr "не можна використовувати підзапити в у msgid "cannot use subquery in column generation expression" msgstr "у виразі генерації стовпців не можна використовувати підзапити" -#: parser/parse_expr.c:1914 parser/parse_expr.c:3764 +#: parser/parse_expr.c:1914 parser/parse_expr.c:3772 #, c-format msgid "subquery must return only one column" msgstr "підзапит повинен повертати лише один стовпець" @@ -17691,249 +17696,254 @@ msgstr "підзапит має занадто багато стовпців" msgid "subquery has too few columns" msgstr "підзапит має занадто мало стовпців" -#: parser/parse_expr.c:2086 +#: parser/parse_expr.c:2094 #, c-format msgid "cannot determine type of empty array" msgstr "тип пустого масиву визначити не можна" -#: parser/parse_expr.c:2087 +#: 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:2101 +#: parser/parse_expr.c:2109 #, c-format msgid "could not find element type for data type %s" msgstr "не вдалося знайти тип елементу для типу даних %s" -#: parser/parse_expr.c:2184 +#: parser/parse_expr.c:2192 #, c-format msgid "ROW expressions can have at most %d entries" msgstr "ROW вирази можуть мати максимум %d елементів" -#: parser/parse_expr.c:2389 +#: parser/parse_expr.c:2397 #, c-format msgid "unnamed XML attribute value must be a column reference" msgstr "замість значення XML-атрибуту без імені повинен вказуватись стовпець" -#: parser/parse_expr.c:2390 +#: parser/parse_expr.c:2398 #, c-format msgid "unnamed XML element value must be a column reference" msgstr "замість значення XML-елементу без імені повинен вказуватись стовпець" -#: parser/parse_expr.c:2405 +#: parser/parse_expr.c:2413 #, c-format msgid "XML attribute name \"%s\" appears more than once" msgstr "Ім'я XML-атрибуту \"%s\" з'являється неодноразово" -#: parser/parse_expr.c:2513 +#: parser/parse_expr.c:2521 #, c-format msgid "cannot cast XMLSERIALIZE result to %s" msgstr "привести результат XMLSERIALIZE до %s не можна" -#: parser/parse_expr.c:2827 parser/parse_expr.c:3023 +#: 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:2837 +#: parser/parse_expr.c:2845 #, c-format msgid "cannot compare rows of zero length" msgstr "рядки нульової довжини порівнювати не можна" -#: parser/parse_expr.c:2862 +#: parser/parse_expr.c:2870 #, c-format msgid "row comparison operator must yield type boolean, not type %s" msgstr "оператор порівняння рядків повинен видавати логічний тип, а не %s" -#: parser/parse_expr.c:2869 +#: parser/parse_expr.c:2877 #, c-format msgid "row comparison operator must not return a set" msgstr "оператор порівняння рядків повинен вертати набір" -#: parser/parse_expr.c:2928 parser/parse_expr.c:2969 +#: 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:2930 +#: parser/parse_expr.c:2938 #, c-format msgid "Row comparison operators must be associated with btree operator families." msgstr "Оператори порівняння рядків повинні бути пов'язанні з сімейством операторів btree." -#: parser/parse_expr.c:2971 +#: parser/parse_expr.c:2979 #, c-format msgid "There are multiple equally-plausible candidates." msgstr "Існує декілька рівноцінних кандидатів." -#: parser/parse_expr.c:3306 +#: 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:3370 +#: 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:3371 +#: 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:3460 +#: parser/parse_expr.c:3468 #, c-format msgid "cannot use JSON format with non-string output types" msgstr "використовувати формат JSON з типами виводу, які не є string не можна" -#: parser/parse_expr.c:3473 +#: parser/parse_expr.c:3481 #, c-format msgid "cannot set JSON encoding for non-bytea output types" msgstr "встановити кодування JSON для типів виводу, які не є bytea не можна" -#: parser/parse_expr.c:3478 +#: parser/parse_expr.c:3486 #, c-format msgid "unsupported JSON encoding" msgstr "непідтримуване JSON кодування" -#: parser/parse_expr.c:3479 +#: parser/parse_expr.c:3487 #, c-format msgid "Only UTF8 JSON encoding is supported." msgstr "Підтримується лише кодування UTF8 формату JSON." -#: parser/parse_expr.c:3516 +#: parser/parse_expr.c:3524 #, c-format msgid "returning SETOF types is not supported in SQL/JSON functions" msgstr "повернення типів SETOF не підтримується у функціях SQL/JSON" -#: parser/parse_expr.c:3521 +#: parser/parse_expr.c:3529 #, c-format msgid "returning pseudo-types is not supported in SQL/JSON functions" -msgstr "" +msgstr "повернення псевдо-типів не підтримується у функціях SQL/JSON" -#: parser/parse_expr.c:3849 parser/parse_func.c:866 +#: 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:4072 +#: 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:4092 +#: parser/parse_expr.c:4100 #, c-format msgid "cannot use type %s in IS JSON predicate" msgstr "використовувати тип %s в предикаті IS JSON не можна" -#: parser/parse_expr.c:4118 parser/parse_expr.c:4238 +#: 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 "cannot use RETURNING type %s in %s" -msgstr "не можна використовувати тип RETURNING %s в %s" +msgid "Try returning json or jsonb." +msgstr "Спробуйте повернути json або jsonb." -#: parser/parse_expr.c:4167 +#: 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:4241 +#: parser/parse_expr.c:4250 #, c-format msgid "Try returning a string type or bytea." msgstr "Спробуйте повернути тип string або bytea." -#: parser/parse_expr.c:4306 +#: parser/parse_expr.c:4315 #, c-format msgid "cannot specify FORMAT JSON in RETURNING clause of %s()" -msgstr "" +msgstr "не можна вказати FORMAT JSON в реченні RETURNING %s()" -#: parser/parse_expr.c:4319 +#: parser/parse_expr.c:4328 #, c-format msgid "SQL/JSON QUOTES behavior must not be specified when WITH WRAPPER is used" -msgstr "" +msgstr "Поведінка SQL/JSON QUOTES не повинна визначатися, коли використовується WITH WRAPPER" #. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4333 parser/parse_expr.c:4362 parser/parse_expr.c:4393 -#: parser/parse_expr.c:4419 parser/parse_expr.c:4445 +#: 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 "" +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:4336 parser/parse_expr.c:4365 +#: 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 "" +msgstr "Тільки ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, або DEFAULT вираз дозволений в %s для %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:4343 parser/parse_expr.c:4372 parser/parse_expr.c:4401 -#: parser/parse_expr.c:4429 parser/parse_expr.c:4455 +#: 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 "" +msgstr "неприпустима поведінка %s для стовпця \"%s \"" #. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4346 parser/parse_expr.c:4375 +#: 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 "" +msgstr "Тільки ERROR, NULL, EMPTY ARRAY, EMPTY OBJECT, або DEFAULT вираз дозволений в %s для форматованих стовпців." -#: parser/parse_expr.c:4394 +#: parser/parse_expr.c:4403 #, c-format msgid "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for %s." -msgstr "" +msgstr "Тільки ERROR, TRUE, FALSE, або UNKNOWN дозволені в %s для %s." #. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4404 +#: parser/parse_expr.c:4413 #, c-format msgid "Only ERROR, TRUE, FALSE, or UNKNOWN is allowed in %s for EXISTS columns." -msgstr "" +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:4422 parser/parse_expr.c:4448 +#: 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 "" +msgstr "Тільки ERROR, NULL або DEFAULT вираз дозволений в %s для %s." #. translator: %s is name of a SQL/JSON clause (eg. ON EMPTY) -#: parser/parse_expr.c:4432 parser/parse_expr.c:4458 +#: 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 "" +msgstr "Тільки ERROR, NULL або DEFAULT вираз дозволений в %s для скалярних стовпців." -#: parser/parse_expr.c:4488 +#: parser/parse_expr.c:4497 #, c-format msgid "JSON path expression must be of type %s, not of type %s" -msgstr "" +msgstr "вираз шляху JSON повинен бути типом %s, а не %s" -#: parser/parse_expr.c:4706 +#: parser/parse_expr.c:4715 #, c-format msgid "can only specify a constant, non-aggregate function, or operator expression for DEFAULT" -msgstr "" +msgstr "можна вказати лише константу, не агрегатну функцію або вираз операторів для DEFAULT" -#: parser/parse_expr.c:4711 +#: parser/parse_expr.c:4720 #, c-format msgid "DEFAULT expression must not contain column references" -msgstr "" +msgstr "вираз DEFAULT не повинен містити посилання на стовпець" -#: parser/parse_expr.c:4716 +#: parser/parse_expr.c:4725 #, c-format msgid "DEFAULT expression must not return a set" -msgstr "" +msgstr "вираз DEFAULT не повинен повертати набір" -#: parser/parse_expr.c:4792 parser/parse_expr.c:4801 +#: parser/parse_expr.c:4801 parser/parse_expr.c:4810 #, c-format msgid "cannot cast behavior expression of type %s to %s" -msgstr "" +msgstr "неможливо привести тип виразу %s до %s" -#: parser/parse_expr.c:4795 +#: parser/parse_expr.c:4804 #, c-format msgid "You will need to explicitly cast the expression to type %s." -msgstr "" +msgstr "Вам необхідно явно привести вираз до типу %s." #: parser/parse_func.c:194 #, c-format @@ -18278,12 +18288,12 @@ msgstr "функції, що повертають множину не можна #: parser/parse_jsontable.c:95 #, c-format msgid "Only EMPTY [ ARRAY ] or ERROR is allowed in the top-level ON ERROR clause." -msgstr "" +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 "" +msgstr "дублікат назви стовпця JSON_TABLE або шляху: %s" #: parser/parse_merge.c:129 #, c-format @@ -18631,7 +18641,7 @@ msgstr "створити секціоновану таблицю в якості #: parser/parse_utilcmd.c:475 #, c-format msgid "cannot set logged status of a temporary sequence" -msgstr "" +msgstr "неможливо встановити статус журналювання тимчасової послідовності" #: parser/parse_utilcmd.c:611 #, c-format @@ -18801,7 +18811,7 @@ msgid "rules with WHERE conditions can only have SELECT, INSERT, UPDATE, or DELE msgstr "правила з умовами WHERE можуть мати лише дії SELECT, INSERT, UPDATE або DELETE" #: parser/parse_utilcmd.c:3136 parser/parse_utilcmd.c:3237 -#: rewrite/rewriteHandler.c:538 rewrite/rewriteManip.c:1095 +#: rewrite/rewriteHandler.c:544 rewrite/rewriteManip.c:1096 #, c-format msgid "conditional UNION/INTERSECT/EXCEPT statements are not implemented" msgstr "умовні оператори UNION/INTERSECT/EXCEPT не реалізовані" @@ -18904,7 +18914,7 @@ msgstr "неприпустима вказівка границі для геш- #: 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:4038 partitioning/partbounds.c:4810 #, c-format @@ -19029,7 +19039,7 @@ msgstr "пропущено сканування зовнішньої табли #: 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:4830 #, c-format @@ -19052,7 +19062,7 @@ msgid "column %d of the partition key has type \"%s\", but supplied value is of msgstr "стовпець %d ключа секціонування має тип \"%s\", але для нього вказано значення типу \"%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 +#: port/sysv_sema.c:329 port/sysv_shmem.c:717 #, c-format msgid "could not stat data directory \"%s\": %m" msgstr "не вдалося встановити дані каталогу \"%s\": %m" @@ -19091,7 +19101,7 @@ 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 "" +msgstr "\"huge_page_size\" повинен бути 0 на цій платформі." #: port/pg_shmem.c:655 port/sysv_shmem.c:655 #, c-format @@ -19101,7 +19111,7 @@ msgstr "не вдалося показати анонімну спільну п #: 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 "" +msgstr "Ця помилка зазвичай означає, що запит PostgreSQL для сегменту спільної пам'яті перевищує об'єм доступної фізичної або віртуальної пам'яті або гігантських сторінок. Щоб зменшити розмір запиту (поточний: %zu байтів), зменшіть використання спільної пам'яті PostgreSQL, можливо зменшив \"shared_buffers\" або \"max_connections\"." #: port/pg_shmem.c:725 port/sysv_shmem.c:725 #, c-format @@ -19111,35 +19121,36 @@ 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 "" +msgstr "величезні сторінки не підтримуються з поточним параметром \"shared_memory_type\"" -#: port/pg_shmem.c:798 port/sysv_shmem.c:798 utils/init/miscinit.c:1347 +#: 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:801 port/sysv_shmem.c:801 utils/init/miscinit.c:1349 +#: 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" "The PostgreSQL documentation contains more information about configuring your system for PostgreSQL." -msgstr "" +msgstr "Ця помилка НЕ означає, що на диску немає місця. Ймовірніше за все перевищено ліміт числа встановлених семафорів (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 "Можливо, вам потрібно збілшити значення SEMVMX вашого ядра, мінімум до %d. Детальніше про це написано в інструкції PostgreSQL." @@ -19269,32 +19280,32 @@ msgstr "Помилка в системному виклику MapViewOfFileEx." msgid "autovacuum worker took too long to start; canceled" msgstr "старт процеса автовакуума зайняв забагато часу; скасовано" -#: postmaster/autovacuum.c:2199 +#: postmaster/autovacuum.c:2203 #, c-format msgid "autovacuum: dropping orphan temp table \"%s.%s.%s\"" msgstr "автоочистка: видалення застарілої тимчасової таблиці \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2435 +#: postmaster/autovacuum.c:2439 #, c-format msgid "automatic vacuum of table \"%s.%s.%s\"" msgstr "автоматична очистка таблиці \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2438 +#: postmaster/autovacuum.c:2442 #, c-format msgid "automatic analyze of table \"%s.%s.%s\"" msgstr "автоматичний аналіз таблиці \"%s.%s.%s\"" -#: postmaster/autovacuum.c:2632 +#: postmaster/autovacuum.c:2636 #, c-format msgid "processing work entry for relation \"%s.%s.%s\"" msgstr "обробка робочого введення для відношення \"%s.%s.%s\"" -#: postmaster/autovacuum.c:3250 +#: postmaster/autovacuum.c:3254 #, c-format msgid "autovacuum not started because of misconfiguration" msgstr "автоочистку не запущено через неправильну конфігурацію" -#: postmaster/autovacuum.c:3251 +#: postmaster/autovacuum.c:3255 #, c-format msgid "Enable the \"track_counts\" option." msgstr "Активувати параметр \"track_counts\"." @@ -19332,7 +19343,7 @@ msgstr "завершення фонового процесу \"%s\" по ком #: postmaster/bgworker.c:888 #, c-format msgid "background worker \"%s\": must be registered in \"shared_preload_libraries\"" -msgstr "" +msgstr "фоновий процес \"%s\": повинен бути зареєстрований в \"shared_preload_libraries\"" #: postmaster/bgworker.c:911 #, c-format @@ -19356,7 +19367,7 @@ msgstr[3] "Максимальне можливе число фонових пр #: postmaster/bgworker.c:931 postmaster/checkpointer.c:445 #, c-format msgid "Consider increasing the configuration parameter \"%s\"." -msgstr "" +msgstr "Можливо, слід збільшити параметр конфігурації \"%s\"." #: postmaster/checkpointer.c:441 #, c-format @@ -19435,22 +19446,22 @@ msgstr "не вдалося створити успадкований сокет #: postmaster/launch_backend.c:895 #, c-format msgid "could not open backend variables file \"%s\": %m\n" -msgstr "" +msgstr "не вдалося відкрити внутрішні змінні файли \"%s\": %m\n" #: postmaster/launch_backend.c:901 #, c-format msgid "could not read from backend variables file \"%s\": %m\n" -msgstr "" +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 "" +msgstr "не вдалося прочитати стартові дані у файлах внутрішніх змінних \"%s\": %m\n" #: postmaster/launch_backend.c:924 #, c-format msgid "could not remove file \"%s\": %m\n" -msgstr "" +msgstr "не вдалося видалити файл \"%s\": %m\n" #: postmaster/launch_backend.c:940 #, c-format @@ -19470,7 +19481,7 @@ msgstr "не вдалося закрити покажчик файлу серв #: postmaster/pgarch.c:428 #, c-format msgid "\"archive_mode\" enabled, yet archiving is not configured" -msgstr "" +msgstr "\"archive_mode\" активовано, але архівування не налаштовано" #: postmaster/pgarch.c:452 #, c-format @@ -19490,12 +19501,12 @@ msgstr "архівація файлу випереджувальног журн #: postmaster/pgarch.c:879 postmaster/pgarch.c:918 #, c-format msgid "both \"archive_command\" and \"archive_library\" set" -msgstr "" +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 "" +msgstr "Можливо встановити лише одну з \"archive_command\", \"archive_library\"." #: postmaster/pgarch.c:897 #, c-format @@ -19530,12 +19541,12 @@ 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 "" +msgstr "%s: \"superuser_reserved_connections\" (%d) плюс \"reserved_connections\" (%d) має бути меншим за \"max_connections\" (%d)\n" #: postmaster/postmaster.c:833 #, c-format msgid "WAL archival cannot be enabled when \"wal_level\" is \"minimal\"" -msgstr "" +msgstr "WAL архіватор не може бути активованим, коли \"wal_level\" встановлено в \"minimal\"" #: postmaster/postmaster.c:836 #, c-format @@ -19618,32 +19629,32 @@ msgstr "%s: не вдалося записати зовнішній PID файл msgid "could not load %s" msgstr "не вдалося завантажити %s" -#: postmaster/postmaster.c:1340 +#: postmaster/postmaster.c:1342 #, c-format msgid "postmaster became multithreaded during startup" msgstr "адміністратор поштового сервера став багатопотоковим під час запуску" -#: postmaster/postmaster.c:1341 +#: 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:1440 +#: postmaster/postmaster.c:1442 #, c-format msgid "%s: could not locate my own executable path" msgstr "%s: не вдалося знайти свій власний шлях для виконання" -#: postmaster/postmaster.c:1447 +#: postmaster/postmaster.c:1449 #, c-format msgid "%s: could not locate matching postgres executable" msgstr "%s: не вдалося знайти відповідний postgres файл, що виконується" -#: postmaster/postmaster.c:1470 utils/misc/tzparser.c:341 +#: 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:1497 +#: postmaster/postmaster.c:1499 #, c-format msgid "%s: could not find the database system\n" "Expected to find it in the directory \"%s\",\n" @@ -19653,242 +19664,242 @@ msgstr "%s: не вдалося знайти систему бази даних\ "але не вдалося відкрити файл \"%s\": %m\n" #. translator: %s is SIGKILL or SIGABRT -#: postmaster/postmaster.c:1787 +#: postmaster/postmaster.c:1789 #, c-format msgid "issuing %s to recalcitrant children" msgstr "надсилання %s непокірливим дітям" -#: postmaster/postmaster.c:1809 +#: postmaster/postmaster.c:1811 #, c-format msgid "performing immediate shutdown because data directory lock file is invalid" msgstr "виконується негайне припинення роботи через неприпустимий файл блокування каталогу даних" -#: postmaster/postmaster.c:1872 +#: postmaster/postmaster.c:1874 #, c-format msgid "wrong key in cancel request for process %d" msgstr "неправильний ключ в запиті скасування процесу %d" -#: postmaster/postmaster.c:1884 +#: postmaster/postmaster.c:1886 #, c-format msgid "PID %d in cancel request did not match any process" msgstr "PID %d в запиті на скасування не відповідає жодному процесу" -#: postmaster/postmaster.c:2105 +#: postmaster/postmaster.c:2106 #, c-format msgid "received SIGHUP, reloading configuration files" msgstr "отримано SIGHUP, поновлення файлів конфігурацій" #. translator: %s is a configuration file -#: postmaster/postmaster.c:2133 postmaster/postmaster.c:2137 +#: postmaster/postmaster.c:2134 postmaster/postmaster.c:2138 #, c-format msgid "%s was not reloaded" msgstr "%s не було перезавантажено" -#: postmaster/postmaster.c:2147 +#: postmaster/postmaster.c:2148 #, c-format msgid "SSL configuration was not reloaded" msgstr "Конфігурація протоколу SSL не була перезавантажена" -#: postmaster/postmaster.c:2233 +#: postmaster/postmaster.c:2234 #, c-format msgid "received smart shutdown request" msgstr "отримано smart запит на завершення роботи" -#: postmaster/postmaster.c:2274 +#: postmaster/postmaster.c:2275 #, c-format msgid "received fast shutdown request" msgstr "отримано швидкий запит на завершення роботи" -#: postmaster/postmaster.c:2292 +#: postmaster/postmaster.c:2293 #, c-format msgid "aborting any active transactions" msgstr "переривання будь-яких активних транзакцій" -#: postmaster/postmaster.c:2316 +#: postmaster/postmaster.c:2317 #, c-format msgid "received immediate shutdown request" msgstr "отримано запит на негайне завершення роботи" -#: postmaster/postmaster.c:2388 +#: postmaster/postmaster.c:2389 #, c-format msgid "shutdown at recovery target" msgstr "завершення роботи при відновленні мети" -#: postmaster/postmaster.c:2406 postmaster/postmaster.c:2442 +#: postmaster/postmaster.c:2407 postmaster/postmaster.c:2443 msgid "startup process" msgstr "стартовий процес" -#: postmaster/postmaster.c:2409 +#: postmaster/postmaster.c:2410 #, c-format msgid "aborting startup due to startup process failure" msgstr "переривання запуску через помилку в стартовому процесі" -#: postmaster/postmaster.c:2484 +#: postmaster/postmaster.c:2485 #, c-format msgid "database system is ready to accept connections" msgstr "система бази даних готова до отримання підключення" -#: postmaster/postmaster.c:2505 +#: postmaster/postmaster.c:2506 msgid "background writer process" msgstr "процес фонового запису" -#: postmaster/postmaster.c:2552 +#: postmaster/postmaster.c:2553 msgid "checkpointer process" msgstr "процес контрольних точок" -#: postmaster/postmaster.c:2568 +#: postmaster/postmaster.c:2569 msgid "WAL writer process" msgstr "Процес запису WAL" -#: postmaster/postmaster.c:2583 +#: postmaster/postmaster.c:2584 msgid "WAL receiver process" msgstr "Процес отримання WAL" -#: postmaster/postmaster.c:2597 +#: postmaster/postmaster.c:2598 msgid "WAL summarizer process" msgstr "Процес підсумовування WAL" -#: postmaster/postmaster.c:2612 +#: postmaster/postmaster.c:2613 msgid "autovacuum launcher process" msgstr "процес запуску автоочистки" -#: postmaster/postmaster.c:2630 +#: postmaster/postmaster.c:2631 msgid "archiver process" msgstr "процес архівації" -#: postmaster/postmaster.c:2643 +#: postmaster/postmaster.c:2644 msgid "system logger process" msgstr "процес системного журналювання" -#: postmaster/postmaster.c:2660 +#: postmaster/postmaster.c:2661 msgid "slot sync worker process" msgstr "робочий процес синхронізації слоту" -#: postmaster/postmaster.c:2716 +#: postmaster/postmaster.c:2717 #, c-format msgid "background worker \"%s\"" msgstr "фоновий виконавець \"%s\"" -#: postmaster/postmaster.c:2795 postmaster/postmaster.c:2815 -#: postmaster/postmaster.c:2822 postmaster/postmaster.c:2840 +#: postmaster/postmaster.c:2796 postmaster/postmaster.c:2816 +#: postmaster/postmaster.c:2823 postmaster/postmaster.c:2841 msgid "server process" msgstr "процес сервера" -#: postmaster/postmaster.c:2894 +#: 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:3081 +#: postmaster/postmaster.c:3082 #, 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 +#: 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:3092 +#: postmaster/postmaster.c:3093 #, 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 +#: 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:3114 +#: postmaster/postmaster.c:3115 #, c-format msgid "%s (PID %d) exited with unrecognized status %d" msgstr "%s (PID %d) завершився з нерозпізнаним статусом %d" -#: postmaster/postmaster.c:3330 +#: postmaster/postmaster.c:3331 #, c-format msgid "abnormal database system shutdown" msgstr "ненормальне завершення роботи системи бази даних" -#: postmaster/postmaster.c:3356 +#: postmaster/postmaster.c:3357 #, c-format msgid "shutting down due to startup process failure" msgstr "завершення роботи через помилку в стартовому процесі" -#: postmaster/postmaster.c:3362 +#: postmaster/postmaster.c:3363 #, c-format msgid "shutting down because \"restart_after_crash\" is off" msgstr "завершення роботи, тому що \"restart_after_crash\" вимкнено" -#: postmaster/postmaster.c:3374 +#: postmaster/postmaster.c:3375 #, c-format msgid "all server processes terminated; reinitializing" msgstr "усі серверні процеси перервано; повторна ініціалізація" -#: postmaster/postmaster.c:3573 postmaster/postmaster.c:3983 -#: postmaster/postmaster.c:4372 +#: 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:3606 +#: postmaster/postmaster.c:3607 #, c-format msgid "could not fork new process for connection: %m" msgstr "не вдалося породити нові процеси для з'єднання: %m" -#: postmaster/postmaster.c:3648 +#: postmaster/postmaster.c:3649 msgid "could not fork new process for connection: " msgstr "не вдалося породити нові процеси для з'єднання: " -#: postmaster/postmaster.c:3682 +#: postmaster/postmaster.c:3683 #, c-format -msgid "Please report this to <%s>." -msgstr "Будь-ласка повідомте про це <%s>." +msgid "postmaster became multithreaded" +msgstr "postmaster став багатопотоковим" -#: postmaster/postmaster.c:3750 +#: postmaster/postmaster.c:3752 #, c-format msgid "database system is ready to accept read-only connections" msgstr "система бази даних готова до отримання підключення лише для читання" -#: postmaster/postmaster.c:3933 +#: postmaster/postmaster.c:3935 #, c-format msgid "could not fork \"%s\" process: %m" msgstr "не вдалося породити процес \"%s\": %m" -#: postmaster/postmaster.c:4171 postmaster/postmaster.c:4205 +#: postmaster/postmaster.c:4173 postmaster/postmaster.c:4207 #, c-format msgid "database connection requirement not indicated during registration" msgstr "під час реєстрації не вказувалося, що вимагається підключення до бази даних" -#: postmaster/postmaster.c:4181 postmaster/postmaster.c:4215 +#: postmaster/postmaster.c:4183 postmaster/postmaster.c:4217 #, c-format msgid "invalid processing mode in background worker" msgstr "неприпустимий режим обробки у фоновому записі" -#: postmaster/postmaster.c:4275 +#: postmaster/postmaster.c:4277 #, c-format msgid "could not fork background worker process: %m" msgstr "не вдалося породити фоновий процес: %m" -#: postmaster/postmaster.c:4358 +#: postmaster/postmaster.c:4360 #, c-format msgid "no slot available for new background worker process" msgstr "немає доступного слоту для нового фонового робочого процесу" -#: postmaster/postmaster.c:4621 +#: postmaster/postmaster.c:4623 #, c-format msgid "could not read exit code for process\n" msgstr "не вдалося прочитати код завершення процесу\n" -#: postmaster/postmaster.c:4663 +#: postmaster/postmaster.c:4665 #, c-format msgid "could not post child completion status\n" msgstr "не вдалося надіслати статус завершення нащадка\n" @@ -20186,9 +20197,9 @@ msgstr "недостатньо слотів для процесів логічн #: 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:2826 storage/lmgr/lock.c:4211 storage/lmgr/lock.c:4276 -#: storage/lmgr/lock.c:4626 storage/lmgr/predicate.c:2464 -#: storage/lmgr/predicate.c:2479 storage/lmgr/predicate.c:3876 +#: 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 "Можливо, вам слід збільшити \"%s\"." @@ -20394,7 +20405,7 @@ msgid "could not find free replication state slot for replication origin with ID msgstr "не вдалося знайти вільний слот стану реплікації для джерела реплікації з ID %d" #: replication/logical/origin.c:957 replication/logical/origin.c:1158 -#: replication/slot.c:2384 +#: replication/slot.c:2401 #, c-format msgid "Increase \"max_replication_slots\" and try again." msgstr "Збільшіть \"max_replication_slots\" і спробуйте знову." @@ -20449,29 +20460,29 @@ msgstr "в цільовому відношенні логічної реплік msgid "logical replication target relation \"%s.%s\" does not exist" msgstr "цільове відношення логічної реплікації \"%s.%s\" не існує" -#: replication/logical/reorderbuffer.c:3994 +#: 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:4340 -#: replication/logical/reorderbuffer.c:4365 +#: 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:4344 -#: replication/logical/reorderbuffer.c:4369 +#: 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:4619 +#: 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:5115 +#: replication/logical/reorderbuffer.c:5120 #, c-format msgid "could not read from file \"%s\": read %d instead of %d bytes" msgstr "не вдалося прочитати з файлу \"%s\": прочитано %d замість %d байт" @@ -20598,7 +20609,7 @@ msgstr "не може синхронізувати слоти реплікаці msgid "slot sync worker started" msgstr "запущено працівника синхронізації слотів" -#: replication/logical/slotsync.c:1466 replication/slotfuncs.c:900 +#: replication/logical/slotsync.c:1466 replication/slotfuncs.c:905 #: replication/walreceiver.c:307 #, c-format msgid "could not connect to the primary server: %s" @@ -20744,197 +20755,197 @@ msgstr "Неможливо обробляти транзакції потоко msgid "incorrect binary data format in logical replication column %d" msgstr "невірний формат двійкових даних в стовпці логічної реплікації %d" -#: replication/logical/worker.c:2500 +#: 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:2507 +#: 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:3371 +#: replication/logical/worker.c:3382 #, c-format msgid "invalid logical replication message type \"??? (%d)\"" msgstr "неприпустимий тип повідомлення логічної реплікації \"??? (%d)\"" -#: replication/logical/worker.c:3543 +#: replication/logical/worker.c:3554 #, c-format msgid "data stream from publisher has ended" msgstr "потік даних з серверу публікації завершився" -#: replication/logical/worker.c:3697 +#: replication/logical/worker.c:3708 #, c-format msgid "terminating logical replication worker due to timeout" msgstr "завершення процесу логічної реплікації через тайм-аут" -#: replication/logical/worker.c:3891 +#: 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:3905 +#: 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:3936 +#: 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\", буде зупинено через зміну параметру" -#: replication/logical/worker.c:3940 +#: replication/logical/worker.c:3951 #, c-format msgid "logical replication worker for subscription \"%s\" will restart because of a parameter change" msgstr "процес логічної реплікації для підписки \"%s\", буде перезавантажено через зміну параметру" -#: replication/logical/worker.c:3954 +#: replication/logical/worker.c:3965 #, 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 +#: replication/logical/worker.c:3969 #, c-format 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:4478 +#: replication/logical/worker.c:4489 #, c-format msgid "subscription has no replication slot set" msgstr "для підписки не встановлений слот реплікації" -#: replication/logical/worker.c:4591 +#: replication/logical/worker.c:4602 #, 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:4607 +#: replication/logical/worker.c:4618 #, 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:4631 +#: 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:4636 +#: replication/logical/worker.c:4647 #, c-format msgid "logical replication apply worker for subscription \"%s\" has started" msgstr "застосовуючий процес логічної реплікації для підписки \"%s\" запущений" -#: replication/logical/worker.c:4758 +#: replication/logical/worker.c:4769 #, c-format msgid "subscription \"%s\" has been disabled because of an error" msgstr "підписка \"%s\" була відключена через помилку" -#: replication/logical/worker.c:4806 +#: replication/logical/worker.c:4817 #, c-format msgid "logical replication starts skipping transaction at LSN %X/%X" msgstr "логічна реплікація починає пропускати транзакцію в LSN %X/%X" -#: replication/logical/worker.c:4820 +#: replication/logical/worker.c:4831 #, c-format msgid "logical replication completed skipping transaction at LSN %X/%X" msgstr "логічна реплікація завершила пропускати транзакцію в LSN %X/%X" -#: replication/logical/worker.c:4902 +#: replication/logical/worker.c:4913 #, c-format msgid "skip-LSN of subscription \"%s\" cleared" msgstr "очищено LSN пропуску підписки \"%s\"" -#: replication/logical/worker.c:4903 +#: 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 не відповідає skip-LSN %X/%X." -#: replication/logical/worker.c:4940 +#: replication/logical/worker.c:4951 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\"" msgstr "обробка віддалених даних для джерела реплікації \"%s\" під час повідомлення типу \"%s\"" -#: replication/logical/worker.c:4944 +#: replication/logical/worker.c:4955 #, c-format msgid "processing remote data for replication origin \"%s\" during message type \"%s\" in transaction %u" msgstr "обробка віддалених даних для джерела реплікації \"%s\" під час повідомлення типу \"%s\" у транзакції %u" -#: replication/logical/worker.c:4949 +#: 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 "обробку віддалених даних для джерела реплікації \"%s\" під час повідомлення типу \"%s\" у транзакції %u завершено о %X/%X" -#: replication/logical/worker.c:4960 +#: 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 "обробка віддалених даних для джерела реплікації \"%s\" під час повідомлення типу \"%s\" для цільового відношення реплікації \"%s.%s\" в транзакції %u" -#: replication/logical/worker.c:4967 +#: 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 "обробку віддалених даних для джерела реплікації \"%s\" під час повідомлення типу \"%s\" для цільового відношення реплікації \"%s.%s\" в транзакції %u завершено о %X/%X" -#: replication/logical/worker.c:4978 +#: 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 "обробка віддалених даних для джерела реплікації \"%s\" під час повідомлення типу \"%s\" для цільового відношення реплікації \"%s.%s\" стовпчик \"%s\" у транзакції %u" -#: replication/logical/worker.c:4986 +#: 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 "обробку віддалених даних для джерела реплікації \"%s\" під час повідомлення типу \"%s\" для цільового відношення реплікації \"%s.%s\" стовпчик \"%s\" у транзакції %u завершено о %X/%X" -#: replication/pgoutput/pgoutput.c:315 +#: replication/pgoutput/pgoutput.c:322 #, c-format msgid "invalid proto_version" msgstr "неприпустиме значення proto_version" -#: replication/pgoutput/pgoutput.c:320 +#: replication/pgoutput/pgoutput.c:327 #, c-format msgid "proto_version \"%s\" out of range" msgstr "значення proto_version \"%s\" за межами діапазону" -#: replication/pgoutput/pgoutput.c:337 +#: replication/pgoutput/pgoutput.c:344 #, c-format msgid "invalid publication_names syntax" msgstr "неприпустимий синтаксис publication_names" -#: replication/pgoutput/pgoutput.c:407 replication/pgoutput/pgoutput.c:411 +#: replication/pgoutput/pgoutput.c:414 replication/pgoutput/pgoutput.c:418 #, c-format msgid "option \"%s\" missing" msgstr "параметр \"%s\" відсутній" -#: replication/pgoutput/pgoutput.c:452 +#: 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:458 +#: 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:473 +#: 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:479 +#: 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:484 +#: replication/pgoutput/pgoutput.c:510 #, c-format msgid "streaming requested, but not supported by output plugin" msgstr "запитане потокова передавача, але не підтримується плагіном виводу" -#: replication/pgoutput/pgoutput.c:498 +#: 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:503 +#: replication/pgoutput/pgoutput.c:529 #, c-format msgid "two-phase commit requested, but not supported by output plugin" msgstr "запитано двоетапне затвердження, але не підтримується плагіном виводу" @@ -20984,7 +20995,7 @@ msgstr "використовуються всі слоти реплікації" msgid "Free one or increase \"max_replication_slots\"." msgstr "Звільніть непотрібні або збільшіть \"max_replication_slots\"." -#: replication/slot.c:560 replication/slot.c:2453 replication/slotfuncs.c:661 +#: 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" @@ -21108,85 +21119,95 @@ msgstr "файл слоту реплікації \"%s\" має пошкодже msgid "checksum mismatch for replication slot file \"%s\": is %u, should be %u" msgstr "у файлі слоту реплікації \"%s\" невідповідність контрольної суми: %u, повинно бути %u" -#: replication/slot.c:2333 +#: replication/slot.c:2335 #, c-format msgid "logical replication slot \"%s\" exists, but \"wal_level\" < \"logical\"" msgstr "слот логічної реплікації \"%s\" існує, але \"wal_level\" < \"logical\"" -#: replication/slot.c:2335 +#: replication/slot.c:2337 #, c-format msgid "Change \"wal_level\" to be \"logical\" or higher." msgstr "Змініть \"wal_level\" на \"logical\" або вище." -#: replication/slot.c:2339 +#: 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:2351 +#, c-format +msgid "Change \"hot_standby\" to be \"on\"." +msgstr "Змінити \"hot_standby\" у значення \"on\"." + +#: replication/slot.c:2356 #, c-format msgid "physical replication slot \"%s\" exists, but \"wal_level\" < \"replica\"" msgstr "слот фізичної реплікації \"%s\" існує, але \"wal_level\" < \"replica\"" -#: replication/slot.c:2341 +#: replication/slot.c:2358 #, c-format msgid "Change \"wal_level\" to be \"replica\" or higher." msgstr "Змініть \"wal_level\" на \"replica\" або вище." -#: replication/slot.c:2383 +#: replication/slot.c:2400 #, c-format msgid "too many replication slots active before shutdown" msgstr "перед завершенням роботи активно занадто багато слотів реплікації" -#: replication/slot.c:2461 +#: replication/slot.c:2475 #, c-format msgid "\"%s\" is not a physical replication slot" msgstr "\"%s\" не є фізичним слотом реплікації" -#: replication/slot.c:2638 +#: replication/slot.c:2654 #, c-format msgid "replication slot \"%s\" specified in parameter \"%s\" does not exist" msgstr "слот реплікації \"%s\", вказаний в параметрі \"%s\", не існує" -#: replication/slot.c:2640 replication/slot.c:2681 replication/slot.c:2696 +#: 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:2642 +#: replication/slot.c:2658 #, c-format msgid "Create the replication slot \"%s\" or amend parameter \"%s\"." msgstr "Створіть слот реплікації \"%s\" або змініть параметр \"%s\"." -#: replication/slot.c:2659 +#: replication/slot.c:2668 #, c-format msgid "cannot specify logical replication slot \"%s\" in parameter \"%s\"" msgstr "неможливо вказати слот логічної реплікації \"%s\" в параметрі \"%s\"" -#: replication/slot.c:2661 +#: replication/slot.c:2670 #, c-format msgid "Logical replication is waiting for correction on replication slot \"%s\"." msgstr "Логічна реплікація очікує на корекцію на слоті реплікації \"%s\"." -#: replication/slot.c:2663 +#: replication/slot.c:2672 #, c-format msgid "Remove the logical replication slot \"%s\" from parameter \"%s\"." msgstr "Приберіть слот логічної реплікації \"%s\" з параметру \"%s\"." -#: replication/slot.c:2679 +#: replication/slot.c:2688 #, c-format msgid "physical replication slot \"%s\" specified in parameter \"%s\" has been invalidated" -msgstr "" +msgstr "слот фізичної реплікації \"%s\" вказаний у параметрі \"%s\" було анульовано" -#: replication/slot.c:2683 +#: replication/slot.c:2692 #, c-format msgid "Drop and recreate the replication slot \"%s\", or amend parameter \"%s\"." -msgstr "" +msgstr "Видаліть і повторно створіть слот реплікації \"%s\" або змініть параметр \"%s\"." -#: replication/slot.c:2694 +#: replication/slot.c:2703 #, c-format msgid "replication slot \"%s\" specified in parameter \"%s\" does not have active_pid" -msgstr "" +msgstr "слот реплікації \"%s\", вказаний в параметрі \"%s\", не має active_pid" -#: replication/slot.c:2698 +#: replication/slot.c:2707 #, c-format msgid "Start the standby associated with the replication slot \"%s\", or amend parameter \"%s\"." -msgstr "" +msgstr "Запустіть резервний сервер асоційований зі слотом реплікації \"%s\" або змініть параметр \"%s\"." #: replication/slotfuncs.c:526 #, c-format @@ -21223,27 +21244,27 @@ msgstr "не можна скопіювати слот логічної репл msgid "cannot copy a replication slot that doesn't reserve WAL" msgstr "не можна скопіювати слот реплікації, який не резервує WAL" -#: replication/slotfuncs.c:768 +#: replication/slotfuncs.c:773 #, c-format msgid "could not copy replication slot \"%s\"" msgstr "не вдалося скопіювати слот реплікації \"%s\"" -#: replication/slotfuncs.c:770 +#: replication/slotfuncs.c:775 #, c-format msgid "The source replication slot was modified incompatibly during the copy operation." msgstr "Слот реплікації джерела був змінений несумісно під час операції копіювання." -#: replication/slotfuncs.c:776 +#: replication/slotfuncs.c:781 #, c-format msgid "cannot copy unfinished logical replication slot \"%s\"" msgstr "не можна скопіювати незавершений слот логічної реплікації \"%s\"" -#: replication/slotfuncs.c:778 +#: replication/slotfuncs.c:783 #, c-format msgid "Retry when the source replication slot's confirmed_flush_lsn is valid." msgstr "Повторіть, коли confirmed_flush_lsn слоту джерела реплікації є дійсним." -#: replication/slotfuncs.c:877 +#: replication/slotfuncs.c:882 #, c-format msgid "replication slots can only be synchronized to a standby server" msgstr "слоти реплікації можна синхронізувати лише з резервним сервером" @@ -21276,7 +21297,7 @@ msgstr "режим очікування \"%s\" зараз є кандидато #: replication/syncrep.c:1013 #, c-format msgid "\"synchronous_standby_names\" parser failed" -msgstr "" +msgstr "помилка при аналізуванні \"synchronous_standby_names\"" #: replication/syncrep.c:1019 #, c-format @@ -21358,7 +21379,7 @@ msgstr "не вдалося записати у сегмент WAL %s зі зм msgid "cannot use %s with a logical replication slot" msgstr "використовувати %s зі слотом логічної реплікації не можна" -#: replication/walsender.c:635 storage/smgr/md.c:1723 +#: replication/walsender.c:635 storage/smgr/md.c:1735 #, c-format msgid "could not seek to end of file \"%s\": %m" msgstr "не вдалося досягти кінця файлу \"%s\": %m" @@ -21652,286 +21673,286 @@ msgstr "правило \"%s\" для відношення \"%s\" не існує msgid "renaming an ON SELECT rule is not allowed" msgstr "не допускається перейменування правила ON SELECT" -#: rewrite/rewriteHandler.c:582 +#: 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:609 +#: 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:662 +#: rewrite/rewriteHandler.c:668 #, c-format msgid "cannot have RETURNING lists in multiple rules" msgstr "списки RETURNING може мати лише одне правило" -#: rewrite/rewriteHandler.c:894 rewrite/rewriteHandler.c:933 +#: 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:896 rewrite/rewriteHandler.c:962 +#: 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:898 +#: rewrite/rewriteHandler.c:904 #, c-format msgid "Use OVERRIDING SYSTEM VALUE to override." msgstr "Для зміни використайте OVERRIDING SYSTEM VALUE." -#: rewrite/rewriteHandler.c:960 rewrite/rewriteHandler.c:968 +#: 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:1115 rewrite/rewriteHandler.c:1133 +#: rewrite/rewriteHandler.c:1109 rewrite/rewriteHandler.c:1127 #, c-format msgid "multiple assignments to same column \"%s\"" msgstr "кілька завдань для одного стовпця \"%s\"" -#: rewrite/rewriteHandler.c:1698 +#: rewrite/rewriteHandler.c:1682 #, c-format msgid "MERGE is not supported for relations with rules." msgstr "MERGE не підтримує відношення з правилами." -#: rewrite/rewriteHandler.c:1738 rewrite/rewriteHandler.c:3229 +#: rewrite/rewriteHandler.c:1722 rewrite/rewriteHandler.c:3262 #, c-format msgid "access to non-system view \"%s\" is restricted" -msgstr "" +msgstr "доступ до несистемного подання \"%s\" обмежено" -#: rewrite/rewriteHandler.c:2119 rewrite/rewriteHandler.c:4221 +#: 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:2556 +#: rewrite/rewriteHandler.c:2589 msgid "Junk view columns are not updatable." msgstr "Утилізовані стовпці подань не оновлюються." -#: rewrite/rewriteHandler.c:2561 +#: rewrite/rewriteHandler.c:2594 msgid "View columns that are not columns of their base relation are not updatable." msgstr "Стовпці подання, які не є стовпцями базового зв'язку, не оновлюються." -#: rewrite/rewriteHandler.c:2564 +#: rewrite/rewriteHandler.c:2597 msgid "View columns that refer to system columns are not updatable." msgstr "Стовпці подання, які посилаються на системні стовпці, не оновлюються." -#: rewrite/rewriteHandler.c:2567 +#: rewrite/rewriteHandler.c:2600 msgid "View columns that return whole-row references are not updatable." msgstr "Стовпці подання, що повертають посилання на весь рядок, не оновлюються." -#: rewrite/rewriteHandler.c:2628 +#: rewrite/rewriteHandler.c:2661 msgid "Views containing DISTINCT are not automatically updatable." msgstr "Подання які містять DISTINCT не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2631 +#: rewrite/rewriteHandler.c:2664 msgid "Views containing GROUP BY are not automatically updatable." msgstr "Подання які містять GROUP BY не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2634 +#: rewrite/rewriteHandler.c:2667 msgid "Views containing HAVING are not automatically updatable." msgstr "Подання які містять HAVING не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2637 +#: rewrite/rewriteHandler.c:2670 msgid "Views containing UNION, INTERSECT, or EXCEPT are not automatically updatable." msgstr "Подання які містять UNION, INTERSECT, або EXCEPT не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2640 +#: rewrite/rewriteHandler.c:2673 msgid "Views containing WITH are not automatically updatable." msgstr "Подання які містять WITH не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2643 +#: rewrite/rewriteHandler.c:2676 msgid "Views containing LIMIT or OFFSET are not automatically updatable." msgstr "Подання які містять LIMIT або OFFSET не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2655 +#: rewrite/rewriteHandler.c:2688 msgid "Views that return aggregate functions are not automatically updatable." msgstr "Подання які повертають агрегатні функції не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2658 +#: rewrite/rewriteHandler.c:2691 msgid "Views that return window functions are not automatically updatable." msgstr "Подання які повертають віконні функції не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2661 +#: rewrite/rewriteHandler.c:2694 msgid "Views that return set-returning functions are not automatically updatable." msgstr "Подання які повертають set-returning функції не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2668 rewrite/rewriteHandler.c:2672 -#: rewrite/rewriteHandler.c:2680 +#: 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:2683 +#: rewrite/rewriteHandler.c:2716 msgid "Views containing TABLESAMPLE are not automatically updatable." msgstr "Подання які містять TABLESAMPLE не оновлюються автоматично." -#: rewrite/rewriteHandler.c:2707 +#: rewrite/rewriteHandler.c:2740 msgid "Views that have no updatable columns are not automatically updatable." msgstr "Подання які не мають оновлюваних стовпців не оновлюються автоматично." -#: rewrite/rewriteHandler.c:3088 rewrite/rewriteHandler.c:3123 +#: rewrite/rewriteHandler.c:3121 rewrite/rewriteHandler.c:3156 #, c-format msgid "cannot insert into view \"%s\"" msgstr "вставити дані в подання \"%s\" не можна" -#: rewrite/rewriteHandler.c:3091 +#: 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:3096 rewrite/rewriteHandler.c:3132 +#: rewrite/rewriteHandler.c:3129 rewrite/rewriteHandler.c:3165 #, c-format msgid "cannot update view \"%s\"" msgstr "оновити подання \"%s\" не можна" -#: rewrite/rewriteHandler.c:3099 +#: 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:3104 rewrite/rewriteHandler.c:3141 +#: rewrite/rewriteHandler.c:3137 rewrite/rewriteHandler.c:3174 #, c-format msgid "cannot delete from view \"%s\"" msgstr "видалити дані з подання \"%s\" не можна" -#: rewrite/rewriteHandler.c:3107 +#: 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:3126 +#: rewrite/rewriteHandler.c:3159 #, c-format msgid "To enable inserting into the view using MERGE, provide an INSTEAD OF INSERT trigger." -msgstr "" +msgstr "Щоб подання допускало вставку даних за допомогою MERGE, встановіть тригер INSTEAD OF INSERT." -#: rewrite/rewriteHandler.c:3135 +#: rewrite/rewriteHandler.c:3168 #, c-format msgid "To enable updating the view using MERGE, provide an INSTEAD OF UPDATE trigger." -msgstr "" +msgstr "Щоб подання допускало оновлення даних за допомогою MERGE, встановіть тригер INSTEAD OF UPDATE." -#: rewrite/rewriteHandler.c:3144 +#: rewrite/rewriteHandler.c:3177 #, c-format msgid "To enable deleting from the view using MERGE, provide an INSTEAD OF DELETE trigger." -msgstr "" +msgstr "Щоб подання допускало видалення даних за допомогою MERGE, встановіть тригер INSTEAD OF DELETE." -#: rewrite/rewriteHandler.c:3319 +#: rewrite/rewriteHandler.c:3352 #, c-format msgid "cannot insert into column \"%s\" of view \"%s\"" msgstr "вставити дані в стовпець \"%s\" подання \"%s\" не можна" -#: rewrite/rewriteHandler.c:3327 +#: rewrite/rewriteHandler.c:3360 #, c-format msgid "cannot update column \"%s\" of view \"%s\"" msgstr "оновити дані в стовпці \"%s\" подання \"%s\" не можна" -#: rewrite/rewriteHandler.c:3335 +#: rewrite/rewriteHandler.c:3368 #, c-format msgid "cannot merge into column \"%s\" of view \"%s\"" -msgstr "" +msgstr "неможливо об'єднати дані в стовпець \"%s\" подання \"%s\"" -#: rewrite/rewriteHandler.c:3363 +#: rewrite/rewriteHandler.c:3396 #, c-format msgid "cannot merge into view \"%s\"" -msgstr "" +msgstr "неможливо об'єднати дані в подання \"%s\"" -#: rewrite/rewriteHandler.c:3365 +#: rewrite/rewriteHandler.c:3398 #, c-format msgid "MERGE is not supported for views with INSTEAD OF triggers for some actions but not all." -msgstr "" +msgstr "MERGE не підтримується для подань з тригерами INSTEAD OF для деяких дій, але не всіх." -#: rewrite/rewriteHandler.c:3366 +#: 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 "" +msgstr "Щоб подання допускало об'єднання у нього, або встановіть повний набір тригерів INSTEAD OF або видаліть існуючі тригери INSTEAD OF." -#: rewrite/rewriteHandler.c:3879 +#: 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:3890 +#: 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:3904 +#: 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:3908 +#: 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:3913 +#: 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:4173 +#: rewrite/rewriteHandler.c:4206 msgid "Views with conditional DO INSTEAD rules are not automatically updatable." msgstr "Подання з умовними правилами DO INSTEAD не оновлюються автоматично." -#: rewrite/rewriteHandler.c:4270 +#: rewrite/rewriteHandler.c:4303 #, c-format msgid "cannot perform INSERT RETURNING on relation \"%s\"" msgstr "виконати INSERT RETURNING для зв'язка \"%s\" не можна" -#: rewrite/rewriteHandler.c:4272 +#: 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:4277 +#: rewrite/rewriteHandler.c:4310 #, c-format msgid "cannot perform UPDATE RETURNING on relation \"%s\"" msgstr "виконати UPDATE RETURNING для зв'язка \"%s\" не можна" -#: rewrite/rewriteHandler.c:4279 +#: 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:4284 +#: rewrite/rewriteHandler.c:4317 #, c-format msgid "cannot perform DELETE RETURNING on relation \"%s\"" msgstr "виконати DELETE RETURNING для зв'язка \"%s\" не можна" -#: rewrite/rewriteHandler.c:4286 +#: 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:4304 +#: 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:4361 +#: 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:1083 +#: rewrite/rewriteManip.c:1084 #, c-format msgid "conditional utility statements are not implemented" msgstr "умовні службові оператори не реалізовані" -#: rewrite/rewriteManip.c:1430 +#: rewrite/rewriteManip.c:1431 #, c-format msgid "WHERE CURRENT OF on a view is not implemented" msgstr "Умова WHERE CURRENT OF для подання не реалізована" -#: rewrite/rewriteManip.c:1765 +#: 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" @@ -22002,17 +22023,17 @@ msgstr "неочікуванні дані після EOF в блоці %u від msgid "This has been seen to occur with buggy kernels; consider updating your system." msgstr "Ця ситуація може виникати через помилки в ядрі; можливо, вам слід оновити вашу систему." -#: storage/buffer/bufmgr.c:5653 +#: storage/buffer/bufmgr.c:5654 #, c-format msgid "could not write block %u of %s" msgstr "неможливо записати блок %u файлу %s" -#: storage/buffer/bufmgr.c:5655 +#: storage/buffer/bufmgr.c:5656 #, c-format msgid "Multiple failures --- write error might be permanent." msgstr "Кілька неполадок --- можливо, постійна помилка запису." -#: storage/buffer/bufmgr.c:5677 storage/buffer/bufmgr.c:5697 +#: storage/buffer/bufmgr.c:5678 storage/buffer/bufmgr.c:5698 #, c-format msgid "writing block %u of relation %s" msgstr "записування блоку %u зв'язку %s" @@ -22057,7 +22078,7 @@ msgstr "не вдалося визначити розмір тимчасовог 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 +#: 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" @@ -22176,12 +22197,12 @@ msgstr "синхронізація каталогу даних (fsync), витр #: storage/file/fd.c:3950 #, c-format msgid "\"debug_io_direct\" is not supported on this platform." -msgstr "" +msgstr "\"debug_io_direct\" не підтримується на цій платформі." #: storage/file/fd.c:3964 #, c-format msgid "Invalid list syntax in parameter \"%s\"" -msgstr "" +msgstr "Неприпустимий синтаксис списку в параметрі \"%s\"" #: storage/file/fd.c:3984 #, c-format @@ -22191,12 +22212,12 @@ 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 "" +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 "" +msgstr "\"debug_io_direct\" не підтримується для даних, тому що BLCKSZ занадто малий" #: storage/file/reinit.c:145 #, c-format @@ -22303,7 +22324,7 @@ msgstr "Розмір сегменту DSM повинен бути ненульо msgid "requested DSM segment size does not match size of existing segment" msgstr "розмір запитуваного сегмента DSM не збігається з розміром наявного сегмента" -#: storage/ipc/procarray.c:488 storage/lmgr/proc.c:352 +#: storage/ipc/procarray.c:488 storage/lmgr/proc.c:357 #: tcop/backend_startup.c:304 #, c-format msgid "sorry, too many clients already" @@ -22346,10 +22367,10 @@ 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:2825 storage/lmgr/lock.c:4210 -#: storage/lmgr/lock.c:4275 storage/lmgr/lock.c:4625 -#: storage/lmgr/predicate.c:2463 storage/lmgr/predicate.c:2478 -#: storage/lmgr/predicate.c:3875 storage/lmgr/predicate.c:4922 +#: 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" @@ -22385,7 +22406,7 @@ msgstr "запитаний сегмент спільної пам'яті не в msgid "PID %d is not a PostgreSQL backend process" msgstr "PID %d не є внутрішнім процесом PostgreSQL" -#: storage/ipc/signalfuncs.c:109 storage/lmgr/proc.c:1448 +#: 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" @@ -22644,7 +22665,7 @@ msgstr "поки виконується відновлення, не можна msgid "Only RowExclusiveLock or less can be acquired on database objects during recovery." msgstr "Під час процесу відновлення для об'єктів бази даних може бути отримане лише блокування RowExclusiveLock або менш сильна." -#: storage/lmgr/lock.c:3274 storage/lmgr/lock.c:3342 storage/lmgr/lock.c:3458 +#: 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, під час утримання блокування на рівні сеансу і на рівні транзакції для одного об'єкта" @@ -22657,83 +22678,83 @@ msgstr "в RWConflictPool недостатньо елементів для за #: 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 "" +msgstr "Можливо, вам слід виконувати менше транзакцій в секунду або збільшити параметр \"max_connections\"." #: 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:1681 +#: storage/lmgr/predicate.c:1686 #, c-format msgid "\"default_transaction_isolation\" is set to \"serializable\"." msgstr "параметр \"default_transaction_isolation\" має значення \"serializable\"." -#: storage/lmgr/predicate.c:1682 +#: 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:1733 +#: 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:1812 utils/time/snapmgr.c:535 +#: 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:1813 utils/time/snapmgr.c:542 +#: 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: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 +#: 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: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 +#: 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:348 +#: storage/lmgr/proc.c:353 #, c-format msgid "number of requested standby connections exceeds \"max_wal_senders\" (currently %d)" -msgstr "" +msgstr "кількість запитаних підключень резервного серверу перевищує \"max_wal_senders\" (поточна %d)" -#: storage/lmgr/proc.c:1541 +#: 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:1556 +#: 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:1565 +#: 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:1572 +#: 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:1589 +#: 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 мс" @@ -22801,22 +22822,22 @@ msgstr "не вдалося прочитати блоки %u..%u у файлі \ msgid "could not write blocks %u..%u in file \"%s\": %m" msgstr "не вдалося записати блоки %u..%u у файл \"%s\": %m" -#: storage/smgr/md.c:1163 +#: 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:1218 +#: 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:1688 +#: 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:1702 +#: storage/smgr/md.c:1714 #, c-format msgid "could not open file \"%s\" (target block %u): %m" msgstr "не вдалося відкрити файл \"%s\" (цільовий блок %u): %m" @@ -22874,17 +22895,17 @@ msgstr "система бази даних у режимі відновленн #: tcop/backend_startup.c:414 #, c-format msgid "received direct SSL connection request without ALPN protocol negotiation extension" -msgstr "" +msgstr "отримано запит на підключення до SSL без розширення протоколу ALPN" #: tcop/backend_startup.c:420 #, c-format msgid "direct SSL connection accepted" -msgstr "" +msgstr "прийнято пряме SSL-підключення" #: tcop/backend_startup.c:430 #, c-format msgid "direct SSL connection rejected" -msgstr "" +msgstr "пряме SSL підключення відхилено" #: tcop/backend_startup.c:489 tcop/backend_startup.c:517 #, c-format @@ -22899,12 +22920,12 @@ msgstr "неприпустима довжина стартового пакет #: tcop/backend_startup.c:573 #, c-format msgid "SSLRequest accepted" -msgstr "" +msgstr "SSLRequest прийнято" #: tcop/backend_startup.c:576 #, c-format msgid "SSLRequest rejected" -msgstr "" +msgstr "SSLRequest відхилено" #: tcop/backend_startup.c:585 #, c-format @@ -22924,12 +22945,12 @@ msgstr "Це може бути або помилкою клієнтського #: tcop/backend_startup.c:627 #, c-format msgid "GSSENCRequest accepted" -msgstr "" +msgstr "GSSENCRequest прийнятий" #: tcop/backend_startup.c:630 #, c-format msgid "GSSENCRequest rejected" -msgstr "" +msgstr "GSSENCRequest відхилений" #: tcop/backend_startup.c:639 #, c-format @@ -23268,7 +23289,7 @@ msgstr "Збільшіть ліміт глибини стека в систем #: tcop/postgres.c:3637 #, c-format msgid "\"client_connection_check_interval\" must be set to 0 on this platform." -msgstr "" +msgstr "\"client_connection_check_interval\" має бути встановлений в 0 на цій платформі." #: tcop/postgres.c:3658 #, c-format @@ -23330,12 +23351,12 @@ 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, щоб активувати зворотню розгортку." @@ -23501,70 +23522,70 @@ 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 "неприпустимиа позначка affix \"%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 \"%s\" поза діапазоном" -#: tsearch/spell.c:415 +#: tsearch/spell.c:416 #, c-format msgid "invalid character in affix flag \"%s\"" msgstr "неприпустимий символ в позначці affix \"%s\"" -#: tsearch/spell.c:435 +#: tsearch/spell.c:436 #, c-format msgid "invalid affix flag \"%s\" with \"long\" flag value" msgstr "неприпустима позначка affix \"%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:749 utils/adt/regexp.c:223 jsonpath_gram.y:629 +#: 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: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 gram.y:18735 gram.y:18752 #, c-format msgid "syntax error" msgstr "синтаксична помилка" -#: 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 "неприпустимий псевдонім affix \"%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 "файл affix містить команди і в старому, і в новому стилі" @@ -23618,60 +23639,55 @@ msgstr "нерозпізнаний параметр заголовку: \"%s\"" #: tsearch/wparser_def.c:2674 #, c-format -msgid "MinWords should be less than MaxWords" -msgstr "Значення MinWords повинно бути меньшим за MaxWords" +msgid "%s must be less than %s" +msgstr "%s має бути менше ніж %s" #: 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" +msgid "%s must be positive" +msgstr "%s має бути додатним" -#: tsearch/wparser_def.c:2686 +#: 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:435 #, c-format msgid "could not unlink permanent statistics file \"%s\": %m" msgstr "не вдалося від'єднати файл постійної статистики \"%s\": %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\"" @@ -23689,12 +23705,12 @@ msgstr "скидання існуючої статистики для типу % #: utils/activity/wait_event.c:207 utils/activity/wait_event.c:232 #, c-format msgid "wait event \"%s\" already exists in type \"%s\"" -msgstr "" +msgstr "подія очікування \"%s\" вже існує в типі \"%s\"" #: utils/activity/wait_event.c:246 #, c-format msgid "too many custom wait events" -msgstr "" +msgstr "занадто багато користувацьких подій очікування" #: utils/adt/acl.c:183 utils/adt/name.c:93 #, c-format @@ -23976,7 +23992,7 @@ msgid "Unexpected end of input." msgstr "Неочікуваний кінец введення." #: utils/adt/arrayfuncs.c:1301 utils/adt/arrayfuncs.c:3499 -#: utils/adt/arrayfuncs.c:6106 +#: utils/adt/arrayfuncs.c:6108 #, c-format msgid "invalid number of dimensions: %d" msgstr "неприпустима кількість вимірів: %d" @@ -24015,8 +24031,8 @@ 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:2915 utils/adt/arrayfuncs.c:6092 -#: utils/adt/arrayfuncs.c:6118 utils/adt/arrayfuncs.c:6129 +#: 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 @@ -24093,42 +24109,42 @@ msgstr "накопичувати null-масиви не можна" msgid "cannot accumulate empty arrays" msgstr "накопичувати пусті масиви не можна" -#: utils/adt/arrayfuncs.c:5990 utils/adt/arrayfuncs.c:6030 +#: 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:6093 utils/adt/arrayfuncs.c:6119 +#: utils/adt/arrayfuncs.c:6095 utils/adt/arrayfuncs.c:6121 #, c-format msgid "Dimension array must be one dimensional." msgstr "Масив розмірності повинен бути одновимірним." -#: utils/adt/arrayfuncs.c:6098 utils/adt/arrayfuncs.c:6124 +#: utils/adt/arrayfuncs.c:6100 utils/adt/arrayfuncs.c:6126 #, c-format msgid "dimension values cannot be null" msgstr "значення розмірностей не можуть бути null" -#: utils/adt/arrayfuncs.c:6130 +#: utils/adt/arrayfuncs.c:6132 #, c-format msgid "Low bound array has different size than dimensions array." msgstr "Масив нижніх границь відрізняється за розміром від масиву розмірностей." -#: utils/adt/arrayfuncs.c:6411 +#: utils/adt/arrayfuncs.c:6413 #, c-format msgid "removing elements from multidimensional arrays is not supported" msgstr "видалення елементів з багатовимірних масивів не підтримується" -#: utils/adt/arrayfuncs.c:6688 +#: utils/adt/arrayfuncs.c:6690 #, c-format msgid "thresholds must be one-dimensional array" msgstr "граничне значення повинно вказуватись одновимірним масивом" -#: utils/adt/arrayfuncs.c:6693 +#: utils/adt/arrayfuncs.c:6695 #, c-format msgid "thresholds array must not contain NULLs" msgstr "масив границь не повинен містити NULL" -#: utils/adt/arrayfuncs.c:6926 +#: utils/adt/arrayfuncs.c:6928 #, c-format msgid "number of elements to trim must be between 0 and %d" msgstr "кількість елементів для обрізки має бути між 0 і %d" @@ -24183,7 +24199,7 @@ msgstr "перетворення кодування з %s в ASCII не підт #: 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 +#: utils/adt/uuid.c:140 utils/adt/xid8funcs.c:323 #, c-format msgid "invalid input syntax for type %s: \"%s\"" msgstr "неприпустимий синтаксис для типу %s: \"%s\"" @@ -24192,7 +24208,7 @@ msgstr "неприпустимий синтаксис для типу %s: \"%s\" #: utils/adt/cash.c:137 utils/adt/cash.c:150 #, c-format msgid "money out of range" -msgstr "" +msgstr "гроші поза діапазоном" #: 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 @@ -25399,13 +25415,13 @@ msgstr "метод елемента jsonpath .%s() може бути засто #: 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 "" +msgstr "аргумент \"%s\" методу елемента jsonpath .%s() поза діапазоном для типу double precision" #: 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 "NaN or Infinity is not allowed for jsonpath item method .%s()" -msgstr "" +msgstr "NaN та Infinity не дозволяються для методу елементу jsonpath .%s()" #: utils/adt/jsonpath_exec.c:1211 utils/adt/jsonpath_exec.c:1313 #: utils/adt/jsonpath_exec.c:1455 utils/adt/jsonpath_exec.c:1593 @@ -25416,22 +25432,22 @@ msgstr "метод елемента jsonpath .%s() може бути засто #: 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 "" +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 "" +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 "" +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 "" +msgstr "аргумент \"%s\" методу елемента jsonpath .%s() поза діапазоном для типу numeric" #: utils/adt/jsonpath_exec.c:1487 #, c-format @@ -25446,12 +25462,12 @@ msgstr "масштаб методу jsonpath елементу .%s() знаход #: 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 "" +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 "" +msgstr "Метод jsonpath елемента .%s() можна застосувати лише до значення типу boolean, рядка, числа або дати" #: utils/adt/jsonpath_exec.c:2137 #, c-format @@ -25499,7 +25515,7 @@ msgstr "Використайте аргумент шаблону дати й ч #: 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 "" +msgstr "часова точність методу елементу jsonpath .%s() є неприпустимою" #: utils/adt/jsonpath_exec.c:2840 #, c-format @@ -25509,7 +25525,7 @@ msgstr "метод елемента jsonpath .%s() може бути засто #: utils/adt/jsonpath_exec.c:3124 #, c-format msgid "could not convert value of type %s to jsonpath" -msgstr "" +msgstr "не вдалося перетворити значення типу %s в jsonpath" #: utils/adt/jsonpath_exec.c:3158 #, c-format @@ -25548,28 +25564,28 @@ msgstr "Використовуйте функцію *_tz() для підтрим #: utils/adt/jsonpath_exec.c:3981 #, c-format -msgid "JSON path expression for column \"%s\" should return single item without wrapper" -msgstr "" +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 "" +msgstr "Використайте вираз WITH WRAPPER, щоб обернути елементи SQL/JSON в масив." #: utils/adt/jsonpath_exec.c:3987 #, c-format -msgid "JSON path expression in JSON_QUERY should return single item without wrapper" -msgstr "" +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\" should return single scalar item" -msgstr "" +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 should return single scalar item" -msgstr "" +msgid "JSON path expression in JSON_VALUE must return single scalar item" +msgstr "Вираз шляху JSON в JSON_VALUE повинен повертати одиничний скалярний елемент" #: utils/adt/levenshtein.c:132 #, c-format @@ -25888,22 +25904,22 @@ msgstr "факторіал від'ємного числа не визначен #: utils/adt/numeric.c:4256 #, c-format msgid "lower bound cannot be NaN" -msgstr "" +msgstr "нижня границя не може бути NaN" #: utils/adt/numeric.c:4260 #, c-format msgid "lower bound cannot be infinity" -msgstr "" +msgstr "нижня границя не може бути нескінченністю" #: utils/adt/numeric.c:4267 #, c-format msgid "upper bound cannot be NaN" -msgstr "" +msgstr "верхня границя не може бути NaN" #: utils/adt/numeric.c:4271 #, c-format msgid "upper bound cannot be infinity" -msgstr "" +msgstr "верхня границя не може бути нескінченністю" #: utils/adt/numeric.c:4432 utils/adt/numeric.c:4520 utils/adt/numeric.c:4580 #: utils/adt/numeric.c:4776 @@ -25941,7 +25957,7 @@ msgstr "Поле з точністю %d, масштабом %d не може м #: utils/adt/pseudorandomfuncs.c:159 #, c-format msgid "lower bound must be less than or equal to upper bound" -msgstr "" +msgstr "нижня границя повинна бути менше або дорівнювати верхній границі" #: utils/adt/oid.c:217 #, c-format @@ -25979,140 +25995,145 @@ msgstr "запитаний символ не припустимий для ко msgid "percentile value %g is not between 0 and 1" msgstr "значення процентиля %g не є між 0 і 1" -#: utils/adt/pg_locale.c:1484 +#: 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 "не вдалося відкрити сортувальник для локалізації\"%s\" з правилами \"%s\": %s" -#: utils/adt/pg_locale.c:1495 utils/adt/pg_locale.c:2969 -#: utils/adt/pg_locale.c:3042 +#: 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:1523 +#: utils/adt/pg_locale.c:1546 #, c-format msgid "could not create locale \"%s\": %m" msgstr "не вдалося створити локалізацію \"%s\": %m" -#: utils/adt/pg_locale.c:1526 +#: 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:1647 +#: 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:1694 +#: 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:1700 +#: utils/adt/pg_locale.c:1723 #, c-format msgid "collation \"%s\" has version mismatch" msgstr "невідповідність версій для параметру сортування \"%s\"" -#: utils/adt/pg_locale.c:1702 +#: 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:1705 +#: 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:1749 utils/adt/pg_locale.c:2533 -#: utils/adt/pg_locale.c:2558 +#: 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:1791 +#: utils/adt/pg_locale.c:1814 #, c-format msgid "could not load locale \"%s\"" msgstr "не вдалося завантажити локаль \"%s\"" -#: utils/adt/pg_locale.c:1816 +#: 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:1872 utils/adt/pg_locale.c:1885 +#: 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:1897 +#: utils/adt/pg_locale.c:1920 #, c-format msgid "could not compare Unicode strings: %m" msgstr "не вдалося порівняти рядки в Unicode: %m" -#: utils/adt/pg_locale.c:2071 +#: utils/adt/pg_locale.c:2094 #, c-format msgid "collation failed: %s" msgstr "помилка в бібліотеці сортування: %s" -#: utils/adt/pg_locale.c:2290 utils/adt/pg_locale.c:2322 +#: 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:2612 +#: 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:2633 utils/adt/pg_locale.c:2649 +#: 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:2674 +#: utils/adt/pg_locale.c:2697 #, c-format msgid "encoding \"%s\" not supported by ICU" msgstr "ICU не підтримує кодування \"%s\"" -#: utils/adt/pg_locale.c:2681 +#: 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:2699 utils/adt/pg_locale.c:2718 -#: utils/adt/pg_locale.c:2774 utils/adt/pg_locale.c:2785 +#: 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:2960 +#: 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:3001 +#: 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:3003 utils/adt/pg_locale.c:3032 +#: 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:3030 +#: 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:3181 +#: utils/adt/pg_locale.c:3204 #, c-format msgid "invalid multibyte character for locale" msgstr "неприпустимий мультибайтний символ для локалізації" -#: utils/adt/pg_locale.c:3182 +#: 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, можливо, несумісний з кодуванням бази даних." @@ -26255,7 +26276,7 @@ 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:6785 utils/misc/guc.c:6819 +#: 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" @@ -26303,8 +26324,8 @@ msgstr "пропущено аргумент" msgid "Use NONE to denote the missing argument of a unary operator." msgstr "Щоб позначити пропущений аргумент унарного оператору, використайте NONE." -#: utils/adt/regproc.c:675 utils/adt/regproc.c:2029 utils/adt/ruleutils.c:10498 -#: utils/adt/ruleutils.c:10711 +#: 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 "занадто багато аргументів" @@ -26479,22 +26500,22 @@ msgstr "не можна порівнювати неподібні типи ст msgid "cannot compare record types with different numbers of columns" msgstr "не можна порівнювати типи записів з різної кількістю стовпців" -#: utils/adt/ruleutils.c:2689 +#: utils/adt/ruleutils.c:2694 #, c-format msgid "input is a query, not an expression" msgstr "вхідне значення є запитом, а не виразом" -#: utils/adt/ruleutils.c:2701 +#: utils/adt/ruleutils.c:2706 #, c-format msgid "expression contains variables of more than one relation" msgstr "вираз містить змінні більше одного відношення" -#: utils/adt/ruleutils.c:2708 +#: utils/adt/ruleutils.c:2713 #, c-format msgid "expression contains variables" msgstr "вираз містить змінні" -#: utils/adt/ruleutils.c:5241 +#: utils/adt/ruleutils.c:5246 #, c-format msgid "rule \"%s\" has unsupported event type %d" msgstr "правило \"%s\" має непідтримуваний тип подій %d" @@ -26973,12 +26994,12 @@ msgstr "аргумент ntile повинен бути більше нуля" msgid "argument of nth_value must be greater than zero" msgstr "аргумент nth_value повинен бути більше нуля" -#: utils/adt/xid8funcs.c:124 +#: utils/adt/xid8funcs.c:120 #, c-format msgid "transaction ID %llu is in the future" msgstr "ідентифікатор транзакції %llu знаходиться в майбутньому" -#: utils/adt/xid8funcs.c:553 +#: utils/adt/xid8funcs.c:522 #, c-format msgid "invalid external pg_snapshot data" msgstr "неприпустимі зовнішні дані pg_snapshot" @@ -27173,27 +27194,27 @@ msgstr "в класі операторів \"%s\" методу доступу %s msgid "cached plan must not change result type" msgstr "в кешованому плані не повинен змінюватись тип результату" -#: utils/cache/relcache.c:3800 +#: utils/cache/relcache.c:3801 #, c-format msgid "heap relfilenumber value not set when in binary upgrade mode" msgstr "значення relfilenumber не встановлене у режимі двійкового оновлення" -#: utils/cache/relcache.c:3808 +#: utils/cache/relcache.c:3809 #, c-format msgid "unexpected request for new relfilenumber in binary upgrade mode" msgstr "неочікуваний запит на новий relfilenumber в режимі двійкового оновлення" -#: utils/cache/relcache.c:6536 +#: utils/cache/relcache.c:6539 #, c-format msgid "could not create relation-cache initialization file \"%s\": %m" msgstr "не вдалося створити файл ініціалізації для кешу відношень \"%s\": %m" -#: utils/cache/relcache.c:6538 +#: utils/cache/relcache.c:6541 #, c-format msgid "Continuing anyway, but there's something wrong." msgstr "Продовжуємо усе одно, але щось не так." -#: utils/cache/relcache.c:6868 +#: utils/cache/relcache.c:6871 #, c-format msgid "could not remove cache file \"%s\": %m" msgstr "не вдалося видалити файл кешу \"%s\": %m" @@ -27471,178 +27492,178 @@ msgstr "жодного псевдоніму для стовпця не було msgid "could not determine row description for function returning record" msgstr "не вдалося визначити опис рядка для функції, що повертає запис" -#: utils/init/miscinit.c:352 +#: utils/init/miscinit.c:353 #, c-format msgid "data directory \"%s\" does not exist" msgstr "каталог даних \"%s\" не існує" -#: utils/init/miscinit.c:357 +#: utils/init/miscinit.c:358 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "не вдалося прочитати дозволи на каталог \"%s\": %m" -#: utils/init/miscinit.c:365 +#: utils/init/miscinit.c:366 #, c-format msgid "specified data directory \"%s\" is not a directory" msgstr "вказаний каталог даних \"%s\" не є каталогом" -#: utils/init/miscinit.c:381 +#: utils/init/miscinit.c:382 #, c-format msgid "data directory \"%s\" has wrong ownership" msgstr "власник каталогу даних \"%s\" визначений неправильно" -#: utils/init/miscinit.c:383 +#: 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:401 +#: utils/init/miscinit.c:402 #, c-format msgid "data directory \"%s\" has invalid permissions" msgstr "каталог даних \"%s\" має неприпустимі дозволи" -#: utils/init/miscinit.c:403 +#: 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:461 +#: utils/init/miscinit.c:462 #, c-format msgid "could not change directory to \"%s\": %m" msgstr "не вдалося змінити каталог на \"%s\": %m" -#: utils/init/miscinit.c:697 utils/misc/guc.c:3650 +#: 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:770 +#: utils/init/miscinit.c:807 #, c-format msgid "role with OID %u does not exist" msgstr "роль з OID %u не існує" -#: utils/init/miscinit.c:800 +#: utils/init/miscinit.c:853 #, c-format msgid "role \"%s\" is not permitted to log in" msgstr "для ролі \"%s\" вхід не дозволений" -#: utils/init/miscinit.c:818 +#: utils/init/miscinit.c:874 #, c-format msgid "too many connections for role \"%s\"" msgstr "занадто багато підключень для ролі \"%s\"" -#: utils/init/miscinit.c:991 +#: utils/init/miscinit.c:1045 #, c-format msgid "invalid role OID: %u" msgstr "неприпустимий OID ролі: %u" -#: utils/init/miscinit.c:1138 +#: utils/init/miscinit.c:1192 #, c-format msgid "database system is shut down" msgstr "система бази даних вимкнена" -#: utils/init/miscinit.c:1225 +#: utils/init/miscinit.c:1279 #, c-format msgid "could not create lock file \"%s\": %m" msgstr "не вдалося створити файл блокування \"%s\": %m" -#: utils/init/miscinit.c:1239 +#: utils/init/miscinit.c:1293 #, c-format msgid "could not open lock file \"%s\": %m" msgstr "не вдалося відкрити файл блокування \"%s\": %m" -#: utils/init/miscinit.c:1246 +#: utils/init/miscinit.c:1300 #, c-format msgid "could not read lock file \"%s\": %m" msgstr "не вдалося прочитати файл блокування \"%s\": %m" -#: utils/init/miscinit.c:1255 +#: utils/init/miscinit.c:1309 #, c-format msgid "lock file \"%s\" is empty" msgstr "файл блокування \"%s\" пустий" -#: utils/init/miscinit.c:1256 +#: 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:1300 +#: utils/init/miscinit.c:1354 #, c-format msgid "lock file \"%s\" already exists" msgstr "файл блокування \"%s\" вже існує" -#: utils/init/miscinit.c:1304 +#: 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:1306 +#: 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:1309 +#: 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:1311 +#: 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:1362 +#: utils/init/miscinit.c:1416 #, c-format msgid "could not remove old lock file \"%s\": %m" msgstr "не вдалося видалити старий файл блокування \"%s\": %m" -#: utils/init/miscinit.c:1364 +#: 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:1401 utils/init/miscinit.c:1415 -#: utils/init/miscinit.c:1426 +#: 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:1537 utils/init/miscinit.c:1679 utils/misc/guc.c:5724 +#: 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:1667 +#: utils/init/miscinit.c:1721 #, c-format msgid "could not open file \"%s\": %m; continuing anyway" msgstr "не вдалося відкрити файл \"%s\": %m; все одно продовжується" -#: utils/init/miscinit.c:1692 +#: 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:1731 utils/init/miscinit.c:1747 +#: 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:1733 +#: utils/init/miscinit.c:1787 #, c-format msgid "File \"%s\" is missing." msgstr "Файл \"%s\" пропущено." -#: utils/init/miscinit.c:1749 +#: utils/init/miscinit.c:1803 #, c-format msgid "File \"%s\" does not contain valid data." msgstr "Файл \"%s\" не містить припустимих даних." -#: utils/init/miscinit.c:1751 +#: utils/init/miscinit.c:1805 #, c-format msgid "You might need to initdb." msgstr "Можливо, вам слід виконати initdb." -#: utils/init/miscinit.c:1759 +#: 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." @@ -27719,97 +27740,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:491 +#: utils/init/postinit.c:493 #, c-format msgid "database \"%s\" has a collation version mismatch" msgstr "база даних \"%s\" має невідповідність версії параметрів сортування" -#: utils/init/postinit.c:493 +#: 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:496 +#: 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:902 +#: utils/init/postinit.c:904 #, c-format msgid "no roles are defined in this database system" msgstr "в цій системі баз даних не визначено жодної ролі" -#: utils/init/postinit.c:903 +#: 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:940 +#: utils/init/postinit.c:942 #, c-format msgid "must be superuser to connect in binary upgrade mode" msgstr "потрібно бути суперкористувачем, щоб підключитись в режимі двійкового оновлення" -#: utils/init/postinit.c:961 +#: utils/init/postinit.c:962 #, c-format msgid "remaining connection slots are reserved for roles with the %s attribute" msgstr "слоти підключення, що залишилися, зарезервовані для ролей з атрибутом %s" -#: utils/init/postinit.c:967 +#: 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:979 +#: utils/init/postinit.c:980 #, c-format msgid "permission denied to start WAL sender" msgstr "немає дозволу для запуску відправника WAL" -#: utils/init/postinit.c:980 +#: 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:1098 +#: utils/init/postinit.c:1099 #, c-format msgid "It seems to have just been dropped or renamed." msgstr "Схоже, вона щойно була видалена або перейменована." -#: utils/init/postinit.c:1102 +#: utils/init/postinit.c:1103 #, c-format msgid "database %u does not exist" msgstr "база даних %u не існує" -#: utils/init/postinit.c:1111 +#: utils/init/postinit.c:1112 #, c-format msgid "cannot connect to invalid database \"%s\"" msgstr "неможливо під'єднатися до невірної бази даних \"%s\"" -#: utils/init/postinit.c:1172 +#: utils/init/postinit.c:1173 #, c-format msgid "The database subdirectory \"%s\" is missing." msgstr "Підкаталог бази даних \"%s\" пропущений." @@ -27906,8 +27927,8 @@ 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:4068 -#: utils/misc/guc.c:4171 +#: 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\" не може бути змінений, без перезавантаження сервера" @@ -28019,7 +28040,7 @@ msgstr "%g%s%s поза припустимим діапазоном для па msgid "parameter \"%s\" cannot be set during a parallel operation" msgstr "параметр \"%s\" не можна встановити під час паралельних операцій" -#: utils/misc/guc.c:3481 utils/misc/guc.c:4655 +#: utils/misc/guc.c:3481 utils/misc/guc.c:4696 #, c-format msgid "parameter \"%s\" cannot be changed" msgstr "параметр \"%s\" не може бути змінений" @@ -28029,8 +28050,8 @@ msgstr "параметр \"%s\" не може бути змінений" msgid "parameter \"%s\" cannot be changed now" msgstr "параметр \"%s\" не може бути змінений зараз" -#: utils/misc/guc.c:3541 utils/misc/guc.c:3603 utils/misc/guc.c:4630 -#: utils/misc/guc.c:6721 +#: 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\"" @@ -28055,67 +28076,67 @@ msgstr "параметр \"%s\" не можна скинути" msgid "parameter \"%s\" cannot be set locally in functions" msgstr "параметр \"%s\" не може бути встановлений локально в функціях" -#: utils/misc/guc.c:4329 utils/misc/guc.c:4377 utils/misc/guc.c:5409 +#: 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:4330 utils/misc/guc.c:4378 utils/misc/guc.c:5410 +#: 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:4588 +#: utils/misc/guc.c:4629 #, c-format msgid "ALTER SYSTEM is not allowed in this environment" msgstr "ALTER SYSTEM не допускається в цьому середовищі" -#: utils/misc/guc.c:4620 +#: 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:4699 +#: 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:4744 +#: utils/misc/guc.c:4785 #, c-format msgid "could not parse contents of file \"%s\"" msgstr "не вдалося аналізувати зміст файла \"%s\"" -#: utils/misc/guc.c:4926 +#: utils/misc/guc.c:4967 #, c-format msgid "attempt to redefine parameter \"%s\"" msgstr "спроба перевизначити параметр \"%s\"" -#: utils/misc/guc.c:5265 +#: utils/misc/guc.c:5306 #, c-format msgid "invalid configuration parameter name \"%s\", removing it" msgstr "неприпустима назва параметра конфігурації \"%s\", видаляємо" -#: utils/misc/guc.c:5267 +#: utils/misc/guc.c:5308 #, c-format msgid "\"%s\" is now a reserved prefix." msgstr "\"%s\" тепер є зарезервованим префіксом." -#: utils/misc/guc.c:6144 +#: utils/misc/guc.c:6179 #, c-format msgid "while setting parameter \"%s\" to \"%s\"" msgstr "під час налаштування параметру \"%s\" на \"%s\"" -#: utils/misc/guc.c:6313 +#: utils/misc/guc.c:6348 #, c-format msgid "parameter \"%s\" could not be set" msgstr "параметр \"%s\" не вдалося встановити" -#: utils/misc/guc.c:6403 +#: utils/misc/guc.c:6438 #, c-format msgid "could not parse setting for parameter \"%s\"" msgstr "не вдалося аналізувати налаштування параметру \"%s\"" -#: utils/misc/guc.c:6853 +#: utils/misc/guc.c:6888 #, c-format msgid "invalid value for parameter \"%s\": %g" msgstr "неприпустиме значення для параметра \"%s\": %g" @@ -28434,7 +28455,7 @@ 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 "" +msgstr "Може бути вимкнене для середовищ, де слід вносити зміни глобальних налаштувань за допомогою іншого методу." #: utils/misc/guc_tables.c:1043 msgid "Enables advertising the server via Bonjour." @@ -28450,7 +28471,7 @@ msgstr "Вмикає SSL-підключення." #: utils/misc/guc_tables.c:1070 msgid "Controls whether \"ssl_passphrase_command\" is called during server reload." -msgstr "" +msgstr "Визначає, чи викликається \"ssl_passphrase_command\" під час перезавантаження сервера." #: utils/misc/guc_tables.c:1079 msgid "Give priority to server ciphersuite order." @@ -28478,7 +28499,7 @@ msgstr "Продовжує обробку при пошкоджені загол #: 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 "" +msgstr "Виявляючи пошкоджений заголовок сторінки, PostgreSQL звичайно повідомляє про помилку, перериваючи поточну транзакцію. Але якщо \"zero_damaged_pages\" дорівнює true система видасть попередження, обнулить пошкоджену сторінку, і продовжить обробку. Ця поведінка знищить дані, а саме рядків в пошкодженій сторінці." #: utils/misc/guc_tables.c:1129 msgid "Continues recovery after an invalid pages failure." @@ -28486,7 +28507,7 @@ msgstr "Продовжує відновлення після помилки не #: 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 "" +msgstr "Виявлення WAL записів, які мають посилання на неприпустимі сторінки під час відновлення, змушує PostgreSQL підняти помилку на рівень PANIC, перериваючи відновлення. Встановлення параметру \"ignore_invalid_pages\" на true змусить систему ігнорувати неприпустимі посилання на сторінки в WAL записах (але все ще буде повідомляти про попередження), і продовжити відновлення. Ця поведінка може викликати збої, втрату даних, розповсюдження або приховання пошкоджень, або інші серйозні проблеми. Діє лише під час відновлення або в режимі очікування." #: utils/misc/guc_tables.c:1148 msgid "Writes full pages to WAL when first modified after a checkpoint." @@ -28498,7 +28519,7 @@ msgstr "Сторінка, записувана під час аварійног #: 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_tables.c:1172 msgid "Writes zeroes to new WAL files before first use." @@ -28518,7 +28539,7 @@ msgstr "Журналювати кожне успішне підключення. #: utils/misc/guc_tables.c:1210 msgid "Logs details of pre-authentication connection handshake." -msgstr "" +msgstr "Журналювати деталі рукостискання перед автентифікацією." #: utils/misc/guc_tables.c:1220 msgid "Logs end of a session, including duration." @@ -28709,8 +28730,8 @@ msgid "WITH OIDS is no longer supported; this can only be false." msgstr "WITH OIDS більше не підтримується; це може бути помилковим." #: utils/misc/guc_tables.c:1632 -msgid "Start a subprocess to capture stderr output and/or csvlogs into log files." -msgstr "Запускає підпроцес записування виводу stderr і/або csvlogs до файлів журналу." +msgid "Start a subprocess to capture stderr, csvlog and/or jsonlog into log files." +msgstr "Запускає підпроцес записування виводу stderr, csvlog і/або jsonlog до файлів журналу." #: utils/misc/guc_tables.c:1641 msgid "Truncate existing log files of same name during log rotation." @@ -28866,7 +28887,7 @@ msgstr "Якщо увімкнено, тригери подій спрацьов #: utils/misc/guc_tables.c:2022 msgid "Enables a physical standby to synchronize logical failover replication slots from the primary server." -msgstr "" +msgstr "Вмикає фізичний резерв для синхронізації логічних слотів реплікації з основним сервером." #: utils/misc/guc_tables.c:2040 msgid "Sets the amount of time to wait before forcing a switch to the next WAL file." @@ -28986,36 +29007,36 @@ msgstr "-1 вказує на те, що значення не може бути #: utils/misc/guc_tables.c:2297 msgid "Sets the size of the dedicated buffer pool used for the commit timestamp cache." -msgstr "" +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 "" +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 "" +msgstr "Встановлює розмір спеціального буфера, що використовується для кешу членів MultiXact." #: utils/misc/guc_tables.c:2319 msgid "Sets the size of the dedicated buffer pool used for the MultiXact offset cache." -msgstr "" +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 "" +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 "" +msgstr "Встановлює розмір спеціального буфера, що використовується для кешу серіалізованих транзакцій." #: utils/misc/guc_tables.c:2352 msgid "Sets the size of the dedicated buffer pool used for the subtransaction cache." -msgstr "" +msgstr "Встановлює розмір спеціального буфера, що використовується для кешу субтранзакцій." #: utils/misc/guc_tables.c:2363 msgid "Sets the size of the dedicated buffer pool used for the transaction status cache." -msgstr "" +msgstr "Встановлює розмір спеціального буфера, що використовується для кешу статусів транзакцій." #: utils/misc/guc_tables.c:2374 msgid "Sets the maximum number of temporary buffers used by each session." @@ -29145,7 +29166,7 @@ msgstr "Встановлює максимально дозволений час #: utils/misc/guc_tables.c:2636 msgid "Sets the maximum allowed duration of any transaction within a session (not a prepared transaction)." -msgstr "" +msgstr "Встановлює максимально дозволений час будь-якої транзакції в межах сесії (не підготовленої транзакцієї)." #: utils/misc/guc_tables.c:2647 msgid "Sets the maximum allowed idle time between queries, when not in a transaction." @@ -29181,7 +29202,7 @@ msgstr "Встановлює максимальну кілкість блоку #: 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 "" +msgstr "Розмір спільної таблиці блокування визначається з припущення, що в будь-який момент часу потрібно заблокувати не більше \"max_locks_per_transaction\" об'єктів на один серверний процес або підготовлену транзакцію." #: utils/misc/guc_tables.c:2732 msgid "Sets the maximum number of predicate locks per transaction." @@ -29189,7 +29210,7 @@ msgstr "Встановлює максимальну кількість пред #: 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 "" +msgstr "Розмір спільної таблиці блокування предикатів визначається з припущення, що за один раз потрібно заблокувати не більше \"max_pred_locks_per_transaction\" об'єктів на один серверний процес або підготовлену транзакцію." #: utils/misc/guc_tables.c:2744 msgid "Sets the maximum number of predicate-locked pages and tuples per relation." @@ -29262,7 +29283,7 @@ msgstr "Встановлює кількість буферів дискових #: utils/misc/guc_tables.c:2884 msgid "Specify -1 to have this value determined as a fraction of shared_buffers." -msgstr "" +msgstr "Вкажіть -1, щоб це значення визначалося як частка shared_buffers." #: utils/misc/guc_tables.c:2894 msgid "Time between WAL flushes performed in the WAL writer." @@ -29302,7 +29323,7 @@ msgstr "Встановлює затримку в мілісекундах між #: utils/misc/guc_tables.c:2984 msgid "Sets the minimum number of concurrent open transactions required before performing \"commit_delay\"." -msgstr "" +msgstr "Встановлює мінімальну кількість одночасно відкритих транзакцій, необхідних до виконання \"commit_delay\"." #: utils/misc/guc_tables.c:2995 msgid "Sets the number of digits displayed for floating-point values." @@ -29362,11 +29383,11 @@ msgstr "Кількість одночасних запитів, які можу #: utils/misc/guc_tables.c:3117 msgid "A variant of \"effective_io_concurrency\" that is used for maintenance work." -msgstr "" +msgstr "Варіант \"effective_io_concurrency\", що використовується для роботи з обслуговування." #: utils/misc/guc_tables.c:3132 msgid "Limit on the size of data reads and writes." -msgstr "" +msgstr "Обмеження на розмір зчитування та записування." #: utils/misc/guc_tables.c:3157 msgid "Maximum number of concurrent worker processes." @@ -29643,7 +29664,7 @@ msgstr "GEQO: відправна значення для випадкового #: utils/misc/guc_tables.c:3824 msgid "Multiple of \"work_mem\" to use for hash tables." -msgstr "" +msgstr "Декілька \"work_mem\" для використання хеш-таблиць." #: utils/misc/guc_tables.c:3835 msgid "Multiple of the average buffer usage to free per round." @@ -29679,7 +29700,7 @@ msgstr "Час тривалості очищення \"брудних\" буфе #: utils/misc/guc_tables.c:3918 msgid "Fraction of statements exceeding \"log_min_duration_sample\" to be logged." -msgstr "" +msgstr "Частка тверджень, перевищує \"log_min_duration_sample\", що підлягає запису." #: utils/misc/guc_tables.c:3919 msgid "Use a value between 0.0 (never log) and 1.0 (always log)." @@ -30011,15 +30032,15 @@ 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 "" +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 "" +msgstr "Логічні процеси відправки WAL будуть відправляти декодовані зміни до плагінів виводу лише після підтвердження отримування вказаних слотів реплікації (WAL)." #: utils/misc/guc_tables.c:4716 msgid "Prohibits access to non-system relations of specified kinds." -msgstr "" +msgstr "Забороняє доступ до несистемних відносин вказаних типів." #: utils/misc/guc_tables.c:4736 msgid "Sets whether \"\\'\" is allowed in string literals." @@ -30100,7 +30121,7 @@ msgstr "Встановлює рівень синхронізації поточ #: utils/misc/guc_tables.c:4915 msgid "Allows archiving of WAL files using \"archive_command\"." -msgstr "" +msgstr "Дозволяє архівацію файлів WAL, використовуючи \"archive_command\"." #: utils/misc/guc_tables.c:4925 msgid "Sets the action to perform upon reaching the recovery target." @@ -30345,7 +30366,7 @@ msgstr "видалити активний портал \"%s\" не можна" msgid "cannot PREPARE a transaction that has created a cursor WITH HOLD" msgstr "не можна виконати PREPARE для транзакції, яка створила курсор WITH HOLD" -#: utils/mmgr/portalmem.c:1229 +#: utils/mmgr/portalmem.c:1232 #, c-format msgid "cannot perform transaction commands inside a cursor loop that is not read-only" msgstr "виконати команди транзакції всередині циклу з курсором, який не є \"лише для читання\", не можна" @@ -30626,7 +30647,7 @@ msgstr "нерозпізнаний параметр стовпця \"%s\"" #: gram.y:14147 #, c-format msgid "only string constants are supported in JSON_TABLE path specification" -msgstr "" +msgstr "у специфікації шляху JSON_TABLE підтримуються лише рядкові константи" #: gram.y:14469 #, c-format @@ -30953,7 +30974,7 @@ msgstr "небезпечне використання рядкової конс #: scan.l:582 #, c-format msgid "String constants with Unicode escapes cannot be used when \"standard_conforming_strings\" is off." -msgstr "" +msgstr "Константи рядка зі спеціальними кодами Unicode не можна використовувати, коли параметр \"standard_conforming_strings\" вимкнений." #: scan.l:643 msgid "unhandled previous state in xqs" diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 51198b779e416..ec5699e48e884 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -2059,6 +2059,12 @@ do_autovacuum(void) } } } + + /* Release stuff to avoid per-relation leakage */ + if (relopts) + pfree(relopts); + if (tabentry) + pfree(tabentry); } table_endscan(relScan); @@ -2075,7 +2081,8 @@ do_autovacuum(void) Form_pg_class classForm = (Form_pg_class) GETSTRUCT(tuple); PgStat_StatTabEntry *tabentry; Oid relid; - AutoVacOpts *relopts = NULL; + AutoVacOpts *relopts; + bool free_relopts = false; bool dovacuum; bool doanalyze; bool wraparound; @@ -2093,7 +2100,9 @@ do_autovacuum(void) * main rel */ relopts = extract_autovac_opts(tuple, pg_class_desc); - if (relopts == NULL) + if (relopts) + free_relopts = true; + else { av_relation *hentry; bool found; @@ -2114,6 +2123,12 @@ do_autovacuum(void) /* ignore analyze for toast tables */ if (dovacuum) table_oids = lappend_oid(table_oids, relid); + + /* Release stuff to avoid leakage */ + if (free_relopts) + pfree(relopts); + if (tabentry) + pfree(tabentry); } table_endscan(relScan); @@ -2205,6 +2220,12 @@ do_autovacuum(void) get_namespace_name(classForm->relnamespace), NameStr(classForm->relname)))); + /* + * Deletion might involve TOAST table access, so ensure we have a + * valid snapshot. + */ + PushActiveSnapshot(GetTransactionSnapshot()); + object.classId = RelationRelationId; object.objectId = relid; object.objectSubId = 0; @@ -2217,6 +2238,7 @@ do_autovacuum(void) * To commit the deletion, end current transaction and start a new * one. Note this also releases the locks we took. */ + PopActiveSnapshot(); CommitTransactionCommand(); StartTransactionCommand(); @@ -2485,6 +2507,8 @@ do_autovacuum(void) pg_atomic_test_set_flag(&MyWorkerInfo->wi_dobalance); } + list_free(table_oids); + /* * Perform additional work items, as requested by backends. */ @@ -2666,8 +2690,8 @@ perform_work_item(AutoVacuumWorkItem *workitem) /* * extract_autovac_opts * - * Given a relation's pg_class tuple, return the AutoVacOpts portion of - * reloptions, if set; otherwise, return NULL. + * Given a relation's pg_class tuple, return a palloc'd copy of the + * AutoVacOpts portion of reloptions, if set; otherwise, return NULL. * * Note: callers do not have a relation lock on the table at this point, * so the table could have been dropped, and its catalog rows gone, after @@ -2716,6 +2740,7 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, autovac_table *tab = NULL; bool wraparound; AutoVacOpts *avopts; + bool free_avopts = false; /* fetch the relation's relcache entry */ classTup = SearchSysCacheCopy1(RELOID, ObjectIdGetDatum(relid)); @@ -2728,8 +2753,10 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, * main table reloptions if the toast table itself doesn't have. */ avopts = extract_autovac_opts(classTup, pg_class_desc); - if (classForm->relkind == RELKIND_TOASTVALUE && - avopts == NULL && table_toast_map != NULL) + if (avopts) + free_avopts = true; + else if (classForm->relkind == RELKIND_TOASTVALUE && + table_toast_map != NULL) { av_relation *hentry; bool found; @@ -2832,6 +2859,8 @@ table_recheck_autovac(Oid relid, HTAB *table_toast_map, avopts->vacuum_cost_delay >= 0)); } + if (free_avopts) + pfree(avopts); heap_freetuple(classTup); return tab; } @@ -2863,6 +2892,10 @@ recheck_relation_needs_vacanalyze(Oid relid, effective_multixact_freeze_max_age, dovacuum, doanalyze, wraparound); + /* Release tabentry to avoid leakage */ + if (tabentry) + pfree(tabentry); + /* ignore ANALYZE for toast tables */ if (classForm->relkind == RELKIND_TOASTVALUE) *doanalyze = false; @@ -3088,18 +3121,22 @@ autovacuum_do_vac_analyze(autovac_table *tab, BufferAccessStrategy bstrategy) VacuumRelation *rel; List *rel_list; MemoryContext vac_context; + MemoryContext old_context; /* Let pgstat know what we're doing */ autovac_report_activity(tab); + /* Create a context that vacuum() can use as cross-transaction storage */ + vac_context = AllocSetContextCreate(CurrentMemoryContext, + "Vacuum", + ALLOCSET_DEFAULT_SIZES); + /* Set up one VacuumRelation target, identified by OID, for vacuum() */ + old_context = MemoryContextSwitchTo(vac_context); rangevar = makeRangeVar(tab->at_nspname, tab->at_relname, -1); rel = makeVacuumRelation(rangevar, tab->at_relid, NIL); rel_list = list_make1(rel); - - vac_context = AllocSetContextCreate(CurrentMemoryContext, - "Vacuum", - ALLOCSET_DEFAULT_SIZES); + MemoryContextSwitchTo(old_context); vacuum(rel_list, &tab->at_params, bstrategy, vac_context, true); diff --git a/src/backend/postmaster/checkpointer.c b/src/backend/postmaster/checkpointer.c index 199f008bcda81..342376f933ecf 100644 --- a/src/backend/postmaster/checkpointer.c +++ b/src/backend/postmaster/checkpointer.c @@ -130,6 +130,9 @@ static CheckpointerShmemStruct *CheckpointerShmem; /* interval for calling AbsorbSyncRequests in CheckpointWriteDelay */ #define WRITES_PER_ABSORB 1000 +/* Max number of requests the checkpointer request queue can hold */ +#define MAX_CHECKPOINT_REQUESTS 10000000 + /* * GUC parameters */ @@ -881,11 +884,14 @@ CheckpointerShmemSize(void) Size size; /* - * Currently, the size of the requests[] array is arbitrarily set equal to - * NBuffers. This may prove too large or small ... + * The size of the requests[] array is arbitrarily set equal to NBuffers. + * But there is a cap of MAX_CHECKPOINT_REQUESTS to prevent accumulating + * too many checkpoint requests in the ring buffer. */ size = offsetof(CheckpointerShmemStruct, requests); - size = add_size(size, mul_size(NBuffers, sizeof(CheckpointerRequest))); + size = add_size(size, mul_size(Min(NBuffers, + MAX_CHECKPOINT_REQUESTS), + sizeof(CheckpointerRequest))); return size; } @@ -914,7 +920,7 @@ CheckpointerShmemInit(void) */ MemSet(CheckpointerShmem, 0, size); SpinLockInit(&CheckpointerShmem->ckpt_lck); - CheckpointerShmem->max_requests = NBuffers; + CheckpointerShmem->max_requests = Min(NBuffers, MAX_CHECKPOINT_REQUESTS); ConditionVariableInit(&CheckpointerShmem->start_cv); ConditionVariableInit(&CheckpointerShmem->done_cv); } diff --git a/src/backend/replication/logical/decode.c b/src/backend/replication/logical/decode.c index 8ec5adfd9099a..4911e98ec2d2e 100644 --- a/src/backend/replication/logical/decode.c +++ b/src/backend/replication/logical/decode.c @@ -411,19 +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 (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; @@ -470,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; @@ -490,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; @@ -528,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; diff --git a/src/backend/replication/logical/launcher.c b/src/backend/replication/logical/launcher.c index 27c3a91fb75ea..294d0d74d8c6b 100644 --- a/src/backend/replication/logical/launcher.c +++ b/src/backend/replication/logical/launcher.c @@ -184,12 +184,14 @@ WaitForReplicationWorkerAttach(LogicalRepWorker *worker, uint16 generation, BackgroundWorkerHandle *handle) { - BgwHandleStatus status; - int rc; + bool result = false; + bool dropped_latch = false; for (;;) { + BgwHandleStatus status; pid_t pid; + int rc; CHECK_FOR_INTERRUPTS(); @@ -198,8 +200,9 @@ WaitForReplicationWorkerAttach(LogicalRepWorker *worker, /* Worker either died or has started. Return false if died. */ if (!worker->in_use || worker->proc) { + result = worker->in_use; LWLockRelease(LogicalRepWorkerLock); - return worker->in_use; + break; } LWLockRelease(LogicalRepWorkerLock); @@ -214,7 +217,7 @@ WaitForReplicationWorkerAttach(LogicalRepWorker *worker, if (generation == worker->generation) logicalrep_worker_cleanup(worker); LWLockRelease(LogicalRepWorkerLock); - return false; + break; /* result is already false */ } /* @@ -229,8 +232,18 @@ WaitForReplicationWorkerAttach(LogicalRepWorker *worker, { ResetLatch(MyLatch); CHECK_FOR_INTERRUPTS(); + dropped_latch = true; } } + + /* + * If we had to clear a latch event in order to wait, be sure to restore + * it before exiting. Otherwise caller may miss events. + */ + if (dropped_latch) + SetLatch(MyLatch); + + return result; } /* @@ -1197,10 +1210,21 @@ ApplyLauncherMain(Datum main_arg) (elapsed = TimestampDifferenceMilliseconds(last_start, now)) >= wal_retrieve_retry_interval) { ApplyLauncherSetWorkerStartTime(sub->oid, now); - logicalrep_worker_launch(WORKERTYPE_APPLY, - sub->dbid, sub->oid, sub->name, - sub->owner, InvalidOid, - DSM_HANDLE_INVALID); + if (!logicalrep_worker_launch(WORKERTYPE_APPLY, + sub->dbid, sub->oid, sub->name, + sub->owner, InvalidOid, + DSM_HANDLE_INVALID)) + { + /* + * We get here either if we failed to launch a worker + * (perhaps for resource-exhaustion reasons) or if we + * launched one but it immediately quit. Either way, it + * seems appropriate to try again after + * wal_retrieve_retry_interval. + */ + wait_time = Min(wait_time, + wal_retrieve_retry_interval); + } } else { diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c index e941bb491d81d..206fb932484ca 100644 --- a/src/backend/replication/logical/logical.c +++ b/src/backend/replication/logical/logical.c @@ -29,6 +29,7 @@ #include "postgres.h" #include "access/xact.h" +#include "access/xlog_internal.h" #include "access/xlogutils.h" #include "fmgr.h" #include "miscadmin.h" @@ -41,6 +42,7 @@ #include "storage/proc.h" #include "storage/procarray.h" #include "utils/builtins.h" +#include "utils/injection_point.h" #include "utils/inval.h" #include "utils/memutils.h" @@ -1844,10 +1846,26 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn) { bool updated_xmin = false; bool updated_restart = false; + XLogRecPtr restart_lsn pg_attribute_unused(); SpinLockAcquire(&MyReplicationSlot->mutex); - MyReplicationSlot->data.confirmed_flush = lsn; + /* remember the old restart lsn */ + restart_lsn = MyReplicationSlot->data.restart_lsn; + + /* + * Prevent moving the confirmed_flush backwards, as this could lead to + * data duplication issues caused by replicating already replicated + * changes. + * + * This can happen when a client acknowledges an LSN it doesn't have + * to do anything for, and thus didn't store persistently. After a + * restart, the client can send the prior LSN that it stored + * persistently as an acknowledgement, but we need to ignore such an + * LSN. See similar case handling in CreateDecodingContext. + */ + if (lsn > MyReplicationSlot->data.confirmed_flush) + MyReplicationSlot->data.confirmed_flush = lsn; /* if we're past the location required for bumping xmin, do so */ if (MyReplicationSlot->candidate_xmin_lsn != InvalidXLogRecPtr && @@ -1885,9 +1903,29 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn) SpinLockRelease(&MyReplicationSlot->mutex); - /* first write new xmin to disk, so we know what's up after a crash */ + /* + * First, write new xmin and restart_lsn to disk so we know what's up + * after a crash. Even when we do this, the checkpointer can see the + * updated restart_lsn value in the shared memory; then, a crash can + * happen before we manage to write that value to the disk. Thus, + * checkpointer still needs to make special efforts to keep WAL + * segments required by the restart_lsn written to the disk. See + * CreateCheckPoint() and CreateRestartPoint() for details. + */ if (updated_xmin || updated_restart) { +#ifdef USE_INJECTION_POINTS + XLogSegNo seg1, + seg2; + + XLByteToSeg(restart_lsn, seg1, wal_segment_size); + XLByteToSeg(MyReplicationSlot->data.restart_lsn, seg2, wal_segment_size); + + /* trigger injection point, but only if segment changes */ + if (seg1 != seg2) + INJECTION_POINT("logical-replication-slot-advance-segment"); +#endif + ReplicationSlotMarkDirty(); ReplicationSlotSave(); elog(DEBUG1, "updated xmin: %u restart: %u", updated_xmin, updated_restart); @@ -1912,7 +1950,14 @@ LogicalConfirmReceivedLocation(XLogRecPtr lsn) else { SpinLockAcquire(&MyReplicationSlot->mutex); - MyReplicationSlot->data.confirmed_flush = lsn; + + /* + * Prevent moving the confirmed_flush backwards. See comments above + * for the details. + */ + if (lsn > MyReplicationSlot->data.confirmed_flush) + MyReplicationSlot->data.confirmed_flush = lsn; + SpinLockRelease(&MyReplicationSlot->mutex); } } diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c index 9c742e96eb33a..4bd1f7af061a0 100644 --- a/src/backend/replication/logical/reorderbuffer.c +++ b/src/backend/replication/logical/reorderbuffer.c @@ -108,10 +108,22 @@ #include "storage/fd.h" #include "storage/sinval.h" #include "utils/builtins.h" +#include "utils/inval.h" #include "utils/memutils.h" #include "utils/rel.h" #include "utils/relfilenumbermap.h" +/* + * Each transaction has an 8MB limit for invalidation messages distributed from + * other transactions. This limit is set considering scenarios with many + * concurrent logical decoding operations. When the distributed invalidation + * messages reach this threshold, the transaction is marked as + * RBTXN_DISTR_INVAL_OVERFLOWED to invalidate the complete cache as we have lost + * some inval messages and hence don't know what needs to be invalidated. + */ +#define MAX_DISTR_INVAL_MSG_PER_TXN \ + ((8 * 1024 * 1024) / sizeof(SharedInvalidationMessage)) + /* entry for a hash table we use to map from xid to our transaction state */ typedef struct ReorderBufferTXNByIdEnt { @@ -469,6 +481,12 @@ ReorderBufferReturnTXN(ReorderBuffer *rb, ReorderBufferTXN *txn) txn->invalidations = NULL; } + if (txn->invalidations_distributed) + { + pfree(txn->invalidations_distributed); + txn->invalidations_distributed = NULL; + } + /* Reset the toast hash */ ReorderBufferToastReset(rb, txn); @@ -2498,7 +2516,7 @@ ReorderBufferProcessTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, if (++changes_count >= CHANGES_THRESHOLD) { - rb->update_progress_txn(rb, txn, change->lsn); + rb->update_progress_txn(rb, txn, prev_lsn); changes_count = 0; } } @@ -2574,7 +2592,17 @@ ReorderBufferProcessTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, AbortCurrentTransaction(); /* make sure there's no cache pollution */ - ReorderBufferExecuteInvalidations(txn->ninvalidations, txn->invalidations); + if (rbtxn_distr_inval_overflowed(txn)) + { + Assert(txn->ninvalidations_distributed == 0); + InvalidateSystemCaches(); + } + else + { + ReorderBufferExecuteInvalidations(txn->ninvalidations, txn->invalidations); + ReorderBufferExecuteInvalidations(txn->ninvalidations_distributed, + txn->invalidations_distributed); + } if (using_subtxn) RollbackAndReleaseCurrentSubTransaction(); @@ -2620,8 +2648,17 @@ ReorderBufferProcessTXN(ReorderBuffer *rb, ReorderBufferTXN *txn, AbortCurrentTransaction(); /* make sure there's no cache pollution */ - ReorderBufferExecuteInvalidations(txn->ninvalidations, - txn->invalidations); + if (rbtxn_distr_inval_overflowed(txn)) + { + Assert(txn->ninvalidations_distributed == 0); + InvalidateSystemCaches(); + } + else + { + ReorderBufferExecuteInvalidations(txn->ninvalidations, txn->invalidations); + ReorderBufferExecuteInvalidations(txn->ninvalidations_distributed, + txn->invalidations_distributed); + } if (using_subtxn) RollbackAndReleaseCurrentSubTransaction(); @@ -2951,7 +2988,8 @@ ReorderBufferAbort(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn, * We might have decoded changes for this transaction that could load * the cache as per the current transaction's view (consider DDL's * happened in this transaction). We don't want the decoding of future - * transactions to use those cache entries so execute invalidations. + * transactions to use those cache entries so execute only the inval + * messages in this transaction. */ if (txn->ninvalidations > 0) ReorderBufferImmediateInvalidation(rb, txn->ninvalidations, @@ -3038,9 +3076,10 @@ ReorderBufferForget(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn) txn->final_lsn = lsn; /* - * Process cache invalidation messages if there are any. Even if we're not - * interested in the transaction's contents, it could have manipulated the - * catalog and we need to update the caches according to that. + * Process only cache invalidation messages in this transaction if there + * are any. Even if we're not interested in the transaction's contents, it + * could have manipulated the catalog and we need to update the caches + * according to that. */ if (txn->base_snapshot != NULL && txn->ninvalidations > 0) ReorderBufferImmediateInvalidation(rb, txn->ninvalidations, @@ -3312,6 +3351,57 @@ ReorderBufferAddNewTupleCids(ReorderBuffer *rb, TransactionId xid, txn->ntuplecids++; } +/* + * Add new invalidation messages to the reorder buffer queue. + */ +static void +ReorderBufferQueueInvalidations(ReorderBuffer *rb, TransactionId xid, + XLogRecPtr lsn, Size nmsgs, + SharedInvalidationMessage *msgs) +{ + ReorderBufferChange *change; + + change = ReorderBufferGetChange(rb); + change->action = REORDER_BUFFER_CHANGE_INVALIDATION; + change->data.inval.ninvalidations = nmsgs; + change->data.inval.invalidations = (SharedInvalidationMessage *) + palloc(sizeof(SharedInvalidationMessage) * nmsgs); + memcpy(change->data.inval.invalidations, msgs, + sizeof(SharedInvalidationMessage) * nmsgs); + + ReorderBufferQueueChange(rb, xid, lsn, change, false); +} + +/* + * A helper function for ReorderBufferAddInvalidations() and + * ReorderBufferAddDistributedInvalidations() to accumulate the invalidation + * messages to the **invals_out. + */ +static void +ReorderBufferAccumulateInvalidations(SharedInvalidationMessage **invals_out, + uint32 *ninvals_out, + SharedInvalidationMessage *msgs_new, + Size nmsgs_new) +{ + if (*ninvals_out == 0) + { + *ninvals_out = nmsgs_new; + *invals_out = (SharedInvalidationMessage *) + palloc(sizeof(SharedInvalidationMessage) * nmsgs_new); + memcpy(*invals_out, msgs_new, sizeof(SharedInvalidationMessage) * nmsgs_new); + } + else + { + /* Enlarge the array of inval messages */ + *invals_out = (SharedInvalidationMessage *) + repalloc(*invals_out, sizeof(SharedInvalidationMessage) * + (*ninvals_out + nmsgs_new)); + memcpy(*invals_out + *ninvals_out, msgs_new, + nmsgs_new * sizeof(SharedInvalidationMessage)); + *ninvals_out += nmsgs_new; + } +} + /* * Accumulate the invalidations for executing them later. * @@ -3332,7 +3422,6 @@ ReorderBufferAddInvalidations(ReorderBuffer *rb, TransactionId xid, { ReorderBufferTXN *txn; MemoryContext oldcontext; - ReorderBufferChange *change; txn = ReorderBufferTXNByXid(rb, xid, true, NULL, lsn, true); @@ -3347,35 +3436,76 @@ ReorderBufferAddInvalidations(ReorderBuffer *rb, TransactionId xid, Assert(nmsgs > 0); - /* Accumulate invalidations. */ - if (txn->ninvalidations == 0) - { - txn->ninvalidations = nmsgs; - txn->invalidations = (SharedInvalidationMessage *) - palloc(sizeof(SharedInvalidationMessage) * nmsgs); - memcpy(txn->invalidations, msgs, - sizeof(SharedInvalidationMessage) * nmsgs); - } - else + ReorderBufferAccumulateInvalidations(&txn->invalidations, + &txn->ninvalidations, + msgs, nmsgs); + + ReorderBufferQueueInvalidations(rb, xid, lsn, nmsgs, msgs); + + MemoryContextSwitchTo(oldcontext); +} + +/* + * Accumulate the invalidations distributed by other committed transactions + * for executing them later. + * + * This function is similar to ReorderBufferAddInvalidations() but stores + * the given inval messages to the txn->invalidations_distributed with the + * overflow check. + * + * This needs to be called by committed transactions to distribute their + * inval messages to in-progress transactions. + */ +void +ReorderBufferAddDistributedInvalidations(ReorderBuffer *rb, TransactionId xid, + XLogRecPtr lsn, Size nmsgs, + SharedInvalidationMessage *msgs) +{ + ReorderBufferTXN *txn; + MemoryContext oldcontext; + + txn = ReorderBufferTXNByXid(rb, xid, true, NULL, lsn, true); + + oldcontext = MemoryContextSwitchTo(rb->context); + + /* + * Collect all the invalidations under the top transaction, if available, + * so that we can execute them all together. See comments + * ReorderBufferAddInvalidations. + */ + txn = rbtxn_get_toptxn(txn); + + Assert(nmsgs > 0); + + if (!rbtxn_distr_inval_overflowed(txn)) { - txn->invalidations = (SharedInvalidationMessage *) - repalloc(txn->invalidations, sizeof(SharedInvalidationMessage) * - (txn->ninvalidations + nmsgs)); + /* + * Check the transaction has enough space for storing distributed + * invalidation messages. + */ + if (txn->ninvalidations_distributed + nmsgs >= MAX_DISTR_INVAL_MSG_PER_TXN) + { + /* + * Mark the invalidation message as overflowed and free up the + * messages accumulated so far. + */ + txn->txn_flags |= RBTXN_DISTR_INVAL_OVERFLOWED; - memcpy(txn->invalidations + txn->ninvalidations, msgs, - nmsgs * sizeof(SharedInvalidationMessage)); - txn->ninvalidations += nmsgs; + if (txn->invalidations_distributed) + { + pfree(txn->invalidations_distributed); + txn->invalidations_distributed = NULL; + txn->ninvalidations_distributed = 0; + } + } + else + ReorderBufferAccumulateInvalidations(&txn->invalidations_distributed, + &txn->ninvalidations_distributed, + msgs, nmsgs); } - change = ReorderBufferGetChange(rb); - change->action = REORDER_BUFFER_CHANGE_INVALIDATION; - change->data.inval.ninvalidations = nmsgs; - change->data.inval.invalidations = (SharedInvalidationMessage *) - palloc(sizeof(SharedInvalidationMessage) * nmsgs); - memcpy(change->data.inval.invalidations, msgs, - sizeof(SharedInvalidationMessage) * nmsgs); - - ReorderBufferQueueChange(rb, xid, lsn, change, false); + /* Queue the invalidation messages into the transaction */ + ReorderBufferQueueInvalidations(rb, xid, lsn, nmsgs, msgs); MemoryContextSwitchTo(oldcontext); } @@ -5337,3 +5467,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 index 73fe3f56af2b3..1a8cff9cf1f83 100644 --- a/src/backend/replication/logical/slotsync.c +++ b/src/backend/replication/logical/slotsync.c @@ -212,9 +212,9 @@ update_local_synced_slot(RemoteSlot *remote_slot, Oid remote_dbid, * 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", + errmsg("could not synchronize replication slot \"%s\"", 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.", + errdetail("Synchronization could lead to data loss, because the remote slot needs WAL at LSN %X/%X and catalog xmin %u, but the standby 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), @@ -577,7 +577,7 @@ update_and_persist_local_synced_slot(RemoteSlot *remote_slot, Oid remote_dbid) { 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.", + errdetail("Synchronization could lead to data loss, because the standby could not build a consistent snapshot to decode WALs at LSN %X/%X.", LSN_FORMAT_ARGS(slot->data.restart_lsn))); return false; @@ -1040,14 +1040,14 @@ 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, + { + ereport(elevel, errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("replication slot synchronization requires \"wal_level\" >= \"logical\"")); + return false; + } /* * A physical replication slot(primary_slot_name) is required on the diff --git a/src/backend/replication/logical/snapbuild.c b/src/backend/replication/logical/snapbuild.c index ae676145e602e..5c3bbf0e93f8c 100644 --- a/src/backend/replication/logical/snapbuild.c +++ b/src/backend/replication/logical/snapbuild.c @@ -300,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); @@ -859,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; @@ -875,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) { @@ -888,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 @@ -897,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)); /* @@ -913,6 +922,41 @@ 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. + * + * Distribute only the invalidation messages generated by the current + * committed transaction. Invalidation messages received from other + * transactions would have already been propagated to the relevant + * in-progress transactions. This transaction would have processed + * those invalidations, ensuring that subsequent transactions observe + * a consistent cache state. + */ + if (txn->xid != xid) + { + uint32 ninvalidations; + SharedInvalidationMessage *msgs = NULL; + + ninvalidations = ReorderBufferGetInvalidations(builder->reorder, + xid, &msgs); + + if (ninvalidations > 0) + { + Assert(msgs != NULL); + + ReorderBufferAddDistributedInvalidations(builder->reorder, + txn->xid, lsn, + ninvalidations, msgs); + } + } } } @@ -1184,8 +1228,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); } } diff --git a/src/backend/replication/logical/tablesync.c b/src/backend/replication/logical/tablesync.c index b00267f042708..1da5a7e7ef86e 100644 --- a/src/backend/replication/logical/tablesync.c +++ b/src/backend/replication/logical/tablesync.c @@ -426,6 +426,7 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) ListCell *lc; bool started_tx = false; bool should_exit = false; + Relation rel = NULL; Assert(!IsTransactionState()); @@ -493,7 +494,16 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) * worker to remove the origin tracking as if there is any * error while dropping we won't restart it to drop the * origin. So passing missing_ok = true. + * + * Lock the subscription and origin in the same order as we + * are doing during DDL commands to avoid deadlocks. See + * AlterSubscription_refresh. */ + LockSharedObject(SubscriptionRelationId, MyLogicalRepWorker->subid, + 0, AccessShareLock); + if (!rel) + rel = table_open(SubscriptionRelRelationId, RowExclusiveLock); + ReplicationOriginNameForLogicalRep(MyLogicalRepWorker->subid, rstate->relid, originname, @@ -503,9 +513,9 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) /* * Update the state to READY only after the origin cleanup. */ - UpdateSubscriptionRelState(MyLogicalRepWorker->subid, - rstate->relid, rstate->state, - rstate->lsn); + UpdateSubscriptionRelStateEx(MyLogicalRepWorker->subid, + rstate->relid, rstate->state, + rstate->lsn, true); } } else @@ -556,7 +566,14 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) * 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. + * + * Also close any tables prior to the commit. */ + if (rel) + { + table_close(rel, NoLock); + rel = NULL; + } CommitTransactionCommand(); pgstat_report_stat(false); } @@ -604,20 +621,29 @@ process_syncing_tables_for_apply(XLogRecPtr current_lsn) TimestampDifferenceExceeds(hentry->last_start_time, now, wal_retrieve_retry_interval)) { - logicalrep_worker_launch(WORKERTYPE_TABLESYNC, - MyLogicalRepWorker->dbid, - MySubscription->oid, - MySubscription->name, - MyLogicalRepWorker->userid, - rstate->relid, - DSM_HANDLE_INVALID); + /* + * Set the last_start_time even if we fail to start + * the worker, so that we won't retry until + * wal_retrieve_retry_interval has elapsed. + */ hentry->last_start_time = now; + (void) logicalrep_worker_launch(WORKERTYPE_TABLESYNC, + MyLogicalRepWorker->dbid, + MySubscription->oid, + MySubscription->name, + MyLogicalRepWorker->userid, + rstate->relid, + DSM_HANDLE_INVALID); } } } } } + /* Close table if opened */ + if (rel) + table_close(rel, NoLock); + if (started_tx) { /* diff --git a/src/backend/replication/logical/worker.c b/src/backend/replication/logical/worker.c index d091a1dd27cdc..1bff6c92dda0c 100644 --- a/src/backend/replication/logical/worker.c +++ b/src/backend/replication/logical/worker.c @@ -416,6 +416,8 @@ static inline void reset_apply_error_context_info(void); static TransApplyAction get_transaction_apply_action(TransactionId xid, ParallelApplyWorkerInfo **winfo); +static void replorigin_reset(int code, Datum arg); + /* * Form the origin name for the subscription. * @@ -2432,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); @@ -2460,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); } /* @@ -2767,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); @@ -2802,7 +2814,11 @@ apply_handle_delete_internal(ApplyExecutionData *edata, bool found; EvalPlanQualInit(&epqstate, estate, NULL, NIL, -1, NIL); - ExecOpenIndices(relinfo, false); + + /* 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); @@ -2831,7 +2847,6 @@ apply_handle_delete_internal(ApplyExecutionData *edata, } /* Cleanup. */ - ExecCloseIndices(relinfo); EvalPlanQualEnd(&epqstate); } @@ -3042,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 @@ -4430,6 +4443,14 @@ start_apply(XLogRecPtr 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 @@ -4529,8 +4550,16 @@ run_apply_worker() walrcv_startstreaming(LogRepWorkerWalRcvConn, &options); StartTransactionCommand(); + + /* + * Updating pg_subscription might involve TOAST table access, so + * ensure we have a valid snapshot. + */ + PushActiveSnapshot(GetTransactionSnapshot()); + UpdateTwoPhaseState(MySubscription->oid, LOGICALREP_TWOPHASE_STATE_ENABLED); MySubscription->twophasestate = LOGICALREP_TWOPHASE_STATE_ENABLED; + PopActiveSnapshot(); CommitTransactionCommand(); } else @@ -4746,7 +4775,15 @@ DisableSubscriptionAndExit(void) /* Disable the subscription */ StartTransactionCommand(); + + /* + * Updating pg_subscription might involve TOAST table access, so ensure we + * have a valid snapshot. + */ + PushActiveSnapshot(GetTransactionSnapshot()); + DisableSubscription(MySubscription->oid); + PopActiveSnapshot(); CommitTransactionCommand(); /* Ensure we remove no-longer-useful entry for worker's start time */ @@ -4850,6 +4887,12 @@ clear_subscription_skip_lsn(XLogRecPtr finish_lsn) started_tx = true; } + /* + * Updating pg_subscription might involve TOAST table access, so ensure we + * have a valid snapshot. + */ + PushActiveSnapshot(GetTransactionSnapshot()); + /* * Protect subskiplsn of pg_subscription from being concurrently updated * while clearing it. @@ -4908,6 +4951,8 @@ clear_subscription_skip_lsn(XLogRecPtr finish_lsn) heap_freetuple(tup); table_close(rel, NoLock); + PopActiveSnapshot(); + if (started_tx) CommitTransactionCommand(); } @@ -4917,23 +4962,12 @@ void apply_error_callback(void *arg) { ApplyErrorCallbackArg *errarg = &apply_error_callback_arg; - int elevel; if (apply_error_callback_arg.command == 0) return; Assert(errarg->origin_name); - elevel = geterrlevel(); - - /* - * 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. - */ - if (elevel >= ERROR) - replorigin_reset(0, (Datum) 0); - if (errarg->rel == NULL) { if (!TransactionIdIsValid(errarg->remote_xid)) diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index 419f070ab71a9..a234e2ca9c1af 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -1671,14 +1671,6 @@ 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) { /* @@ -1805,6 +1797,10 @@ InvalidateObsoleteReplicationSlots(ReplicationSlotInvalidationCause cause, if (!s->in_use) continue; + /* Prevent invalidation of logical slots during binary upgrade. */ + if (SlotIsLogical(s) && IsBinaryUpgrade) + continue; + if (InvalidatePossiblyObsoleteSlot(cause, s, oldestLSN, dboid, snapshotConflictHorizon, &invalidated)) @@ -2327,12 +2323,29 @@ 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), @@ -2504,6 +2517,8 @@ check_synchronized_standby_slots(char **newval, void **extra, GucSource source) /* 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); diff --git a/src/backend/replication/slotfuncs.c b/src/backend/replication/slotfuncs.c index dd6c1d5a7e353..01e98bc1ceff7 100644 --- a/src/backend/replication/slotfuncs.c +++ b/src/backend/replication/slotfuncs.c @@ -681,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); @@ -698,13 +705,18 @@ copy_replication_slot(FunctionCallInfo fcinfo, bool logical_slot) * hence pass find_startpoint false. confirmed_flush will be set * below, by copying from the source slot. * - * To avoid potential issues with the slot synchronization where the - * restart_lsn of a replication slot can go backward, we set the - * failover option to false here. This situation occurs when a slot - * on the primary server is dropped and immediately replaced with a - * new slot of the same name, created by copying from another existing - * slot. However, the slot synchronization will only observe the - * restart_lsn of the same slot going backward. + * 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, @@ -777,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; diff --git a/src/backend/replication/syncrep.c b/src/backend/replication/syncrep.c index fa5988c824ea0..e6df5281289ec 100644 --- a/src/backend/replication/syncrep.c +++ b/src/backend/replication/syncrep.c @@ -161,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. */ @@ -186,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; } @@ -912,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. @@ -922,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); @@ -946,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); } diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c index 973ef75f138d1..7cdfe1a648731 100644 --- a/src/backend/replication/walreceiver.c +++ b/src/backend/replication/walreceiver.c @@ -944,7 +944,7 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr, TimeLineID tli) byteswritten = xlog_smgr->seg_write(recvFile, buf, segbytes, (off_t) startoff, recvFileTLI, - recvSegNo); + recvSegNo, wal_segment_size); if (byteswritten <= 0) { char xlogfname[MAXFNAMELEN]; diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index c3181e3295ea3..4019eb9029251 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -90,10 +90,14 @@ #include "utils/guc.h" #include "utils/memutils.h" #include "utils/pg_lsn.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. * @@ -1693,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); @@ -1820,6 +1824,7 @@ 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 @@ -1840,6 +1845,7 @@ WalSndWaitForWal(XLogRecPtr loc) { bool wait_for_standby_at_stop = false; long sleeptime; + TimestampTz now; /* Clear any already-pending wakeups */ ResetLatch(MyLatch); @@ -1950,7 +1956,8 @@ 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; @@ -1959,6 +1966,14 @@ WalSndWaitForWal(XLogRecPtr loc) 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); } @@ -2377,6 +2392,10 @@ PhysicalConfirmReceivedLocation(XLogRecPtr lsn) * be energy wasted - the worst thing lost information could cause here is * to give wrong information in a statistics view - we'll just potentially * be more conservative in removing files. + * + * Checkpointer makes special efforts to keep the WAL segments required by + * the restart_lsn written to the disk. See CreateCheckPoint() and + * CreateRestartPoint() for details. */ } @@ -2766,6 +2785,8 @@ WalSndCheckTimeOut(void) static void WalSndLoop(WalSndSendDataCallback send_data) { + TimestampTz last_flush = 0; + /* * Initialize the last reply timestamp. That enables timeout processing * from hereon. @@ -2860,6 +2881,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) || @@ -2867,6 +2891,7 @@ WalSndLoop(WalSndSendDataCallback send_data) { long sleeptime; int wakeEvents; + TimestampTz now; if (!streamingDoneReceiving) wakeEvents = WL_SOCKET_READABLE; @@ -2877,11 +2902,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); } @@ -3420,8 +3454,16 @@ XLogSendLogical(void) if (flushPtr == InvalidXLogRecPtr || logical_decoding_ctx->reader->EndRecPtr >= flushPtr) { + /* + * For cascading logical WAL senders, we use the replay LSN instead of + * the flush LSN, since logical decoding on a standby only processes + * WAL that has been replayed. This distinction becomes particularly + * important during shutdown, as new WAL is no longer replayed and the + * last replayed LSN marks the furthest point up to which decoding can + * proceed. + */ if (am_cascading_walsender) - flushPtr = GetStandbyFlushRecPtr(NULL); + flushPtr = GetXLogReplayRecPtr(NULL); else flushPtr = GetFlushRecPtr(NULL); } 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/statistics/extended_stats.c b/src/backend/statistics/extended_stats.c index 99fdf208dba1c..b84ee2979ff50 100644 --- a/src/backend/statistics/extended_stats.c +++ b/src/backend/statistics/extended_stats.c @@ -1320,6 +1320,9 @@ choose_best_statistics(List *stats, char requiredkind, bool inh, * so we can't cope with system columns. * *exprs: input/output parameter collecting primitive subclauses within * the clause tree + * *leakproof: input/output parameter recording the leakproofness of the + * clause tree. This should be true initially, and will be set to false + * if any operator function used in an OpExpr is not leakproof. * * Returns false if there is something we definitively can't handle. * On true return, we can proceed to match the *exprs against statistics. @@ -1327,7 +1330,7 @@ choose_best_statistics(List *stats, char requiredkind, bool inh, static bool statext_is_compatible_clause_internal(PlannerInfo *root, Node *clause, Index relid, Bitmapset **attnums, - List **exprs) + List **exprs, bool *leakproof) { /* Look inside any binary-compatible relabeling (as in examine_variable) */ if (IsA(clause, RelabelType)) @@ -1362,7 +1365,6 @@ statext_is_compatible_clause_internal(PlannerInfo *root, Node *clause, /* (Var/Expr op Const) or (Const op Var/Expr) */ if (is_opclause(clause)) { - RangeTblEntry *rte = root->simple_rte_array[relid]; OpExpr *expr = (OpExpr *) clause; Node *clause_expr; @@ -1397,24 +1399,15 @@ statext_is_compatible_clause_internal(PlannerInfo *root, Node *clause, return false; } - /* - * If there are any securityQuals on the RTE from security barrier - * views or RLS policies, then the user may not have access to all the - * table's data, and we must check that the operator is leak-proof. - * - * If the operator is leaky, then we must ignore this clause for the - * purposes of estimating with MCV lists, otherwise the operator might - * reveal values from the MCV list that the user doesn't have - * permission to see. - */ - if (rte->securityQuals != NIL && - !get_func_leakproof(get_opcode(expr->opno))) - return false; + /* Check if the operator is leakproof */ + if (*leakproof) + *leakproof = get_func_leakproof(get_opcode(expr->opno)); /* Check (Var op Const) or (Const op Var) clauses by recursing. */ if (IsA(clause_expr, Var)) return statext_is_compatible_clause_internal(root, clause_expr, - relid, attnums, exprs); + relid, attnums, + exprs, leakproof); /* Otherwise we have (Expr op Const) or (Const op Expr). */ *exprs = lappend(*exprs, clause_expr); @@ -1424,7 +1417,6 @@ statext_is_compatible_clause_internal(PlannerInfo *root, Node *clause, /* Var/Expr IN Array */ if (IsA(clause, ScalarArrayOpExpr)) { - RangeTblEntry *rte = root->simple_rte_array[relid]; ScalarArrayOpExpr *expr = (ScalarArrayOpExpr *) clause; Node *clause_expr; bool expronleft; @@ -1464,24 +1456,15 @@ statext_is_compatible_clause_internal(PlannerInfo *root, Node *clause, return false; } - /* - * If there are any securityQuals on the RTE from security barrier - * views or RLS policies, then the user may not have access to all the - * table's data, and we must check that the operator is leak-proof. - * - * If the operator is leaky, then we must ignore this clause for the - * purposes of estimating with MCV lists, otherwise the operator might - * reveal values from the MCV list that the user doesn't have - * permission to see. - */ - if (rte->securityQuals != NIL && - !get_func_leakproof(get_opcode(expr->opno))) - return false; + /* Check if the operator is leakproof */ + if (*leakproof) + *leakproof = get_func_leakproof(get_opcode(expr->opno)); /* Check Var IN Array clauses by recursing. */ if (IsA(clause_expr, Var)) return statext_is_compatible_clause_internal(root, clause_expr, - relid, attnums, exprs); + relid, attnums, + exprs, leakproof); /* Otherwise we have Expr IN Array. */ *exprs = lappend(*exprs, clause_expr); @@ -1518,7 +1501,8 @@ statext_is_compatible_clause_internal(PlannerInfo *root, Node *clause, */ if (!statext_is_compatible_clause_internal(root, (Node *) lfirst(lc), - relid, attnums, exprs)) + relid, attnums, exprs, + leakproof)) return false; } @@ -1532,8 +1516,10 @@ statext_is_compatible_clause_internal(PlannerInfo *root, Node *clause, /* Check Var IS NULL clauses by recursing. */ if (IsA(nt->arg, Var)) - return statext_is_compatible_clause_internal(root, (Node *) (nt->arg), - relid, attnums, exprs); + return statext_is_compatible_clause_internal(root, + (Node *) (nt->arg), + relid, attnums, + exprs, leakproof); /* Otherwise we have Expr IS NULL. */ *exprs = lappend(*exprs, nt->arg); @@ -1572,11 +1558,9 @@ static bool statext_is_compatible_clause(PlannerInfo *root, Node *clause, Index relid, Bitmapset **attnums, List **exprs) { - RangeTblEntry *rte = root->simple_rte_array[relid]; - RelOptInfo *rel = root->simple_rel_array[relid]; RestrictInfo *rinfo; int clause_relid; - Oid userid; + bool leakproof; /* * Special-case handling for bare BoolExpr AND clauses, because the @@ -1616,18 +1600,31 @@ statext_is_compatible_clause(PlannerInfo *root, Node *clause, Index relid, clause_relid != relid) return false; - /* Check the clause and determine what attributes it references. */ + /* + * Check the clause, determine what attributes it references, and whether + * it includes any non-leakproof operators. + */ + leakproof = true; if (!statext_is_compatible_clause_internal(root, (Node *) rinfo->clause, - relid, attnums, exprs)) + relid, attnums, exprs, + &leakproof)) return false; /* - * Check that the user has permission to read all required attributes. + * If the clause includes any non-leakproof operators, check that the user + * has permission to read all required attributes, otherwise the operators + * might reveal values from the MCV list that the user doesn't have + * permission to see. We require all rows to be selectable --- there must + * be no securityQuals from security barrier views or RLS policies. See + * similar code in examine_variable(), examine_simple_variable(), and + * statistic_proc_security_check(). + * + * Note that for an inheritance child, the permission checks are performed + * on the inheritance root parent, and whole-table select privilege on the + * parent doesn't guarantee that the user could read all columns of the + * child. Therefore we must check all referenced columns. */ - userid = OidIsValid(rel->userid) ? rel->userid : GetUserId(); - - /* Table-level SELECT privilege is sufficient for all columns */ - if (pg_class_aclcheck(rte->relid, userid, ACL_SELECT) != ACLCHECK_OK) + if (!leakproof) { Bitmapset *clause_attnums = NULL; int attnum = -1; @@ -1652,26 +1649,9 @@ statext_is_compatible_clause(PlannerInfo *root, Node *clause, Index relid, if (*exprs != NIL) pull_varattnos((Node *) *exprs, relid, &clause_attnums); - attnum = -1; - while ((attnum = bms_next_member(clause_attnums, attnum)) >= 0) - { - /* Undo the offset */ - AttrNumber attno = attnum + FirstLowInvalidHeapAttributeNumber; - - if (attno == InvalidAttrNumber) - { - /* Whole-row reference, so must have access to all columns */ - if (pg_attribute_aclcheck_all(rte->relid, userid, ACL_SELECT, - ACLMASK_ALL) != ACLCHECK_OK) - return false; - } - else - { - if (pg_attribute_aclcheck(rte->relid, attno, userid, - ACL_SELECT) != ACLCHECK_OK) - return false; - } - } + /* Must have permission to read all rows from these columns */ + if (!all_rows_selectable(root, relid, clause_attnums)) + return false; } /* If we reach here, the clause is OK */ diff --git a/src/backend/storage/aio/read_stream.c b/src/backend/storage/aio/read_stream.c index 9b962c301bff6..da1753b6137d9 100644 --- a/src/backend/storage/aio/read_stream.c +++ b/src/backend/storage/aio/read_stream.c @@ -109,6 +109,7 @@ typedef struct InProgressIO struct ReadStream { int16 max_ios; + int16 io_combine_limit; int16 ios_in_progress; int16 queue_size; int16 max_pinned_buffers; @@ -176,9 +177,20 @@ read_stream_get_block(ReadStream *stream, void *per_buffer_data) 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; } @@ -208,7 +220,7 @@ read_stream_start_pending_read(ReadStream *stream, bool suppress_advice) /* This should only be called with a pending read. */ Assert(stream->pending_read_nblocks > 0); - Assert(stream->pending_read_nblocks <= io_combine_limit); + 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 <= @@ -296,7 +308,7 @@ read_stream_look_ahead(ReadStream *stream, bool suppress_advice) int16 buffer_index; void *per_buffer_data; - if (stream->pending_read_nblocks == io_combine_limit) + if (stream->pending_read_nblocks == stream->io_combine_limit) { read_stream_start_pending_read(stream, suppress_advice); suppress_advice = false; @@ -356,7 +368,7 @@ read_stream_look_ahead(ReadStream *stream, bool suppress_advice) * signaled end-of-stream, we start the read immediately. */ if (stream->pending_read_nblocks > 0 && - (stream->pending_read_nblocks == io_combine_limit || + (stream->pending_read_nblocks == stream->io_combine_limit || (stream->pending_read_nblocks == stream->distance && stream->pinned_buffers == 0) || stream->distance == 0) && @@ -385,6 +397,7 @@ read_stream_begin_relation(int flags, ReadStream *stream; size_t size; int16 queue_size; + int16 queue_overflow; int max_ios; int strategy_pin_limit; uint32 max_pinned_buffers; @@ -418,6 +431,14 @@ read_stream_begin_relation(int flags, /* 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 @@ -428,7 +449,7 @@ read_stream_begin_relation(int flags, */ max_pinned_buffers = Max(max_ios * 4, io_combine_limit); max_pinned_buffers = Min(max_pinned_buffers, - PG_INT16_MAX - io_combine_limit - 1); + PG_INT16_MAX - queue_overflow - 1); /* Give the strategy a chance to limit the number of buffers we pin. */ strategy_pin_limit = GetAccessStrategyPinLimit(strategy); @@ -454,18 +475,17 @@ read_stream_begin_relation(int flags, * 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 read size by allocating an extra - * io_combine_limit - 1 elements. + * up to the maximum possible overflow size. */ size = offsetof(ReadStream, buffers); - size += sizeof(Buffer) * (queue_size + io_combine_limit - 1); + 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 + io_combine_limit - 1]); + 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)]); @@ -492,7 +512,14 @@ read_stream_begin_relation(int flags, 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; @@ -506,7 +533,7 @@ read_stream_begin_relation(int flags, * doing full io_combine_limit sized reads (behavior B). */ if (flags & READ_STREAM_FULL) - stream->distance = Min(max_pinned_buffers, io_combine_limit); + stream->distance = Min(max_pinned_buffers, stream->io_combine_limit); else stream->distance = 1; @@ -672,14 +699,14 @@ read_stream_next_buffer(ReadStream *stream, void **per_buffer_data) else { /* No advice; move towards io_combine_limit (behavior B). */ - if (stream->distance > io_combine_limit) + if (stream->distance > stream->io_combine_limit) { stream->distance--; } else { distance = stream->distance * 2; - distance = Min(distance, io_combine_limit); + distance = Min(distance, stream->io_combine_limit); distance = Min(distance, stream->max_pinned_buffers); stream->distance = distance; } @@ -687,8 +714,11 @@ read_stream_next_buffer(ReadStream *stream, void **per_buffer_data) } #ifdef CLOBBER_FREED_MEMORY - /* Clobber old buffer and per-buffer data for debugging purposes. */ + /* 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. @@ -697,11 +727,23 @@ read_stream_next_buffer(ReadStream *stream, void **per_buffer_data) * that is holding a dangling pointer to it. */ if (stream->per_buffer_data) - wipe_mem(get_per_buffer_data(stream, - oldest_buffer_index == 0 ? - stream->queue_size - 1 : - oldest_buffer_index - 1), - stream->per_buffer_data_size); + { + 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. */ diff --git a/src/backend/storage/buffer/bufmgr.c b/src/backend/storage/buffer/bufmgr.c index 6c7792f08c92b..922f1f4141c5f 100644 --- a/src/backend/storage/buffer/bufmgr.c +++ b/src/backend/storage/buffer/bufmgr.c @@ -3973,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; @@ -3988,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); diff --git a/src/backend/storage/file/fd.c b/src/backend/storage/file/fd.c index a7c05b0a6fd86..66008275becf5 100644 --- a/src/backend/storage/file/fd.c +++ b/src/backend/storage/file/fd.c @@ -400,25 +400,22 @@ pg_fsync(int fd) * portable, even if it runs ok on the current system. * * We assert here that a descriptor for a file was opened with write - * permissions (either O_RDWR or O_WRONLY) and for a directory without - * write permissions (O_RDONLY). + * permissions (i.e., not O_RDONLY) and for a directory without write + * permissions (O_RDONLY). Notice that the assertion check is made even + * if fsync() is disabled. * - * Ignore any fstat errors and let the follow-up fsync() do its work. - * Doing this sanity check here counts for the case where fsync() is - * disabled. + * If fstat() fails, ignore it and let the follow-up fsync() complain. */ if (fstat(fd, &st) == 0) { int desc_flags = fcntl(fd, F_GETFL); - /* - * O_RDONLY is historically 0, so just make sure that for directories - * no write flags are used. - */ + desc_flags &= O_ACCMODE; + if (S_ISDIR(st.st_mode)) - Assert((desc_flags & (O_RDWR | O_WRONLY)) == 0); + Assert(desc_flags == O_RDONLY); else - Assert((desc_flags & (O_RDWR | O_WRONLY)) != 0); + Assert(desc_flags != O_RDONLY); } errno = 0; #endif diff --git a/src/backend/storage/freespace/indexfsm.c b/src/backend/storage/freespace/indexfsm.c index 35fb41ea7d604..ea0557801c1de 100644 --- a/src/backend/storage/freespace/indexfsm.c +++ b/src/backend/storage/freespace/indexfsm.c @@ -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/ipc/procarray.c b/src/backend/storage/ipc/procarray.c index 206b1955734a8..7b931f028e924 100644 --- a/src/backend/storage/ipc/procarray.c +++ b/src/backend/storage/ipc/procarray.c @@ -4496,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 @@ -4516,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 diff --git a/src/backend/storage/lmgr/lmgr.c b/src/backend/storage/lmgr/lmgr.c index 094522acb414d..ae883ffac2b73 100644 --- a/src/backend/storage/lmgr/lmgr.c +++ b/src/backend/storage/lmgr/lmgr.c @@ -711,7 +711,10 @@ XactLockTableWait(TransactionId xid, Relation rel, ItemPointer ctid, * through, to avoid slowing down the normal case.) */ if (!first) + { + CHECK_FOR_INTERRUPTS(); pg_usleep(1000L); + } first = false; xid = SubTransGetTopmostTransaction(xid); } @@ -749,7 +752,10 @@ ConditionalXactLockTableWait(TransactionId xid) /* See XactLockTableWait about this case */ if (!first) + { + CHECK_FOR_INTERRUPTS(); pg_usleep(1000L); + } first = false; xid = SubTransGetTopmostTransaction(xid); } diff --git a/src/backend/storage/lmgr/lwlock.c b/src/backend/storage/lmgr/lwlock.c index 5df62fafbfbae..11df55c63e50c 100644 --- a/src/backend/storage/lmgr/lwlock.c +++ b/src/backend/storage/lmgr/lwlock.c @@ -162,8 +162,8 @@ static const char *const BuiltinTrancheNames[] = { [LWTRANCHE_DSM_REGISTRY_DSA] = "DSMRegistryDSA", [LWTRANCHE_DSM_REGISTRY_HASH] = "DSMRegistryHash", [LWTRANCHE_COMMITTS_SLRU] = "CommitTsSLRU", - [LWTRANCHE_MULTIXACTOFFSET_SLRU] = "MultixactOffsetSLRU", - [LWTRANCHE_MULTIXACTMEMBER_SLRU] = "MultixactMemberSLRU", + [LWTRANCHE_MULTIXACTOFFSET_SLRU] = "MultiXactOffsetSLRU", + [LWTRANCHE_MULTIXACTMEMBER_SLRU] = "MultiXactMemberSLRU", [LWTRANCHE_NOTIFY_SLRU] = "NotifySLRU", [LWTRANCHE_SERIAL_SLRU] = "SerialSLRU", [LWTRANCHE_SUBTRANS_SLRU] = "SubtransSLRU", diff --git a/src/backend/storage/smgr/smgr.c b/src/backend/storage/smgr/smgr.c index 60bc48f4aecb0..c9f32ccdb3f4b 100644 --- a/src/backend/storage/smgr/smgr.c +++ b/src/backend/storage/smgr/smgr.c @@ -230,12 +230,12 @@ smgropen(RelFileLocator rlocator, ProcNumber backend) reln->smgr_which = storage_manager_id; - /* implementation-specific initialization */ - smgrsw[reln->smgr_which].smgr_open(reln); - /* 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); } return reln; diff --git a/src/backend/tcop/pquery.c b/src/backend/tcop/pquery.c index 0a7200682399e..5f86fa980807d 100644 --- a/src/backend/tcop/pquery.c +++ b/src/backend/tcop/pquery.c @@ -1353,24 +1353,15 @@ PortalRunMulti(Portal portal, PopActiveSnapshot(); /* - * If a query completion data was supplied, use it. Otherwise use the - * portal's query completion data. - * - * Exception: Clients expect INSERT/UPDATE/DELETE tags to have counts, so - * fake them with zeros. This can happen with DO INSTEAD rules if there - * is no replacement query of the same type as the original. We print "0 - * 0" here because technically there is no query of the matching tag type, - * and printing a non-zero count for a different query type seems wrong, - * e.g. an INSERT that does an UPDATE instead should not print "0 1" if - * one row was updated. See QueryRewrite(), step 3, for details. + * If a command tag was requested and we did not fill in a run-time- + * determined tag above, copy the parse-time tag from the Portal. (There + * might not be any tag there either, in edge cases such as empty prepared + * statements. That's OK.) */ - if (qc && qc->commandTag == CMDTAG_UNKNOWN) - { - if (portal->qc.commandTag != CMDTAG_UNKNOWN) - CopyQueryCompletion(qc, &portal->qc); - /* If the caller supplied a qc, we should have set it by now. */ - Assert(qc->commandTag != CMDTAG_UNKNOWN); - } + if (qc && + qc->commandTag == CMDTAG_UNKNOWN && + portal->qc.commandTag != CMDTAG_UNKNOWN) + CopyQueryCompletion(qc, &portal->qc); } /* diff --git a/src/backend/tsearch/spell.c b/src/backend/tsearch/spell.c index 9b1441fa1adae..b6918a3984a8e 100644 --- a/src/backend/tsearch/spell.c +++ b/src/backend/tsearch/spell.c @@ -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/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c index 4dec9395c0bf5..c79d6db3dac9b 100644 --- a/src/backend/utils/activity/pgstat.c +++ b/src/backend/utils/activity/pgstat.c @@ -600,7 +600,6 @@ pgstat_report_stat(bool force) !have_slrustats && !pgstat_have_pending_wal()) { - Assert(pending_since == 0); return 0; } diff --git a/src/backend/utils/activity/pgstat_database.c b/src/backend/utils/activity/pgstat_database.c index 29bc090974803..10ee3e57a89a3 100644 --- a/src/backend/utils/activity/pgstat_database.c +++ b/src/backend/utils/activity/pgstat_database.c @@ -368,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 d26da551a4e6c..709b8e6726e75 100644 --- a/src/backend/utils/activity/pgstat_function.c +++ b/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_relation.c b/src/backend/utils/activity/pgstat_relation.c index 8a3f7d434cfa9..383b2dbe3e895 100644 --- a/src/backend/utils/activity/pgstat_relation.c +++ b/src/backend/utils/activity/pgstat_relation.c @@ -792,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_shmem.c b/src/backend/utils/activity/pgstat_shmem.c index 6ede0f4a6e100..36dc7922d14b4 100644 --- a/src/backend/utils/activity/pgstat_shmem.c +++ b/src/backend/utils/activity/pgstat_shmem.c @@ -838,10 +838,11 @@ pgstat_drop_entry_internal(PgStatShared_HashEntry *shent, */ if (shent->dropped) elog(ERROR, - "trying to drop stats entry already dropped: kind=%s dboid=%u objoid=%u refcount=%u", + "trying to drop stats entry already dropped: kind=%s dboid=%u objoid=%u refcount=%u generation=%u", pgstat_get_kind_info(shent->key.kind)->name, shent->key.dboid, shent->key.objoid, - pg_atomic_read_u32(&shent->refcount)); + pg_atomic_read_u32(&shent->refcount), + pg_atomic_read_u32(&shent->generation)); shent->dropped = true; /* release refcount marking entry as not dropped */ diff --git a/src/backend/utils/activity/pgstat_subscription.c b/src/backend/utils/activity/pgstat_subscription.c index d9af8de6587e8..fdfe92ad95874 100644 --- a/src/backend/utils/activity/pgstat_subscription.c +++ b/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/adt/acl.c b/src/backend/utils/adt/acl.c index d7b39140b3d22..6c723e0dbcc59 100644 --- a/src/backend/utils/adt/acl.c +++ b/src/backend/utils/adt/acl.c @@ -130,6 +130,22 @@ static AclResult pg_role_aclcheck(Oid role_oid, Oid roleid, AclMode mode); static void RoleMembershipCacheCallback(Datum arg, int cacheid, uint32 hashvalue); +/* + * Test whether an identifier char can be left unquoted in ACLs. + * + * Formerly, we used isalnum() even on non-ASCII characters, resulting in + * unportable behavior. To ensure dump compatibility with old versions, + * we now treat high-bit-set characters as always requiring quoting during + * putid(), but getid() will always accept them without quotes. + */ +static inline bool +is_safe_acl_char(unsigned char c, bool is_getid) +{ + if (IS_HIGHBIT_SET(c)) + return is_getid; + return isalnum(c) || c == '_'; +} + /* * getid * Consumes the first alphanumeric string (identifier) found in string @@ -155,21 +171,22 @@ getid(const char *s, char *n, Node *escontext) while (isspace((unsigned char) *s)) s++; - /* This code had better match what putid() does, below */ for (; *s != '\0' && - (isalnum((unsigned char) *s) || - *s == '_' || - *s == '"' || - in_quotes); + (in_quotes || *s == '"' || is_safe_acl_char(*s, true)); s++) { if (*s == '"') { + if (!in_quotes) + { + in_quotes = true; + continue; + } /* safe to look at next char (could be '\0' though) */ if (*(s + 1) != '"') { - in_quotes = !in_quotes; + in_quotes = false; continue; } /* it's an escaped double quote; skip the escaping char */ @@ -203,10 +220,10 @@ putid(char *p, const char *s) const char *src; bool safe = true; + /* Detect whether we need to use double quotes */ for (src = s; *src; src++) { - /* This test had better match what getid() does, above */ - if (!isalnum((unsigned char) *src) && *src != '_') + if (!is_safe_acl_char(*src, false)) { safe = false; break; diff --git a/src/backend/utils/adt/arrayfuncs.c b/src/backend/utils/adt/arrayfuncs.c index e5c7e57a5decf..2fbd1972d7220 100644 --- a/src/backend/utils/adt/arrayfuncs.c +++ b/src/backend/utils/adt/arrayfuncs.c @@ -5770,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; @@ -5789,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, diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c index cbbb8aecafcc7..22421cb20befe 100644 --- a/src/backend/utils/adt/float.c +++ b/src/backend/utils/adt/float.c @@ -3980,8 +3980,8 @@ float84ge(PG_FUNCTION_ARGS) * in the histogram. width_bucket() returns an integer indicating the * bucket number that 'operand' belongs to in an equiwidth histogram * with the specified characteristics. An operand smaller than the - * lower bound is assigned to bucket 0. An operand greater than the - * upper bound is assigned to an additional bucket (with number + * lower bound is assigned to bucket 0. An operand greater than or equal + * to the upper bound is assigned to an additional bucket (with number * count+1). We don't allow "NaN" for any of the float8 inputs, and we * don't allow either of the histogram bounds to be +/- infinity. */ diff --git a/src/backend/utils/adt/jsonb.c b/src/backend/utils/adt/jsonb.c index e4562b3c6cea7..b6110abaa52fe 100644 --- a/src/backend/utils/adt/jsonb.c +++ b/src/backend/utils/adt/jsonb.c @@ -657,7 +657,7 @@ datum_to_jsonb_internal(Datum val, bool is_null, JsonbInState *result, tcategory == JSONTYPE_COMPOSITE || tcategory == JSONTYPE_JSON || tcategory == JSONTYPE_JSONB || - tcategory == JSONTYPE_JSON)) + tcategory == JSONTYPE_CAST)) { ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), diff --git a/src/backend/utils/adt/jsonb_util.c b/src/backend/utils/adt/jsonb_util.c index 9941daad2bc0b..0274deecbb19a 100644 --- a/src/backend/utils/adt/jsonb_util.c +++ b/src/backend/utils/adt/jsonb_util.c @@ -270,9 +270,6 @@ compareJsonbContainers(JsonbContainer *a, JsonbContainer *b) else { /* - * It's safe to assume that the types differed, and that the va - * and vb values passed were set. - * * If the two values were of the same container type, then there'd * have been a chance to observe the variation in the number of * elements/pairs (when processing WJB_BEGIN_OBJECT, say). They're @@ -845,15 +842,20 @@ JsonbIteratorInit(JsonbContainer *container) * It is our job to expand the jbvBinary representation without bothering them * with it. However, clients should not take it upon themselves to touch array * or Object element/pair buffers, since their element/pair pointers are - * garbage. Also, *val will not be set when returning WJB_END_ARRAY or - * WJB_END_OBJECT, on the assumption that it's only useful to access values - * when recursing in. + * garbage. + * + * *val is not meaningful when the result is WJB_DONE, WJB_END_ARRAY or + * WJB_END_OBJECT. However, we set val->type = jbvNull in those cases, + * so that callers may assume that val->type is always well-defined. */ JsonbIteratorToken JsonbIteratorNext(JsonbIterator **it, JsonbValue *val, bool skipNested) { if (*it == NULL) + { + val->type = jbvNull; return WJB_DONE; + } /* * When stepping into a nested container, we jump back here to start @@ -891,6 +893,7 @@ JsonbIteratorNext(JsonbIterator **it, JsonbValue *val, bool skipNested) * nesting). */ *it = freeAndGetParent(*it); + val->type = jbvNull; return WJB_END_ARRAY; } @@ -944,6 +947,7 @@ JsonbIteratorNext(JsonbIterator **it, JsonbValue *val, bool skipNested) * of nesting). */ *it = freeAndGetParent(*it); + val->type = jbvNull; return WJB_END_OBJECT; } else @@ -988,8 +992,10 @@ JsonbIteratorNext(JsonbIterator **it, JsonbValue *val, bool skipNested) return WJB_VALUE; } - elog(ERROR, "invalid iterator state"); - return -1; + elog(ERROR, "invalid jsonb iterator state"); + /* satisfy compilers that don't know that elog(ERROR) doesn't return */ + val->type = jbvNull; + return WJB_DONE; } /* diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c index 57386aabdfed9..118e222e9be6c 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -1836,9 +1836,10 @@ generate_series_step_numeric(PG_FUNCTION_ARGS) * in the histogram. width_bucket() returns an integer indicating the * bucket number that 'operand' belongs to in an equiwidth histogram * with the specified characteristics. An operand smaller than the - * lower bound is assigned to bucket 0. An operand greater than the - * upper bound is assigned to an additional bucket (with number - * count+1). We don't allow "NaN" for any of the numeric arguments. + * lower bound is assigned to bucket 0. An operand greater than or equal + * to the upper bound is assigned to an additional bucket (with number + * count+1). We don't allow "NaN" for any of the numeric inputs, and we + * don't allow either of the histogram bounds to be +/- infinity. */ Datum width_bucket_numeric(PG_FUNCTION_ARGS) diff --git a/src/backend/utils/adt/regexp.c b/src/backend/utils/adt/regexp.c index 0e2519bfd5772..37ca136acf186 100644 --- a/src/backend/utils/adt/regexp.c +++ b/src/backend/utils/adt/regexp.c @@ -773,8 +773,11 @@ similar_escape_internal(text *pat_text, text *esc_text) int plen, elen; bool afterescape = false; - bool incharclass = false; int nquotes = 0; + int charclass_depth = 0; /* Nesting level of character classes, + * encompassed by square brackets */ + int charclass_start = 0; /* State of the character class start, + * for carets */ p = VARDATA_ANY(pat_text); plen = VARSIZE_ANY_EXHDR(pat_text); @@ -904,7 +907,7 @@ similar_escape_internal(text *pat_text, text *esc_text) /* fast path */ if (afterescape) { - if (pchar == '"' && !incharclass) /* escape-double-quote? */ + if (pchar == '"' && charclass_depth < 1) /* escape-double-quote? */ { /* emit appropriate part separator, per notes above */ if (nquotes == 0) @@ -953,18 +956,41 @@ similar_escape_internal(text *pat_text, text *esc_text) /* SQL escape character; do not send to output */ afterescape = true; } - else if (incharclass) + else if (charclass_depth > 0) { if (pchar == '\\') *r++ = '\\'; *r++ = pchar; - if (pchar == ']') - incharclass = false; + + /* + * Ignore a closing bracket at the start of a character class. + * Such a bracket is taken literally rather than closing the + * class. "charclass_start" is 1 right at the beginning of a + * class and 2 after an initial caret. + */ + if (pchar == ']' && charclass_start > 2) + charclass_depth--; + else if (pchar == '[') + charclass_depth++; + + /* + * If there is a caret right after the opening bracket, it negates + * the character class, but a following closing bracket should + * still be treated as a normal character. That holds only for + * the first caret, so only the values 1 and 2 mean that closing + * brackets should be taken literally. + */ + if (pchar == '^') + charclass_start++; + else + charclass_start = 3; /* definitely past the start */ } else if (pchar == '[') { + /* start of a character class */ *r++ = pchar; - incharclass = true; + charclass_depth++; + charclass_start = 1; } else if (pchar == '%') { diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 7d6d9141a9417..d1139a268f3e9 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -5752,9 +5752,19 @@ get_select_query_def(Query *query, deparse_context *context) { if (query->limitOption == LIMIT_OPTION_WITH_TIES) { + /* + * The limitCount arg is a c_expr, so it needs parens. Simple + * literals and function expressions would not need parens, but + * unfortunately it's hard to tell if the expression will be + * printed as a simple literal like 123 or as a typecast + * expression, like '-123'::int4. The grammar accepts the former + * without quoting, but not the latter. + */ appendContextKeyword(context, " FETCH FIRST ", -PRETTYINDENT_STD, PRETTYINDENT_STD, 0); + appendStringInfoChar(buf, '('); get_rule_expr(query->limitCount, context, false); + appendStringInfoChar(buf, ')'); appendStringInfoString(buf, " ROWS WITH TIES"); } else @@ -9898,9 +9908,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 diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c index f420517961f01..4670a3d648d28 100644 --- a/src/backend/utils/adt/selfuncs.c +++ b/src/backend/utils/adt/selfuncs.c @@ -5015,8 +5015,8 @@ ReleaseDummy(HeapTuple tuple) * this query. (Caution: this should be trusted for statistical * purposes only, since we do not check indimmediate nor verify that * the exact same definition of equality applies.) - * acl_ok: true if current user has permission to read the column(s) - * underlying the pg_statistic entry. This is consulted by + * acl_ok: true if current user has permission to read all table rows from + * the column(s) underlying the pg_statistic entry. This is consulted by * statistic_proc_security_check(). * * Caller is responsible for doing ReleaseVariableStats() before exiting. @@ -5135,7 +5135,6 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, */ ListCell *ilist; ListCell *slist; - Oid userid; /* * The nullingrels bits within the expression could prevent us from @@ -5145,17 +5144,6 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, 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 - * via a view), or the current user otherwise. - * - * If we drill down to child relations, we keep using the same userid: - * it's going to be the same anyway, due to how we set up the relation - * tree (q.v. build_simple_rel). - */ - userid = OidIsValid(onerel->userid) ? onerel->userid : GetUserId(); - foreach(ilist, onerel->indexlist) { IndexOptInfo *index = (IndexOptInfo *) lfirst(ilist); @@ -5223,69 +5211,32 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, if (HeapTupleIsValid(vardata->statsTuple)) { - /* Get index's table for permission check */ - RangeTblEntry *rte; - - rte = planner_rt_fetch(index->rel->relid, root); - Assert(rte->rtekind == RTE_RELATION); - /* + * Test if user has permission to access all + * rows from the index's table. + * * For simplicity, we insist on the whole * table being selectable, rather than trying * to identify which column(s) the index - * depends on. Also require all rows to be - * selectable --- there must be no - * securityQuals from security barrier views - * or RLS policies. + * depends on. + * + * Note that for an inheritance child, + * permissions are checked on the inheritance + * root parent, and whole-table select + * privilege on the parent doesn't quite + * guarantee that the user could read all + * columns of the child. But in practice it's + * unlikely that any interesting security + * violation could result from allowing access + * to the expression index's stats, so we + * allow it anyway. See similar code in + * examine_simple_variable() for additional + * comments. */ vardata->acl_ok = - rte->securityQuals == NIL && - (pg_class_aclcheck(rte->relid, userid, - ACL_SELECT) == ACLCHECK_OK); - - /* - * If the user doesn't have permissions to - * access an inheritance child relation, check - * the permissions of the table actually - * mentioned in the query, since most likely - * the user does have that permission. Note - * that whole-table select privilege on the - * parent doesn't quite guarantee that the - * user could read all columns of the child. - * But in practice it's unlikely that any - * interesting security violation could result - * from allowing access to the expression - * index's stats, so we allow it anyway. See - * similar code in examine_simple_variable() - * for additional comments. - */ - if (!vardata->acl_ok && - root->append_rel_array != NULL) - { - AppendRelInfo *appinfo; - Index varno = index->rel->relid; - - appinfo = root->append_rel_array[varno]; - while (appinfo && - planner_rt_fetch(appinfo->parent_relid, - root)->rtekind == RTE_RELATION) - { - varno = appinfo->parent_relid; - appinfo = root->append_rel_array[varno]; - } - if (varno != index->rel->relid) - { - /* Repeat access check on this rel */ - rte = planner_rt_fetch(varno, root); - Assert(rte->rtekind == RTE_RELATION); - - vardata->acl_ok = - rte->securityQuals == NIL && - (pg_class_aclcheck(rte->relid, - userid, - ACL_SELECT) == ACLCHECK_OK); - } - } + all_rows_selectable(root, + index->rel->relid, + NULL); } else { @@ -5355,58 +5306,26 @@ examine_variable(PlannerInfo *root, Node *node, int varRelid, vardata->freefunc = ReleaseDummy; /* + * Test if user has permission to access all rows from the + * table. + * * For simplicity, we insist on the whole table being * selectable, rather than trying to identify which - * column(s) the statistics object depends on. Also - * require all rows to be selectable --- there must be no - * securityQuals from security barrier views or RLS - * policies. + * column(s) the statistics object depends on. + * + * Note that for an inheritance child, permissions are + * checked on the inheritance root parent, and whole-table + * select privilege on the parent doesn't quite guarantee + * that the user could read all columns of the child. But + * in practice it's unlikely that any interesting security + * violation could result from allowing access to the + * expression stats, so we allow it anyway. See similar + * code in examine_simple_variable() for additional + * comments. */ - vardata->acl_ok = - rte->securityQuals == NIL && - (pg_class_aclcheck(rte->relid, userid, - ACL_SELECT) == ACLCHECK_OK); - - /* - * If the user doesn't have permissions to access an - * inheritance child relation, check the permissions of - * the table actually mentioned in the query, since most - * likely the user does have that permission. Note that - * whole-table select privilege on the parent doesn't - * quite guarantee that the user could read all columns of - * the child. But in practice it's unlikely that any - * interesting security violation could result from - * allowing access to the expression stats, so we allow it - * anyway. See similar code in examine_simple_variable() - * for additional comments. - */ - if (!vardata->acl_ok && - root->append_rel_array != NULL) - { - AppendRelInfo *appinfo; - Index varno = onerel->relid; - - appinfo = root->append_rel_array[varno]; - while (appinfo && - planner_rt_fetch(appinfo->parent_relid, - root)->rtekind == RTE_RELATION) - { - varno = appinfo->parent_relid; - appinfo = root->append_rel_array[varno]; - } - if (varno != onerel->relid) - { - /* Repeat access check on this rel */ - rte = planner_rt_fetch(varno, root); - Assert(rte->rtekind == RTE_RELATION); - - vardata->acl_ok = - rte->securityQuals == NIL && - (pg_class_aclcheck(rte->relid, - userid, - ACL_SELECT) == ACLCHECK_OK); - } - } + vardata->acl_ok = all_rows_selectable(root, + onerel->relid, + NULL); break; } @@ -5461,109 +5380,20 @@ examine_simple_variable(PlannerInfo *root, Var *var, if (HeapTupleIsValid(vardata->statsTuple)) { - 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. + * Test if user has permission to read all rows from this column. * - * 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. + * This requires that the user has the appropriate SELECT + * privileges and that there are no securityQuals from security + * barrier views or RLS policies. If that's not the case, then we + * only permit leakproof functions to be passed pg_statistic data + * in vardata, otherwise the functions might reveal data that the + * user doesn't have permission to see --- see + * statistic_proc_security_check(). */ - 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 && - ((pg_class_aclcheck(rte->relid, userid, - ACL_SELECT) == ACLCHECK_OK) || - (pg_attribute_aclcheck(rte->relid, var->varattno, userid, - ACL_SELECT) == ACLCHECK_OK)); - - /* - * If the user doesn't have permissions to access an inheritance - * child relation or specifically this attribute, check the - * permissions of the table/column actually mentioned in the - * query, since most likely the user does have that permission - * (else the query will fail at runtime), and if the user can read - * the column there then he can get the values of the child table - * too. To do that, we must find out which of the root parent's - * attributes the child relation's attribute corresponds to. - */ - if (!vardata->acl_ok && var->varattno > 0 && - root->append_rel_array != NULL) - { - AppendRelInfo *appinfo; - Index varno = var->varno; - int varattno = var->varattno; - bool found = false; - - appinfo = root->append_rel_array[varno]; - - /* - * Partitions are mapped to their immediate parent, not the - * root parent, so must be ready to walk up multiple - * AppendRelInfos. But stop if we hit a parent that is not - * RTE_RELATION --- that's a flattened UNION ALL subquery, not - * an inheritance parent. - */ - while (appinfo && - planner_rt_fetch(appinfo->parent_relid, - root)->rtekind == RTE_RELATION) - { - int parent_varattno; - - found = false; - if (varattno <= 0 || varattno > appinfo->num_child_cols) - break; /* safety check */ - parent_varattno = appinfo->parent_colnos[varattno - 1]; - if (parent_varattno == 0) - break; /* Var is local to child */ - - varno = appinfo->parent_relid; - varattno = parent_varattno; - found = true; - - /* If the parent is itself a child, continue up. */ - appinfo = root->append_rel_array[varno]; - } - - /* - * In rare cases, the Var may be local to the child table, in - * which case, we've got to live with having no access to this - * column's stats. - */ - if (!found) - return; - - /* Repeat the access check on this parent rel & column */ - rte = planner_rt_fetch(varno, root); - Assert(rte->rtekind == RTE_RELATION); - - /* - * Fine to use the same userid as it's the same in all - * relations of a given inheritance tree. - */ - vardata->acl_ok = - rte->securityQuals == NIL && - ((pg_class_aclcheck(rte->relid, userid, - ACL_SELECT) == ACLCHECK_OK) || - (pg_attribute_aclcheck(rte->relid, varattno, userid, - ACL_SELECT) == ACLCHECK_OK)); - } + all_rows_selectable(root, var->varno, + bms_make_singleton(var->varattno - FirstLowInvalidHeapAttributeNumber)); } else { @@ -5751,17 +5581,227 @@ examine_simple_variable(PlannerInfo *root, Var *var, } } +/* + * all_rows_selectable + * Test whether the user has permission to select all rows from a given + * relation. + * + * Inputs: + * root: the planner info + * varno: the index of the relation (assumed to be an RTE_RELATION) + * varattnos: the attributes for which permission is required, or NULL if + * whole-table access is required + * + * Returns true if the user has the required select permissions, and there are + * no securityQuals from security barrier views or RLS policies. + * + * Note that if the relation is an inheritance child relation, securityQuals + * and access permissions are checked against the inheritance root parent (the + * relation actually mentioned in the query) --- see the comments in + * expand_single_inheritance_child() for an explanation of why it has to be + * done this way. + * + * If varattnos is non-NULL, its attribute numbers should be offset by + * FirstLowInvalidHeapAttributeNumber so that system attributes can be + * checked. If varattnos is NULL, only table-level SELECT privileges are + * checked, not any column-level privileges. + * + * Note: if the relation is accessed via a view, this function actually tests + * whether the view owner has permission to select from the relation. To + * ensure that the current user has permission, it is also necessary to check + * that the current user has permission to select from the view, which we do + * at planner-startup --- see subquery_planner(). + * + * This is exported so that other estimation functions can use it. + */ +bool +all_rows_selectable(PlannerInfo *root, Index varno, Bitmapset *varattnos) +{ + RelOptInfo *rel = find_base_rel_noerr(root, varno); + RangeTblEntry *rte = planner_rt_fetch(varno, root); + Oid userid; + int varattno; + + Assert(rte->rtekind == RTE_RELATION); + + /* + * Determine the user ID to use for privilege checks (either the current + * user or the view owner, if we're accessing the table via a view). + * + * Normally the relation will have an associated RelOptInfo from which we + * can find the userid, 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. + * + * If we navigate up to a parent relation, we keep using the same userid, + * since it's the same in all relations of a given inheritance tree. + */ + if (rel) + userid = rel->userid; + else + { + RTEPermissionInfo *perminfo; + + perminfo = getRTEPermissionInfo(root->parse->rteperminfos, rte); + userid = perminfo->checkAsUser; + } + if (!OidIsValid(userid)) + userid = GetUserId(); + + /* + * Permissions and securityQuals must be checked on the table actually + * mentioned in the query, so if this is an inheritance child, navigate up + * to the inheritance root parent. If the user can read the whole table + * or the required columns there, then they can read from the child table + * too. For per-column checks, we must find out which of the root + * parent's attributes the child relation's attributes correspond to. + */ + if (root->append_rel_array != NULL) + { + AppendRelInfo *appinfo; + + appinfo = root->append_rel_array[varno]; + + /* + * Partitions are mapped to their immediate parent, not the root + * parent, so must be ready to walk up multiple AppendRelInfos. But + * stop if we hit a parent that is not RTE_RELATION --- that's a + * flattened UNION ALL subquery, not an inheritance parent. + */ + while (appinfo && + planner_rt_fetch(appinfo->parent_relid, + root)->rtekind == RTE_RELATION) + { + Bitmapset *parent_varattnos = NULL; + + /* + * For each child attribute, find the corresponding parent + * attribute. In rare cases, the attribute may be local to the + * child table, in which case, we've got to live with having no + * access to this column. + */ + varattno = -1; + while ((varattno = bms_next_member(varattnos, varattno)) >= 0) + { + AttrNumber attno; + AttrNumber parent_attno; + + attno = varattno + FirstLowInvalidHeapAttributeNumber; + + if (attno == InvalidAttrNumber) + { + /* + * Whole-row reference, so must map each column of the + * child to the parent table. + */ + for (attno = 1; attno <= appinfo->num_child_cols; attno++) + { + parent_attno = appinfo->parent_colnos[attno - 1]; + if (parent_attno == 0) + return false; /* attr is local to child */ + parent_varattnos = + bms_add_member(parent_varattnos, + parent_attno - FirstLowInvalidHeapAttributeNumber); + } + } + else + { + if (attno < 0) + { + /* System attnos are the same in all tables */ + parent_attno = attno; + } + else + { + if (attno > appinfo->num_child_cols) + return false; /* safety check */ + parent_attno = appinfo->parent_colnos[attno - 1]; + if (parent_attno == 0) + return false; /* attr is local to child */ + } + parent_varattnos = + bms_add_member(parent_varattnos, + parent_attno - FirstLowInvalidHeapAttributeNumber); + } + } + + /* If the parent is itself a child, continue up */ + varno = appinfo->parent_relid; + varattnos = parent_varattnos; + appinfo = root->append_rel_array[varno]; + } + + /* Perform the access check on this parent rel */ + rte = planner_rt_fetch(varno, root); + Assert(rte->rtekind == RTE_RELATION); + } + + /* + * For all rows to be accessible, there must be no securityQuals from + * security barrier views or RLS policies. + */ + if (rte->securityQuals != NIL) + return false; + + /* + * Test for table-level SELECT privilege. + * + * If varattnos is non-NULL, this is sufficient to give access to all + * requested attributes, even for a child table, since we have verified + * that all required child columns have matching parent columns. + * + * If varattnos is NULL (whole-table access requested), this doesn't + * necessarily guarantee that the user can read all columns of a child + * table, but we allow it anyway (see comments in examine_variable()) and + * don't bother checking any column privileges. + */ + if (pg_class_aclcheck(rte->relid, userid, ACL_SELECT) == ACLCHECK_OK) + return true; + + if (varattnos == NULL) + return false; /* whole-table access requested */ + + /* + * Don't have table-level SELECT privilege, so check per-column + * privileges. + */ + varattno = -1; + while ((varattno = bms_next_member(varattnos, varattno)) >= 0) + { + AttrNumber attno = varattno + FirstLowInvalidHeapAttributeNumber; + + if (attno == InvalidAttrNumber) + { + /* Whole-row reference, so must have access to all columns */ + if (pg_attribute_aclcheck_all(rte->relid, userid, ACL_SELECT, + ACLMASK_ALL) != ACLCHECK_OK) + return false; + } + else + { + if (pg_attribute_aclcheck(rte->relid, attno, userid, + ACL_SELECT) != ACLCHECK_OK) + return false; + } + } + + /* If we reach here, have all required column privileges */ + return true; +} + /* * Check whether it is permitted to call func_oid passing some of the - * pg_statistic data in vardata. We allow this either if the user has SELECT - * privileges on the table or column underlying the pg_statistic data or if - * the function is marked leak-proof. + * pg_statistic data in vardata. We allow this if either of the following + * conditions is met: (1) the user has SELECT privileges on the table or + * column underlying the pg_statistic data and there are no securityQuals from + * security barrier views or RLS policies, or (2) the function is marked + * leakproof. */ bool statistic_proc_security_check(VariableStatData *vardata, Oid func_oid) { if (vardata->acl_ok) - return true; + return true; /* have SELECT privs and no securityQuals */ if (!OidIsValid(func_oid)) return false; diff --git a/src/backend/utils/adt/tsquery.c b/src/backend/utils/adt/tsquery.c index 6f532188392d3..439b7c6482c64 100644 --- a/src/backend/utils/adt/tsquery.c +++ b/src/backend/utils/adt/tsquery.c @@ -1176,10 +1176,11 @@ tsqueryout(PG_FUNCTION_ARGS) * * uint8 type, QI_VAL * uint8 weight - * operand text in client encoding, null-terminated * uint8 prefix + * operand text in client encoding, null-terminated * * For each operator: + * * uint8 type, QI_OPR * uint8 operator, one of OP_AND, OP_PHRASE OP_OR, OP_NOT. * uint16 distance (only for OP_PHRASE) diff --git a/src/backend/utils/adt/tsvector.c b/src/backend/utils/adt/tsvector.c index 4c6a15757a73e..638c4dc097def 100644 --- a/src/backend/utils/adt/tsvector.c +++ b/src/backend/utils/adt/tsvector.c @@ -25,7 +25,7 @@ typedef struct { - WordEntry entry; /* must be first! */ + WordEntry entry; /* must be first, see compareentry */ WordEntryPos *pos; int poslen; /* number of elements in pos */ } WordEntryIN; @@ -79,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); } @@ -167,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) @@ -511,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; diff --git a/src/backend/utils/adt/xml.c b/src/backend/utils/adt/xml.c index 41b1a5c6b0bf5..6e012b71fbe14 100644 --- a/src/backend/utils/adt/xml.c +++ b/src/backend/utils/adt/xml.c @@ -663,7 +663,7 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) volatile xmlBufferPtr buf = NULL; volatile xmlSaveCtxtPtr ctxt = NULL; ErrorSaveContext escontext = {T_ErrorSaveContext}; - PgXmlErrorContext *xmlerrcxt; + PgXmlErrorContext *volatile xmlerrcxt = NULL; #endif if (xmloption_arg != XMLOPTION_DOCUMENT && !indent) @@ -704,13 +704,18 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) return (text *) data; } - /* Otherwise, we gotta spin up some error handling. */ - xmlerrcxt = pg_xml_init(PG_XML_STRICTNESS_ALL); - + /* + * Otherwise, we gotta spin up some error handling. Unlike most other + * routines in this module, we already have a libxml "doc" structure to + * free, so we need to call pg_xml_init() inside the PG_TRY and be + * prepared for it to fail (typically due to palloc OOM). + */ PG_TRY(); { size_t decl_len = 0; + xmlerrcxt = pg_xml_init(PG_XML_STRICTNESS_ALL); + /* The serialized data will go into this buffer. */ buf = xmlBufferCreate(); @@ -754,6 +759,7 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) * content nodes, and then iterate over the nodes. */ xmlNodePtr root; + xmlNodePtr oldroot; xmlNodePtr newline; root = xmlNewNode(NULL, (const xmlChar *) "content-root"); @@ -761,8 +767,14 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) 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); + /* + * This attaches root to doc, so we need not free it separately... + * but instead, we have to free the old root if there was one. + */ + oldroot = xmlDocSetRootElement(doc, root); + if (oldroot != NULL) + xmlFreeNode(oldroot); + xmlAddChildList(root, content_nodes); /* @@ -831,10 +843,10 @@ xmltotext_with_options(xmltype *data, XmlOptionType xmloption_arg, bool indent) xmlSaveClose(ctxt); if (buf) xmlBufferFree(buf); - if (doc) - xmlFreeDoc(doc); + xmlFreeDoc(doc); - pg_xml_done(xmlerrcxt, true); + if (xmlerrcxt) + pg_xml_done(xmlerrcxt, true); PG_RE_THROW(); } @@ -1718,7 +1730,7 @@ xml_doctype_in_content(const xmlChar *str) * xmloption_arg, but a DOCTYPE node in the input can force DOCUMENT mode). * * If parsed_nodes isn't NULL and we parse in CONTENT mode, the list - * of parsed nodes from the xmlParseInNodeContext call will be returned + * of parsed nodes from the xmlParseBalancedChunkMemory 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 @@ -1744,6 +1756,7 @@ xml_parse(text *data, XmlOptionType xmloption_arg, PgXmlErrorContext *xmlerrcxt; volatile xmlParserCtxtPtr ctxt = NULL; volatile xmlDocPtr doc = NULL; + volatile int save_keep_blanks = -1; /* * This step looks annoyingly redundant, but we must do it to have a @@ -1771,7 +1784,6 @@ 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; @@ -1802,18 +1814,6 @@ 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 : @@ -1823,11 +1823,26 @@ xml_parse(text *data, XmlOptionType xmloption_arg, if (parse_as_document) { + int options; + + /* set up parser context used by xmlCtxtReadDoc */ ctxt = xmlNewParserCtxt(); if (ctxt == NULL || xmlerrcxt->err_occurred) xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY, "could not allocate parser context"); + /* + * 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); + doc = xmlCtxtReadDoc(ctxt, utf8string, NULL, /* no URL */ "UTF-8", @@ -1849,9 +1864,7 @@ xml_parse(text *data, XmlOptionType xmloption_arg, } else { - xmlNodePtr root; - - /* set up document with empty root node to be the context node */ + /* set up document that xmlParseBalancedChunkMemory will add to */ doc = xmlNewDoc(version); if (doc == NULL || xmlerrcxt->err_occurred) xml_ereport(xmlerrcxt, ERROR, ERRCODE_OUT_OF_MEMORY, @@ -1864,38 +1877,22 @@ 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); + /* set parse options --- have to do this the ugly way */ + save_keep_blanks = xmlKeepBlanksDefault(preserve_whitespace ? 1 : 0); /* allow empty content */ if (*(utf8string + count)) { - 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) + res_code = xmlParseBalancedChunkMemory(doc, NULL, NULL, 0, + utf8string + count, + parsed_nodes); + if (res_code != 0 || 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); } } @@ -1904,6 +1901,8 @@ xml_parse(text *data, XmlOptionType xmloption_arg, } PG_CATCH(); { + if (save_keep_blanks != -1) + xmlKeepBlanksDefault(save_keep_blanks); if (doc != NULL) xmlFreeDoc(doc); if (ctxt != NULL) @@ -1915,6 +1914,9 @@ xml_parse(text *data, XmlOptionType xmloption_arg, } PG_END_TRY(); + if (save_keep_blanks != -1) + xmlKeepBlanksDefault(save_keep_blanks); + if (ctxt != NULL) xmlFreeParserCtxt(ctxt); diff --git a/src/backend/utils/cache/inval.c b/src/backend/utils/cache/inval.c index 3ce4775b829b3..66e04f973f675 100644 --- a/src/backend/utils/cache/inval.c +++ b/src/backend/utils/cache/inval.c @@ -1032,7 +1032,7 @@ AtEOXact_Inval(bool isCommit) /* Must be at top of stack */ Assert(transInvalInfo->my_level == 1 && transInvalInfo->parent == NULL); - INJECTION_POINT("AtEOXact_Inval-with-transInvalInfo"); + INJECTION_POINT("transaction-end-process-inval"); if (isCommit) { diff --git a/src/backend/utils/hash/dynahash.c b/src/backend/utils/hash/dynahash.c index 145e058fe675b..45b8e8e919ebb 100644 --- a/src/backend/utils/hash/dynahash.c +++ b/src/backend/utils/hash/dynahash.c @@ -390,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); diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c index 62777b14c9bb5..97a4d6951598d 100644 --- a/src/backend/utils/mb/mbutils.c +++ b/src/backend/utils/mb/mbutils.c @@ -1087,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, @@ -1692,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, @@ -1724,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/misc/guc.c b/src/backend/utils/misc/guc.c index 0831d45aba3ac..29a8972214f2e 100644 --- a/src/backend/utils/misc/guc.c +++ b/src/backend/utils/misc/guc.c @@ -4725,8 +4725,13 @@ AlterSystemSetConfigFile(AlterSystemStmt *altersysstmt) * the config file cannot cause postmaster start to fail, so we * don't have to be too tense about possibly installing a bad * value.) + * + * As an exception, we skip this check if this is a RESET command + * for an unknown custom GUC, else there'd be no way for users to + * remove such settings with reserved prefixes. */ - (void) assignable_custom_variable_name(name, false, ERROR); + if (value || !valid_custom_variable_name(name)) + (void) assignable_custom_variable_name(name, false, ERROR); } /* @@ -6713,6 +6718,7 @@ validate_option_array_item(const char *name, const char *value, { struct config_generic *gconf; + bool reset_custom; /* * There are three cases to consider: @@ -6731,16 +6737,21 @@ validate_option_array_item(const char *name, const char *value, * it's assumed to be fully validated.) * * name is not known and can't be created as a placeholder. Throw error, - * unless skipIfNoPermissions is true, in which case return false. + * unless skipIfNoPermissions or reset_custom is true. If reset_custom is + * true, this is a RESET or RESET ALL operation for an unknown custom GUC + * with a reserved prefix, in which case we want to fall through to the + * placeholder case described in the preceding paragraph (else there'd be + * no way for users to remove them). Otherwise, return false. */ - gconf = find_option(name, true, skipIfNoPermissions, ERROR); - if (!gconf) + reset_custom = (!value && valid_custom_variable_name(name)); + gconf = find_option(name, true, skipIfNoPermissions || reset_custom, ERROR); + if (!gconf && !reset_custom) { /* not known, failed to make a placeholder */ return false; } - if (gconf->flags & GUC_CUSTOM_PLACEHOLDER) + if (!gconf || gconf->flags & GUC_CUSTOM_PLACEHOLDER) { /* * We cannot do any meaningful check on the value, so only permissions diff --git a/src/backend/utils/misc/guc_tables.c b/src/backend/utils/misc/guc_tables.c index c42fccf3fe74d..a997dcb7dbcb7 100644 --- a/src/backend/utils/misc/guc_tables.c +++ b/src/backend/utils/misc/guc_tables.c @@ -2953,7 +2953,7 @@ struct config_int ConfigureNamesInt[] = }, &max_slot_wal_keep_size_mb, -1, -1, MAX_KILOBYTES, - check_max_slot_wal_keep_size, NULL, NULL + NULL, NULL, NULL }, { diff --git a/src/backend/utils/mmgr/alignedalloc.c b/src/backend/utils/mmgr/alignedalloc.c index c266fb3dbb148..2d19aa78bb2e3 100644 --- a/src/backend/utils/mmgr/alignedalloc.c +++ b/src/backend/utils/mmgr/alignedalloc.c @@ -45,6 +45,7 @@ AlignedAllocFree(void *pointer) GetMemoryChunkContext(unaligned)->name, chunk); #endif + /* Recursively pfree the unaligned chunk */ pfree(unaligned); } @@ -96,18 +97,32 @@ AlignedAllocRealloc(void *pointer, Size size, int flags) Assert(old_size >= redirchunk->requested_size); #endif + /* + * To keep things simple, we always allocate a new aligned chunk and copy + * data into it. Because of the above inaccuracy, this may end in copying + * more data than was in the original allocation request size, but that + * should be OK. + */ ctx = GetMemoryChunkContext(unaligned); 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. - */ - if (likely(newptr != NULL)) + /* Cope cleanly with OOM */ + if (unlikely(newptr == NULL)) { - VALGRIND_MAKE_MEM_DEFINED(pointer, old_size); - memcpy(newptr, pointer, Min(size, old_size)); + VALGRIND_MAKE_MEM_NOACCESS(redirchunk, sizeof(MemoryChunk)); + return MemoryContextAllocationFailure(ctx, size, flags); } + + /* + * We may memcpy more than the original allocation request size, which + * would result in trying to copy trailing bytes that the original + * MemoryContextAllocAligned call marked NOACCESS. So we must mark the + * entire old_size as defined. That's slightly annoying, but probably not + * worth improving. + */ + 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/bump.c b/src/backend/utils/mmgr/bump.c index c60c9c131e395..afd7fe04ab0c2 100644 --- a/src/backend/utils/mmgr/bump.c +++ b/src/backend/utils/mmgr/bump.c @@ -316,7 +316,7 @@ BumpAllocLarge(MemoryContext context, Size size, int flags) block = (BumpBlock *) malloc(blksize); if (block == NULL) - return NULL; + return MemoryContextAllocationFailure(context, size, flags); context->mem_allocated += blksize; diff --git a/src/bin/initdb/Makefile b/src/bin/initdb/Makefile index 031cc77c9d61b..adc9940d64c45 100644 --- a/src/bin/initdb/Makefile +++ b/src/bin/initdb/Makefile @@ -20,7 +20,7 @@ include $(top_builddir)/src/Makefile.global # 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. -override CPPFLAGS := -DUSE_PRIVATE_ENCODING_FUNCS -I$(libpq_srcdir) -I$(top_srcdir)/src/timezone $(ICU_CFLAGS) $(CPPFLAGS) +override CPPFLAGS := -DUSE_PRIVATE_ENCODING_FUNCS -I$(libpq_srcdir) -I$(top_srcdir)/src/timezone $(CPPFLAGS) $(ICU_CFLAGS) # We need libpq only because fe_utils does. LDFLAGS_INTERNAL += -L$(top_builddir)/src/fe_utils -lpgfeutils $(libpq_pgport) $(ICU_LIBS) diff --git a/src/bin/initdb/po/ru.po b/src/bin/initdb/po/ru.po index c1fab13b8c488..bac896a8fe0ce 100644 --- a/src/bin/initdb/po/ru.po +++ b/src/bin/initdb/po/ru.po @@ -11,7 +11,7 @@ msgid "" msgstr "" "Project-Id-Version: initdb (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-11-02 08:21+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" @@ -247,14 +247,14 @@ msgstr "значение %s должно быть в диапазоне %d..%d" msgid "unrecognized sync method: %s" msgstr "нераспознанный метод синхронизации: %s" -#: ../../fe_utils/string_utils.c:434 +#: ../../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:607 +#: ../../fe_utils/string_utils.c:760 #, c-format msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "" diff --git a/src/bin/initdb/po/uk.po b/src/bin/initdb/po/uk.po index 699f6e9680374..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: 2024-08-31 06:21+0000\n" -"PO-Revision-Date: 2024-09-23 19:38\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" @@ -57,7 +57,7 @@ msgstr "неможливо знайти \"%s\" для виконання" msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "не вдалося знайти абсолютний шлях \"%s\": %m" -#: ../../common/exec.c:382 initdb.c:695 +#: ../../common/exec.c:382 initdb.c:750 #, c-format msgid "could not execute command \"%s\": %m" msgstr "не вдалося виконати команду \"%s\": %m" @@ -78,7 +78,7 @@ msgid "%s() failed: %m" msgstr "%s() помилка: %m" #: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 -#: initdb.c:353 +#: initdb.c:372 initdb.c:408 #, c-format msgid "out of memory" msgstr "недостатньо пам'яті" @@ -242,12 +242,12 @@ msgstr "%s має бути в діапазоні %d..%d" msgid "unrecognized sync method: %s" msgstr "нерозпізнаний метод синхронізації: %s" -#: ../../fe_utils/string_utils.c:434 +#: ../../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:607 +#: ../../fe_utils/string_utils.c:760 #, c-format msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "назва бази даних містить символ нового рядка або повернення каретки: \"%s\"\n" @@ -262,347 +262,362 @@ msgstr "не вдалося встановити сполучення для \"% msgid "could not get junction for \"%s\": %s\n" msgstr "не вдалося встановити сполучення для \"%s\": %s\n" -#: initdb.c:627 initdb.c:1619 +#: 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:671 initdb.c:975 initdb.c:995 +#: 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:675 initdb.c:978 initdb.c:997 +#: initdb.c:730 initdb.c:1033 initdb.c:1052 #, c-format msgid "could not write file \"%s\": %m" msgstr "не вдалося записати файл \"%s\": %m" -#: initdb.c:679 +#: initdb.c:734 #, c-format msgid "could not close file \"%s\": %m" msgstr "неможливо закрити файл \"%s\": %m" -#: initdb.c:713 +#: initdb.c:768 #, c-format msgid "removing data directory \"%s\"" msgstr "видалення даних з директорії \"%s\"" -#: initdb.c:715 +#: initdb.c:770 #, c-format msgid "failed to remove data directory" msgstr "не вдалося видалити дані директорії" -#: initdb.c:719 +#: initdb.c:774 #, c-format msgid "removing contents of data directory \"%s\"" msgstr "видалення даних з директорії \"%s\"" -#: initdb.c:722 +#: initdb.c:777 #, c-format msgid "failed to remove contents of data directory" msgstr "не вдалося видалити дані директорії" -#: initdb.c:727 +#: initdb.c:782 #, c-format msgid "removing WAL directory \"%s\"" msgstr "видалення WAL директорії \"%s\"" -#: initdb.c:729 +#: initdb.c:784 #, c-format msgid "failed to remove WAL directory" msgstr "не вдалося видалити директорію WAL" -#: initdb.c:733 +#: initdb.c:788 #, c-format msgid "removing contents of WAL directory \"%s\"" msgstr "видалення даних з директорії WAL \"%s\"" -#: initdb.c:735 +#: initdb.c:790 #, c-format msgid "failed to remove contents of WAL directory" msgstr "не вдалося видалити дані директорії WAL" -#: initdb.c:742 +#: initdb.c:797 #, c-format msgid "data directory \"%s\" not removed at user's request" msgstr "директорія даних \"%s\" не видалена за запитом користувача" -#: initdb.c:746 +#: initdb.c:801 #, c-format msgid "WAL directory \"%s\" not removed at user's request" msgstr "директорія WAL \"%s\" не видалена за запитом користувача" -#: initdb.c:764 +#: initdb.c:819 #, c-format msgid "cannot be run as root" msgstr "не може виконуватись як root" -#: initdb.c:765 +#: 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:797 +#: initdb.c:852 #, c-format msgid "\"%s\" is not a valid server encoding name" msgstr "\"%s\" невірне ім'я серверного кодування" -#: initdb.c:941 +#: initdb.c:996 #, c-format msgid "file \"%s\" does not exist" msgstr "файл \"%s\" не існує" -#: initdb.c:942 initdb.c:947 initdb.c:954 +#: 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:946 +#: initdb.c:1001 #, c-format msgid "could not access file \"%s\": %m" msgstr "немає доступу до файлу \"%s\": %m" -#: initdb.c:953 +#: initdb.c:1008 #, c-format msgid "file \"%s\" is not a regular file" msgstr "файл \"%s\" не є звичайним файлом" -#: initdb.c:1086 +#: initdb.c:1141 #, c-format msgid "selecting dynamic shared memory implementation ... " msgstr "обирається реалізація динамічної спільної пам'яті ... " -#: initdb.c:1095 +#: initdb.c:1150 #, c-format msgid "selecting default \"max_connections\" ... " msgstr "обирається значення \"max_connections\" за замовчуванням... \n" " " -#: initdb.c:1115 +#: initdb.c:1170 #, c-format msgid "selecting default \"shared_buffers\" ... " msgstr "обирається значення \"shared_buffers\" за замовчуванням... " -#: initdb.c:1138 +#: initdb.c:1193 #, c-format msgid "selecting default time zone ... " msgstr "обирається часовий пояс за замовчуванням ... " -#: initdb.c:1217 +#: initdb.c:1272 msgid "creating configuration files ... " msgstr "створення конфігураційних файлів... " -#: initdb.c:1370 initdb.c:1384 initdb.c:1451 initdb.c:1462 +#: 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:1597 +#: initdb.c:1652 msgid "Enter new superuser password: " msgstr "Введіть новий пароль для superuser: " -#: initdb.c:1598 +#: initdb.c:1653 msgid "Enter it again: " msgstr "Введіть знову: " -#: initdb.c:1601 +#: initdb.c:1656 #, c-format msgid "Passwords didn't match.\n" msgstr "Паролі не співпадають.\n" -#: initdb.c:1625 +#: initdb.c:1680 #, c-format msgid "could not read password from file \"%s\": %m" msgstr "не вдалося прочитати пароль з файлу \"%s\": %m" -#: initdb.c:1628 +#: initdb.c:1683 #, c-format msgid "password file \"%s\" is empty" msgstr "файл з паролями \"%s\" є порожнім" -#: initdb.c:2040 +#: initdb.c:2095 #, c-format msgid "caught signal\n" msgstr "отримано сигнал\n" -#: initdb.c:2046 +#: initdb.c:2101 #, c-format msgid "could not write to child process: %s\n" msgstr "не вдалося написати у дочірній процес: %s\n" -#: initdb.c:2054 +#: initdb.c:2109 #, c-format msgid "ok\n" msgstr "ok\n" -#: initdb.c:2143 -#, c-format -msgid "setlocale() failed" -msgstr "setlocale() завершився невдало" - -#: initdb.c:2161 +#: 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:2169 +#: initdb.c:2217 #, c-format msgid "invalid locale name \"%s\"" msgstr "не допустиме ім'я локалі \"%s\"" -#: initdb.c:2170 +#: initdb.c:2218 #, c-format msgid "If the locale name is specific to ICU, use --icu-locale." msgstr "Якщо ім'я локалі характерне для ICU, використовуйте --icu-locale." -#: initdb.c:2183 +#: initdb.c:2231 #, c-format msgid "invalid locale settings; check LANG and LC_* environment variables" msgstr "неприпустимі параметри локалі; перевірте LANG та LC_* змінні середовища" -#: initdb.c:2209 initdb.c:2233 +#: initdb.c:2262 initdb.c:2286 #, c-format msgid "encoding mismatch" msgstr "невідповідність кодування" -#: initdb.c:2210 +#: 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:2215 initdb.c:2236 +#: 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:2234 +#: initdb.c:2287 #, c-format msgid "The encoding you selected (%s) is not supported with the ICU provider." msgstr "Обране вами кодування (%s) не підтримується провайдером ICU." -#: initdb.c:2285 +#: initdb.c:2338 #, 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 +#: initdb.c:2344 initdb.c:2396 initdb.c:2488 #, c-format msgid "ICU is not supported in this build" msgstr "ICU не підтримується в цій збірці" -#: initdb.c:2314 +#: initdb.c:2367 #, c-format msgid "could not get language from locale \"%s\": %s" msgstr "не вдалося отримати мову з локалі \"%s\": %s" -#: initdb.c:2340 +#: initdb.c:2393 #, c-format msgid "locale \"%s\" has unknown language \"%s\"" msgstr "locale \"%s\" має невідому мову \"%s\"" -#: initdb.c:2401 +#: initdb.c:2454 #, c-format msgid "locale must be specified if provider is %s" msgstr "потрібно вказати локаль для провайдера %s" -#: initdb.c:2412 +#: initdb.c:2465 #, c-format msgid "invalid locale name \"%s\" for builtin provider" msgstr "неприпустиме ім'я локалі \"%s\" для вбудованого провайдера" -#: initdb.c:2423 +#: initdb.c:2476 #, c-format msgid "Using language tag \"%s\" for ICU locale \"%s\".\n" msgstr "Використання мітки мови \"%s\" для локалі ICU \"%s\".\n" -#: initdb.c:2446 +#: initdb.c:2499 #, c-format msgid "%s initializes a PostgreSQL database cluster.\n\n" msgstr "%s ініціалізує кластер баз даних PostgreSQL.\n\n" -#: initdb.c:2447 +#: initdb.c:2500 #, c-format msgid "Usage:\n" msgstr "Використання:\n" -#: initdb.c:2448 +#: initdb.c:2501 #, c-format msgid " %s [OPTION]... [DATADIR]\n" msgstr " %s [OPTION]... [DATADIR]\n" -#: initdb.c:2449 +#: initdb.c:2502 #, c-format msgid "\n" "Options:\n" msgstr "\n" "Параметри:\n" -#: initdb.c:2450 +#: initdb.c:2503 #, c-format msgid " -A, --auth=METHOD default authentication method for local connections\n" msgstr " -A, -- auth=METHOD метод аутентифікації за замовчуванням для локальних підключень\n" -#: initdb.c:2451 +#: 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:2452 +#: initdb.c:2505 #, c-format msgid " --auth-local=METHOD default authentication method for local-socket connections\n" msgstr " --auth-local=METHOD метод аутентифікації за замовчуванням для локального під'єднання через сокет\n" -#: initdb.c:2453 +#: initdb.c:2506 #, c-format msgid " [-D, --pgdata=]DATADIR location for this database cluster\n" msgstr " [-D - pgdata =] DATADIR розташування кластеру цієї бази даних\n" -#: initdb.c:2454 +#: initdb.c:2507 #, c-format msgid " -E, --encoding=ENCODING set default encoding for new databases\n" msgstr " -E, --encoding=ENCODING встановлення кодування за замовчуванням для нової бази даних\n" -#: initdb.c:2455 +#: 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:2456 +#: 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:2457 +#: 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:2458 +#: initdb.c:2511 #, c-format msgid " -k, --data-checksums use data page checksums\n" msgstr " -k, --data-checksums використовувати контрольні суми сторінок\n" -#: initdb.c:2459 +#: initdb.c:2512 #, c-format msgid " --locale=LOCALE set default locale for new databases\n" msgstr " --locale=LOCALE встановлює локаль за замовчуванням для нових баз даних\n" -#: initdb.c:2460 +#: initdb.c:2513 #, c-format msgid " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" " --lc-monetary=, --lc-numeric=, --lc-time=LOCALE\n" @@ -613,132 +628,132 @@ msgstr " --lc-collate=, --lc-ctype=, --lc-messages=LOCALE\n" " встановлення локалі за замовчуванням для відповідної категорії в\n" " нових базах даних (замість значення з середовища)\n" -#: initdb.c:2464 +#: initdb.c:2517 #, c-format msgid " --no-locale equivalent to --locale=C\n" msgstr " --no-locale еквівалентно --locale=C\n" -#: initdb.c:2465 +#: 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:2467 +#: 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:2469 +#: initdb.c:2522 #, c-format msgid " --pwfile=FILE read password for the new superuser from file\n" msgstr " --pwfile=FILE прочитати пароль для нового суперкористувача з файлу\n" -#: initdb.c:2470 +#: 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:2472 +#: initdb.c:2525 #, c-format msgid " -U, --username=NAME database superuser name\n" msgstr " -U, --username=NAME ім'я суперкористувача бази даних\n" -#: initdb.c:2473 +#: initdb.c:2526 #, c-format msgid " -W, --pwprompt prompt for a password for the new superuser\n" msgstr " -W, --pwprompt запитувати пароль нового суперкористувача\n" -#: initdb.c:2474 +#: initdb.c:2527 #, c-format msgid " -X, --waldir=WALDIR location for the write-ahead log directory\n" msgstr " -X, --waldir=WALDIR розташування журналу попереднього запису\n" -#: initdb.c:2475 +#: initdb.c:2528 #, c-format msgid " --wal-segsize=SIZE size of WAL segments, in megabytes\n" msgstr " --wal-segsize=SIZE розмір сегментів WAL у мегабайтах\n" -#: initdb.c:2476 +#: initdb.c:2529 #, c-format msgid "\n" "Less commonly used options:\n" msgstr "\n" "Рідковживані параметри:\n" -#: initdb.c:2477 +#: 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:2478 +#: initdb.c:2531 #, c-format msgid " -d, --debug generate lots of debugging output\n" msgstr " -d, --debug генерувати багато налагоджувальних повідомлень\n" -#: initdb.c:2479 +#: initdb.c:2532 #, c-format msgid " --discard-caches set debug_discard_caches=1\n" msgstr " --discard-caches встановити debug_discard_caches=1\n" -#: initdb.c:2480 +#: initdb.c:2533 #, c-format msgid " -L DIRECTORY where to find the input files\n" msgstr " -L DIRECTORY розташування вхідних файлів\n" -#: initdb.c:2481 +#: initdb.c:2534 #, c-format msgid " -n, --no-clean do not clean up after errors\n" msgstr " -n, --no-clean не очищувати після помилок\n" " \n" -#: initdb.c:2482 +#: 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:2483 +#: initdb.c:2536 #, c-format msgid " --no-instructions do not print instructions for next steps\n" msgstr " --no-instructions не друкувати інструкції для наступних кроків\n" -#: initdb.c:2484 +#: initdb.c:2537 #, c-format msgid " -s, --show show internal settings, then exit\n" msgstr " -s, --show показати внутрішні налаштування і вийти\n" -#: initdb.c:2485 +#: initdb.c:2538 #, c-format msgid " --sync-method=METHOD set method for syncing files to disk\n" msgstr " --sync-method=METHOD встановити метод синхронізації файлів на диск\n" -#: initdb.c:2486 +#: 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:2487 +#: initdb.c:2540 #, c-format msgid "\n" "Other options:\n" msgstr "\n" "Інші параметри:\n" -#: initdb.c:2488 +#: initdb.c:2541 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивести інформацію про версію і вийти\n" -#: initdb.c:2489 +#: initdb.c:2542 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку, потім вийти\n" -#: initdb.c:2490 +#: initdb.c:2543 #, c-format msgid "\n" "If the data directory is not specified, the environment variable PGDATA\n" @@ -746,79 +761,79 @@ msgid "\n" msgstr "\n" "Якщо каталог даних не вказано, використовується змінна середовища PGDATA.\n" -#: initdb.c:2492 +#: initdb.c:2545 #, c-format msgid "\n" "Report bugs to <%s>.\n" msgstr "\n" "Повідомляти про помилки на <%s>.\n" -#: initdb.c:2493 +#: initdb.c:2546 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашня сторінка %s: <%s>\n" -#: initdb.c:2517 +#: initdb.c:2570 #, c-format msgid "invalid authentication method \"%s\" for \"%s\" connections" msgstr "неприпустимий спосіб автентифікації \"%s\" для \"%s\" підключення" -#: initdb.c:2531 +#: initdb.c:2584 #, c-format msgid "must specify a password for the superuser to enable password authentication" msgstr "необхідно вказати пароль суперкористувача для активації автентифікації за допомогою пароля" -#: initdb.c:2550 +#: initdb.c:2603 #, c-format msgid "no data directory specified" msgstr "каталог даних не вказано" -#: initdb.c:2551 +#: 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:2568 +#: initdb.c:2621 #, c-format msgid "could not set environment" msgstr "не вдалося встановити середовище" -#: initdb.c:2586 +#: 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:2589 +#: 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:2604 +#: initdb.c:2657 #, c-format msgid "input file location must be an absolute path" msgstr "розташування вхідного файлу має бути абсолютним шляхом" -#: initdb.c:2621 +#: initdb.c:2674 #, c-format msgid "The database cluster will be initialized with locale \"%s\".\n" msgstr "Кластер бази даних буде ініціалізовано з локалізацією \"%s\".\n" -#: initdb.c:2624 +#: initdb.c:2677 #, c-format msgid "The database cluster will be initialized with this locale configuration:\n" msgstr "Кластер бази даних буде ініціалізовано з локалізацією:\n" -#: initdb.c:2625 +#: initdb.c:2678 #, c-format msgid " locale provider: %s\n" msgstr " провайдер локалі: %s\n" -#: initdb.c:2627 +#: initdb.c:2680 #, c-format msgid " default collation: %s\n" msgstr " стандартне сортування: %s\n" -#: initdb.c:2628 +#: initdb.c:2681 #, c-format msgid " LC_COLLATE: %s\n" " LC_CTYPE: %s\n" @@ -833,216 +848,216 @@ msgstr " LC_COLLATE: %s\n" " LC_NUMERIC: %s\n" " LC_TIME: %s\n" -#: initdb.c:2658 +#: initdb.c:2711 #, c-format msgid "could not find suitable encoding for locale \"%s\"" msgstr "не вдалося знайти відповідне кодування для локалі \"%s\"" -#: initdb.c:2660 +#: initdb.c:2713 #, c-format msgid "Rerun %s with the -E option." msgstr "Перезапустіть %s з параметром -E." -#: initdb.c:2661 initdb.c:3204 initdb.c:3324 initdb.c:3344 +#: 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:2673 +#: 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:2678 +#: initdb.c:2731 #, c-format msgid "locale \"%s\" requires unsupported encoding \"%s\"" msgstr "локалізація \"%s\" потребує кодування \"%s\", що не підтримується" -#: initdb.c:2680 +#: initdb.c:2733 #, c-format msgid "Encoding \"%s\" is not allowed as a server-side encoding." msgstr "Кодування \"%s\" не допускається як кодування сервера." -#: initdb.c:2682 +#: initdb.c:2735 #, c-format msgid "Rerun %s with a different locale selection." msgstr "Перезапустіть %s з іншим вибором локалі." -#: initdb.c:2690 +#: initdb.c:2743 #, c-format msgid "The default database encoding has accordingly been set to \"%s\".\n" msgstr "Кодування бази даних за замовчуванням встановлено: \"%s\".\n" -#: initdb.c:2704 +#: initdb.c:2757 #, c-format msgid "builtin provider locale \"%s\" requires encoding \"%s\"" msgstr "локаль вбудованого провайдера \"%s\" вимагає кодування \"%s\"" -#: initdb.c:2766 +#: initdb.c:2819 #, c-format msgid "could not find suitable text search configuration for locale \"%s\"" msgstr "не вдалося знайти відповідну конфігурацію текстового пошуку для локалі\"%s\"" -#: initdb.c:2777 +#: initdb.c:2830 #, c-format msgid "suitable text search configuration for locale \"%s\" is unknown" msgstr "відповідна конфігурація текстового пошуку для локалі \"%s\" невідома" -#: initdb.c:2782 +#: initdb.c:2835 #, c-format msgid "specified text search configuration \"%s\" might not match locale \"%s\"" msgstr "вказана конфігурація текстового пошуку \"%s\" може не підходити локалі \"%s\"" -#: initdb.c:2787 +#: initdb.c:2840 #, c-format msgid "The default text search configuration will be set to \"%s\".\n" msgstr "Конфігурація текстового пошуку за замовчуванням буде встановлена в \"%s\".\n" -#: initdb.c:2830 initdb.c:2901 +#: initdb.c:2883 initdb.c:2954 #, c-format msgid "creating directory %s ... " msgstr "створення каталогу %s... " -#: initdb.c:2835 initdb.c:2906 initdb.c:2954 initdb.c:3011 +#: 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:2844 initdb.c:2916 +#: initdb.c:2897 initdb.c:2969 #, c-format msgid "fixing permissions on existing directory %s ... " msgstr "виправляю дозволи для створеного каталогу %s... " -#: initdb.c:2849 initdb.c:2921 +#: initdb.c:2902 initdb.c:2974 #, c-format msgid "could not change permissions of directory \"%s\": %m" msgstr "не вдалося змінити дозволи каталогу \"%s\": %m" -#: initdb.c:2861 initdb.c:2933 +#: initdb.c:2914 initdb.c:2986 #, c-format msgid "directory \"%s\" exists but is not empty" msgstr "каталог \"%s\" існує, але він не порожній" -#: initdb.c:2865 +#: 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:2873 initdb.c:2943 initdb.c:3369 +#: initdb.c:2926 initdb.c:2996 initdb.c:3422 #, c-format msgid "could not access directory \"%s\": %m" msgstr "немає доступу до каталогу \"%s\": %m" -#: initdb.c:2894 +#: initdb.c:2947 #, c-format msgid "WAL directory location must be an absolute path" msgstr "розташування WAL каталогу має бути абсолютним шляхом" -#: initdb.c:2937 +#: 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:2947 +#: initdb.c:3000 #, c-format msgid "could not create symbolic link \"%s\": %m" msgstr "не вдалося створити символічне послання \"%s\": %m" -#: initdb.c:2966 +#: initdb.c:3019 #, c-format msgid "It contains a dot-prefixed/invisible file, perhaps due to it being a mount point." msgstr "Він містить файл з крапкою або невидимий файл, можливо це точка під'єднання." -#: initdb.c:2968 +#: 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:2970 +#: 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:2997 +#: initdb.c:3050 #, c-format msgid "creating subdirectories ... " msgstr "створення підкаталогів... " -#: initdb.c:3040 +#: initdb.c:3093 msgid "performing post-bootstrap initialization ... " msgstr "виконується кінцева фаза ініціалізації ... " -#: initdb.c:3203 +#: initdb.c:3256 #, c-format msgid "-c %s requires a value" msgstr "-c %s необхідне значення" -#: initdb.c:3228 +#: initdb.c:3281 #, c-format msgid "Running in debug mode.\n" msgstr "Виконується у режимі налагодження.\n" -#: initdb.c:3232 +#: initdb.c:3285 #, c-format msgid "Running in no-clean mode. Mistakes will not be cleaned up.\n" msgstr "Виконується у режимі 'no-clean'. Помилки не будуть виправлені.\n" -#: initdb.c:3305 +#: initdb.c:3358 #, c-format msgid "unrecognized locale provider: %s" msgstr "нерозпізнаний постачальник локалів: %s" -#: initdb.c:3342 +#: initdb.c:3395 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "забагато аргументів у командному рядку (перший \"%s\")" -#: initdb.c:3349 initdb.c:3353 initdb.c:3357 +#: 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:3371 initdb.c:3434 +#: initdb.c:3424 initdb.c:3487 msgid "syncing data to disk ... " msgstr "синхронізація даних з диском ... " -#: initdb.c:3379 +#: initdb.c:3432 #, c-format msgid "password prompt and password file cannot be specified together" msgstr "неможливо вказати одночасно пароль і файл паролю" -#: initdb.c:3390 +#: initdb.c:3443 #, c-format msgid "argument of %s must be a power of two between 1 and 1024" msgstr "аргумент %s має бути ступенем двійки в діапазоні від 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" "This user must also own the server process.\n\n" msgstr "Файли цієї бази даних будуть належати користувачеві \"%s\".\n" "Від імені цього користувача повинен запускатися процес сервера.\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" "Sync to disk skipped.\n" @@ -1051,22 +1066,22 @@ msgstr "\n" "Синхронізація з диском пропущена.\n" "Каталог з даними може бути пошкоджено під час аварійного завершення роботи операційної системи.\n" -#: initdb.c:3445 +#: initdb.c:3498 #, c-format msgid "enabling \"trust\" authentication for local connections" msgstr "увімкнення автентифікації \"довіри\" для локальних підключень" -#: 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 або скориставшись опцією -A, або --auth-local і --auth-host, наступного разу, коли ви запускаєте initdb." #. translator: This is a placeholder in a shell command. -#: initdb.c:3476 +#: initdb.c:3529 msgid "logfile" msgstr "logfile" -#: initdb.c:3478 +#: initdb.c:3531 #, c-format msgid "\n" "Success. You can now start the database server using:\n\n" diff --git a/src/bin/pg_amcheck/pg_amcheck.c b/src/bin/pg_amcheck/pg_amcheck.c index 0c05cf58bcee1..8844bfb6a0e45 100644 --- a/src/bin/pg_amcheck/pg_amcheck.c +++ b/src/bin/pg_amcheck/pg_amcheck.c @@ -559,7 +559,7 @@ main(int argc, char *argv[]) executeCommand(conn, install_sql, opts.echo); pfree(install_sql); - pfree(schema); + PQfreemem(schema); } /* diff --git a/src/bin/pg_amcheck/po/ru.po b/src/bin/pg_amcheck/po/ru.po index 0889dfb2f8ebc..74437e92a3388 100644 --- a/src/bin/pg_amcheck/po/ru.po +++ b/src/bin/pg_amcheck/po/ru.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_amcheck (PostgreSQL) 14\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-09-02 09:29+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" @@ -164,14 +164,14 @@ msgstr "ошибка при выполнении запроса: %s" msgid "Query was: %s" msgstr "Выполнялся запрос: %s" -#: ../../fe_utils/string_utils.c:434 +#: ../../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:607 +#: ../../fe_utils/string_utils.c:760 #, c-format msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "" diff --git a/src/bin/pg_amcheck/t/003_check.pl b/src/bin/pg_amcheck/t/003_check.pl index d99b094dba807..87cd5b627a4c8 100644 --- a/src/bin/pg_amcheck/t/003_check.pl +++ b/src/bin/pg_amcheck/t/003_check.pl @@ -9,6 +9,9 @@ use Test::More; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_smgr + 'hacks relation files directly for scaffolding'; + my ($node, $port, %corrupt_page, %remove_relation); # Returns the filesystem path for the named relation. diff --git a/src/bin/pg_amcheck/t/005_opclass_damage.pl b/src/bin/pg_amcheck/t/005_opclass_damage.pl index 1eea215227208..eabd993763f7f 100644 --- a/src/bin/pg_amcheck/t/005_opclass_damage.pl +++ b/src/bin/pg_amcheck/t/005_opclass_damage.pl @@ -10,6 +10,9 @@ use PostgreSQL::Test::Utils; use Test::More; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_smgr + 'investigate why this fails'; + my $node = PostgreSQL::Test::Cluster->new('test'); $node->init; $node->start; diff --git a/src/bin/pg_archivecleanup/po/ja.po b/src/bin/pg_archivecleanup/po/ja.po index f601cfc4376b3..e1fd2dbff8941 100644 --- a/src/bin/pg_archivecleanup/po/ja.po +++ b/src/bin/pg_archivecleanup/po/ja.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_archivecleanup (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-09-05 09:59+0900\n" -"PO-Revision-Date: 2024-09-05 10:38+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" @@ -17,22 +17,22 @@ msgstr "" "X-Generator: Poedit 1.8.13\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../../../src/common/logging.c:278 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:285 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "警告: " -#: ../../../src/common/logging.c:296 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "詳細: " -#: ../../../src/common/logging.c:303 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "ヒント: " @@ -48,43 +48,43 @@ msgstr "メモリ不足です\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "nullポインタは複製できません(内部エラー)\n" -#: pg_archivecleanup.c:69 +#: pg_archivecleanup.c:68 #, c-format msgid "archive location \"%s\" does not exist" msgstr "アーカイブの場所\"%s\"が存在しません" -#: pg_archivecleanup.c:101 +#: pg_archivecleanup.c:100 #, c-format msgid "could not open archive location \"%s\": %m" msgstr "アーカイブの場所\"%s\"をオープンできませんでした: %m" -#: pg_archivecleanup.c:165 +#: pg_archivecleanup.c:164 #, c-format msgid "could not remove file \"%s\": %m" msgstr "ファイル\"%s\"を削除できませんでした: %m" -#: pg_archivecleanup.c:170 +#: pg_archivecleanup.c:169 #, c-format msgid "could not read archive location \"%s\": %m" msgstr "アーカイブの場所\"%s\"を読み込めませんでした: %m" -#: pg_archivecleanup.c:173 +#: pg_archivecleanup.c:172 #, c-format msgid "could not close archive location \"%s\": %m" msgstr "アーカイブの場所\"%s\"をクローズできませんでした: %m" -#: pg_archivecleanup.c:246 +#: pg_archivecleanup.c:245 #, c-format msgid "invalid file name argument" msgstr "ファイル名引数が無効です" -#: pg_archivecleanup.c:247 pg_archivecleanup.c:335 pg_archivecleanup.c:355 -#: pg_archivecleanup.c:367 pg_archivecleanup.c:374 +#: 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:260 +#: pg_archivecleanup.c:259 #, c-format msgid "" "%s removes older WAL files from PostgreSQL archives.\n" @@ -93,17 +93,17 @@ msgstr "" "%sはPostgreSQLのアーカイブから古いWALファイルを削除します。\n" "\n" -#: pg_archivecleanup.c:261 +#: pg_archivecleanup.c:260 #, c-format msgid "Usage:\n" msgstr "使用法:\n" -#: pg_archivecleanup.c:262 +#: pg_archivecleanup.c:261 #, c-format msgid " %s [OPTION]... ARCHIVELOCATION OLDESTKEPTWALFILE\n" msgstr "%s [オプション] ... {アーカイブの場所} {保存する最古の WAL ファイル名}\n" -#: pg_archivecleanup.c:263 +#: pg_archivecleanup.c:262 #, c-format msgid "" "\n" @@ -112,56 +112,56 @@ msgstr "" "\n" "オプション:\n" -#: pg_archivecleanup.c:264 +#: pg_archivecleanup.c:263 #, c-format msgid " -b, --clean-backup-history clean up files including backup history files\n" msgstr " -b, --clean-backup-history バックアップヒストリファイルを含めて削除する\n" -#: pg_archivecleanup.c:265 +#: pg_archivecleanup.c:264 #, c-format msgid " -d, --debug generate debug output (verbose mode)\n" msgstr " -d, --debug デバッグ情報を出力(冗長モード)\n" -#: pg_archivecleanup.c:266 +#: pg_archivecleanup.c:265 #, c-format 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:268 +#: pg_archivecleanup.c:267 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: pg_archivecleanup.c:269 +#: 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:271 +#: pg_archivecleanup.c:270 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: pg_archivecleanup.c:272 +#: pg_archivecleanup.c:271 #, c-format msgid "" "\n" -"For use as \"archive_cleanup_command\" in postgresql.conf:\n" +"For use as archive_cleanup_command in postgresql.conf:\n" " archive_cleanup_command = 'pg_archivecleanup [OPTION]... ARCHIVELOCATION %%r'\n" "e.g.\n" " archive_cleanup_command = 'pg_archivecleanup /mnt/server/archiverdir %%r'\n" msgstr "" "\n" -"postgresql.confで\"archive_cleanup_command\"として使用する場合は以下のようにします:\n" -" archive_cleanup_command = 'pg_archivecleanup [オプション]... アーカイブの場所 %%r'\n" +"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:277 +#: pg_archivecleanup.c:276 #, c-format msgid "" "\n" @@ -174,7 +174,7 @@ msgstr "" "使用例\n" " pg_archivecleanup /mnt/server/archiverdir 000000010000000000000010.00000020.backup\n" -#: pg_archivecleanup.c:281 +#: pg_archivecleanup.c:280 #, c-format msgid "" "\n" @@ -183,22 +183,22 @@ msgstr "" "\n" "バグは<%s>に報告してください。\n" -#: pg_archivecleanup.c:282 +#: pg_archivecleanup.c:281 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: pg_archivecleanup.c:354 +#: pg_archivecleanup.c:353 #, c-format msgid "must specify archive location" msgstr "アーカイブの場所を指定してください" -#: pg_archivecleanup.c:366 +#: pg_archivecleanup.c:365 #, c-format msgid "must specify oldest kept WAL file" msgstr "保存する最古のWALファイルを指定してください" -#: pg_archivecleanup.c:373 +#: pg_archivecleanup.c:372 #, c-format msgid "too many command-line arguments" msgstr "コマンドライン引数が多すぎます" diff --git a/src/bin/pg_basebackup/Makefile b/src/bin/pg_basebackup/Makefile index 26c53e473f560..64147cde3e1ba 100644 --- a/src/bin/pg_basebackup/Makefile +++ b/src/bin/pg_basebackup/Makefile @@ -44,6 +44,17 @@ BBOBJS = \ bbstreamer_tar.o \ bbstreamer_zstd.o +ifeq ($(enable_percona_ext),yes) + +OBJS += \ + xlogreader.o \ + $(top_srcdir)/src/fe_utils/simple_list.o \ + $(top_builddir)/src/libtde/libtdexlog.a \ + $(top_builddir)/src/libtde/libtde.a + +override CPPFLAGS := -I$(top_srcdir)/contrib/pg_tde/src/include -I$(top_srcdir)/contrib/pg_tde/src/libkmip/libkmip/include -DFRONTEND $(CPPFLAGS) +endif + all: pg_basebackup pg_createsubscriber pg_receivewal pg_recvlogical pg_basebackup: $(BBOBJS) $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils @@ -58,6 +69,9 @@ pg_receivewal: pg_receivewal.o $(OBJS) | submake-libpq submake-libpgport submake pg_recvlogical: pg_recvlogical.o $(OBJS) | submake-libpq submake-libpgport submake-libpgfeutils $(CC) $(CFLAGS) pg_recvlogical.o $(OBJS) $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) +xlogreader.c: % : $(top_srcdir)/src/backend/access/transam/% + rm -f $@ && $(LN_S) $< . + install: all installdirs $(INSTALL_PROGRAM) pg_basebackup$(X) '$(DESTDIR)$(bindir)/pg_basebackup$(X)' $(INSTALL_PROGRAM) pg_createsubscriber$(X) '$(DESTDIR)$(bindir)/pg_createsubscriber$(X)' @@ -76,7 +90,7 @@ uninstall: 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) + $(OBJS) xlogreader.c rm -rf tmp_check check: diff --git a/src/bin/pg_basebackup/bbstreamer.h b/src/bin/pg_basebackup/bbstreamer.h index 3b820f13b519a..7e63a7b1a1f4f 100644 --- a/src/bin/pg_basebackup/bbstreamer.h +++ b/src/bin/pg_basebackup/bbstreamer.h @@ -204,7 +204,8 @@ extern bbstreamer *bbstreamer_gzip_writer_new(char *pathname, FILE *file, pg_compress_specification *compress); extern bbstreamer *bbstreamer_extractor_new(const char *basepath, const char *(*link_map) (const char *), - void (*report_output_file) (const char *)); + void (*report_output_file) (const char *), + bool encrypted_wal); extern bbstreamer *bbstreamer_gzip_decompressor_new(bbstreamer *next); extern bbstreamer *bbstreamer_lz4_compressor_new(bbstreamer *next, diff --git a/src/bin/pg_basebackup/bbstreamer_file.c b/src/bin/pg_basebackup/bbstreamer_file.c index 0be39dddc977a..7df949e64db3d 100644 --- a/src/bin/pg_basebackup/bbstreamer_file.c +++ b/src/bin/pg_basebackup/bbstreamer_file.c @@ -18,6 +18,10 @@ #include "common/logging.h" #include "common/string.h" +#ifdef PERCONA_EXT +#include "pg_tde.h" +#endif + typedef struct bbstreamer_plain_writer { bbstreamer base; @@ -34,6 +38,7 @@ typedef struct bbstreamer_extractor void (*report_output_file) (const char *); char filename[MAXPGPATH]; FILE *file; + bool encryped_wal; } bbstreamer_extractor; static void bbstreamer_plain_writer_content(bbstreamer *streamer, @@ -182,7 +187,8 @@ bbstreamer_plain_writer_free(bbstreamer *streamer) bbstreamer * bbstreamer_extractor_new(const char *basepath, const char *(*link_map) (const char *), - void (*report_output_file) (const char *)) + void (*report_output_file) (const char *), + bool encrypted_wal) { bbstreamer_extractor *streamer; @@ -192,6 +198,7 @@ bbstreamer_extractor_new(const char *basepath, streamer->basepath = pstrdup(basepath); streamer->link_map = link_map; streamer->report_output_file = report_output_file; + streamer->encryped_wal = encrypted_wal; return &streamer->base; } @@ -236,9 +243,28 @@ bbstreamer_extractor_content(bbstreamer *streamer, bbstreamer_member *member, extract_link(mystreamer->filename, linktarget); } else + { +#ifdef PERCONA_EXT + /* + * A streamed WAL is encrypted with the newly generated WAL key, + * hence we have to prevent wal_keys from rewriting. + */ + if (strcmp(member->pathname, "pg_tde/wal_keys") == 0) + { + if (mystreamer->encryped_wal) + break; + else + { + pg_log_warning("the source has WAL keys, but no WAL encryption configured for the target backups"); + pg_log_warning_detail("This may lead to exposed data and broken backup."); + pg_log_warning_hint("Run pg_basebackup with -E to encrypt streamed WAL."); + } + } +#endif mystreamer->file = create_file_for_extract(mystreamer->filename, member->mode); + } /* Report output file change. */ if (mystreamer->report_output_file) @@ -297,7 +323,8 @@ should_allow_existing_directory(const char *pathname) strcmp(filename, "pg_xlog") == 0 || strcmp(filename, "archive_status") == 0 || strcmp(filename, "summaries") == 0 || - strcmp(filename, "pg_tblspc") == 0) + strcmp(filename, "pg_tblspc") == 0 || + strcmp(filename, PG_TDE_DATA_DIR) == 0) return true; if (strspn(filename, "0123456789") == strlen(filename)) diff --git a/src/bin/pg_basebackup/bbstreamer_lz4.c b/src/bin/pg_basebackup/bbstreamer_lz4.c index eda62caeded4d..96e74ae7649d0 100644 --- a/src/bin/pg_basebackup/bbstreamer_lz4.c +++ b/src/bin/pg_basebackup/bbstreamer_lz4.c @@ -320,9 +320,9 @@ bbstreamer_lz4_decompressor_content(bbstreamer *streamer, mystreamer = (bbstreamer_lz4_frame *) streamer; next_in = (uint8 *) data; - next_out = (uint8 *) mystreamer->base.bbs_buffer.data; + next_out = (uint8 *) mystreamer->base.bbs_buffer.data + mystreamer->bytes_written; avail_in = len; - avail_out = mystreamer->base.bbs_buffer.maxlen; + avail_out = mystreamer->base.bbs_buffer.maxlen - mystreamer->bytes_written; while (avail_in > 0) { diff --git a/src/bin/pg_basebackup/meson.build b/src/bin/pg_basebackup/meson.build index c00acd5e11828..8e15c24e42725 100644 --- a/src/bin/pg_basebackup/meson.build +++ b/src/bin/pg_basebackup/meson.build @@ -12,10 +12,15 @@ common_sources = files( 'walmethods.c', ) +common_sources += xlogreader_sources + pg_basebackup_deps = [frontend_code, libpq, lz4, zlib, zstd] pg_basebackup_common = static_library('libpg_basebackup_common', common_sources, + c_args: ['-DFRONTEND'], # needed for xlogreader et al + link_with: pg_tde_frontend, dependencies: pg_basebackup_deps, + include_directories: pg_tde_inc, kwargs: internal_lib_args, ) @@ -34,6 +39,7 @@ pg_basebackup = executable('pg_basebackup', link_with: [pg_basebackup_common], dependencies: pg_basebackup_deps, kwargs: default_bin_args, + include_directories: pg_tde_inc, ) bin_targets += pg_basebackup @@ -71,6 +77,7 @@ pg_receivewal = executable('pg_receivewal', link_with: [pg_basebackup_common], dependencies: pg_basebackup_deps, kwargs: default_bin_args, + include_directories: pg_tde_inc, ) bin_targets += pg_receivewal diff --git a/src/bin/pg_basebackup/pg_basebackup.c b/src/bin/pg_basebackup/pg_basebackup.c index 8f3dd04fd2226..e45d09f7151ea 100644 --- a/src/bin/pg_basebackup/pg_basebackup.c +++ b/src/bin/pg_basebackup/pg_basebackup.c @@ -38,7 +38,18 @@ #include "receivelog.h" #include "streamutil.h" -#define ERRCODE_DATA_CORRUPTED "XX001" +#ifdef PERCONA_EXT +#include "access/pg_tde_fe_init.h" +#include "access/pg_tde_xlog_smgr.h" +#include "access/pg_tde_xlog_keys.h" +#include "access/xlog_smgr.h" +#include "catalog/tde_principal_key.h" +#include "pg_tde.h" + +#define GLOBAL_DATA_TDE_OID 1664 +#endif + +#define ERRCODE_DATA_CORRUPTED_BCP "XX001" typedef struct TablespaceListCell { @@ -138,6 +149,7 @@ static bool showprogress = false; static bool estimatesize = true; static int verbose = 0; static IncludeWal includewal = STREAM_WAL; +static bool encrypt_wal = false; static bool fastcheckpoint = false; static bool writerecoveryconf = false; static bool do_sync = true; @@ -409,6 +421,9 @@ usage(void) printf(_(" --waldir=WALDIR location for the write-ahead log directory\n")); printf(_(" -X, --wal-method=none|fetch|stream\n" " include required WAL files with specified method\n")); +#ifdef PERCONA_EXT + printf(_(" -E, --encrypt-wal encrypt streamed WAL\n")); +#endif printf(_(" -z, --gzip compress tar output\n")); printf(_(" -Z, --compress=[{client|server}-]METHOD[:DETAIL]\n" " compress on client or server as specified\n")); @@ -561,6 +576,7 @@ LogStreamerMain(logstreamer_param *param) stream.synchronous = false; /* fsync happens at the end of pg_basebackup for all data */ stream.do_sync = false; + stream.encrypt = encrypt_wal; stream.mark_done = true; stream.partial_suffix = NULL; stream.replication_slot = replication_slot; @@ -654,6 +670,27 @@ StartLogStreamer(char *startpos, uint32 timeline, char *sysidentifier, PQserverVersion(conn) < MINIMUM_VERSION_FOR_PG_WAL ? "pg_xlog" : "pg_wal"); +#ifdef PERCONA_EXT + if (encrypt_wal) { + char tdedir[MAXPGPATH]; + TDEPrincipalKey *principalKey; + + snprintf(tdedir, sizeof(tdedir), "%s/%s", basedir, PG_TDE_DATA_DIR); + pg_tde_fe_init(tdedir); + TDEXLogSmgrInit(); + + principalKey = GetPrincipalKey(GLOBAL_DATA_TDE_OID, NULL); + if (!principalKey) + { + pg_log_error("could not find server principal key"); + pg_log_error_hint("Copy PGDATA/pg_tde from the source to the backup destination dir."); + exit(1); + } + pg_tde_save_server_key(principalKey, false); + TDEXLogSmgrInitWrite(true); + } +#endif + /* Temporary replication slots are only supported in 10 and newer */ if (PQserverVersion(conn) < MINIMUM_VERSION_FOR_TEMP_SLOTS) temp_replication_slot = false; @@ -770,6 +807,14 @@ verify_dir_is_empty_or_create(char *dirname, bool *created, bool *found) case 3: case 4: +#ifdef PERCONA_EXT + /* + * `pg_tde` may exists and contain keys and providers for the WAL + * encryption + */ + if (strcmp(dirname, PG_TDE_DATA_DIR)) + return; +#endif /* * Exists, not empty */ @@ -1162,7 +1207,8 @@ CreateBackupStreamer(char *archive_name, char *spclocation, directory = get_tablespace_mapping(spclocation); streamer = bbstreamer_extractor_new(directory, get_tablespace_mapping, - progress_update_filename); + progress_update_filename, + encrypt_wal); } else { @@ -2201,7 +2247,7 @@ BaseBackup(char *compression_algorithm, char *compression_detail, const char *sqlstate = PQresultErrorField(res, PG_DIAG_SQLSTATE); if (sqlstate && - strcmp(sqlstate, ERRCODE_DATA_CORRUPTED) == 0) + strcmp(sqlstate, ERRCODE_DATA_CORRUPTED_BCP) == 0) { pg_log_error("checksum error occurred"); checksum_failure = true; @@ -2368,6 +2414,9 @@ main(int argc, char **argv) {"target", required_argument, NULL, 't'}, {"tablespace-mapping", required_argument, NULL, 'T'}, {"wal-method", required_argument, NULL, 'X'}, +#ifdef PERCONA_EXT + {"encrypt-wal", no_argument, NULL, 'E'}, +#endif {"gzip", no_argument, NULL, 'z'}, {"compress", required_argument, NULL, 'Z'}, {"label", required_argument, NULL, 'l'}, @@ -2422,7 +2471,7 @@ main(int argc, char **argv) atexit(cleanup_directories_atexit); - while ((c = getopt_long(argc, argv, "c:Cd:D:F:h:i:l:nNp:Pr:Rs:S:t:T:U:vwWX:zZ:", + while ((c = getopt_long(argc, argv, "c:Cd:D:EF:h:i:l:nNp:Pr:Rs:S:t:T:U:vwWX:zZ:", long_options, &option_index)) != -1) { switch (c) @@ -2535,6 +2584,11 @@ main(int argc, char **argv) pg_fatal("invalid wal-method option \"%s\", must be \"fetch\", \"stream\", or \"none\"", optarg); break; +#ifdef PERCONA_EXT + case 'E': + encrypt_wal = true; + break; +#endif case 'z': compression_algorithm = "gzip"; compression_detail = NULL; @@ -2713,6 +2767,26 @@ main(int argc, char **argv) exit(1); } + /* + * Sanity checks for WAL encryption. + */ + if (encrypt_wal) + { + if (includewal != STREAM_WAL) + { + pg_log_error("WAL encryption can only be used with WAL streaming"); + pg_log_error_hint("Use -X stream with -E."); + exit(1); + } + + if (format != 'p') + { + pg_log_error("can not encrypt WAL in tar mode"); + pg_log_error_hint("Use -Fp with -E."); + exit(1); + } + } + /* * Sanity checks for replication slot options. */ diff --git a/src/bin/pg_basebackup/pg_createsubscriber.c b/src/bin/pg_basebackup/pg_createsubscriber.c index 677c0cd0843bf..067a04ec6c329 100644 --- a/src/bin/pg_basebackup/pg_createsubscriber.c +++ b/src/bin/pg_basebackup/pg_createsubscriber.c @@ -1206,8 +1206,17 @@ setup_recovery(const struct LogicalRepInfo *dbinfo, const char *datadir, const c appendPQExpBuffer(recoveryconfcontents, "recovery_target = ''\n"); appendPQExpBuffer(recoveryconfcontents, "recovery_target_timeline = 'latest'\n"); + + /* + * Set recovery_target_inclusive = false to avoid reapplying the + * transaction committed at 'lsn' after subscription is enabled. This is + * because the provided 'lsn' is also used as the replication start point + * for the subscription. So, the server can send the transaction committed + * at that 'lsn' after replication is started which can lead to applying + * the same transaction twice if we keep recovery_target_inclusive = true. + */ appendPQExpBuffer(recoveryconfcontents, - "recovery_target_inclusive = true\n"); + "recovery_target_inclusive = false\n"); appendPQExpBuffer(recoveryconfcontents, "recovery_target_action = promote\n"); appendPQExpBuffer(recoveryconfcontents, "recovery_target_name = ''\n"); diff --git a/src/bin/pg_basebackup/po/ja.po b/src/bin/pg_basebackup/po/ja.po index 26e4d7b26f7c7..098c300fa6260 100644 --- a/src/bin/pg_basebackup/po/ja.po +++ b/src/bin/pg_basebackup/po/ja.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_basebackup (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-09-05 09:59+0900\n" -"PO-Revision-Date: 2024-09-05 10:39+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" @@ -22,31 +22,30 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: ../../../src/common/logging.c:278 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:285 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "警告: " -#: ../../../src/common/logging.c:296 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "詳細: " -#: ../../../src/common/logging.c:303 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "ヒント: " #: ../../common/compression.c:132 ../../common/compression.c:141 -#: ../../common/compression.c:150 ../../fe_utils/astreamer_gzip.c:142 -#: ../../fe_utils/astreamer_gzip.c:275 ../../fe_utils/astreamer_lz4.c:104 -#: ../../fe_utils/astreamer_lz4.c:302 ../../fe_utils/astreamer_zstd.c:133 -#: ../../fe_utils/astreamer_zstd.c:288 +#: ../../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による圧縮をサポートしていません" @@ -112,7 +111,7 @@ 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 -#: ../../fe_utils/astreamer_file.c:142 pg_recvlogical.c:650 +#: bbstreamer_file.c:138 pg_recvlogical.c:650 #, c-format msgid "could not close file \"%s\": %m" msgstr "ファイル\"%s\"をクローズできませんでした: %m" @@ -134,9 +133,9 @@ msgstr "" "されるものと一致しないようです。この場合以下の結果は不正確になります。また、\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 ../../fe_utils/recovery_gen.c:140 +#: ../../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" @@ -147,8 +146,8 @@ msgstr "ファイル\"%s\"をオープンできませんでした: %m" 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 pg_recvlogical.c:204 +#: ../../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" @@ -164,36 +163,36 @@ msgstr "メモリ不足です\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "null ポインタを複製できません (内部エラー)\n" -#: ../../common/file_utils.c:77 +#: ../../common/file_utils.c:76 #, 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 +#: ../../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:131 ../../common/file_utils.c:228 +#: ../../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:152 ../../common/file_utils.c:282 +#: ../../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:170 ../../common/file_utils.c:316 +#: ../../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:499 pg_basebackup.c:2344 walmethods.c:462 +#: ../../common/file_utils.c:498 pg_basebackup.c:2344 walmethods.c:462 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m" @@ -228,193 +227,191 @@ msgstr "制限付きトークンで再実行できませんでした: %lu" msgid "could not get exit code from subprocess: error code %lu" msgstr "サブプロセスの終了コードを取得できませんでした: エラーコード %lu" -#: ../../fe_utils/astreamer_file.c:97 ../../fe_utils/astreamer_file.c:365 -#: ../../fe_utils/recovery_gen.c:152 pg_basebackup.c:1497 pg_basebackup.c:1706 +#: ../../fe_utils/option_utils.c:69 #, c-format -msgid "could not create file \"%s\": %m" -msgstr "ファイル\"%s\"を作成できませんでした: %m" +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/astreamer_file.c:125 ../../fe_utils/astreamer_file.c:262 -#: ../../fe_utils/recovery_gen.c:143 pg_basebackup.c:1433 pg_basebackup.c:1727 +#: ../../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: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/astreamer_file.c:279 +#: ../../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" + +#: ../../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" + +#: bbstreamer_file.c:275 #, c-format msgid "unexpected state while extracting archive" msgstr "アーカイブの抽出中に想定外の状態" -#: ../../fe_utils/astreamer_file.c:325 pg_basebackup.c:698 pg_basebackup.c:712 +#: 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" -#: ../../fe_utils/astreamer_file.c:330 +#: bbstreamer_file.c:326 #, c-format msgid "could not set permissions on directory \"%s\": %m" msgstr "ディレクトリ\"%s\"に権限を設定できませんでした: %m" -#: ../../fe_utils/astreamer_file.c:349 +#: bbstreamer_file.c:345 #, c-format msgid "could not create symbolic link from \"%s\" to \"%s\": %m" msgstr "\"%s\"から\"%s\"へのシンボリックリンクを作成できませんでした: %m" -#: ../../fe_utils/astreamer_file.c:369 +#: bbstreamer_file.c:365 #, c-format msgid "could not set permissions on file \"%s\": %m" msgstr "ファイル\"%s\"の権限を設定できませんでした: %m" -#: ../../fe_utils/astreamer_gzip.c:117 +#: bbstreamer_gzip.c:95 #, c-format msgid "could not create compressed file \"%s\": %m" msgstr "圧縮ファイル\"%s\"を作成できませんでした: %m" -#: ../../fe_utils/astreamer_gzip.c:129 +#: bbstreamer_gzip.c:103 #, c-format msgid "could not duplicate stdout: %m" msgstr "標準出力の複製に失敗しました: %m" -#: ../../fe_utils/astreamer_gzip.c:133 +#: bbstreamer_gzip.c:107 #, c-format msgid "could not open output file: %m" msgstr "出力ファイルをオープンできませんでした: %m" -#: ../../fe_utils/astreamer_gzip.c:137 +#: bbstreamer_gzip.c:111 #, c-format msgid "could not set compression level %d: %s" msgstr "圧縮レベルを%dに設定できませんでした: %s" -#: ../../fe_utils/astreamer_gzip.c:169 +#: bbstreamer_gzip.c:143 #, c-format msgid "could not write to compressed file \"%s\": %s" msgstr "圧縮ファイル\"%s\"に書き込めませんでした: %s" -#: ../../fe_utils/astreamer_gzip.c:193 +#: bbstreamer_gzip.c:167 #, c-format msgid "could not close compressed file \"%s\": %m" msgstr "圧縮ファイル\"%s\"をクローズすることができませんでした: %m" -#: ../../fe_utils/astreamer_gzip.c:271 walmethods.c:880 +#: bbstreamer_gzip.c:245 walmethods.c:880 #, c-format msgid "could not initialize compression library" msgstr "圧縮ライブラリを初期化できませんでした" -#: ../../fe_utils/astreamer_gzip.c:322 ../../fe_utils/astreamer_lz4.c:358 -#: ../../fe_utils/astreamer_zstd.c:333 +#: bbstreamer_gzip.c:296 bbstreamer_lz4.c:354 bbstreamer_zstd.c:329 #, c-format msgid "could not decompress data: %s" msgstr "データを伸張できませんでした: %s" -#: ../../fe_utils/astreamer_lz4.c:99 +#: 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" -#: ../../fe_utils/astreamer_lz4.c:144 +#: bbstreamer_lz4.c:140 #, c-format msgid "could not write lz4 header: %s" msgstr "lz4ヘッダを出力できませんでした: %s" -#: ../../fe_utils/astreamer_lz4.c:193 ../../fe_utils/astreamer_zstd.c:185 -#: ../../fe_utils/astreamer_zstd.c:227 +#: bbstreamer_lz4.c:189 bbstreamer_zstd.c:181 bbstreamer_zstd.c:223 #, c-format msgid "could not compress data: %s" msgstr "データを圧縮できませんでした: %s" -#: ../../fe_utils/astreamer_lz4.c:245 +#: bbstreamer_lz4.c:241 #, c-format msgid "could not end lz4 compression: %s" msgstr "lz4圧縮を終了できませんでした: %s" -#: ../../fe_utils/astreamer_lz4.c:297 +#: bbstreamer_lz4.c:293 #, c-format msgid "could not initialize compression library: %s" msgstr "圧縮ライブラリを初期化できませんでした: %s" -#: ../../fe_utils/astreamer_tar.c:244 +#: bbstreamer_tar.c:244 #, c-format msgid "tar file trailer exceeds 2 blocks" msgstr "tarファイル後続ブロックが2ブロックを超えています" -#: ../../fe_utils/astreamer_tar.c:249 +#: bbstreamer_tar.c:249 #, c-format msgid "unexpected state while parsing tar archive" msgstr "tarアーカイブのパース中に想定外の状態" -#: ../../fe_utils/astreamer_tar.c:292 +#: bbstreamer_tar.c:292 #, c-format msgid "tar member has empty name" msgstr "tarメンバーの名前が空です" -#: ../../fe_utils/astreamer_tar.c:326 +#: bbstreamer_tar.c:326 #, c-format msgid "COPY stream ended before last file was finished" msgstr "最後のファイルが終わる前にCOPYストリームが終了しました" -#: ../../fe_utils/astreamer_zstd.c:89 +#: bbstreamer_zstd.c:85 #, c-format msgid "could not create zstd compression context" msgstr "zstd圧縮コンテクストを生成できませんでした" -#: ../../fe_utils/astreamer_zstd.c:95 +#: bbstreamer_zstd.c:91 #, c-format msgid "could not set zstd compression level to %d: %s" msgstr "zstd圧縮レベルを%dに設定できませんでした: %s" -#: ../../fe_utils/astreamer_zstd.c:109 +#: bbstreamer_zstd.c:105 #, c-format msgid "could not set compression worker count to %d: %s" msgstr "圧縮ワーカー数を%dに設定できませんでした: %s" -#: ../../fe_utils/astreamer_zstd.c:120 +#: bbstreamer_zstd.c:116 #, c-format msgid "could not enable long-distance mode: %s" msgstr "長距離モードを有効化できませんでした: %s" -#: ../../fe_utils/astreamer_zstd.c:279 +#: bbstreamer_zstd.c:275 #, c-format msgid "could not create zstd decompression context" msgstr "zstd伸張コンテクストを生成できませんでした" -#: ../../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/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/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" - -#: astreamer_inject.c:189 -#, c-format -msgid "unexpected state while injecting recovery settings" -msgstr "リカバリ設定の出力中に想定外の状態" - #: pg_basebackup.c:245 #, c-format msgid "removing data directory \"%s\"" @@ -798,7 +795,7 @@ msgid "could not read from ready pipe: %m" msgstr "準備ができたパイプからの読み込みが失敗しました: %m" #: pg_basebackup.c:491 pg_basebackup.c:633 pg_basebackup.c:2258 -#: streamutil.c:518 +#: streamutil.c:521 #, c-format msgid "could not parse write-ahead log location \"%s\"" msgstr "先行書き込みログの位置\"%s\"をパースできませんでした" @@ -983,8 +980,8 @@ 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 +#: 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" @@ -1124,7 +1121,7 @@ msgstr "子プロセスの待機ができませんでした: %m" msgid "child %d died, expected %d" msgstr "子プロセス %d が終了しましたが、期待していたのは %d でした" -#: pg_basebackup.c:2248 streamutil.c:89 streamutil.c:204 streamutil.c:316 +#: pg_basebackup.c:2248 streamutil.c:92 streamutil.c:207 streamutil.c:319 #, c-format msgid "%s" msgstr "%s" @@ -1180,9 +1177,9 @@ msgstr "不正な wal-method オプション\"%s\"、\"fetch\"、\"stream\" ま #: 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_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 @@ -1192,7 +1189,7 @@ msgstr "不正な wal-method オプション\"%s\"、\"fetch\"、\"stream\" ま msgid "Try \"%s --help\" for more information." msgstr "詳細は\"%s --help\"を実行してください。" -#: pg_basebackup.c:2584 pg_createsubscriber.c:2045 pg_receivewal.c:758 +#: 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\")" @@ -1310,7 +1307,7 @@ msgstr "再試行の前にこのパブリケーションを削除してくださ 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:1260 +#: pg_createsubscriber.c:206 pg_createsubscriber.c:1261 #, c-format msgid "Drop this replication slot soon to avoid retention of WAL files." msgstr "WALファイルの増加を避けるためにこのレプリケーションスロットを直ちに削除してください。" @@ -1449,10 +1446,10 @@ msgstr "ディレクトリ\"%s\"はデータベースクラスタディレクト msgid "connection to database failed: %s" msgstr "データベース接続に失敗しました: %s" -#: pg_createsubscriber.c:526 streamutil.c:230 +#: pg_createsubscriber.c:526 #, c-format -msgid "could not clear \"search_path\": %s" -msgstr "\"search_path\"を消去できませんでした: %s" +msgid "could not clear search_path: %s" +msgstr "search_path を消去できませんでした: %s" #: pg_createsubscriber.c:566 #, c-format @@ -1551,8 +1548,8 @@ msgstr "パブリッシャの設定が取得できませんでした: %s" #: pg_createsubscriber.c:914 #, c-format -msgid "publisher requires \"wal_level\" >= \"logical\"" -msgstr "パブリッシャでは \"wal_level\" >= \"logical\" である必要があります" +msgid "publisher requires wal_level >= \"logical\"" +msgstr "パブリッシャでは wal_level >= \"logical\" である必要があります" #: pg_createsubscriber.c:920 #, c-format @@ -1626,317 +1623,317 @@ msgstr "サブスクリプション\"%s\"を削除できませんでした: %s" msgid "could not obtain pre-existing subscriptions: %s" msgstr "既存のサブスクリプションを取得できませんでした: %s" -#: pg_createsubscriber.c:1258 +#: pg_createsubscriber.c:1259 #, c-format msgid "could not drop replication slot \"%s\" on primary" msgstr "プライマリ上のレプリケーションスロット\"%s\"を削除できませんでした" -#: pg_createsubscriber.c:1292 +#: pg_createsubscriber.c:1293 #, c-format msgid "could not obtain failover replication slot information: %s" msgstr "フェイルオーバーレプリケーションスロットの情報を取得できませんでした: %s" -#: pg_createsubscriber.c:1294 pg_createsubscriber.c:1303 +#: 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:1302 +#: pg_createsubscriber.c:1303 #, c-format msgid "could not drop failover replication slot" msgstr "フェイルオーバーレプリケーションスロットを削除できませんでした" -#: pg_createsubscriber.c:1324 +#: pg_createsubscriber.c:1325 #, c-format msgid "creating the replication slot \"%s\" in database \"%s\"" msgstr "データベース\"%2$s\"でレプリケーションスロット\"%1$s:を作成します" -#: pg_createsubscriber.c:1342 +#: 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:1372 +#: pg_createsubscriber.c:1373 #, c-format msgid "dropping the replication slot \"%s\" in database \"%s\"" msgstr "データベース\"%2$s\"のレプリケーションスロット\"%1$s:を削除します" -#: pg_createsubscriber.c:1388 +#: 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:1409 +#: pg_createsubscriber.c:1410 #, c-format msgid "pg_ctl failed with exit code %d" msgstr "pg_ctlが終了コード%dで失敗しました" -#: pg_createsubscriber.c:1414 +#: pg_createsubscriber.c:1415 #, c-format msgid "pg_ctl was terminated by exception 0x%X" msgstr "pg_ctlが例外0x%Xによって終了させられました" -#: pg_createsubscriber.c:1416 +#: 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:1418 +#: pg_createsubscriber.c:1419 #, c-format msgid "pg_ctl was terminated by signal %d: %s" msgstr "pg_ctlがシグナル%dによって終了させられました %s" -#: pg_createsubscriber.c:1424 +#: pg_createsubscriber.c:1425 #, c-format msgid "pg_ctl exited with unrecognized status %d" msgstr "pg_ctlが認識できない状態%dで終了しました" -#: pg_createsubscriber.c:1427 +#: pg_createsubscriber.c:1428 #, c-format msgid "The failed command was: %s" msgstr "失敗したコマンドは以下のとおりです: %s" -#: pg_createsubscriber.c:1473 +#: pg_createsubscriber.c:1474 #, c-format msgid "server was started" msgstr "サーバー起動完了" -#: pg_createsubscriber.c:1488 +#: pg_createsubscriber.c:1489 #, c-format msgid "server was stopped" msgstr "サーバーは停止しました" -#: pg_createsubscriber.c:1507 +#: pg_createsubscriber.c:1508 #, c-format msgid "waiting for the target server to reach the consistent state" msgstr "対象サーバーが一貫性のある状態に到達するのを待っています" -#: pg_createsubscriber.c:1530 +#: pg_createsubscriber.c:1531 #, c-format msgid "recovery timed out" msgstr "リカバリーがタイムアウトしました" -#: pg_createsubscriber.c:1543 +#: pg_createsubscriber.c:1544 #, c-format msgid "server did not end recovery" msgstr "サーバーはリカバリを完了しませんでした" -#: pg_createsubscriber.c:1545 +#: pg_createsubscriber.c:1546 #, c-format msgid "target server reached the consistent state" msgstr "対象サーバーが一貫性のある状態に到達しました" -#: pg_createsubscriber.c:1546 +#: 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:1573 +#: pg_createsubscriber.c:1574 #, c-format msgid "could not obtain publication information: %s" msgstr "パブリケーション情報を取得できませんでした: %s" -#: pg_createsubscriber.c:1587 +#: pg_createsubscriber.c:1588 #, c-format msgid "publication \"%s\" already exists" msgstr "パブリケーション\"%s\"はすでに存在します" -#: pg_createsubscriber.c:1588 +#: pg_createsubscriber.c:1589 #, c-format msgid "Consider renaming this publication before continuing." msgstr "作業を継続する前にこのパブリケーションの名前を変更することを検討してください。" -#: pg_createsubscriber.c:1595 +#: pg_createsubscriber.c:1596 #, c-format msgid "creating publication \"%s\" in database \"%s\"" msgstr "データベース\"%2$s\"でパブリケーション\"%1$s\"を作成します" -#: pg_createsubscriber.c:1608 +#: 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:1637 +#: pg_createsubscriber.c:1638 #, c-format msgid "dropping publication \"%s\" in database \"%s\"" msgstr "データベース\"%2$s\"のパブリケーション\"%1$s\"を削除します" -#: pg_createsubscriber.c:1651 +#: 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:1697 +#: pg_createsubscriber.c:1698 #, c-format msgid "creating subscription \"%s\" in database \"%s\"" msgstr "データベース\"%2$s\"でサブスクリプション\"%1$s\"を作成します" -#: pg_createsubscriber.c:1718 +#: 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:1763 +#: pg_createsubscriber.c:1764 #, c-format msgid "could not obtain subscription OID: %s" msgstr "サブスクリプションOIDが取得できませんでした: %s" -#: pg_createsubscriber.c:1770 +#: 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:1794 +#: 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:1809 +#: pg_createsubscriber.c:1810 #, c-format msgid "could not set replication progress for subscription \"%s\": %s" msgstr "サブスクリプション\"%s\"にレプリケーション進捗を設定できませんでした: %s" -#: pg_createsubscriber.c:1840 +#: pg_createsubscriber.c:1841 #, c-format msgid "enabling subscription \"%s\" in database \"%s\"" msgstr "データベース\"%2$s\"のサブスクリプション\"%1$s\"を有効にします" -#: pg_createsubscriber.c:1852 +#: pg_createsubscriber.c:1853 #, c-format msgid "could not enable subscription \"%s\": %s" msgstr "サブスクリプション\"%s\"を有効化できませんでした: %s" -#: pg_createsubscriber.c:1944 +#: pg_createsubscriber.c:1945 #, c-format msgid "cannot be executed by \"root\"" msgstr "\"root\"では実行できません" -#: pg_createsubscriber.c:1945 +#: pg_createsubscriber.c:1946 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "PostgreSQLのスーパーユーザーで%sを実行しなければなりません" -#: pg_createsubscriber.c:1966 +#: pg_createsubscriber.c:1967 #, c-format msgid "database \"%s\" specified more than once" msgstr "データベース\"%s\"が複数回指定されました" -#: pg_createsubscriber.c:2007 +#: pg_createsubscriber.c:2008 #, c-format msgid "publication \"%s\" specified more than once" msgstr "パブリケーション\"%s\"が複数回指定されました" -#: pg_createsubscriber.c:2019 +#: pg_createsubscriber.c:2020 #, c-format msgid "replication slot \"%s\" specified more than once" msgstr "レプリケーションスロット\"%s\"が複数回指定されました" -#: pg_createsubscriber.c:2031 +#: pg_createsubscriber.c:2032 #, c-format msgid "subscription \"%s\" specified more than once" msgstr "サブスクリプション\"%s\"が複数回指定されました" -#: pg_createsubscriber.c:2054 +#: pg_createsubscriber.c:2055 #, c-format msgid "no subscriber data directory specified" msgstr "サブスクライバのデータディレクトリが指定されていません" -#: pg_createsubscriber.c:2065 +#: pg_createsubscriber.c:2066 #, c-format msgid "could not determine current directory" msgstr "カレントディレクトリを特定できませんでした" -#: pg_createsubscriber.c:2082 +#: pg_createsubscriber.c:2083 #, c-format msgid "no publisher connection string specified" msgstr "パブリッシャの接続文字列が指定されていません" -#: pg_createsubscriber.c:2086 +#: pg_createsubscriber.c:2087 #, c-format msgid "validating publisher connection string" msgstr "パブリッシャの接続文字列の検証中" -#: pg_createsubscriber.c:2092 +#: pg_createsubscriber.c:2093 #, c-format msgid "validating subscriber connection string" msgstr "サブスクライバの接続文字列の検証中" -#: pg_createsubscriber.c:2097 +#: pg_createsubscriber.c:2098 #, c-format msgid "no database was specified" msgstr "データベースが指定されていません" -#: pg_createsubscriber.c:2109 +#: pg_createsubscriber.c:2110 #, c-format msgid "database name \"%s\" was extracted from the publisher connection string" msgstr "データベース名\"%s\"がパブリッシャの接続文字列から抽出されました" -#: pg_createsubscriber.c:2114 +#: pg_createsubscriber.c:2115 #, c-format msgid "no database name specified" msgstr "データベース名が指定されていません" -#: pg_createsubscriber.c:2124 +#: pg_createsubscriber.c:2125 #, c-format msgid "wrong number of publication names specified" msgstr "指定されたパブリケーション名の数が間違っています" -#: pg_createsubscriber.c:2125 +#: 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:2131 +#: pg_createsubscriber.c:2132 #, c-format msgid "wrong number of subscription names specified" msgstr "指定されたサブスクリプション名の数が間違っています" -#: pg_createsubscriber.c:2132 +#: 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:2138 +#: pg_createsubscriber.c:2139 #, c-format msgid "wrong number of replication slot names specified" msgstr "指定されたレプリケーションスロット名の数が間違っています" -#: pg_createsubscriber.c:2139 +#: 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:2168 +#: pg_createsubscriber.c:2169 #, c-format msgid "subscriber data directory is not a copy of the source database cluster" msgstr "サブスクライバのデータディレクトリは元データベースクラスタのコピーではありません" -#: pg_createsubscriber.c:2181 +#: pg_createsubscriber.c:2182 #, c-format msgid "standby server is running" msgstr "スタンバイサーバーが稼働中です" -#: pg_createsubscriber.c:2182 +#: pg_createsubscriber.c:2183 #, c-format msgid "Stop the standby server and try again." msgstr "このスタンバイサーバーを停止してから再試行してください。" -#: pg_createsubscriber.c:2191 +#: pg_createsubscriber.c:2192 #, c-format msgid "starting the standby server with command-line options" msgstr "コマンドラインオプションを指定してスタンバイサーバーを起動しています" -#: pg_createsubscriber.c:2207 pg_createsubscriber.c:2242 +#: pg_createsubscriber.c:2208 pg_createsubscriber.c:2243 #, c-format msgid "stopping the subscriber" msgstr "サブスクライバを起動しています" -#: pg_createsubscriber.c:2221 +#: pg_createsubscriber.c:2222 #, c-format msgid "starting the subscriber" msgstr "サブスクライバを起動しています" -#: pg_createsubscriber.c:2250 +#: pg_createsubscriber.c:2251 #, c-format msgid "Done!" msgstr "完了!" @@ -2490,87 +2487,92 @@ msgstr "WALファイル\"%2$s\"に%1$dバイト書き込めませんでした: % msgid "could not send copy-end packet: %s" msgstr "コピー終端パケットを送信できませんでした: %s" -#: streamutil.c:162 +#: streamutil.c:165 msgid "Password: " msgstr "パスワード: " -#: streamutil.c:189 +#: streamutil.c:192 #, c-format msgid "could not connect to server" msgstr "サーバーに接続できませんでした" -#: streamutil.c:246 +#: streamutil.c:233 +#, c-format +msgid "could not clear \"search_path\": %s" +msgstr "\"search_path\"を消去できませんでした: %s" + +#: streamutil.c:249 #, c-format msgid "could not determine server setting for \"integer_datetimes\"" msgstr "\"integer_datetimes\"のサーバー設定を取得できませんでした" -#: streamutil.c:253 +#: streamutil.c:256 #, c-format msgid "\"integer_datetimes\" compile flag does not match server" msgstr "コンパイル時フラグ\"integer_datetimes\"がサーバーと異なっています" -#: streamutil.c:372 +#: 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:382 +#: streamutil.c:385 #, c-format msgid "WAL segment size could not be parsed" msgstr "WALセグメントサイズがパースできませんでした" -#: streamutil.c:400 +#: 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:404 +#: 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:446 +#: 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:455 +#: streamutil.c:458 #, c-format msgid "group access flag could not be parsed: %s" msgstr "グループアクセスフラグがパースできませんでした: %s" -#: streamutil.c:498 streamutil.c:535 +#: 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:587 +#: 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:599 +#: streamutil.c:602 #, c-format msgid "replication slot \"%s\" does not exist" msgstr "レプリケーションスロット\"%s\"は存在しません" -#: streamutil.c:610 +#: streamutil.c:613 #, c-format msgid "expected a physical replication slot, got type \"%s\" instead" msgstr "物理レプリケーションスロットが必要ですが、タイプは\"%s\"でした" -#: streamutil.c:624 +#: 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:741 +#: 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:785 +#: 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列" @@ -2602,3 +2604,9 @@ msgstr "圧縮時のunlinkはサポートされていません" #: 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/ru.po b/src/bin/pg_basebackup/po/ru.po index 94912f27c90b4..1e1bfa63d877a 100644 --- a/src/bin/pg_basebackup/po/ru.po +++ b/src/bin/pg_basebackup/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_basebackup (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-11-09 07:47+0300\n" +"POT-Creation-Date: 2025-08-02 11:37+0300\n" "PO-Revision-Date: 2024-09-07 11:12+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -261,14 +261,14 @@ msgstr "не удалось записать в файл \"%s\": %m" msgid "could not create file \"%s\": %m" msgstr "не удалось создать файл \"%s\": %m" -#: ../../fe_utils/string_utils.c:434 +#: ../../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:607 +#: ../../fe_utils/string_utils.c:760 #, c-format msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "" @@ -1245,9 +1245,9 @@ msgstr "" #: 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_basebackup.c:2803 pg_createsubscriber.c:2047 pg_createsubscriber.c:2057 +#: pg_createsubscriber.c:2065 pg_createsubscriber.c:2093 +#: pg_createsubscriber.c:2125 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 @@ -1257,7 +1257,7 @@ msgstr "" msgid "Try \"%s --help\" for more information." msgstr "Для дополнительной информации попробуйте \"%s --help\"." -#: pg_basebackup.c:2584 pg_createsubscriber.c:2045 pg_receivewal.c:758 +#: pg_basebackup.c:2584 pg_createsubscriber.c:2055 pg_receivewal.c:758 #: pg_recvlogical.c:863 #, c-format msgid "too many command-line arguments (first is \"%s\")" @@ -1383,7 +1383,7 @@ msgid "" msgstr "" "на главном сервере остался слот репликации \"%s\", созданный в базе \"%s\"" -#: pg_createsubscriber.c:206 pg_createsubscriber.c:1260 +#: pg_createsubscriber.c:206 pg_createsubscriber.c:1270 #, c-format msgid "Drop this replication slot soon to avoid retention of WAL files." msgstr "" @@ -1732,17 +1732,17 @@ msgstr "удалить подписку \"%s\" не получилось: %s" msgid "could not obtain pre-existing subscriptions: %s" msgstr "получить уже существующие подписки не удалось: %s" -#: pg_createsubscriber.c:1258 +#: pg_createsubscriber.c:1268 #, c-format msgid "could not drop replication slot \"%s\" on primary" msgstr "удалить слот репликации \"%s\" на главном сервере не получилось" -#: pg_createsubscriber.c:1292 +#: pg_createsubscriber.c:1302 #, c-format msgid "could not obtain failover replication slot information: %s" msgstr "получить информацию о переносимом слоте репликации не удалось: %s" -#: pg_createsubscriber.c:1294 pg_createsubscriber.c:1303 +#: pg_createsubscriber.c:1304 pg_createsubscriber.c:1313 #, c-format msgid "" "Drop the failover replication slots on subscriber soon to avoid retention of " @@ -1751,42 +1751,42 @@ msgstr "" "Удалите переносимые слоты репликации на подписчике незамедлительно во " "избежание накопления файлов WAL." -#: pg_createsubscriber.c:1302 +#: pg_createsubscriber.c:1312 #, c-format msgid "could not drop failover replication slot" msgstr "удалить переносимый слот репликации не получилось" -#: pg_createsubscriber.c:1324 +#: pg_createsubscriber.c:1334 #, c-format msgid "creating the replication slot \"%s\" in database \"%s\"" msgstr "создание слота репликации \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1342 +#: pg_createsubscriber.c:1352 #, c-format msgid "could not create replication slot \"%s\" in database \"%s\": %s" msgstr "создать слот репликации \"%s\" в базе \"%s\" не удалось: %s" -#: pg_createsubscriber.c:1372 +#: pg_createsubscriber.c:1382 #, c-format msgid "dropping the replication slot \"%s\" in database \"%s\"" msgstr "удаление слота репликации \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1388 +#: pg_createsubscriber.c:1398 #, c-format msgid "could not drop replication slot \"%s\" in database \"%s\": %s" msgstr "удалить слот репликации \"%s\" в базе \"%s\" не получилось: %s" -#: pg_createsubscriber.c:1409 +#: pg_createsubscriber.c:1419 #, c-format msgid "pg_ctl failed with exit code %d" msgstr "команда pg_ctl завершилась с кодом ошибки %d" -#: pg_createsubscriber.c:1414 +#: pg_createsubscriber.c:1424 #, c-format msgid "pg_ctl was terminated by exception 0x%X" msgstr "команда pg_ctl была прервана исключением 0x%X" -#: pg_createsubscriber.c:1416 +#: pg_createsubscriber.c:1426 #, c-format msgid "" "See C include file \"ntstatus.h\" for a description of the hexadecimal value." @@ -1794,52 +1794,52 @@ msgstr "" "Описание этого шестнадцатеричного значения ищите во включаемом C-файле " "\"ntstatus.h\"" -#: pg_createsubscriber.c:1418 +#: pg_createsubscriber.c:1428 #, c-format msgid "pg_ctl was terminated by signal %d: %s" msgstr "команда pg_ctl была завершена сигналом %d: %s" -#: pg_createsubscriber.c:1424 +#: pg_createsubscriber.c:1434 #, c-format msgid "pg_ctl exited with unrecognized status %d" msgstr "команда pg_ctl завершилась с нераспознанным кодом состояния %d" -#: pg_createsubscriber.c:1427 +#: pg_createsubscriber.c:1437 #, c-format msgid "The failed command was: %s" msgstr "Ошибку вызвала команда: %s" -#: pg_createsubscriber.c:1473 +#: pg_createsubscriber.c:1483 #, c-format msgid "server was started" msgstr "сервер был запущен" -#: pg_createsubscriber.c:1488 +#: pg_createsubscriber.c:1498 #, c-format msgid "server was stopped" msgstr "сервер был остановлен" -#: pg_createsubscriber.c:1507 +#: pg_createsubscriber.c:1517 #, c-format msgid "waiting for the target server to reach the consistent state" msgstr "ожидание достижения целевым сервером согласованного состояния" -#: pg_createsubscriber.c:1530 +#: pg_createsubscriber.c:1540 #, c-format msgid "recovery timed out" msgstr "тайм-аут при восстановлении" -#: pg_createsubscriber.c:1543 +#: pg_createsubscriber.c:1553 #, c-format msgid "server did not end recovery" msgstr "сервер не завершил восстановление" -#: pg_createsubscriber.c:1545 +#: pg_createsubscriber.c:1555 #, c-format msgid "target server reached the consistent state" msgstr "целевой сервер достиг согласованного состояния" -#: pg_createsubscriber.c:1546 +#: pg_createsubscriber.c:1556 #, c-format msgid "" "If pg_createsubscriber fails after this point, you must recreate the " @@ -1848,159 +1848,159 @@ msgstr "" "Если в работе pg_createsubscriber произойдёт сбой после этого момента, " "продолжение возможно только после пересоздания физической реплики." -#: pg_createsubscriber.c:1573 +#: pg_createsubscriber.c:1583 #, c-format msgid "could not obtain publication information: %s" msgstr "получить информацию о публикации не удалось: %s" -#: pg_createsubscriber.c:1587 +#: pg_createsubscriber.c:1597 #, c-format msgid "publication \"%s\" already exists" msgstr "публикация \"%s\" уже существует" -#: pg_createsubscriber.c:1588 +#: pg_createsubscriber.c:1598 #, c-format msgid "Consider renaming this publication before continuing." msgstr "Чтобы продолжить, её можно переименовать." -#: pg_createsubscriber.c:1595 +#: pg_createsubscriber.c:1605 #, c-format msgid "creating publication \"%s\" in database \"%s\"" msgstr "создаётся публикация \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1608 +#: pg_createsubscriber.c:1618 #, c-format msgid "could not create publication \"%s\" in database \"%s\": %s" msgstr "создать публикацию \"%s\" в базе \"%s\" не удалось: %s" -#: pg_createsubscriber.c:1637 +#: pg_createsubscriber.c:1647 #, c-format msgid "dropping publication \"%s\" in database \"%s\"" msgstr "удаляется публикация \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1651 +#: pg_createsubscriber.c:1661 #, c-format msgid "could not drop publication \"%s\" in database \"%s\": %s" msgstr "удалить публикацию \"%s\" в базе \"%s\" не получилось: %s" -#: pg_createsubscriber.c:1697 +#: pg_createsubscriber.c:1707 #, c-format msgid "creating subscription \"%s\" in database \"%s\"" msgstr "создаётся подписка \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1718 +#: pg_createsubscriber.c:1728 #, c-format msgid "could not create subscription \"%s\" in database \"%s\": %s" msgstr "создать подписку \"%s\" в базе \"%s\" не удалось: %s" -#: pg_createsubscriber.c:1763 +#: pg_createsubscriber.c:1773 #, c-format msgid "could not obtain subscription OID: %s" msgstr "получить OID подписки не удалось: %s" -#: pg_createsubscriber.c:1770 +#: pg_createsubscriber.c:1780 #, c-format msgid "could not obtain subscription OID: got %d rows, expected %d row" msgstr "получить OID подписки не удалось; получено строк: %d, ожидалось: %d" -#: pg_createsubscriber.c:1794 +#: pg_createsubscriber.c:1804 #, c-format msgid "" "setting the replication progress (node name \"%s\", LSN %s) in database " "\"%s\"" msgstr "отражение состояния репликации (имя узла \"%s\", LSN %s) в базе \"%s\"" -#: pg_createsubscriber.c:1809 +#: pg_createsubscriber.c:1819 #, c-format msgid "could not set replication progress for subscription \"%s\": %s" msgstr "не удалось передать состояние репликации для подписки \"%s\": %s" -#: pg_createsubscriber.c:1840 +#: pg_createsubscriber.c:1850 #, c-format msgid "enabling subscription \"%s\" in database \"%s\"" msgstr "включение подписки \"%s\" в базе \"%s\"" -#: pg_createsubscriber.c:1852 +#: pg_createsubscriber.c:1862 #, c-format msgid "could not enable subscription \"%s\": %s" msgstr "включить подписку \"%s\" не удалось: %s" -#: pg_createsubscriber.c:1944 +#: pg_createsubscriber.c:1954 #, c-format msgid "cannot be executed by \"root\"" msgstr "программу не должен запускать root" -#: pg_createsubscriber.c:1945 +#: pg_createsubscriber.c:1955 #, c-format msgid "You must run %s as the PostgreSQL superuser." msgstr "Запускать %s нужно от имени суперпользователя PostgreSQL." -#: pg_createsubscriber.c:1966 +#: pg_createsubscriber.c:1976 #, c-format msgid "database \"%s\" specified more than once" msgstr "база \"%s\" указана неоднократно" -#: pg_createsubscriber.c:2007 +#: pg_createsubscriber.c:2017 #, c-format msgid "publication \"%s\" specified more than once" msgstr "публикация \"%s\" указана неоднократно" -#: pg_createsubscriber.c:2019 +#: pg_createsubscriber.c:2029 #, c-format msgid "replication slot \"%s\" specified more than once" msgstr "слот репликации \"%s\" указан неоднократно" -#: pg_createsubscriber.c:2031 +#: pg_createsubscriber.c:2041 #, c-format msgid "subscription \"%s\" specified more than once" msgstr "подписка \"%s\" указана неоднократно" -#: pg_createsubscriber.c:2054 +#: pg_createsubscriber.c:2064 #, c-format msgid "no subscriber data directory specified" msgstr "каталог данных подписчика не указан" -#: pg_createsubscriber.c:2065 +#: pg_createsubscriber.c:2075 #, c-format msgid "could not determine current directory" msgstr "не удалось определить текущий каталог" -#: pg_createsubscriber.c:2082 +#: pg_createsubscriber.c:2092 #, c-format msgid "no publisher connection string specified" msgstr "строка подключения к серверу публикации не указана" -#: pg_createsubscriber.c:2086 +#: pg_createsubscriber.c:2096 #, c-format msgid "validating publisher connection string" msgstr "проверяется строка подключения к серверу публикации" -#: pg_createsubscriber.c:2092 +#: pg_createsubscriber.c:2102 #, c-format msgid "validating subscriber connection string" msgstr "проверяется строка подключения к подписчику" -#: pg_createsubscriber.c:2097 +#: pg_createsubscriber.c:2107 #, c-format msgid "no database was specified" msgstr "база данных не указана" -#: pg_createsubscriber.c:2109 +#: pg_createsubscriber.c:2119 #, c-format msgid "database name \"%s\" was extracted from the publisher connection string" msgstr "имя базы \"%s\" извлечено из строки подключения к серверу публикации" -#: pg_createsubscriber.c:2114 +#: pg_createsubscriber.c:2124 #, c-format msgid "no database name specified" msgstr "имя базы данных не указано" -#: pg_createsubscriber.c:2124 +#: pg_createsubscriber.c:2134 #, c-format msgid "wrong number of publication names specified" msgstr "указано неверное количество имён публикаций" -#: pg_createsubscriber.c:2125 +#: pg_createsubscriber.c:2135 #, c-format msgid "" "The number of specified publication names (%d) must match the number of " @@ -2009,12 +2009,12 @@ msgstr "" "Количество указанных имён публикаций (%d) должно совпадать с количеством " "указанных имён баз (%d)." -#: pg_createsubscriber.c:2131 +#: pg_createsubscriber.c:2141 #, c-format msgid "wrong number of subscription names specified" msgstr "указано неверное количество имён подписок" -#: pg_createsubscriber.c:2132 +#: pg_createsubscriber.c:2142 #, c-format msgid "" "The number of specified subscription names (%d) must match the number of " @@ -2023,12 +2023,12 @@ msgstr "" "Количество указанных имён подписок (%d) должно совпадать с количеством " "указанных имён баз (%d)." -#: pg_createsubscriber.c:2138 +#: pg_createsubscriber.c:2148 #, c-format msgid "wrong number of replication slot names specified" msgstr "указано неверное количество имён слотов репликации" -#: pg_createsubscriber.c:2139 +#: pg_createsubscriber.c:2149 #, c-format msgid "" "The number of specified replication slot names (%d) must match the number of " @@ -2037,38 +2037,38 @@ msgstr "" "Количество указанных имён слотов репликации (%d) должно совпадать с " "количеством указанных имён баз (%d)." -#: pg_createsubscriber.c:2168 +#: pg_createsubscriber.c:2178 #, c-format msgid "subscriber data directory is not a copy of the source database cluster" msgstr "" "каталог данных подписчика не является копией исходного кластера баз данных" -#: pg_createsubscriber.c:2181 +#: pg_createsubscriber.c:2191 #, c-format msgid "standby server is running" msgstr "резервный сервер запущен" -#: pg_createsubscriber.c:2182 +#: pg_createsubscriber.c:2192 #, c-format msgid "Stop the standby server and try again." msgstr "Остановите резервный сервер и повторите попытку." -#: pg_createsubscriber.c:2191 +#: pg_createsubscriber.c:2201 #, c-format msgid "starting the standby server with command-line options" msgstr "резервный сервер запускается с параметрами командной строки" -#: pg_createsubscriber.c:2207 pg_createsubscriber.c:2242 +#: pg_createsubscriber.c:2217 pg_createsubscriber.c:2252 #, c-format msgid "stopping the subscriber" msgstr "подписчик останавливается" -#: pg_createsubscriber.c:2221 +#: pg_createsubscriber.c:2231 #, c-format msgid "starting the subscriber" msgstr "подписчик запускается" -#: pg_createsubscriber.c:2250 +#: pg_createsubscriber.c:2260 #, c-format msgid "Done!" msgstr "Готово!" diff --git a/src/bin/pg_basebackup/receivelog.c b/src/bin/pg_basebackup/receivelog.c index 8543f3576a85d..62d7b91bbab26 100644 --- a/src/bin/pg_basebackup/receivelog.c +++ b/src/bin/pg_basebackup/receivelog.c @@ -25,6 +25,13 @@ #include "receivelog.h" #include "streamutil.h" +#ifdef PERCONA_EXT +#include "access/pg_tde_fe_init.h" +#include "access/pg_tde_xlog_smgr.h" +#include "access/xlog_smgr.h" +#include "catalog/tde_global_space.h" +#endif + /* currently open WAL file */ static Walfile *walfile = NULL; static bool reportFlushPosition = false; @@ -1044,6 +1051,7 @@ ProcessXLogDataMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len, int bytes_left; int bytes_written; int hdr_len; + XLogSegNo segno; /* * Once we've decided we don't want to receive any more, just ignore any @@ -1071,6 +1079,8 @@ ProcessXLogDataMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len, /* Extract WAL location for this block */ xlogoff = XLogSegmentOffset(*blockpos, WalSegSz); + XLByteToSeg(*blockpos, segno, WalSegSz); + /* * Verify that the initial location in the stream matches where we think * we are. @@ -1121,6 +1131,19 @@ ProcessXLogDataMsg(PGconn *conn, StreamCtl *stream, char *copybuf, int len, } } +#ifdef PERCONA_EXT + if (stream->encrypt) + { + void* enc_buf = copybuf + hdr_len + bytes_written; + WalLocation loc = {.tli = stream->timeline}; + + XLogSegNoOffsetToRecPtr(segno, xlogoff, WalSegSz, loc.lsn); + tde_ensure_xlog_key_location(loc); + TDEXLogCryptBuffer(enc_buf, enc_buf, bytes_to_write, + xlogoff, stream->timeline, segno, WalSegSz); + } +#endif + if (stream->walmethod->ops->write(walfile, copybuf + hdr_len + bytes_written, bytes_to_write) != bytes_to_write) diff --git a/src/bin/pg_basebackup/receivelog.h b/src/bin/pg_basebackup/receivelog.h index 0a18f897964f6..fa4469f772990 100644 --- a/src/bin/pg_basebackup/receivelog.h +++ b/src/bin/pg_basebackup/receivelog.h @@ -37,6 +37,7 @@ typedef struct StreamCtl bool mark_done; /* Mark segment as done in generated archive */ bool do_sync; /* Flush to disk to ensure consistent state of * data */ + bool encrypt; /* Encrypt WAL */ stream_stop_callback stream_stop; /* Stop streaming when returns true */ diff --git a/src/bin/pg_basebackup/t/010_pg_basebackup.pl b/src/bin/pg_basebackup/t/010_pg_basebackup.pl index 403acb6eb4115..7a6bfe9a8255e 100644 --- a/src/bin/pg_basebackup/t/010_pg_basebackup.pl +++ b/src/bin/pg_basebackup/t/010_pg_basebackup.pl @@ -10,6 +10,12 @@ use PostgreSQL::Test::Utils; use Test::More; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_wal + 'pg_basebackup without -E from server with encrypted WAL produces broken backups'; + +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_smgr + 'uses corrupt_page_checksum to directly hack relation files'; + program_help_ok('pg_basebackup'); program_version_ok('pg_basebackup'); program_options_handling_ok('pg_basebackup'); diff --git a/src/bin/pg_checksums/pg_checksums.c b/src/bin/pg_checksums/pg_checksums.c index e1b85132eef49..66919c4afa23c 100644 --- a/src/bin/pg_checksums/pg_checksums.c +++ b/src/bin/pg_checksums/pg_checksums.c @@ -138,10 +138,9 @@ pg_tde_init(const char *datadir) static bool is_pg_tde_encypted(Oid spcOid, Oid dbOid, RelFileNumber relNumber) { - RelFileLocator locator = {.spcOid = spcOid, dbOid = dbOid,.relNumber = relNumber}; - RelFileLocatorBackend rlocator = {.locator = locator,.backend = INVALID_PROC_NUMBER}; + RelFileLocator locator = {.spcOid = spcOid,.dbOid = dbOid,.relNumber = relNumber}; - return GetSMGRRelationKey(rlocator) != NULL; + return pg_tde_has_smgr_key(locator); } #endif diff --git a/src/bin/pg_checksums/t/002_actions.pl b/src/bin/pg_checksums/t/002_actions.pl index 33e7fb53c5e16..a4d2c98167cc2 100644 --- a/src/bin/pg_checksums/t/002_actions.pl +++ b/src/bin/pg_checksums/t/002_actions.pl @@ -12,6 +12,8 @@ use Test::More; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_smgr + 'uses corrupt_page_checksum to directly hack relation files'; # Utility routine to create and check a table with corrupted checksums # on a wanted tablespace. Note that this stops and starts the node diff --git a/src/bin/pg_combinebackup/pg_combinebackup.c b/src/bin/pg_combinebackup/pg_combinebackup.c index a29ed23f3e449..98a422c580088 100644 --- a/src/bin/pg_combinebackup/pg_combinebackup.c +++ b/src/bin/pg_combinebackup/pg_combinebackup.c @@ -804,7 +804,7 @@ parse_oid(char *s, Oid *result) * Copy files from the input directory to the output directory, reconstructing * full files from incremental files as required. * - * If processing is a user-defined tablespace, the tsoid should be the OID + * 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 @@ -816,7 +816,7 @@ parse_oid(char *s, Oid *result) * * 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 - * output_directory, just the older ones. prior_backup_dirs is an array of + * input_directory, just the older ones. prior_backup_dirs is an array of * the locations of those previous backups. */ static void diff --git a/src/bin/pg_combinebackup/po/ru.po b/src/bin/pg_combinebackup/po/ru.po index 5c2af7387c385..f6b1c900f0876 100644 --- a/src/bin/pg_combinebackup/po/ru.po +++ b/src/bin/pg_combinebackup/po/ru.po @@ -3,7 +3,7 @@ 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" +"POT-Creation-Date: 2025-08-02 11:37+0300\n" "PO-Revision-Date: 2024-11-09 08:04+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -165,91 +165,91 @@ msgstr "не удалось прочитать каталог \"%s\": %m" msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "не удалось переименовать файл \"%s\" в \"%s\": %m" -#: ../../common/jsonapi.c:2121 +#: ../../common/jsonapi.c:2124 msgid "Recursive descent parser cannot use incremental lexer." msgstr "" "Инкрементальный лексический анализатор не подходит для нисходящего " "рекурсивного разбора." -#: ../../common/jsonapi.c:2123 +#: ../../common/jsonapi.c:2126 msgid "Incremental parser requires incremental lexer." msgstr "" "Для инкрементального разбора требуется инкрементальный лексический " "анализатор." -#: ../../common/jsonapi.c:2125 +#: ../../common/jsonapi.c:2128 msgid "JSON nested too deep, maximum permitted depth is 6400." msgstr "" "Слишком большая вложенность JSON, максимальная допустимая глубина: 6400." -#: ../../common/jsonapi.c:2127 +#: ../../common/jsonapi.c:2130 #, c-format msgid "Escape sequence \"\\%.*s\" is invalid." msgstr "Неверная спецпоследовательность: \"\\%.*s\"." -#: ../../common/jsonapi.c:2131 +#: ../../common/jsonapi.c:2134 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Символ с кодом 0x%02x необходимо экранировать." -#: ../../common/jsonapi.c:2135 +#: ../../common/jsonapi.c:2138 #, c-format msgid "Expected end of input, but found \"%.*s\"." msgstr "Ожидался конец текста, но обнаружено продолжение \"%.*s\"." -#: ../../common/jsonapi.c:2138 +#: ../../common/jsonapi.c:2141 #, c-format msgid "Expected array element or \"]\", but found \"%.*s\"." msgstr "Ожидался элемент массива или \"]\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2141 +#: ../../common/jsonapi.c:2144 #, c-format msgid "Expected \",\" or \"]\", but found \"%.*s\"." msgstr "Ожидалась \",\" или \"]\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2144 +#: ../../common/jsonapi.c:2147 #, c-format msgid "Expected \":\", but found \"%.*s\"." msgstr "Ожидалось \":\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2147 +#: ../../common/jsonapi.c:2150 #, c-format msgid "Expected JSON value, but found \"%.*s\"." msgstr "Ожидалось значение JSON, но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2150 +#: ../../common/jsonapi.c:2153 msgid "The input string ended unexpectedly." msgstr "Неожиданный конец входной строки." -#: ../../common/jsonapi.c:2152 +#: ../../common/jsonapi.c:2155 #, c-format msgid "Expected string or \"}\", but found \"%.*s\"." msgstr "Ожидалась строка или \"}\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2155 +#: ../../common/jsonapi.c:2158 #, c-format msgid "Expected \",\" or \"}\", but found \"%.*s\"." msgstr "Ожидалась \",\" или \"}\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2158 +#: ../../common/jsonapi.c:2161 #, c-format msgid "Expected string, but found \"%.*s\"." msgstr "Ожидалась строка, но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2161 +#: ../../common/jsonapi.c:2164 #, c-format msgid "Token \"%.*s\" is invalid." msgstr "Ошибочный элемент \"%.*s\"." -#: ../../common/jsonapi.c:2164 +#: ../../common/jsonapi.c:2167 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 нельзя преобразовать в текст." -#: ../../common/jsonapi.c:2166 +#: ../../common/jsonapi.c:2169 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "За \"\\u\" должны следовать четыре шестнадцатеричные цифры." -#: ../../common/jsonapi.c:2169 +#: ../../common/jsonapi.c:2172 msgid "" "Unicode escape values cannot be used for code point values above 007F when " "the encoding is not UTF8." @@ -257,18 +257,18 @@ msgstr "" "Спецкоды Unicode для значений выше 007F можно использовать только с " "кодировкой UTF8." -#: ../../common/jsonapi.c:2178 +#: ../../common/jsonapi.c:2181 #, c-format msgid "" "Unicode escape value could not be translated to the server's encoding %s." msgstr "Спецкод Unicode нельзя преобразовать в серверную кодировку %s." -#: ../../common/jsonapi.c:2185 +#: ../../common/jsonapi.c:2188 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "" "Старшее слово суррогата Unicode не может следовать за другим старшим словом." -#: ../../common/jsonapi.c:2187 +#: ../../common/jsonapi.c:2190 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Младшее слово суррогата Unicode должно следовать за старшим словом." diff --git a/src/bin/pg_combinebackup/po/uk.po b/src/bin/pg_combinebackup/po/uk.po index 51e19b6220614..26fa809ce2867 100644 --- a/src/bin/pg_combinebackup/po/uk.po +++ b/src/bin/pg_combinebackup/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: 2024-08-31 06:22+0000\n" -"PO-Revision-Date: 2024-09-23 19:38\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" @@ -43,7 +43,7 @@ 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:527 +#: load_manifest.c:199 pg_combinebackup.c:1400 reconstruct.c:540 #, c-format msgid "could not read file \"%s\": %m" msgstr "не вдалося прочитати файл \"%s\": %m" @@ -55,7 +55,7 @@ msgstr "не вдалося прочитати файл \"%s\": прочитан #: ../../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:356 reconstruct.c:727 +#: pg_combinebackup.c:1175 reconstruct.c:369 reconstruct.c:740 #: write_manifest.c:187 #, c-format msgid "could not close file \"%s\": %m" @@ -79,13 +79,13 @@ msgstr "можлива помилка у послідовності байтів #: ../../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:510 reconstruct.c:625 +#: 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:746 +#: ../../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" @@ -98,7 +98,7 @@ 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 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:852 #, c-format msgid "out of memory" msgstr "недостатньо пам'яті" @@ -134,8 +134,8 @@ msgstr "не вдалося синхронізувати файлову сист #: ../../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:199 -#: reconstruct.c:408 +#: 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" @@ -258,159 +258,159 @@ msgstr "Старший сурогат Unicode не повинен прямува msgid "Unicode low surrogate must follow a high surrogate." msgstr "Молодший сурогат Unicode не повинен прямувати за іншим молодшим сурогатом." -#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:855 +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:854 #, c-format msgid "could not initialize checksum of manifest" msgstr "не вдалося ініціалізувати контрольну суму маніфесту" -#: ../../common/parse_manifest.c:204 ../../common/parse_manifest.c:261 +#: ../../common/parse_manifest.c:203 ../../common/parse_manifest.c:260 msgid "manifest ended unexpectedly" msgstr "маніфест закінчився несподівано" -#: ../../common/parse_manifest.c:210 ../../common/parse_manifest.c:862 +#: ../../common/parse_manifest.c:209 ../../common/parse_manifest.c:861 #, c-format msgid "could not update checksum of manifest" msgstr "не вдалося оновити контрольну суму маніфесту" -#: ../../common/parse_manifest.c:302 +#: ../../common/parse_manifest.c:301 msgid "unexpected object start" msgstr "неочікуваний початок об'єкта" -#: ../../common/parse_manifest.c:337 +#: ../../common/parse_manifest.c:336 msgid "unexpected object end" msgstr "неочікуваний кінець об'єкта" -#: ../../common/parse_manifest.c:366 +#: ../../common/parse_manifest.c:365 msgid "unexpected array start" msgstr "неочікуваний початок масиву" -#: ../../common/parse_manifest.c:391 +#: ../../common/parse_manifest.c:390 msgid "unexpected array end" msgstr "неочікуваний кінець масиву" -#: ../../common/parse_manifest.c:418 +#: ../../common/parse_manifest.c:417 msgid "expected version indicator" msgstr "індикатор очікуваної версії" -#: ../../common/parse_manifest.c:454 +#: ../../common/parse_manifest.c:453 msgid "unrecognized top-level field" msgstr "нерозпізнане поле верхнього рівня" -#: ../../common/parse_manifest.c:473 +#: ../../common/parse_manifest.c:472 msgid "unexpected file field" msgstr "неочікуване поле файлу" -#: ../../common/parse_manifest.c:487 +#: ../../common/parse_manifest.c:486 msgid "unexpected WAL range field" msgstr "неочікуване поле діапазону WAL" -#: ../../common/parse_manifest.c:493 +#: ../../common/parse_manifest.c:492 msgid "unexpected object field" msgstr "неочікуване поле об'єкта" -#: ../../common/parse_manifest.c:583 +#: ../../common/parse_manifest.c:582 msgid "unexpected scalar" msgstr "неочікуваний скаляр" -#: ../../common/parse_manifest.c:609 +#: ../../common/parse_manifest.c:608 msgid "manifest version not an integer" msgstr "версія маніфесту не ціле число" -#: ../../common/parse_manifest.c:613 +#: ../../common/parse_manifest.c:612 msgid "unexpected manifest version" msgstr "неочікувана версія маніфесту" -#: ../../common/parse_manifest.c:637 +#: ../../common/parse_manifest.c:636 msgid "system identifier in manifest not an integer" msgstr "системний ідентифікатор в маніфесті не ціле число" -#: ../../common/parse_manifest.c:662 +#: ../../common/parse_manifest.c:661 msgid "missing path name" msgstr "пропущено шлях" -#: ../../common/parse_manifest.c:665 +#: ../../common/parse_manifest.c:664 msgid "both path name and encoded path name" msgstr "і ім'я шляху, і закодований шлях" -#: ../../common/parse_manifest.c:667 +#: ../../common/parse_manifest.c:666 msgid "missing size" msgstr "відсутній розмір" -#: ../../common/parse_manifest.c:670 +#: ../../common/parse_manifest.c:669 msgid "checksum without algorithm" msgstr "контрольна сума без алгоритму" -#: ../../common/parse_manifest.c:684 +#: ../../common/parse_manifest.c:683 msgid "could not decode file name" msgstr "не вдалося декодувати ім'я файлу" -#: ../../common/parse_manifest.c:694 +#: ../../common/parse_manifest.c:693 msgid "file size is not an integer" msgstr "розмір файлу не є цілим числом" -#: ../../common/parse_manifest.c:700 pg_combinebackup.c:199 +#: ../../common/parse_manifest.c:699 pg_combinebackup.c:199 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "нерозпізнаний алгоритм контрольної суми: \"%s\"" -#: ../../common/parse_manifest.c:719 +#: ../../common/parse_manifest.c:718 #, c-format msgid "invalid checksum for file \"%s\": \"%s\"" msgstr "неприпустима контрольна сума для файлу \"%s\": \"%s\"" -#: ../../common/parse_manifest.c:762 +#: ../../common/parse_manifest.c:761 msgid "missing timeline" msgstr "відсутня часова шкала" -#: ../../common/parse_manifest.c:764 +#: ../../common/parse_manifest.c:763 msgid "missing start LSN" msgstr "відсутній LSN початку" -#: ../../common/parse_manifest.c:766 +#: ../../common/parse_manifest.c:765 msgid "missing end LSN" msgstr "відсутній LSN кінця" -#: ../../common/parse_manifest.c:772 +#: ../../common/parse_manifest.c:771 msgid "timeline is not an integer" msgstr "часова лінія не є цілим числом" -#: ../../common/parse_manifest.c:775 +#: ../../common/parse_manifest.c:774 msgid "could not parse start LSN" msgstr "не вдалося проаналізувати початковий LSN" -#: ../../common/parse_manifest.c:778 +#: ../../common/parse_manifest.c:777 msgid "could not parse end LSN" msgstr "не вдалося проаналізувати кінцевий LSN" -#: ../../common/parse_manifest.c:843 +#: ../../common/parse_manifest.c:842 msgid "expected at least 2 lines" msgstr "очікувалося принаймні 2 рядки" -#: ../../common/parse_manifest.c:846 +#: ../../common/parse_manifest.c:845 msgid "last line not newline-terminated" msgstr "останній рядок не завершений новим рядком" -#: ../../common/parse_manifest.c:865 +#: ../../common/parse_manifest.c:864 #, c-format msgid "could not finalize checksum of manifest" msgstr "не вдалося остаточно завершити контрольну суму маніфесту" -#: ../../common/parse_manifest.c:869 +#: ../../common/parse_manifest.c:868 #, c-format msgid "manifest has no checksum" msgstr "у маніфесті немає контрольної суми" -#: ../../common/parse_manifest.c:873 +#: ../../common/parse_manifest.c:872 #, c-format msgid "invalid manifest checksum: \"%s\"" msgstr "неприпустима контрольна сума маніфесту: \"%s\"" -#: ../../common/parse_manifest.c:877 +#: ../../common/parse_manifest.c:876 #, c-format msgid "manifest checksum mismatch" msgstr "невідповідність контрольної суми маніфесту" -#: ../../common/parse_manifest.c:892 +#: ../../common/parse_manifest.c:891 #, c-format msgid "could not parse backup manifest: %s" msgstr "не вдалося проаналізувати маніфест резервної копії: %s" @@ -460,13 +460,13 @@ msgstr "%s: не вдалося знайти %s" msgid "%s: %s requires %s" msgstr "%s: %s вимагає %s" -#: backup_label.c:162 reconstruct.c:748 write_manifest.c:262 +#: 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:708 -#: reconstruct.c:754 write_manifest.c:270 +#: 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\"" @@ -481,7 +481,7 @@ msgstr "неможливо записати до файлу \"%s\": %m" msgid "could not write to file \"%s\", offset %u: wrote %d of %d" msgstr "не вдалося записати до файлу \"%s\", зсув %u: записано %d з %d" -#: copy_file.c:199 reconstruct.c:771 +#: copy_file.c:199 reconstruct.c:784 #, c-format msgid "could not read from file \"%s\": %m" msgstr "не вдалося прочитати з файлу \"%s\": %m" @@ -506,12 +506,12 @@ msgstr "помилка при клонуванні файлу \"%s\" в \"%s\": msgid "file cloning not supported on this platform" msgstr "клонування файлів не підтримується на цій платформі" -#: copy_file.c:278 reconstruct.c:691 +#: 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:711 +#: 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 не підтримується на цій платформі" @@ -536,12 +536,12 @@ msgstr "не вдалося прочитати файл \"%s\": прочитан msgid "could not read file \"%s\": read %lld of %lld" msgstr "не вдалося прочитати файл \"%s\": прочитано %lld з %lld" -#: load_manifest.c:249 +#: load_manifest.c:248 #, c-format msgid "backup manifest version 1 does not support incremental backup" msgstr "маніфест резервного копіювання версії 1 не підтримує інкреметного резервного копіювання" -#: load_manifest.c:281 +#: load_manifest.c:280 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" msgstr "дубльований шлях у маніфесті резервного копіювання: \"%s\"" @@ -789,7 +789,7 @@ msgstr "пропускання символічного посилання \"%s\ msgid "skipping special file \"%s\"" msgstr "спеціальний файл \"%s\" пропускається" -#: pg_combinebackup.c:1073 reconstruct.c:300 +#: pg_combinebackup.c:1073 reconstruct.c:305 #, c-format msgid "manifest file \"%s\" contains no entry for file \"%s\"" msgstr "файл маніфеста \"%s\" не містить запису для файлу \"%s\"" @@ -844,32 +844,37 @@ msgstr "файл \"%s\" занадто великий" msgid "could not read file \"%s\": read %zd of %lld" msgstr "не вдалося прочитати файл \"%s\": прочитано %zd з %lld" -#: reconstruct.c:410 +#: 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:452 +#: 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:458 +#: reconstruct.c:471 #, c-format msgid "file \"%s\" has block count %u in excess of segment size %u" msgstr "файл \"%s\" має кількість блоків %u, що перевищує розмір сегмента %u" -#: reconstruct.c:465 +#: 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:529 +#: reconstruct.c:542 #, c-format msgid "could not read file \"%s\": read %d of %u" msgstr "не вдалося прочитати файл \"%s\": прочитано %d з %u" -#: reconstruct.c:773 +#: 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/t/002_compare_backups.pl b/src/bin/pg_combinebackup/t/002_compare_backups.pl index cfdd25471cb5f..cfb5ce83a9221 100644 --- a/src/bin/pg_combinebackup/t/002_compare_backups.pl +++ b/src/bin/pg_combinebackup/t/002_compare_backups.pl @@ -171,6 +171,7 @@ [ 'pg_dumpall', '-f', $dump1, '--no-sync', + '--restrict-key=test', '--no-unlogged-table-data', '-d', $pitr1->connstr('postgres'), ], @@ -179,6 +180,7 @@ [ 'pg_dumpall', '-f', $dump2, '--no-sync', + '--restrict-key=test', '--no-unlogged-table-data', '-d', $pitr2->connstr('postgres'), ], diff --git a/src/bin/pg_combinebackup/t/003_timeline.pl b/src/bin/pg_combinebackup/t/003_timeline.pl index b9c67341ad83a..0ee1646042f0e 100644 --- a/src/bin/pg_combinebackup/t/003_timeline.pl +++ b/src/bin/pg_combinebackup/t/003_timeline.pl @@ -10,6 +10,9 @@ use PostgreSQL::Test::Utils; use Test::More; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_wal + 'pg_basebackup without -E from server with encrypted WAL produces broken backups'; + # Can be changed to test the other modes. my $mode = $ENV{PG_TEST_PG_COMBINEBACKUP_MODE} || '--copy'; diff --git a/src/bin/pg_combinebackup/t/006_db_file_copy.pl b/src/bin/pg_combinebackup/t/006_db_file_copy.pl index 60bdc8d00f79a..9bc0ac4b66f3c 100644 --- a/src/bin/pg_combinebackup/t/006_db_file_copy.pl +++ b/src/bin/pg_combinebackup/t/006_db_file_copy.pl @@ -7,6 +7,9 @@ use PostgreSQL::Test::Utils; use Test::More; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_wal + 'pg_basebackup without -E from server with encrypted WAL produces broken backups'; + # Can be changed to test the other modes. my $mode = $ENV{PG_TEST_PG_COMBINEBACKUP_MODE} || '--copy'; diff --git a/src/bin/pg_combinebackup/t/008_promote.pl b/src/bin/pg_combinebackup/t/008_promote.pl index 1154a5d8b2241..3acbad22b4a23 100644 --- a/src/bin/pg_combinebackup/t/008_promote.pl +++ b/src/bin/pg_combinebackup/t/008_promote.pl @@ -10,6 +10,9 @@ use PostgreSQL::Test::Utils; use Test::More; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_wal + 'pg_basebackup without -E from server with encrypted WAL produces broken backups'; + # Can be changed to test the other modes. my $mode = $ENV{PG_TEST_PG_COMBINEBACKUP_MODE} || '--copy'; diff --git a/src/bin/pg_dump/common.c b/src/bin/pg_dump/common.c index 64e7dc89f1338..74bbea79663db 100644 --- a/src/bin/pg_dump/common.c +++ b/src/bin/pg_dump/common.c @@ -17,6 +17,7 @@ #include +#include "catalog/pg_am_d.h" #include "catalog/pg_class_d.h" #include "catalog/pg_collation_d.h" #include "catalog/pg_extension_d.h" @@ -933,6 +934,24 @@ findOprByOid(Oid oid) return (OprInfo *) dobj; } +/* + * findAccessMethodByOid + * finds the DumpableObject for the access method with the given oid + * returns NULL if not found + */ +AccessMethodInfo * +findAccessMethodByOid(Oid oid) +{ + CatalogId catId; + DumpableObject *dobj; + + catId.tableoid = AccessMethodRelationId; + catId.oid = oid; + dobj = findObjectByCatalogId(catId); + Assert(dobj == NULL || dobj->objType == DO_ACCESS_METHOD); + return (AccessMethodInfo *) dobj; +} + /* * findCollationByOid * finds the DumpableObject for the collation with the given oid diff --git a/src/bin/pg_dump/dumputils.c b/src/bin/pg_dump/dumputils.c index 5649859aa1e2d..47522d05429bd 100644 --- a/src/bin/pg_dump/dumputils.c +++ b/src/bin/pg_dump/dumputils.c @@ -19,6 +19,7 @@ #include "dumputils.h" #include "fe_utils/string_utils.h" +static const char restrict_chars[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; static bool parseAclItem(const char *item, const char *type, const char *name, const char *subname, int remoteVersion, @@ -29,6 +30,43 @@ static void AddAcl(PQExpBuffer aclbuf, const char *keyword, const char *subname); +/* + * Sanitize a string to be included in an SQL comment or TOC listing, by + * replacing any newlines with spaces. This ensures each logical output line + * is in fact one physical output line, to prevent corruption of the dump + * (which could, in the worst case, present an SQL injection vulnerability + * if someone were to incautiously load a dump containing objects with + * maliciously crafted names). + * + * The result is a freshly malloc'd string. If the input string is NULL, + * return a malloc'ed empty string, unless want_hyphen, in which case return a + * malloc'ed hyphen. + * + * Note that we currently don't bother to quote names, meaning that the name + * fields aren't automatically parseable. "pg_restore -L" doesn't care because + * it only examines the dumpId field, but someday we might want to try harder. + */ +char * +sanitize_line(const char *str, bool want_hyphen) +{ + char *result; + char *s; + + if (!str) + return pg_strdup(want_hyphen ? "-" : ""); + + result = pg_strdup(str); + + for (s = result; *s != '\0'; s++) + { + if (*s == '\n' || *s == '\r') + *s = ' '; + } + + return result; +} + + /* * Build GRANT/REVOKE command(s) for an object. * @@ -883,3 +921,40 @@ makeAlterConfigCommand(PGconn *conn, const char *configitem, pg_free(mine); } + +/* + * Generates a valid restrict key (i.e., an alphanumeric string) for use with + * psql's \restrict and \unrestrict meta-commands. For safety, the value is + * chosen at random. + */ +char * +generate_restrict_key(void) +{ + uint8 buf[64]; + char *ret = palloc(sizeof(buf)); + + if (!pg_strong_random(buf, sizeof(buf))) + return NULL; + + for (int i = 0; i < sizeof(buf) - 1; i++) + { + uint8 idx = buf[i] % strlen(restrict_chars); + + ret[i] = restrict_chars[idx]; + } + ret[sizeof(buf) - 1] = '\0'; + + return ret; +} + +/* + * Checks that a given restrict key (intended for use with psql's \restrict and + * \unrestrict meta-commands) contains only alphanumeric characters. + */ +bool +valid_restrict_key(const char *restrict_key) +{ + return restrict_key != NULL && + restrict_key[0] != '\0' && + strspn(restrict_key, restrict_chars) == strlen(restrict_key); +} diff --git a/src/bin/pg_dump/dumputils.h b/src/bin/pg_dump/dumputils.h index 98c71c6bf9473..f685c616c6461 100644 --- a/src/bin/pg_dump/dumputils.h +++ b/src/bin/pg_dump/dumputils.h @@ -36,6 +36,7 @@ #endif +extern char *sanitize_line(const char *str, bool want_hyphen); extern bool buildACLCommands(const char *name, const char *subname, const char *nspname, const char *type, const char *acls, const char *baseacls, const char *owner, const char *prefix, int remoteVersion, @@ -63,4 +64,7 @@ extern void makeAlterConfigCommand(PGconn *conn, const char *configitem, const char *type2, const char *name2, PQExpBuffer buf); +extern char *generate_restrict_key(void); +extern bool valid_restrict_key(const char *restrict_key); + #endif /* DUMPUTILS_H */ diff --git a/src/bin/pg_dump/filter.c b/src/bin/pg_dump/filter.c index 5815cd237483f..30d3ddff6af93 100644 --- a/src/bin/pg_dump/filter.c +++ b/src/bin/pg_dump/filter.c @@ -172,9 +172,8 @@ pg_log_filter_error(FilterStateData *fstate, const char *fmt,...) /* * 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. + * Search for keywords (strings of non-whitespace characters) in the passed + * in line buffer. Returns NULL when the buffer is empty or no keyword exists. * The length of the found keyword is returned in the size parameter. */ static const char * @@ -183,6 +182,9 @@ filter_get_keyword(const char **line, int *size) const char *ptr = *line; const char *result = NULL; + /* The passed buffer must not be NULL */ + Assert(*line != NULL); + /* Set returned length preemptively in case no keyword is found */ *size = 0; @@ -190,11 +192,12 @@ filter_get_keyword(const char **line, int *size) while (isspace((unsigned char) *ptr)) ptr++; - if (isalpha((unsigned char) *ptr)) + /* Grab one keyword that's the string of non-whitespace characters */ + if (*ptr != '\0' && !isspace((unsigned char) *ptr)) { result = ptr++; - while (isalpha((unsigned char) *ptr) || *ptr == '_') + while (*ptr != '\0' && !isspace((unsigned char) *ptr)) ptr++; *size = ptr - result; diff --git a/src/bin/pg_dump/pg_backup.h b/src/bin/pg_dump/pg_backup.h index fbf5f1c515e5e..609635ccbcb93 100644 --- a/src/bin/pg_dump/pg_backup.h +++ b/src/bin/pg_dump/pg_backup.h @@ -157,6 +157,8 @@ typedef struct _restoreOptions int enable_row_security; int sequence_data; /* dump sequence data even in schema-only mode */ int binary_upgrade; + + char *restrict_key; } RestoreOptions; typedef struct _dumpOptions @@ -203,6 +205,8 @@ typedef struct _dumpOptions int sequence_data; /* dump sequence data even in schema-only mode */ int do_nothing; + + char *restrict_key; } DumpOptions; /* diff --git a/src/bin/pg_dump/pg_backup_archiver.c b/src/bin/pg_dump/pg_backup_archiver.c index f1ffed038b046..4717e6f6f8325 100644 --- a/src/bin/pg_dump/pg_backup_archiver.c +++ b/src/bin/pg_dump/pg_backup_archiver.c @@ -54,7 +54,6 @@ static ArchiveHandle *_allocAH(const char *FileSpec, const ArchiveFormat fmt, 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); static void _doSetFixedOutputState(ArchiveHandle *AH); static void _doSetSessionAuth(ArchiveHandle *AH, const char *user); static void _reconnectToDB(ArchiveHandle *AH, const char *dbname); @@ -188,6 +187,7 @@ dumpOptionsFromRestoreOptions(RestoreOptions *ropt) dopt->include_everything = ropt->include_everything; dopt->enable_row_security = ropt->enable_row_security; dopt->sequence_data = ropt->sequence_data; + dopt->restrict_key = ropt->restrict_key ? pg_strdup(ropt->restrict_key) : NULL; return dopt; } @@ -452,6 +452,17 @@ RestoreArchive(Archive *AHX) ahprintf(AH, "--\n-- PostgreSQL database dump\n--\n\n"); + /* + * If generating plain-text output, enter restricted mode to block any + * unexpected psql meta-commands. A malicious source might try to inject + * a variety of things via bogus responses to queries. While we cannot + * prevent such sources from affecting the destination at restore time, we + * can block psql meta-commands so that the client machine that runs psql + * with the dump output remains unaffected. + */ + if (ropt->restrict_key) + ahprintf(AH, "\\restrict %s\n\n", ropt->restrict_key); + if (AH->archiveRemoteVersion) ahprintf(AH, "-- Dumped from database version %s\n", AH->archiveRemoteVersion); @@ -792,6 +803,14 @@ RestoreArchive(Archive *AHX) ahprintf(AH, "--\n-- PostgreSQL database dump complete\n--\n\n"); + /* + * If generating plain-text output, exit restricted mode at the very end + * of the script. This is not pro forma; in particular, pg_dumpall + * requires this when transitioning from one database to another. + */ + if (ropt->restrict_key) + ahprintf(AH, "\\unrestrict %s\n\n", ropt->restrict_key); + /* * Clean up & we're done. */ @@ -3350,11 +3369,21 @@ _reconnectToDB(ArchiveHandle *AH, const char *dbname) else { PQExpBufferData connectbuf; + RestoreOptions *ropt = AH->public.ropt; + + /* + * We must temporarily exit restricted mode for \connect, etc. + * Anything added between this line and the following \restrict must + * be careful to avoid any possible meta-command injection vectors. + */ + ahprintf(AH, "\\unrestrict %s\n", ropt->restrict_key); initPQExpBuffer(&connectbuf); appendPsqlMetaConnect(&connectbuf, dbname); - ahprintf(AH, "%s\n", connectbuf.data); + ahprintf(AH, "%s", connectbuf.data); termPQExpBuffer(&connectbuf); + + ahprintf(AH, "\\restrict %s\n\n", ropt->restrict_key); } /* @@ -3915,42 +3944,6 @@ _printTocEntry(ArchiveHandle *AH, TocEntry *te, bool isData) } } -/* - * Sanitize a string to be included in an SQL comment or TOC listing, by - * replacing any newlines with spaces. This ensures each logical output line - * is in fact one physical output line, to prevent corruption of the dump - * (which could, in the worst case, present an SQL injection vulnerability - * if someone were to incautiously load a dump containing objects with - * maliciously crafted names). - * - * The result is a freshly malloc'd string. If the input string is NULL, - * return a malloc'ed empty string, unless want_hyphen, in which case return a - * malloc'ed hyphen. - * - * Note that we currently don't bother to quote names, meaning that the name - * fields aren't automatically parseable. "pg_restore -L" doesn't care because - * it only examines the dumpId field, but someday we might want to try harder. - */ -static char * -sanitize_line(const char *str, bool want_hyphen) -{ - char *result; - char *s; - - if (!str) - return pg_strdup(want_hyphen ? "-" : ""); - - result = pg_strdup(str); - - for (s = result; *s != '\0'; s++) - { - if (*s == '\n' || *s == '\r') - *s = ' '; - } - - return result; -} - /* * Write the file header for a custom-format archive */ diff --git a/src/bin/pg_dump/pg_backup_directory.c b/src/bin/pg_dump/pg_backup_directory.c index 7be8d5487d4b2..6b93b0dc22867 100644 --- a/src/bin/pg_dump/pg_backup_directory.c +++ b/src/bin/pg_dump/pg_backup_directory.c @@ -444,10 +444,15 @@ _LoadLOs(ArchiveHandle *AH, TocEntry *te) /* * 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. + * now there can be multiple. Furthermore, although the actual filename + * was always "blobs.toc" before v16, the value of tctx->filename did not + * match that before commit 548e50976 fixed it. For simplicity we assume + * it must be "blobs.toc" in all archives before v16. */ - setFilePath(AH, tocfname, tctx->filename); + if (AH->version < K_VERS_1_16) + setFilePath(AH, tocfname, "blobs.toc"); + else + setFilePath(AH, tocfname, tctx->filename); CFH = ctx->LOsTocFH = InitDiscoverCompressFileHandle(tocfname, PG_BINARY_R); diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c index 85adb5dee7654..13139c9f0781f 100644 --- a/src/bin/pg_dump/pg_dump.c +++ b/src/bin/pg_dump/pg_dump.c @@ -47,6 +47,7 @@ #include "catalog/pg_authid_d.h" #include "catalog/pg_cast_d.h" #include "catalog/pg_class_d.h" +#include "catalog/pg_constraint_d.h" #include "catalog/pg_default_acl_d.h" #include "catalog/pg_largeobject_d.h" #include "catalog/pg_largeobject_metadata_d.h" @@ -449,6 +450,7 @@ main(int argc, char **argv) {"sync-method", required_argument, NULL, 15}, {"filter", required_argument, NULL, 16}, {"exclude-extension", required_argument, NULL, 17}, + {"restrict-key", required_argument, NULL, 25}, {NULL, 0, NULL, 0} }; @@ -689,6 +691,10 @@ main(int argc, char **argv) optarg); break; + case 25: + dopt.restrict_key = pg_strdup(optarg); + break; + default: /* getopt_long already emitted a complaint */ pg_log_error_hint("Try \"%s --help\" for more information.", progname); @@ -751,8 +757,22 @@ main(int argc, char **argv) /* archiveFormat specific setup */ if (archiveFormat == archNull) + { plainText = 1; + /* + * If you don't provide a restrict key, one will be appointed for you. + */ + if (!dopt.restrict_key) + dopt.restrict_key = generate_restrict_key(); + if (!dopt.restrict_key) + pg_fatal("could not generate restrict key"); + if (!valid_restrict_key(dopt.restrict_key)) + pg_fatal("invalid restrict key"); + } + else if (dopt.restrict_key) + pg_fatal("option --restrict-key can only be used with --format=plain"); + /* * Custom and directory formats are compressed by default with gzip when * available, not the others. If gzip is not available, no compression is @@ -1052,6 +1072,7 @@ main(int argc, char **argv) ropt->enable_row_security = dopt.enable_row_security; ropt->sequence_data = dopt.sequence_data; ropt->binary_upgrade = dopt.binary_upgrade; + ropt->restrict_key = dopt.restrict_key ? pg_strdup(dopt.restrict_key) : NULL; ropt->compression_spec = compression_spec; @@ -1159,6 +1180,7 @@ help(const char *progname) printf(_(" --no-unlogged-table-data do not dump unlogged table data\n")); printf(_(" --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n")); printf(_(" --quote-all-identifiers quote all identifiers, even if not key words\n")); + printf(_(" --restrict-key=RESTRICT_KEY use provided string as psql \\restrict key\n")); printf(_(" --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n")); printf(_(" --section=SECTION dump named section (pre-data, data, or post-data)\n")); printf(_(" --serializable-deferrable wait until the dump can run without anomalies\n")); @@ -2011,6 +2033,13 @@ selectDumpableProcLang(ProcLangInfo *plang, Archive *fout) static void selectDumpableAccessMethod(AccessMethodInfo *method, Archive *fout) { + /* see getAccessMethods() comment about v9.6. */ + if (fout->remoteVersion < 90600) + { + method->dobj.dump = DUMP_COMPONENT_NONE; + return; + } + if (checkExtensionMembership(&method->dobj, fout)) return; /* extension membership overrides all else */ @@ -2649,11 +2678,14 @@ dumpTableData(Archive *fout, const TableDataInfo *tdinfo) forcePartitionRootLoad(tbinfo))) { TableInfo *parentTbinfo; + char *sanitized; parentTbinfo = getRootTableInfo(tbinfo); copyFrom = fmtQualifiedDumpable(parentTbinfo); + sanitized = sanitize_line(copyFrom, true); printfPQExpBuffer(copyBuf, "-- load via partition root %s", - copyFrom); + sanitized); + free(sanitized); tdDefn = pg_strdup(copyBuf->data); } else @@ -5929,6 +5961,7 @@ getTypes(Archive *fout, int *numTypes) */ tyinfo[i].nDomChecks = 0; tyinfo[i].domChecks = NULL; + tyinfo[i].notnull = NULL; if ((tyinfo[i].dobj.dump & DUMP_COMPONENT_DEFINITION) && tyinfo[i].typtype == TYPTYPE_DOMAIN) getDomainConstraints(fout, &(tyinfo[i])); @@ -5995,6 +6028,8 @@ getOperators(Archive *fout, int *numOprs) int i_oprnamespace; int i_oprowner; int i_oprkind; + int i_oprleft; + int i_oprright; int i_oprcode; /* @@ -6006,6 +6041,8 @@ getOperators(Archive *fout, int *numOprs) "oprnamespace, " "oprowner, " "oprkind, " + "oprleft, " + "oprright, " "oprcode::oid AS oprcode " "FROM pg_operator"); @@ -6022,6 +6059,8 @@ getOperators(Archive *fout, int *numOprs) i_oprnamespace = PQfnumber(res, "oprnamespace"); i_oprowner = PQfnumber(res, "oprowner"); i_oprkind = PQfnumber(res, "oprkind"); + i_oprleft = PQfnumber(res, "oprleft"); + i_oprright = PQfnumber(res, "oprright"); i_oprcode = PQfnumber(res, "oprcode"); for (i = 0; i < ntups; i++) @@ -6035,6 +6074,8 @@ getOperators(Archive *fout, int *numOprs) findNamespace(atooid(PQgetvalue(res, i, i_oprnamespace))); oprinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_oprowner)); oprinfo[i].oprkind = (PQgetvalue(res, i, i_oprkind))[0]; + oprinfo[i].oprleft = atooid(PQgetvalue(res, i, i_oprleft)); + oprinfo[i].oprright = atooid(PQgetvalue(res, i, i_oprright)); oprinfo[i].oprcode = atooid(PQgetvalue(res, i, i_oprcode)); /* Decide whether we want to dump it */ @@ -6068,6 +6109,7 @@ getCollations(Archive *fout, int *numCollations) int i_collname; int i_collnamespace; int i_collowner; + int i_collencoding; query = createPQExpBuffer(); @@ -6078,7 +6120,8 @@ getCollations(Archive *fout, int *numCollations) appendPQExpBufferStr(query, "SELECT tableoid, oid, collname, " "collnamespace, " - "collowner " + "collowner, " + "collencoding " "FROM pg_collation"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -6093,6 +6136,7 @@ getCollations(Archive *fout, int *numCollations) i_collname = PQfnumber(res, "collname"); i_collnamespace = PQfnumber(res, "collnamespace"); i_collowner = PQfnumber(res, "collowner"); + i_collencoding = PQfnumber(res, "collencoding"); for (i = 0; i < ntups; i++) { @@ -6104,6 +6148,7 @@ getCollations(Archive *fout, int *numCollations) collinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_collnamespace))); collinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_collowner)); + collinfo[i].collencoding = atoi(PQgetvalue(res, i, i_collencoding)); /* Decide whether we want to dump it */ selectDumpableObject(&(collinfo[i].dobj), fout); @@ -6205,19 +6250,28 @@ getAccessMethods(Archive *fout, int *numAccessMethods) int i_amhandler; int i_amtype; - /* Before 9.6, there are no user-defined access methods */ - if (fout->remoteVersion < 90600) - { - *numAccessMethods = 0; - return NULL; - } - query = createPQExpBuffer(); - /* Select all access methods from pg_am table */ - appendPQExpBufferStr(query, "SELECT tableoid, oid, amname, amtype, " - "amhandler::pg_catalog.regproc AS amhandler " - "FROM pg_am"); + /* + * Select all access methods from pg_am table. v9.6 introduced CREATE + * ACCESS METHOD, so earlier versions usually have only built-in access + * methods. v9.6 also changed the access method API, replacing dozens of + * pg_am columns with amhandler. Even if a user created an access method + * by "INSERT INTO pg_am", we have no way to translate pre-v9.6 pg_am + * columns to a v9.6+ CREATE ACCESS METHOD. Hence, before v9.6, read + * pg_am just to facilitate findAccessMethodByOid() providing the + * OID-to-name mapping. + */ + appendPQExpBufferStr(query, "SELECT tableoid, oid, amname, "); + if (fout->remoteVersion >= 90600) + appendPQExpBufferStr(query, + "amtype, " + "amhandler::pg_catalog.regproc AS amhandler "); + else + appendPQExpBufferStr(query, + "'i'::pg_catalog.\"char\" AS amtype, " + "'-'::pg_catalog.regproc AS amhandler "); + appendPQExpBufferStr(query, "FROM pg_am"); res = ExecuteSqlQuery(fout, query->data, PGRES_TUPLES_OK); @@ -6272,6 +6326,7 @@ getOpclasses(Archive *fout, int *numOpclasses) OpclassInfo *opcinfo; int i_tableoid; int i_oid; + int i_opcmethod; int i_opcname; int i_opcnamespace; int i_opcowner; @@ -6281,7 +6336,7 @@ getOpclasses(Archive *fout, int *numOpclasses) * system-defined opclasses at dump-out time. */ - appendPQExpBufferStr(query, "SELECT tableoid, oid, opcname, " + appendPQExpBufferStr(query, "SELECT tableoid, oid, opcmethod, opcname, " "opcnamespace, " "opcowner " "FROM pg_opclass"); @@ -6295,6 +6350,7 @@ getOpclasses(Archive *fout, int *numOpclasses) i_tableoid = PQfnumber(res, "tableoid"); i_oid = PQfnumber(res, "oid"); + i_opcmethod = PQfnumber(res, "opcmethod"); i_opcname = PQfnumber(res, "opcname"); i_opcnamespace = PQfnumber(res, "opcnamespace"); i_opcowner = PQfnumber(res, "opcowner"); @@ -6308,6 +6364,7 @@ getOpclasses(Archive *fout, int *numOpclasses) opcinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opcname)); opcinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_opcnamespace))); + opcinfo[i].opcmethod = atooid(PQgetvalue(res, i, i_opcmethod)); opcinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_opcowner)); /* Decide whether we want to dump it */ @@ -6338,6 +6395,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies) OpfamilyInfo *opfinfo; int i_tableoid; int i_oid; + int i_opfmethod; int i_opfname; int i_opfnamespace; int i_opfowner; @@ -6349,7 +6407,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies) * system-defined opfamilies at dump-out time. */ - appendPQExpBufferStr(query, "SELECT tableoid, oid, opfname, " + appendPQExpBufferStr(query, "SELECT tableoid, oid, opfmethod, opfname, " "opfnamespace, " "opfowner " "FROM pg_opfamily"); @@ -6364,6 +6422,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies) i_tableoid = PQfnumber(res, "tableoid"); i_oid = PQfnumber(res, "oid"); i_opfname = PQfnumber(res, "opfname"); + i_opfmethod = PQfnumber(res, "opfmethod"); i_opfnamespace = PQfnumber(res, "opfnamespace"); i_opfowner = PQfnumber(res, "opfowner"); @@ -6376,6 +6435,7 @@ getOpfamilies(Archive *fout, int *numOpfamilies) opfinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_opfname)); opfinfo[i].dobj.namespace = findNamespace(atooid(PQgetvalue(res, i, i_opfnamespace))); + opfinfo[i].opfmethod = atooid(PQgetvalue(res, i, i_opfmethod)); opfinfo[i].rolname = getRoleName(PQgetvalue(res, i, i_opfowner)); /* Decide whether we want to dump it */ @@ -7949,27 +8009,33 @@ addConstrChildIdxDeps(DumpableObject *dobj, const IndxInfo *refidx) static void getDomainConstraints(Archive *fout, TypeInfo *tyinfo) { - int i; ConstraintInfo *constrinfo; PQExpBuffer query = createPQExpBuffer(); PGresult *res; int i_tableoid, i_oid, i_conname, - i_consrc; + i_consrc, + i_convalidated, + i_contype; int ntups; if (!fout->is_prepared[PREPQUERY_GETDOMAINCONSTRAINTS]) { - /* Set up query for constraint-specific details */ - appendPQExpBufferStr(query, - "PREPARE getDomainConstraints(pg_catalog.oid) AS\n" - "SELECT tableoid, oid, conname, " - "pg_catalog.pg_get_constraintdef(oid) AS consrc, " - "convalidated " - "FROM pg_catalog.pg_constraint " - "WHERE contypid = $1 AND contype = 'c' " - "ORDER BY conname"); + /* + * Set up query for constraint-specific details. For servers 17 and + * up, domains have constraints of type 'n' as well as 'c', otherwise + * just the latter. + */ + appendPQExpBuffer(query, + "PREPARE getDomainConstraints(pg_catalog.oid) AS\n" + "SELECT tableoid, oid, conname, " + "pg_catalog.pg_get_constraintdef(oid) AS consrc, " + "convalidated, contype " + "FROM pg_catalog.pg_constraint " + "WHERE contypid = $1 AND contype IN (%s) " + "ORDER BY conname", + fout->remoteVersion < 170000 ? "'c'" : "'c', 'n'"); ExecuteSqlStatement(fout, query->data); @@ -7988,33 +8054,50 @@ getDomainConstraints(Archive *fout, TypeInfo *tyinfo) i_oid = PQfnumber(res, "oid"); i_conname = PQfnumber(res, "conname"); i_consrc = PQfnumber(res, "consrc"); + i_convalidated = PQfnumber(res, "convalidated"); + i_contype = PQfnumber(res, "contype"); constrinfo = (ConstraintInfo *) pg_malloc(ntups * sizeof(ConstraintInfo)); - - tyinfo->nDomChecks = ntups; tyinfo->domChecks = constrinfo; - for (i = 0; i < ntups; i++) + /* 'i' tracks result rows; 'j' counts CHECK constraints */ + for (int i = 0, j = 0; i < ntups; i++) { - bool validated = PQgetvalue(res, i, 4)[0] == 't'; - - constrinfo[i].dobj.objType = DO_CONSTRAINT; - constrinfo[i].dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid)); - constrinfo[i].dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid)); - AssignDumpId(&constrinfo[i].dobj); - constrinfo[i].dobj.name = pg_strdup(PQgetvalue(res, i, i_conname)); - constrinfo[i].dobj.namespace = tyinfo->dobj.namespace; - constrinfo[i].contable = NULL; - constrinfo[i].condomain = tyinfo; - constrinfo[i].contype = 'c'; - constrinfo[i].condef = pg_strdup(PQgetvalue(res, i, i_consrc)); - constrinfo[i].confrelid = InvalidOid; - constrinfo[i].conindex = 0; - constrinfo[i].condeferrable = false; - constrinfo[i].condeferred = false; - constrinfo[i].conislocal = true; - - constrinfo[i].separate = !validated; + bool validated = PQgetvalue(res, i, i_convalidated)[0] == 't'; + char contype = (PQgetvalue(res, i, i_contype))[0]; + ConstraintInfo *constraint; + + if (contype == CONSTRAINT_CHECK) + { + constraint = &constrinfo[j++]; + tyinfo->nDomChecks++; + } + else + { + Assert(contype == CONSTRAINT_NOTNULL); + Assert(tyinfo->notnull == NULL); + /* use last item in array for the not-null constraint */ + tyinfo->notnull = &(constrinfo[ntups - 1]); + constraint = tyinfo->notnull; + } + + constraint->dobj.objType = DO_CONSTRAINT; + constraint->dobj.catId.tableoid = atooid(PQgetvalue(res, i, i_tableoid)); + constraint->dobj.catId.oid = atooid(PQgetvalue(res, i, i_oid)); + AssignDumpId(&(constraint->dobj)); + constraint->dobj.name = pg_strdup(PQgetvalue(res, i, i_conname)); + constraint->dobj.namespace = tyinfo->dobj.namespace; + constraint->contable = NULL; + constraint->condomain = tyinfo; + constraint->contype = contype; + constraint->condef = pg_strdup(PQgetvalue(res, i, i_consrc)); + constraint->confrelid = InvalidOid; + constraint->conindex = 0; + constraint->condeferrable = false; + constraint->condeferred = false; + constraint->conislocal = true; + + constraint->separate = !validated; /* * Make the domain depend on the constraint, ensuring it won't be @@ -8023,8 +8106,7 @@ getDomainConstraints(Archive *fout, TypeInfo *tyinfo) * anyway, so this doesn't matter. */ if (validated) - addObjectDependency(&tyinfo->dobj, - constrinfo[i].dobj.dumpId); + addObjectDependency(&tyinfo->dobj, constraint->dobj.dumpId); } PQclear(res); @@ -11557,8 +11639,36 @@ dumpDomain(Archive *fout, const TypeInfo *tyinfo) appendPQExpBuffer(q, " COLLATE %s", fmtQualifiedDumpable(coll)); } + /* + * Print a not-null constraint if there's one. In servers older than 17 + * these don't have names, so just print it unadorned; in newer ones they + * do, but most of the time it's going to be the standard generated one, + * so omit the name in that case also. + */ if (typnotnull[0] == 't') - appendPQExpBufferStr(q, " NOT NULL"); + { + if (fout->remoteVersion < 170000 || tyinfo->notnull == NULL) + appendPQExpBufferStr(q, " NOT NULL"); + else + { + ConstraintInfo *notnull = tyinfo->notnull; + + if (!notnull->separate) + { + char *default_name; + + /* XXX should match ChooseConstraintName better */ + default_name = psprintf("%s_not_null", tyinfo->dobj.name); + + if (strcmp(default_name, notnull->dobj.name) == 0) + appendPQExpBufferStr(q, " NOT NULL"); + else + appendPQExpBuffer(q, " CONSTRAINT %s %s", + fmtId(notnull->dobj.name), notnull->condef); + free(default_name); + } + } + } if (typdefault != NULL) { @@ -11578,7 +11688,7 @@ dumpDomain(Archive *fout, const TypeInfo *tyinfo) { ConstraintInfo *domcheck = &(tyinfo->domChecks[i]); - if (!domcheck->separate) + if (!domcheck->separate && domcheck->contype == 'c') appendPQExpBuffer(q, "\n\tCONSTRAINT %s %s", fmtId(domcheck->dobj.name), domcheck->condef); } @@ -11623,8 +11733,13 @@ dumpDomain(Archive *fout, const TypeInfo *tyinfo) for (i = 0; i < tyinfo->nDomChecks; i++) { ConstraintInfo *domcheck = &(tyinfo->domChecks[i]); - PQExpBuffer conprefix = createPQExpBuffer(); + PQExpBuffer conprefix; + /* but only if the constraint itself was dumped here */ + if (domcheck->separate) + continue; + + conprefix = createPQExpBuffer(); appendPQExpBuffer(conprefix, "CONSTRAINT %s ON DOMAIN", fmtId(domcheck->dobj.name)); @@ -11637,6 +11752,25 @@ dumpDomain(Archive *fout, const TypeInfo *tyinfo) destroyPQExpBuffer(conprefix); } + /* + * And a comment on the not-null constraint, if there's one -- but only if + * the constraint itself was dumped here + */ + if (tyinfo->notnull != NULL && !tyinfo->notnull->separate) + { + PQExpBuffer conprefix = createPQExpBuffer(); + + appendPQExpBuffer(conprefix, "CONSTRAINT %s ON DOMAIN", + fmtId(tyinfo->notnull->dobj.name)); + + if (tyinfo->notnull->dobj.dump & DUMP_COMPONENT_COMMENT) + dumpComment(fout, conprefix->data, qtypname, + tyinfo->dobj.namespace->dobj.name, + tyinfo->rolname, + tyinfo->notnull->dobj.catId, 0, tyinfo->dobj.dumpId); + destroyPQExpBuffer(conprefix); + } + destroyPQExpBuffer(q); destroyPQExpBuffer(delq); destroyPQExpBuffer(query); @@ -16933,7 +17067,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, @@ -16986,11 +17130,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, @@ -17317,14 +17465,23 @@ dumpConstraint(Archive *fout, const ConstraintInfo *coninfo) .dropStmt = delq->data)); } } - else if (coninfo->contype == 'c' && tbinfo == NULL) + else if (tbinfo == NULL) { - /* CHECK constraint on a domain */ + /* CHECK, NOT NULL constraint on a domain */ TypeInfo *tyinfo = coninfo->condomain; + Assert(coninfo->contype == 'c' || coninfo->contype == 'n'); + /* Ignore if not to be dumped separately */ if (coninfo->separate) { + const char *keyword; + + if (coninfo->contype == 'c') + keyword = "CHECK CONSTRAINT"; + else + keyword = "CONSTRAINT"; + appendPQExpBuffer(q, "ALTER DOMAIN %s\n", fmtQualifiedDumpable(tyinfo)); appendPQExpBuffer(q, " ADD CONSTRAINT %s %s;\n", @@ -17343,10 +17500,26 @@ dumpConstraint(Archive *fout, const ConstraintInfo *coninfo) ARCHIVE_OPTS(.tag = tag, .namespace = tyinfo->dobj.namespace->dobj.name, .owner = tyinfo->rolname, - .description = "CHECK CONSTRAINT", + .description = keyword, .section = SECTION_POST_DATA, .createStmt = q->data, .dropStmt = delq->data)); + + if (coninfo->dobj.dump & DUMP_COMPONENT_COMMENT) + { + PQExpBuffer conprefix = createPQExpBuffer(); + char *qtypname = pg_strdup(fmtId(tyinfo->dobj.name)); + + appendPQExpBuffer(conprefix, "CONSTRAINT %s ON DOMAIN", + fmtId(coninfo->dobj.name)); + + dumpComment(fout, conprefix->data, qtypname, + tyinfo->dobj.namespace->dobj.name, + tyinfo->rolname, + coninfo->dobj.catId, 0, tyinfo->dobj.dumpId); + destroyPQExpBuffer(conprefix); + free(qtypname); + } } } else diff --git a/src/bin/pg_dump/pg_dump.h b/src/bin/pg_dump/pg_dump.h index 1d352fe12d1ac..2de5afdacdb8a 100644 --- a/src/bin/pg_dump/pg_dump.h +++ b/src/bin/pg_dump/pg_dump.h @@ -215,7 +215,9 @@ typedef struct _typeInfo bool isDefined; /* true if typisdefined */ /* If needed, we'll create a "shell type" entry for it; link that here: */ struct _shellTypeInfo *shellType; /* shell-type entry, or NULL */ - /* If it's a domain, we store links to its constraints here: */ + /* If it's a domain, its not-null constraint is here: */ + struct _constraintInfo *notnull; + /* If it's a domain, we store links to its CHECK constraints here: */ int nDomChecks; struct _constraintInfo *domChecks; } TypeInfo; @@ -251,6 +253,8 @@ typedef struct _oprInfo DumpableObject dobj; const char *rolname; char oprkind; + Oid oprleft; + Oid oprright; Oid oprcode; } OprInfo; @@ -264,12 +268,14 @@ typedef struct _accessMethodInfo typedef struct _opclassInfo { DumpableObject dobj; + Oid opcmethod; const char *rolname; } OpclassInfo; typedef struct _opfamilyInfo { DumpableObject dobj; + Oid opfmethod; const char *rolname; } OpfamilyInfo; @@ -277,6 +283,7 @@ typedef struct _collInfo { DumpableObject dobj; const char *rolname; + int collencoding; } CollInfo; typedef struct _convInfo @@ -721,6 +728,7 @@ extern TableInfo *findTableByOid(Oid oid); extern TypeInfo *findTypeByOid(Oid oid); extern FuncInfo *findFuncByOid(Oid oid); extern OprInfo *findOprByOid(Oid oid); +extern AccessMethodInfo *findAccessMethodByOid(Oid oid); extern CollInfo *findCollationByOid(Oid oid); extern NamespaceInfo *findNamespaceByOid(Oid oid); extern ExtensionInfo *findExtensionByOid(Oid oid); diff --git a/src/bin/pg_dump/pg_dump_sort.c b/src/bin/pg_dump/pg_dump_sort.c index 4cb754caa55fd..ffaceb93644cf 100644 --- a/src/bin/pg_dump/pg_dump_sort.c +++ b/src/bin/pg_dump/pg_dump_sort.c @@ -77,10 +77,10 @@ enum dbObjectTypePriorities PRIO_TABLE_ATTACH, PRIO_DUMMY_TYPE, PRIO_ATTRDEF, - PRIO_LARGE_OBJECT, PRIO_PRE_DATA_BOUNDARY, /* boundary! */ PRIO_TABLE_DATA, PRIO_SEQUENCE_SET, + PRIO_LARGE_OBJECT, PRIO_LARGE_OBJECT_DATA, PRIO_POST_DATA_BOUNDARY, /* boundary! */ PRIO_CONSTRAINT, @@ -161,6 +161,8 @@ static DumpId postDataBoundId; static int DOTypeNameCompare(const void *p1, const void *p2); +static int pgTypeNameCompare(Oid typid1, Oid typid2); +static int accessMethodNameCompare(Oid am1, Oid am2); static bool TopoSort(DumpableObject **objs, int numObjs, DumpableObject **ordering, @@ -227,12 +229,39 @@ DOTypeNameCompare(const void *p1, const void *p2) else if (obj2->namespace) return 1; - /* Sort by name */ + /* + * Sort by name. With a few exceptions, names here are single catalog + * columns. To get a fuller picture, grep pg_dump.c for "dobj.name = ". + * Names here don't match "Name:" in plain format output, which is a + * _tocEntry.tag. For example, DumpableObject.name of a constraint is + * pg_constraint.conname, but _tocEntry.tag of a constraint is relname and + * conname joined with a space. + */ cmpval = strcmp(obj1->name, obj2->name); if (cmpval != 0) return cmpval; - /* To have a stable sort order, break ties for some object types */ + /* + * Sort by type. This helps types that share a type priority without + * sharing a unique name constraint, e.g. opclass and opfamily. + */ + cmpval = obj1->objType - obj2->objType; + if (cmpval != 0) + return cmpval; + + /* + * To have a stable sort order, break ties for some object types. Most + * catalogs have a natural key, e.g. pg_proc_proname_args_nsp_index. Where + * the above "namespace" and "name" comparisons don't cover all natural + * key columns, compare the rest here. + * + * The natural key usually refers to other catalogs by surrogate keys. + * Hence, this translates each of those references to the natural key of + * the referenced catalog. That may descend through multiple levels of + * catalog references. For example, to sort by pg_proc.proargtypes, + * descend to each pg_type and then further to its pg_namespace, for an + * overall sort by (nspname, typname). + */ if (obj1->objType == DO_FUNC || obj1->objType == DO_AGG) { FuncInfo *fobj1 = *(FuncInfo *const *) p1; @@ -245,22 +274,10 @@ DOTypeNameCompare(const void *p1, const void *p2) return cmpval; for (i = 0; i < fobj1->nargs; i++) { - TypeInfo *argtype1 = findTypeByOid(fobj1->argtypes[i]); - TypeInfo *argtype2 = findTypeByOid(fobj2->argtypes[i]); - - if (argtype1 && argtype2) - { - if (argtype1->dobj.namespace && argtype2->dobj.namespace) - { - cmpval = strcmp(argtype1->dobj.namespace->dobj.name, - argtype2->dobj.namespace->dobj.name); - if (cmpval != 0) - return cmpval; - } - cmpval = strcmp(argtype1->dobj.name, argtype2->dobj.name); - if (cmpval != 0) - return cmpval; - } + cmpval = pgTypeNameCompare(fobj1->argtypes[i], + fobj2->argtypes[i]); + if (cmpval != 0) + return cmpval; } } else if (obj1->objType == DO_OPERATOR) @@ -272,6 +289,57 @@ DOTypeNameCompare(const void *p1, const void *p2) cmpval = (oobj2->oprkind - oobj1->oprkind); if (cmpval != 0) return cmpval; + /* Within an oprkind, sort by argument type names */ + cmpval = pgTypeNameCompare(oobj1->oprleft, oobj2->oprleft); + if (cmpval != 0) + return cmpval; + cmpval = pgTypeNameCompare(oobj1->oprright, oobj2->oprright); + if (cmpval != 0) + return cmpval; + } + else if (obj1->objType == DO_OPCLASS) + { + OpclassInfo *opcobj1 = *(OpclassInfo *const *) p1; + OpclassInfo *opcobj2 = *(OpclassInfo *const *) p2; + + /* Sort by access method name, per pg_opclass_am_name_nsp_index */ + cmpval = accessMethodNameCompare(opcobj1->opcmethod, + opcobj2->opcmethod); + if (cmpval != 0) + return cmpval; + } + else if (obj1->objType == DO_OPFAMILY) + { + OpfamilyInfo *opfobj1 = *(OpfamilyInfo *const *) p1; + OpfamilyInfo *opfobj2 = *(OpfamilyInfo *const *) p2; + + /* Sort by access method name, per pg_opfamily_am_name_nsp_index */ + cmpval = accessMethodNameCompare(opfobj1->opfmethod, + opfobj2->opfmethod); + if (cmpval != 0) + return cmpval; + } + else if (obj1->objType == DO_COLLATION) + { + CollInfo *cobj1 = *(CollInfo *const *) p1; + CollInfo *cobj2 = *(CollInfo *const *) p2; + + /* + * Sort by encoding, per pg_collation_name_enc_nsp_index. Technically, + * this is not necessary, because wherever this changes dump order, + * restoring the dump fails anyway. CREATE COLLATION can't create a + * tie for this to break, because it imposes restrictions to make + * (nspname, collname) uniquely identify a collation within a given + * DatabaseEncoding. While pg_import_system_collations() can create a + * tie, pg_dump+restore fails after + * pg_import_system_collations('my_schema') does so. However, there's + * little to gain by ignoring one natural key column on the basis of + * those limitations elsewhere, so respect the full natural key like + * we do for other object types. + */ + cmpval = cobj1->collencoding - cobj2->collencoding; + if (cmpval != 0) + return cmpval; } else if (obj1->objType == DO_ATTRDEF) { @@ -294,6 +362,17 @@ DOTypeNameCompare(const void *p1, const void *p2) if (cmpval != 0) return cmpval; } + else if (obj1->objType == DO_RULE) + { + RuleInfo *robj1 = *(RuleInfo *const *) p1; + RuleInfo *robj2 = *(RuleInfo *const *) p2; + + /* Sort by table name (table namespace was considered already) */ + cmpval = strcmp(robj1->ruletable->dobj.name, + robj2->ruletable->dobj.name); + if (cmpval != 0) + return cmpval; + } else if (obj1->objType == DO_TRIGGER) { TriggerInfo *tobj1 = *(TriggerInfo *const *) p1; @@ -305,11 +384,142 @@ DOTypeNameCompare(const void *p1, const void *p2) if (cmpval != 0) return cmpval; } + else if (obj1->objType == DO_CONSTRAINT) + { + ConstraintInfo *robj1 = *(ConstraintInfo *const *) p1; + ConstraintInfo *robj2 = *(ConstraintInfo *const *) p2; + + /* + * Sort domain constraints before table constraints, for consistency + * with our decision to sort CREATE DOMAIN before CREATE TABLE. + */ + if (robj1->condomain) + { + if (robj2->condomain) + { + /* Sort by domain name (domain namespace was considered) */ + cmpval = strcmp(robj1->condomain->dobj.name, + robj2->condomain->dobj.name); + if (cmpval != 0) + return cmpval; + } + else + return PRIO_TYPE - PRIO_TABLE; + } + else if (robj2->condomain) + return PRIO_TABLE - PRIO_TYPE; + else + { + /* Sort by table name (table namespace was considered already) */ + cmpval = strcmp(robj1->contable->dobj.name, + robj2->contable->dobj.name); + if (cmpval != 0) + return cmpval; + } + } + else if (obj1->objType == DO_PUBLICATION_REL) + { + PublicationRelInfo *probj1 = *(PublicationRelInfo *const *) p1; + PublicationRelInfo *probj2 = *(PublicationRelInfo *const *) p2; + + /* Sort by publication name, since (namespace, name) match the rel */ + cmpval = strcmp(probj1->publication->dobj.name, + probj2->publication->dobj.name); + if (cmpval != 0) + return cmpval; + } + else if (obj1->objType == DO_PUBLICATION_TABLE_IN_SCHEMA) + { + PublicationSchemaInfo *psobj1 = *(PublicationSchemaInfo *const *) p1; + PublicationSchemaInfo *psobj2 = *(PublicationSchemaInfo *const *) p2; - /* Usually shouldn't get here, but if we do, sort by OID */ + /* Sort by publication name, since ->name is just nspname */ + cmpval = strcmp(psobj1->publication->dobj.name, + psobj2->publication->dobj.name); + if (cmpval != 0) + return cmpval; + } + + /* + * Shouldn't get here except after catalog corruption, but if we do, sort + * by OID. This may make logically-identical databases differ in the + * order of objects in dump output. Users will get spurious schema diffs. + * Expect flaky failures of 002_pg_upgrade.pl test 'dump outputs from + * original and restored regression databases match' if the regression + * database contains objects allowing that test to reach here. That's a + * consequence of the test using "pg_restore -j", which doesn't fully + * constrain OID assignment order. + */ return oidcmp(obj1->catId.oid, obj2->catId.oid); } +/* Compare two OID-identified pg_type values by nspname, then by typname. */ +static int +pgTypeNameCompare(Oid typid1, Oid typid2) +{ + TypeInfo *typobj1; + TypeInfo *typobj2; + int cmpval; + + if (typid1 == typid2) + return 0; + + typobj1 = findTypeByOid(typid1); + typobj2 = findTypeByOid(typid2); + + if (!typobj1 || !typobj2) + { + /* + * getTypes() didn't find some OID. Assume catalog corruption, e.g. + * an oprright value without the corresponding OID in a pg_type row. + * Report as "equal", so the caller uses the next available basis for + * comparison, e.g. the next function argument. + * + * Unary operators have InvalidOid in oprleft (if oprkind='r') or in + * oprright (if oprkind='l'). Caller already sorted by oprkind, + * calling us only for like-kind operators. Hence, "typid1 == typid2" + * took care of InvalidOid. (v14 removed postfix operator support. + * Hence, when dumping from v14+, only oprleft can be InvalidOid.) + */ + Assert(false); + return 0; + } + + if (!typobj1->dobj.namespace || !typobj2->dobj.namespace) + Assert(false); /* catalog corruption */ + else + { + cmpval = strcmp(typobj1->dobj.namespace->dobj.name, + typobj2->dobj.namespace->dobj.name); + if (cmpval != 0) + return cmpval; + } + return strcmp(typobj1->dobj.name, typobj2->dobj.name); +} + +/* Compare two OID-identified pg_am values by amname. */ +static int +accessMethodNameCompare(Oid am1, Oid am2) +{ + AccessMethodInfo *amobj1; + AccessMethodInfo *amobj2; + + if (am1 == am2) + return 0; + + amobj1 = findAccessMethodByOid(am1); + amobj2 = findAccessMethodByOid(am2); + + if (!amobj1 || !amobj2) + { + /* catalog corruption: handle like pgTypeNameCompare() does */ + Assert(false); + return 0; + } + + return strcmp(amobj1->dobj.name, amobj2->dobj.name); +} + /* * Sort the given objects into a safe dump order using dependency @@ -884,7 +1094,7 @@ repairTableAttrDefMultiLoop(DumpableObject *tableobj, } /* - * CHECK constraints on domains work just like those on tables ... + * CHECK, NOT NULL constraints on domains work just like those on tables ... */ static void repairDomainConstraintLoop(DumpableObject *domainobj, @@ -1135,11 +1345,12 @@ repairDependencyLoop(DumpableObject **loop, } } - /* Domain and CHECK constraint */ + /* Domain and CHECK or NOT NULL constraint */ if (nLoop == 2 && loop[0]->objType == DO_TYPE && loop[1]->objType == DO_CONSTRAINT && - ((ConstraintInfo *) loop[1])->contype == 'c' && + (((ConstraintInfo *) loop[1])->contype == 'c' || + ((ConstraintInfo *) loop[1])->contype == 'n') && ((ConstraintInfo *) loop[1])->condomain == (TypeInfo *) loop[0]) { repairDomainConstraintLoop(loop[0], loop[1]); @@ -1148,14 +1359,15 @@ repairDependencyLoop(DumpableObject **loop, if (nLoop == 2 && loop[1]->objType == DO_TYPE && loop[0]->objType == DO_CONSTRAINT && - ((ConstraintInfo *) loop[0])->contype == 'c' && + (((ConstraintInfo *) loop[0])->contype == 'c' || + ((ConstraintInfo *) loop[0])->contype == 'n') && ((ConstraintInfo *) loop[0])->condomain == (TypeInfo *) loop[1]) { repairDomainConstraintLoop(loop[1], loop[0]); return; } - /* Indirect loop involving domain and CHECK constraint */ + /* Indirect loop involving domain and CHECK or NOT NULL constraint */ if (nLoop > 2) { for (i = 0; i < nLoop; i++) @@ -1165,7 +1377,8 @@ repairDependencyLoop(DumpableObject **loop, for (j = 0; j < nLoop; j++) { if (loop[j]->objType == DO_CONSTRAINT && - ((ConstraintInfo *) loop[j])->contype == 'c' && + (((ConstraintInfo *) loop[j])->contype == 'c' || + ((ConstraintInfo *) loop[j])->contype == 'n') && ((ConstraintInfo *) loop[j])->condomain == (TypeInfo *) loop[i]) { repairDomainConstraintMultiLoop(loop[i], loop[j]); diff --git a/src/bin/pg_dump/pg_dumpall.c b/src/bin/pg_dump/pg_dumpall.c index c0b8467a2fc72..be18bf0146b59 100644 --- a/src/bin/pg_dump/pg_dumpall.c +++ b/src/bin/pg_dump/pg_dumpall.c @@ -121,6 +121,8 @@ static char *filename = NULL; static SimpleStringList database_exclude_patterns = {NULL, NULL}; static SimpleStringList database_exclude_names = {NULL, NULL}; +static char *restrict_key; + #define exit_nicely(code) exit(code) int @@ -178,6 +180,7 @@ main(int argc, char *argv[]) {"on-conflict-do-nothing", no_argument, &on_conflict_do_nothing, 1}, {"rows-per-insert", required_argument, NULL, 7}, {"filter", required_argument, NULL, 8}, + {"restrict-key", required_argument, NULL, 9}, {NULL, 0, NULL, 0} }; @@ -365,6 +368,12 @@ main(int argc, char *argv[]) read_dumpall_filters(optarg, &database_exclude_patterns); break; + case 9: + restrict_key = pg_strdup(optarg); + appendPQExpBufferStr(pgdumpopts, " --restrict-key "); + appendShellString(pgdumpopts, optarg); + break; + default: /* getopt_long already emitted a complaint */ pg_log_error_hint("Try \"%s --help\" for more information.", progname); @@ -460,6 +469,16 @@ main(int argc, char *argv[]) if (on_conflict_do_nothing) appendPQExpBufferStr(pgdumpopts, " --on-conflict-do-nothing"); + /* + * If you don't provide a restrict key, one will be appointed for you. + */ + if (!restrict_key) + restrict_key = generate_restrict_key(); + if (!restrict_key) + pg_fatal("could not generate restrict key"); + if (!valid_restrict_key(restrict_key)) + pg_fatal("invalid restrict key"); + /* * If there was a database specified on the command line, use that, * otherwise try to connect to database "postgres", and failing that @@ -547,6 +566,16 @@ main(int argc, char *argv[]) if (verbose) dumpTimestamp("Started on"); + /* + * Enter restricted mode to block any unexpected psql meta-commands. A + * malicious source might try to inject a variety of things via bogus + * responses to queries. While we cannot prevent such sources from + * affecting the destination at restore time, we can block psql + * meta-commands so that the client machine that runs psql with the dump + * output remains unaffected. + */ + fprintf(OPF, "\\restrict %s\n\n", restrict_key); + /* * We used to emit \connect postgres here, but that served no purpose * other than to break things for installations without a postgres @@ -607,6 +636,12 @@ main(int argc, char *argv[]) dumpTablespaces(conn); } + /* + * Exit restricted mode just before dumping the databases. pg_dump will + * handle entering restricted mode again as appropriate. + */ + fprintf(OPF, "\\unrestrict %s\n\n", restrict_key); + if (!globals_only && !roles_only && !tablespaces_only) dumpDatabases(conn); @@ -675,6 +710,7 @@ help(void) printf(_(" --no-unlogged-table-data do not dump unlogged table data\n")); printf(_(" --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT commands\n")); printf(_(" --quote-all-identifiers quote all identifiers, even if not key words\n")); + printf(_(" --restrict-key=RESTRICT_KEY use provided string as psql \\restrict key\n")); printf(_(" --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n")); printf(_(" --use-set-session-authorization\n" " use SET SESSION AUTHORIZATION commands instead of\n" @@ -966,6 +1002,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; @@ -975,6 +1018,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); @@ -986,8 +1033,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"); @@ -996,8 +1045,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"); @@ -1021,24 +1077,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); @@ -1078,10 +1142,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); @@ -1414,7 +1498,13 @@ dumpUserConfig(PGconn *conn, const char *username) res = executeQuery(conn, buf->data); if (PQntuples(res) > 0) - fprintf(OPF, "\n--\n-- User Config \"%s\"\n--\n\n", username); + { + char *sanitized; + + sanitized = sanitize_line(username, true); + fprintf(OPF, "\n--\n-- User Config \"%s\"\n--\n\n", sanitized); + free(sanitized); + } for (int i = 0; i < PQntuples(res); i++) { @@ -1516,6 +1606,7 @@ dumpDatabases(PGconn *conn) for (i = 0; i < PQntuples(res); i++) { char *dbname = PQgetvalue(res, i, 0); + char *sanitized; const char *create_opts; int ret; @@ -1532,7 +1623,9 @@ dumpDatabases(PGconn *conn) pg_log_info("dumping database \"%s\"", dbname); - fprintf(OPF, "--\n-- Database \"%s\" dump\n--\n\n", dbname); + sanitized = sanitize_line(dbname, true); + fprintf(OPF, "--\n-- Database \"%s\" dump\n--\n\n", sanitized); + free(sanitized); /* * We assume that "template1" and "postgres" already exist in the diff --git a/src/bin/pg_dump/pg_restore.c b/src/bin/pg_dump/pg_restore.c index df119591ccaa0..fc6fa923231f2 100644 --- a/src/bin/pg_dump/pg_restore.c +++ b/src/bin/pg_dump/pg_restore.c @@ -127,6 +127,7 @@ main(int argc, char **argv) {"no-security-labels", no_argument, &no_security_labels, 1}, {"no-subscriptions", no_argument, &no_subscriptions, 1}, {"filter", required_argument, NULL, 4}, + {"restrict-key", required_argument, NULL, 6}, {NULL, 0, NULL, 0} }; @@ -302,6 +303,10 @@ main(int argc, char **argv) opts->exit_on_error = true; break; + case 6: + opts->restrict_key = pg_strdup(optarg); + break; + default: /* getopt_long already emitted a complaint */ pg_log_error_hint("Try \"%s --help\" for more information.", progname); @@ -337,8 +342,24 @@ main(int argc, char **argv) pg_log_error_hint("Try \"%s --help\" for more information.", progname); exit_nicely(1); } + + if (opts->restrict_key) + pg_fatal("options -d/--dbname and --restrict-key cannot be used together"); + opts->useDB = 1; } + else + { + /* + * If you don't provide a restrict key, one will be appointed for you. + */ + if (!opts->restrict_key) + opts->restrict_key = generate_restrict_key(); + if (!opts->restrict_key) + pg_fatal("could not generate restrict key"); + if (!valid_restrict_key(opts->restrict_key)) + pg_fatal("invalid restrict key"); + } if (opts->dataOnly && opts->schemaOnly) pg_fatal("options -s/--schema-only and -a/--data-only cannot be used together"); @@ -493,6 +514,7 @@ usage(const char *progname) printf(_(" --no-subscriptions do not restore subscriptions\n")); printf(_(" --no-table-access-method do not restore table access methods\n")); printf(_(" --no-tablespaces do not restore tablespace assignments\n")); + printf(_(" --restrict-key=RESTRICT_KEY use provided string as psql \\restrict key\n")); printf(_(" --section=SECTION restore named section (pre-data, data, or post-data)\n")); printf(_(" --strict-names require table and/or schema include patterns to\n" " match at least one entity each\n")); diff --git a/src/bin/pg_dump/po/de.po b/src/bin/pg_dump/po/de.po index dbe490c9f8166..1e45cd26484e6 100644 --- a/src/bin/pg_dump/po/de.po +++ b/src/bin/pg_dump/po/de.po @@ -1,5 +1,5 @@ # German message translation file for pg_dump and friends -# Peter Eisentraut , 2001 - 2024. +# Peter Eisentraut , 2001 - 2025. # # Use these quotes: »%s« # @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-08-28 04:22+0000\n" -"PO-Revision-Date: 2024-08-28 07:52+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" @@ -232,12 +232,12 @@ msgstr "%s muss im Bereich %d..%d sein" msgid "unrecognized sync method: %s" msgstr "unbekannte Sync-Methode: %s" -#: ../../fe_utils/string_utils.c:434 +#: ../../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:607 +#: ../../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" @@ -503,13 +503,13 @@ msgid "could not read from input file: %s" msgstr "konnte nicht aus Eingabedatei lesen: %s" #: compress_gzip.c:295 compress_none.c:97 compress_none.c:139 -#: compress_zstd.c:373 pg_backup_custom.c:651 +#: 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:371 pg_backup_custom.c:649 pg_backup_directory.c:565 +#: 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" @@ -550,18 +550,18 @@ 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:501 +#: compress_zstd.c:502 #, c-format msgid "unhandled mode \"%s\"" msgstr "unbehandelter Modus »%s«" @@ -822,7 +822,7 @@ msgstr "Wiederherstellung von Large Object mit OID %u" msgid "could not create large object %u: %s" msgstr "konnte Large Object %u nicht erstellen: %s" -#: pg_backup_archiver.c:1486 pg_dump.c:3888 +#: 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" @@ -973,12 +973,12 @@ msgstr "konnte Standardausgabe nicht zum Anhängen öffnen: %m" msgid "unrecognized file format \"%d\"" msgstr "nicht erkanntes Dateiformat »%d«" -#: pg_backup_archiver.c:2527 pg_backup_archiver.c:4647 +#: 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:2531 pg_backup_archiver.c:4660 +#: pg_backup_archiver.c:2531 pg_backup_archiver.c:4661 #, c-format msgid "worker process failed: exit code %d" msgstr "Arbeitsprozess fehlgeschlagen: Code %d" @@ -998,137 +998,137 @@ msgstr "Wiederherstellung von Tabellen mit WITH OIDS wird nicht mehr unterstütz msgid "unrecognized encoding \"%s\"" msgstr "nicht erkannte Kodierung »%s«" -#: pg_backup_archiver.c:2823 +#: pg_backup_archiver.c:2824 #, c-format msgid "invalid ENCODING item: %s" msgstr "ungültiger ENCODING-Eintrag: %s" -#: pg_backup_archiver.c:2841 +#: pg_backup_archiver.c:2842 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "ungültiger STDSTRINGS-Eintrag: %s" -#: pg_backup_archiver.c:2866 +#: pg_backup_archiver.c:2867 #, c-format msgid "schema \"%s\" not found" msgstr "Schema »%s« nicht gefunden" -#: pg_backup_archiver.c:2873 +#: pg_backup_archiver.c:2874 #, c-format msgid "table \"%s\" not found" msgstr "Tabelle »%s« nicht gefunden" -#: pg_backup_archiver.c:2880 +#: pg_backup_archiver.c:2881 #, c-format msgid "index \"%s\" not found" msgstr "Index »%s« nicht gefunden" -#: pg_backup_archiver.c:2887 +#: pg_backup_archiver.c:2888 #, c-format msgid "function \"%s\" not found" msgstr "Funktion »%s« nicht gefunden" -#: pg_backup_archiver.c:2894 +#: pg_backup_archiver.c:2895 #, c-format msgid "trigger \"%s\" not found" msgstr "Trigger »%s« nicht gefunden" -#: pg_backup_archiver.c:3325 +#: 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:3457 +#: 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" -#: pg_backup_archiver.c:3518 +#: 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" -#: pg_backup_archiver.c:3567 +#: 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" -#: pg_backup_archiver.c:3616 +#: 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:3717 +#: 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:4004 +#: 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:4018 +#: 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:4023 +#: 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:4027 +#: 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:4037 +#: 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:4059 +#: 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:4095 +#: pg_backup_archiver.c:4096 #, c-format msgid "invalid creation date in header" msgstr "ungültiges Erstellungsdatum im Kopf" -#: pg_backup_archiver.c:4229 +#: pg_backup_archiver.c:4230 #, c-format msgid "processing item %d %s %s" msgstr "verarbeite Element %d %s %s" -#: pg_backup_archiver.c:4314 +#: pg_backup_archiver.c:4315 #, c-format msgid "entering main parallel loop" msgstr "Eintritt in Hauptparallelschleife" -#: pg_backup_archiver.c:4325 +#: pg_backup_archiver.c:4326 #, c-format msgid "skipping item %d %s %s" msgstr "Element %d %s %s wird übersprungen" -#: pg_backup_archiver.c:4334 +#: pg_backup_archiver.c:4335 #, c-format msgid "launching item %d %s %s" msgstr "starte Element %d %s %s" -#: pg_backup_archiver.c:4388 +#: pg_backup_archiver.c:4389 #, c-format msgid "finished main parallel loop" msgstr "Hauptparallelschleife beendet" -#: pg_backup_archiver.c:4424 +#: 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:4966 +#: 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" @@ -1215,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:1830 +#: 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:1831 +#: 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" @@ -1230,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:1677 pg_dumpall.c:1779 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1726 pg_dumpall.c:1828 msgid "Password: " msgstr "Passwort: " @@ -1245,17 +1245,17 @@ msgid "reconnection failed: %s" msgstr "Wiederverbindung fehlgeschlagen: %s" #: 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 +#: 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:1893 pg_dumpall.c:1916 +#: 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:1894 pg_dumpall.c:1917 +#: pg_backup_db.c:273 pg_dumpall.c:1943 pg_dumpall.c:1966 #, c-format msgid "Query was: %s" msgstr "Anfrage war: %s" @@ -1291,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:2283 +#: 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«" @@ -1560,7 +1560,7 @@ msgstr "" "%s gibt eine Datenbank als Textdatei oder in anderen Formaten aus.\n" "\n" -#: pg_dump.c:1093 pg_dumpall.c:635 pg_restore.c:452 +#: pg_dump.c:1093 pg_dumpall.c:636 pg_restore.c:452 #, c-format msgid "Usage:\n" msgstr "Aufruf:\n" @@ -1570,7 +1570,7 @@ msgstr "Aufruf:\n" msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [DBNAME]\n" -#: pg_dump.c:1096 pg_dumpall.c:638 pg_restore.c:455 +#: pg_dump.c:1096 pg_dumpall.c:639 pg_restore.c:455 #, c-format msgid "" "\n" @@ -1598,12 +1598,12 @@ msgstr "" 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:1101 pg_dumpall.c:640 +#: 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:1102 pg_dumpall.c:641 +#: 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" @@ -1617,12 +1617,12 @@ msgstr "" " -Z, --compress=METHODE[:DETAIL]\n" " wie angegeben komprimieren\n" -#: pg_dump.c:1105 pg_dumpall.c:642 +#: 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:1106 pg_dumpall.c:670 +#: 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 "" @@ -1636,12 +1636,12 @@ msgstr "" " --sync-method=METHODE Methode zum Synchronisieren von Dateien auf\n" " Festplatte setzen\n" -#: pg_dump.c:1108 pg_dumpall.c:643 +#: 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:1110 pg_dumpall.c:644 +#: pg_dump.c:1110 pg_dumpall.c:645 #, c-format msgid "" "\n" @@ -1650,7 +1650,7 @@ msgstr "" "\n" "Optionen die den Inhalt der Ausgabe kontrollieren:\n" -#: pg_dump.c:1111 pg_dumpall.c:645 +#: 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" @@ -1692,7 +1692,7 @@ msgstr "" 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:1119 pg_dumpall.c:647 +#: 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" @@ -1716,7 +1716,7 @@ msgstr "" " -O, --no-owner Wiederherstellung der Objekteigentümerschaft im\n" " »plain text«-Format auslassen\n" -#: pg_dump.c:1124 pg_dumpall.c:651 +#: 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" @@ -1736,31 +1736,31 @@ msgstr " -t, --table=MUSTER nur die angegebene(n) Tabelle(n) ausgeben 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:1128 pg_dumpall.c:654 +#: 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:1129 pg_dumpall.c:655 +#: 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:1130 pg_dumpall.c:656 +#: 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:1131 pg_dumpall.c:657 +#: 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:1132 pg_dumpall.c:658 pg_restore.c:483 +#: 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 "" @@ -1808,7 +1808,7 @@ msgstr "" " Daten der angegebenen Tabelle(n) NICHT ausgeben,\n" " einschließlich abgeleiteter und Partitionstabellen\n" -#: pg_dump.c:1143 pg_dumpall.c:660 +#: 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" @@ -1822,7 +1822,7 @@ 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:662 pg_restore.c:487 +#: 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" @@ -1838,69 +1838,69 @@ msgstr "" " Daten von Fremdtabellen auf Fremdservern, die\n" " mit MUSTER übereinstimmen, mit sichern\n" -#: pg_dump.c:1150 pg_dumpall.c:663 +#: 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:1151 pg_dumpall.c:664 +#: 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:1152 pg_dumpall.c:665 +#: 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:1153 pg_dumpall.c:666 +#: 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:1154 pg_dumpall.c:668 +#: 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:1155 pg_dumpall.c:669 +#: 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:1156 pg_dumpall.c:671 +#: 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:1157 pg_dumpall.c:672 +#: 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:1158 pg_dumpall.c:673 +#: 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:1159 pg_dumpall.c:674 +#: 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:1160 pg_dumpall.c:675 +#: 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:1161 pg_dumpall.c:676 +#: 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:1162 pg_dumpall.c:677 +#: 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" @@ -1940,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:1170 pg_dumpall.c:678 pg_restore.c:500 +#: pg_dump.c:1170 pg_dumpall.c:679 pg_restore.c:500 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1952,7 +1952,7 @@ msgstr "" " OWNER Befehle verwenden, um Eigentümerschaft zu\n" " setzen\n" -#: pg_dump.c:1174 pg_dumpall.c:682 pg_restore.c:504 +#: pg_dump.c:1174 pg_dumpall.c:683 pg_restore.c:504 #, c-format msgid "" "\n" @@ -1966,32 +1966,32 @@ msgstr "" msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=DBNAME auszugebende Datenbank\n" -#: pg_dump.c:1176 pg_dumpall.c:684 pg_restore.c:505 +#: 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:1177 pg_dumpall.c:686 pg_restore.c:506 +#: 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:1178 pg_dumpall.c:687 pg_restore.c:507 +#: 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:1179 pg_dumpall.c:688 pg_restore.c:508 +#: 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:1180 pg_dumpall.c:689 pg_restore.c:509 +#: 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:1181 pg_dumpall.c:690 +#: 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" @@ -2009,12 +2009,12 @@ msgstr "" "PGDATABASE verwendet.\n" "\n" -#: pg_dump.c:1185 pg_dumpall.c:694 pg_restore.c:516 +#: 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:1186 pg_dumpall.c:695 pg_restore.c:517 +#: 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" @@ -2024,444 +2024,444 @@ msgstr "%s Homepage: <%s>\n" msgid "invalid client encoding \"%s\" specified" msgstr "ungültige Clientkodierung »%s« angegeben" -#: pg_dump.c:1352 +#: 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:1417 +#: pg_dump.c:1418 #, c-format msgid "invalid output format \"%s\" specified" msgstr "ungültiges Ausgabeformat »%s« angegeben" -#: pg_dump.c:1458 pg_dump.c:1514 pg_dump.c:1567 pg_dumpall.c:1467 +#: 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:1466 +#: 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:1519 +#: 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:1572 +#: 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:1643 +#: 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:1665 +#: 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:1692 +#: 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:1695 +#: 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:2154 +#: pg_dump.c:2155 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "gebe Inhalt der Tabelle »%s.%s« aus" -#: pg_dump.c:2264 +#: 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:2265 pg_dump.c:2275 +#: pg_dump.c:2266 pg_dump.c:2276 #, c-format msgid "Error message from server: %s" msgstr "Fehlermeldung vom Server: %s" -#: pg_dump.c:2266 pg_dump.c:2276 +#: pg_dump.c:2267 pg_dump.c:2277 #, c-format msgid "Command was: %s" msgstr "Die Anweisung war: %s" -#: pg_dump.c:2274 +#: 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:2365 +#: 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:3067 +#: pg_dump.c:3068 #, c-format msgid "saving database definition" msgstr "sichere Datenbankdefinition" -#: pg_dump.c:3176 +#: pg_dump.c:3177 #, c-format msgid "unrecognized locale provider: %s" msgstr "unbekannter Locale-Provider: %s" -#: pg_dump.c:3537 +#: pg_dump.c:3538 #, c-format msgid "saving encoding = %s" msgstr "sichere Kodierung = %s" -#: pg_dump.c:3562 +#: pg_dump.c:3563 #, c-format msgid "saving \"standard_conforming_strings = %s\"" msgstr "sichere »standard_conforming_strings = %s«" -#: pg_dump.c:3601 +#: 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:3620 +#: pg_dump.c:3621 #, c-format msgid "saving \"search_path = %s\"" msgstr "sichere »search_path = %s«" -#: pg_dump.c:3656 +#: pg_dump.c:3657 #, c-format msgid "reading large objects" msgstr "lese Large Objects" -#: pg_dump.c:3877 +#: pg_dump.c:3878 #, c-format msgid "saving large objects \"%s\"" msgstr "sichere Large Objects »%s«" -#: pg_dump.c:3898 +#: 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:4001 +#: pg_dump.c:4002 #, c-format msgid "reading row-level security policies" msgstr "lese Policys für Sicherheit auf Zeilenebene" -#: pg_dump.c:4142 +#: pg_dump.c:4143 #, c-format msgid "unexpected policy command type: %c" msgstr "unerwarteter Policy-Befehlstyp: %c" -#: pg_dump.c:4592 pg_dump.c:5150 pg_dump.c:12362 pg_dump.c:18246 -#: pg_dump.c:18248 pg_dump.c:18870 +#: 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:4806 +#: 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:5012 +#: pg_dump.c:5013 #, c-format msgid "subscription with OID %u does not exist" msgstr "Subskription mit OID %u existiert nicht" -#: pg_dump.c:5019 +#: 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:5582 +#: 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:5727 +#: pg_dump.c:5728 #, c-format msgid "schema with OID %u does not exist" msgstr "Schema mit OID %u existiert nicht" -#: pg_dump.c:7209 pg_dump.c:17617 +#: 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:7352 +#: 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:7583 pg_dump.c:7857 pg_dump.c:8304 pg_dump.c:8918 pg_dump.c:9040 -#: pg_dump.c:9188 +#: 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:7587 +#: pg_dump.c:7590 #, c-format msgid "unexpected index data for table \"%s\"" msgstr "unerwartete Indexdaten für Tabelle »%s«" -#: pg_dump.c:8089 +#: 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:8922 +#: pg_dump.c:8925 #, c-format msgid "unexpected column data for table \"%s\"" msgstr "unerwartete Spaltendaten für Tabelle »%s«" -#: pg_dump.c:8951 +#: pg_dump.c:8954 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "ungültige Spaltennummerierung in Tabelle »%s«" -#: pg_dump.c:9002 +#: pg_dump.c:9005 #, c-format msgid "finding table default expressions" msgstr "finde Tabellenvorgabeausdrücke" -#: pg_dump.c:9044 +#: 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:9138 +#: pg_dump.c:9141 #, c-format msgid "finding table check constraints" msgstr "finde Tabellen-Check-Constraints" -#: pg_dump.c:9192 +#: 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:9196 +#: pg_dump.c:9199 #, c-format msgid "The system catalogs might be corrupted." msgstr "Die Systemkataloge sind wahrscheinlich verfälscht." -#: pg_dump.c:9886 +#: pg_dump.c:9889 #, c-format msgid "role with OID %u does not exist" msgstr "Rolle mit OID %u existiert nicht" -#: pg_dump.c:9998 pg_dump.c:10027 +#: 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:10574 +#: pg_dump.c:10577 #, c-format msgid "missing metadata for large objects \"%s\"" msgstr "fehlende Metadaten für Large Objects »%s«" -#: pg_dump.c:10857 +#: 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:12431 +#: 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:12481 pg_dump.c:14377 +#: 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:12611 pg_dump.c:12717 pg_dump.c:12724 +#: 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:12650 +#: 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:12653 +#: 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:12743 +#: 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:12760 +#: 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:12781 +#: 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:12926 +#: 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:13096 +#: 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:13164 +#: 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:13838 pg_dump.c:13906 +#: pg_dump.c:13841 pg_dump.c:13909 #, c-format msgid "unrecognized collation provider: %s" msgstr "unbekannter Sortierfolgen-Provider: %s" -#: pg_dump.c:13847 pg_dump.c:13854 pg_dump.c:13865 pg_dump.c:13875 -#: pg_dump.c:13890 +#: 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:14296 +#: pg_dump.c:14299 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "unbekannter aggfinalmodify-Wert für Aggregat »%s«" -#: pg_dump.c:14352 +#: pg_dump.c:14355 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "unbekannter aggmfinalmodify-Wert für Aggregat »%s«" -#: pg_dump.c:15069 +#: pg_dump.c:15072 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "unbekannter Objekttyp in den Vorgabeprivilegien: %d" -#: pg_dump.c:15085 +#: 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:15169 +#: 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:15194 +#: 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:15737 +#: 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:15740 +#: 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:15747 +#: 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:15832 +#: 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:16819 +#: 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:16897 +#: pg_dump.c:16900 #, c-format msgid "could not parse index statistic columns" msgstr "konnte Indexstatistikspalten nicht interpretieren" -#: pg_dump.c:16899 +#: pg_dump.c:16902 #, c-format msgid "could not parse index statistic values" msgstr "konnte Indexstatistikwerte nicht interpretieren" -#: pg_dump.c:16901 +#: 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:17116 +#: pg_dump.c:17119 #, c-format msgid "missing index for constraint \"%s\"" msgstr "fehlender Index für Constraint »%s«" -#: pg_dump.c:17351 +#: pg_dump.c:17354 #, c-format msgid "unrecognized constraint type: %c" msgstr "unbekannter Constraint-Typ: %c" -#: pg_dump.c:17452 pg_dump.c:17681 +#: 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:17484 +#: pg_dump.c:17487 #, c-format msgid "unrecognized sequence type: %s" msgstr "unbekannter Sequenztyp: %s" -#: pg_dump.c:17998 +#: 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:18151 +#: pg_dump.c:18155 #, c-format msgid "could not find referenced extension %u" msgstr "konnte referenzierte Erweiterung %u nicht finden" -#: pg_dump.c:18250 +#: 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:18382 +#: pg_dump.c:18386 #, c-format msgid "reading dependency data" msgstr "lese Abhängigkeitsdaten" -#: pg_dump.c:18468 +#: pg_dump.c:18472 #, c-format msgid "no referencing object %u %u" msgstr "kein referenzierendes Objekt %u %u" -#: pg_dump.c:18479 +#: pg_dump.c:18483 #, c-format msgid "no referenced object %u %u" msgstr "kein referenziertes Objekt %u %u" -#: pg_dump.c:18904 pg_dump.c:18942 pg_dumpall.c:1962 pg_restore.c:551 +#: 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" @@ -2534,7 +2534,7 @@ msgstr "Optionen -g/--globals-only und -t/--tablespaces-only können nicht zusam 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:474 pg_dumpall.c:1771 +#: 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" @@ -2548,7 +2548,7 @@ msgstr "" "konnte nicht mit Datenbank »postgres« oder »template1« verbinden\n" "Bitte geben Sie eine alternative Datenbank an." -#: pg_dumpall.c:634 +#: pg_dumpall.c:635 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2557,82 +2557,82 @@ msgstr "" "%s gibt einen PostgreSQL-Datenbankcluster in eine SQL-Skriptdatei aus.\n" "\n" -#: pg_dumpall.c:636 +#: pg_dumpall.c:637 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPTION]...\n" -#: pg_dumpall.c:639 +#: 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:646 +#: 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:648 +#: 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:649 pg_restore.c:475 +#: 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:650 +#: 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:652 +#: 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:653 +#: 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:659 +#: 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:667 +#: 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:683 +#: 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:685 +#: pg_dumpall.c:686 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=DBNAME alternative Standarddatenbank\n" -#: pg_dumpall.c:692 +#: pg_dumpall.c:693 #, c-format msgid "" "\n" @@ -2645,67 +2645,73 @@ msgstr "" "Standardausgabe geschrieben.\n" "\n" -#: pg_dumpall.c:837 +#: pg_dumpall.c:838 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "mit »pg_« anfangender Rollenname übersprungen (%s)" -#: pg_dumpall.c:1059 +#. 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:1194 +#: 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:1321 +#: 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:1528 +#: pg_dumpall.c:1577 #, c-format msgid "excluding database \"%s\"" msgstr "Datenbank »%s« übersprungen" -#: pg_dumpall.c:1532 +#: pg_dumpall.c:1581 #, c-format msgid "dumping database \"%s\"" msgstr "Ausgabe der Datenbank »%s«" -#: pg_dumpall.c:1563 +#: 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:1569 +#: 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:1613 +#: pg_dumpall.c:1662 #, c-format msgid "running \"%s\"" msgstr "führe »%s« aus" -#: pg_dumpall.c:1814 +#: pg_dumpall.c:1863 #, c-format msgid "could not get server version" msgstr "konnte Version des Servers nicht ermitteln" -#: pg_dumpall.c:1817 +#: pg_dumpall.c:1866 #, c-format msgid "could not parse server version \"%s\"" msgstr "konnte Versionszeichenkette »%s« nicht entziffern" -#: pg_dumpall.c:1887 pg_dumpall.c:1910 +#: pg_dumpall.c:1936 pg_dumpall.c:1959 #, c-format msgid "executing %s" msgstr "führe %s aus" -#: pg_dumpall.c:1982 +#: pg_dumpall.c:2031 msgid "unsupported filter object" msgstr "nicht unterstütztes Filterobjekt" diff --git a/src/bin/pg_dump/po/fr.po b/src/bin/pg_dump/po/fr.po index 7e965dff10330..73f909f7059e5 100644 --- a/src/bin/pg_dump/po/fr.po +++ b/src/bin/pg_dump/po/fr.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-08-29 17:52+0000\n" -"PO-Revision-Date: 2024-09-16 16:28+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,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.5\n" +"X-Generator: Poedit 3.6\n" #: ../../../src/common/logging.c:276 #, c-format @@ -238,12 +238,12 @@ msgstr "%s doit être compris entre %d et %d" msgid "unrecognized sync method: %s" msgstr "méthode de synchronisation non reconnu : %s" -#: ../../fe_utils/string_utils.c:434 +#: ../../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:607 +#: ../../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" @@ -509,13 +509,13 @@ msgid "could not read from input file: %s" msgstr "n'a pas pu lire à partir du fichier en entrée : %s" #: compress_gzip.c:295 compress_none.c:97 compress_none.c:139 -#: compress_zstd.c:373 pg_backup_custom.c:651 +#: 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:371 pg_backup_custom.c:649 pg_backup_directory.c:565 +#: 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" @@ -556,18 +556,18 @@ msgstr "n'a pas pu terminer la décompression : %s" 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: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 "n'a pas pu initialiser la bibliothèque de compression" -#: 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 "n'a pas pu décompresser les données : %s" -#: compress_zstd.c:501 +#: compress_zstd.c:502 #, c-format msgid "unhandled mode \"%s\"" msgstr "mode « %s » non géré" @@ -828,7 +828,7 @@ msgstr "restauration du « Large Object » d'OID %u" msgid "could not create large object %u: %s" msgstr "n'a pas pu créer le « Large Object » %u : %s" -#: pg_backup_archiver.c:1486 pg_dump.c:3888 +#: 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" @@ -979,12 +979,12 @@ msgstr "n'a pas pu ouvrir stdout pour l'ajout : %m" msgid "unrecognized file format \"%d\"" msgstr "format de fichier « %d » non reconnu" -#: pg_backup_archiver.c:2527 pg_backup_archiver.c:4647 +#: 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:2531 pg_backup_archiver.c:4660 +#: 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" @@ -1004,137 +1004,137 @@ msgstr "la restauration des tables avec WITH OIDS n'est plus supportée" msgid "unrecognized encoding \"%s\"" msgstr "encodage « %s » non reconnu" -#: pg_backup_archiver.c:2823 +#: pg_backup_archiver.c:2824 #, c-format msgid "invalid ENCODING item: %s" msgstr "élément ENCODING invalide : %s" -#: pg_backup_archiver.c:2841 +#: pg_backup_archiver.c:2842 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "élément STDSTRINGS invalide : %s" -#: pg_backup_archiver.c:2866 +#: pg_backup_archiver.c:2867 #, c-format msgid "schema \"%s\" not found" msgstr "schéma « %s » non trouvé" -#: pg_backup_archiver.c:2873 +#: pg_backup_archiver.c:2874 #, c-format msgid "table \"%s\" not found" msgstr "table « %s » non trouvée" -#: pg_backup_archiver.c:2880 +#: pg_backup_archiver.c:2881 #, c-format msgid "index \"%s\" not found" msgstr "index « %s » non trouvé" -#: pg_backup_archiver.c:2887 +#: pg_backup_archiver.c:2888 #, c-format msgid "function \"%s\" not found" msgstr "fonction « %s » non trouvée" -#: pg_backup_archiver.c:2894 +#: pg_backup_archiver.c:2895 #, c-format msgid "trigger \"%s\" not found" msgstr "trigger « %s » non trouvé" -#: pg_backup_archiver.c:3325 +#: 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:3457 +#: 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" -#: pg_backup_archiver.c:3518 +#: 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" -#: pg_backup_archiver.c:3567 +#: 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" -#: pg_backup_archiver.c:3616 +#: 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:3717 +#: 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:4004 +#: 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:4018 +#: 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:4023 +#: 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:4027 +#: 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:4037 +#: 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:4059 +#: 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 "l'archive est compressée mais cette installation ne supporte pas la compression (%s) -- aucune donnée ne sera disponible" -#: pg_backup_archiver.c:4095 +#: 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:4229 +#: 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:4314 +#: 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:4325 +#: 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:4334 +#: 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:4388 +#: pg_backup_archiver.c:4389 #, c-format msgid "finished main parallel loop" msgstr "fin de la boucle parallèle principale" -#: pg_backup_archiver.c:4424 +#: 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:4966 +#: 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" @@ -1225,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:1830 +#: 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:1831 +#: 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" @@ -1240,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:1677 pg_dumpall.c:1779 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1726 pg_dumpall.c:1828 msgid "Password: " msgstr "Mot de passe : " @@ -1255,17 +1255,17 @@ msgid "reconnection failed: %s" msgstr "échec de la reconnexion : %s" #: 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 +#: 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:1893 pg_dumpall.c:1916 +#: 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:273 pg_dumpall.c:1894 pg_dumpall.c:1917 +#: 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" @@ -1301,7 +1301,7 @@ msgstr "erreur renvoyée par PQputCopyEnd : %s" msgid "COPY failed for table \"%s\": %s" msgstr "COPY échoué pour la table « %s » : %s" -#: pg_backup_db.c:521 pg_dump.c:2283 +#: 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 »" @@ -1571,7 +1571,7 @@ msgstr "" "formats.\n" "\n" -#: pg_dump.c:1093 pg_dumpall.c:635 pg_restore.c:452 +#: pg_dump.c:1093 pg_dumpall.c:636 pg_restore.c:452 #, c-format msgid "Usage:\n" msgstr "Usage :\n" @@ -1581,7 +1581,7 @@ msgstr "Usage :\n" msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [BASE]\n" -#: pg_dump.c:1096 pg_dumpall.c:638 pg_restore.c:455 +#: pg_dump.c:1096 pg_dumpall.c:639 pg_restore.c:455 #, c-format msgid "" "\n" @@ -1611,12 +1611,12 @@ msgstr "" " -j, --jobs=NOMBRE utilise ce nombre de jobs en parallèle pour la\n" " sauvegarde\n" -#: pg_dump.c:1101 pg_dumpall.c:640 +#: 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:1102 pg_dumpall.c:641 +#: 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" @@ -1630,14 +1630,14 @@ msgstr "" " -Z, --compress=METHODE[:DETAIL]\n" " compresse comme indiqué\n" -#: pg_dump.c:1105 pg_dumpall.c:642 +#: 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:1106 pg_dumpall.c:670 +#: 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 "" @@ -1649,12 +1649,12 @@ msgstr "" 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:643 +#: 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:1110 pg_dumpall.c:644 +#: pg_dump.c:1110 pg_dumpall.c:645 #, c-format msgid "" "\n" @@ -1663,7 +1663,7 @@ msgstr "" "\n" "Options contrôlant le contenu en sortie :\n" -#: pg_dump.c:1111 pg_dumpall.c:645 +#: 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" @@ -1707,7 +1707,7 @@ msgstr "" 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:1119 pg_dumpall.c:647 +#: 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" @@ -1731,7 +1731,7 @@ msgstr "" " -O, --no-owner ne sauvegarde pas les propriétaires des objets\n" " lors de l'utilisation du format texte\n" -#: pg_dump.c:1124 pg_dumpall.c:651 +#: pg_dump.c:1124 pg_dumpall.c:652 #, c-format msgid " -s, --schema-only dump only the schema, no data\n" msgstr "" @@ -1755,26 +1755,26 @@ msgstr " -t, --table=MOTIF sauvegarde uniquement les tables indiqué 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:1128 pg_dumpall.c:654 +#: 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:1129 pg_dumpall.c:655 +#: 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:1130 pg_dumpall.c:656 +#: 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:1131 pg_dumpall.c:657 +#: pg_dump.c:1131 pg_dumpall.c:658 #, c-format msgid " --disable-dollar-quoting disable dollar quoting, use SQL standard quoting\n" msgstr "" @@ -1782,7 +1782,7 @@ msgstr "" " dans le but de respecter le standard SQL en\n" " matière de guillemets\n" -#: pg_dump.c:1132 pg_dumpall.c:658 pg_restore.c:483 +#: 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 "" @@ -1829,7 +1829,7 @@ 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:660 +#: pg_dump.c:1143 pg_dumpall.c:661 #, c-format msgid " --extra-float-digits=NUM override default setting for extra_float_digits\n" msgstr "" @@ -1845,7 +1845,7 @@ 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:662 pg_restore.c:487 +#: 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 "" @@ -1862,79 +1862,79 @@ 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:1150 pg_dumpall.c:663 +#: 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:1151 pg_dumpall.c:664 +#: 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:1152 pg_dumpall.c:665 +#: 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:1153 pg_dumpall.c:666 +#: 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:1154 pg_dumpall.c:668 +#: 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:1155 pg_dumpall.c:669 +#: 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:1156 pg_dumpall.c:671 +#: 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:1157 pg_dumpall.c:672 +#: 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:1158 pg_dumpall.c:673 +#: 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:1159 pg_dumpall.c:674 +#: 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:1160 pg_dumpall.c:675 +#: 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:1161 pg_dumpall.c:676 +#: 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:1162 pg_dumpall.c:677 +#: 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" @@ -1974,7 +1974,7 @@ msgid "" " 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:678 pg_restore.c:500 +#: pg_dump.c:1170 pg_dumpall.c:679 pg_restore.c:500 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1986,7 +1986,7 @@ msgstr "" " au lieu des commandes ALTER OWNER pour modifier\n" " les propriétaires\n" -#: pg_dump.c:1174 pg_dumpall.c:682 pg_restore.c:504 +#: pg_dump.c:1174 pg_dumpall.c:683 pg_restore.c:504 #, c-format msgid "" "\n" @@ -2000,36 +2000,36 @@ msgstr "" msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=BASE base de données à sauvegarder\n" -#: pg_dump.c:1176 pg_dumpall.c:684 pg_restore.c:505 +#: 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:1177 pg_dumpall.c:686 pg_restore.c:506 +#: 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:1178 pg_dumpall.c:687 pg_restore.c:507 +#: 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:1179 pg_dumpall.c:688 pg_restore.c:508 +#: 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:1180 pg_dumpall.c:689 pg_restore.c:509 +#: 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:1181 pg_dumpall.c:690 +#: 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" @@ -2047,12 +2047,12 @@ msgstr "" "d'environnement PGDATABASE est alors utilisée.\n" "\n" -#: pg_dump.c:1185 pg_dumpall.c:694 pg_restore.c:516 +#: 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:1186 pg_dumpall.c:695 pg_restore.c:517 +#: 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" @@ -2062,444 +2062,444 @@ msgstr "Page d'accueil de %s : <%s>\n" msgid "invalid client encoding \"%s\" specified" msgstr "encodage client indiqué (« %s ») invalide" -#: pg_dump.c:1352 +#: 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:1417 +#: pg_dump.c:1418 #, c-format msgid "invalid output format \"%s\" specified" msgstr "format de sortie « %s » invalide" -#: pg_dump.c:1458 pg_dump.c:1514 pg_dump.c:1567 pg_dumpall.c:1467 +#: 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:1466 +#: 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:1519 +#: 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:1572 +#: 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:1643 +#: 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:1665 +#: 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:1692 +#: 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:1695 +#: 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:2154 +#: 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:2264 +#: 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:2265 pg_dump.c:2275 +#: 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:2266 pg_dump.c:2276 +#: pg_dump.c:2267 pg_dump.c:2277 #, c-format msgid "Command was: %s" msgstr "La commande était : %s" -#: pg_dump.c:2274 +#: 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:2365 +#: 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:3067 +#: 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:3176 +#: pg_dump.c:3177 #, c-format msgid "unrecognized locale provider: %s" msgstr "fournisseur de locale non reconnu : %s" -#: pg_dump.c:3537 +#: pg_dump.c:3538 #, c-format msgid "saving encoding = %s" msgstr "encodage de la sauvegarde = %s" -#: pg_dump.c:3562 +#: pg_dump.c:3563 #, c-format msgid "saving \"standard_conforming_strings = %s\"" msgstr "sauvegarde de « standard_conforming_strings = %s »" -#: pg_dump.c:3601 +#: 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:3620 +#: pg_dump.c:3621 #, c-format msgid "saving \"search_path = %s\"" msgstr "sauvegarde de « search_path = %s »" -#: pg_dump.c:3656 +#: pg_dump.c:3657 #, c-format msgid "reading large objects" msgstr "lecture des « Large Objects »" -#: pg_dump.c:3877 +#: pg_dump.c:3878 #, c-format msgid "saving large objects \"%s\"" msgstr "sauvegarde des « Large Objects » « %s »" -#: pg_dump.c:3898 +#: 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:4001 +#: 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:4142 +#: pg_dump.c:4143 #, c-format msgid "unexpected policy command type: %c" msgstr "type de commande inattendu pour la politique : %c" -#: pg_dump.c:4592 pg_dump.c:5150 pg_dump.c:12362 pg_dump.c:18246 -#: pg_dump.c:18248 pg_dump.c:18870 +#: 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:4806 +#: 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:5012 +#: 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:5019 +#: 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:5582 +#: 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:5727 +#: 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:7209 pg_dump.c:17617 +#: 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:7352 +#: 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:7583 pg_dump.c:7857 pg_dump.c:8304 pg_dump.c:8918 pg_dump.c:9040 -#: pg_dump.c:9188 +#: 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:7587 +#: 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:8089 +#: 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:8922 +#: 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:8951 +#: 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:9002 +#: pg_dump.c:9005 #, c-format msgid "finding table default expressions" msgstr "recherche des expressions par défaut de la table" -#: pg_dump.c:9044 +#: 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:9138 +#: pg_dump.c:9141 #, c-format msgid "finding table check constraints" msgstr "recherche des contraintes CHECK de la table" -#: pg_dump.c:9192 +#: 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:9196 +#: pg_dump.c:9199 #, c-format msgid "The system catalogs might be corrupted." msgstr "Les catalogues système pourraient être corrompus." -#: pg_dump.c:9886 +#: 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:9998 pg_dump.c:10027 +#: 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:10574 +#: 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:10857 +#: 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:12431 +#: 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:12481 pg_dump.c:14377 +#: 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:12611 pg_dump.c:12717 pg_dump.c:12724 +#: 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:12650 +#: 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:12653 +#: 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:12743 +#: 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:12760 +#: 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:12781 +#: 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:12926 +#: 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:13096 +#: 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:13164 +#: 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:13838 pg_dump.c:13906 +#: 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:13847 pg_dump.c:13854 pg_dump.c:13865 pg_dump.c:13875 -#: pg_dump.c:13890 +#: 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:14296 +#: 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:14352 +#: 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:15069 +#: 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:15085 +#: 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:15169 +#: 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:15194 +#: 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:15737 +#: 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:15740 +#: 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:15747 +#: 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:15832 +#: 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:16819 +#: 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:16897 +#: 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:16899 +#: 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:16901 +#: 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:17116 +#: pg_dump.c:17133 #, c-format msgid "missing index for constraint \"%s\"" msgstr "index manquant pour la contrainte « %s »" -#: pg_dump.c:17351 +#: pg_dump.c:17368 #, c-format msgid "unrecognized constraint type: %c" msgstr "type de contrainte inconnu : %c" -#: pg_dump.c:17452 pg_dump.c:17681 +#: 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:17484 +#: pg_dump.c:17501 #, c-format msgid "unrecognized sequence type: %s" msgstr "type de séquence non reconnu : « %s »" -#: pg_dump.c:17998 +#: 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:18151 +#: 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:18250 +#: 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:18382 +#: pg_dump.c:18400 #, c-format msgid "reading dependency data" msgstr "lecture des données de dépendance" -#: pg_dump.c:18468 +#: pg_dump.c:18486 #, c-format msgid "no referencing object %u %u" msgstr "pas d'objet référant %u %u" -#: pg_dump.c:18479 +#: pg_dump.c:18497 #, c-format msgid "no referenced object %u %u" msgstr "pas d'objet référencé %u %u" -#: pg_dump.c:18904 pg_dump.c:18942 pg_dumpall.c:1962 pg_restore.c:551 +#: 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" @@ -2572,7 +2572,7 @@ msgstr "les options « -g/--globals-only » et « -t/--tablespaces-only » ne pe 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:474 pg_dumpall.c:1771 +#: 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 »" @@ -2586,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:634 +#: pg_dumpall.c:635 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2596,84 +2596,84 @@ msgstr "" "commandes SQL.\n" "\n" -#: pg_dumpall.c:636 +#: pg_dumpall.c:637 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPTION]...\n" -#: pg_dumpall.c:639 +#: 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:646 +#: 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:648 +#: 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:649 pg_restore.c:475 +#: 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:650 +#: 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:652 +#: 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:653 +#: 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:659 +#: 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:661 +#: 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:667 +#: 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:683 +#: 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:685 +#: 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:692 +#: pg_dumpall.c:693 #, c-format msgid "" "\n" @@ -2686,67 +2686,73 @@ msgstr "" "standard.\n" "\n" -#: pg_dumpall.c:837 +#: 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:1059 +#. 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:1194 +#: 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:1321 +#: 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:1528 +#: pg_dumpall.c:1577 #, c-format msgid "excluding database \"%s\"" msgstr "exclusion de la base de données « %s »" -#: pg_dumpall.c:1532 +#: pg_dumpall.c:1581 #, c-format msgid "dumping database \"%s\"" msgstr "sauvegarde de la base de données « %s »" -#: pg_dumpall.c:1563 +#: 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:1569 +#: 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:1613 +#: pg_dumpall.c:1662 #, c-format msgid "running \"%s\"" msgstr "exécute « %s »" -#: pg_dumpall.c:1814 +#: 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:1817 +#: 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:1887 pg_dumpall.c:1910 +#: pg_dumpall.c:1936 pg_dumpall.c:1959 #, c-format msgid "executing %s" msgstr "exécution %s" -#: pg_dumpall.c:1982 +#: pg_dumpall.c:2031 msgid "unsupported filter object" msgstr "objet de filtre non supporté" diff --git a/src/bin/pg_dump/po/ja.po b/src/bin/pg_dump/po/ja.po index 89dc8c6716964..8ef1750d6f342 100644 --- a/src/bin/pg_dump/po/ja.po +++ b/src/bin/pg_dump/po/ja.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_dump (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-01-27 09:54+0900\n" -"PO-Revision-Date: 2025-01-27 10:54+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" @@ -22,29 +22,29 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: ../../../src/common/logging.c:279 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:286 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "警告: " -#: ../../../src/common/logging.c:297 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "詳細: " -#: ../../../src/common/logging.c:304 +#: ../../../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:108 compress_lz4.c:780 compress_lz4.c:787 compress_zstd.c:25 +#: 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" @@ -114,27 +114,27 @@ msgstr "実行する\"%s\"がありませんでした" msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "パス\"%s\"を絶対パス形式に変換できませんでした: %m" -#: ../../common/exec.c:363 +#: ../../common/exec.c:382 #, c-format msgid "could not execute command \"%s\": %m" msgstr "コマンド\"%s\"を実行できませんでした: %m" -#: ../../common/exec.c:375 +#: ../../common/exec.c:394 #, c-format msgid "could not read from command \"%s\": %m" msgstr "コマンド\"%s\"から読み取れませんでした: %m" -#: ../../common/exec.c:378 +#: ../../common/exec.c:397 #, c-format msgid "no data was returned by command \"%s\"" msgstr "コマンド\"%s\"がデータを返却しませんでした" -#: ../../common/exec.c:405 parallel.c:1611 +#: ../../common/exec.c:424 parallel.c:1609 #, c-format msgid "%s() failed: %m" msgstr "%s() が失敗しました: %m" -#: ../../common/exec.c:543 ../../common/exec.c:588 ../../common/exec.c:680 +#: ../../common/exec.c:562 ../../common/exec.c:607 ../../common/exec.c:699 msgid "out of memory" msgstr "メモリ不足です" @@ -149,45 +149,45 @@ msgstr "メモリ不足です\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "null ポインタを複製できません(内部エラー)。\n" -#: ../../common/file_utils.c:71 ../../common/file_utils.c:348 -#: ../../common/file_utils.c:407 ../../common/file_utils.c:481 +#: ../../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:77 +#: ../../common/file_utils.c:76 #, 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 +#: ../../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:131 ../../common/file_utils.c:228 +#: ../../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:152 ../../common/file_utils.c:282 +#: ../../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:170 ../../common/file_utils.c:316 +#: ../../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:419 ../../common/file_utils.c:489 +#: ../../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:499 +#: ../../common/file_utils.c:498 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m" @@ -237,242 +237,242 @@ msgstr "%sは%d..%dの範囲でなければなりません" msgid "unrecognized sync method: %s" msgstr "認識できない同期方式: %s" -#: ../../fe_utils/string_utils.c:434 +#: ../../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:607 +#: ../../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:111 +#: common.c:135 #, c-format msgid "reading extensions" msgstr "機能拡張を読み込んでいます" -#: common.c:114 +#: common.c:138 #, c-format msgid "identifying extension members" msgstr "機能拡張の構成要素を特定しています" -#: common.c:117 +#: common.c:141 #, c-format msgid "reading schemas" msgstr "スキーマを読み込んでいます" -#: common.c:126 +#: common.c:150 #, c-format msgid "reading user-defined tables" msgstr "ユーザー定義テーブルを読み込んでいます" -#: common.c:131 +#: common.c:155 #, c-format msgid "reading user-defined functions" msgstr "ユーザー定義関数を読み込んでいます" -#: common.c:135 +#: common.c:159 #, c-format msgid "reading user-defined types" msgstr "ユーザー定義型を読み込んでいます" -#: common.c:139 +#: common.c:163 #, c-format msgid "reading procedural languages" msgstr "手続き言語を読み込んでいます" -#: common.c:142 +#: common.c:166 #, c-format msgid "reading user-defined aggregate functions" msgstr "ユーザー定義集約関数を読み込んでいます" -#: common.c:145 +#: common.c:169 #, c-format msgid "reading user-defined operators" msgstr "ユーザー定義演算子を読み込んでいます" -#: common.c:148 +#: common.c:172 #, c-format msgid "reading user-defined access methods" msgstr "ユーザー定義アクセスメソッドを読み込んでいます" -#: common.c:151 +#: common.c:175 #, c-format msgid "reading user-defined operator classes" msgstr "ユーザー定義演算子クラスを読み込んでいます" -#: common.c:154 +#: common.c:178 #, c-format msgid "reading user-defined operator families" msgstr "ユーザー定義演算子族を読み込んでいます" -#: common.c:157 +#: common.c:181 #, c-format msgid "reading user-defined text search parsers" msgstr "ユーザー定義のテキスト検索パーサを読み込んでいます" -#: common.c:160 +#: common.c:184 #, c-format msgid "reading user-defined text search templates" msgstr "ユーザー定義のテキスト検索テンプレートを読み込んでいます" -#: common.c:163 +#: common.c:187 #, c-format msgid "reading user-defined text search dictionaries" msgstr "ユーザー定義のテキスト検索辞書を読み込んでいます" -#: common.c:166 +#: common.c:190 #, c-format msgid "reading user-defined text search configurations" msgstr "ユーザー定義のテキスト検索設定を読み込んでいます" -#: common.c:169 +#: common.c:193 #, c-format msgid "reading user-defined foreign-data wrappers" msgstr "ユーザー定義の外部データラッパーを読み込んでいます" -#: common.c:172 +#: common.c:196 #, c-format msgid "reading user-defined foreign servers" msgstr "ユーザー定義の外部サーバーを読み込んでいます" -#: common.c:175 +#: common.c:199 #, c-format msgid "reading default privileges" msgstr "デフォルト権限設定を読み込んでいます" -#: common.c:178 +#: common.c:202 #, c-format msgid "reading user-defined collations" msgstr "ユーザー定義の照合順序を読み込んでいます" -#: common.c:181 +#: common.c:205 #, c-format msgid "reading user-defined conversions" msgstr "ユーザー定義の変換を読み込んでいます" -#: common.c:184 +#: common.c:208 #, c-format msgid "reading type casts" msgstr "型キャストを読み込んでいます" -#: common.c:187 +#: common.c:211 #, c-format msgid "reading transforms" msgstr "変換を読み込んでいます" -#: common.c:190 +#: common.c:214 #, c-format msgid "reading table inheritance information" msgstr "テーブル継承情報を読み込んでいます" -#: common.c:193 +#: common.c:217 #, c-format msgid "reading event triggers" msgstr "イベントトリガを読み込んでいます" -#: common.c:197 +#: common.c:221 #, c-format msgid "finding extension tables" msgstr "機能拡張構成テーブルを探しています" -#: common.c:201 +#: common.c:225 #, c-format msgid "finding inheritance relationships" msgstr "継承関係を検索しています" -#: common.c:204 +#: common.c:228 #, c-format msgid "reading column info for interesting tables" msgstr "対象テーブルの列情報を読み込んでいます" -#: common.c:207 +#: common.c:231 #, c-format msgid "flagging inherited columns in subtables" msgstr "子テーブルの継承列にフラグを設定しています" -#: common.c:210 +#: common.c:234 #, c-format msgid "reading partitioning data" msgstr "パーティション情報を読み込んでいます" -#: common.c:213 +#: common.c:237 #, c-format msgid "reading indexes" msgstr "インデックスを読み込んでいます" -#: common.c:216 +#: common.c:240 #, c-format msgid "flagging indexes in partitioned tables" msgstr "パーティション親テーブルのインデックスにフラグを設定しています" -#: common.c:219 +#: common.c:243 #, c-format msgid "reading extended statistics" msgstr "拡張統計情報を読み込んでいます" -#: common.c:222 +#: common.c:246 #, c-format msgid "reading constraints" msgstr "制約を読み込んでいます" -#: common.c:225 +#: common.c:249 #, c-format msgid "reading triggers" msgstr "トリガを読み込んでいます" -#: common.c:228 +#: common.c:252 #, c-format msgid "reading rewrite rules" msgstr "書き換えルールを読み込んでいます" -#: common.c:231 +#: common.c:255 #, c-format msgid "reading policies" msgstr "ポリシを読み込んでいます" -#: common.c:234 +#: common.c:258 #, c-format msgid "reading publications" msgstr "パブリケーションを読み込んでいます" -#: common.c:237 +#: common.c:261 #, c-format msgid "reading publication membership of tables" msgstr "テーブルのパブリケーションへの所属を読み取っています" -#: common.c:240 +#: common.c:264 #, c-format msgid "reading publication membership of schemas" msgstr "スキーマのパブリケーションへの所属を読み取っています" -#: common.c:243 +#: common.c:267 #, c-format msgid "reading subscriptions" msgstr "サブスクリプションを読み込んでいます" -#: common.c:246 +#: common.c:270 #, c-format msgid "reading subscription membership of tables" msgstr "テーブルのサブスクリプションへの所属を読み取っています" -#: common.c:309 +#: 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:351 +#: common.c:375 #, c-format msgid "invalid number of parents %d for table \"%s\"" msgstr "テーブル\"%2$s\"用の親テーブルの数%1$dが不正です" -#: common.c:1087 +#: common.c:1098 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "数値配列\"%s\"のパースに失敗しました: 要素が多すぎます" -#: common.c:1099 +#: common.c:1110 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "数値配列\"%s\"のパースに失敗しました: 数値に不正な文字が含まれています" @@ -508,13 +508,13 @@ msgid "could not read from input file: %s" msgstr "入力ファイルから読み込めませんでした: %s" #: compress_gzip.c:295 compress_none.c:97 compress_none.c:139 -#: compress_zstd.c:374 pg_backup_custom.c:650 +#: 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:648 pg_backup_directory.c:565 +#: 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" @@ -571,82 +571,82 @@ msgstr "データを伸張できませんでした: %s" msgid "unhandled mode \"%s\"" msgstr "処理されないモード \"%s\"" -#: filter.c:48 +#: filter.c:49 #, c-format msgid "could not open filter file \"%s\": %m" msgstr "フィルターファイル\"%s\"をオープンできませんでした: %m" -#: filter.c:71 +#: filter.c:72 #, c-format msgid "could not close filter file \"%s\": %m" msgstr "フィルターファイル\"%s\"をクローズできませんでした: %m" -#: filter.c:164 +#: filter.c:165 #, c-format msgid "invalid format in filter read from standard input on line %d: %s" msgstr "標準入力からのフィルターの読み取り中%d行目に無効なフォーマット: %s" -#: filter.c:167 +#: filter.c:168 #, c-format msgid "invalid format in filter read from file \"%s\" on line %d: %s" msgstr "ファイル\"%s\"からのフィルターの読み取り中%d行目に無効なフォーマット: %s" -#: filter.c:240 filter.c:467 +#: filter.c:241 filter.c:468 #, c-format msgid "could not read from filter file \"%s\": %m" msgstr "フィルターファイル\"%s\"から読み取れませんでした: %m" -#: filter.c:243 +#: filter.c:244 msgid "unexpected end of file" msgstr "想定外のファイル終端です" -#: filter.c:310 +#: filter.c:311 msgid "missing object name pattern" msgstr "オブジェクト名のパターンが指定されていません" -#: filter.c:421 +#: filter.c:422 msgid "no filter command found (expected \"include\" or \"exclude\")" msgstr "フィルタコマンドが見つかりません (\"include\" または\"exclude\"が指定可能です)" -#: filter.c:432 +#: filter.c:433 msgid "invalid filter command (expected \"include\" or \"exclude\")" msgstr "不正なフィルターコマンド (\"include\"または\"exclude\"が指定可能です)" -#: filter.c:439 +#: filter.c:440 msgid "missing filter object type" msgstr "フィルターオブジェクトのタイプが指定されてません" -#: filter.c:446 +#: filter.c:447 #, c-format msgid "unsupported filter object type: \"%.*s\"" msgstr "サポートされないフィルターオブジェクトタイプ: \"%.*s\"" -#: parallel.c:253 +#: 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" @@ -655,654 +655,654 @@ msgstr "" "リレーション\"%s\"のロックを獲得できませんでした。\n" "通常これは、pg_dumpの親プロセスが初期のACCESS SHAREロックを獲得した後にだれかがテーブルに対してACCESS EXCLUSIVEロックを要求したことを意味しています。" -#: 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:263 pg_backup_archiver.c:1710 +#: 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:307 pg_backup_archiver.c:311 +#: 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:317 +#: pg_backup_archiver.c:315 #, c-format msgid "unexpected section code %d" msgstr "想定外のセクションコード %d" -#: pg_backup_archiver.c:354 +#: pg_backup_archiver.c:352 #, c-format msgid "parallel restore is not supported with this archive file format" msgstr "このアーカイブファイル形式での並列リストアはサポートしていません" -#: pg_backup_archiver.c:358 +#: 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:379 +#: pg_backup_archiver.c:377 #, c-format msgid "cannot restore from compressed archive (%s)" msgstr "圧縮アーカイブから復元できませんでした(%s)" -#: pg_backup_archiver.c:399 +#: pg_backup_archiver.c:397 #, c-format msgid "connecting to database for restore" msgstr "リストアのためデータベースに接続しています" -#: pg_backup_archiver.c:401 +#: 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:444 +#: pg_backup_archiver.c:442 #, c-format msgid "implied data-only restore" msgstr "暗黙的にデータのみのリストアを行います" -#: pg_backup_archiver.c:512 +#: pg_backup_archiver.c:510 #, c-format msgid "dropping %s %s" msgstr "%s %sを削除しています" -#: pg_backup_archiver.c:644 +#: 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:830 pg_backup_archiver.c:832 +#: 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:866 +#: pg_backup_archiver.c:864 #, c-format msgid "creating %s \"%s.%s\"" msgstr "%s \"%s.%s\"を作成しています" -#: pg_backup_archiver.c:869 +#: pg_backup_archiver.c:867 #, c-format msgid "creating %s \"%s\"" msgstr "%s \"%s\"を作成しています" -#: pg_backup_archiver.c:919 +#: pg_backup_archiver.c:917 #, c-format msgid "connecting to new database \"%s\"" msgstr "新しいデータベース\"%s\"に接続しています" -#: pg_backup_archiver.c:946 +#: pg_backup_archiver.c:944 #, c-format msgid "processing %s" msgstr "%sを処理しています" -#: pg_backup_archiver.c:968 +#: pg_backup_archiver.c:966 #, c-format msgid "processing data for table \"%s.%s\"" msgstr "テーブル\"%s.%s\"のデータを処理しています" -#: pg_backup_archiver.c:1038 +#: pg_backup_archiver.c:1036 #, c-format msgid "executing %s %s" msgstr "%s %sを実行しています" -#: pg_backup_archiver.c:1100 +#: pg_backup_archiver.c:1096 #, c-format msgid "disabling triggers for %s" msgstr "%sのトリガを無効にしています" -#: pg_backup_archiver.c:1126 +#: pg_backup_archiver.c:1122 #, c-format msgid "enabling triggers for %s" msgstr "%sのトリガを有効にしています" -#: pg_backup_archiver.c:1191 +#: 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:1383 +#: pg_backup_archiver.c:1379 #, c-format msgid "large-object output not supported in chosen format" msgstr "選択した形式ではラージオブジェクト出力をサポートしていません" -#: pg_backup_archiver.c:1446 +#: 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:1473 pg_backup_tar.c:683 +#: 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:1485 +#: pg_backup_archiver.c:1481 #, c-format msgid "could not create large object %u: %s" msgstr "ラージオブジェクト %u を作成できませんでした: %s" -#: pg_backup_archiver.c:1490 pg_dump.c:3964 +#: 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:1546 +#: pg_backup_archiver.c:1542 #, c-format msgid "could not open TOC file \"%s\": %m" msgstr "TOCファイル\"%s\"をオープンできませんでした: %m" -#: pg_backup_archiver.c:1574 +#: pg_backup_archiver.c:1570 #, c-format msgid "line ignored: %s" msgstr "行を無視しました: %s" -#: pg_backup_archiver.c:1581 pg_backup_db.c:607 +#: 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:1604 pg_backup_directory.c:219 +#: 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:1691 pg_backup_custom.c:151 pg_backup_directory.c:333 +#: 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:1693 pg_backup_custom.c:157 +#: 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:1776 +#: 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:1782 +#: pg_backup_archiver.c:1778 #, c-format msgid "could not write to large object: %s" msgstr "ラージオブジェクトに書き込めませんでした: %s" -#: pg_backup_archiver.c:1872 +#: pg_backup_archiver.c:1868 #, c-format msgid "while INITIALIZING:" msgstr "初期化中:" -#: pg_backup_archiver.c:1877 +#: pg_backup_archiver.c:1873 #, c-format msgid "while PROCESSING TOC:" msgstr "TOC処理中:" -#: pg_backup_archiver.c:1882 +#: pg_backup_archiver.c:1878 #, c-format msgid "while FINALIZING:" msgstr "終了処理中:" -#: pg_backup_archiver.c:1887 +#: 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:1963 +#: pg_backup_archiver.c:1959 #, c-format msgid "bad dumpId" msgstr "不正なdumpId" -#: pg_backup_archiver.c:1984 +#: pg_backup_archiver.c:1980 #, c-format msgid "bad table dumpId for TABLE DATA item" msgstr "TABLE DATA項目に対する不正なテーブルdumpId" -#: pg_backup_archiver.c:2076 +#: pg_backup_archiver.c:2072 #, c-format msgid "unexpected data offset flag %d" msgstr "想定外のデータオフセットフラグ %d" -#: pg_backup_archiver.c:2089 +#: pg_backup_archiver.c:2085 #, c-format msgid "file offset in dump file is too large" msgstr "ダンプファイルのファイルオフセットが大きすぎます" -#: pg_backup_archiver.c:2200 +#: pg_backup_archiver.c:2196 #, c-format msgid "directory name too long: \"%s\"" msgstr "ディレクトリ名が長すぎます: \"%s\"" -#: pg_backup_archiver.c:2250 +#: 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:2258 pg_backup_custom.c:168 pg_backup_custom.c:811 +#: 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:2265 pg_backup_custom.c:174 +#: 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:2271 +#: pg_backup_archiver.c:2267 #, c-format msgid "could not read input file: %m" msgstr "入力ファイルを読み込めませんでした: %m" -#: pg_backup_archiver.c:2273 +#: pg_backup_archiver.c:2269 #, c-format msgid "input file is too short (read %lu, expected 5)" msgstr "入力ファイルが小さすぎます(読み取り%lu、想定は 5)" -#: pg_backup_archiver.c:2305 +#: 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:2311 +#: 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:2317 +#: pg_backup_archiver.c:2313 #, c-format msgid "input file does not appear to be a valid archive" msgstr "入力ファイルが有効なアーカイブではないようです" -#: pg_backup_archiver.c:2326 +#: pg_backup_archiver.c:2322 #, c-format msgid "could not close input file: %m" msgstr "入力ファイルをクローズできませんでした: %m" -#: pg_backup_archiver.c:2405 +#: pg_backup_archiver.c:2401 #, c-format msgid "could not open stdout for appending: %m" msgstr "標準出力を追記用にオープンできませんでした: %m" -#: pg_backup_archiver.c:2450 +#: pg_backup_archiver.c:2446 #, c-format msgid "unrecognized file format \"%d\"" msgstr "認識不能のファイル形式\"%d\"" -#: pg_backup_archiver.c:2531 pg_backup_archiver.c:4651 +#: 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:2535 pg_backup_archiver.c:4664 +#: 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:2657 +#: 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:2740 +#: pg_backup_archiver.c:2736 #, c-format msgid "restoring tables WITH OIDS is not supported anymore" msgstr "WITH OIDSと定義されたテーブルのリストアは今後サポートされません" -#: pg_backup_archiver.c:2822 +#: pg_backup_archiver.c:2818 #, c-format msgid "unrecognized encoding \"%s\"" msgstr "認識不能のエンコーディング\"%s\"" -#: pg_backup_archiver.c:2827 +#: pg_backup_archiver.c:2824 #, c-format msgid "invalid ENCODING item: %s" msgstr "不正なENCODING項目: %s" -#: pg_backup_archiver.c:2845 +#: pg_backup_archiver.c:2842 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "不正なSTDSTRINGS項目: %s" -#: pg_backup_archiver.c:2870 +#: pg_backup_archiver.c:2867 #, c-format msgid "schema \"%s\" not found" msgstr "スキーマ \"%s\"が見つかりません" -#: pg_backup_archiver.c:2877 +#: pg_backup_archiver.c:2874 #, c-format msgid "table \"%s\" not found" msgstr "テーブル\"%s\"が見つかりません" -#: pg_backup_archiver.c:2884 +#: pg_backup_archiver.c:2881 #, c-format msgid "index \"%s\" not found" msgstr "インデックス\"%s\"が見つかりません" -#: pg_backup_archiver.c:2891 +#: pg_backup_archiver.c:2888 #, c-format msgid "function \"%s\" not found" msgstr "関数\"%s\"が見つかりません" -#: pg_backup_archiver.c:2898 +#: pg_backup_archiver.c:2895 #, c-format msgid "trigger \"%s\" not found" msgstr "トリガ\"%s\"が見つかりません" -#: pg_backup_archiver.c:3329 +#: pg_backup_archiver.c:3326 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "セッションユーザーを\"%s\"に設定できませんでした: %s" -#: pg_backup_archiver.c:3461 +#: 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:3522 +#: pg_backup_archiver.c:3519 #, c-format msgid "could not set \"default_tablespace\" to %s: %s" msgstr "\"default_tablespace\"を\"%s\"に設定できませんでした: %s" -#: pg_backup_archiver.c:3571 +#: pg_backup_archiver.c:3568 #, c-format msgid "could not set \"default_table_access_method\": %s" msgstr "\"default_table_access_method\"を設定できませんでした: %s" -#: pg_backup_archiver.c:3620 +#: pg_backup_archiver.c:3617 #, c-format msgid "could not alter table access method: %s" msgstr "テーブルアクセスメソッドを変更できませんでした: %s" -#: pg_backup_archiver.c:3721 +#: 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:4008 +#: pg_backup_archiver.c:4005 #, c-format msgid "did not find magic string in file header" msgstr "ファイルヘッダにマジック文字列がありませんでした" -#: pg_backup_archiver.c:4022 +#: pg_backup_archiver.c:4019 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "ファイルヘッダ内のバージョン(%d.%d)はサポートされていません" -#: pg_backup_archiver.c:4027 +#: pg_backup_archiver.c:4024 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "整数のサイズ(%lu)に関する健全性検査が失敗しました" -#: pg_backup_archiver.c:4031 +#: 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:4041 +#: 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:4063 +#: 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:4099 +#: pg_backup_archiver.c:4096 #, c-format msgid "invalid creation date in header" msgstr "ヘッダ内の作成日付が不正です" -#: pg_backup_archiver.c:4233 +#: pg_backup_archiver.c:4230 #, c-format msgid "processing item %d %s %s" msgstr "項目 %d %s %s を処理しています" -#: pg_backup_archiver.c:4318 +#: pg_backup_archiver.c:4315 #, c-format msgid "entering main parallel loop" msgstr "メインの並列ループに入ります" -#: pg_backup_archiver.c:4329 +#: pg_backup_archiver.c:4326 #, c-format msgid "skipping item %d %s %s" msgstr "項目 %d %s %s をスキップしています" -#: pg_backup_archiver.c:4338 +#: pg_backup_archiver.c:4335 #, c-format msgid "launching item %d %s %s" msgstr "項目 %d %s %s に着手します" -#: pg_backup_archiver.c:4392 +#: pg_backup_archiver.c:4389 #, c-format msgid "finished main parallel loop" msgstr "メインの並列ループが終了しました" -#: pg_backup_archiver.c:4428 +#: pg_backup_archiver.c:4425 #, c-format msgid "processing missed item %d %s %s" msgstr "やり残し項目 %d %s %s を処理しています" -#: pg_backup_archiver.c:4970 +#: 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:375 pg_backup_null.c:143 +#: pg_backup_custom.c:376 pg_backup_null.c:143 #, c-format msgid "invalid OID for large object" msgstr "ラージオブジェクトのOIDが不正です" -#: pg_backup_custom.c:440 pg_backup_custom.c:506 pg_backup_custom.c:635 -#: pg_backup_custom.c:869 pg_backup_tar.c:1029 pg_backup_tar.c:1034 +#: 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:479 +#: pg_backup_custom.c:480 #, c-format msgid "data block %d has wrong seek position" msgstr "データブロック%dのシーク位置が間違っています" -#: pg_backup_custom.c:496 +#: pg_backup_custom.c:497 #, c-format msgid "unrecognized data block type (%d) while searching archive" msgstr "アーカイブの探索中に認識不能のデータブロックタイプ(%d)がありました" -#: pg_backup_custom.c:518 +#: 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:523 +#: 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:530 +#: 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:544 +#: pg_backup_custom.c:545 #, c-format msgid "unrecognized data block type %d while restoring archive" msgstr "アーカイブのりストア中に認識不可のデータブロックタイプ%dがありました" -#: pg_backup_custom.c:750 pg_backup_custom.c:802 pg_backup_custom.c:944 +#: 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:766 pg_backup_custom.c:806 +#: 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:789 +#: pg_backup_custom.c:790 #, c-format msgid "can only reopen input archives" msgstr "入力アーカイブだけが再オープン可能です" -#: pg_backup_custom.c:796 +#: pg_backup_custom.c:797 #, c-format msgid "parallel restore from standard input is not supported" msgstr "標準入力からの並列リストアはサポートされていません" -#: pg_backup_custom.c:798 +#: pg_backup_custom.c:799 #, c-format msgid "parallel restore from non-seekable file is not supported" msgstr "シーク不可のファイルからの並列リストアはサポートされていません" -#: pg_backup_custom.c:814 +#: pg_backup_custom.c:815 #, c-format msgid "could not set seek position in archive file: %m" msgstr "アーカイブファイルのシークができませんでした: %m" -#: pg_backup_custom.c:893 +#: pg_backup_custom.c:894 #, c-format msgid "compressor active" msgstr "圧縮処理が有効です" -#: pg_backup_db.c:40 +#: pg_backup_db.c:42 #, c-format -msgid "could not get \"server_version\" from libpq" -msgstr "libpqから\"server_version\"を取得できませんでした" +msgid "could not get server_version from libpq" +msgstr "libpqからserver_versionを取得できませんでした" -#: pg_backup_db.c:51 pg_dumpall.c:1830 +#: pg_backup_db.c:53 pg_dumpall.c:1879 #, c-format msgid "aborting because of server version mismatch" msgstr "サーバーバージョンの不一致のため処理を中断します" -#: pg_backup_db.c:52 pg_dumpall.c:1831 +#: pg_backup_db.c:54 pg_dumpall.c:1880 #, c-format msgid "server version: %s; %s version: %s" msgstr "サーバーバージョン: %s、%s バージョン: %s" -#: pg_backup_db.c:118 +#: pg_backup_db.c:120 #, c-format msgid "already connected to a database" msgstr "データベースはすでに接続済みです" -#: pg_backup_db.c:126 pg_backup_db.c:176 pg_dumpall.c:1677 pg_dumpall.c:1779 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1726 pg_dumpall.c:1828 msgid "Password: " msgstr "パスワード: " -#: pg_backup_db.c:168 +#: pg_backup_db.c:170 #, c-format msgid "could not connect to database" msgstr "データベースへの接続ができませんでした" -#: pg_backup_db.c:185 +#: pg_backup_db.c:187 #, c-format msgid "reconnection failed: %s" msgstr "再接続に失敗しました: %s" -#: pg_backup_db.c:188 pg_backup_db.c:262 pg_dump.c:851 pg_dump_sort.c:1223 -#: pg_dump_sort.c:1243 pg_dumpall.c:1704 pg_dumpall.c:1788 +#: 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:269 pg_dumpall.c:1893 pg_dumpall.c:1916 +#: 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:271 pg_dumpall.c:1894 pg_dumpall.c:1917 +#: 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:313 +#: 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] "問い合わせが1行ではなく%d行返しました: %s" -#: pg_backup_db.c:349 +#: pg_backup_db.c:351 #, c-format msgid "%s: %sCommand was: %s" msgstr "%s: %sコマンド: %s" -#: pg_backup_db.c:405 pg_backup_db.c:479 pg_backup_db.c:486 +#: 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:458 +#: pg_backup_db.c:460 #, c-format msgid "error returned by PQputCopyData: %s" msgstr "PQputCopyData からエラーが返されました: %s" -#: pg_backup_db.c:507 +#: pg_backup_db.c:509 #, c-format msgid "error returned by PQputCopyEnd: %s" msgstr "PQputCopyEnd からエラーが返されました: %s" -#: pg_backup_db.c:513 +#: pg_backup_db.c:515 #, c-format msgid "COPY failed for table \"%s\": %s" msgstr "テーブル\"%s\"へのコピーに失敗しました: %s" -#: pg_backup_db.c:519 pg_dump.c:2353 +#: pg_backup_db.c:521 pg_dump.c:2284 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "ファイル\"%s\"をCOPY中に想定していない余分な結果がありました" -#: pg_backup_db.c:531 +#: pg_backup_db.c:533 msgid "could not start database transaction" msgstr "データベーストランザクションを開始できませんでした" -#: pg_backup_db.c:539 +#: pg_backup_db.c:541 msgid "could not commit database transaction" msgstr "データベーストランザクションをコミットできませんでした" @@ -1459,100 +1459,100 @@ msgstr[0] "不完全なtarヘッダがありました(%luバイト)" msgid "corrupt tar header found in %s (expected %d, computed %d) file position %llu" msgstr "破損したtarヘッダが%sにありました(想定 %d、算出結果 %d) ファイル位置 %llu" -#: pg_backup_utils.c:56 +#: pg_backup_utils.c:54 #, c-format msgid "unrecognized section name: \"%s\"" msgstr "認識不可のセクション名: \"%s\"" -#: pg_backup_utils.c:57 pg_dump.c:753 pg_dump.c:770 pg_dumpall.c:370 +#: 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:308 pg_restore.c:324 -#: pg_restore.c:338 +#: 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\"を実行してください。" -#: 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:768 pg_dumpall.c:378 pg_restore.c:322 +#: 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:787 pg_restore.c:345 +#: 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:790 +#: 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:793 +#: pg_dump.c:734 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" msgstr "オプション --include-foreign-data はパラレルバックアップではサポートされません" -#: pg_dump.c:796 pg_restore.c:348 +#: 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:799 pg_dumpall.c:408 pg_restore.c:380 +#: 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:810 +#: 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:839 +#: pg_dump.c:776 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "認識できない圧縮アルゴリズム: \"%s\"" -#: pg_dump.c:846 +#: pg_dump.c:783 #, c-format msgid "invalid compression specification: %s" msgstr "不正な圧縮指定: %s" -#: pg_dump.c:859 +#: pg_dump.c:796 #, c-format msgid "compression option \"%s\" is not currently supported by pg_dump" msgstr "圧縮オプション\"%s\"は現時点ではpg_dumpではサポートされていません" -#: pg_dump.c:871 +#: pg_dump.c:808 #, c-format msgid "parallel backup only supported by the directory format" msgstr "並列バックアップはディレクトリ形式でのみサポートされます" -#: pg_dump.c:917 +#: pg_dump.c:854 #, c-format msgid "last built-in OID is %u" msgstr "最後の組み込みOIDは%u" -#: pg_dump.c:926 +#: pg_dump.c:863 #, c-format msgid "no matching schemas were found" msgstr "マッチするスキーマが見つかりません" -#: pg_dump.c:943 +#: pg_dump.c:880 #, c-format msgid "no matching tables were found" msgstr "マッチするテーブルが見つかりません" -#: pg_dump.c:971 +#: pg_dump.c:908 #, c-format msgid "no matching extensions were found" msgstr "合致する機能拡張が見つかりません" -#: pg_dump.c:1162 +#: pg_dump.c:1092 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1561,17 +1561,17 @@ msgstr "" "%sはデータベースをテキストファイルまたはその他の形式でダンプします。\n" "\n" -#: pg_dump.c:1163 pg_dumpall.c:635 pg_restore.c:455 +#: pg_dump.c:1093 pg_dumpall.c:636 pg_restore.c:452 #, c-format msgid "Usage:\n" msgstr "使用方法:\n" -#: pg_dump.c:1164 +#: pg_dump.c:1094 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [DBNAME]\n" -#: pg_dump.c:1166 pg_dumpall.c:638 pg_restore.c:458 +#: pg_dump.c:1096 pg_dumpall.c:639 pg_restore.c:455 #, c-format msgid "" "\n" @@ -1580,12 +1580,12 @@ msgstr "" "\n" "一般的なオプション;\n" -#: pg_dump.c:1167 +#: pg_dump.c:1097 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=ファイル名 出力ファイルまたはディレクトリの名前\n" -#: pg_dump.c:1168 +#: pg_dump.c:1098 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" @@ -1594,22 +1594,22 @@ msgstr "" " -F, --format=c|d|t|p 出力ファイルの形式(custom, directory, tar, \n" " plain text(デフォルト))\n" -#: pg_dump.c:1170 +#: 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:1171 pg_dumpall.c:640 +#: pg_dump.c:1101 pg_dumpall.c:641 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose 冗長モード\n" -#: pg_dump.c:1172 pg_dumpall.c:641 +#: 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:1173 +#: pg_dump.c:1103 #, c-format msgid "" " -Z, --compress=METHOD[:DETAIL]\n" @@ -1618,29 +1618,29 @@ msgstr "" " -Z, --compress=方式[:詳細]\n" " 指定のとおり圧縮\n" -#: pg_dump.c:1175 pg_dumpall.c:642 +#: 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:1176 pg_dumpall.c:670 +#: 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:1177 +#: 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:1178 pg_dumpall.c:643 +#: pg_dump.c:1108 pg_dumpall.c:644 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: pg_dump.c:1180 pg_dumpall.c:644 +#: pg_dump.c:1110 pg_dumpall.c:645 #, c-format msgid "" "\n" @@ -1649,66 +1649,66 @@ msgstr "" "\n" "出力内容を制御するためのオプション:\n" -#: pg_dump.c:1181 pg_dumpall.c:645 +#: 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:1182 +#: 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:1183 +#: pg_dump.c:1113 #, c-format msgid " --blobs (same as --large-objects, deprecated)\n" msgstr " --blobs (--large-objectsに同じ、非推奨)\n" -#: pg_dump.c:1184 +#: 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:1185 +#: 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:1186 pg_restore.c:469 +#: 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:1187 +#: pg_dump.c:1117 #, c-format msgid " -C, --create include commands to create database in dump\n" msgstr " -C, --create ダンプにデータベース生成用コマンドを含める\n" -#: pg_dump.c:1188 +#: 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:1189 pg_dumpall.c:647 +#: 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:1190 +#: 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:1191 +#: 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:1192 +#: pg_dump.c:1122 #, c-format msgid "" " -O, --no-owner skip restoration of object ownership in\n" @@ -1717,56 +1717,56 @@ msgstr "" " -O, --no-owner プレインテキスト形式で、オブジェクト所有権の\n" " 復元を行わない\n" -#: pg_dump.c:1194 pg_dumpall.c:651 +#: 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:1195 +#: 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:1196 +#: 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:1197 +#: 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:1198 pg_dumpall.c:654 +#: 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:1199 pg_dumpall.c:655 +#: 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:1200 pg_dumpall.c:656 +#: 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:1201 pg_dumpall.c:657 +#: 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:1202 pg_dumpall.c:658 pg_restore.c:486 +#: 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:1203 +#: pg_dump.c:1133 #, c-format msgid "" " --enable-row-security enable row security (dump only content user has\n" @@ -1775,12 +1775,12 @@ msgstr "" " --enable-row-security 行セキュリティを有効化(ユーザーがアクセス可能な\n" " 内容のみをダンプ)\n" -#: pg_dump.c:1205 +#: 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:1206 +#: pg_dump.c:1136 #, c-format msgid "" " --exclude-table-and-children=PATTERN\n" @@ -1791,12 +1791,12 @@ msgstr "" " 指定したテーブル(群)を子テーブルを含めて\n" " ダンプしない\n" -#: pg_dump.c:1209 +#: 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:1210 +#: pg_dump.c:1140 #, c-format msgid "" " --exclude-table-data-and-children=PATTERN\n" @@ -1807,12 +1807,12 @@ msgstr "" " 指定したテーブル(群)のデータを子テーブルを含めて\n" " ダンプしない\n" -#: pg_dump.c:1213 pg_dumpall.c:660 +#: 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:1214 +#: pg_dump.c:1144 #, c-format msgid "" " --filter=FILENAME include or exclude objects and data from dump\n" @@ -1821,12 +1821,12 @@ msgstr "" " --filter=FILENAME オブジェクトやデータの指定や除外を\n" " FILENAMEに記述された式をもとに行う\n" -#: pg_dump.c:1216 pg_dumpall.c:662 pg_restore.c:490 +#: 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:1217 +#: pg_dump.c:1147 #, c-format msgid "" " --include-foreign-data=PATTERN\n" @@ -1837,91 +1837,91 @@ msgstr "" " PATTERNに合致する外部サーバー上の外部テーブルの\n" " データを含める\n" -#: pg_dump.c:1220 pg_dumpall.c:663 +#: 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:1221 pg_dumpall.c:664 +#: 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:1222 pg_dumpall.c:665 +#: pg_dump.c:1152 pg_dumpall.c:666 #, c-format -msgid " --no-comments do not dump comment commands\n" -msgstr " --no-comments コメントコマンドをダンプしない\n" +msgid " --no-comments do not dump comments\n" +msgstr " --no-comments コメントをダンプしない\n" -#: pg_dump.c:1223 pg_dumpall.c:666 +#: 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:1224 pg_dumpall.c:668 +#: 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:1225 pg_dumpall.c:669 +#: 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:1226 pg_dumpall.c:671 +#: 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:1227 pg_dumpall.c:672 +#: 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:1228 pg_dumpall.c:673 +#: 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:1229 pg_dumpall.c:674 +#: 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:1230 pg_dumpall.c:675 +#: 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:1231 pg_dumpall.c:676 +#: 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:1232 pg_dumpall.c:677 +#: 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:1233 +#: 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:1234 +#: 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:1235 +#: pg_dump.c:1165 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr " --snapshot=SNAPSHOT ダンプに指定のスナップショットを使用する\n" -#: pg_dump.c:1236 pg_restore.c:500 +#: pg_dump.c:1166 pg_restore.c:497 #, c-format msgid "" " --strict-names require table and/or schema include patterns to\n" @@ -1930,7 +1930,7 @@ msgstr "" " --strict-names テーブル/スキーマの対象パターンが最低でも\n" " 一つの実体にマッチすることを必須とする\n" -#: pg_dump.c:1238 +#: pg_dump.c:1168 #, c-format msgid "" " --table-and-children=PATTERN dump only the specified table(s), including\n" @@ -1939,7 +1939,7 @@ msgstr "" " --table-and-children=PATTERN 指定したテーブル(群)のみを子テーブル\n" " を含めてダンプ\n" -#: pg_dump.c:1240 pg_dumpall.c:678 pg_restore.c:503 +#: pg_dump.c:1170 pg_dumpall.c:679 pg_restore.c:500 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1950,7 +1950,7 @@ msgstr "" " 所有者をセットする際、ALTER OWNERコマンドの代わり\n" " にSET SESSION AUTHORIZATIONコマンドを使用する\n" -#: pg_dump.c:1244 pg_dumpall.c:682 pg_restore.c:507 +#: pg_dump.c:1174 pg_dumpall.c:683 pg_restore.c:504 #, c-format msgid "" "\n" @@ -1959,46 +1959,46 @@ msgstr "" "\n" "接続オプション:\n" -#: pg_dump.c:1245 +#: pg_dump.c:1175 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=DBNAME ダンプするデータベース\n" -#: pg_dump.c:1246 pg_dumpall.c:684 pg_restore.c:508 +#: 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:1247 pg_dumpall.c:686 pg_restore.c:509 +#: 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:1248 pg_dumpall.c:687 pg_restore.c:510 +#: 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:1249 pg_dumpall.c:688 pg_restore.c:511 +#: 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:1250 pg_dumpall.c:689 pg_restore.c:512 +#: 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:1251 pg_dumpall.c:690 +#: 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:1253 +#: pg_dump.c:1183 #, c-format msgid "" "\n" @@ -2010,499 +2010,494 @@ msgstr "" "データベース名が指定されなかった場合、環境変数PGDATABASEが使用されます\n" "\n" -#: pg_dump.c:1255 pg_dumpall.c:694 pg_restore.c:519 +#: 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:1256 pg_dumpall.c:695 pg_restore.c:520 +#: 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:1275 pg_dumpall.c:518 +#: pg_dump.c:1205 pg_dumpall.c:518 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "不正なクライアントエンコーディング\"%s\"が指定されました" -#: pg_dump.c:1422 +#: pg_dump.c:1353 #, c-format msgid "parallel dumps from standby servers are not supported by this server version" msgstr "スタンバイサーバーからの並列ダンプはこのサーバーバージョンではサポートされません" -#: pg_dump.c:1487 +#: pg_dump.c:1418 #, c-format msgid "invalid output format \"%s\" specified" msgstr "不正な出力形式\"%s\"が指定されました" -#: pg_dump.c:1528 pg_dump.c:1584 pg_dump.c:1637 pg_dumpall.c:1467 +#: 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:1536 +#: pg_dump.c:1467 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "パターン\"%s\"にマッチするスキーマが見つかりません" -#: pg_dump.c:1589 +#: pg_dump.c:1520 #, c-format msgid "no matching extensions were found for pattern \"%s\"" msgstr "パターン\"%s\"に合致する機能拡張が見つかりません" -#: pg_dump.c:1642 +#: pg_dump.c:1573 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "パターン\"%s\"にマッチする外部サーバーが見つかりません" -#: pg_dump.c:1713 +#: pg_dump.c:1644 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "リレーション名が不適切です(ドット区切りの名前が多すぎます): %s" -#: pg_dump.c:1735 +#: pg_dump.c:1666 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "パターン \"%s\"にマッチするテーブルが見つかりません" -#: pg_dump.c:1762 +#: pg_dump.c:1693 #, c-format msgid "You are currently not connected to a database." msgstr "現在データベースに接続していません。" -#: pg_dump.c:1765 +#: pg_dump.c:1696 #, c-format msgid "cross-database references are not implemented: %s" msgstr "データベース間の参照は実装されていません: %s" -#: pg_dump.c:2224 +#: pg_dump.c:2155 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "テーブル \"%s.%s\"の内容をダンプしています" -#: pg_dump.c:2334 +#: pg_dump.c:2265 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "テーブル\"%s\"の内容のダンプに失敗: PQgetCopyData()が失敗しました。" -#: pg_dump.c:2335 pg_dump.c:2345 +#: pg_dump.c:2266 pg_dump.c:2276 #, c-format msgid "Error message from server: %s" msgstr "サーバーのエラーメッセージ: %s" -#: pg_dump.c:2336 pg_dump.c:2346 +#: pg_dump.c:2267 pg_dump.c:2277 #, c-format msgid "Command was: %s" msgstr "コマンド: %s" -#: pg_dump.c:2344 +#: pg_dump.c:2275 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "テーブル\"%s\"の内容のダンプに失敗: PQgetResult()が失敗しました。" -#: pg_dump.c:2435 +#: pg_dump.c:2366 #, c-format msgid "wrong number of fields retrieved from table \"%s\"" msgstr "テーブル\"%s\"から取得したフィールドの数が間違っています" -#: pg_dump.c:3137 +#: pg_dump.c:3068 #, c-format msgid "saving database definition" msgstr "データベース定義を保存しています" -#: pg_dump.c:3252 +#: pg_dump.c:3177 #, c-format msgid "unrecognized locale provider: %s" msgstr "認識できない照合順序プロバイダ: %s" -#: pg_dump.c:3613 +#: pg_dump.c:3538 #, c-format msgid "saving encoding = %s" msgstr "encoding = %s を保存しています" -#: pg_dump.c:3638 +#: pg_dump.c:3563 #, c-format msgid "saving \"standard_conforming_strings = %s\"" msgstr "\"standard_conforming_strings = %s\" を保存しています" -#: pg_dump.c:3677 +#: pg_dump.c:3602 #, c-format msgid "could not parse result of current_schemas()" msgstr "current_schemas()の結果をパースできませんでした" -#: pg_dump.c:3696 +#: pg_dump.c:3621 #, c-format msgid "saving \"search_path = %s\"" msgstr "\"search_path = %s\" を保存しています" -#: pg_dump.c:3732 +#: pg_dump.c:3657 #, c-format msgid "reading large objects" msgstr "ラージオブジェクトを読み込んでいます" -#: pg_dump.c:3953 +#: pg_dump.c:3878 #, c-format msgid "saving large objects \"%s\"" msgstr "ラージオブジェクト\"%s\"を保存しています" -#: pg_dump.c:3974 +#: pg_dump.c:3899 #, c-format msgid "error reading large object %u: %s" msgstr "ラージオブジェクト %u を読み取り中にエラーがありました: %s" -#: pg_dump.c:4077 +#: pg_dump.c:4002 #, c-format msgid "reading row-level security policies" msgstr "行レベルセキュリティポリシーを読み取ります" -#: pg_dump.c:4218 +#: pg_dump.c:4143 #, c-format msgid "unexpected policy command type: %c" msgstr "想定外のポリシコマンドタイプ: \"%c\"" -#: pg_dump.c:4674 pg_dump.c:5229 pg_dump.c:12492 pg_dump.c:18588 -#: pg_dump.c:18590 pg_dump.c:19212 +#: 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:4888 +#: pg_dump.c:4807 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "現在のユーザーがスーパーユーザーではないため、サブスクリプションはダンプされません" -#: pg_dump.c:5092 +#: pg_dump.c:5013 #, c-format msgid "subscription with OID %u does not exist" msgstr "OID %uのサブスクリプションは存在しません" -#: pg_dump.c:5099 +#: pg_dump.c:5020 #, c-format msgid "failed sanity check, table with OID %u not found" msgstr "健全性検査に失敗しました、OID %uのテーブルがありません" -#: pg_dump.c:5685 +#: pg_dump.c:5583 #, c-format msgid "could not find parent extension for %s %s" msgstr "%s %sの親となる機能拡張がありませんでした" -#: pg_dump.c:5823 +#: pg_dump.c:5728 #, c-format msgid "schema with OID %u does not exist" msgstr "OID %uのスキーマは存在しません" -#: pg_dump.c:7253 pg_dump.c:17932 +#: 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:7398 +#: 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:7638 pg_dump.c:7913 pg_dump.c:8354 pg_dump.c:8981 pg_dump.c:9108 -#: pg_dump.c:9256 +#: 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:7642 +#: pg_dump.c:7590 #, c-format msgid "unexpected index data for table \"%s\"" msgstr "テーブル\"%s\"に対する想定外のインデックスデータ" -#: pg_dump.c:8141 +#: 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:8985 +#: pg_dump.c:8925 #, c-format msgid "unexpected column data for table \"%s\"" msgstr "テーブル\"%s\"に対する想定外の列データ" -#: pg_dump.c:9015 +#: pg_dump.c:8954 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "テーブル\"%s\"の列番号が不正です" -#: pg_dump.c:9070 +#: pg_dump.c:9005 #, c-format msgid "finding table default expressions" msgstr "テーブルのデフォルト式を探しています" -#: pg_dump.c:9112 +#: pg_dump.c:9047 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "テーブル\"%2$s\"用のadnumの値%1$dが不正です" -#: pg_dump.c:9206 +#: pg_dump.c:9141 #, c-format msgid "finding table check constraints" msgstr "テーブルのチェック制約を探しています" -#: pg_dump.c:9260 +#: 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:9264 +#: pg_dump.c:9199 #, c-format msgid "The system catalogs might be corrupted." msgstr "システムカタログが破損している可能性があります。" -#: pg_dump.c:10016 +#: pg_dump.c:9889 #, c-format msgid "role with OID %u does not exist" msgstr "OID が %u であるロールは存在しません" -#: pg_dump.c:10128 pg_dump.c:10157 +#: 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:10704 +#: pg_dump.c:10577 #, c-format msgid "missing metadata for large objects \"%s\"" msgstr "ラージオブジェクト\"%s\"のメタデータがありません" -#: pg_dump.c:10987 +#: pg_dump.c:10860 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "データ型\"%s\"のtyptypeが不正なようです" -#: pg_dump.c:12563 +#: pg_dump.c:12434 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "関数\"%s\"のprovolatileの値が認識できません" -#: pg_dump.c:12613 pg_dump.c:14509 +#: pg_dump.c:12484 pg_dump.c:14380 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "関数\"%s\"のproparallel値が認識できません" -#: pg_dump.c:12743 pg_dump.c:12849 pg_dump.c:12856 +#: 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:12782 +#: 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:12785 +#: pg_dump.c:12656 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "pg_cast.castmethod フィールドの値がおかしいです" -#: pg_dump.c:12875 +#: 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:12892 +#: pg_dump.c:12763 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "pg_cast.castmethod フィールドの値がおかしいです" -#: pg_dump.c:12913 +#: pg_dump.c:12784 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "pg_cast.castmethod フィールドの値がおかしいです" -#: pg_dump.c:13058 +#: pg_dump.c:12929 #, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" msgstr "後置演算子は今後サポートされません(演算子\"%s\")" -#: pg_dump.c:13228 +#: pg_dump.c:13099 #, c-format msgid "could not find operator with OID %s" msgstr "OID %sの演算子がありませんでした" -#: pg_dump.c:13296 +#: pg_dump.c:13167 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "アクセスメソッド\"%2$s\"の不正なタイプ\"%1$c\"" -#: pg_dump.c:13970 pg_dump.c:14038 +#: pg_dump.c:13841 pg_dump.c:13909 #, c-format msgid "unrecognized collation provider: %s" msgstr "認識できないの照合順序プロバイダ: %s" -#: pg_dump.c:13979 pg_dump.c:13986 pg_dump.c:13997 pg_dump.c:14007 -#: pg_dump.c:14022 +#: 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:14428 +#: pg_dump.c:14299 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "集約\"%s\"のaggfinalmodifyの値が識別できません" -#: pg_dump.c:14484 +#: pg_dump.c:14355 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "集約\"%s\"のaggmfinalmodifyの値が識別できません" -#: pg_dump.c:15201 +#: pg_dump.c:15072 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "デフォルト権限設定中の認識できないオブジェクト型: %d" -#: pg_dump.c:15217 +#: pg_dump.c:15088 #, c-format msgid "could not parse default ACL list (%s)" msgstr "デフォルトの ACL リスト(%s)をパースできませんでした" -#: pg_dump.c:15301 +#: 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:15326 +#: 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:15869 +#: pg_dump.c:15740 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "ビュー\"%s\"の定義を取り出すための問い合わせがデータを返却しませんでした" -#: pg_dump.c:15872 +#: 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:15879 +#: pg_dump.c:15750 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "ビュー\"%s\"の定義が空のようです(長さが0)" -#: pg_dump.c:15964 +#: pg_dump.c:15835 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDSは今後サポートされません(テーブル\"%s\")" -#: pg_dump.c:17056 +#: pg_dump.c:16822 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "テーブル\"%2$s\"の列番号%1$dは不正です" -#: pg_dump.c:17134 +#: pg_dump.c:16900 #, c-format msgid "could not parse index statistic columns" msgstr "インデックス統計列をパースできませんでした" -#: pg_dump.c:17136 +#: pg_dump.c:16902 #, c-format msgid "could not parse index statistic values" msgstr "インデックス統計値をパースできませんでした" -#: pg_dump.c:17138 +#: pg_dump.c:16904 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "インデックス統計に対して列と値の数が合致しません" -#: pg_dump.c:17353 +#: pg_dump.c:17119 #, c-format msgid "missing index for constraint \"%s\"" msgstr "制約\"%s\"のインデックスが見つかりません" -#: pg_dump.c:17590 +#: pg_dump.c:17354 #, c-format msgid "unrecognized constraint type: %c" msgstr "制約のタイプが識別できません: %c" -#: pg_dump.c:17643 -#, c-format -msgid "unrecognized sequence type: %s" -msgstr "認識されないシーケンスの型\"%s\"" - -#: pg_dump.c:17775 pg_dump.c:18007 +#: 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:17811 +#: pg_dump.c:17487 #, c-format -msgid "unrecognized sequence type: %d" -msgstr "認識されないシーケンスの型: %d" +msgid "unrecognized sequence type: %s" +msgstr "認識されないシーケンスの型\"%s\"" -#: pg_dump.c:18340 +#: 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:18493 +#: pg_dump.c:18155 #, c-format msgid "could not find referenced extension %u" msgstr "親の機能拡張%uが見つかりません" -#: pg_dump.c:18592 +#: pg_dump.c:18254 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "機能拡張に対して設定と条件の数が一致しません" -#: pg_dump.c:18724 +#: pg_dump.c:18386 #, c-format msgid "reading dependency data" msgstr "データの依存データを読み込んでいます" -#: pg_dump.c:18810 +#: pg_dump.c:18472 #, c-format msgid "no referencing object %u %u" msgstr "参照元オブジェクト%u %uがありません" -#: pg_dump.c:18821 +#: pg_dump.c:18483 #, c-format msgid "no referenced object %u %u" msgstr "参照先オブジェクト%u %uがありません" -#: pg_dump.c:19246 pg_dump.c:19284 pg_dumpall.c:1962 pg_restore.c:554 -#: pg_restore.c:600 +#: 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:434 +#: pg_dump_sort.c:424 #, c-format msgid "invalid dumpId %d" msgstr "不正なdumpId %d" -#: pg_dump_sort.c:440 +#: pg_dump_sort.c:430 #, c-format msgid "invalid dependency %d" msgstr "不正な依存関係 %d" -#: pg_dump_sort.c:604 +#: pg_dump_sort.c:594 #, c-format msgid "could not identify dependency loop" msgstr "依存関係のループが見つかりませんでした" -#: pg_dump_sort.c:1219 +#: 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:1224 +#: 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:1225 +#: 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:1237 +#: pg_dump_sort.c:1227 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "以下の項目の間の依存関係のループを解決できませんでした:" @@ -2537,7 +2532,7 @@ msgstr "-g/--globals-onlyと-t/--tablespaces-onlyオプションは同時に使 msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "-r/--roles-onlyと-t/--tablespaces-onlyオプションは同時に使用できません" -#: pg_dumpall.c:474 pg_dumpall.c:1771 +#: pg_dumpall.c:474 pg_dumpall.c:1820 #, c-format msgid "could not connect to database \"%s\"" msgstr "データベース\"%s\"へ接続できませんでした" @@ -2551,7 +2546,7 @@ msgstr "" "\"postgres\"または\"template1\"データベースに接続できませんでした\n" "代わりのデータベースを指定してください。" -#: pg_dumpall.c:634 +#: pg_dumpall.c:635 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2560,80 +2555,80 @@ msgstr "" "%sはPostgreSQLデータベースクラスタをSQLスクリプトファイルに展開します。\n" "\n" -#: pg_dumpall.c:636 +#: pg_dumpall.c:637 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [OPTION]...\n" -#: pg_dumpall.c:639 +#: pg_dumpall.c:640 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=ファイル名 出力ファイル名\n" -#: pg_dumpall.c:646 +#: pg_dumpall.c:647 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" msgstr " -c, --clean 再作成前にデータベースを整理(削除)\n" -#: pg_dumpall.c:648 +#: 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:649 pg_restore.c:478 +#: 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:650 +#: 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:652 +#: 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:653 +#: 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:659 +#: 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:667 +#: 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:683 +#: pg_dumpall.c:684 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=CONSTR 接続文字列を用いた接続\n" -#: pg_dumpall.c:685 +#: pg_dumpall.c:686 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=DBNAME 代替のデフォルトデータベースを指定\n" -#: pg_dumpall.c:692 +#: pg_dumpall.c:693 #, c-format msgid "" "\n" @@ -2645,111 +2640,112 @@ msgstr "" "-f/--file が指定されない場合、SQLスクリプトは標準出力に書き出されます。\n" "\n" -#: pg_dumpall.c:837 +#: pg_dumpall.c:838 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "\"pg_\"で始まるロール名はスキップされました(%s)" -#: pg_dumpall.c:1059 +#. 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:1194 +#: 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:1321 +#: 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:1528 +#: pg_dumpall.c:1577 #, c-format msgid "excluding database \"%s\"" msgstr "データベース\"%s\"を除外します" -#: pg_dumpall.c:1532 +#: pg_dumpall.c:1581 #, c-format msgid "dumping database \"%s\"" msgstr "データベース\"%s\"をダンプしています" -#: pg_dumpall.c:1563 +#: pg_dumpall.c:1612 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "データベース\"%s\"のダンプが失敗しました、終了します" -#: pg_dumpall.c:1569 +#: pg_dumpall.c:1618 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "出力ファイル\"%s\"を再オープンできませんでした: %m" -#: pg_dumpall.c:1613 +#: pg_dumpall.c:1662 #, c-format msgid "running \"%s\"" msgstr "\"%s\"を実行しています" -#: pg_dumpall.c:1814 +#: pg_dumpall.c:1863 #, c-format msgid "could not get server version" msgstr "サーバーバージョンを取得できませんでした" -#: pg_dumpall.c:1817 +#: pg_dumpall.c:1866 #, c-format msgid "could not parse server version \"%s\"" msgstr "サーバーバージョン\"%s\"をパースできませんでした" -#: pg_dumpall.c:1887 pg_dumpall.c:1910 +#: pg_dumpall.c:1936 pg_dumpall.c:1959 #, c-format msgid "executing %s" msgstr "%s を実行しています" -#: pg_dumpall.c:1982 +#: pg_dumpall.c:2031 msgid "unsupported filter object" msgstr "サポートされていないフィルターオブジェクト" -#: pg_restore.c:330 +#: 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:337 +#: 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:351 +#: 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:358 +#: 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:362 +#: pg_restore.c:361 #, c-format msgid "cannot specify both --single-transaction and multiple jobs" msgstr "--single-transaction と複数ジョブは同時には指定できません" #: pg_restore.c:399 #, c-format -msgid "archive format \"%s\" is not supported; please use psql" -msgstr "アーカイブ形式\"%s\"はサポートされていません、psqlを使ってください" - -#: pg_restore.c:403 -#, c-format msgid "unrecognized archive format \"%s\"; please specify \"c\", \"d\", or \"t\"" msgstr "アーカイブ形式\"%s\"が認識できません; \"c\"、\"d\"または\"t\"を指定してください" -#: pg_restore.c:441 +#: pg_restore.c:438 #, c-format msgid "errors ignored on restore: %d" msgstr "リストア中に無視されたエラー数: %d" -#: pg_restore.c:454 +#: pg_restore.c:451 #, c-format msgid "" "%s restores a PostgreSQL database from an archive created by pg_dump.\n" @@ -2758,49 +2754,49 @@ msgstr "" "%sはpg_dumpで作成したアーカイブからPostgreSQLデータベースをリストアします。\n" "\n" -#: pg_restore.c:456 +#: pg_restore.c:453 #, c-format msgid " %s [OPTION]... [FILE]\n" msgstr " %s [OPTION]... [FILE]\n" -#: pg_restore.c:459 +#: pg_restore.c:456 #, c-format msgid " -d, --dbname=NAME connect to database name\n" msgstr " -d, --dbname=NAME 接続するデータベース名\n" -#: pg_restore.c:460 +#: pg_restore.c:457 #, c-format msgid " -f, --file=FILENAME output file name (- for stdout)\n" msgstr " -f, --file=FILENAME 出力ファイル名(- で標準出力)\n" -#: pg_restore.c:461 +#: 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:462 +#: pg_restore.c:459 #, c-format msgid " -l, --list print summarized TOC of the archive\n" msgstr " -l, --list アーカイブのTOCの要約を表示\n" -#: pg_restore.c:463 +#: pg_restore.c:460 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose 冗長モード\n" -#: pg_restore.c:464 +#: pg_restore.c:461 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示し、終了します\n" -#: pg_restore.c:465 +#: pg_restore.c:462 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示し、終了します\n" -#: pg_restore.c:467 +#: pg_restore.c:464 #, c-format msgid "" "\n" @@ -2809,32 +2805,32 @@ msgstr "" "\n" "リストア制御用のオプション:\n" -#: pg_restore.c:468 +#: 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:470 +#: pg_restore.c:467 #, c-format msgid " -C, --create create the target database\n" msgstr " -C, --create 対象のデータベースを作成\n" -#: pg_restore.c:471 +#: 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:472 +#: pg_restore.c:469 #, c-format msgid " -I, --index=NAME restore named index\n" msgstr " -I, --index=NAME 指名したインデックスをリストア\n" -#: pg_restore.c:473 +#: 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:474 +#: pg_restore.c:471 #, c-format msgid "" " -L, --use-list=FILENAME use table of contents from this file for\n" @@ -2843,57 +2839,57 @@ msgstr "" " -L, --use-list=FILENAME このファイルの内容に従って SELECT や\n" " 出力のソートを行います\n" -#: pg_restore.c:476 +#: 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:477 +#: 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:479 +#: pg_restore.c:476 #, c-format msgid " -P, --function=NAME(args) restore named function\n" msgstr " -P, --function=NAME(args) 指名された関数をリストア\n" -#: pg_restore.c:480 +#: 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:481 +#: 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:482 +#: 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:483 +#: pg_restore.c:480 #, c-format msgid " -T, --trigger=NAME restore named trigger\n" msgstr " -T, --trigger=NAME 指名したトリガをリストア\n" -#: pg_restore.c:484 +#: 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:485 +#: pg_restore.c:482 #, c-format msgid " -1, --single-transaction restore as a single transaction\n" msgstr " -1, --single-transaction 単一のトランザクションとしてリストア\n" -#: pg_restore.c:487 +#: pg_restore.c:484 #, c-format msgid " --enable-row-security enable row security\n" msgstr " --enable-row-security 行セキュリティを有効にします\n" -#: pg_restore.c:488 +#: pg_restore.c:485 #, c-format msgid "" " --filter=FILENAME restore or skip objects based on expressions\n" @@ -2902,61 +2898,61 @@ msgstr "" " --filter=FILENAME オブジェクトの復元またはスキップをFILENAMEに\n" " 記述されている式を元に行う\n" -#: pg_restore.c:491 +#: pg_restore.c:488 #, c-format -msgid " --no-comments do not restore comment commands\n" -msgstr " --no-comments コメントコマンドをリストアしない\n" +msgid " --no-comments do not restore comments\n" +msgstr " --no-comments コメントをリストアしない\n" -#: pg_restore.c:492 +#: 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:494 +#: pg_restore.c:491 #, c-format msgid " --no-publications do not restore publications\n" msgstr " --no-publications パブリケーションをリストアしない\n" -#: pg_restore.c:495 +#: 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:496 +#: pg_restore.c:493 #, c-format msgid " --no-subscriptions do not restore subscriptions\n" msgstr " --no-subscriptions サブスクリプションをリストアしない\n" -#: pg_restore.c:497 +#: 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:498 +#: 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:499 +#: 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:502 +#: 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:513 +#: pg_restore.c:510 #, c-format msgid " --role=ROLENAME do SET ROLE before restore\n" msgstr " --role=ROLENAME リストアに先立って SET ROLE します\n" -#: pg_restore.c:515 +#: pg_restore.c:512 #, c-format msgid "" "\n" @@ -2967,7 +2963,7 @@ msgstr "" " -I, -n, -N, -P, -t, -T および --section オプションは組み合わせて複数回\n" "指定することで複数のオブジェクトを指定できます。\n" -#: pg_restore.c:518 +#: pg_restore.c:515 #, c-format msgid "" "\n" @@ -2977,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/ru.po b/src/bin/pg_dump/po/ru.po index f0297f30d1455..4b9436d95e964 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, 2023, 2024. +# 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: 2025-02-08 07:44+0200\n" -"PO-Revision-Date: 2024-09-07 07:35+0300\n" +"POT-Creation-Date: 2025-08-09 07:11+0300\n" +"PO-Revision-Date: 2025-05-03 16:33+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -240,247 +240,247 @@ msgstr "значение %s должно быть в диапазоне %d..%d" msgid "unrecognized sync method: %s" msgstr "нераспознанный метод синхронизации: %s" -#: ../../fe_utils/string_utils.c:434 +#: ../../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:607 +#: ../../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 +#: common.c:136 #, c-format msgid "reading extensions" msgstr "чтение расширений" -#: common.c:138 +#: common.c:139 #, c-format msgid "identifying extension members" msgstr "выявление членов расширений" -#: common.c:141 +#: common.c:142 #, c-format msgid "reading schemas" msgstr "чтение схем" -#: common.c:150 +#: common.c:151 #, c-format msgid "reading user-defined tables" msgstr "чтение пользовательских таблиц" -#: common.c:155 +#: common.c:156 #, c-format msgid "reading user-defined functions" msgstr "чтение пользовательских функций" -#: common.c:159 +#: common.c:160 #, c-format msgid "reading user-defined types" msgstr "чтение пользовательских типов" -#: common.c:163 +#: common.c:164 #, c-format msgid "reading procedural languages" msgstr "чтение процедурных языков" -#: common.c:166 +#: common.c:167 #, c-format msgid "reading user-defined aggregate functions" msgstr "чтение пользовательских агрегатных функций" -#: common.c:169 +#: common.c:170 #, c-format msgid "reading user-defined operators" msgstr "чтение пользовательских операторов" -#: common.c:172 +#: common.c:173 #, c-format msgid "reading user-defined access methods" msgstr "чтение пользовательских методов доступа" -#: common.c:175 +#: common.c:176 #, c-format msgid "reading user-defined operator classes" msgstr "чтение пользовательских классов операторов" -#: common.c:178 +#: common.c:179 #, c-format msgid "reading user-defined operator families" msgstr "чтение пользовательских семейств операторов" -#: common.c:181 +#: common.c:182 #, c-format msgid "reading user-defined text search parsers" msgstr "чтение пользовательских анализаторов текстового поиска" -#: common.c:184 +#: common.c:185 #, c-format msgid "reading user-defined text search templates" msgstr "чтение пользовательских шаблонов текстового поиска" -#: common.c:187 +#: common.c:188 #, c-format msgid "reading user-defined text search dictionaries" msgstr "чтение пользовательских словарей текстового поиска" -#: common.c:190 +#: common.c:191 #, c-format msgid "reading user-defined text search configurations" msgstr "чтение пользовательских конфигураций текстового поиска" -#: common.c:193 +#: common.c:194 #, c-format msgid "reading user-defined foreign-data wrappers" msgstr "чтение пользовательских оболочек сторонних данных" -#: common.c:196 +#: common.c:197 #, c-format msgid "reading user-defined foreign servers" msgstr "чтение пользовательских сторонних серверов" -#: common.c:199 +#: common.c:200 #, c-format msgid "reading default privileges" msgstr "чтение прав по умолчанию" -#: common.c:202 +#: common.c:203 #, c-format msgid "reading user-defined collations" msgstr "чтение пользовательских правил сортировки" -#: common.c:205 +#: common.c:206 #, c-format msgid "reading user-defined conversions" msgstr "чтение пользовательских преобразований" -#: common.c:208 +#: common.c:209 #, c-format msgid "reading type casts" msgstr "чтение приведений типов" -#: common.c:211 +#: common.c:212 #, c-format msgid "reading transforms" msgstr "чтение преобразований" -#: common.c:214 +#: common.c:215 #, c-format msgid "reading table inheritance information" msgstr "чтение информации о наследовании таблиц" -#: common.c:217 +#: common.c:218 #, c-format msgid "reading event triggers" msgstr "чтение событийных триггеров" -#: common.c:221 +#: common.c:222 #, c-format msgid "finding extension tables" msgstr "поиск таблиц расширений" -#: common.c:225 +#: common.c:226 #, c-format msgid "finding inheritance relationships" msgstr "поиск связей наследования" -#: common.c:228 +#: common.c:229 #, c-format msgid "reading column info for interesting tables" msgstr "чтение информации о столбцах интересующих таблиц" -#: common.c:231 +#: common.c:232 #, c-format msgid "flagging inherited columns in subtables" msgstr "пометка наследованных столбцов в подтаблицах" -#: common.c:234 +#: common.c:235 #, c-format msgid "reading partitioning data" msgstr "чтение информации о секционировании" -#: common.c:237 +#: common.c:238 #, c-format msgid "reading indexes" msgstr "чтение индексов" -#: common.c:240 +#: common.c:241 #, c-format msgid "flagging indexes in partitioned tables" msgstr "пометка индексов в секционированных таблицах" -#: common.c:243 +#: common.c:244 #, c-format msgid "reading extended statistics" msgstr "чтение расширенной статистики" -#: common.c:246 +#: common.c:247 #, c-format msgid "reading constraints" msgstr "чтение ограничений" -#: common.c:249 +#: common.c:250 #, c-format msgid "reading triggers" msgstr "чтение триггеров" -#: common.c:252 +#: common.c:253 #, c-format msgid "reading rewrite rules" msgstr "чтение правил перезаписи" -#: common.c:255 +#: common.c:256 #, c-format msgid "reading policies" msgstr "чтение политик" -#: common.c:258 +#: common.c:259 #, c-format msgid "reading publications" msgstr "чтение публикаций" -#: common.c:261 +#: common.c:262 #, c-format msgid "reading publication membership of tables" msgstr "чтение информации о таблицах, включённых в публикации" -#: common.c:264 +#: common.c:265 #, c-format msgid "reading publication membership of schemas" msgstr "чтение информации о схемах, включённых в публикации" -#: common.c:267 +#: common.c:268 #, c-format msgid "reading subscriptions" msgstr "чтение подписок" -#: common.c:270 +#: common.c:271 #, c-format msgid "reading subscription membership of tables" msgstr "чтение информации о таблицах, включённых в подписки" -#: common.c:333 +#: common.c:334 #, c-format msgid "failed sanity check, parent OID %u of table \"%s\" (OID %u) not found" msgstr "" "нарушение целостности: родительская таблица с OID %u для таблицы \"%s\" (OID " "%u) не найдена" -#: common.c:375 +#: common.c:376 #, c-format msgid "invalid number of parents %d for table \"%s\"" msgstr "неверное число родителей (%d) для таблицы \"%s\"" -#: common.c:1098 +#: common.c:1117 #, c-format msgid "could not parse numeric array \"%s\": too many numbers" msgstr "не удалось разобрать числовой массив \"%s\": слишком много чисел" -#: common.c:1110 +#: common.c:1129 #, c-format msgid "could not parse numeric array \"%s\": invalid character in number" msgstr "не удалось разобрать числовой массив \"%s\": неверный символ в числе" @@ -522,7 +522,7 @@ 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 +#: compress_zstd.c:372 pg_backup_custom.c:649 pg_backup_directory.c:570 #: pg_backup_tar.c:740 pg_backup_tar.c:763 #, c-format msgid "could not read from input file: end of file" @@ -601,32 +601,32 @@ msgid "invalid format in filter read from file \"%s\" on line %d: %s" msgstr "" "неверный формат в фильтре, прочитанном из файла \"%s\", в строке %d: %s" -#: filter.c:241 filter.c:468 +#: filter.c:244 filter.c:471 #, c-format msgid "could not read from filter file \"%s\": %m" msgstr "не удалось прочитать файл фильтра \"%s\": %m" -#: filter.c:244 +#: filter.c:247 msgid "unexpected end of file" msgstr "неожиданный конец файла" -#: filter.c:311 +#: filter.c:314 msgid "missing object name pattern" msgstr "отсутствует шаблон имени объекта" -#: filter.c:422 +#: filter.c:425 msgid "no filter command found (expected \"include\" or \"exclude\")" msgstr "отсутствует команда фильтра (ожидалась \"include\" или \"exclude\")" -#: filter.c:433 +#: filter.c:436 msgid "invalid filter command (expected \"include\" or \"exclude\")" msgstr "неверная команда фильтра (ожидалась \"include\" или \"exclude\")" -#: filter.c:440 +#: filter.c:443 msgid "missing filter object type" msgstr "отсутствует тип объекта фильтра" -#: filter.c:447 +#: filter.c:450 #, c-format msgid "unsupported filter object type: \"%.*s\"" msgstr "неподдерживаемый тип объекта фильтра: \"%.*s\"" @@ -851,7 +851,7 @@ msgstr "восстановление большого объекта с OID %u" msgid "could not create large object %u: %s" msgstr "не удалось создать большой объект %u: %s" -#: pg_backup_archiver.c:1486 pg_dump.c:3888 +#: pg_backup_archiver.c:1486 pg_dump.c:3897 #, c-format msgid "could not open large object %u: %s" msgstr "не удалось открыть большой объект %u: %s" @@ -872,14 +872,14 @@ msgid "could not find entry for ID %d" msgstr "не найдена запись для ID %d" #: pg_backup_archiver.c:1600 pg_backup_directory.c:219 -#: pg_backup_directory.c:613 +#: pg_backup_directory.c:618 #, c-format msgid "could not close TOC file: %m" msgstr "не удалось закрыть файл оглавления: %m" #: 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 +#: pg_backup_directory.c:605 pg_backup_directory.c:671 +#: pg_backup_directory.c:689 pg_dumpall.c:506 #, c-format msgid "could not open output file \"%s\": %m" msgstr "не удалось открыть выходной файл \"%s\": %m" @@ -1006,12 +1006,12 @@ msgstr "не удалось открыть stdout для добавления в msgid "unrecognized file format \"%d\"" msgstr "неопознанный формат файла: \"%d\"" -#: pg_backup_archiver.c:2527 pg_backup_archiver.c:4647 +#: 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:2531 pg_backup_archiver.c:4660 +#: pg_backup_archiver.c:2531 pg_backup_archiver.c:4661 #, c-format msgid "worker process failed: exit code %d" msgstr "рабочий процесс завершился с кодом возврата %d" @@ -1031,87 +1031,87 @@ msgstr "восстановление таблиц со свойством WITH O msgid "unrecognized encoding \"%s\"" msgstr "нераспознанная кодировка \"%s\"" -#: pg_backup_archiver.c:2823 +#: pg_backup_archiver.c:2824 #, c-format msgid "invalid ENCODING item: %s" msgstr "неверный элемент ENCODING: %s" -#: pg_backup_archiver.c:2841 +#: pg_backup_archiver.c:2842 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "неверный элемент STDSTRINGS: %s" -#: pg_backup_archiver.c:2866 +#: pg_backup_archiver.c:2867 #, c-format msgid "schema \"%s\" not found" msgstr "схема \"%s\" не найдена" -#: pg_backup_archiver.c:2873 +#: pg_backup_archiver.c:2874 #, c-format msgid "table \"%s\" not found" msgstr "таблица \"%s\" не найдена" -#: pg_backup_archiver.c:2880 +#: pg_backup_archiver.c:2881 #, c-format msgid "index \"%s\" not found" msgstr "индекс \"%s\" не найден" -#: pg_backup_archiver.c:2887 +#: pg_backup_archiver.c:2888 #, c-format msgid "function \"%s\" not found" msgstr "функция \"%s\" не найдена" -#: pg_backup_archiver.c:2894 +#: pg_backup_archiver.c:2895 #, c-format msgid "trigger \"%s\" not found" msgstr "триггер \"%s\" не найден" -#: pg_backup_archiver.c:3325 +#: pg_backup_archiver.c:3326 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "не удалось переключить пользователя сеанса на \"%s\": %s" -#: pg_backup_archiver.c:3457 +#: 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:3518 +#: pg_backup_archiver.c:3519 #, c-format msgid "could not set \"default_tablespace\" to %s: %s" msgstr "не удалось задать для \"default_tablespace\" значение %s: %s" -#: pg_backup_archiver.c:3567 +#: pg_backup_archiver.c:3568 #, c-format msgid "could not set \"default_table_access_method\": %s" msgstr "не удалось задать \"default_table_access_method\": %s" -#: pg_backup_archiver.c:3616 +#: pg_backup_archiver.c:3617 #, c-format msgid "could not alter table access method: %s" msgstr "не удалось изменить табличный метод доступа: %s" -#: pg_backup_archiver.c:3717 +#: 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:4004 +#: pg_backup_archiver.c:4005 #, c-format msgid "did not find magic string in file header" msgstr "в заголовке файла не найдена нужная сигнатура" -#: pg_backup_archiver.c:4018 +#: pg_backup_archiver.c:4019 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "неподдерживаемая версия (%d.%d) в заголовке файла" -#: pg_backup_archiver.c:4023 +#: pg_backup_archiver.c:4024 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "несоответствие размера integer (%lu)" -#: pg_backup_archiver.c:4027 +#: pg_backup_archiver.c:4028 #, c-format msgid "" "archive was made on a machine with larger integers, some operations might " @@ -1120,12 +1120,12 @@ msgstr "" "архив был сделан на компьютере большей разрядности -- возможен сбой " "некоторых операций" -#: pg_backup_archiver.c:4037 +#: 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:4059 +#: pg_backup_archiver.c:4060 #, c-format msgid "" "archive is compressed, but this installation does not support compression " @@ -1134,42 +1134,42 @@ msgstr "" "архив сжат, но установленная версия не поддерживает сжатие (%s) -- данные " "будут недоступны" -#: pg_backup_archiver.c:4095 +#: pg_backup_archiver.c:4096 #, c-format msgid "invalid creation date in header" msgstr "неверная дата создания в заголовке" -#: pg_backup_archiver.c:4229 +#: pg_backup_archiver.c:4230 #, c-format msgid "processing item %d %s %s" msgstr "обработка объекта %d %s %s" -#: pg_backup_archiver.c:4314 +#: pg_backup_archiver.c:4315 #, c-format msgid "entering main parallel loop" msgstr "вход в основной параллельный цикл" -#: pg_backup_archiver.c:4325 +#: pg_backup_archiver.c:4326 #, c-format msgid "skipping item %d %s %s" msgstr "объект %d %s %s пропускается" -#: pg_backup_archiver.c:4334 +#: pg_backup_archiver.c:4335 #, c-format msgid "launching item %d %s %s" msgstr "объект %d %s %s запускается" -#: pg_backup_archiver.c:4388 +#: pg_backup_archiver.c:4389 #, c-format msgid "finished main parallel loop" msgstr "основной параллельный цикл закончен" -#: pg_backup_archiver.c:4424 +#: pg_backup_archiver.c:4425 #, c-format msgid "processing missed item %d %s %s" msgstr "обработка пропущенного объекта %d %s %s" -#: pg_backup_archiver.c:4966 +#: pg_backup_archiver.c:4967 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "создать таблицу \"%s\" не удалось, её данные не будут восстановлены" @@ -1262,12 +1262,12 @@ msgstr "сжатие активно" msgid "could not get server_version from libpq" msgstr "не удалось получить версию сервера из libpq" -#: pg_backup_db.c:53 pg_dumpall.c:1830 +#: 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:1831 +#: pg_backup_db.c:54 pg_dumpall.c:1880 #, c-format msgid "server version: %s; %s version: %s" msgstr "версия сервера: %s; версия %s: %s" @@ -1277,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:1677 pg_dumpall.c:1779 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1726 pg_dumpall.c:1828 msgid "Password: " msgstr "Пароль: " @@ -1291,18 +1291,18 @@ msgstr "не удалось переподключиться к базе" msgid "reconnection failed: %s" msgstr "переподключиться не удалось: %s" -#: 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 +#: pg_backup_db.c:190 pg_backup_db.c:264 pg_dump.c:789 pg_dump_sort.c:1427 +#: pg_dump_sort.c:1447 pg_dumpall.c:1753 pg_dumpall.c:1837 #, c-format msgid "%s" msgstr "%s" -#: pg_backup_db.c:271 pg_dumpall.c:1893 pg_dumpall.c:1916 +#: 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:1894 pg_dumpall.c:1917 +#: pg_backup_db.c:273 pg_dumpall.c:1943 pg_dumpall.c:1966 #, c-format msgid "Query was: %s" msgstr "Выполнялся запрос: %s" @@ -1340,7 +1340,7 @@ msgstr "ошибка в PQputCopyEnd: %s" msgid "COPY failed for table \"%s\": %s" msgstr "сбой команды COPY для таблицы \"%s\": %s" -#: pg_backup_db.c:521 pg_dump.c:2283 +#: pg_backup_db.c:521 pg_dump.c:2292 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "неожиданные лишние результаты получены при COPY для таблицы \"%s\"" @@ -1368,8 +1368,8 @@ msgstr "не удалось закрыть каталог \"%s\": %m" msgid "could not create directory \"%s\": %m" msgstr "не удалось создать каталог \"%s\": %m" -#: pg_backup_directory.c:357 pg_backup_directory.c:506 -#: pg_backup_directory.c:544 +#: pg_backup_directory.c:357 pg_backup_directory.c:511 +#: pg_backup_directory.c:549 #, c-format msgid "could not write to output file: %s" msgstr "не удалось записать в выходной файл: %s" @@ -1384,43 +1384,43 @@ msgstr "не удалось закрыть файл данных: %m" msgid "could not close data file \"%s\": %m" msgstr "не удалось закрыть файл данных \"%s\": %m" -#: pg_backup_directory.c:455 +#: pg_backup_directory.c:460 #, c-format msgid "could not open large object TOC file \"%s\" for input: %m" msgstr "" "не удалось открыть для чтения файл оглавления больших объектов \"%s\": %m" -#: pg_backup_directory.c:466 +#: pg_backup_directory.c:471 #, c-format msgid "invalid line in large object TOC file \"%s\": \"%s\"" msgstr "неверная строка в файле оглавления больших объектов \"%s\": \"%s\"" -#: pg_backup_directory.c:475 +#: pg_backup_directory.c:480 #, c-format msgid "error reading large object TOC file \"%s\"" msgstr "ошибка чтения файла оглавления больших объектов \"%s\"" -#: pg_backup_directory.c:479 +#: pg_backup_directory.c:484 #, c-format msgid "could not close large object TOC file \"%s\": %m" msgstr "не удалось закрыть файл оглавления больших объектов \"%s\": %m" -#: pg_backup_directory.c:702 +#: pg_backup_directory.c:707 #, c-format msgid "could not close LO data file: %m" msgstr "не удалось закрыть файл данных LO: %m" -#: pg_backup_directory.c:712 +#: pg_backup_directory.c:717 #, c-format msgid "could not write to LOs TOC file: %s" msgstr "не удалось записать в файл оглавления LO: %s" -#: pg_backup_directory.c:728 +#: pg_backup_directory.c:733 #, c-format msgid "could not close LOs TOC file: %m" msgstr "не удалось закрыть файл оглавления LO: %m" -#: pg_backup_directory.c:747 +#: pg_backup_directory.c:752 #, c-format msgid "file name too long: \"%s\"" msgstr "слишком длинное имя файла: \"%s\"" @@ -1522,7 +1522,7 @@ msgstr "" msgid "unrecognized section name: \"%s\"" msgstr "нераспознанное имя раздела: \"%s\"" -#: pg_backup_utils.c:55 pg_dump.c:694 pg_dump.c:711 pg_dumpall.c:370 +#: pg_backup_utils.c:55 pg_dump.c:695 pg_dump.c:712 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 @@ -1535,41 +1535,41 @@ msgstr "Для дополнительной информации попробу msgid "out of on_exit_nicely slots" msgstr "превышен предел обработчиков штатного выхода" -#: pg_dump.c:709 pg_dumpall.c:378 pg_restore.c:321 +#: pg_dump.c:710 pg_dumpall.c:378 pg_restore.c:321 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "слишком много аргументов командной строки (первый: \"%s\")" -#: pg_dump.c:728 pg_restore.c:344 +#: pg_dump.c:729 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:731 +#: pg_dump.c:732 #, 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:734 +#: pg_dump.c:735 #, c-format msgid "option --include-foreign-data is not supported with parallel backup" msgstr "" "параметр --include-foreign-data не поддерживается при копировании в " "параллельном режиме" -#: pg_dump.c:737 pg_restore.c:347 +#: pg_dump.c:738 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:740 pg_dumpall.c:408 pg_restore.c:375 +#: pg_dump.c:741 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:747 +#: pg_dump.c:748 #, c-format msgid "" "option --on-conflict-do-nothing requires option --inserts, --rows-per-" @@ -1578,49 +1578,49 @@ msgstr "" "параметр --on-conflict-do-nothing требует указания --inserts, --rows-per-" "insert или --column-inserts" -#: pg_dump.c:776 +#: pg_dump.c:777 #, c-format msgid "unrecognized compression algorithm: \"%s\"" msgstr "нераспознанный алгоритм сжатия: \"%s\"" -#: pg_dump.c:783 +#: pg_dump.c:784 #, c-format msgid "invalid compression specification: %s" msgstr "неправильное указание сжатия: %s" -#: pg_dump.c:796 +#: pg_dump.c:797 #, c-format msgid "compression option \"%s\" is not currently supported by pg_dump" msgstr "pg_dump в настоящее время не поддерживает параметр сжатия \"%s\"" -#: pg_dump.c:808 +#: pg_dump.c:809 #, c-format msgid "parallel backup only supported by the directory format" msgstr "" "параллельное резервное копирование поддерживается только с форматом " "\"каталог\"" -#: pg_dump.c:854 +#: pg_dump.c:855 #, c-format msgid "last built-in OID is %u" msgstr "последний системный OID: %u" -#: pg_dump.c:863 +#: pg_dump.c:864 #, c-format msgid "no matching schemas were found" msgstr "соответствующие схемы не найдены" -#: pg_dump.c:880 +#: pg_dump.c:881 #, c-format msgid "no matching tables were found" msgstr "соответствующие таблицы не найдены" -#: pg_dump.c:908 +#: pg_dump.c:909 #, c-format msgid "no matching extensions were found" msgstr "соответствующие расширения не найдены" -#: pg_dump.c:1092 +#: pg_dump.c:1093 #, c-format msgid "" "%s dumps a database as a text file or to other formats.\n" @@ -1629,17 +1629,17 @@ msgstr "" "%s сохраняет резервную копию БД в текстовом файле или другом виде.\n" "\n" -#: pg_dump.c:1093 pg_dumpall.c:635 pg_restore.c:452 +#: pg_dump.c:1094 pg_dumpall.c:636 pg_restore.c:452 #, c-format msgid "Usage:\n" msgstr "Использование:\n" -#: pg_dump.c:1094 +#: pg_dump.c:1095 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [ПАРАМЕТР]... [ИМЯ_БД]\n" -#: pg_dump.c:1096 pg_dumpall.c:638 pg_restore.c:455 +#: pg_dump.c:1097 pg_dumpall.c:639 pg_restore.c:455 #, c-format msgid "" "\n" @@ -1648,12 +1648,12 @@ msgstr "" "\n" "Общие параметры:\n" -#: pg_dump.c:1097 +#: pg_dump.c:1098 #, c-format msgid " -f, --file=FILENAME output file or directory name\n" msgstr " -f, --file=ИМЯ имя выходного файла или каталога\n" -#: pg_dump.c:1098 +#: pg_dump.c:1099 #, c-format msgid "" " -F, --format=c|d|t|p output file format (custom, directory, tar,\n" @@ -1663,7 +1663,7 @@ msgstr "" " (пользовательский | каталог | tar |\n" " текстовый (по умолчанию))\n" -#: pg_dump.c:1100 +#: pg_dump.c:1101 #, c-format msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr "" @@ -1671,18 +1671,18 @@ msgstr "" "число\n" " заданий\n" -#: pg_dump.c:1101 pg_dumpall.c:640 +#: pg_dump.c:1102 pg_dumpall.c:641 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose режим подробных сообщений\n" -#: pg_dump.c:1102 pg_dumpall.c:641 +#: pg_dump.c:1103 pg_dumpall.c:642 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" # well-spelled: ИНФО -#: pg_dump.c:1103 +#: pg_dump.c:1104 #, c-format msgid "" " -Z, --compress=METHOD[:DETAIL]\n" @@ -1691,7 +1691,7 @@ msgstr "" " -Z, --compress=МЕТОД[:ДОП_ИНФО]\n" " выполнять сжатие как указано\n" -#: pg_dump.c:1105 pg_dumpall.c:642 +#: pg_dump.c:1106 pg_dumpall.c:643 #, c-format msgid "" " --lock-wait-timeout=TIMEOUT fail after waiting TIMEOUT for a table lock\n" @@ -1699,7 +1699,7 @@ msgstr "" " --lock-wait-timeout=ТАЙМ-АУТ прервать операцию при тайм-ауте блокировки " "таблицы\n" -#: pg_dump.c:1106 pg_dumpall.c:670 +#: pg_dump.c:1107 pg_dumpall.c:671 #, c-format msgid "" " --no-sync do not wait for changes to be written safely " @@ -1708,17 +1708,17 @@ msgstr "" " --no-sync не ждать надёжного сохранения изменений на " "диске\n" -#: pg_dump.c:1107 +#: pg_dump.c:1108 #, 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 +#: pg_dump.c:1109 pg_dumpall.c:644 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" -#: pg_dump.c:1110 pg_dumpall.c:644 +#: pg_dump.c:1111 pg_dumpall.c:645 #, c-format msgid "" "\n" @@ -1727,35 +1727,35 @@ msgstr "" "\n" "Параметры, управляющие выводом:\n" -#: pg_dump.c:1111 pg_dumpall.c:645 +#: pg_dump.c:1112 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:1112 +#: pg_dump.c:1113 #, c-format msgid " -b, --large-objects include large objects in dump\n" msgstr " -b, --large-objects выгрузить большие объекты\n" -#: pg_dump.c:1113 +#: pg_dump.c:1114 #, c-format msgid " --blobs (same as --large-objects, deprecated)\n" msgstr "" " --blobs (устаревшая альтернатива --large-objects)\n" -#: pg_dump.c:1114 +#: pg_dump.c:1115 #, c-format msgid " -B, --no-large-objects exclude large objects in dump\n" msgstr " -B, --no-large-objects исключить из выгрузки большие объекты\n" -#: pg_dump.c:1115 +#: pg_dump.c:1116 #, 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 +#: pg_dump.c:1117 pg_restore.c:466 #, c-format msgid "" " -c, --clean clean (drop) database objects before " @@ -1764,7 +1764,7 @@ msgstr "" " -c, --clean очистить (удалить) объекты БД при " "восстановлении\n" -#: pg_dump.c:1117 +#: pg_dump.c:1118 #, c-format msgid "" " -C, --create include commands to create database in dump\n" @@ -1772,28 +1772,28 @@ msgstr "" " -C, --create добавить в копию команды создания базы " "данных\n" -#: pg_dump.c:1118 +#: pg_dump.c:1119 #, c-format msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" msgstr "" " -e, --extension=ШАБЛОН выгрузить только указанное расширение(я)\n" -#: pg_dump.c:1119 pg_dumpall.c:647 +#: pg_dump.c:1120 pg_dumpall.c:648 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=КОДИРОВКА выгружать данные в заданной кодировке\n" -#: pg_dump.c:1120 +#: pg_dump.c:1121 #, c-format msgid " -n, --schema=PATTERN dump the specified schema(s) only\n" msgstr " -n, --schema=ШАБЛОН выгрузить только указанную схему(ы)\n" -#: pg_dump.c:1121 +#: pg_dump.c:1122 #, c-format msgid " -N, --exclude-schema=PATTERN do NOT dump the specified schema(s)\n" msgstr " -N, --exclude-schema=ШАБЛОН НЕ выгружать указанную схему(ы)\n" -#: pg_dump.c:1122 +#: pg_dump.c:1123 #, c-format msgid "" " -O, --no-owner skip restoration of object ownership in\n" @@ -1802,12 +1802,12 @@ msgstr "" " -O, --no-owner не восстанавливать владение объектами\n" " при использовании текстового формата\n" -#: pg_dump.c:1124 pg_dumpall.c:651 +#: pg_dump.c:1125 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:1125 +#: pg_dump.c:1126 #, c-format msgid "" " -S, --superuser=NAME superuser user name to use in plain-text " @@ -1816,27 +1816,27 @@ msgstr "" " -S, --superuser=ИМЯ имя пользователя, который будет задействован\n" " при восстановлении из текстового формата\n" -#: pg_dump.c:1126 +#: pg_dump.c:1127 #, c-format msgid " -t, --table=PATTERN dump only the specified table(s)\n" msgstr " -t, --table=ШАБЛОН выгрузить только указанную таблицу(ы)\n" -#: pg_dump.c:1127 +#: pg_dump.c:1128 #, c-format msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=ШАБЛОН НЕ выгружать указанную таблицу(ы)\n" -#: pg_dump.c:1128 pg_dumpall.c:654 +#: pg_dump.c:1129 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:1129 pg_dumpall.c:655 +#: pg_dump.c:1130 pg_dumpall.c:656 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr " --binary-upgrade только для утилит обновления БД\n" -#: pg_dump.c:1130 pg_dumpall.c:656 +#: pg_dump.c:1131 pg_dumpall.c:657 #, c-format msgid "" " --column-inserts dump data as INSERT commands with column " @@ -1845,7 +1845,7 @@ msgstr "" " --column-inserts выгружать данные в виде INSERT с именами " "столбцов\n" -#: pg_dump.c:1131 pg_dumpall.c:657 +#: pg_dump.c:1132 pg_dumpall.c:658 #, c-format msgid "" " --disable-dollar-quoting disable dollar quoting, use SQL standard " @@ -1854,7 +1854,7 @@ msgstr "" " --disable-dollar-quoting отключить спецстроки с $, выводить строки\n" " по стандарту SQL\n" -#: pg_dump.c:1132 pg_dumpall.c:658 pg_restore.c:483 +#: pg_dump.c:1133 pg_dumpall.c:659 pg_restore.c:483 #, c-format msgid "" " --disable-triggers disable triggers during data-only restore\n" @@ -1862,7 +1862,7 @@ msgstr "" " --disable-triggers отключить триггеры при восстановлении\n" " только данных, без схемы\n" -#: pg_dump.c:1133 +#: pg_dump.c:1134 #, c-format msgid "" " --enable-row-security enable row security (dump only content user " @@ -1873,12 +1873,12 @@ msgstr "" "только\n" " те данные, которые доступны пользователю)\n" -#: pg_dump.c:1135 +#: pg_dump.c:1136 #, c-format msgid " --exclude-extension=PATTERN do NOT dump the specified extension(s)\n" msgstr " --exclude-extension=ШАБЛОН НЕ выгружать указанное расширение(я)\n" -#: pg_dump.c:1136 +#: pg_dump.c:1137 #, c-format msgid "" " --exclude-table-and-children=PATTERN\n" @@ -1890,7 +1890,7 @@ msgstr "" " НЕ выгружать указанную таблицу(ы), а также\n" " её секции и дочерние таблицы\n" -#: pg_dump.c:1139 +#: pg_dump.c:1140 #, c-format msgid "" " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n" @@ -1898,7 +1898,7 @@ msgstr "" " --exclude-table-data=ШАБЛОН НЕ выгружать данные указанной таблицы " "(таблиц)\n" -#: pg_dump.c:1140 +#: pg_dump.c:1141 #, c-format msgid "" " --exclude-table-data-and-children=PATTERN\n" @@ -1910,7 +1910,7 @@ msgstr "" "(таблиц),\n" " а также её секций и дочерних таблиц\n" -#: pg_dump.c:1143 pg_dumpall.c:660 +#: pg_dump.c:1144 pg_dumpall.c:661 #, c-format msgid "" " --extra-float-digits=NUM override default setting for " @@ -1918,7 +1918,7 @@ msgid "" msgstr "" " --extra-float-digits=ЧИСЛО переопределить значение extra_float_digits\n" -#: pg_dump.c:1144 +#: pg_dump.c:1145 #, c-format msgid "" " --filter=FILENAME include or exclude objects and data from " @@ -1929,13 +1929,13 @@ msgstr "" " дампа в соответствии с выражениями в этом " "файле\n" -#: pg_dump.c:1146 pg_dumpall.c:662 pg_restore.c:487 +#: pg_dump.c:1147 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:1147 +#: pg_dump.c:1148 #, c-format msgid "" " --include-foreign-data=PATTERN\n" @@ -1946,7 +1946,7 @@ msgstr "" " включать в копию данные сторонних таблиц с\n" " серверов с именами, подпадающими под ШАБЛОН\n" -#: pg_dump.c:1150 pg_dumpall.c:663 +#: pg_dump.c:1151 pg_dumpall.c:664 #, c-format msgid "" " --inserts dump data as INSERT commands, rather than " @@ -1955,57 +1955,57 @@ msgstr "" " --inserts выгрузить данные в виде команд INSERT, не " "COPY\n" -#: pg_dump.c:1151 pg_dumpall.c:664 +#: pg_dump.c:1152 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:1152 pg_dumpall.c:665 +#: pg_dump.c:1153 pg_dumpall.c:666 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments не выгружать комментарии\n" -#: pg_dump.c:1153 pg_dumpall.c:666 +#: pg_dump.c:1154 pg_dumpall.c:667 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications не выгружать публикации\n" -#: pg_dump.c:1154 pg_dumpall.c:668 +#: pg_dump.c:1155 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:1155 pg_dumpall.c:669 +#: pg_dump.c:1156 pg_dumpall.c:670 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions не выгружать подписки\n" -#: pg_dump.c:1156 pg_dumpall.c:671 +#: pg_dump.c:1157 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:1157 pg_dumpall.c:672 +#: pg_dump.c:1158 pg_dumpall.c:673 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr "" " --no-tablespaces не выгружать назначения табличных " "пространств\n" -#: pg_dump.c:1158 pg_dumpall.c:673 +#: pg_dump.c:1159 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:1159 pg_dumpall.c:674 +#: pg_dump.c:1160 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:1160 pg_dumpall.c:675 +#: pg_dump.c:1161 pg_dumpall.c:676 #, c-format msgid "" " --on-conflict-do-nothing add ON CONFLICT DO NOTHING to INSERT " @@ -2014,7 +2014,7 @@ msgstr "" " --on-conflict-do-nothing добавлять ON CONFLICT DO NOTHING в команды " "INSERT\n" -#: pg_dump.c:1161 pg_dumpall.c:676 +#: pg_dump.c:1162 pg_dumpall.c:677 #, c-format msgid "" " --quote-all-identifiers quote all identifiers, even if not key words\n" @@ -2022,7 +2022,7 @@ msgstr "" " --quote-all-identifiers заключать в кавычки все идентификаторы,\n" " а не только ключевые слова\n" -#: pg_dump.c:1162 pg_dumpall.c:677 +#: pg_dump.c:1163 pg_dumpall.c:678 #, c-format msgid "" " --rows-per-insert=NROWS number of rows per INSERT; implies --inserts\n" @@ -2030,7 +2030,7 @@ msgstr "" " --rows-per-insert=ЧИСЛО число строк в одном INSERT; подразумевает --" "inserts\n" -#: pg_dump.c:1163 +#: pg_dump.c:1164 #, c-format msgid "" " --section=SECTION dump named section (pre-data, data, or post-" @@ -2039,7 +2039,7 @@ msgstr "" " --section=РАЗДЕЛ выгрузить заданный раздел\n" " (pre-data, data или post-data)\n" -#: pg_dump.c:1164 +#: pg_dump.c:1165 #, c-format msgid "" " --serializable-deferrable wait until the dump can run without " @@ -2048,13 +2048,13 @@ msgstr "" " --serializable-deferrable дождаться момента для выгрузки данных без " "аномалий\n" -#: pg_dump.c:1165 +#: pg_dump.c:1166 #, c-format msgid " --snapshot=SNAPSHOT use given snapshot for the dump\n" msgstr "" " --snapshot=СНИМОК использовать при выгрузке заданный снимок\n" -#: pg_dump.c:1166 pg_restore.c:497 +#: pg_dump.c:1167 pg_restore.c:497 #, c-format msgid "" " --strict-names require table and/or schema include patterns " @@ -2067,7 +2067,7 @@ msgstr "" "минимум\n" " один объект\n" -#: pg_dump.c:1168 +#: pg_dump.c:1169 #, c-format msgid "" " --table-and-children=PATTERN dump only the specified table(s), including\n" @@ -2077,7 +2077,7 @@ msgstr "" "также\n" " её секции и дочерние таблицы\n" -#: pg_dump.c:1170 pg_dumpall.c:678 pg_restore.c:500 +#: pg_dump.c:1171 pg_dumpall.c:679 pg_restore.c:500 #, c-format msgid "" " --use-set-session-authorization\n" @@ -2089,7 +2089,7 @@ msgstr "" " устанавливать владельца, используя команды\n" " SET SESSION AUTHORIZATION вместо ALTER OWNER\n" -#: pg_dump.c:1174 pg_dumpall.c:682 pg_restore.c:504 +#: pg_dump.c:1175 pg_dumpall.c:683 pg_restore.c:504 #, c-format msgid "" "\n" @@ -2098,34 +2098,34 @@ msgstr "" "\n" "Параметры подключения:\n" -#: pg_dump.c:1175 +#: pg_dump.c:1176 #, c-format msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=БД имя базы данных для выгрузки\n" -#: pg_dump.c:1176 pg_dumpall.c:684 pg_restore.c:505 +#: pg_dump.c:1177 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" -#: pg_dump.c:1177 pg_dumpall.c:686 pg_restore.c:506 +#: pg_dump.c:1178 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:1178 pg_dumpall.c:687 pg_restore.c:507 +#: pg_dump.c:1179 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:1179 pg_dumpall.c:688 pg_restore.c:508 +#: pg_dump.c:1180 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:1180 pg_dumpall.c:689 pg_restore.c:509 +#: pg_dump.c:1181 pg_dumpall.c:690 pg_restore.c:509 #, c-format msgid "" " -W, --password force password prompt (should happen " @@ -2133,12 +2133,12 @@ msgid "" msgstr "" " -W, --password запрашивать пароль всегда (обычно не требуется)\n" -#: pg_dump.c:1181 pg_dumpall.c:690 +#: pg_dump.c:1182 pg_dumpall.c:691 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=ИМЯ_РОЛИ выполнить SET ROLE перед выгрузкой\n" -#: pg_dump.c:1183 +#: pg_dump.c:1184 #, c-format msgid "" "\n" @@ -2151,22 +2151,22 @@ msgstr "" "PGDATABASE.\n" "\n" -#: pg_dump.c:1185 pg_dumpall.c:694 pg_restore.c:516 +#: pg_dump.c:1186 pg_dumpall.c:695 pg_restore.c:516 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Об ошибках сообщайте по адресу <%s>.\n" -#: pg_dump.c:1186 pg_dumpall.c:695 pg_restore.c:517 +#: pg_dump.c:1187 pg_dumpall.c:696 pg_restore.c:517 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашняя страница %s: <%s>\n" -#: pg_dump.c:1205 pg_dumpall.c:518 +#: pg_dump.c:1206 pg_dumpall.c:518 #, c-format msgid "invalid client encoding \"%s\" specified" msgstr "указана неверная клиентская кодировка \"%s\"" -#: pg_dump.c:1352 +#: pg_dump.c:1354 #, c-format msgid "" "parallel dumps from standby servers are not supported by this server version" @@ -2174,170 +2174,170 @@ msgstr "" "выгрузка дампа в параллельном режиме с ведомых серверов не поддерживается " "данной версией сервера" -#: pg_dump.c:1417 +#: pg_dump.c:1419 #, c-format msgid "invalid output format \"%s\" specified" msgstr "указан неверный формат вывода: \"%s\"" -#: pg_dump.c:1458 pg_dump.c:1514 pg_dump.c:1567 pg_dumpall.c:1467 +#: pg_dump.c:1460 pg_dump.c:1516 pg_dump.c:1569 pg_dumpall.c:1516 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "неверное полное имя (слишком много компонентов): %s" -#: pg_dump.c:1466 +#: pg_dump.c:1468 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "схемы, соответствующие шаблону \"%s\", не найдены" -#: pg_dump.c:1519 +#: pg_dump.c:1521 #, c-format msgid "no matching extensions were found for pattern \"%s\"" msgstr "расширения, соответствующие шаблону \"%s\", не найдены" -#: pg_dump.c:1572 +#: pg_dump.c:1574 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "сторонние серверы, соответствующие шаблону \"%s\", не найдены" -#: pg_dump.c:1643 +#: pg_dump.c:1645 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "неверное имя отношения (слишком много компонентов): %s" -#: pg_dump.c:1665 +#: pg_dump.c:1667 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "таблицы, соответствующие шаблону \"%s\", не найдены" -#: pg_dump.c:1692 +#: pg_dump.c:1694 #, c-format msgid "You are currently not connected to a database." msgstr "В данный момент вы не подключены к базе данных." -#: pg_dump.c:1695 +#: pg_dump.c:1697 #, c-format msgid "cross-database references are not implemented: %s" msgstr "ссылки между базами не реализованы: %s" -#: pg_dump.c:2154 +#: pg_dump.c:2163 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "выгрузка содержимого таблицы \"%s.%s\"" -#: pg_dump.c:2264 +#: pg_dump.c:2273 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "Ошибка выгрузки таблицы \"%s\": сбой в PQgetCopyData()." -#: pg_dump.c:2265 pg_dump.c:2275 +#: pg_dump.c:2274 pg_dump.c:2284 #, c-format msgid "Error message from server: %s" msgstr "Сообщение об ошибке с сервера: %s" # skip-rule: language-mix -#: pg_dump.c:2266 pg_dump.c:2276 +#: pg_dump.c:2275 pg_dump.c:2285 #, c-format msgid "Command was: %s" msgstr "Выполнялась команда: %s" -#: pg_dump.c:2274 +#: pg_dump.c:2283 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "Ошибка выгрузки таблицы \"%s\": сбой в PQgetResult()." -#: pg_dump.c:2365 +#: pg_dump.c:2374 #, c-format msgid "wrong number of fields retrieved from table \"%s\"" msgstr "из таблицы \"%s\" получено неверное количество полей" -#: pg_dump.c:3067 +#: pg_dump.c:3076 #, c-format msgid "saving database definition" msgstr "сохранение определения базы данных" -#: pg_dump.c:3176 +#: pg_dump.c:3185 #, c-format msgid "unrecognized locale provider: %s" msgstr "нераспознанный провайдер локали: %s" -#: pg_dump.c:3537 +#: pg_dump.c:3546 #, c-format msgid "saving encoding = %s" msgstr "сохранение кодировки (%s)" -#: pg_dump.c:3562 +#: pg_dump.c:3571 #, c-format msgid "saving \"standard_conforming_strings = %s\"" msgstr "сохранение \"standard_conforming_strings = %s\"" -#: pg_dump.c:3601 +#: pg_dump.c:3610 #, c-format msgid "could not parse result of current_schemas()" msgstr "не удалось разобрать результат current_schemas()" -#: pg_dump.c:3620 +#: pg_dump.c:3629 #, c-format msgid "saving \"search_path = %s\"" msgstr "сохранение \"search_path = %s\"" -#: pg_dump.c:3656 +#: pg_dump.c:3665 #, c-format msgid "reading large objects" msgstr "чтение больших объектов" -#: pg_dump.c:3877 +#: pg_dump.c:3886 #, c-format msgid "saving large objects \"%s\"" msgstr "сохранение больших объектов \"%s\"" -#: pg_dump.c:3898 +#: pg_dump.c:3907 #, c-format msgid "error reading large object %u: %s" msgstr "ошибка чтения большого объекта %u: %s" -#: pg_dump.c:4001 +#: pg_dump.c:4010 #, c-format msgid "reading row-level security policies" msgstr "чтение политик защиты на уровне строк" -#: pg_dump.c:4142 +#: pg_dump.c:4151 #, c-format msgid "unexpected policy command type: %c" msgstr "нераспознанный тип команды в политике: %c" -#: pg_dump.c:4592 pg_dump.c:5150 pg_dump.c:12364 pg_dump.c:18249 -#: pg_dump.c:18251 pg_dump.c:18873 +#: pg_dump.c:4601 pg_dump.c:5159 pg_dump.c:12475 pg_dump.c:18399 +#: pg_dump.c:18401 pg_dump.c:19023 #, c-format msgid "could not parse %s array" msgstr "не удалось разобрать массив %s" -#: pg_dump.c:4806 +#: pg_dump.c:4815 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "" "подписки не выгружены, так как текущий пользователь не суперпользователь" -#: pg_dump.c:5012 +#: pg_dump.c:5021 #, c-format msgid "subscription with OID %u does not exist" msgstr "подписка с OID %u не существует" -#: pg_dump.c:5019 +#: pg_dump.c:5028 #, c-format msgid "failed sanity check, table with OID %u not found" msgstr "нарушение целостности: таблица с OID %u не найдена" -#: pg_dump.c:5582 +#: pg_dump.c:5591 #, c-format msgid "could not find parent extension for %s %s" msgstr "не удалось найти родительское расширение для %s %s" -#: pg_dump.c:5727 +#: pg_dump.c:5736 #, c-format msgid "schema with OID %u does not exist" msgstr "схема с OID %u не существует" -#: pg_dump.c:7209 pg_dump.c:17620 +#: pg_dump.c:7246 pg_dump.c:17770 #, c-format msgid "" "failed sanity check, parent table with OID %u of sequence with OID %u not " @@ -2346,7 +2346,7 @@ msgstr "" "нарушение целостности: по OID %u не удалось найти родительскую таблицу " "последовательности с OID %u" -#: pg_dump.c:7354 +#: pg_dump.c:7391 #, c-format msgid "" "failed sanity check, table OID %u appearing in pg_partitioned_table not found" @@ -2354,18 +2354,18 @@ msgstr "" "нарушение целостности: таблица с OID %u, фигурирующим в " "pg_partitioned_table, не найдена" -#: pg_dump.c:7585 pg_dump.c:7859 pg_dump.c:8306 pg_dump.c:8920 pg_dump.c:9042 -#: pg_dump.c:9190 +#: pg_dump.c:7622 pg_dump.c:7896 pg_dump.c:8365 pg_dump.c:8979 pg_dump.c:9101 +#: pg_dump.c:9249 #, c-format msgid "unrecognized table OID %u" msgstr "нераспознанный OID таблицы %u" -#: pg_dump.c:7589 +#: pg_dump.c:7626 #, c-format msgid "unexpected index data for table \"%s\"" msgstr "неожиданно получены данные индекса для таблицы \"%s\"" -#: pg_dump.c:8091 +#: pg_dump.c:8150 #, c-format msgid "" "failed sanity check, parent table with OID %u of pg_rewrite entry with OID " @@ -2374,32 +2374,32 @@ msgstr "" "нарушение целостности: по OID %u не удалось найти родительскую таблицу для " "записи pg_rewrite с OID %u" -#: pg_dump.c:8924 +#: pg_dump.c:8983 #, c-format msgid "unexpected column data for table \"%s\"" msgstr "неожиданно получены данные столбцов для таблицы \"%s\"" -#: pg_dump.c:8953 +#: pg_dump.c:9012 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "неверная нумерация столбцов в таблице \"%s\"" -#: pg_dump.c:9004 +#: pg_dump.c:9063 #, c-format msgid "finding table default expressions" msgstr "поиск выражений по умолчанию для таблиц" -#: pg_dump.c:9046 +#: pg_dump.c:9105 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "неверное значение adnum (%d) в таблице \"%s\"" -#: pg_dump.c:9140 +#: pg_dump.c:9199 #, c-format msgid "finding table check constraints" msgstr "поиск ограничений-проверок для таблиц" -#: pg_dump.c:9194 +#: pg_dump.c:9253 #, 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" @@ -2410,59 +2410,59 @@ msgstr[1] "" msgstr[2] "" "ожидалось %d ограничений-проверок для таблицы \"%s\", но найдено: %d" -#: pg_dump.c:9198 +#: pg_dump.c:9257 #, c-format msgid "The system catalogs might be corrupted." msgstr "Возможно, повреждены системные каталоги." -#: pg_dump.c:9888 +#: pg_dump.c:9947 #, c-format msgid "role with OID %u does not exist" msgstr "роль с OID %u не существует" -#: pg_dump.c:10000 pg_dump.c:10029 +#: pg_dump.c:10059 pg_dump.c:10088 #, c-format msgid "unsupported pg_init_privs entry: %u %u %d" msgstr "неподдерживаемая запись в pg_init_privs: %u %u %d" -#: pg_dump.c:10576 +#: pg_dump.c:10635 #, c-format msgid "missing metadata for large objects \"%s\"" msgstr "отсутствуют метаданные о больших объектах \"%s\"" -#: pg_dump.c:10859 +#: pg_dump.c:10918 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "у типа данных \"%s\" по-видимому неправильный тип типа" # TO REVEIW -#: pg_dump.c:12433 +#: pg_dump.c:12544 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "недопустимое значение provolatile для функции \"%s\"" # TO REVEIW -#: pg_dump.c:12483 pg_dump.c:14379 +#: pg_dump.c:12594 pg_dump.c:14490 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "недопустимое значение proparallel для функции \"%s\"" -#: pg_dump.c:12613 pg_dump.c:12719 pg_dump.c:12726 +#: pg_dump.c:12724 pg_dump.c:12830 pg_dump.c:12837 #, c-format msgid "could not find function definition for function with OID %u" msgstr "не удалось найти определение функции для функции с OID %u" -#: pg_dump.c:12652 +#: pg_dump.c:12763 #, c-format msgid "bogus value in pg_cast.castfunc or pg_cast.castmethod field" msgstr "неприемлемое значение в поле pg_cast.castfunc или pg_cast.castmethod" -#: pg_dump.c:12655 +#: pg_dump.c:12766 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "неприемлемое значение в поле pg_cast.castmethod" -#: pg_dump.c:12745 +#: pg_dump.c:12856 #, c-format msgid "" "bogus transform definition, at least one of trffromsql and trftosql should " @@ -2471,63 +2471,63 @@ msgstr "" "неприемлемое определение преобразования (trffromsql или trftosql должно быть " "ненулевым)" -#: pg_dump.c:12762 +#: pg_dump.c:12873 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "неприемлемое значение в поле pg_transform.trffromsql" -#: pg_dump.c:12783 +#: pg_dump.c:12894 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "неприемлемое значение в поле pg_transform.trftosql" -#: pg_dump.c:12928 +#: pg_dump.c:13039 #, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" msgstr "постфиксные операторы больше не поддерживаются (оператор \"%s\")" -#: pg_dump.c:13098 +#: pg_dump.c:13209 #, c-format msgid "could not find operator with OID %s" msgstr "оператор с OID %s не найден" -#: pg_dump.c:13166 +#: pg_dump.c:13277 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "неверный тип \"%c\" метода доступа \"%s\"" -#: pg_dump.c:13840 pg_dump.c:13908 +#: pg_dump.c:13951 pg_dump.c:14019 #, c-format msgid "unrecognized collation provider: %s" msgstr "нераспознанный провайдер правил сортировки: %s" -#: pg_dump.c:13849 pg_dump.c:13856 pg_dump.c:13867 pg_dump.c:13877 -#: pg_dump.c:13892 +#: pg_dump.c:13960 pg_dump.c:13967 pg_dump.c:13978 pg_dump.c:13988 +#: pg_dump.c:14003 #, c-format msgid "invalid collation \"%s\"" msgstr "неверное правило сортировки \"%s\"" -#: pg_dump.c:14298 +#: pg_dump.c:14409 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "нераспознанное значение aggfinalmodify для агрегата \"%s\"" -#: pg_dump.c:14354 +#: pg_dump.c:14465 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "нераспознанное значение aggmfinalmodify для агрегата \"%s\"" -#: pg_dump.c:15071 +#: pg_dump.c:15182 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "нераспознанный тип объекта в определении прав по умолчанию: %d" -#: pg_dump.c:15087 +#: pg_dump.c:15198 #, c-format msgid "could not parse default ACL list (%s)" msgstr "не удалось разобрать список прав по умолчанию (%s)" -#: pg_dump.c:15171 +#: pg_dump.c:15282 #, c-format msgid "" "could not parse initial ACL list (%s) or default (%s) for object \"%s\" (%s)" @@ -2535,20 +2535,20 @@ msgstr "" "не удалось разобрать изначальный список ACL (%s) или ACL по умолчанию (%s) " "для объекта \"%s\" (%s)" -#: pg_dump.c:15196 +#: pg_dump.c:15307 #, 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:15739 +#: pg_dump.c:15850 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "" "запрос на получение определения представления \"%s\" не возвратил данные" -#: pg_dump.c:15742 +#: pg_dump.c:15853 #, c-format msgid "" "query to obtain definition of view \"%s\" returned more than one definition" @@ -2556,49 +2556,49 @@ msgstr "" "запрос на получение определения представления \"%s\" возвратил несколько " "определений" -#: pg_dump.c:15749 +#: pg_dump.c:15860 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "определение представления \"%s\" пустое (длина равна нулю)" -#: pg_dump.c:15834 +#: pg_dump.c:15945 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "свойство WITH OIDS больше не поддерживается (таблица \"%s\")" -#: pg_dump.c:16821 +#: pg_dump.c:16932 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "неверный номер столбца %d для таблицы \"%s\"" -#: pg_dump.c:16899 +#: pg_dump.c:17010 #, c-format msgid "could not parse index statistic columns" msgstr "не удалось разобрать столбцы статистики в индексе" -#: pg_dump.c:16901 +#: pg_dump.c:17012 #, c-format msgid "could not parse index statistic values" msgstr "не удалось разобрать значения статистики в индексе" -#: pg_dump.c:16903 +#: pg_dump.c:17014 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "" "столбцы, задающие статистику индекса, не соответствуют значениям по " "количеству" -#: pg_dump.c:17118 +#: pg_dump.c:17243 #, c-format msgid "missing index for constraint \"%s\"" msgstr "отсутствует индекс для ограничения \"%s\"" -#: pg_dump.c:17353 +#: pg_dump.c:17503 #, c-format msgid "unrecognized constraint type: %c" msgstr "нераспознанный тип ограничения: %c" -#: pg_dump.c:17454 pg_dump.c:17684 +#: pg_dump.c:17604 pg_dump.c:17834 #, c-format msgid "query to get data of sequence \"%s\" returned %d row (expected 1)" msgid_plural "" @@ -2613,12 +2613,12 @@ msgstr[2] "" "запрос на получение данных последовательности \"%s\" вернул %d строк " "(ожидалась 1)" -#: pg_dump.c:17486 +#: pg_dump.c:17636 #, c-format msgid "unrecognized sequence type: %s" msgstr "нераспознанный тип последовательности: %s" -#: pg_dump.c:18001 +#: pg_dump.c:18151 #, c-format msgid "" "query to get rule \"%s\" for table \"%s\" failed: wrong number of rows " @@ -2627,53 +2627,53 @@ msgstr "" "запрос на получение правила \"%s\" для таблицы \"%s\" возвратил неверное " "число строк" -#: pg_dump.c:18154 +#: pg_dump.c:18304 #, c-format msgid "could not find referenced extension %u" msgstr "не удалось найти упомянутое расширение %u" -#: pg_dump.c:18253 +#: pg_dump.c:18403 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "конфигурации расширения не соответствуют условиям по количеству" -#: pg_dump.c:18385 +#: pg_dump.c:18535 #, c-format msgid "reading dependency data" msgstr "чтение информации о зависимостях" -#: pg_dump.c:18471 +#: pg_dump.c:18621 #, c-format msgid "no referencing object %u %u" msgstr "нет подчинённого объекта %u %u" -#: pg_dump.c:18482 +#: pg_dump.c:18632 #, c-format msgid "no referenced object %u %u" msgstr "нет вышестоящего объекта %u %u" -#: pg_dump.c:18907 pg_dump.c:18945 pg_dumpall.c:1962 pg_restore.c:551 +#: pg_dump.c:19057 pg_dump.c:19095 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 +#: pg_dump_sort.c:635 #, c-format msgid "invalid dumpId %d" msgstr "неверный dumpId %d" -#: pg_dump_sort.c:430 +#: pg_dump_sort.c:641 #, c-format msgid "invalid dependency %d" msgstr "неверная зависимость %d" -#: pg_dump_sort.c:594 +#: pg_dump_sort.c:805 #, c-format msgid "could not identify dependency loop" msgstr "не удалось определить цикл зависимостей" -#: pg_dump_sort.c:1209 +#: pg_dump_sort.c:1423 #, c-format msgid "there are circular foreign-key constraints on this table:" msgid_plural "there are circular foreign-key constraints among these tables:" @@ -2681,7 +2681,7 @@ msgstr[0] "в следующей таблице зациклены ограни msgstr[1] "в следующих таблицах зациклены ограничения внешних ключей:" msgstr[2] "в следующих таблицах зациклены ограничения внешних ключей:" -#: pg_dump_sort.c:1214 +#: pg_dump_sort.c:1428 #, c-format msgid "" "You might not be able to restore the dump without using --disable-triggers " @@ -2690,7 +2690,7 @@ msgstr "" "Возможно, для восстановления базы потребуется использовать --disable-" "triggers или временно удалить ограничения." -#: pg_dump_sort.c:1215 +#: pg_dump_sort.c:1429 #, c-format msgid "" "Consider using a full dump instead of a --data-only dump to avoid this " @@ -2699,7 +2699,7 @@ msgstr "" "Во избежание этой проблемы, вероятно, стоит выгружать всю базу данных, а не " "только данные (--data-only)." -#: pg_dump_sort.c:1227 +#: pg_dump_sort.c:1441 #, c-format msgid "could not resolve dependency loop among these items:" msgstr "не удалось разрешить цикл зависимостей для следующих объектов:" @@ -2745,7 +2745,7 @@ msgid "" "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "параметры -r/--roles-only и -t/--tablespaces-only исключают друг друга" -#: pg_dumpall.c:474 pg_dumpall.c:1771 +#: pg_dumpall.c:474 pg_dumpall.c:1820 #, c-format msgid "could not connect to database \"%s\"" msgstr "не удалось подключиться к базе данных: \"%s\"" @@ -2759,7 +2759,7 @@ msgstr "" "не удалось подключиться к базе данных \"postgres\" или \"template1\"\n" "Укажите другую базу данных." -#: pg_dumpall.c:634 +#: pg_dumpall.c:635 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2768,17 +2768,17 @@ msgstr "" "%s экспортирует всё содержимое кластера баз данных PostgreSQL в SQL-скрипт.\n" "\n" -#: pg_dumpall.c:636 +#: pg_dumpall.c:637 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [ПАРАМЕТР]...\n" -#: pg_dumpall.c:639 +#: pg_dumpall.c:640 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=ИМЯ_ФАЙЛА имя выходного файла\n" -#: pg_dumpall.c:646 +#: pg_dumpall.c:647 #, c-format msgid "" " -c, --clean clean (drop) databases before recreating\n" @@ -2786,18 +2786,18 @@ msgstr "" " -c, --clean очистить (удалить) базы данных перед\n" " восстановлением\n" -#: pg_dumpall.c:648 +#: 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:649 pg_restore.c:475 +#: 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:650 +#: pg_dumpall.c:651 #, c-format msgid "" " -r, --roles-only dump only roles, no databases or tablespaces\n" @@ -2805,13 +2805,13 @@ msgstr "" " -r, --roles-only выгрузить только роли, без баз данных\n" " и табличных пространств\n" -#: pg_dumpall.c:652 +#: 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:653 +#: pg_dumpall.c:654 #, c-format msgid "" " -t, --tablespaces-only dump only tablespaces, no databases or roles\n" @@ -2819,7 +2819,7 @@ msgstr "" " -t, --tablespaces-only выгружать только табличные пространства,\n" " без баз данных и ролей\n" -#: pg_dumpall.c:659 +#: pg_dumpall.c:660 #, c-format msgid "" " --exclude-database=PATTERN exclude databases whose name matches PATTERN\n" @@ -2827,7 +2827,7 @@ msgstr "" " --exclude-database=ШАБЛОН исключить базы с именами, подпадающими под " "шаблон\n" -#: pg_dumpall.c:661 +#: pg_dumpall.c:662 #, c-format msgid "" " --filter=FILENAME exclude databases based on expressions in " @@ -2836,22 +2836,22 @@ msgstr "" " --filter=ИМЯ_ФАЙЛА исключать базы данных в соответствии с\n" " выражениями в этом файле\n" -#: pg_dumpall.c:667 +#: 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:683 +#: pg_dumpall.c:684 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=СТРОКА подключиться с данной строкой подключения\n" -#: pg_dumpall.c:685 +#: pg_dumpall.c:686 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=ИМЯ_БД выбор другой базы данных по умолчанию\n" -#: pg_dumpall.c:692 +#: pg_dumpall.c:693 #, c-format msgid "" "\n" @@ -2865,69 +2865,75 @@ msgstr "" "вывод.\n" "\n" -#: pg_dumpall.c:837 +#: pg_dumpall.c:838 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "имя роли, начинающееся с \"pg_\", пропущено (%s)" -#: pg_dumpall.c:1059 +#. 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:1194 +#: pg_dumpall.c:1243 #, c-format msgid "could not parse ACL list (%s) for parameter \"%s\"" msgstr "не удалось разобрать список ACL (%s) для параметра \"%s\"" -#: pg_dumpall.c:1321 +#: pg_dumpall.c:1370 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "" "не удалось разобрать список управления доступом (%s) для табл. пространства " "\"%s\"" -#: pg_dumpall.c:1528 +#: pg_dumpall.c:1577 #, c-format msgid "excluding database \"%s\"" msgstr "база данных \"%s\" исключается" -#: pg_dumpall.c:1532 +#: pg_dumpall.c:1581 #, c-format msgid "dumping database \"%s\"" msgstr "выгрузка базы данных \"%s\"" -#: pg_dumpall.c:1563 +#: pg_dumpall.c:1612 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "ошибка при обработке базы \"%s\", pg_dump завершается" -#: pg_dumpall.c:1569 +#: pg_dumpall.c:1618 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "не удалось повторно открыть выходной файл \"%s\": %m" -#: pg_dumpall.c:1613 +#: pg_dumpall.c:1662 #, c-format msgid "running \"%s\"" msgstr "выполняется \"%s\"" -#: pg_dumpall.c:1814 +#: pg_dumpall.c:1863 #, c-format msgid "could not get server version" msgstr "не удалось узнать версию сервера" -#: pg_dumpall.c:1817 +#: pg_dumpall.c:1866 #, c-format msgid "could not parse server version \"%s\"" msgstr "не удалось разобрать строку версии сервера \"%s\"" -#: pg_dumpall.c:1887 pg_dumpall.c:1910 +#: pg_dumpall.c:1936 pg_dumpall.c:1959 #, c-format msgid "executing %s" msgstr "выполняется %s" -#: pg_dumpall.c:1982 +#: pg_dumpall.c:2031 msgid "unsupported filter object" msgstr "неподдерживаемый объект фильтра" @@ -3775,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 8fbe8b3636b56..b9dc9a7a9e432 100644 --- a/src/bin/pg_dump/po/sv.po +++ b/src/bin/pg_dump/po/sv.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-08-27 15:52+0000\n" -"PO-Revision-Date: 2024-08-27 18:32+0200\n" +"POT-Creation-Date: 2025-05-09 17:09+0000\n" +"PO-Revision-Date: 2025-05-09 20:54+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -231,12 +231,12 @@ msgstr "%s måste vara i intervallet %d..%d" msgid "unrecognized sync method: %s" msgstr "okänd synkmetod: %s" -#: ../../fe_utils/string_utils.c:434 +#: ../../fe_utils/string_utils.c:587 #, 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 +#: ../../fe_utils/string_utils.c:760 #, c-format msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "databasnamnet innehåller nyrad eller vagnretur: \"%s\"\n" @@ -502,13 +502,13 @@ msgid "could not read from input file: %s" msgstr "kunde inte läsa från infilen: %s" #: compress_gzip.c:295 compress_none.c:97 compress_none.c:139 -#: compress_zstd.c:373 pg_backup_custom.c:651 +#: compress_zstd.c:374 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 +#: 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" @@ -549,18 +549,18 @@ msgstr "kunde inte avsluta dekomprimering: %s" 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 +#: 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 "kunde inte initierar komprimeringsbibliotek" -#: 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 "kunde inte dekomprimera data: %s" -#: compress_zstd.c:501 +#: compress_zstd.c:502 #, c-format msgid "unhandled mode \"%s\"" msgstr "kan inte hantera läget \"%s\"" @@ -822,7 +822,7 @@ msgstr "återställer stort objekt med OID %u" msgid "could not create large object %u: %s" msgstr "kunde inte skapa stort objekt %u: %s" -#: pg_backup_archiver.c:1486 pg_dump.c:3888 +#: pg_backup_archiver.c:1486 pg_dump.c:3889 #, c-format msgid "could not open large object %u: %s" msgstr "kunde inte öppna stort objekt %u: %s" @@ -973,12 +973,12 @@ msgstr "kunde inte öppna stdout för append: %m" msgid "unrecognized file format \"%d\"" msgstr "känner inte igen filformat \"%d\"" -#: pg_backup_archiver.c:2527 pg_backup_archiver.c:4647 +#: pg_backup_archiver.c:2527 pg_backup_archiver.c:4648 #, c-format msgid "finished item %d %s %s" msgstr "klar med objekt %d %s %s" -#: pg_backup_archiver.c:2531 pg_backup_archiver.c:4660 +#: pg_backup_archiver.c:2531 pg_backup_archiver.c:4661 #, c-format msgid "worker process failed: exit code %d" msgstr "arbetsprocess misslyckades: felkod %d" @@ -998,137 +998,137 @@ msgstr "återeställa tabeller med WITH OIDS stöds inte längre" msgid "unrecognized encoding \"%s\"" msgstr "okänd teckenkodning \"%s\"" -#: pg_backup_archiver.c:2823 +#: pg_backup_archiver.c:2824 #, c-format msgid "invalid ENCODING item: %s" msgstr "ogiltigt ENCODING-val: %s" -#: pg_backup_archiver.c:2841 +#: pg_backup_archiver.c:2842 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "ogiltigt STDSTRINGS-val: %s" -#: pg_backup_archiver.c:2866 +#: pg_backup_archiver.c:2867 #, c-format msgid "schema \"%s\" not found" msgstr "schema \"%s\" hittades inte" -#: pg_backup_archiver.c:2873 +#: pg_backup_archiver.c:2874 #, c-format msgid "table \"%s\" not found" msgstr "tabell \"%s\" hittades inte" -#: pg_backup_archiver.c:2880 +#: pg_backup_archiver.c:2881 #, c-format msgid "index \"%s\" not found" msgstr "index \"%s\" hittades inte" -#: pg_backup_archiver.c:2887 +#: pg_backup_archiver.c:2888 #, c-format msgid "function \"%s\" not found" msgstr "funktion \"%s\" hittades inte" -#: pg_backup_archiver.c:2894 +#: pg_backup_archiver.c:2895 #, c-format msgid "trigger \"%s\" not found" msgstr "trigger \"%s\" hittades inte" -#: pg_backup_archiver.c:3325 +#: pg_backup_archiver.c:3326 #, 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:3457 +#: pg_backup_archiver.c:3458 #, c-format msgid "could not set \"search_path\" to \"%s\": %s" msgstr "kunde inte sätta \"search_path\" till \"%s\": %s" -#: pg_backup_archiver.c:3518 +#: pg_backup_archiver.c:3519 #, c-format msgid "could not set \"default_tablespace\" to %s: %s" msgstr "kunde inte sätta \"default_tablespace\" till %s: %s" -#: pg_backup_archiver.c:3567 +#: pg_backup_archiver.c:3568 #, c-format msgid "could not set \"default_table_access_method\": %s" msgstr "kunde inte sätta \"default_table_access_method\": %s" -#: pg_backup_archiver.c:3616 +#: pg_backup_archiver.c:3617 #, c-format msgid "could not alter table access method: %s" msgstr "kunde inte ändra tabellaccessmetod: %s" -#: pg_backup_archiver.c:3717 +#: pg_backup_archiver.c:3718 #, 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:4004 +#: pg_backup_archiver.c:4005 #, 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:4018 +#: pg_backup_archiver.c:4019 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "ej supportad version (%d.%d) i filhuvudet" -#: pg_backup_archiver.c:4023 +#: pg_backup_archiver.c:4024 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "riktighetskontroll på heltalsstorlek (%lu) misslyckades" -#: pg_backup_archiver.c:4027 +#: pg_backup_archiver.c:4028 #, 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:4037 +#: pg_backup_archiver.c:4038 #, 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:4059 +#: 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 "arkivet är komprimerat, men denna installation stödjer inte komprimering (%s) -- ingen data kommer kunna läsas" -#: pg_backup_archiver.c:4095 +#: pg_backup_archiver.c:4096 #, c-format msgid "invalid creation date in header" msgstr "ogiltig skapandedatum i huvud" -#: pg_backup_archiver.c:4229 +#: pg_backup_archiver.c:4230 #, c-format msgid "processing item %d %s %s" msgstr "processar objekt %d %s %s" -#: pg_backup_archiver.c:4314 +#: pg_backup_archiver.c:4315 #, c-format msgid "entering main parallel loop" msgstr "går in i parallella huvudloopen" -#: pg_backup_archiver.c:4325 +#: pg_backup_archiver.c:4326 #, c-format msgid "skipping item %d %s %s" msgstr "hoppar över objekt %d %s %s" -#: pg_backup_archiver.c:4334 +#: pg_backup_archiver.c:4335 #, c-format msgid "launching item %d %s %s" msgstr "startar objekt %d %s %s" -#: pg_backup_archiver.c:4388 +#: pg_backup_archiver.c:4389 #, c-format msgid "finished main parallel loop" msgstr "klar med parallella huvudloopen" -#: pg_backup_archiver.c:4424 +#: pg_backup_archiver.c:4425 #, c-format msgid "processing missed item %d %s %s" msgstr "processar saknat objekt %d %s %s" -#: pg_backup_archiver.c:4966 +#: pg_backup_archiver.c:4967 #, 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" @@ -1215,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:1830 +#: pg_backup_db.c:53 pg_dumpall.c:1879 #, c-format msgid "aborting because of server version mismatch" msgstr "avbryter då serverversionerna i matchar" -#: pg_backup_db.c:54 pg_dumpall.c:1831 +#: pg_backup_db.c:54 pg_dumpall.c:1880 #, c-format msgid "server version: %s; %s version: %s" msgstr "server version: %s; %s version: %s" @@ -1230,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:1677 pg_dumpall.c:1779 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1726 pg_dumpall.c:1828 msgid "Password: " msgstr "Lösenord: " @@ -1245,17 +1245,17 @@ msgid "reconnection failed: %s" msgstr "återanslutning misslyckades: %s" #: 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 +#: 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:1893 pg_dumpall.c:1916 +#: pg_backup_db.c:271 pg_dumpall.c:1942 pg_dumpall.c:1965 #, c-format msgid "query failed: %s" msgstr "fråga misslyckades: %s" -#: pg_backup_db.c:273 pg_dumpall.c:1894 pg_dumpall.c:1917 +#: pg_backup_db.c:273 pg_dumpall.c:1943 pg_dumpall.c:1966 #, c-format msgid "Query was: %s" msgstr "Frågan var: %s" @@ -1291,7 +1291,7 @@ msgstr "fel returnerat av PQputCopyEnd: %s" msgid "COPY failed for table \"%s\": %s" msgstr "COPY misslyckades för tabell \"%s\": %s" -#: pg_backup_db.c:521 pg_dump.c:2283 +#: pg_backup_db.c:521 pg_dump.c:2284 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "oväntade extraresultat under kopiering (COPY) av tabell \"%s\"" @@ -1560,7 +1560,7 @@ msgstr "" "%s dumpar en databas som en textfil eller i andra format.\n" "\n" -#: pg_dump.c:1093 pg_dumpall.c:635 pg_restore.c:452 +#: pg_dump.c:1093 pg_dumpall.c:636 pg_restore.c:452 #, c-format msgid "Usage:\n" msgstr "Användning:\n" @@ -1570,7 +1570,7 @@ msgstr "Användning:\n" msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [FLAGGA]... [DBNAMN]\n" -#: pg_dump.c:1096 pg_dumpall.c:638 pg_restore.c:455 +#: pg_dump.c:1096 pg_dumpall.c:639 pg_restore.c:455 #, c-format msgid "" "\n" @@ -1598,12 +1598,12 @@ msgstr "" 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:1101 pg_dumpall.c:640 +#: pg_dump.c:1101 pg_dumpall.c:641 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose visa mer information\n" -#: pg_dump.c:1102 pg_dumpall.c:641 +#: pg_dump.c:1102 pg_dumpall.c:642 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version visa versionsinformation, avsluta sedan\n" @@ -1617,12 +1617,12 @@ msgstr "" " -Z, --compress=METOD[:DETALJ]\n" " komprimera som angivet\n" -#: pg_dump.c:1105 pg_dumpall.c:642 +#: 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 misslyckas efter att ha väntat i TIMEOUT på tabellås\n" -#: pg_dump.c:1106 pg_dumpall.c:670 +#: 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 vänta inte på att ändingar säkert skrivits till disk\n" @@ -1632,12 +1632,12 @@ msgstr " --no-sync vänta inte på att ändingar säkert skr 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 +#: pg_dump.c:1108 pg_dumpall.c:644 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help visa denna hjälp, avsluta sedan\n" -#: pg_dump.c:1110 pg_dumpall.c:644 +#: pg_dump.c:1110 pg_dumpall.c:645 #, c-format msgid "" "\n" @@ -1646,7 +1646,7 @@ msgstr "" "\n" "Flaggor som styr utmatning:\n" -#: pg_dump.c:1111 pg_dumpall.c:645 +#: 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 dumpa bara data, inte schema\n" @@ -1686,7 +1686,7 @@ msgstr " -C, --create inkludera kommandon för att skapa databa 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:1119 pg_dumpall.c:647 +#: pg_dump.c:1119 pg_dumpall.c:648 #, c-format msgid " -E, --encoding=ENCODING dump the data in encoding ENCODING\n" msgstr " -E, --encoding=KODNING dumpa data i teckenkodning KODNING\n" @@ -1710,7 +1710,7 @@ msgstr "" " -O, --no-owner hoppa över återställande av objektägare i\n" " textformatdumpar\n" -#: pg_dump.c:1124 pg_dumpall.c:651 +#: 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 dumpa bara scheman, inte data\n" @@ -1730,27 +1730,27 @@ msgstr " -t, --table=MALL dumpa bara de angivna tabellerna\n" 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:1128 pg_dumpall.c:654 +#: 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 dumpa inte rättigheter (grant/revoke)\n" -#: pg_dump.c:1129 pg_dumpall.c:655 +#: pg_dump.c:1129 pg_dumpall.c:656 #, c-format msgid " --binary-upgrade for use by upgrade utilities only\n" msgstr " --binary-upgrade används bara av uppgraderingsverktyg\n" -#: pg_dump.c:1130 pg_dumpall.c:656 +#: 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 dumpa data som INSERT med kolumnnamn\n" -#: pg_dump.c:1131 pg_dumpall.c:657 +#: 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 slå av dollar-citering, använd standard SQL-citering\n" -#: pg_dump.c:1132 pg_dumpall.c:658 pg_restore.c:483 +#: 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 slå av triggrar vid återställning av enbart data\n" @@ -1796,7 +1796,7 @@ msgstr "" " dumpa INTE data för angivna tabeller,\n" " inklusive barn och partitionstabeller\n" -#: pg_dump.c:1143 pg_dumpall.c:660 +#: 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 övertrumfa standardinställningen för extra_float_digits\n" @@ -1811,7 +1811,7 @@ msgstr "" " från dump baserat på uttryck i FILNAMN\n" "\n" -#: pg_dump.c:1146 pg_dumpall.c:662 pg_restore.c:487 +#: 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 använd IF EXISTS när objekt droppas\n" @@ -1827,67 +1827,67 @@ msgstr "" " inkludera data i främmande tabeller från\n" " främmande servrar som matchar MALL\n" -#: pg_dump.c:1150 pg_dumpall.c:663 +#: pg_dump.c:1150 pg_dumpall.c:664 #, 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:1151 pg_dumpall.c:664 +#: 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 ladda partitioner via root-tabellen\n" -#: pg_dump.c:1152 pg_dumpall.c:665 +#: pg_dump.c:1152 pg_dumpall.c:666 #, c-format msgid " --no-comments do not dump comments\n" msgstr " --no-comments dumpa inte kommentarer\n" -#: pg_dump.c:1153 pg_dumpall.c:666 +#: pg_dump.c:1153 pg_dumpall.c:667 #, c-format msgid " --no-publications do not dump publications\n" msgstr " --no-publications dumpa inte publiceringar\n" -#: pg_dump.c:1154 pg_dumpall.c:668 +#: 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 dumpa inte tilldelning av säkerhetsetiketter\n" -#: pg_dump.c:1155 pg_dumpall.c:669 +#: pg_dump.c:1155 pg_dumpall.c:670 #, c-format msgid " --no-subscriptions do not dump subscriptions\n" msgstr " --no-subscriptions dumpa inte prenumereringar\n" -#: pg_dump.c:1156 pg_dumpall.c:671 +#: 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 dumpa inte tabellaccessmetoder\n" -#: pg_dump.c:1157 pg_dumpall.c:672 +#: pg_dump.c:1157 pg_dumpall.c:673 #, c-format msgid " --no-tablespaces do not dump tablespace assignments\n" msgstr " --no-tablespaces dumpa inte användning av tabellutymmen\n" -#: pg_dump.c:1158 pg_dumpall.c:673 +#: 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 dumpa inte komprimeringsmetoder för TOAST\n" -#: pg_dump.c:1159 pg_dumpall.c:674 +#: 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 dumpa inte ologgad tabelldata\n" -#: pg_dump.c:1160 pg_dumpall.c:675 +#: 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 addera ON CONFLICT DO NOTHING till INSERT-kommandon\n" -#: pg_dump.c:1161 pg_dumpall.c:676 +#: 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 citera alla identifierar, även om de inte är nyckelord\n" -#: pg_dump.c:1162 pg_dumpall.c:677 +#: 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=NRADER antal rader per INSERT; implicerar --inserts\n" @@ -1925,7 +1925,7 @@ 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 +#: pg_dump.c:1170 pg_dumpall.c:679 pg_restore.c:500 #, c-format msgid "" " --use-set-session-authorization\n" @@ -1936,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:1174 pg_dumpall.c:682 pg_restore.c:504 +#: pg_dump.c:1174 pg_dumpall.c:683 pg_restore.c:504 #, c-format msgid "" "\n" @@ -1950,32 +1950,32 @@ msgstr "" msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=DBNAMN databasens som skall dumpas\n" -#: pg_dump.c:1176 pg_dumpall.c:684 pg_restore.c:505 +#: 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=VÄRDNAMN databasens värdnamn eller socketkatalog\n" -#: pg_dump.c:1177 pg_dumpall.c:686 pg_restore.c:506 +#: 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 databasens värdport\n" -#: pg_dump.c:1178 pg_dumpall.c:687 pg_restore.c:507 +#: 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=NAMN anslut med datta användarnamn mot databasen\n" -#: pg_dump.c:1179 pg_dumpall.c:688 pg_restore.c:508 +#: 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 fråga aldrig efter lösenord\n" -#: pg_dump.c:1180 pg_dumpall.c:689 pg_restore.c:509 +#: 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 fråga om lösenord (borde ske automatiskt)\n" -#: pg_dump.c:1181 pg_dumpall.c:690 +#: pg_dump.c:1181 pg_dumpall.c:691 #, c-format msgid " --role=ROLENAME do SET ROLE before dump\n" msgstr " --role=ROLLNAMN gör SET ROLE innan dumpen\n" @@ -1993,12 +1993,12 @@ msgstr "" "PGDATABASE att användas.\n" "\n" -#: pg_dump.c:1185 pg_dumpall.c:694 pg_restore.c:516 +#: pg_dump.c:1185 pg_dumpall.c:695 pg_restore.c:516 #, c-format msgid "Report bugs to <%s>.\n" msgstr "Rapportera fel till <%s>.\n" -#: pg_dump.c:1186 pg_dumpall.c:695 pg_restore.c:517 +#: pg_dump.c:1186 pg_dumpall.c:696 pg_restore.c:517 #, c-format msgid "%s home page: <%s>\n" msgstr "hemsida för %s: <%s>\n" @@ -2008,444 +2008,444 @@ msgstr "hemsida för %s: <%s>\n" msgid "invalid client encoding \"%s\" specified" msgstr "ogiltig klientteckenkodning \"%s\" angiven" -#: pg_dump.c:1352 +#: pg_dump.c:1353 #, 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:1417 +#: pg_dump.c:1418 #, c-format msgid "invalid output format \"%s\" specified" msgstr "ogiltigt utdataformat \"%s\" angivet" -#: pg_dump.c:1458 pg_dump.c:1514 pg_dump.c:1567 pg_dumpall.c:1467 +#: 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 "ej korrekt kvalificerat namn (för många namn med punkt): %s" -#: pg_dump.c:1466 +#: pg_dump.c:1467 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "hittade inga matchande scheman för mallen \"%s\"" -#: pg_dump.c:1519 +#: pg_dump.c:1520 #, c-format msgid "no matching extensions were found for pattern \"%s\"" msgstr "hittade inga matchande utökningar för mallen \"%s\"" -#: pg_dump.c:1572 +#: pg_dump.c:1573 #, 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:1643 +#: pg_dump.c:1644 #, 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:1665 +#: pg_dump.c:1666 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "hittade inga matchande tabeller för mallen \"%s\"" -#: pg_dump.c:1692 +#: pg_dump.c:1693 #, 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:1695 +#: pg_dump.c:1696 #, c-format msgid "cross-database references are not implemented: %s" msgstr "referenser till andra databaser är inte implementerat: %s" -#: pg_dump.c:2154 +#: pg_dump.c:2155 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "dumpar innehållet i tabell \"%s.%s\"" -#: pg_dump.c:2264 +#: pg_dump.c:2265 #, 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:2265 pg_dump.c:2275 +#: pg_dump.c:2266 pg_dump.c:2276 #, c-format msgid "Error message from server: %s" msgstr "Felmeddelandet från servern: %s" -#: pg_dump.c:2266 pg_dump.c:2276 +#: pg_dump.c:2267 pg_dump.c:2277 #, c-format msgid "Command was: %s" msgstr "Kommandot var: %s" -#: pg_dump.c:2274 +#: pg_dump.c:2275 #, 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:2365 +#: pg_dump.c:2366 #, 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:3067 +#: pg_dump.c:3068 #, c-format msgid "saving database definition" msgstr "sparar databasdefinition" -#: pg_dump.c:3176 +#: pg_dump.c:3177 #, c-format msgid "unrecognized locale provider: %s" msgstr "okänd lokalleverantör: %s" -#: pg_dump.c:3537 +#: pg_dump.c:3538 #, c-format msgid "saving encoding = %s" msgstr "sparar kodning = %s" -#: pg_dump.c:3562 +#: pg_dump.c:3563 #, c-format msgid "saving \"standard_conforming_strings = %s\"" msgstr "sparar \"standard_conforming_strings = %s\"" -#: pg_dump.c:3601 +#: pg_dump.c:3602 #, c-format msgid "could not parse result of current_schemas()" msgstr "kunde inte parsa resultat från current_schemas()" -#: pg_dump.c:3620 +#: pg_dump.c:3621 #, c-format msgid "saving \"search_path = %s\"" msgstr "sparar \"search_path = %s\"" -#: pg_dump.c:3656 +#: pg_dump.c:3657 #, c-format msgid "reading large objects" msgstr "läser stora objekt" -#: pg_dump.c:3877 +#: pg_dump.c:3878 #, c-format msgid "saving large objects \"%s\"" msgstr "sparar stora objekt \"%s\"" -#: pg_dump.c:3898 +#: pg_dump.c:3899 #, c-format msgid "error reading large object %u: %s" msgstr "fel vid läsning av stort objekt %u: %s" -#: pg_dump.c:4001 +#: pg_dump.c:4002 #, c-format msgid "reading row-level security policies" msgstr "läser säkerhetspolicy på radnivå" -#: pg_dump.c:4142 +#: pg_dump.c:4143 #, c-format msgid "unexpected policy command type: %c" msgstr "oväntad kommandotyp för policy: %c" -#: pg_dump.c:4592 pg_dump.c:5150 pg_dump.c:12362 pg_dump.c:18246 -#: pg_dump.c:18248 pg_dump.c:18870 +#: 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 "kunde inte parsa arrayen %s" -#: pg_dump.c:4806 +#: pg_dump.c:4807 #, 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:5012 +#: pg_dump.c:5013 #, c-format msgid "subscription with OID %u does not exist" msgstr "prenumeration med OID %u existerar inte" -#: pg_dump.c:5019 +#: pg_dump.c:5020 #, 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 +#: pg_dump.c:5583 #, 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:5727 +#: pg_dump.c:5728 #, c-format msgid "schema with OID %u does not exist" msgstr "schema med OID %u existerar inte" -#: pg_dump.c:7209 pg_dump.c:17617 +#: 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 "misslyckades med riktighetskontroll, föräldratabell med OID %u för sekvens med OID %u hittas inte" -#: pg_dump.c:7352 +#: pg_dump.c:7355 #, 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 +#: 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 "okänt tabell-OID %u" -#: pg_dump.c:7587 +#: pg_dump.c:7590 #, c-format msgid "unexpected index data for table \"%s\"" msgstr "oväntat indexdata för tabell \"%s\"" -#: pg_dump.c:8089 +#: 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 "misslyckades med riktighetskontroll, föräldratabell med OID %u för pg_rewrite-rad med OID %u hittades inte" -#: pg_dump.c:8922 +#: pg_dump.c:8925 #, c-format msgid "unexpected column data for table \"%s\"" msgstr "oväntad kolumndata för tabell \"%s\"" -#: pg_dump.c:8951 +#: pg_dump.c:8954 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "ogiltigt kolumnnumrering i tabell \"%s\"" -#: pg_dump.c:9002 +#: pg_dump.c:9005 #, c-format msgid "finding table default expressions" msgstr "hittar tabellers default-uttryck" -#: pg_dump.c:9044 +#: pg_dump.c:9047 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "felaktigt adnum-värde %d för tabell \"%s\"" -#: pg_dump.c:9138 +#: pg_dump.c:9141 #, c-format msgid "finding table check constraints" msgstr "hittar tabellers check-villkor" -#: pg_dump.c:9192 +#: 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] "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:9196 +#: pg_dump.c:9199 #, c-format msgid "The system catalogs might be corrupted." msgstr "Systemkatalogerna kan vara trasiga." -#: pg_dump.c:9886 +#: pg_dump.c:9889 #, c-format msgid "role with OID %u does not exist" msgstr "roll med OID %u existerar inte" -#: pg_dump.c:9998 pg_dump.c:10027 +#: pg_dump.c:10001 pg_dump.c:10030 #, c-format msgid "unsupported pg_init_privs entry: %u %u %d" msgstr "ogiltig pg_init_privs-post: %u %u %d" -#: pg_dump.c:10574 +#: pg_dump.c:10577 #, c-format msgid "missing metadata for large objects \"%s\"" msgstr "saknar metadata för stort objekt \"%s\"" -#: pg_dump.c:10857 +#: pg_dump.c:10860 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "typtype för datatyp \"%s\" verkar vara ogiltig" -#: pg_dump.c:12431 +#: pg_dump.c:12434 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "okänt provolatile-värde för funktion \"%s\"" -#: pg_dump.c:12481 pg_dump.c:14377 +#: pg_dump.c:12484 pg_dump.c:14380 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "okänt proparallel-värde för funktion \"%s\"" -#: pg_dump.c:12611 pg_dump.c:12717 pg_dump.c:12724 +#: 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 "kunde inte hitta funktionsdefinitionen för funktion med OID %u" -#: pg_dump.c:12650 +#: pg_dump.c:12653 #, 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:12653 +#: pg_dump.c:12656 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "felaktigt värde i fältet pg_cast.castmethod" -#: pg_dump.c:12743 +#: pg_dump.c:12746 #, 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:12760 +#: pg_dump.c:12763 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "felaktigt värde i fältet pg_transform.trffromsql" -#: pg_dump.c:12781 +#: pg_dump.c:12784 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "felaktigt värde i fältet pg_transform.trftosql" -#: pg_dump.c:12926 +#: pg_dump.c:12929 #, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" msgstr "postfix-operatorer stöds inte längre (operator \"%s\")" -#: pg_dump.c:13096 +#: pg_dump.c:13099 #, c-format msgid "could not find operator with OID %s" msgstr "kunde inte hitta en operator med OID %s." -#: pg_dump.c:13164 +#: pg_dump.c:13167 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "ogiltig typ \"%c\" för accessmetod \"%s\"" -#: pg_dump.c:13838 pg_dump.c:13906 +#: pg_dump.c:13841 pg_dump.c:13909 #, c-format msgid "unrecognized collation provider: %s" msgstr "okänd jämförelseleverantör: %s" -#: pg_dump.c:13847 pg_dump.c:13854 pg_dump.c:13865 pg_dump.c:13875 -#: pg_dump.c:13890 +#: 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 "ogiltig jämförelse \"%s\"" -#: pg_dump.c:14296 +#: pg_dump.c:14299 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "okänt aggfinalmodify-värde för aggregat \"%s\"" -#: pg_dump.c:14352 +#: pg_dump.c:14355 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "okänt aggmfinalmodify-värde för aggregat \"%s\"" -#: pg_dump.c:15069 +#: pg_dump.c:15072 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "okänd objekttyp i standardrättigheter: %d" -#: pg_dump.c:15085 +#: pg_dump.c:15088 #, c-format msgid "could not parse default ACL list (%s)" msgstr "kunde inte parsa standard-ACL-lista (%s)" -#: pg_dump.c:15169 +#: pg_dump.c:15172 #, 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:15194 +#: pg_dump.c:15197 #, 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:15737 +#: pg_dump.c:15740 #, 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:15740 +#: pg_dump.c:15743 #, 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:15747 +#: pg_dump.c:15750 #, 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:15832 +#: pg_dump.c:15835 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDS stöds inte längre (tabell \"%s\")" -#: pg_dump.c:16819 +#: pg_dump.c:16822 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "ogiltigt kolumnnummer %d för tabell \"%s\"" -#: pg_dump.c:16897 +#: pg_dump.c:16900 #, c-format msgid "could not parse index statistic columns" msgstr "kunde inte parsa kolumn i indexstatistik" -#: pg_dump.c:16899 +#: pg_dump.c:16902 #, c-format msgid "could not parse index statistic values" msgstr "kunde inte parsa värden i indexstatistik" -#: pg_dump.c:16901 +#: pg_dump.c:16904 #, 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:17116 +#: pg_dump.c:17133 #, c-format msgid "missing index for constraint \"%s\"" msgstr "saknar index för integritetsvillkor \"%s\"" -#: pg_dump.c:17351 +#: pg_dump.c:17368 #, c-format msgid "unrecognized constraint type: %c" msgstr "oväntad integritetsvillkorstyp: %c" -#: pg_dump.c:17452 pg_dump.c:17681 +#: 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] "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:17484 +#: pg_dump.c:17501 #, c-format msgid "unrecognized sequence type: %s" msgstr "okänd sekvenstyp: %s" -#: pg_dump.c:17998 +#: pg_dump.c:18016 #, 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:18151 +#: pg_dump.c:18169 #, c-format msgid "could not find referenced extension %u" msgstr "kunde inte hitta refererad utökning %u" -#: pg_dump.c:18250 +#: pg_dump.c:18268 #, 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:18382 +#: pg_dump.c:18400 #, c-format msgid "reading dependency data" msgstr "läser beroendedata" -#: pg_dump.c:18468 +#: pg_dump.c:18486 #, c-format msgid "no referencing object %u %u" msgstr "inget refererande objekt %u %u" -#: pg_dump.c:18479 +#: pg_dump.c:18497 #, c-format msgid "no referenced object %u %u" msgstr "inget refererat objekt %u %u" -#: pg_dump.c:18904 pg_dump.c:18942 pg_dumpall.c:1962 pg_restore.c:551 +#: 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" @@ -2518,7 +2518,7 @@ msgstr "flaggorna \"bara globala\" (-g) och \"bara tabellutrymmen\" (-t) kan int 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:474 pg_dumpall.c:1771 +#: pg_dumpall.c:474 pg_dumpall.c:1820 #, c-format msgid "could not connect to database \"%s\"" msgstr "kunde inte ansluta till databasen \"%s\"" @@ -2532,7 +2532,7 @@ msgstr "" "kunde inte ansluta till databasen \"postgres\" eller \"template1\"\n" "Ange en annan databas." -#: pg_dumpall.c:634 +#: pg_dumpall.c:635 #, c-format msgid "" "%s extracts a PostgreSQL database cluster into an SQL script file.\n" @@ -2541,72 +2541,72 @@ msgstr "" "%s extraherar ett PostgreSQL databaskluster till en SQL-scriptfil.\n" "\n" -#: pg_dumpall.c:636 +#: pg_dumpall.c:637 #, c-format msgid " %s [OPTION]...\n" msgstr " %s [FLAGGA]...\n" -#: pg_dumpall.c:639 +#: pg_dumpall.c:640 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=FILENAME utdatafilnamn\n" -#: pg_dumpall.c:646 +#: pg_dumpall.c:647 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" msgstr " -c, --clean nollställ (drop) databaser innan återskapning\n" -#: pg_dumpall.c:648 +#: pg_dumpall.c:649 #, 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:649 pg_restore.c:475 +#: pg_dumpall.c:650 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:650 +#: pg_dumpall.c:651 #, 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:652 +#: pg_dumpall.c:653 #, 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:653 +#: pg_dumpall.c:654 #, 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:659 +#: pg_dumpall.c:660 #, 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:661 +#: pg_dumpall.c:662 #, 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 +#: pg_dumpall.c:668 #, 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:683 +#: pg_dumpall.c:684 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=ANSLSTR anslut med anslutningssträng\n" -#: pg_dumpall.c:685 +#: pg_dumpall.c:686 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=DBNAMN alternativ standarddatabas\n" -#: pg_dumpall.c:692 +#: pg_dumpall.c:693 #, c-format msgid "" "\n" @@ -2618,67 +2618,73 @@ msgstr "" "Om -f/--file inte används så kommer SQL-skriptet skriva till standard ut.\n" "\n" -#: pg_dumpall.c:837 +#: pg_dumpall.c:838 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "rollnamn som startar med \"pg_\" hoppas över (%s)" -#: pg_dumpall.c:1059 +#. 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 "hittade föräldralös pg_auth_members-post för roll %s" + +#: pg_dumpall.c:1088 #, 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 +#: pg_dumpall.c:1243 #, 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:1321 +#: pg_dumpall.c:1370 #, 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:1528 +#: pg_dumpall.c:1577 #, c-format msgid "excluding database \"%s\"" msgstr "utesluter databas \"%s\"" -#: pg_dumpall.c:1532 +#: pg_dumpall.c:1581 #, c-format msgid "dumping database \"%s\"" msgstr "dumpar databas \"%s\"" -#: pg_dumpall.c:1563 +#: pg_dumpall.c:1612 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "pg_dump misslyckades med databas \"%s\", avslutar" -#: pg_dumpall.c:1569 +#: pg_dumpall.c:1618 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "kunde inte öppna om utdatafilen \"%s\": %m" -#: pg_dumpall.c:1613 +#: pg_dumpall.c:1662 #, c-format msgid "running \"%s\"" msgstr "kör \"%s\"" -#: pg_dumpall.c:1814 +#: pg_dumpall.c:1863 #, c-format msgid "could not get server version" msgstr "kunde inte hämta serverversionen" -#: pg_dumpall.c:1817 +#: pg_dumpall.c:1866 #, c-format msgid "could not parse server version \"%s\"" msgstr "kunde inte tolka versionsträngen \"%s\"" -#: pg_dumpall.c:1887 pg_dumpall.c:1910 +#: pg_dumpall.c:1936 pg_dumpall.c:1959 #, c-format msgid "executing %s" msgstr "kör: %s" -#: pg_dumpall.c:1982 +#: pg_dumpall.c:2031 msgid "unsupported filter object" msgstr "filterobjektet stöds inte" diff --git a/src/bin/pg_dump/po/uk.po b/src/bin/pg_dump/po/uk.po index f92561f2eb400..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: 2024-09-23 10:51+0000\n" -"PO-Revision-Date: 2024-09-23 19:38\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" @@ -232,12 +232,12 @@ msgstr "%s має бути в діапазоні %d..%d" msgid "unrecognized sync method: %s" msgstr "нерозпізнаний метод синхронізації: %s" -#: ../../fe_utils/string_utils.c:434 +#: ../../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:607 +#: ../../fe_utils/string_utils.c:760 #, c-format msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "назва бази даних містить символ нового рядка або повернення каретки: \"%s\"\n" @@ -503,13 +503,13 @@ msgid "could not read from input file: %s" msgstr "не вдалося прочитати з вхідного файлу: %s" #: compress_gzip.c:295 compress_none.c:97 compress_none.c:139 -#: compress_zstd.c:373 pg_backup_custom.c:651 +#: 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:371 pg_backup_custom.c:649 pg_backup_directory.c:565 +#: 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" @@ -550,18 +550,18 @@ 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:501 +#: compress_zstd.c:502 #, c-format msgid "unhandled mode \"%s\"" msgstr "непідтримуваний режим \"%s\"" @@ -822,7 +822,7 @@ msgstr "відновлення великого об'єкту з OID %u" msgid "could not create large object %u: %s" msgstr "не вдалося створити великий об'єкт %u: %s" -#: pg_backup_archiver.c:1486 pg_dump.c:3888 +#: pg_backup_archiver.c:1486 pg_dump.c:3889 #, c-format msgid "could not open large object %u: %s" msgstr "не вдалося відкрити великий об'єкт %u: %s" @@ -975,12 +975,12 @@ msgstr "не вдалося відкрити stdout для додавання: % msgid "unrecognized file format \"%d\"" msgstr "нерозпізнаний формат файлу \"%d\"" -#: pg_backup_archiver.c:2527 pg_backup_archiver.c:4647 +#: 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:2531 pg_backup_archiver.c:4660 +#: pg_backup_archiver.c:2531 pg_backup_archiver.c:4661 #, c-format msgid "worker process failed: exit code %d" msgstr "помилка при робочому процесі: код виходу %d" @@ -1000,137 +1000,137 @@ msgstr "відновлення таблиць WITH OIDS більше не під msgid "unrecognized encoding \"%s\"" msgstr "нерозпізнане кодування \"%s\"" -#: pg_backup_archiver.c:2823 +#: pg_backup_archiver.c:2824 #, c-format msgid "invalid ENCODING item: %s" msgstr "невірний об'єкт КОДУВАННЯ: %s" -#: pg_backup_archiver.c:2841 +#: pg_backup_archiver.c:2842 #, c-format msgid "invalid STDSTRINGS item: %s" msgstr "невірний об'єкт STDSTRINGS: %s" -#: pg_backup_archiver.c:2866 +#: pg_backup_archiver.c:2867 #, c-format msgid "schema \"%s\" not found" msgstr "схему \"%s\" не знайдено" -#: pg_backup_archiver.c:2873 +#: pg_backup_archiver.c:2874 #, c-format msgid "table \"%s\" not found" msgstr "таблицю \"%s\" не знайдено" -#: pg_backup_archiver.c:2880 +#: pg_backup_archiver.c:2881 #, c-format msgid "index \"%s\" not found" msgstr "індекс \"%s\" не знайдено" -#: pg_backup_archiver.c:2887 +#: pg_backup_archiver.c:2888 #, c-format msgid "function \"%s\" not found" msgstr "функцію \"%s\" не знайдено" -#: pg_backup_archiver.c:2894 +#: pg_backup_archiver.c:2895 #, c-format msgid "trigger \"%s\" not found" msgstr "тригер \"%s\" не знайдено" -#: pg_backup_archiver.c:3325 +#: pg_backup_archiver.c:3326 #, c-format msgid "could not set session user to \"%s\": %s" msgstr "не вдалося встановити користувача сеансу для \"%s\": %s" -#: pg_backup_archiver.c:3457 +#: 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:3518 +#: pg_backup_archiver.c:3519 #, c-format msgid "could not set \"default_tablespace\" to %s: %s" msgstr "не вдалося встановити \"default_tablespace\" для %s: %s" -#: pg_backup_archiver.c:3567 +#: pg_backup_archiver.c:3568 #, c-format msgid "could not set \"default_table_access_method\": %s" msgstr "не вдалося встановити \"default_table_access_method\" для: %s" -#: pg_backup_archiver.c:3616 +#: pg_backup_archiver.c:3617 #, c-format msgid "could not alter table access method: %s" msgstr "не вдалося змінити метод доступу до таблиці: %s" -#: pg_backup_archiver.c:3717 +#: 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:4004 +#: pg_backup_archiver.c:4005 #, c-format msgid "did not find magic string in file header" msgstr "в заголовку файлу не знайдено магічного рядка" -#: pg_backup_archiver.c:4018 +#: pg_backup_archiver.c:4019 #, c-format msgid "unsupported version (%d.%d) in file header" msgstr "в заголовку непідтримувана версія (%d.%d)" -#: pg_backup_archiver.c:4023 +#: pg_backup_archiver.c:4024 #, c-format msgid "sanity check on integer size (%lu) failed" msgstr "перевірка на розмір цілого числа (%lu) не вдалася" -#: pg_backup_archiver.c:4027 +#: 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:4037 +#: 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:4059 +#: 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:4095 +#: pg_backup_archiver.c:4096 #, c-format msgid "invalid creation date in header" msgstr "неприпустима дата створення у заголовку" -#: pg_backup_archiver.c:4229 +#: pg_backup_archiver.c:4230 #, c-format msgid "processing item %d %s %s" msgstr "обробка елементу %d %s %s" -#: pg_backup_archiver.c:4314 +#: pg_backup_archiver.c:4315 #, c-format msgid "entering main parallel loop" msgstr "введення головного паралельного циклу" -#: pg_backup_archiver.c:4325 +#: pg_backup_archiver.c:4326 #, c-format msgid "skipping item %d %s %s" msgstr "пропускається елемент %d %s %s " -#: pg_backup_archiver.c:4334 +#: pg_backup_archiver.c:4335 #, c-format msgid "launching item %d %s %s" msgstr "запуск елементу %d %s %s " -#: pg_backup_archiver.c:4388 +#: pg_backup_archiver.c:4389 #, c-format msgid "finished main parallel loop" msgstr "головний паралельний цикл завершився" -#: pg_backup_archiver.c:4424 +#: pg_backup_archiver.c:4425 #, c-format msgid "processing missed item %d %s %s" msgstr "обробка втраченого елементу %d %s %s" -#: pg_backup_archiver.c:4966 +#: pg_backup_archiver.c:4967 #, c-format msgid "table \"%s\" could not be created, will not restore its data" msgstr "не вдалося створити таблицю \"%s\", дані не будуть відновлені" @@ -1217,12 +1217,12 @@ msgstr "ущільнювач активний" msgid "could not get server_version from libpq" msgstr "не вдалося отримати версію серверу з libpq" -#: pg_backup_db.c:53 pg_dumpall.c:1830 +#: 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:1831 +#: pg_backup_db.c:54 pg_dumpall.c:1880 #, c-format msgid "server version: %s; %s version: %s" msgstr "версія серверу: %s; версія %s: %s" @@ -1232,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:1677 pg_dumpall.c:1779 +#: pg_backup_db.c:128 pg_backup_db.c:178 pg_dumpall.c:1726 pg_dumpall.c:1828 msgid "Password: " msgstr "Пароль: " @@ -1247,17 +1247,17 @@ msgid "reconnection failed: %s" msgstr "помилка повторного підключення: %s" #: 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 +#: 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:1893 pg_dumpall.c:1916 +#: 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:1894 pg_dumpall.c:1917 +#: pg_backup_db.c:273 pg_dumpall.c:1943 pg_dumpall.c:1966 #, c-format msgid "Query was: %s" msgstr "Запит був: %s" @@ -1295,7 +1295,7 @@ msgstr "помилка повернулася від PQputCopyEnd: %s" msgid "COPY failed for table \"%s\": %s" msgstr "КОПІЮВАННЯ для таблиці \"%s\" не вдалося: %s" -#: pg_backup_db.c:521 pg_dump.c:2283 +#: pg_backup_db.c:521 pg_dump.c:2284 #, c-format msgid "unexpected extra results during COPY of table \"%s\"" msgstr "неочікувані зайві результати під час копіювання таблиці \"%s\"" @@ -1562,7 +1562,7 @@ msgstr "не знайдено відповідних розширень" msgid "%s dumps a database as a text file or to other formats.\n\n" msgstr "%s зберігає резервну копію бази даних в текстовому файлі або в інших форматах.\n\n" -#: pg_dump.c:1093 pg_dumpall.c:635 pg_restore.c:452 +#: pg_dump.c:1093 pg_dumpall.c:636 pg_restore.c:452 #, c-format msgid "Usage:\n" msgstr "Використання:\n" @@ -1572,7 +1572,7 @@ msgstr "Використання:\n" msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [OPTION]... [DBNAME]\n" -#: pg_dump.c:1096 pg_dumpall.c:638 pg_restore.c:455 +#: pg_dump.c:1096 pg_dumpall.c:639 pg_restore.c:455 #, c-format msgid "\n" "General options:\n" @@ -1596,12 +1596,12 @@ msgstr " -F, --format=c|d|t|p формат файлу виводу (с msgid " -j, --jobs=NUM use this many parallel jobs to dump\n" msgstr " -j, --jobs=NUM використовувати ці паралельні завдання для вивантаження\n" -#: pg_dump.c:1101 pg_dumpall.c:640 +#: pg_dump.c:1101 pg_dumpall.c:641 #, c-format msgid " -v, --verbose verbose mode\n" msgstr " -v, --verbose детальний режим\n" -#: pg_dump.c:1102 pg_dumpall.c:641 +#: pg_dump.c:1102 pg_dumpall.c:642 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version вивести інформацію про версію, потім вийти\n" @@ -1613,12 +1613,12 @@ msgid " -Z, --compress=METHOD[:DETAIL]\n" msgstr " -Z, --compress=METHOD[:DETAIL]\n" " стискати як вказано\n" -#: pg_dump.c:1105 pg_dumpall.c:642 +#: 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:1106 pg_dumpall.c:670 +#: 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" @@ -1628,19 +1628,19 @@ msgstr " --no-sync не чекати безпечного з 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 +#: pg_dump.c:1108 pg_dumpall.c:644 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показати цю довідку, потім вийти\n" -#: pg_dump.c:1110 pg_dumpall.c:644 +#: pg_dump.c:1110 pg_dumpall.c:645 #, c-format msgid "\n" "Options controlling the output content:\n" msgstr "\n" "Параметри, що керують вихідним вмістом:\n" -#: pg_dump.c:1111 pg_dumpall.c:645 +#: 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" @@ -1680,7 +1680,7 @@ msgstr " -C, --create включити у вивантажен msgid " -e, --extension=PATTERN dump the specified extension(s) only\n" msgstr " -e, --extension=PATTERN вивантажити лише вказане(і) розширення\n" -#: pg_dump.c:1119 pg_dumpall.c:647 +#: 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" @@ -1702,7 +1702,7 @@ msgid " -O, --no-owner skip restoration of object ownership in\n" msgstr " -O, --no-owner пропускати відновлення володіння об'єктами\n" " при використанні текстового формату\n" -#: pg_dump.c:1124 pg_dumpall.c:651 +#: 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" @@ -1722,27 +1722,27 @@ msgstr " -t, --table=PATTERN вивантажити лише вказ msgid " -T, --exclude-table=PATTERN do NOT dump the specified table(s)\n" msgstr " -T, --exclude-table=PATTERN НЕ вивантажувати вказані таблиці\n" -#: pg_dump.c:1128 pg_dumpall.c:654 +#: 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:1129 pg_dumpall.c:655 +#: 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:1130 pg_dumpall.c:656 +#: 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:1131 pg_dumpall.c:657 +#: 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:1132 pg_dumpall.c:658 pg_restore.c:483 +#: 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" @@ -1782,7 +1782,7 @@ msgstr " --exclude-table-data-and-children=PATTERN\n" " не вивантажувати дані зазначених таблиць,\n" " включно з дочірніми та секціонованими таблицями\n" -#: pg_dump.c:1143 pg_dumpall.c:660 +#: 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" @@ -1794,7 +1794,7 @@ msgid " --filter=FILENAME include or exclude objects and data from d msgstr " --filter=FILENAME включати або виключати об'єкти та дані з дампу\n" " на основі виразів у FILENAME\n" -#: pg_dump.c:1146 pg_dumpall.c:662 pg_restore.c:487 +#: 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" @@ -1808,67 +1808,67 @@ msgstr " --include-foreign-data=ШАБЛОН\n" " включають дані підлеглих таблиць на підлеглих\n" " сервери, що відповідають ШАБЛОНУ\n" -#: pg_dump.c:1150 pg_dumpall.c:663 +#: 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:1151 pg_dumpall.c:664 +#: 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:1152 pg_dumpall.c:665 +#: 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:1153 pg_dumpall.c:666 +#: 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:1154 pg_dumpall.c:668 +#: 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:1155 pg_dumpall.c:669 +#: 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:1156 pg_dumpall.c:671 +#: 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:1157 pg_dumpall.c:672 +#: 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:1158 pg_dumpall.c:673 +#: 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:1159 pg_dumpall.c:674 +#: 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:1160 pg_dumpall.c:675 +#: 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:1161 pg_dumpall.c:676 +#: 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:1162 pg_dumpall.c:677 +#: 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" @@ -1902,7 +1902,7 @@ msgid " --table-and-children=PATTERN dump only the specified table(s), includin msgstr " --table-and-children=PATTERN вивантажувати лише зазначені таблиці,\n" " включно з дочірніми та секціонованими таблицями\n" -#: pg_dump.c:1170 pg_dumpall.c:678 pg_restore.c:500 +#: 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" @@ -1911,7 +1911,7 @@ msgstr " --use-set-session-authorization\n" " щоб встановити власника, використати команди SET SESSION AUTHORIZATION,\n" " замість команд ALTER OWNER\n" -#: pg_dump.c:1174 pg_dumpall.c:682 pg_restore.c:504 +#: pg_dump.c:1174 pg_dumpall.c:683 pg_restore.c:504 #, c-format msgid "\n" "Connection options:\n" @@ -1923,32 +1923,32 @@ msgstr "\n" msgid " -d, --dbname=DBNAME database to dump\n" msgstr " -d, --dbname=DBNAME ім'я бази даних для вивантаження\n" -#: pg_dump.c:1176 pg_dumpall.c:684 pg_restore.c:505 +#: 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:1177 pg_dumpall.c:686 pg_restore.c:506 +#: 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:1178 pg_dumpall.c:687 pg_restore.c:507 +#: 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:1179 pg_dumpall.c:688 pg_restore.c:508 +#: 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:1180 pg_dumpall.c:689 pg_restore.c:509 +#: 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:1181 pg_dumpall.c:690 +#: 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" @@ -1961,12 +1961,12 @@ msgid "\n" msgstr "\n" "Якщо ім'я бази даних не вказано, тоді використовується значення змінної середовища PGDATABASE.\n\n" -#: pg_dump.c:1185 pg_dumpall.c:694 pg_restore.c:516 +#: 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:1186 pg_dumpall.c:695 pg_restore.c:517 +#: pg_dump.c:1186 pg_dumpall.c:696 pg_restore.c:517 #, c-format msgid "%s home page: <%s>\n" msgstr "Домашня сторінка %s: <%s>\n" @@ -1976,224 +1976,224 @@ msgstr "Домашня сторінка %s: <%s>\n" msgid "invalid client encoding \"%s\" specified" msgstr "вказано неприпустиме клієнтське кодування \"%s\"" -#: pg_dump.c:1352 +#: pg_dump.c:1353 #, c-format msgid "parallel dumps from standby servers are not supported by this server version" msgstr "паралельні вивантаження для резервних серверів не підтримуються цією версію сервера" -#: pg_dump.c:1417 +#: pg_dump.c:1418 #, c-format msgid "invalid output format \"%s\" specified" msgstr "вказано неприпустимий формат виводу \"%s\"" -#: pg_dump.c:1458 pg_dump.c:1514 pg_dump.c:1567 pg_dumpall.c:1467 +#: 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:1466 +#: pg_dump.c:1467 #, c-format msgid "no matching schemas were found for pattern \"%s\"" msgstr "не знайдено відповідних схем для візерунку \"%s\"" -#: pg_dump.c:1519 +#: pg_dump.c:1520 #, c-format msgid "no matching extensions were found for pattern \"%s\"" msgstr "не знайдено відповідних розширень для шаблону \"%s\"" -#: pg_dump.c:1572 +#: pg_dump.c:1573 #, c-format msgid "no matching foreign servers were found for pattern \"%s\"" msgstr "не знайдено відповідних підлеглих серверів для шаблону \"%s\"" -#: pg_dump.c:1643 +#: pg_dump.c:1644 #, c-format msgid "improper relation name (too many dotted names): %s" msgstr "неправильне ім'я зв'язку (забагато компонентів): %s" -#: pg_dump.c:1665 +#: pg_dump.c:1666 #, c-format msgid "no matching tables were found for pattern \"%s\"" msgstr "не знайдено відповідних таблиць для візерунку\"%s\"" -#: pg_dump.c:1692 +#: pg_dump.c:1693 #, c-format msgid "You are currently not connected to a database." msgstr "На даний момент ви від'єднанні від бази даних." -#: pg_dump.c:1695 +#: pg_dump.c:1696 #, c-format msgid "cross-database references are not implemented: %s" msgstr "міжбазові посилання не реалізовані: %s" -#: pg_dump.c:2154 +#: pg_dump.c:2155 #, c-format msgid "dumping contents of table \"%s.%s\"" msgstr "вивантажування змісту таблиці \"%s.%s\"" -#: pg_dump.c:2264 +#: pg_dump.c:2265 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetCopyData() failed." msgstr "Помилка вивантажування змісту таблиці \"%s\": помилка в PQgetCopyData()." -#: pg_dump.c:2265 pg_dump.c:2275 +#: pg_dump.c:2266 pg_dump.c:2276 #, c-format msgid "Error message from server: %s" msgstr "Повідомлення про помилку від сервера: %s" -#: pg_dump.c:2266 pg_dump.c:2276 +#: pg_dump.c:2267 pg_dump.c:2277 #, c-format msgid "Command was: %s" msgstr "Команда була: %s" -#: pg_dump.c:2274 +#: pg_dump.c:2275 #, c-format msgid "Dumping the contents of table \"%s\" failed: PQgetResult() failed." msgstr "Помилка вивантажування змісту таблиці \"%s\": помилка в PQgetResult(). " -#: pg_dump.c:2365 +#: pg_dump.c:2366 #, c-format msgid "wrong number of fields retrieved from table \"%s\"" msgstr "неправильна кількість полів отриманих з таблиці \"%s\"" -#: pg_dump.c:3067 +#: pg_dump.c:3068 #, c-format msgid "saving database definition" msgstr "збереження визначення бази даних" -#: pg_dump.c:3176 +#: pg_dump.c:3177 #, c-format msgid "unrecognized locale provider: %s" msgstr "нерозпізнаний постачальник локалів: %s" -#: pg_dump.c:3537 +#: pg_dump.c:3538 #, c-format msgid "saving encoding = %s" msgstr "збереження кодування = %s" -#: pg_dump.c:3562 +#: pg_dump.c:3563 #, c-format msgid "saving \"standard_conforming_strings = %s\"" msgstr "збереження \"standard_conforming_strings = %s\"" -#: pg_dump.c:3601 +#: pg_dump.c:3602 #, c-format msgid "could not parse result of current_schemas()" msgstr "не вдалося проаналізувати результат current_schemas()" -#: pg_dump.c:3620 +#: pg_dump.c:3621 #, c-format msgid "saving \"search_path = %s\"" msgstr "збереження \"search_path = %s\"" -#: pg_dump.c:3656 +#: pg_dump.c:3657 #, c-format msgid "reading large objects" msgstr "читання великих об’єктів" -#: pg_dump.c:3877 +#: pg_dump.c:3878 #, c-format msgid "saving large objects \"%s\"" msgstr "збереження великих об’єктів \"%s\"" -#: pg_dump.c:3898 +#: pg_dump.c:3899 #, c-format msgid "error reading large object %u: %s" msgstr "помилка читання великих об’єктів %u: %s" -#: pg_dump.c:4001 +#: pg_dump.c:4002 #, c-format msgid "reading row-level security policies" msgstr "читання політик безпеки на рівні рядків" -#: pg_dump.c:4142 +#: pg_dump.c:4143 #, c-format msgid "unexpected policy command type: %c" msgstr "неочікуваний тип команди в політиці: %c" -#: pg_dump.c:4592 pg_dump.c:5150 pg_dump.c:12362 pg_dump.c:18247 -#: pg_dump.c:18249 pg_dump.c:18871 +#: 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:4806 +#: pg_dump.c:4807 #, c-format msgid "subscriptions not dumped because current user is not a superuser" msgstr "підписки не вивантажені через те, що чинний користувач не є суперкористувачем" -#: pg_dump.c:5012 +#: pg_dump.c:5013 #, c-format msgid "subscription with OID %u does not exist" msgstr "підписки %u з OID не існує" -#: pg_dump.c:5019 +#: pg_dump.c:5020 #, c-format msgid "failed sanity check, table with OID %u not found" msgstr "помилка цілісності, таблиця з OID %u не знайдена" -#: pg_dump.c:5582 +#: pg_dump.c:5583 #, c-format msgid "could not find parent extension for %s %s" msgstr "не вдалося знайти батьківський елемент для %s %s" -#: pg_dump.c:5727 +#: pg_dump.c:5728 #, c-format msgid "schema with OID %u does not exist" msgstr "схема з OID %u не існує" -#: pg_dump.c:7209 pg_dump.c:17618 +#: 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:7352 +#: 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:7583 pg_dump.c:7857 pg_dump.c:8304 pg_dump.c:8918 pg_dump.c:9040 -#: pg_dump.c:9188 +#: 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:7587 +#: pg_dump.c:7590 #, c-format msgid "unexpected index data for table \"%s\"" msgstr "неочікувані дані індексу для таблиці \"%s\"" -#: pg_dump.c:8089 +#: 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:8922 +#: pg_dump.c:8925 #, c-format msgid "unexpected column data for table \"%s\"" msgstr "неочікувані дані стовпця для таблиці \"%s\"" -#: pg_dump.c:8951 +#: pg_dump.c:8954 #, c-format msgid "invalid column numbering in table \"%s\"" msgstr "неприпустима нумерація стовпців у таблиці \"%s\"" -#: pg_dump.c:9002 +#: pg_dump.c:9005 #, c-format msgid "finding table default expressions" msgstr "пошук виразів за замовчуванням для таблиці" -#: pg_dump.c:9044 +#: pg_dump.c:9047 #, c-format msgid "invalid adnum value %d for table \"%s\"" msgstr "неприпустиме значення adnum %d для таблиці \"%s\"" -#: pg_dump.c:9138 +#: pg_dump.c:9141 #, c-format msgid "finding table check constraints" msgstr "пошук перевірочних обмежень таблиці" -#: pg_dump.c:9192 +#: 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" @@ -2202,178 +2202,178 @@ msgstr[1] "очікувалось %d обмеження-перевірки дл msgstr[2] "очікувалось %d обмежень-перевірок для таблиці \"%s\", але знайдено %d" msgstr[3] "очікувалось %d обмежень-перевірок для таблиці \"%s\", але знайдено %d" -#: pg_dump.c:9196 +#: pg_dump.c:9199 #, c-format msgid "The system catalogs might be corrupted." msgstr "Системні каталоги можуть бути пошкоджені." -#: pg_dump.c:9886 +#: pg_dump.c:9889 #, c-format msgid "role with OID %u does not exist" msgstr "роль з OID %u не існує" -#: pg_dump.c:9998 pg_dump.c:10027 +#: 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:10574 +#: pg_dump.c:10577 #, c-format msgid "missing metadata for large objects \"%s\"" msgstr "відсутні метадані для великих об'єктів \"%s\"" -#: pg_dump.c:10857 +#: pg_dump.c:10860 #, c-format msgid "typtype of data type \"%s\" appears to be invalid" msgstr "typtype типу даних \"%s\" має неприпустимий вигляд" -#: pg_dump.c:12431 +#: pg_dump.c:12434 #, c-format msgid "unrecognized provolatile value for function \"%s\"" msgstr "нерозпізнане значення provolatile для функції \"%s\"" -#: pg_dump.c:12481 pg_dump.c:14377 +#: pg_dump.c:12484 pg_dump.c:14380 #, c-format msgid "unrecognized proparallel value for function \"%s\"" msgstr "нерозпізнане значення proparallel для функції \"%s\"" -#: pg_dump.c:12611 pg_dump.c:12717 pg_dump.c:12724 +#: 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:12650 +#: 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:12653 +#: pg_dump.c:12656 #, c-format msgid "bogus value in pg_cast.castmethod field" msgstr "неприпустиме значення в полі pg_cast.castmethod" -#: pg_dump.c:12743 +#: 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:12760 +#: pg_dump.c:12763 #, c-format msgid "bogus value in pg_transform.trffromsql field" msgstr "неприпустиме значення в полі pg_transform.trffromsql" -#: pg_dump.c:12781 +#: pg_dump.c:12784 #, c-format msgid "bogus value in pg_transform.trftosql field" msgstr "неприпустиме значення в полі pg_transform.trftosql" -#: pg_dump.c:12926 +#: pg_dump.c:12929 #, c-format msgid "postfix operators are not supported anymore (operator \"%s\")" msgstr "постфіксні оператори більше не підтримуються (оператор \"%s\")" -#: pg_dump.c:13096 +#: pg_dump.c:13099 #, c-format msgid "could not find operator with OID %s" msgstr "не вдалося знайти оператора з OID %s" -#: pg_dump.c:13164 +#: pg_dump.c:13167 #, c-format msgid "invalid type \"%c\" of access method \"%s\"" msgstr "неприпустимий тип \"%c\" методу доступу \"%s\"" -#: pg_dump.c:13838 pg_dump.c:13906 +#: pg_dump.c:13841 pg_dump.c:13909 #, c-format msgid "unrecognized collation provider: %s" msgstr "нерозпізнаний постачальник правил сортування: %s" -#: pg_dump.c:13847 pg_dump.c:13854 pg_dump.c:13865 pg_dump.c:13875 -#: pg_dump.c:13890 +#: 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:14296 +#: pg_dump.c:14299 #, c-format msgid "unrecognized aggfinalmodify value for aggregate \"%s\"" msgstr "нерозпізнане значення aggfinalmodify для агрегату \"%s\"" -#: pg_dump.c:14352 +#: pg_dump.c:14355 #, c-format msgid "unrecognized aggmfinalmodify value for aggregate \"%s\"" msgstr "нерозпізнане значення aggmfinalmodify для агрегату \"%s\"" -#: pg_dump.c:15069 +#: pg_dump.c:15072 #, c-format msgid "unrecognized object type in default privileges: %d" msgstr "нерозпізнаний тип об’єкта у стандартному праві: %d" -#: pg_dump.c:15085 +#: pg_dump.c:15088 #, c-format msgid "could not parse default ACL list (%s)" msgstr "не вдалося проаналізувати стандартний ACL список (%s)" -#: pg_dump.c:15169 +#: 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:15194 +#: 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:15737 +#: pg_dump.c:15740 #, c-format msgid "query to obtain definition of view \"%s\" returned no data" msgstr "запит на отримання визначення перегляду \"%s\" не повернув дані" -#: pg_dump.c:15740 +#: pg_dump.c:15743 #, c-format msgid "query to obtain definition of view \"%s\" returned more than one definition" msgstr "запит на отримання визначення перегляду \"%s\" повернув більше, ніж одне визначення" -#: pg_dump.c:15747 +#: pg_dump.c:15750 #, c-format msgid "definition of view \"%s\" appears to be empty (length zero)" msgstr "визначення перегляду \"%s\" пусте (довжина нуль)" -#: pg_dump.c:15832 +#: pg_dump.c:15835 #, c-format msgid "WITH OIDS is not supported anymore (table \"%s\")" msgstr "WITH OIDS більше не підтримується (таблиця\"%s\")" -#: pg_dump.c:16819 +#: pg_dump.c:16822 #, c-format msgid "invalid column number %d for table \"%s\"" msgstr "неприпустиме число стовпців %d для таблиці \"%s\"" -#: pg_dump.c:16897 +#: pg_dump.c:16900 #, c-format msgid "could not parse index statistic columns" msgstr "не вдалося проаналізувати стовпці статистики індексів" -#: pg_dump.c:16899 +#: pg_dump.c:16902 #, c-format msgid "could not parse index statistic values" msgstr "не вдалося проаналізувати значення статистики індексів" -#: pg_dump.c:16901 +#: pg_dump.c:16904 #, c-format msgid "mismatched number of columns and values for index statistics" msgstr "невідповідна кількість стовпців і значень для статистики індексів" -#: pg_dump.c:17116 +#: pg_dump.c:17119 #, c-format msgid "missing index for constraint \"%s\"" msgstr "пропущено індекс для обмеження \"%s\"" -#: pg_dump.c:17351 +#: pg_dump.c:17354 #, c-format msgid "unrecognized constraint type: %c" msgstr "нерозпізнаний тип обмеження: %c" -#: pg_dump.c:17452 pg_dump.c:17682 +#: 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)" @@ -2382,42 +2382,42 @@ msgstr[1] "запит на отримання даних послідовнос msgstr[2] "запит на отримання даних послідовності \"%s\" повернув %d рядків (очікувалося 1)" msgstr[3] "запит на отримання даних послідовності \"%s\" повернув %d рядків (очікувалося 1)" -#: pg_dump.c:17484 +#: pg_dump.c:17487 #, c-format msgid "unrecognized sequence type: %s" msgstr "нерозпізнаний тип послідовності: %s" -#: pg_dump.c:17999 +#: 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:18152 +#: pg_dump.c:18155 #, c-format msgid "could not find referenced extension %u" msgstr "не вдалося знайти згадане розширення %u" -#: pg_dump.c:18251 +#: pg_dump.c:18254 #, c-format msgid "mismatched number of configurations and conditions for extension" msgstr "невідповідна кількість конфігурацій і умов для розширення" -#: pg_dump.c:18383 +#: pg_dump.c:18386 #, c-format msgid "reading dependency data" msgstr "читання даних залежності" -#: pg_dump.c:18469 +#: pg_dump.c:18472 #, c-format msgid "no referencing object %u %u" msgstr "немає об’єкту посилання %u %u" -#: pg_dump.c:18480 +#: pg_dump.c:18483 #, c-format msgid "no referenced object %u %u" msgstr "немає посилання на об'єкт %u %u" -#: pg_dump.c:18905 pg_dump.c:18943 pg_dumpall.c:1962 pg_restore.c:551 +#: 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" @@ -2492,7 +2492,7 @@ msgstr "параметри -g/--globals-only і -t/--tablespaces-only не мо msgid "options -r/--roles-only and -t/--tablespaces-only cannot be used together" msgstr "параметри -r/--roles-only і -t/--tablespaces-only не можна використовувати разом" -#: pg_dumpall.c:474 pg_dumpall.c:1771 +#: pg_dumpall.c:474 pg_dumpall.c:1820 #, c-format msgid "could not connect to database \"%s\"" msgstr "не вдалося зв'язатися з базою даних \"%s\"" @@ -2504,77 +2504,77 @@ msgid "could not connect to databases \"postgres\" or \"template1\"\n" msgstr "не вдалося зв'язатися з базами даних \"postgres\" або \"template1\"\n" "Будь ласка, вкажіть альтернативну базу даних." -#: pg_dumpall.c:634 +#: 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:636 +#: pg_dumpall.c:637 #, c-format msgid " %s [OPTION]...\n" msgstr " %s: [OPTION]...\n" -#: pg_dumpall.c:639 +#: pg_dumpall.c:640 #, c-format msgid " -f, --file=FILENAME output file name\n" msgstr " -f, --file=FILENAME ім'я вихідного файлу\n" -#: pg_dumpall.c:646 +#: pg_dumpall.c:647 #, c-format msgid " -c, --clean clean (drop) databases before recreating\n" msgstr " -c, --clean очистити (видалити) бази даних перед відтворенням\n" -#: pg_dumpall.c:648 +#: 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:649 pg_restore.c:475 +#: 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:650 +#: 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:652 +#: 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:653 +#: 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:659 +#: 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:667 +#: 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:683 +#: pg_dumpall.c:684 #, c-format msgid " -d, --dbname=CONNSTR connect using connection string\n" msgstr " -d, --dbname=CONNSTR підключення з використанням рядку підключення \n" -#: pg_dumpall.c:685 +#: pg_dumpall.c:686 #, c-format msgid " -l, --database=DBNAME alternative default database\n" msgstr " -l, --database=DBNAME альтернативна база даних за замовчуванням\n" -#: pg_dumpall.c:692 +#: 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" @@ -2582,67 +2582,73 @@ msgid "\n" msgstr "\n" "Якщо -f/--file не використовується, тоді SQL- сценарій буде записаний до стандартного виводу.\n\n" -#: pg_dumpall.c:837 +#: pg_dumpall.c:838 #, c-format msgid "role name starting with \"pg_\" skipped (%s)" msgstr "пропущено ім’я ролі, що починається з \"pg_\" (%s)" -#: pg_dumpall.c:1059 +#. 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:1194 +#: pg_dumpall.c:1243 #, c-format msgid "could not parse ACL list (%s) for parameter \"%s\"" msgstr "не вдалося аналізувати список ACL (%s) для параметра \"%s\"" -#: pg_dumpall.c:1321 +#: pg_dumpall.c:1370 #, c-format msgid "could not parse ACL list (%s) for tablespace \"%s\"" msgstr "не вдалося аналізувати список ACL (%s) для табличного простору \"%s\"" -#: pg_dumpall.c:1528 +#: pg_dumpall.c:1577 #, c-format msgid "excluding database \"%s\"" msgstr "виключаємо базу даних \"%s\"" -#: pg_dumpall.c:1532 +#: pg_dumpall.c:1581 #, c-format msgid "dumping database \"%s\"" msgstr "вивантажуємо базу даних \"%s\"" -#: pg_dumpall.c:1563 +#: pg_dumpall.c:1612 #, c-format msgid "pg_dump failed on database \"%s\", exiting" msgstr "помилка pg_dump для бази даних \"%s\", завершення роботи" -#: pg_dumpall.c:1569 +#: pg_dumpall.c:1618 #, c-format msgid "could not re-open the output file \"%s\": %m" msgstr "не вдалося повторно відкрити файл виводу \"%s\": %m" -#: pg_dumpall.c:1613 +#: pg_dumpall.c:1662 #, c-format msgid "running \"%s\"" msgstr "виконується \"%s\"" -#: pg_dumpall.c:1814 +#: pg_dumpall.c:1863 #, c-format msgid "could not get server version" msgstr "не вдалося отримати версію серверу" -#: pg_dumpall.c:1817 +#: pg_dumpall.c:1866 #, c-format msgid "could not parse server version \"%s\"" msgstr "не вдалося аналізувати версію серверу \"%s\"" -#: pg_dumpall.c:1887 pg_dumpall.c:1910 +#: pg_dumpall.c:1936 pg_dumpall.c:1959 #, c-format msgid "executing %s" msgstr "виконується %s" -#: pg_dumpall.c:1982 +#: pg_dumpall.c:2031 msgid "unsupported filter object" msgstr "непідтримуваний об'єкт фільтру" diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl index 5bcc2244d5831..8d5b2e1dc45e0 100644 --- a/src/bin/pg_dump/t/002_pg_dump.pl +++ b/src/bin/pg_dump/t/002_pg_dump.pl @@ -718,6 +718,16 @@ # This is where the actual tests are defined. my %tests = ( + 'restrict' => { + all_runs => 1, + regexp => qr/^\\restrict [a-zA-Z0-9]+$/m, + }, + + 'unrestrict' => { + all_runs => 1, + regexp => qr/^\\unrestrict [a-zA-Z0-9]+$/m, + }, + 'ALTER DEFAULT PRIVILEGES FOR ROLE regress_dump_test_role GRANT' => { create_order => 14, create_sql => 'ALTER DEFAULT PRIVILEGES @@ -1893,6 +1903,27 @@ }, }, + 'newline of role or table name in comment' => { + create_sql => qq{CREATE ROLE regress_newline; + ALTER ROLE regress_newline SET enable_seqscan = off; + ALTER ROLE regress_newline + RENAME TO "regress_newline\nattack"; + + -- meet getPartitioningInfo() "unsafe" condition + CREATE TYPE pp_colors AS + ENUM ('green', 'blue', 'black'); + CREATE TABLE pp_enumpart (a pp_colors) + PARTITION BY HASH (a); + CREATE TABLE pp_enumpart1 PARTITION OF pp_enumpart + FOR VALUES WITH (MODULUS 2, REMAINDER 0); + CREATE TABLE pp_enumpart2 PARTITION OF pp_enumpart + FOR VALUES WITH (MODULUS 2, REMAINDER 1); + ALTER TABLE pp_enumpart + RENAME TO "pp_enumpart\nattack";}, + regexp => qr/\n--[^\n]*\nattack/s, + like => {}, + }, + 'CREATE TABLESPACE regress_dump_tablespace' => { create_order => 2, create_sql => q( @@ -2041,17 +2072,19 @@ create_sql => 'CREATE DOMAIN dump_test.us_postal_code AS TEXT COLLATE "C" DEFAULT \'10014\' + CONSTRAINT nn NOT NULL CHECK(VALUE ~ \'^\d{5}$\' OR VALUE ~ \'^\d{5}-\d{4}$\'); + COMMENT ON CONSTRAINT nn + ON DOMAIN dump_test.us_postal_code IS \'not null\'; COMMENT ON CONSTRAINT us_postal_code_check ON DOMAIN dump_test.us_postal_code IS \'check it\';', regexp => qr/^ - \QCREATE DOMAIN dump_test.us_postal_code AS text COLLATE pg_catalog."C" DEFAULT '10014'::text\E\n\s+ + \QCREATE DOMAIN dump_test.us_postal_code AS text COLLATE pg_catalog."C" CONSTRAINT nn NOT NULL DEFAULT '10014'::text\E\n\s+ \QCONSTRAINT us_postal_code_check CHECK \E \Q(((VALUE ~ '^\d{5}\E \$\Q'::text) OR (VALUE ~ '^\d{5}-\d{4}\E\$ \Q'::text)));\E(.|\n)* - \QCOMMENT ON CONSTRAINT us_postal_code_check ON DOMAIN dump_test.us_postal_code IS 'check it';\E /xm, like => { %full_runs, %dump_test_schema_runs, section_pre_data => 1, }, @@ -2061,6 +2094,30 @@ }, }, + 'COMMENT ON CONSTRAINT ON DOMAIN (1)' => { + regexp => qr/^ + \QCOMMENT ON CONSTRAINT nn ON DOMAIN dump_test.us_postal_code IS 'not null';\E + /xm, + like => + { %full_runs, %dump_test_schema_runs, section_pre_data => 1, }, + unlike => { + exclude_dump_test_schema => 1, + only_dump_measurement => 1, + }, + }, + + 'COMMENT ON CONSTRAINT ON DOMAIN (2)' => { + regexp => qr/^ + \QCOMMENT ON CONSTRAINT us_postal_code_check ON DOMAIN dump_test.us_postal_code IS 'check it';\E + /xm, + like => + { %full_runs, %dump_test_schema_runs, section_pre_data => 1, }, + unlike => { + exclude_dump_test_schema => 1, + only_dump_measurement => 1, + }, + }, + 'CREATE FUNCTION dump_test.pltestlang_call_handler' => { create_order => 17, create_sql => 'CREATE FUNCTION dump_test.pltestlang_call_handler() @@ -3828,7 +3885,6 @@ }, 'ALTER TABLE measurement PRIMARY KEY' => { - all_runs => 1, catch_all => 'CREATE ... commands', create_order => 93, create_sql => @@ -3880,7 +3936,6 @@ }, 'ALTER INDEX ... ATTACH PARTITION (primary key)' => { - all_runs => 1, catch_all => 'CREATE ... commands', regexp => qr/^ \QALTER INDEX dump_test.measurement_pkey ATTACH PARTITION dump_test_second_schema.measurement_y2006m2_pkey\E @@ -4905,9 +4960,10 @@ # 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})) + # Either "all_runs" should be set or there should be a "like" list, + # even if it is empty. (This makes the test more self-documenting.) + if (!defined($tests{$test}->{all_runs}) + && !defined($tests{$test}->{like})) { die "missing \"like\" in test \"$test\""; } @@ -4943,9 +4999,10 @@ next; } - # Run the test listed as a like, unless it is specifically noted - # as an unlike (generally due to an explicit exclusion or similar). - if ($tests{$test}->{like}->{$test_key} + # Run the test if all_runs is set or if 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} || $tests{$test}->{all_runs}) && !defined($tests{$test}->{unlike}->{$test_key})) { if (!ok($output_file =~ $tests{$test}->{regexp}, 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 b5a144555074d..6948dcd298421 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 @@ -16,6 +16,22 @@ $node->init; $node->start; +######################################### +# pg_dumpall: newline in database name + +$node->safe_psql('postgres', qq{CREATE DATABASE "regress_\nattack"}); + +my (@cmd, $stdout, $stderr); +@cmd = ("pg_dumpall", '--port' => $port, '--exclude-database=postgres'); +print("# Running: " . join(" ", @cmd) . "\n"); +my $result = IPC::Run::run \@cmd, '>' => \$stdout, '2>' => \$stderr; +ok(!$result, "newline in dbname: exit code not 0"); +like( + $stderr, + qr/shell command argument contains a newline/, + "newline in dbname: stderr matches"); +unlike($stdout, qr/^attack/m, "newline in dbname: no comment escape"); + ######################################### # Verify that dumping foreign data includes only foreign tables of # matching servers @@ -26,7 +42,6 @@ $node->safe_psql('postgres', "CREATE SERVER s2 FOREIGN DATA WRAPPER dummy"); $node->safe_psql('postgres', "CREATE FOREIGN TABLE t0 (a int) SERVER s0"); $node->safe_psql('postgres', "CREATE FOREIGN TABLE t1 (a int) SERVER s1"); -my ($cmd, $stdout, $stderr, $result); command_fails_like( [ "pg_dump", '-p', $port, '--include-foreign-data=s0', 'postgres' ], 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 a36ba8cf54887..ef85e6526b2b1 100644 --- a/src/bin/pg_dump/t/004_pg_dump_parallel.pl +++ b/src/bin/pg_dump/t/004_pg_dump_parallel.pl @@ -8,6 +8,9 @@ use PostgreSQL::Test::Utils; use Test::More; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_smgr + 'pg_restore fail to restore _pg_tde schema on cluster which already has it'; + my $dbname1 = 'regression_src'; my $dbname2 = 'regression_dest1'; my $dbname3 = 'regression_dest2'; diff --git a/src/bin/pg_dump/t/005_pg_dump_filterfile.pl b/src/bin/pg_dump/t/005_pg_dump_filterfile.pl index a80e13a0d36f5..12fd0eaeedbb2 100644 --- a/src/bin/pg_dump/t/005_pg_dump_filterfile.pl +++ b/src/bin/pg_dump/t/005_pg_dump_filterfile.pl @@ -374,10 +374,16 @@ qr/invalid filter command/, "invalid syntax: incorrect filter command"); -# Test invalid object type +# Test invalid object type. +# +# This test also verifies that keywords are correctly recognized as strings of +# non-whitespace characters. If the parser incorrectly treats non-whitespace +# delimiters (like hyphens) as keyword boundaries, "table-data" might be +# misread as the valid object type "table". To catch such issues, +# "table-data" is used here as an intentionally invalid object type. open $inputfile, '>', "$tempdir/inputfile.txt" or die "unable to open filterfile for writing"; -print $inputfile "include xxx"; +print $inputfile "exclude table-data one"; close $inputfile; command_fails_like( @@ -385,8 +391,8 @@ '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" + qr/unsupported filter object type: "table-data"/, + "invalid syntax: invalid object type specified" ); # Test missing object identifier pattern diff --git a/src/bin/pg_dump/t/010_dump_connstr.pl b/src/bin/pg_dump/t/010_dump_connstr.pl index 54e2e08cc20bf..b8f7ce200649d 100644 --- a/src/bin/pg_dump/t/010_dump_connstr.pl +++ b/src/bin/pg_dump/t/010_dump_connstr.pl @@ -8,6 +8,9 @@ use PostgreSQL::Test::Utils; use Test::More; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_smgr + 'pg_restore fail to restore _pg_tde schema on cluster which already has it'; + if ($PostgreSQL::Test::Utils::is_msys2) { plan skip_all => 'High bit name tests fail on Msys2'; diff --git a/src/bin/pg_resetwal/.gitignore b/src/bin/pg_resetwal/.gitignore index 56bade5ea4401..ddb4f6fb35745 100644 --- a/src/bin/pg_resetwal/.gitignore +++ b/src/bin/pg_resetwal/.gitignore @@ -1,2 +1,5 @@ /pg_resetwal /tmp_check/ + +# Source files copied from src/backend/access/transam/ +/xlogreader.c diff --git a/src/bin/pg_resetwal/Makefile b/src/bin/pg_resetwal/Makefile index 4228a5a772a9f..f39e8378417ce 100644 --- a/src/bin/pg_resetwal/Makefile +++ b/src/bin/pg_resetwal/Makefile @@ -21,8 +21,23 @@ OBJS = \ $(WIN32RES) \ pg_resetwal.o +ifeq ($(enable_percona_ext),yes) +override CPPFLAGS := -DFRONTEND $(CPPFLAGS) + +OBJS += \ + $(top_srcdir)/src/fe_utils/simple_list.o \ + $(top_builddir)/src/libtde/libtdexlog.a \ + $(top_builddir)/src/libtde/libtde.a \ + xlogreader.o + +override CPPFLAGS := -I$(top_srcdir)/contrib/pg_tde/src/include -I$(top_srcdir)/contrib/pg_tde/src/libkmip/libkmip/include $(CPPFLAGS) +endif + all: pg_resetwal +xlogreader.c: % : $(top_srcdir)/src/backend/access/transam/% + rm -f $@ && $(LN_S) $< . + pg_resetwal: $(OBJS) | submake-libpgport $(CC) $(CFLAGS) $^ $(LDFLAGS) $(LDFLAGS_EX) $(LIBS) -o $@$(X) @@ -36,7 +51,7 @@ uninstall: rm -f '$(DESTDIR)$(bindir)/pg_resetwal$(X)' clean distclean: - rm -f pg_resetwal$(X) $(OBJS) + rm -f pg_resetwal$(X) $(OBJS) xlogreader.c rm -rf tmp_check check: diff --git a/src/bin/pg_resetwal/meson.build b/src/bin/pg_resetwal/meson.build index c1239528db27f..ea7a3094452d5 100644 --- a/src/bin/pg_resetwal/meson.build +++ b/src/bin/pg_resetwal/meson.build @@ -10,10 +10,22 @@ if host_system == 'windows' '--FILEDESC', 'pg_resetwal - reset PostgreSQL WAL log']) endif +link_w = [] +include_dirs = [postgres_inc] + +if percona_ext == true + link_w = [pg_tde_frontend] + include_dirs = [postgres_inc, pg_tde_inc] + pg_resetwal_sources += xlogreader_sources +endif + pg_resetwal = executable('pg_resetwal', pg_resetwal_sources, dependencies: [frontend_code], + c_args: ['-DFRONTEND'], # needed for xlogreader et al kwargs: default_bin_args, + include_directories: include_dirs, + link_with: link_w ) bin_targets += pg_resetwal diff --git a/src/bin/pg_resetwal/pg_resetwal.c b/src/bin/pg_resetwal/pg_resetwal.c index e9dcb5a6d89d1..3cebcb6adabe2 100644 --- a/src/bin/pg_resetwal/pg_resetwal.c +++ b/src/bin/pg_resetwal/pg_resetwal.c @@ -59,6 +59,13 @@ #include "pg_getopt.h" #include "storage/large_object.h" +#ifdef PERCONA_EXT +#include "pg_tde.h" +#include "access/pg_tde_fe_init.h" +#include "access/pg_tde_xlog_smgr.h" +#include "access/xlog_smgr.h" +#endif + static ControlFileData ControlFile; /* pg_control values */ static XLogSegNo newXlogSegNo; /* new XLOG segment # */ static bool guessed = false; /* T if we had to guess at any values */ @@ -344,6 +351,15 @@ main(int argc, char *argv[]) } #endif +#ifdef PERCONA_EXT + { + char tde_path[MAXPGPATH]; + snprintf(tde_path, sizeof(tde_path), "%s/%s", DataDir, PG_TDE_DATA_DIR); + pg_tde_fe_init(tde_path); + TDEXLogSmgrInit(); + } +#endif + get_restricted_token(); /* Set mask based on PGDATA permissions */ @@ -392,7 +408,11 @@ main(int argc, char *argv[]) WalSegSz = ControlFile.xlog_seg_size; if (log_fname != NULL) + { XLogFromFileName(log_fname, &minXlogTli, &minXlogSegNo, WalSegSz); + free(log_fname); + } + /* * Also look at existing segment files to set up newXlogSegNo @@ -488,6 +508,22 @@ main(int argc, char *argv[]) exit(1); } +#ifdef PERCONA_EXT + /* + * The only thing that WAL will contain after reset is a checkpoint, so we can + * write it in unencrypted form. There is no sensitive data in it. But we still + * need to use TDE smgr because WAL key change may be needed. If the last WAL key + * had type "encrypted" new key will be created with type "unencrypted" to mark + * the beginning of a new unencrypted WAL record. If the last WAL key had type + * "unencrypted" it will be reused. On the startup server may create a new key + * with appropriate type according to encryption settings. + * + * We are doing a write initialization only here and not at the startup because we + * want to be sure that everything is checked and ready for writing at this point. + */ + TDEXLogSmgrInitWrite(false); +#endif + /* * Else, do the dirty deed. */ @@ -607,6 +643,8 @@ read_controlfile(void) memcpy(&ControlFile, buffer, sizeof(ControlFile)); + free(buffer); + /* return false if WAL segment size is not valid */ if (!IsValidWalSegSize(ControlFile.xlog_seg_size)) { @@ -620,6 +658,8 @@ read_controlfile(void) return true; } + free(buffer); + /* Looks like it's a mess. */ pg_log_warning("pg_control exists but is broken or wrong version; ignoring it"); return false; @@ -1134,7 +1174,13 @@ WriteEmptyXLOG(void) pg_fatal("could not open file \"%s\": %m", path); errno = 0; +#ifdef PERCONA_EXT + if (xlog_smgr->seg_write(fd, buffer.data, XLOG_BLCKSZ, 0, + ControlFile.checkPointCopy.ThisTimeLineID, + newXlogSegNo, WalSegSz) != XLOG_BLCKSZ) +#else if (write(fd, buffer.data, XLOG_BLCKSZ) != XLOG_BLCKSZ) +#endif { /* if write didn't set errno, assume problem is no disk space */ if (errno == 0) @@ -1142,6 +1188,11 @@ WriteEmptyXLOG(void) pg_fatal("could not write file \"%s\": %m", path); } +#ifdef PERCONA_EXT + /* If we used xlog smgr, we need to update the file offset */ + lseek(fd, XLOG_BLCKSZ, SEEK_CUR); +#endif + /* Fill the rest of the file with zeroes */ memset(buffer.data, 0, XLOG_BLCKSZ); for (nbytes = XLOG_BLCKSZ; nbytes < WalSegSz; nbytes += XLOG_BLCKSZ) diff --git a/src/bin/pg_rewind/Makefile b/src/bin/pg_rewind/Makefile index 12b138b2f2ce3..f03de034ab1d8 100644 --- a/src/bin/pg_rewind/Makefile +++ b/src/bin/pg_rewind/Makefile @@ -30,6 +30,16 @@ OBJS = \ timeline.o \ xlogreader.o +ifeq ($(enable_percona_ext),yes) + +OBJS += \ + $(top_srcdir)/src/fe_utils/simple_list.o \ + $(top_builddir)/src/libtde/libtdexlog.a \ + $(top_builddir)/src/libtde/libtde.a + +override CPPFLAGS := -I$(top_srcdir)/contrib/pg_tde/src/include -I$(top_srcdir)/contrib/pg_tde/src/libkmip/libkmip/include $(CPPFLAGS) +endif + EXTRA_CLEAN = xlogreader.c all: pg_rewind diff --git a/src/bin/pg_rewind/meson.build b/src/bin/pg_rewind/meson.build index 200ebf84eb9e1..4b56f4ac71f1e 100644 --- a/src/bin/pg_rewind/meson.build +++ b/src/bin/pg_rewind/meson.build @@ -19,11 +19,21 @@ if host_system == 'windows' '--FILEDESC', 'pg_rewind - synchronize a data directory with another one forked from']) endif +link_w = [] +include_dirs = [postgres_inc] + +if percona_ext == true + link_w = [pg_tde_frontend] + include_dirs = [postgres_inc, pg_tde_inc] +endif + pg_rewind = executable('pg_rewind', pg_rewind_sources, dependencies: [frontend_code, libpq, lz4, zstd], c_args: ['-DFRONTEND'], # needed for xlogreader et al kwargs: default_bin_args, + include_directories: include_dirs, + link_with: link_w, ) bin_targets += pg_rewind diff --git a/src/bin/pg_rewind/parsexlog.c b/src/bin/pg_rewind/parsexlog.c index 242326c97a70e..fd37927e253d4 100644 --- a/src/bin/pg_rewind/parsexlog.c +++ b/src/bin/pg_rewind/parsexlog.c @@ -23,6 +23,10 @@ #include "fe_utils/archive.h" #include "filemap.h" #include "pg_rewind.h" +#ifdef PERCONA_EXT +#include "access/pg_tde_xlog_smgr.h" +#include "access/xlog_smgr.h" +#endif /* * RmgrNames is an array of the built-in resource manager names, to make error @@ -357,6 +361,11 @@ SimpleXLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, Assert(xlogreadfd != -1); /* Read the requested page */ +#ifdef PERCONA_EXT + r = xlog_smgr->seg_read(xlogreadfd, readBuf, XLOG_BLCKSZ, (off_t) targetPageOff, + targetHistory[private->tliIndex].tli, + xlogreadsegno, WalSegSz); +#else if (lseek(xlogreadfd, (off_t) targetPageOff, SEEK_SET) < 0) { pg_log_error("could not seek in file \"%s\": %m", xlogfpath); @@ -365,6 +374,7 @@ SimpleXLogPageRead(XLogReaderState *xlogreader, XLogRecPtr targetPagePtr, r = read(xlogreadfd, readBuf, XLOG_BLCKSZ); +#endif if (r != XLOG_BLCKSZ) { if (r < 0) diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c index 53eb49abdeaf6..931dda9250150 100644 --- a/src/bin/pg_rewind/pg_rewind.c +++ b/src/bin/pg_rewind/pg_rewind.c @@ -31,6 +31,12 @@ #include "pg_rewind.h" #include "rewind_source.h" #include "storage/bufpage.h" +#ifdef PERCONA_EXT +#include "pg_tde.h" +#include "access/pg_tde_fe_init.h" +#include "access/pg_tde_xlog_smgr.h" +#include "catalog/tde_global_space.h" +#endif static void usage(const char *progname); @@ -364,6 +370,15 @@ main(int argc, char **argv) target_tli = Max(ControlFile_target.minRecoveryPointTLI, ControlFile_target.checkPointCopy.ThisTimeLineID); +#ifdef PERCONA_EXT + { + /* TDOD: tde_path setup should be moved to the pg_tde side? */ + char tde_path[MAXPGPATH]; + snprintf(tde_path, sizeof(tde_path), "%s/%s", datadir_target, PG_TDE_DATA_DIR); + pg_tde_fe_init(tde_path); + TDEXLogSmgrInit(); + } +#endif /* * Find the common ancestor timeline between the clusters. * diff --git a/src/bin/pg_rewind/po/ja.po b/src/bin/pg_rewind/po/ja.po index 08ed0fb1ae79a..ebe05304628e4 100644 --- a/src/bin/pg_rewind/po/ja.po +++ b/src/bin/pg_rewind/po/ja.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_rewind (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-09-05 09:59+0900\n" -"PO-Revision-Date: 2024-09-05 10:40+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" @@ -20,22 +20,22 @@ msgstr "" "X-Generator: Poedit 1.8.13\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: ../../../src/common/logging.c:278 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:285 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "警告: " -#: ../../../src/common/logging.c:296 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "詳細: " -#: ../../../src/common/logging.c:303 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "ヒント: " @@ -46,12 +46,12 @@ 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 +#: 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:352 +#: ../../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バイトを読み込みました" @@ -79,10 +79,10 @@ msgstr "" "されるものと一致しないようです。この場合以下の結果は不正確になります。また、\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 ../../fe_utils/recovery_gen.c:140 -#: parsexlog.c:312 +#: ../../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" @@ -92,8 +92,8 @@ msgstr "ファイル\"%s\"をオープンできませんでした: %m" 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 +#: ../../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" @@ -109,34 +109,34 @@ msgstr "メモリ不足です\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "null ポインタを複製できません(内部エラー)\n" -#: ../../common/file_utils.c:77 +#: ../../common/file_utils.c:76 #, 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 +#: ../../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:131 ../../common/file_utils.c:228 +#: ../../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:152 ../../common/file_utils.c:282 file_ops.c:388 +#: ../../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:170 ../../common/file_utils.c:316 file_ops.c:462 +#: ../../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:499 +#: ../../common/file_utils.c:498 #, c-format msgid "could not rename file \"%s\" to \"%s\": %m" msgstr "ファイル\"%s\"の名前を\"%s\"に変更できませんでした: %m" @@ -238,12 +238,12 @@ msgstr "ファイル\"%s\"を書き出せませんでした: %m" msgid "could not create file \"%s\": %m" msgstr "ファイル\"%s\"を作成できませんでした: %m" -#: ../../fe_utils/string_utils.c:434 +#: ../../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:607 +#: ../../fe_utils/string_utils.c:760 #, c-format msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "データベース名に改行(LF)または復帰(CR)が含まれています: \"%s\"\n" @@ -323,32 +323,32 @@ msgstr "シンボリックリンク\"%s\"の参照先が長すぎます" msgid "could not close directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をクローズできませんでした: %m" -#: filemap.c:235 +#: filemap.c:297 #, c-format msgid "data file \"%s\" in source is not a regular file" msgstr "ソースのデータファイル\"%s\"は通常のファイルではありません" -#: filemap.c:240 filemap.c:273 +#: filemap.c:302 filemap.c:335 #, c-format msgid "duplicate source file \"%s\"" msgstr "ソースファイル\"%s\"が重複しています" -#: filemap.c:328 +#: filemap.c:390 #, c-format msgid "unexpected page modification for non-regular file \"%s\"" msgstr "非通常ファイル\"%s\"に対する想定外のページの書き換えです" -#: filemap.c:682 filemap.c:776 +#: filemap.c:744 filemap.c:846 #, c-format msgid "unknown file type for \"%s\"" msgstr "\"%s\"に対する未知のファイルタイプ" -#: filemap.c:709 +#: filemap.c:779 #, c-format msgid "file \"%s\" is of different type in source and target" msgstr "ファイル\"%s\"はソースとターゲットとで異なるタイプです" -#: filemap.c:781 +#: filemap.c:851 #, c-format msgid "could not decide what to do with file \"%s\"" msgstr "ファイル\"%s\"の処理を決定できませんでした" @@ -493,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読み取り機構のメモリ割り当て中にメモリ不足" @@ -513,22 +513,22 @@ 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" @@ -729,153 +729,153 @@ msgstr "タイムライン%3$uのWAL位置%1$X/%2$Xで両サーバーが分岐 msgid "no rewind required" msgstr "巻き戻しは必要ありません" -#: pg_rewind.c:460 +#: 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:470 +#: pg_rewind.c:473 #, c-format msgid "reading source file list" msgstr "ソースファイルリストを読み込んでいます" -#: pg_rewind.c:474 +#: pg_rewind.c:477 #, c-format msgid "reading target file list" msgstr "ターゲットファイルリストを読み込んでいます" -#: pg_rewind.c:483 +#: pg_rewind.c:486 #, c-format msgid "reading WAL in target" msgstr "ターゲットでWALを読み込んでいます" -#: pg_rewind.c:504 +#: 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:522 +#: pg_rewind.c:525 #, c-format msgid "syncing target data directory" msgstr "ターゲットデータディレクトリを同期しています" -#: pg_rewind.c:538 +#: pg_rewind.c:541 #, c-format msgid "Done!" msgstr "完了!" -#: pg_rewind.c:618 +#: pg_rewind.c:621 #, c-format msgid "no action decided for file \"%s\"" msgstr "ファイル\"%s\"に対するアクションが決定されていません" -#: pg_rewind.c:650 +#: pg_rewind.c:653 #, c-format msgid "source system was modified while pg_rewind was running" msgstr "pg_rewindの実行中にソースシス7テムが更新されました" -#: pg_rewind.c:654 +#: pg_rewind.c:657 #, c-format msgid "creating backup label and updating control file" msgstr "backup labelを作成して制御ファイルを更新しています" -#: pg_rewind.c:704 +#: pg_rewind.c:707 #, c-format msgid "source system was in unexpected state at end of rewind" msgstr "巻き戻し完了時点のソースシステムが想定外の状態でした" -#: pg_rewind.c:736 +#: pg_rewind.c:739 #, c-format msgid "source and target clusters are from different systems" msgstr "ソースクラスタとターゲットクラスタは異なるシステムのものです" -#: pg_rewind.c:744 +#: pg_rewind.c:747 #, c-format msgid "clusters are not compatible with this version of pg_rewind" msgstr "クラスタは、このバージョンのpg_rewindとの互換性がありません" -#: pg_rewind.c:754 +#: 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:765 +#: pg_rewind.c:768 #, c-format msgid "target server must be shut down cleanly" msgstr "ターゲットサーバーはきれいにシャットダウンされていなければなりません" -#: pg_rewind.c:775 +#: pg_rewind.c:778 #, c-format msgid "source data directory must be shut down cleanly" msgstr "ソースデータディレクトリはきれいにシャットダウンされていなければなりません" -#: pg_rewind.c:822 +#: pg_rewind.c:825 #, c-format msgid "%*s/%s kB (%d%%) copied" msgstr "%*s/%s kB (%d%%) コピーしました" -#: pg_rewind.c:948 +#: pg_rewind.c:951 #, c-format msgid "could not find common ancestor of the source and target cluster's timelines" msgstr "ソースクラスタとターゲットクラスタのタイムラインの共通の祖先を見つけられません" -#: pg_rewind.c:989 +#: pg_rewind.c:992 #, c-format msgid "backup label buffer too small" msgstr "バックアップラベルのバッファが小さすぎます" -#: pg_rewind.c:1012 +#: pg_rewind.c:1015 #, c-format msgid "unexpected control file CRC" msgstr "想定外の制御ファイルCRCです" -#: pg_rewind.c:1024 +#: pg_rewind.c:1027 #, c-format msgid "unexpected control file size %d, expected %d" msgstr "想定外の制御ファイルのサイズ%d、想定は%d" -#: pg_rewind.c:1034 +#: 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:1038 +#: 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:1075 pg_rewind.c:1143 +#: 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:1078 pg_rewind.c:1146 +#: 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:1107 +#: pg_rewind.c:1110 #, c-format -msgid "could not read \"restore_command\" from target cluster" -msgstr "ターゲットクラスタから\"restore_command\"が読み取れませんでした" +msgid "could not read restore_command from target cluster" +msgstr "ターゲットクラスタから restore_command が読み取れませんでした" -#: pg_rewind.c:1112 +#: pg_rewind.c:1115 #, c-format msgid "\"restore_command\" is not set in the target cluster" msgstr "ターゲットクラスタで\"restore_command\"が設定されていません" -#: pg_rewind.c:1150 +#: pg_rewind.c:1153 #, c-format msgid "executing \"%s\" for target server to complete crash recovery" msgstr "ターゲットサーバーに対して\"%s\"を実行してクラッシュリカバリを完了させます" -#: pg_rewind.c:1188 +#: pg_rewind.c:1191 #, c-format msgid "postgres single-user mode in target cluster failed" msgstr "ターゲットクラスタでのpostgresコマンドのシングルユーザーモード実行に失敗しました" -#: pg_rewind.c:1189 +#: pg_rewind.c:1192 #, c-format msgid "Command was: %s" msgstr "コマンド: %s" diff --git a/src/bin/pg_rewind/po/ru.po b/src/bin/pg_rewind/po/ru.po index 6f3d63dec583b..cb4ea9a533076 100644 --- a/src/bin/pg_rewind/po/ru.po +++ b/src/bin/pg_rewind/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_rewind (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-02-08 07:44+0200\n" +"POT-Creation-Date: 2025-08-02 11:37+0300\n" "PO-Revision-Date: 2024-09-07 13:07+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -236,14 +236,14 @@ msgstr "не удалось записать в файл \"%s\": %m" msgid "could not create file \"%s\": %m" msgstr "не удалось создать файл \"%s\": %m" -#: ../../fe_utils/string_utils.c:434 +#: ../../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:607 +#: ../../fe_utils/string_utils.c:760 #, c-format msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "" @@ -982,52 +982,52 @@ msgstr "" msgid "contrecord is requested by %X/%X" msgstr "в позиции %X/%X запрошено продолжение записи" -#: xlogreader.c:669 xlogreader.c:1134 +#: xlogreader.c:669 xlogreader.c:1144 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "" "неверная длина записи в позиции %X/%X: ожидалось минимум %u, получено %u" -#: xlogreader.c:758 +#: xlogreader.c:759 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "нет флага contrecord в позиции %X/%X" -#: xlogreader.c:771 +#: xlogreader.c:772 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "неверная длина contrecord: %u (ожидалась %lld) в позиции %X/%X" -#: xlogreader.c:1142 +#: xlogreader.c:1152 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "неверный ID менеджера ресурсов %u в позиции %X/%X" -#: xlogreader.c:1155 xlogreader.c:1171 +#: xlogreader.c:1165 xlogreader.c:1181 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "запись с неверной ссылкой назад %X/%X в позиции %X/%X" -#: xlogreader.c:1209 +#: xlogreader.c:1219 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "" "некорректная контрольная сумма данных менеджера ресурсов в записи в позиции " "%X/%X" -#: xlogreader.c:1243 +#: xlogreader.c:1253 #, 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 +#: xlogreader.c:1268 xlogreader.c:1310 #, 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 +#: xlogreader.c:1284 #, c-format msgid "" "WAL file is from different database system: WAL file database system " @@ -1036,7 +1036,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: в нём указан идентификатор системы БД " "%llu, а идентификатор системы pg_control: %llu" -#: xlogreader.c:1282 +#: xlogreader.c:1292 #, c-format msgid "" "WAL file is from different database system: incorrect segment size in page " @@ -1045,7 +1045,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный размер сегмента в заголовке " "страницы" -#: xlogreader.c:1288 +#: xlogreader.c:1298 #, c-format msgid "" "WAL file is from different database system: incorrect XLOG_BLCKSZ in page " @@ -1054,12 +1054,12 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный XLOG_BLCKSZ в заголовке " "страницы" -#: xlogreader.c:1320 +#: xlogreader.c:1330 #, 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 +#: xlogreader.c:1356 #, c-format msgid "" "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, " @@ -1068,23 +1068,23 @@ msgstr "" "нарушение последовательности ID линии времени %u (после %u) в сегменте WAL " "%s, LSN %X/%X, смещение %u" -#: xlogreader.c:1749 +#: xlogreader.c:1759 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "идентификатор блока %u идёт не по порядку в позиции %X/%X" -#: xlogreader.c:1773 +#: xlogreader.c:1783 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA установлен, но данных в позиции %X/%X нет" -#: xlogreader.c:1780 +#: xlogreader.c:1790 #, 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 +#: xlogreader.c:1826 #, c-format msgid "" "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at " @@ -1093,21 +1093,21 @@ msgstr "" "BKPIMAGE_HAS_HOLE установлен, но для пропуска заданы смещение %u и длина %u " "при длине образа блока %u в позиции %X/%X" -#: xlogreader.c:1832 +#: xlogreader.c:1842 #, 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 +#: xlogreader.c:1856 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "" "BKPIMAGE_COMPRESSED установлен, но длина образа блока равна %u в позиции %X/" "%X" -#: xlogreader.c:1861 +#: xlogreader.c:1871 #, c-format msgid "" "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image " @@ -1116,41 +1116,41 @@ msgstr "" "ни BKPIMAGE_HAS_HOLE, ни BKPIMAGE_COMPRESSED не установлены, но длина образа " "блока равна %u в позиции %X/%X" -#: xlogreader.c:1877 +#: xlogreader.c:1887 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "" "BKPBLOCK_SAME_REL установлен, но предыдущее значение не задано в позиции %X/" "%X" -#: xlogreader.c:1889 +#: xlogreader.c:1899 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "неверный идентификатор блока %u в позиции %X/%X" -#: xlogreader.c:1956 +#: xlogreader.c:1966 #, c-format msgid "record with invalid length at %X/%X" msgstr "запись с неверной длиной в позиции %X/%X" -#: xlogreader.c:1982 +#: xlogreader.c:1992 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "не удалось найти копию блока с ID %d в записи журнала WAL" -#: xlogreader.c:2066 +#: xlogreader.c:2076 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "" "не удалось восстановить образ в позиции %X/%X с указанным неверным блоком %d" -#: xlogreader.c:2073 +#: xlogreader.c:2083 #, 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 +#: xlogreader.c:2110 xlogreader.c:2127 #, c-format msgid "" "could not restore image at %X/%X compressed with %s not supported by build, " @@ -1159,7 +1159,7 @@ msgstr "" "не удалось восстановить образ в позиции %X/%X, сжатый методом %s, который не " "поддерживается этой сборкой, блок %d" -#: xlogreader.c:2126 +#: xlogreader.c:2136 #, c-format msgid "" "could not restore image at %X/%X compressed with unknown method, block %d" @@ -1167,7 +1167,7 @@ msgstr "" "не удалось восстановить образ в позиции %X/%X, сжатый неизвестным методом, " "блок %d" -#: xlogreader.c:2134 +#: xlogreader.c:2144 #, c-format msgid "could not decompress image at %X/%X, block %d" msgstr "не удалось развернуть образ в позиции %X/%X, блок %d" diff --git a/src/bin/pg_rewind/t/001_basic.pl b/src/bin/pg_rewind/t/001_basic.pl index d2cc4d22f0ed4..5b783e009238c 100644 --- a/src/bin/pg_rewind/t/001_basic.pl +++ b/src/bin/pg_rewind/t/001_basic.pl @@ -11,6 +11,9 @@ use RewindTest; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_wal + 'copies WAL directly to archive without using archive_command'; + sub run_test { my $test_mode = shift; diff --git a/src/bin/pg_tde_change_key_provider/.gitignore b/src/bin/pg_tde_change_key_provider/.gitignore deleted file mode 100644 index 028680dcbc3e8..0000000000000 --- a/src/bin/pg_tde_change_key_provider/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/pg_tde_change_key_provider diff --git a/src/bin/pg_upgrade/check.c b/src/bin/pg_upgrade/check.c index 1cf84cc1bb5e3..b4b596872a6fc 100644 --- a/src/bin/pg_upgrade/check.c +++ b/src/bin/pg_upgrade/check.c @@ -24,6 +24,7 @@ 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_not_null_inheritance(ClusterInfo *cluster); static void check_for_pg_role_prefix(ClusterInfo *cluster); static void check_for_new_tablespace_dir(void); static void check_for_user_defined_encoding_conversions(ClusterInfo *cluster); @@ -478,7 +479,7 @@ check_for_data_types_usage(ClusterInfo *cluster, DataTypesUsageChecks *checks) if (!results[checknum]) { pg_log(PG_REPORT, "failed check: %s", _(cur_check->status)); - appendPQExpBuffer(&report, "\n%s\n%s %s\n", + appendPQExpBuffer(&report, "\n%s\n%s\n %s\n", _(cur_check->report_text), _("A list of the problem columns is in the file:"), output_path); @@ -648,6 +649,13 @@ check_and_dump_old_cluster(bool live_check) if (GET_MAJOR_VERSION(old_cluster.major_version) <= 1100) check_for_tables_with_oids(&old_cluster); + /* + * Pre-PG 18 allowed child tables to omit not-null constraints that their + * parents columns have, but schema restore fails for them. Verify there + * are none. + */ + check_for_not_null_inheritance(&old_cluster); + /* * Pre-PG 10 allowed tables with 'unknown' type columns and non WAL logged * hash indexes @@ -1576,6 +1584,85 @@ check_for_tables_with_oids(ClusterInfo *cluster) check_ok(); } +/* + * check_for_not_null_inheritance() + * + * An attempt to create child tables lacking not-null constraints that are + * present in their parents errors out. This can no longer occur since 18, + * but previously there were various ways for that to happen. Check that + * the cluster to be upgraded doesn't have any of those problems. + */ +static void +check_for_not_null_inheritance(ClusterInfo *cluster) +{ + FILE *script = NULL; + char output_path[MAXPGPATH]; + int ntup; + + prep_status("Checking for not-null constraint inconsistencies"); + + snprintf(output_path, sizeof(output_path), "%s/%s", + log_opts.basedir, + "not_null_inconsistent_columns.txt"); + for (int dbnum = 0; dbnum < old_cluster.dbarr.ndbs; dbnum++) + { + PGresult *res; + bool db_used = false; + int i_nspname, + i_relname, + i_attname; + DbInfo *active_db = &old_cluster.dbarr.dbs[dbnum]; + PGconn *conn = connectToServer(&old_cluster, active_db->db_name); + + res = executeQueryOrDie(conn, + "SELECT nspname, cc.relname, ac.attname " + "FROM pg_catalog.pg_inherits i, pg_catalog.pg_attribute ac, " + " pg_catalog.pg_attribute ap, pg_catalog.pg_class cc, " + " pg_catalog.pg_namespace nc " + "WHERE cc.oid = ac.attrelid AND i.inhrelid = ac.attrelid " + " AND i.inhparent = ap.attrelid AND ac.attname = ap.attname " + " AND cc.relnamespace = nc.oid " + " AND ap.attnum > 0 and ap.attnotnull AND NOT ac.attnotnull"); + + ntup = PQntuples(res); + i_nspname = PQfnumber(res, "nspname"); + i_relname = PQfnumber(res, "relname"); + i_attname = PQfnumber(res, "attname"); + 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); + if (!db_used) + { + fprintf(script, "In database: %s\n", active_db->db_name); + db_used = true; + } + + fprintf(script, " %s.%s.%s\n", + PQgetvalue(res, i, i_nspname), + PQgetvalue(res, i, i_relname), + PQgetvalue(res, i, i_attname)); + } + + PQclear(res); + PQfinish(conn); + } + + if (script) + { + fclose(script); + pg_log(PG_REPORT, "fatal"); + pg_fatal("Your installation contains inconsistent NOT NULL constraints.\n" + "If the parent column(s) are NOT NULL, then the child column must\n" + "also be marked NOT NULL, or the upgrade will fail.\n" + "You can fix this by running\n" + " ALTER TABLE tablename ALTER column SET NOT NULL;\n" + "on each column listed in the file:\n" + " %s", output_path); + } + else + check_ok(); +} /* * check_for_pg_role_prefix() diff --git a/src/bin/pg_upgrade/pg_upgrade.c b/src/bin/pg_upgrade/pg_upgrade.c index af370768b6027..bb5a223e1c6a1 100644 --- a/src/bin/pg_upgrade/pg_upgrade.c +++ b/src/bin/pg_upgrade/pg_upgrade.c @@ -421,12 +421,13 @@ set_locale_and_encoding(void) datctype_literal = PQescapeLiteral(conn_new_template1, locale->db_ctype, strlen(locale->db_ctype)); + if (locale->db_locale) datlocale_literal = PQescapeLiteral(conn_new_template1, locale->db_locale, strlen(locale->db_locale)); else - datlocale_literal = pg_strdup("NULL"); + datlocale_literal = "NULL"; /* update template0 in new cluster */ if (GET_MAJOR_VERSION(new_cluster.major_version) >= 1700) @@ -470,7 +471,8 @@ set_locale_and_encoding(void) PQfreemem(datcollate_literal); PQfreemem(datctype_literal); - PQfreemem(datlocale_literal); + if (locale->db_locale) + PQfreemem(datlocale_literal); PQfinish(conn_new_template1); diff --git a/src/bin/pg_upgrade/po/de.po b/src/bin/pg_upgrade/po/de.po index 545eab9df793e..dc70c589a0bce 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) 2024 PostgreSQL Global Development Group +# Copyright (C) 2025 PostgreSQL Global Development Group # This file is distributed under the same license as the PostgreSQL package. # msgid "" msgstr "" "Project-Id-Version: pg_upgrade (PostgreSQL) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-10-30 10:50+0000\n" -"PO-Revision-Date: 2024-10-30 16:05+0100\n" +"POT-Creation-Date: 2025-08-07 12:38+0000\n" +"PO-Revision-Date: 2025-08-07 23:48+0200\n" "Last-Translator: Peter Eisentraut \n" "Language-Team: German \n" "Language: de\n" @@ -45,21 +45,21 @@ msgstr "Benutzer existiert nicht" msgid "user name lookup failure: error code %lu" msgstr "Fehler beim Nachschlagen des Benutzernamens: Fehlercode %lu" -#: ../../fe_utils/string_utils.c:434 +#: ../../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:607 +#: ../../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" -#: check.c:111 +#: check.c:112 msgid "Checking for system-defined composite types in user tables" msgstr "Prüfe auf systemdefinierte zusammengesetzte Typen in Benutzertabellen" -#: check.c:118 +#: check.c:119 msgid "" "Your installation contains system-defined composite types in user tables.\n" "These type OIDs are not stable across PostgreSQL versions,\n" @@ -72,11 +72,11 @@ msgstr "" "nicht aktualisiert werden. Sie können die Problemspalten löschen\n" "und das Upgrade neu starten.\n" -#: check.c:132 +#: check.c:133 msgid "Checking for incompatible \"line\" data type" msgstr "Prüfe auf inkompatiblen Datentyp »line«" -#: check.c:137 +#: check.c:138 msgid "" "Your installation contains the \"line\" data type in user tables.\n" "This data type changed its internal and input/output format\n" @@ -90,11 +90,11 @@ msgstr "" "Cluster gegenwärtig nicht aktualisiert werden. Sie können die\n" "Problemspalten löschen und das Upgrade neu starten.\n" -#: check.c:154 +#: check.c:155 msgid "Checking for reg* data types in user tables" msgstr "Prüfe auf reg*-Datentypen in Benutzertabellen" -#: check.c:181 +#: check.c:182 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" @@ -107,11 +107,11 @@ msgstr "" "gegenwärtig nicht aktualiert werden. Sie können die Problemspalten\n" "löschen und das Upgrade neu starten.\n" -#: check.c:193 +#: check.c:194 msgid "Checking for incompatible \"aclitem\" data type" msgstr "Prüfe auf inkompatiblen Datentyp »aclitem«" -#: check.c:198 +#: check.c:199 msgid "" "Your installation contains the \"aclitem\" data type in user tables.\n" "The internal format of \"aclitem\" changed in PostgreSQL version 16\n" @@ -124,11 +124,11 @@ msgstr "" "werden. Sie können die Problemspalten löschen und das Upgrade neu\n" "starten.\n" -#: check.c:217 +#: check.c:218 msgid "Checking for invalid \"unknown\" user columns" msgstr "Prüfe auf ungültige Benutzerspalten mit Typ »unknown«" -#: check.c:222 +#: check.c:223 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" @@ -141,11 +141,11 @@ msgstr "" "werden. Sie können die Problemspalten löschen und das Upgrade neu\n" "starten.\n" -#: check.c:239 +#: check.c:240 msgid "Checking for invalid \"sql_identifier\" user columns" msgstr "Prüfe auf ungültige Benutzerspalten mit Typ »sql_identifier«" -#: check.c:244 +#: check.c:245 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" @@ -158,11 +158,11 @@ msgstr "" "werden. Sie können die Problemspalten löschen und das Upgrade neu\n" "starten.\n" -#: check.c:255 +#: check.c:256 msgid "Checking for incompatible \"jsonb\" data type in user tables" msgstr "Prüfe auf inkompatiblen Datentyp »jsonb« in Benutzertabellen" -#: check.c:260 +#: check.c:261 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" @@ -175,11 +175,11 @@ msgstr "" "aktualisiert werden. Sie können die Problemspalten löschen und das\n" "Upgrade neu starten.\n" -#: check.c:272 +#: check.c:273 msgid "Checking for removed \"abstime\" data type in user tables" msgstr "Prüfe auf entfernten Datentyp »abstime« in Benutzertabellen" -#: check.c:277 +#: check.c:278 msgid "" "Your installation contains the \"abstime\" data type in user tables.\n" "The \"abstime\" type has been removed in PostgreSQL version 12,\n" @@ -193,11 +193,11 @@ msgstr "" "löschen oder in einen anderen Datentyp ändern und das Upgrade neu\n" "starten.\n" -#: check.c:285 +#: check.c:286 msgid "Checking for removed \"reltime\" data type in user tables" msgstr "Prüfe auf entfernten Datentyp »reltime« in Benutzertabellen" -#: check.c:290 +#: check.c:291 msgid "" "Your installation contains the \"reltime\" data type in user tables.\n" "The \"reltime\" type has been removed in PostgreSQL version 12,\n" @@ -211,11 +211,11 @@ msgstr "" "löschen oder in einen anderen Datentyp ändern und das Upgrade neu\n" "starten.\n" -#: check.c:298 +#: check.c:299 msgid "Checking for removed \"tinterval\" data type in user tables" msgstr "Prüfe auf entfernten Datentyp »tinterval« in Benutzertabellen" -#: check.c:303 +#: check.c:304 msgid "" "Your installation contains the \"tinterval\" data type in user tables.\n" "The \"tinterval\" type has been removed in PostgreSQL version 12,\n" @@ -229,34 +229,34 @@ msgstr "" "löschen oder in einen anderen Datentyp ändern und das Upgrade neu\n" "starten.\n" -#: check.c:345 +#: check.c:346 #, c-format msgid "Checking data type usage" msgstr "Prüfe Verwendung von Datentypen" -#: check.c:480 +#: check.c:481 #, c-format msgid "failed check: %s" msgstr "fehlgeschlagene Prüfung: %s" -#: check.c:483 +#: check.c:484 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 +#: check.c:496 check.c:971 check.c:1144 check.c:1259 check.c:1353 check.c:1481 +#: check.c:1557 check.c:1634 check.c:1700 check.c:1773 check.c:1952 +#: check.c:1971 check.c:2040 check.c:2092 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 +#: check.c:523 #, c-format msgid "Data type checks failed: %s" msgstr "Datentypprüfungen fehlgeschlagen: %s" -#: check.c:563 +#: check.c:564 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -265,7 +265,7 @@ msgstr "" "Führe Konsistenzprüfungen am alten laufenden Server durch\n" "---------------------------------------------------------" -#: check.c:569 +#: check.c:570 #, c-format msgid "" "Performing Consistency Checks\n" @@ -274,7 +274,7 @@ msgstr "" "Führe Konsistenzprüfungen durch\n" "-------------------------------" -#: check.c:718 +#: check.c:726 #, c-format msgid "" "\n" @@ -283,7 +283,7 @@ msgstr "" "\n" "*Cluster sind kompatibel*" -#: check.c:726 +#: check.c:734 #, c-format msgid "" "\n" @@ -295,7 +295,7 @@ msgstr "" "neuen Cluster neu mit initdb initialisieren, bevor fortgesetzt\n" "werden kann." -#: check.c:767 +#: check.c:775 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" @@ -306,7 +306,7 @@ msgstr "" "den neuen Server starten, sollte Sie diesen Befehl ausführen:\n" " %s/vacuumdb %s--all --analyze-in-stages" -#: check.c:773 +#: check.c:781 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -315,7 +315,7 @@ msgstr "" "Mit diesem Skript können die Dateien des alten Clusters gelöscht werden:\n" " %s" -#: check.c:778 +#: check.c:786 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -328,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:790 +#: check.c:798 #, c-format msgid "Checking cluster versions" msgstr "Prüfe Cluster-Versionen" -#: check.c:802 +#: check.c:810 #, 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:807 +#: check.c:815 #, 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:816 +#: check.c:824 #, 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:821 +#: check.c:829 #, 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:824 +#: check.c:832 #, 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:839 +#: check.c:847 #, 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:859 +#: check.c:867 #, 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:882 +#: check.c:890 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "Prüfe Tablespace-Verzeichnisse des neuen Clusters" -#: check.c:893 +#: check.c:901 #, c-format msgid "new cluster tablespace directory already exists: \"%s\"" msgstr "Tablespace-Verzeichnis für neuen Cluster existiert bereits: »%s«" -#: check.c:926 +#: check.c:934 #, c-format msgid "" "\n" @@ -387,7 +387,7 @@ msgstr "" "\n" "WARNUNG: das neue Datenverzeichnis sollte nicht im alten Datenverzeichnis, d.h. %s, liegen" -#: check.c:950 +#: check.c:958 #, c-format msgid "" "\n" @@ -396,53 +396,54 @@ msgstr "" "\n" "WARNUNG: benutzerdefinierte Tablespace-Pfade sollten nicht im Datenverzeichnis, d.h. %s, liegen" -#: check.c:960 +#: check.c:968 #, c-format msgid "Creating script to delete old cluster" msgstr "Erzeuge Skript zum Löschen des alten Clusters" -#: check.c:1014 +#: check.c:1022 #, c-format msgid "could not add execute permission to file \"%s\": %m" msgstr "konnte Datei »%s« nicht ausführbar machen: %m" -#: check.c:1034 +#: check.c:1042 #, c-format msgid "Checking database user is the install user" msgstr "Prüfe ob der Datenbankbenutzer der Installationsbenutzer ist" -#: check.c:1050 +#: check.c:1058 #, c-format msgid "database user \"%s\" is not the install user" msgstr "Datenbankbenutzer »%s« ist nicht der Installationsbenutzer" -#: check.c:1061 +#: check.c:1069 #, c-format msgid "could not determine the number of users" msgstr "konnte die Anzahl der Benutzer nicht ermitteln" -#: check.c:1069 +#: check.c:1077 #, 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:1098 +#: check.c:1106 #, c-format msgid "Checking database connection settings" msgstr "Prüfe Verbindungseinstellungen der Datenbank" -#: check.c:1124 +#: check.c:1132 #, 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: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 +#: check.c:1158 check.c:1278 check.c:1375 check.c:1500 check.c:1576 +#: check.c:1654 check.c:1713 check.c:1793 check.c:1984 check.c:2109 +#: function.c:210 #, c-format msgid "fatal" msgstr "fatal" -#: check.c:1151 +#: check.c:1159 #, c-format msgid "" "All non-template0 databases must allow connections, i.e. their\n" @@ -462,27 +463,27 @@ msgstr "" "in der Datei:\n" " %s" -#: check.c:1176 +#: check.c:1184 #, c-format msgid "Checking for prepared transactions" msgstr "Prüfe auf vorbereitete Transaktionen" -#: check.c:1185 +#: check.c:1193 #, c-format msgid "The source cluster contains prepared transactions" msgstr "Der alte Cluster enthält vorbereitete Transaktionen" -#: check.c:1187 +#: check.c:1195 #, c-format msgid "The target cluster contains prepared transactions" msgstr "Der neue Cluster enthält vorbereitete Transaktionen" -#: check.c:1212 +#: check.c:1220 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "Prüfe auf contrib/isn mit unpassender bigint-Übergabe" -#: check.c:1271 +#: check.c:1279 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -502,12 +503,12 @@ msgstr "" "der problematischen Funktionen ist in der Datei:\n" " %s" -#: check.c:1293 +#: check.c:1301 #, c-format msgid "Checking for user-defined postfix operators" msgstr "Prüfe auf benutzerdefinierte Postfix-Operatoren" -#: check.c:1368 +#: check.c:1376 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" @@ -522,12 +523,12 @@ msgstr "" "Liste der benutzerdefinierten Postfixoperatoren ist in der Datei:\n" " %s" -#: check.c:1392 +#: check.c:1400 #, c-format msgid "Checking for incompatible polymorphic functions" msgstr "Prüfe auf inkompatible polymorphische Funktionen" -#: check.c:1493 +#: check.c:1501 #, c-format msgid "" "Your installation contains user-defined objects that refer to internal\n" @@ -548,12 +549,12 @@ msgstr "" "Eine Liste der problematischen Objekte ist in der Datei:\n" " %s" -#: check.c:1517 +#: check.c:1525 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Prüfe auf Tabellen mit WITH OIDS" -#: check.c:1569 +#: check.c:1577 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -568,12 +569,37 @@ msgstr "" "Eine Liste der Tabellen mit dem Problem ist in der Datei:\n" " %s" -#: check.c:1596 +#: check.c:1602 +#, c-format +msgid "Checking for not-null constraint inconsistencies" +msgstr "Prüfe auf Inkonsistenzen bei Not-Null-Constraints" + +#: check.c:1655 +#, c-format +msgid "" +"Your installation contains inconsistent NOT NULL constraints.\n" +"If the parent column(s) are NOT NULL, then the child column must\n" +"also be marked NOT NULL, or the upgrade will fail.\n" +"You can fix this by running\n" +" ALTER TABLE tablename ALTER column SET NOT NULL;\n" +"on each column listed in the file:\n" +" %s" +msgstr "" +"Ihre Installation enthält inkonsistente NOT-NULL-Constraints.\n" +"Wenn die Spalte in der Elterntabelle NOT NULL ist, dann muss die\n" +"Spalte in der abgeleiteten Tabelle auch NOT NULL sein, ansonsten wird\n" +"das Upgrade fehlschlagen.\n" +"Sie können dies reparieren, indem Sie\n" +" ALTER TABLE tabellenname ALTER spalte SET NOT NULL;\n" +"für jede Spalte in dieser Datei ausführen:\n" +" %s" + +#: check.c:1683 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "Prüfe auf Rollen, die mit »pg_« anfangen" -#: check.c:1627 +#: check.c:1714 #, c-format msgid "" "Your installation contains roles starting with \"pg_\".\n" @@ -588,12 +614,12 @@ msgstr "" "Eine Liste der Rollen, die mit »pg_« anfangen, ist in der Datei:\n" " %s" -#: check.c:1647 +#: check.c:1734 #, c-format msgid "Checking for user-defined encoding conversions" msgstr "Prüfe auf benutzerdefinierte Kodierungsumwandlungen" -#: check.c:1707 +#: check.c:1794 #, c-format msgid "" "Your installation contains user-defined encoding conversions.\n" @@ -612,52 +638,52 @@ msgstr "" "in der Datei:\n" " %s" -#: check.c:1746 +#: check.c:1833 #, c-format msgid "Checking for new cluster logical replication slots" msgstr "Prüfe logische Replikations-Slots des neuen Clusters" -#: check.c:1754 +#: check.c:1841 #, 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 +#: check.c:1846 #, 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 +#: check.c:1856 check.c:1907 #, c-format msgid "could not determine parameter settings on new cluster" msgstr "konnte Parametereinstellung im neuen Cluster nicht ermitteln" -#: check.c:1774 +#: check.c:1861 #, 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 +#: check.c:1867 #, 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 +#: check.c:1899 #, c-format msgid "Checking for new cluster configuration for subscriptions" msgstr "Prüfe Konfiguration für Subskriptionen im neuen Cluster" -#: check.c:1824 +#: check.c:1911 #, 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 +#: check.c:1933 #, c-format msgid "Checking for valid logical replication slots" msgstr "Prüfe auf gültige logische Replikations-Slots" -#: check.c:1898 +#: check.c:1985 #, c-format msgid "" "Your installation contains logical replication slots that cannot be upgraded.\n" @@ -673,12 +699,12 @@ msgstr "" "Eine Liste der problematischen Slots ist in der Datei:\n" " %s" -#: check.c:1922 +#: check.c:2009 #, c-format msgid "Checking for subscription state" msgstr "Prüfe Subskriptionszustand" -#: check.c:2023 +#: check.c:2110 #, c-format msgid "" "Your installation contains subscriptions without origin or having relations not in i (initialize) or r (ready) state.\n" @@ -738,8 +764,8 @@ msgstr "Im alten Cluster fehlen Cluster-Zustandsinformationen:" msgid "The target cluster lacks cluster state information:" msgstr "Im neuen Cluster fehlen Cluster-Zustandsinformationen:" -#: 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 +#: 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 "%s" msgstr "%s" @@ -1714,77 +1740,77 @@ msgstr "" msgid "Setting locale and encoding for new cluster" msgstr "Setze Locale und Kodierung für neuen Cluster" -#: pg_upgrade.c:489 +#: pg_upgrade.c:491 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "Analysiere alle Zeilen im neuen Cluster" -#: pg_upgrade.c:502 +#: pg_upgrade.c:504 #, c-format msgid "Freezing all rows in the new cluster" msgstr "Friere alle Zeilen im neuen Cluster ein" -#: pg_upgrade.c:522 +#: pg_upgrade.c:524 #, c-format msgid "Restoring global objects in the new cluster" msgstr "Stelle globale Objekte im neuen Cluster wieder her" -#: pg_upgrade.c:538 +#: pg_upgrade.c:540 #, c-format msgid "Restoring database schemas in the new cluster" msgstr "Stelle Datenbankschemas im neuen Cluster wieder her" -#: pg_upgrade.c:662 +#: pg_upgrade.c:664 #, c-format msgid "Deleting files from new %s" msgstr "Lösche Dateien aus neuem %s" -#: pg_upgrade.c:666 +#: pg_upgrade.c:668 #, c-format msgid "could not delete directory \"%s\"" msgstr "konnte Verzeichnis »%s« nicht löschen" -#: pg_upgrade.c:685 +#: pg_upgrade.c:687 #, c-format msgid "Copying old %s to new server" msgstr "Kopiere altes %s zum neuen Server" -#: pg_upgrade.c:711 +#: pg_upgrade.c:713 #, c-format msgid "Setting oldest XID for new cluster" msgstr "Setze älteste XID im neuen Cluster" -#: pg_upgrade.c:719 +#: pg_upgrade.c:721 #, 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:749 +#: pg_upgrade.c:751 #, 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:773 +#: pg_upgrade.c:775 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "Setze älteste Multixact-ID im neuen Cluster" -#: pg_upgrade.c:793 +#: pg_upgrade.c:795 #, c-format msgid "Resetting WAL archives" msgstr "Setze WAL-Archive zurück" -#: pg_upgrade.c:836 +#: pg_upgrade.c:838 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "Setze frozenxid und minmxid im neuen Cluster" -#: pg_upgrade.c:838 +#: pg_upgrade.c:840 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "Setze minmxid im neuen Cluster" -#: pg_upgrade.c:929 +#: pg_upgrade.c:931 #, c-format msgid "Restoring logical replication slots in the new cluster" msgstr "Stelle logische Replikations-Slots im neuen Cluster wieder her" @@ -1875,7 +1901,7 @@ msgstr "konnte Versionsdatei »%s« nicht öffnen: %m" msgid "could not parse version file \"%s\"" msgstr "konnte Versionsdatei »%s« nicht interpretieren" -#: server.c:310 +#: server.c:299 #, c-format msgid "" "\n" @@ -1884,7 +1910,7 @@ msgstr "" "\n" "%s" -#: server.c:314 +#: server.c:303 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" @@ -1893,7 +1919,7 @@ msgstr "" "konnte nicht mit dem Postmaster für den alten Cluster verbinden, gestartet mit dem Befehl:\n" "%s" -#: server.c:318 +#: server.c:307 #, c-format msgid "" "could not connect to target postmaster started with the command:\n" @@ -1902,22 +1928,22 @@ msgstr "" "konnte nicht mit dem Postmaster für den neuen Cluster verbinden, gestartet mit dem Befehl:\n" "%s" -#: server.c:332 +#: server.c:321 #, 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:334 +#: server.c:323 #, 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:379 +#: server.c:368 #, c-format msgid "out of memory" msgstr "Speicher aufgebraucht" -#: server.c:392 +#: server.c:381 #, c-format msgid "libpq environment variable %s has a non-local server value: %s" msgstr "libpq-Umgebungsvariable %s hat einen nicht lokalen Serverwert: %s" diff --git a/src/bin/pg_upgrade/po/fr.po b/src/bin/pg_upgrade/po/fr.po index 6117d1fb48d91..510198382ac1f 100644 --- a/src/bin/pg_upgrade/po/fr.po +++ b/src/bin/pg_upgrade/po/fr.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-10-29 18:20+0000\n" -"PO-Revision-Date: 2024-10-30 07:41+0100\n" +"POT-Creation-Date: 2025-07-18 09:38+0000\n" +"PO-Revision-Date: 2025-07-19 07:11+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.5\n" +"X-Generator: Poedit 3.6\n" #: ../../common/fe_memutils.c:35 ../../common/fe_memutils.c:75 #: ../../common/fe_memutils.c:98 ../../common/fe_memutils.c:161 @@ -51,21 +51,21 @@ 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/string_utils.c:434 +#: ../../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:607 +#: ../../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" -#: check.c:111 +#: check.c:112 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 +#: check.c:119 msgid "" "Your installation contains system-defined composite types in user tables.\n" "These type OIDs are not stable across PostgreSQL versions,\n" @@ -77,11 +77,11 @@ msgstr "" "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 +#: check.c:133 msgid "Checking for incompatible \"line\" data type" msgstr "Vérification des types de données line incompatibles" -#: check.c:137 +#: check.c:138 msgid "" "Your installation contains the \"line\" data type in user tables.\n" "This data type changed its internal and input/output format\n" @@ -94,11 +94,11 @@ msgstr "" "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 +#: check.c:155 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 +#: check.c:182 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" @@ -111,11 +111,11 @@ msgstr "" "jour actuellement. Vous pouvez supprimer les colonnes problématiques et relancer\n" "la mise à jour.\n" -#: check.c:193 +#: check.c:194 msgid "Checking for incompatible \"aclitem\" data type" msgstr "Vérification des types de données « aclitem » incompatibles" -#: check.c:198 +#: check.c:199 msgid "" "Your installation contains the \"aclitem\" data type in user tables.\n" "The internal format of \"aclitem\" changed in PostgreSQL version 16\n" @@ -127,11 +127,11 @@ msgstr "" "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 +#: check.c:218 msgid "Checking for invalid \"unknown\" user columns" msgstr "Vérification des colonnes utilisateurs « unknown » invalides" -#: check.c:222 +#: check.c:223 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" @@ -143,11 +143,11 @@ msgstr "" "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 +#: check.c:240 msgid "Checking for invalid \"sql_identifier\" user columns" msgstr "Vérification des colonnes utilisateurs « sql_identifier » invalides" -#: check.c:244 +#: check.c:245 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" @@ -159,11 +159,11 @@ msgstr "" "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 +#: check.c:256 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 +#: check.c:261 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" @@ -175,11 +175,11 @@ msgstr "" "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 +#: check.c:273 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 +#: check.c:278 msgid "" "Your installation contains the \"abstime\" data type in user tables.\n" "The \"abstime\" type has been removed in PostgreSQL version 12,\n" @@ -193,11 +193,11 @@ msgstr "" "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 +#: check.c:286 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 +#: check.c:291 msgid "" "Your installation contains the \"reltime\" data type in user tables.\n" "The \"reltime\" type has been removed in PostgreSQL version 12,\n" @@ -211,11 +211,11 @@ msgstr "" "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 +#: check.c:299 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 +#: check.c:304 msgid "" "Your installation contains the \"tinterval\" data type in user tables.\n" "The \"tinterval\" type has been removed in PostgreSQL version 12,\n" @@ -229,34 +229,34 @@ msgstr "" "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 +#: check.c:346 #, c-format msgid "Checking data type usage" msgstr "Vérification de l'utilisation du type de données" -#: check.c:480 +#: check.c:481 #, c-format msgid "failed check: %s" msgstr "vérification échouée : %s" -#: check.c:483 +#: check.c:484 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 +#: check.c:496 check.c:971 check.c:1144 check.c:1259 check.c:1353 check.c:1481 +#: check.c:1557 check.c:1634 check.c:1700 check.c:1773 check.c:1952 +#: check.c:1971 check.c:2040 check.c:2092 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 +#: check.c:523 #, c-format msgid "Data type checks failed: %s" msgstr "Échec de la vérification des types de données : %s" -#: check.c:563 +#: check.c:564 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -265,7 +265,7 @@ msgstr "" "Exécution de tests de cohérence sur l'ancien serveur\n" "----------------------------------------------------" -#: check.c:569 +#: check.c:570 #, c-format msgid "" "Performing Consistency Checks\n" @@ -274,7 +274,7 @@ msgstr "" "Exécution de tests de cohérence\n" "-------------------------------" -#: check.c:718 +#: check.c:726 #, c-format msgid "" "\n" @@ -283,7 +283,7 @@ msgstr "" "\n" "*Les instances sont compatibles*" -#: check.c:726 +#: check.c:734 #, c-format msgid "" "\n" @@ -294,7 +294,7 @@ msgstr "" "Si pg_upgrade échoue après cela, vous devez ré-exécuter initdb\n" "sur la nouvelle instance avant de continuer." -#: check.c:767 +#: check.c:775 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" @@ -305,7 +305,7 @@ msgstr "" "Une fois le nouveau serveur démarré, pensez à exécuter :\n" " %s/vacuumdb %s--all --analyze-in-stages" -#: check.c:773 +#: check.c:781 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -314,7 +314,7 @@ msgstr "" "Exécuter ce script supprimera les fichiers de données de l'ancienne instance :\n" " %s" -#: check.c:778 +#: check.c:786 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -328,57 +328,57 @@ msgstr "" "de l'ancienne instance. Le contenu de l'ancienne instance doit être supprimé\n" "manuellement." -#: check.c:790 +#: check.c:798 #, c-format msgid "Checking cluster versions" msgstr "Vérification des versions des instances" -#: check.c:802 +#: check.c:810 #, c-format 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:807 +#: check.c:815 #, c-format 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:816 +#: check.c:824 #, c-format 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:821 +#: check.c:829 #, c-format 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:824 +#: check.c:832 #, c-format 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:839 +#: check.c:847 #, c-format 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:859 +#: check.c:867 #, c-format 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:882 +#: check.c:890 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "Vérification des répertoires de tablespace de la nouvelle instance" -#: check.c:893 +#: check.c:901 #, c-format msgid "new cluster tablespace directory already exists: \"%s\"" msgstr "le répertoire du tablespace de la nouvelle instance existe déjà : « %s »" -#: check.c:926 +#: check.c:934 #, c-format msgid "" "\n" @@ -387,7 +387,7 @@ 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" -#: check.c:950 +#: check.c:958 #, c-format msgid "" "\n" @@ -396,53 +396,54 @@ msgstr "" "\n" "AVERTISSEMENT : les emplacements des tablespaces utilisateurs ne doivent pas être à l'intérieur du répertoire de données, %s" -#: check.c:960 +#: check.c:968 #, c-format msgid "Creating script to delete old cluster" msgstr "Création du script pour supprimer l'ancienne instance" -#: check.c:1014 +#: check.c:1022 #, c-format 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:1034 +#: check.c:1042 #, 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:1050 +#: check.c:1058 #, c-format 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:1061 +#: check.c:1069 #, c-format msgid "could not determine the number of users" msgstr "n'a pas pu déterminer le nombre d'utilisateurs" -#: check.c:1069 +#: check.c:1077 #, c-format 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:1098 +#: check.c:1106 #, c-format msgid "Checking database connection settings" msgstr "Vérification des paramètres de connexion de la base de données" -#: check.c:1124 +#: check.c:1132 #, c-format 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: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 +#: check.c:1158 check.c:1278 check.c:1375 check.c:1500 check.c:1576 +#: check.c:1654 check.c:1713 check.c:1793 check.c:1984 check.c:2109 +#: function.c:210 #, c-format msgid "fatal" msgstr "fatal" -#: check.c:1151 +#: check.c:1159 #, c-format msgid "" "All non-template0 databases must allow connections, i.e. their\n" @@ -461,27 +462,27 @@ msgstr "" "le fichier :\n" " %s" -#: check.c:1176 +#: check.c:1184 #, c-format msgid "Checking for prepared transactions" msgstr "Vérification des transactions préparées" -#: check.c:1185 +#: check.c:1193 #, c-format msgid "The source cluster contains prepared transactions" msgstr "L'instance source contient des transactions préparées" -#: check.c:1187 +#: check.c:1195 #, c-format msgid "The target cluster contains prepared transactions" msgstr "L'instance cible contient des transactions préparées" -#: check.c:1212 +#: check.c:1220 #, 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:1271 +#: check.c:1279 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -502,12 +503,12 @@ msgstr "" "dans le fichier :\n" " %s" -#: check.c:1293 +#: check.c:1301 #, c-format msgid "Checking for user-defined postfix operators" msgstr "Vérification des opérateurs postfixes définis par les utilisateurs" -#: check.c:1368 +#: check.c:1376 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" @@ -522,12 +523,12 @@ msgstr "" "Une liste des opérateurs postfixes définis par les utilisateurs se trouve dans le fichier :\n" " %s" -#: check.c:1392 +#: check.c:1400 #, c-format msgid "Checking for incompatible polymorphic functions" msgstr "Vérification des fonctions polymorphiques incompatibles" -#: check.c:1493 +#: check.c:1501 #, c-format msgid "" "Your installation contains user-defined objects that refer to internal\n" @@ -547,12 +548,12 @@ msgstr "" "des objets problématiques se trouve dans le fichier\n" " %s" -#: check.c:1517 +#: check.c:1525 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Vérification des tables WITH OIDS" -#: check.c:1569 +#: check.c:1577 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -567,12 +568,36 @@ msgstr "" "Une liste des tables ayant ce problème se trouve dans le fichier :\n" " %s" -#: check.c:1596 +#: check.c:1602 +#, c-format +msgid "Checking for not-null constraint inconsistencies" +msgstr "Vérification des incohérences des contraintes NOT NULL" + +#: check.c:1655 +#, c-format +msgid "" +"Your installation contains inconsistent NOT NULL constraints.\n" +"If the parent column(s) are NOT NULL, then the child column must\n" +"also be marked NOT NULL, or the upgrade will fail.\n" +"You can fix this by running\n" +" ALTER TABLE tablename ALTER column SET NOT NULL;\n" +"on each column listed in the file:\n" +" %s" +msgstr "" +"Votre installation contient des contraintes NOT NULL incohérentes.\n" +"Si les colonnes parents sont NOT NULL, alors la colonne enfant doit\n" +"aussi être marquée NOT NULL, sinon la mise à jour échouera.\n" +"Vous pouvez corriger ceci en exécutant\n" +" ALTER TABLE tablename ALTER column SET NOT NULL;\n" +"sur chaque colonne listée dans le fichier :\n" +" %s" + +#: check.c:1683 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "Vérification des rôles commençant avec « pg_ »" -#: check.c:1627 +#: check.c:1714 #, c-format msgid "" "Your installation contains roles starting with \"pg_\".\n" @@ -587,12 +612,12 @@ msgstr "" "Une liste des rôles commençant par « pg_ » se trouve dans le fichier :\n" " %s" -#: check.c:1647 +#: check.c:1734 #, c-format msgid "Checking for user-defined encoding conversions" msgstr "Vérification des conversions d'encodage définies par les utilisateurs" -#: check.c:1707 +#: check.c:1794 #, c-format msgid "" "Your installation contains user-defined encoding conversions.\n" @@ -609,52 +634,52 @@ msgstr "" "Une liste des conversions d'encodage définies par l'utilisateur se trouve dans le fichier :\n" " %s" -#: check.c:1746 +#: check.c:1833 #, c-format msgid "Checking for new cluster logical replication slots" msgstr "Vérification des slots de réplication logique de la nouvelle instance" -#: check.c:1754 +#: check.c:1841 #, c-format 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:1759 +#: check.c:1846 #, c-format msgid "expected 0 logical replication slots but found %d" msgstr "attendait 0 slot de réplication logique mais en a trouvé %d" -#: check.c:1769 check.c:1820 +#: check.c:1856 check.c:1907 #, c-format msgid "could not determine parameter settings on new cluster" msgstr "n'a pas pu déterminer la configuration sur la nouvelle instance" -#: check.c:1774 +#: check.c:1861 #, c-format msgid "\"wal_level\" must be \"logical\" but is set to \"%s\"" msgstr "« wal_level » doit être configuré à « logical » mais est configuré à « %s »" -#: check.c:1780 +#: check.c:1867 #, 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) doit être supérieur ou égal au nombre de slots de réplication logique (%d) sur l'ancienne instance" -#: check.c:1812 +#: check.c:1899 #, c-format msgid "Checking for new cluster configuration for subscriptions" msgstr "Vérification de la configuration de la nouvelle instance pour les souscriptions" -#: check.c:1824 +#: check.c:1911 #, 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:1846 +#: check.c:1933 #, c-format msgid "Checking for valid logical replication slots" msgstr "Vérification des slots de réplication logique valides" -#: check.c:1898 +#: check.c:1985 #, c-format msgid "" "Your installation contains logical replication slots that cannot be upgraded.\n" @@ -669,12 +694,12 @@ msgstr "" "une liste des slots problématiques dans le fichier :\n" " %s" -#: check.c:1922 +#: check.c:2009 #, c-format msgid "Checking for subscription state" msgstr "Vérification de l'état de souscription" -#: check.c:2023 +#: check.c:2110 #, c-format msgid "" "Your installation contains subscriptions without origin or having relations not in i (initialize) or r (ready) state.\n" @@ -733,8 +758,8 @@ msgstr "Il manque certaines informations d'état requises sur l'instance source msgid "The target cluster lacks cluster state information:" msgstr "Il manque certaines informations d'état requises sur l'instance cible :" -#: 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 +#: 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 "%s" msgstr "%s" @@ -1739,77 +1764,77 @@ msgstr "" 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 +#: pg_upgrade.c:491 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "Analyse de toutes les lignes dans la nouvelle instance" -#: pg_upgrade.c:502 +#: pg_upgrade.c:504 #, c-format msgid "Freezing all rows in the new cluster" msgstr "Gel de toutes les lignes dans la nouvelle instance" -#: pg_upgrade.c:522 +#: pg_upgrade.c:524 #, c-format msgid "Restoring global objects in the new cluster" msgstr "Restauration des objets globaux dans la nouvelle instance" -#: pg_upgrade.c:538 +#: pg_upgrade.c:540 #, 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 +#: pg_upgrade.c:664 #, c-format msgid "Deleting files from new %s" msgstr "Suppression des fichiers à partir du nouveau %s" -#: pg_upgrade.c:666 +#: pg_upgrade.c:668 #, c-format msgid "could not delete directory \"%s\"" msgstr "n'a pas pu supprimer le répertoire « %s »" -#: pg_upgrade.c:685 +#: pg_upgrade.c:687 #, c-format msgid "Copying old %s to new server" msgstr "Copie de l'ancien %s vers le nouveau serveur" -#: pg_upgrade.c:711 +#: pg_upgrade.c:713 #, c-format msgid "Setting oldest XID for new cluster" msgstr "Configuration du plus ancien XID sur la nouvelle instance" -#: pg_upgrade.c:719 +#: pg_upgrade.c:721 #, 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:749 +#: pg_upgrade.c:751 #, 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:773 +#: pg_upgrade.c:775 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "Configuration du plus ancien identifiant multixact sur la nouvelle instance" -#: pg_upgrade.c:793 +#: pg_upgrade.c:795 #, c-format msgid "Resetting WAL archives" msgstr "Réinitialisation des archives WAL" -#: pg_upgrade.c:836 +#: pg_upgrade.c:838 #, 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:838 +#: pg_upgrade.c:840 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "Configuration du compteur minmxid dans la nouvelle instance" -#: pg_upgrade.c:929 +#: pg_upgrade.c:931 #, c-format msgid "Restoring logical replication slots in the new cluster" msgstr "Restauration des slots de réplication logique dans la nouvelle instance" @@ -1900,7 +1925,7 @@ msgstr "n'a pas pu ouvrir le fichier de version « %s » : %m" msgid "could not parse version file \"%s\"" msgstr "n'a pas pu analyser le fichier de version « %s »" -#: server.c:310 +#: server.c:299 #, c-format msgid "" "\n" @@ -1909,7 +1934,7 @@ msgstr "" "\n" "%s" -#: server.c:314 +#: server.c:303 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" @@ -1918,7 +1943,7 @@ msgstr "" "n'a pas pu se connecter au postmaster source lancé avec la commande :\n" "%s" -#: server.c:318 +#: server.c:307 #, c-format msgid "" "could not connect to target postmaster started with the command:\n" @@ -1927,22 +1952,22 @@ msgstr "" "n'a pas pu se connecter au postmaster cible lancé avec la commande :\n" "%s" -#: server.c:332 +#: server.c:321 #, c-format 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:334 +#: server.c:323 #, c-format 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:379 +#: server.c:368 #, c-format msgid "out of memory" msgstr "mémoire épuisée" -#: server.c:392 +#: server.c:381 #, c-format 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" diff --git a/src/bin/pg_upgrade/po/ja.po b/src/bin/pg_upgrade/po/ja.po index b01f03a46fad0..01d4620e0b6df 100644 --- a/src/bin/pg_upgrade/po/ja.po +++ b/src/bin/pg_upgrade/po/ja.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_upgrade (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-11-07 09:34+0900\n" -"PO-Revision-Date: 2024-11-07 09:51+0900\n" +"POT-Creation-Date: 2025-07-07 17:07+0900\n" +"PO-Revision-Date: 2025-07-08 10:54+0900\n" "Last-Translator: Kyotaro Horiguchi \n" "Language-Team: Japan PostgreSQL Users Group \n" "Language: ja\n" @@ -50,21 +50,21 @@ msgstr "ユーザーが存在しません" msgid "user name lookup failure: error code %lu" msgstr "ユーザー名の参照に失敗: エラーコード %lu" -#: ../../fe_utils/string_utils.c:434 +#: ../../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:607 +#: ../../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:109 +#: check.c:112 msgid "Checking for system-defined composite types in user tables" msgstr "ユーザーテーブル内のシステム定義複合型を確認しています" -#: check.c:116 +#: check.c:119 msgid "" "Your installation contains system-defined composite types in user tables.\n" "These type OIDs are not stable across PostgreSQL versions,\n" @@ -76,11 +76,11 @@ msgstr "" "このクラスタは現時点ではアップグレードできません。問題の列を削除したのちに\n" "アップグレードを再実行することができます。\n" -#: check.c:130 +#: check.c:133 msgid "Checking for incompatible \"line\" data type" msgstr "非互換の \"line\" データ型を確認しています" -#: check.c:135 +#: check.c:138 msgid "" "Your installation contains the \"line\" data type in user tables.\n" "This data type changed its internal and input/output format\n" @@ -93,11 +93,11 @@ msgstr "" "変更されているため、このクラスタは現時点ではアップグレードできません。\n" "問題の列を削除したのちにアップグレードを再実行できます。\n" -#: check.c:152 +#: check.c:155 msgid "Checking for reg* data types in user tables" msgstr "ユーザーテーブル内の reg * データ型をチェックしています" -#: check.c:179 +#: check.c:182 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" @@ -109,11 +109,11 @@ msgstr "" "保存されないため、現時点ではこのクラスタをアップグレードすることはできません。\n" "問題の列を削除したのち、アップグレードを再実行できます。\n" -#: check.c:191 +#: check.c:194 msgid "Checking for incompatible \"aclitem\" data type" msgstr "非互換の\"aclitem\"データ型を確認しています" -#: check.c:196 +#: check.c:199 msgid "" "Your installation contains the \"aclitem\" data type in user tables.\n" "The internal format of \"aclitem\" changed in PostgreSQL version 16\n" @@ -125,11 +125,11 @@ msgstr "" "現時点ではこのクラスタをアップグレードすることはできません。\n" "問題の列を削除したのち、アップグレードを再実行できます。\n" -#: check.c:215 +#: check.c:218 msgid "Checking for invalid \"unknown\" user columns" msgstr "無効な\"unknown\"ユーザー列をチェックしています" -#: check.c:220 +#: check.c:223 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" @@ -141,11 +141,11 @@ msgstr "" "ではアップグレードできません。問題の列を削除したのち、アップグレードを\n" "再実行できます。\n" -#: check.c:237 +#: check.c:240 msgid "Checking for invalid \"sql_identifier\" user columns" msgstr "無効な\"sql_identifier\"ユーザー列を確認しています" -#: check.c:242 +#: check.c:245 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" @@ -157,11 +157,11 @@ msgstr "" "アップグレードできません。問題のある列を削除した後にアップグレードを再実行する\n" "ことができます。\n" -#: check.c:253 +#: check.c:256 msgid "Checking for incompatible \"jsonb\" data type in user tables" msgstr "ユーザーテーブル内の非互換の\"jsonb\"データ型を確認しています" -#: check.c:258 +#: check.c:261 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" @@ -173,11 +173,11 @@ msgstr "" "クラスタをアップグレードすることはできません。 問題の列を削除したのち、\n" "アップグレードを再実行できます。\n" -#: check.c:270 +#: check.c:273 msgid "Checking for removed \"abstime\" data type in user tables" msgstr "ユーザーテーブル内の削除された\"abstime\"データ型を確認しています" -#: check.c:275 +#: check.c:278 msgid "" "Your installation contains the \"abstime\" data type in user tables.\n" "The \"abstime\" type has been removed in PostgreSQL version 12,\n" @@ -191,11 +191,11 @@ msgstr "" "問題の列を削除するか、他のデータ型に変更した後にアップグレードを\n" "再実行できます。\n" -#: check.c:283 +#: check.c:286 msgid "Checking for removed \"reltime\" data type in user tables" msgstr "ユーザーテーブル中内の削除された\"reltime\"データ型を確認しています" -#: check.c:288 +#: check.c:291 msgid "" "Your installation contains the \"reltime\" data type in user tables.\n" "The \"reltime\" type has been removed in PostgreSQL version 12,\n" @@ -208,11 +208,11 @@ msgstr "" "このクラスタは現時点ではアップグレードできません。問題の列を削除するか、\n" "他のデータ型に変更した後にアップグレードを再実行できます。\n" -#: check.c:296 +#: check.c:299 msgid "Checking for removed \"tinterval\" data type in user tables" msgstr "ユーザーテーブル内の削除された\"tinterval\"データ型を確認しています" -#: check.c:301 +#: check.c:304 msgid "" "Your installation contains the \"tinterval\" data type in user tables.\n" "The \"tinterval\" type has been removed in PostgreSQL version 12,\n" @@ -225,34 +225,34 @@ msgstr "" "このクラスタは現時点ではアップグレードできません。問題の列を削除するか、\n" "他のデータ型に変更した後にアップグレードを再実行できます。\n" -#: check.c:419 +#: check.c:346 +#, c-format +msgid "Checking data type usage" +msgstr "データ型の使用を確認しています" + +#: check.c:481 #, c-format msgid "failed check: %s" msgstr "問題を検出した項目: %s" -#: check.c:422 +#: check.c:484 msgid "A list of the problem columns is in the file:" msgstr "問題の列の一覧は以下のファイルにあります:" -#: check.c:428 check.c:978 check.c:1155 check.c:1238 check.c:1327 check.c:1418 -#: check.c:1550 check.c:1635 check.c:1682 check.c:1890 check.c:1909 -#: check.c:1955 check.c:2008 file.c:378 file.c:415 function.c:208 option.c:493 -#: version.c:79 version.c:162 +#: check.c:496 check.c:971 check.c:1144 check.c:1259 check.c:1353 check.c:1481 +#: check.c:1557 check.c:1634 check.c:1700 check.c:1773 check.c:1952 +#: check.c:1971 check.c:2040 check.c:2092 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:470 -#, c-format -msgid "Checking data type usage" -msgstr "データ型の使用を確認しています" - -#: check.c:524 +#: check.c:523 #, c-format msgid "Data type checks failed: %s" msgstr "問題を検出したデータ型確認項目: %s" -#: check.c:573 +#: check.c:564 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -261,7 +261,7 @@ msgstr "" "元の実行中サーバーの一貫性チェックを実行しています。\n" "--------------------------------------------------" -#: check.c:579 +#: check.c:570 #, c-format msgid "" "Performing Consistency Checks\n" @@ -270,7 +270,7 @@ msgstr "" "整合性チェックを実行しています。\n" "-----------------------------" -#: check.c:733 +#: check.c:726 #, c-format msgid "" "\n" @@ -279,7 +279,7 @@ msgstr "" "\n" "* クラスタは互換性があります *" -#: check.c:741 +#: check.c:734 #, c-format msgid "" "\n" @@ -290,7 +290,7 @@ msgstr "" "この後pg_upgradeが失敗した場合は、続ける前に新しいクラスタを\n" "initdbで再作成する必要があります。" -#: check.c:782 +#: check.c:775 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" @@ -301,7 +301,7 @@ msgstr "" "新サーバーを起動した後、以下を行うことを検討してください。\n" " %s/vacuumdb %s--all --analyze-in-stages" -#: check.c:788 +#: check.c:781 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -310,7 +310,7 @@ msgstr "" "このスクリプトを実行すると、旧クラスタのデータファイルが削除されます:\n" " %s" -#: check.c:793 +#: check.c:786 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -323,57 +323,57 @@ msgstr "" "ファイルを削除するためのスクリプトを作成できませんでした。 古い\n" "クラスタの内容は手動で削除する必要があります。" -#: check.c:805 +#: check.c:798 #, c-format msgid "Checking cluster versions" msgstr "クラスタのバージョンを確認しています" -#: check.c:817 +#: check.c:810 #, c-format msgid "This utility can only upgrade from PostgreSQL version %s and later." msgstr "このユーティリティではPostgreSQLバージョン%s以降のバージョンからのみアップグレードできます。" -#: check.c:822 +#: check.c:815 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s." msgstr "このユーティリティは、PostgreSQLバージョン%sにのみアップグレードできます。" -#: check.c:831 +#: check.c:824 #, c-format msgid "This utility cannot be used to downgrade to older major PostgreSQL versions." msgstr "このユーティリティは PostgreSQL の過去のメジャーバージョンにダウングレードする用途では使用できません。" -#: check.c:836 +#: check.c:829 #, c-format msgid "Old cluster data and binary directories are from different major versions." msgstr "旧クラスタのデータとバイナリのディレクトリは異なるメジャーバージョンのものです。" -#: check.c:839 +#: check.c:832 #, c-format msgid "New cluster data and binary directories are from different major versions." msgstr "新クラスタのデータとバイナリのディレクトリは異なるメジャーバージョンのものです。" -#: check.c:854 +#: check.c:847 #, c-format msgid "When checking a live server, the old and new port numbers must be different." msgstr "稼働中のサーバーをチェックする場合、新旧のポート番号が異なっている必要があります。" -#: check.c:874 +#: check.c:867 #, c-format msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"" msgstr "新クラスタのデータベース\"%s\"が空ではありません: リレーション\"%s.%s\"が見つかりました" -#: check.c:897 +#: check.c:890 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "新しいクラスタのテーブル空間ディレクトリを確認しています" -#: check.c:908 +#: check.c:901 #, c-format msgid "new cluster tablespace directory already exists: \"%s\"" msgstr "新しいクラスタのテーブル空間ディレクトリはすでに存在します: \"%s\"" -#: check.c:941 +#: check.c:934 #, c-format msgid "" "\n" @@ -382,7 +382,7 @@ msgstr "" "\n" "警告: 新データディレクトリが旧データディレクトリ、つまり %sの中にあってはなりません" -#: check.c:965 +#: check.c:958 #, c-format msgid "" "\n" @@ -391,92 +391,93 @@ msgstr "" "\n" "警告: ユーザー定義テーブル空間の場所がデータディレクトリ、つまり %s の中にあってはなりません。" -#: check.c:975 +#: check.c:968 #, c-format msgid "Creating script to delete old cluster" msgstr "旧クラスタを削除するスクリプトを作成しています" -#: check.c:1029 +#: check.c:1022 #, c-format msgid "could not add execute permission to file \"%s\": %m" msgstr "ファイル\"%s\"に実行権限を追加できませんでした: %m" -#: check.c:1049 +#: check.c:1042 #, c-format msgid "Checking database user is the install user" msgstr "データベースユーザーがインストールユーザーかどうかをチェックしています" -#: check.c:1065 +#: check.c:1058 #, c-format msgid "database user \"%s\" is not the install user" msgstr "データベースユーザー\"%s\"がインストールユーザーではありません" -#: check.c:1076 +#: check.c:1069 #, c-format msgid "could not determine the number of users" msgstr "ユーザー数を特定できませんでした" -#: check.c:1084 +#: check.c:1077 #, c-format msgid "Only the install user can be defined in the new cluster." msgstr "新クラスタ内で定義できるのはインストールユーザーのみです。" -#: check.c:1114 +#: check.c:1106 #, c-format msgid "Checking database connection settings" msgstr "データベース接続の設定を確認しています" -#: check.c:1142 +#: check.c:1132 #, 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:1169 check.c:1290 check.c:1386 check.c:1514 check.c:1590 -#: check.c:1648 check.c:1731 check.c:1922 check.c:2064 function.c:229 +#: check.c:1158 check.c:1278 check.c:1375 check.c:1500 check.c:1576 +#: check.c:1654 check.c:1713 check.c:1793 check.c:1984 check.c:2109 +#: function.c:210 #, c-format msgid "fatal" msgstr "致命的" -#: check.c:1170 +#: check.c:1159 #, c-format msgid "" "All non-template0 databases must allow connections, i.e. their\n" -"pg_database.datallowconn must be true and pg_database.datconnlimit\n" -"must not be -2. Your installation contains non-template0 databases\n" -"which cannot be connected to. Consider allowing connection for all\n" -"non-template0 databases or drop the databases which do not allow\n" -"connections. A list of databases with the problem is in the file:\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、そしてpg_database.datconnlimitが-2以外の\n" -"値でなければなりません。このクラスタには接続不可なtemplate0以外のデータベースが\n" +"pg_database.datallowconnがtrueでなければなりません。このクラスタには\n" +"pg_database.datallowconnがfalseとなっているtemplate0以外のデータベースが\n" "存在しています。template0以外のすべてのデータベースへの接続を許可するか、接続が\n" -"許可されないデータベースをすべて削除することを検討してください。問題のあるデータベースの\n" +"許可されないデータベースを削除することを検討してください。問題のあるデータベースの\n" "一覧が以下のファイルにあります:\n" " %s" -#: check.c:1195 +#: check.c:1184 #, c-format msgid "Checking for prepared transactions" msgstr "準備済みトランザクションをチェックしています" -#: check.c:1204 +#: check.c:1193 #, c-format msgid "The source cluster contains prepared transactions" msgstr "移行元クラスタに準備済みトランザクションがあります" -#: check.c:1206 +#: check.c:1195 #, c-format msgid "The target cluster contains prepared transactions" msgstr "移行先クラスタに準備済みトランザクションがあります" -#: check.c:1266 +#: check.c:1220 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "bigint を渡す際にミスマッチが発生する contrib/isn をチェックしています" -#: check.c:1291 +#: check.c:1279 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -496,12 +497,12 @@ msgstr "" "問題のある関数の一覧は以下のファイルにあります:\n" " %s" -#: check.c:1371 +#: check.c:1301 #, c-format msgid "Checking for user-defined postfix operators" msgstr "ユーザー定義の後置演算子を確認しています" -#: check.c:1387 +#: check.c:1376 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" @@ -516,12 +517,12 @@ msgstr "" "以下のファイルにユーザー定義後置演算子の一覧があります:\n" " %s" -#: check.c:1442 +#: check.c:1400 #, c-format msgid "Checking for incompatible polymorphic functions" msgstr "非互換の多態関数を確認しています" -#: check.c:1515 +#: check.c:1501 #, c-format msgid "" "Your installation contains user-defined objects that refer to internal\n" @@ -539,12 +540,12 @@ msgstr "" "問題となるオブジェクトの一覧は以下のファイルにあります:\n" " %s" -#: check.c:1575 +#: check.c:1525 #, c-format msgid "Checking for tables WITH OIDS" msgstr "WITH OIDS宣言されたテーブルをチェックしています" -#: check.c:1591 +#: check.c:1577 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -559,12 +560,36 @@ msgstr "" "以下のファイルにこの問題を抱えるテーブルの一覧があります:\n" " %s" -#: check.c:1618 +#: check.c:1602 +#, c-format +msgid "Checking for not-null constraint inconsistencies" +msgstr "非NULL制約の整合性を確認しています" + +#: check.c:1655 +#, c-format +msgid "" +"Your installation contains inconsistent NOT NULL constraints.\n" +"If the parent column(s) are NOT NULL, then the child column must\n" +"also be marked NOT NULL, or the upgrade will fail.\n" +"You can fix this by running\n" +" ALTER TABLE tablename ALTER column SET NOT NULL;\n" +"on each column listed in the file:\n" +" %s" +msgstr "" +"このクラスタには整合性の取れていない NOT NULL 制約があります。\n" +"親テーブルの列が NOT NULL である場合、子テーブルの列も NOT NULL としてマーク\n" +"されていなければ、アップグレードは失敗します。\n" +"この状態は、次のコマンドを\n" +" ALTER TABLE テーブル名 ALTER 列名 SET NOT NULL;\n" +"以下のファイルにリストされている各列に対して実行することで解消できます:\n" +"%s" + +#: check.c:1683 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "'pg_' で始まるロールをチェックしています" -#: check.c:1649 +#: check.c:1714 #, c-format msgid "" "Your installation contains roles starting with \"pg_\".\n" @@ -580,12 +605,12 @@ msgstr "" "\"pg_\"で始まるロールの一覧は以下のファイルにあります:\n" " %s" -#: check.c:1703 +#: check.c:1734 #, c-format msgid "Checking for user-defined encoding conversions" msgstr "ユーザー定義のエンコーディング変換を確認しています" -#: check.c:1732 +#: check.c:1794 #, c-format msgid "" "Your installation contains user-defined encoding conversions.\n" @@ -603,52 +628,52 @@ msgstr "" "ユーザー定義のエンコーディング変換の一覧は以下のファイルにあります:\n" " %s" -#: check.c:1771 +#: check.c:1833 #, c-format msgid "Checking for new cluster logical replication slots" msgstr "新しいクラスタの論理レプリケーションスロットを確認しています" -#: check.c:1779 +#: check.c:1841 #, c-format msgid "could not count the number of logical replication slots" msgstr "論理レプリケーションスロットの数を数えられませんでした" -#: check.c:1784 +#: check.c:1846 #, c-format msgid "expected 0 logical replication slots but found %d" msgstr "論理レプリケーションスロット数は0であることを期待していましたが、%d個ありました" -#: check.c:1794 check.c:1845 +#: check.c:1856 check.c:1907 #, c-format msgid "could not determine parameter settings on new cluster" msgstr "新クラスタ上のパラメータ設定を決定できませんでした" -#: check.c:1799 +#: check.c:1861 #, c-format msgid "\"wal_level\" must be \"logical\" but is set to \"%s\"" msgstr "\"wal_level\"は\"logical\"でなければなりませんが\"%s\"に設定されています" -#: check.c:1805 +#: check.c:1867 #, 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:1837 +#: check.c:1899 #, c-format msgid "Checking for new cluster configuration for subscriptions" msgstr "新しいクラスタの構成のサブスクリプションを確認しています" -#: check.c:1849 +#: check.c:1911 #, 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:1871 +#: check.c:1933 #, c-format msgid "Checking for valid logical replication slots" msgstr "有効な論理レプリケーションスロットを確認しています" -#: check.c:1923 +#: check.c:1985 #, c-format msgid "" "Your installation contains logical replication slots that cannot be upgraded.\n" @@ -663,12 +688,12 @@ msgstr "" "問題のある列の一覧は、以下のファイルにあります: \n" " %s" -#: check.c:1983 +#: check.c:2009 #, c-format msgid "Checking for subscription state" msgstr "サブスクリプション状態を確認しています" -#: check.c:2065 +#: check.c:2110 #, c-format msgid "" "Your installation contains subscriptions without origin or having relations not in i (initialize) or r (ready) state.\n" @@ -682,184 +707,184 @@ msgstr "" "問題のあるサブスクリプションの一覧は、以下のファイルにあります: \n" " %s" -#: controldata.c:130 controldata.c:200 +#: controldata.c:129 controldata.c:199 #, c-format 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: データベースクラスタの状態異常" -#: controldata.c:159 +#: 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:161 +#: 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:166 +#: controldata.c:165 #, c-format msgid "The source cluster was not shut down cleanly, state reported as: \"%s\"" msgstr "移行元クラスタはクリーンにシャットダウンされていません、状態は以下のように報告されています: \"%s\"" -#: controldata.c:168 +#: controldata.c:167 #, c-format msgid "The target cluster was not shut down cleanly, state reported as: \"%s\"" msgstr "移行先クラスタはクリーンにシャットダウンされていません、状態は以下のように報告されています: \"%s\"" -#: controldata.c:176 controldata.c:508 +#: controldata.c:175 controldata.c:507 #, c-format msgid "could not get control data using %s: %s" msgstr "%s で制御情報が取得できませんでした。: %s" -#: controldata.c:182 +#: controldata.c:181 #, c-format msgid "The source cluster lacks cluster state information:" msgstr "移行元クラスタにクラスタ状態情報がありません:" -#: controldata.c:184 +#: controldata.c:183 #, c-format msgid "The target cluster lacks cluster state information:" msgstr "移行先クラスタにクラスタ状態情報がありません:" -#: controldata.c:214 dump.c:50 exec.c:118 pg_upgrade.c:563 pg_upgrade.c:603 -#: pg_upgrade.c:952 relfilenumber.c:231 server.c:34 util.c:337 +#: 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 "%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" @@ -868,77 +893,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" @@ -983,7 +1008,7 @@ msgstr "%s からpg_ctlのバージョン出力を取得できませんでした msgid "command too long" msgstr "コマンドが長すぎます" -#: exec.c:160 pg_upgrade.c:306 +#: exec.c:160 pg_upgrade.c:311 #, c-format msgid "could not open log file \"%s\": %m" msgstr "ロックファイル\"%s\"をオープンできませんでした: %m" @@ -1018,7 +1043,7 @@ msgid "" "the probable cause of the failure." msgstr "ありうる失敗の原因については、\"%s\"の最後の数行を参照してください。" -#: exec.c:218 pg_upgrade.c:316 +#: exec.c:218 pg_upgrade.c:321 #, c-format msgid "could not write to log file \"%s\": %m" msgstr "ログファイル\"%s\"に書き込めませんでした: %m" @@ -1152,22 +1177,22 @@ msgstr "" "新旧のデータディレクトリ間でハードリンクを作成できませんでした: %m\n" "リンクモードでは、新旧のデータディレクトリが同じファイルシステム上にある必要があります。" -#: function.c:173 +#: function.c:154 #, c-format msgid "Checking for presence of required libraries" msgstr "必要なライブラリの有無を確認しています" -#: function.c:209 +#: function.c:190 #, c-format msgid "could not load library \"%s\": %s" msgstr "ライブラリ\"%s\"をロードできませんでした: %s" -#: function.c:220 +#: function.c:201 #, c-format msgid "In database: %s\n" msgstr "データベース: %s\n" -#: function.c:230 +#: function.c:211 #, c-format msgid "" "Your installation references loadable libraries that are missing from the\n" @@ -1182,47 +1207,47 @@ msgstr "" "以下のファイルに入っています:\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\"" msgstr "データベース\"%2$s\"で OID %1$u のリレーション名が一致しません: 元の名前 \"%3$s.%4$s\"、新しい名前 \"%5$s.%6$s\"" -#: info.c:151 +#: info.c:148 #, c-format msgid "Failed to match up old and new tables in database \"%s\"" msgstr "データベース\"%s\"で新旧のテーブルの照合に失敗しました" -#: info.c:232 +#: info.c:229 #, c-format msgid " which is an index on \"%s.%s\"" msgstr " これは \"%s.%s\" 上のインデックスです" -#: info.c:242 +#: info.c:239 #, c-format msgid " which is an index on OID %u" msgstr " これは OID %u 上のインデックスです" -#: info.c:254 +#: info.c:251 #, c-format msgid " which is the TOAST table for \"%s.%s\"" msgstr " これは \"%s.%s\" の TOAST テーブルです" -#: info.c:262 +#: info.c:259 #, c-format msgid " which is the TOAST table for OID %u" msgstr " これは OID %u の TOAST テーブルです" -#: info.c:266 +#: 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:269 +#: 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:325 +#: info.c:300 #, c-format msgid "" "\n" @@ -1231,7 +1256,7 @@ msgstr "" "\n" "移行元データベース:" -#: info.c:327 +#: info.c:302 #, c-format msgid "" "\n" @@ -1240,27 +1265,27 @@ msgstr "" "\n" "移行先データベース:" -#: info.c:371 +#: info.c:346 #, c-format msgid "template0 not found" msgstr "template0が見つかりません" -#: info.c:815 +#: info.c:805 #, c-format msgid "Database: \"%s\"" msgstr "データベース: \"%s\"" -#: info.c:828 +#: info.c:818 #, c-format msgid "relname: \"%s.%s\", reloid: %u, reltblspace: \"%s\"" msgstr "relname: \"%s.%s\": reloid: %u reltblspace: \"%s\"" -#: info.c:842 +#: info.c:832 #, c-format msgid "Logical replication slots in the database:" msgstr "このデータベースの論理レプリケーションスロット: " -#: info.c:848 +#: info.c:838 #, c-format msgid "slot name: \"%s\", output plugin: \"%s\", two_phase: %s" msgstr "スロット名: \"%s\", 出力プラグイン: \"%s\", two_phase: %s" @@ -1461,7 +1486,9 @@ msgstr " --copy 新クラスタにファイルをコピ #: 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" +msgstr "" +" --copy-file-range ファイルの新クラスタへのコピーをcopy_file_range\n" +" で行う\n" #: option.c:309 #, c-format @@ -1628,12 +1655,12 @@ msgstr "子プロセスが異常終了しました: ステータス %d" msgid "child worker exited abnormally: %m" msgstr "子ワーカーが異常終了しました: %m" -#: pg_upgrade.c:110 +#: pg_upgrade.c:115 #, c-format msgid "could not read permissions of directory \"%s\": %m" msgstr "ディレクトリ\"%s\"の権限を読み取れませんでした: %m" -#: pg_upgrade.c:142 +#: pg_upgrade.c:147 #, c-format msgid "" "\n" @@ -1644,17 +1671,17 @@ msgstr "" "アップグレードを実行しています。\n" "------------------" -#: pg_upgrade.c:187 +#: pg_upgrade.c:192 #, c-format msgid "Setting next OID for new cluster" msgstr "新クラスタの、次の OID を設定しています" -#: pg_upgrade.c:211 +#: pg_upgrade.c:216 #, c-format msgid "Sync data directory to disk" msgstr "データディレクトリをディスクに同期します" -#: pg_upgrade.c:225 +#: pg_upgrade.c:230 #, c-format msgid "" "\n" @@ -1665,23 +1692,23 @@ msgstr "" "アップグレードが完了しました\n" "----------------" -#: pg_upgrade.c:258 pg_upgrade.c:271 pg_upgrade.c:278 pg_upgrade.c:285 -#: pg_upgrade.c:303 pg_upgrade.c:314 +#: 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:292 pg_upgrade.c:294 pg_upgrade.c:296 pg_upgrade.c:298 +#: 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:347 +#: pg_upgrade.c:352 #, c-format msgid "%s: could not find own program executable" msgstr "%s: 自身の実行ファイルが見つかりませんでした" -#: pg_upgrade.c:373 +#: pg_upgrade.c:378 #, c-format msgid "" "There seems to be a postmaster servicing the old cluster.\n" @@ -1690,7 +1717,7 @@ msgstr "" "旧クラスタで稼働中のpostmasterがあるようです。\n" "そのpostmasterをシャットダウンしたのちにやり直してください。" -#: pg_upgrade.c:386 +#: pg_upgrade.c:391 #, c-format msgid "" "There seems to be a postmaster servicing the new cluster.\n" @@ -1699,137 +1726,137 @@ msgstr "" "新クラスタで稼働中のpostmasterがあるようです。\n" "そのpostmasterをシャットダウンしたのちやり直してください。" -#: pg_upgrade.c:408 +#: pg_upgrade.c:413 #, c-format msgid "Setting locale and encoding for new cluster" msgstr "新クラスタの、ロケールとエンコーディングを設定しています" -#: pg_upgrade.c:484 +#: pg_upgrade.c:491 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "新クラスタ内のすべての行を分析しています" -#: pg_upgrade.c:497 +#: pg_upgrade.c:504 #, c-format msgid "Freezing all rows in the new cluster" msgstr "新クラスタ内のすべての行を凍結しています" -#: pg_upgrade.c:517 +#: pg_upgrade.c:524 #, c-format msgid "Restoring global objects in the new cluster" msgstr "新クラスタ内のグローバルオブジェクトを復元しています" -#: pg_upgrade.c:534 +#: pg_upgrade.c:540 #, c-format msgid "Restoring database schemas in the new cluster" msgstr "新クラスタ内にデータベーススキーマを復元しています" -#: pg_upgrade.c:669 +#: pg_upgrade.c:664 #, c-format msgid "Deleting files from new %s" msgstr "新しい %s からファイルを削除しています" -#: pg_upgrade.c:673 +#: pg_upgrade.c:668 #, c-format msgid "could not delete directory \"%s\"" msgstr "ディレクトリ\"%s\"を削除できませんでした" -#: pg_upgrade.c:692 +#: pg_upgrade.c:687 #, c-format msgid "Copying old %s to new server" msgstr "旧の %s を新サーバーにコピーしています" -#: pg_upgrade.c:718 +#: pg_upgrade.c:713 #, c-format msgid "Setting oldest XID for new cluster" msgstr "新クラスタの、最古のXIDを設定しています" -#: pg_upgrade.c:726 +#: pg_upgrade.c:721 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "新クラスタの、次のトランザクションIDと基点を設定しています" -#: pg_upgrade.c:756 +#: pg_upgrade.c:751 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "新クラスタの、次のmultixact IDとオフセットを設定しています" -#: pg_upgrade.c:780 +#: pg_upgrade.c:775 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "新クラスタの最古のmultixact IDを設定しています" -#: pg_upgrade.c:800 +#: pg_upgrade.c:795 #, c-format msgid "Resetting WAL archives" msgstr "WAL アーカイブをリセットしています" -#: pg_upgrade.c:843 +#: pg_upgrade.c:838 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "新クラスタのfrozenxidとminmxidカウンタを設定しています" -#: pg_upgrade.c:845 +#: pg_upgrade.c:840 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "新クラスタのminmxidカウンタを設定しています" -#: pg_upgrade.c:936 +#: pg_upgrade.c:931 #, c-format msgid "Restoring logical replication slots in the new cluster" msgstr "新クラスタ内の論理レプリケーションスロットを復元しています" -#: relfilenumber.c:33 +#: relfilenumber.c:35 #, c-format msgid "Cloning user relation files" msgstr "ユーザーリレーションファイルをクローニングしています" -#: relfilenumber.c:36 +#: relfilenumber.c:38 #, c-format msgid "Copying user relation files" msgstr "ユーザーリレーションのファイルをコピーしています" -#: relfilenumber.c:39 +#: relfilenumber.c:41 #, c-format msgid "Copying user relation files with copy_file_range" msgstr "ユーザーリレーションのファイルをcopy_file_rangeを使ってコピーしています" -#: relfilenumber.c:42 +#: relfilenumber.c:44 #, c-format msgid "Linking user relation files" msgstr "ユーザーリレーションのファイルをリンクしています" -#: relfilenumber.c:116 +#: relfilenumber.c:118 #, c-format msgid "old database \"%s\" not found in the new cluster" msgstr "新クラスタ内に旧データベース\"%s\"が見つかりません" -#: relfilenumber.c:219 +#: relfilenumber.c:221 #, c-format 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:259 +#: relfilenumber.c:261 #, c-format msgid "linking \"%s\" to \"%s\"" msgstr "\"%s\"から\"%s\"へリンクを作成しています" @@ -1995,17 +2022,17 @@ msgstr "" "インデックスを再構築できます。\n" "それまでは、これらのインデックスは使用されません。" -#: version.c:187 +#: version.c:153 #, c-format msgid "Checking for extension updates" msgstr "機能拡張のアップデートを確認しています" -#: version.c:201 +#: version.c:200 #, c-format msgid "notice" msgstr "注意" -#: version.c:202 +#: version.c:201 #, c-format msgid "" "\n" diff --git a/src/bin/pg_upgrade/po/ru.po b/src/bin/pg_upgrade/po/ru.po index 71fa979972e85..95e34c358785f 100644 --- a/src/bin/pg_upgrade/po/ru.po +++ b/src/bin/pg_upgrade/po/ru.po @@ -1,14 +1,14 @@ # 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, 2023, 2024. +# SPDX-FileCopyrightText: 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Alexander Lakhin # 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: 2024-11-02 08:21+0300\n" -"PO-Revision-Date: 2024-11-02 08:31+0300\n" +"POT-Creation-Date: 2025-08-09 07:11+0300\n" +"PO-Revision-Date: 2025-08-09 07:24+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -48,24 +48,24 @@ msgstr "пользователь не существует" msgid "user name lookup failure: error code %lu" msgstr "распознать имя пользователя не удалось (код ошибки: %lu)" -#: ../../fe_utils/string_utils.c:434 +#: ../../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:607 +#: ../../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 +#: check.c:112 msgid "Checking for system-defined composite types in user tables" msgstr "Проверка системных составных типов в пользовательских таблицах" -#: check.c:118 +#: check.c:119 msgid "" "Your installation contains system-defined composite types in user tables.\n" "These type OIDs are not stable across PostgreSQL versions,\n" @@ -79,11 +79,11 @@ msgstr "" "проблемные\n" "столбцы и перезапустить обновление.\n" -#: check.c:132 +#: check.c:133 msgid "Checking for incompatible \"line\" data type" msgstr "Проверка несовместимого типа данных \"line\"" -#: check.c:137 +#: check.c:138 msgid "" "Your installation contains the \"line\" data type in user tables.\n" "This data type changed its internal and input/output format\n" @@ -99,11 +99,11 @@ msgstr "" "можете\n" "удалить проблемные столбцы и перезапустить обновление.\n" -#: check.c:154 +#: check.c:155 msgid "Checking for reg* data types in user tables" msgstr "Проверка типов данных reg* в пользовательских таблицах" -#: check.c:181 +#: check.c:182 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" @@ -115,11 +115,11 @@ msgstr "" "pg_upgrade, так что обновление кластера в текущем состоянии невозможно. Вы\n" "можете удалить проблемные столбцы и перезапустить обновление.\n" -#: check.c:193 +#: check.c:194 msgid "Checking for incompatible \"aclitem\" data type" msgstr "Проверка несовместимого типа данных \"aclitem\"" -#: check.c:198 +#: check.c:199 msgid "" "Your installation contains the \"aclitem\" data type in user tables.\n" "The internal format of \"aclitem\" changed in PostgreSQL version 16\n" @@ -134,11 +134,11 @@ msgstr "" "и\n" "перезапустить обновление.\n" -#: check.c:217 +#: check.c:218 msgid "Checking for invalid \"unknown\" user columns" msgstr "Проверка неправильных пользовательских столбцов типа \"unknown\"" -#: check.c:222 +#: check.c:223 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" @@ -152,12 +152,12 @@ msgstr "" "проблемные\n" "столбцы и перезапустить обновление.\n" -#: check.c:239 +#: check.c:240 msgid "Checking for invalid \"sql_identifier\" user columns" msgstr "" "Проверка неправильных пользовательских столбцов типа \"sql_identifier\"" -#: check.c:244 +#: check.c:245 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" @@ -169,12 +169,12 @@ msgstr "" "поэтому обновить данный кластер невозможно. Вы можете удалить проблемные\n" "столбцы и перезапустить обновление.\n" -#: check.c:255 +#: check.c:256 msgid "Checking for incompatible \"jsonb\" data type in user tables" msgstr "" "Проверка несовместимого типа данных \"jsonb\" в пользовательских таблицах" -#: check.c:260 +#: check.c:261 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" @@ -187,12 +187,12 @@ msgstr "" "и\n" "перезапустить обновление.\n" -#: check.c:272 +#: check.c:273 msgid "Checking for removed \"abstime\" data type in user tables" msgstr "" "Проверка удалённого типа данных \"abstime\" в пользовательских таблицах" -#: check.c:277 +#: check.c:278 msgid "" "Your installation contains the \"abstime\" data type in user tables.\n" "The \"abstime\" type has been removed in PostgreSQL version 12,\n" @@ -208,12 +208,12 @@ msgstr "" "поменять\n" "их тип на другой, а затем перезапустить обновление.\n" -#: check.c:285 +#: check.c:286 msgid "Checking for removed \"reltime\" data type in user tables" msgstr "" "Проверка удалённого типа данных \"reltime\" в пользовательских таблицах" -#: check.c:290 +#: check.c:291 msgid "" "Your installation contains the \"reltime\" data type in user tables.\n" "The \"reltime\" type has been removed in PostgreSQL version 12,\n" @@ -229,12 +229,12 @@ msgstr "" "поменять\n" "их тип на другой, а затем перезапустить обновление.\n" -#: check.c:298 +#: check.c:299 msgid "Checking for removed \"tinterval\" data type in user tables" msgstr "" "Проверка удалённого типа данных \"tinterval\" в пользовательских таблицах" -#: check.c:303 +#: check.c:304 msgid "" "Your installation contains the \"tinterval\" data type in user tables.\n" "The \"tinterval\" type has been removed in PostgreSQL version 12,\n" @@ -250,34 +250,34 @@ msgstr "" "поменять\n" "их тип на другой, а затем перезапустить обновление.\n" -#: check.c:345 +#: check.c:346 #, c-format msgid "Checking data type usage" msgstr "Проверка использования типов данных" -#: check.c:480 +#: check.c:481 #, c-format msgid "failed check: %s" msgstr "не пройдена проверка: %s" -#: check.c:483 +#: check.c:484 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 +#: check.c:496 check.c:971 check.c:1144 check.c:1259 check.c:1353 check.c:1481 +#: check.c:1557 check.c:1634 check.c:1700 check.c:1773 check.c:1952 +#: check.c:1971 check.c:2040 check.c:2092 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 +#: check.c:523 #, c-format msgid "Data type checks failed: %s" msgstr "Проверки типов данных не пройдены: %s" -#: check.c:563 +#: check.c:564 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -286,7 +286,7 @@ msgstr "" "Проверка целостности на старом работающем сервере\n" "-------------------------------------------------" -#: check.c:569 +#: check.c:570 #, c-format msgid "" "Performing Consistency Checks\n" @@ -295,7 +295,7 @@ msgstr "" "Проведение проверок целостности\n" "-------------------------------" -#: check.c:718 +#: check.c:726 #, c-format msgid "" "\n" @@ -304,7 +304,7 @@ msgstr "" "\n" "*Кластеры совместимы*" -#: check.c:726 +#: check.c:734 #, c-format msgid "" "\n" @@ -316,7 +316,7 @@ msgstr "" "initdb\n" "для нового кластера, чтобы продолжить." -#: check.c:767 +#: check.c:775 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" @@ -327,7 +327,7 @@ msgstr "" "Запустив новый сервер, имеет смысл выполнить:\n" " %s/vacuumdb %s--all --analyze-in-stages" -#: check.c:773 +#: check.c:781 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -336,7 +336,7 @@ msgstr "" "При запуске этого скрипта будут удалены файлы данных старого кластера:\n" " %s" -#: check.c:778 +#: check.c:786 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -349,24 +349,24 @@ msgstr "" "пространства или каталог данных нового кластера.\n" "Содержимое старого кластера нужно будет удалить вручную." -#: check.c:790 +#: check.c:798 #, c-format msgid "Checking cluster versions" msgstr "Проверка версий кластеров" -#: check.c:802 +#: check.c:810 #, c-format msgid "This utility can only upgrade from PostgreSQL version %s and later." msgstr "" "Эта утилита может производить обновление только с версии PostgreSQL %s и " "новее." -#: check.c:807 +#: check.c:815 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s." msgstr "Эта утилита может повышать версию PostgreSQL только до %s." -#: check.c:816 +#: check.c:824 #, c-format msgid "" "This utility cannot be used to downgrade to older major PostgreSQL versions." @@ -374,7 +374,7 @@ msgstr "" "Эта утилита не может понижать версию до более старой основной версии " "PostgreSQL." -#: check.c:821 +#: check.c:829 #, c-format msgid "" "Old cluster data and binary directories are from different major versions." @@ -382,7 +382,7 @@ msgstr "" "Каталоги данных и исполняемых файлов старого кластера относятся к разным " "основным версиям." -#: check.c:824 +#: check.c:832 #, c-format msgid "" "New cluster data and binary directories are from different major versions." @@ -390,7 +390,7 @@ msgstr "" "Каталоги данных и исполняемых файлов нового кластера относятся к разным " "основным версиям." -#: check.c:839 +#: check.c:847 #, c-format msgid "" "When checking a live server, the old and new port numbers must be different." @@ -398,24 +398,24 @@ msgstr "" "Для проверки работающего сервера новый номер порта должен отличаться от " "старого." -#: check.c:859 +#: check.c:867 #, c-format msgid "New cluster database \"%s\" is not empty: found relation \"%s.%s\"" msgstr "" "Новая база данных кластера \"%s\" не пустая: найдено отношение \"%s.%s\"" -#: check.c:882 +#: check.c:890 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "Проверка каталогов табличных пространств в новом кластере" -#: check.c:893 +#: check.c:901 #, c-format msgid "new cluster tablespace directory already exists: \"%s\"" msgstr "" "каталог табличного пространства в новом кластере уже существует: \"%s\"" -#: check.c:926 +#: check.c:934 #, c-format msgid "" "\n" @@ -426,7 +426,7 @@ msgstr "" "ПРЕДУПРЕЖДЕНИЕ: новый каталог данных не должен располагаться внутри старого " "каталога данных, то есть, в %s" -#: check.c:950 +#: check.c:958 #, c-format msgid "" "\n" @@ -437,42 +437,42 @@ msgstr "" "ПРЕДУПРЕЖДЕНИЕ: пользовательские табличные пространства не должны " "располагаться внутри каталога данных, то есть, в %s" -#: check.c:960 +#: check.c:968 #, c-format msgid "Creating script to delete old cluster" msgstr "Создание скрипта для удаления старого кластера" -#: check.c:1014 +#: check.c:1022 #, c-format msgid "could not add execute permission to file \"%s\": %m" msgstr "не удалось добавить право выполнения для файла \"%s\": %m" -#: check.c:1034 +#: check.c:1042 #, c-format msgid "Checking database user is the install user" msgstr "Проверка, является ли пользователь БД стартовым пользователем" -#: check.c:1050 +#: check.c:1058 #, c-format msgid "database user \"%s\" is not the install user" msgstr "пользователь БД \"%s\" не является стартовым пользователем" -#: check.c:1061 +#: check.c:1069 #, c-format msgid "could not determine the number of users" msgstr "не удалось определить количество пользователей" -#: check.c:1069 +#: check.c:1077 #, c-format msgid "Only the install user can be defined in the new cluster." msgstr "В новом кластере может быть определён только стартовый пользователь." -#: check.c:1098 +#: check.c:1106 #, c-format msgid "Checking database connection settings" msgstr "Проверка параметров подключения к базе данных" -#: check.c:1124 +#: check.c:1132 #, c-format msgid "" "template0 must not allow connections, i.e. its pg_database.datallowconn must " @@ -481,13 +481,14 @@ 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 +#: check.c:1158 check.c:1278 check.c:1375 check.c:1500 check.c:1576 +#: check.c:1654 check.c:1713 check.c:1793 check.c:1984 check.c:2109 +#: function.c:210 #, c-format msgid "fatal" msgstr "сбой" -#: check.c:1151 +#: check.c:1159 #, c-format msgid "" "All non-template0 databases must allow connections, i.e. their\n" @@ -506,27 +507,27 @@ msgstr "" "с этой проблемой содержится в файле:\n" " %s" -#: check.c:1176 +#: check.c:1184 #, c-format msgid "Checking for prepared transactions" msgstr "Проверка наличия подготовленных транзакций" -#: check.c:1185 +#: check.c:1193 #, c-format msgid "The source cluster contains prepared transactions" msgstr "Исходный кластер содержит подготовленные транзакции" -#: check.c:1187 +#: check.c:1195 #, c-format msgid "The target cluster contains prepared transactions" msgstr "Целевой кластер содержит подготовленные транзакции" -#: check.c:1212 +#: check.c:1220 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "Проверка несоответствия при передаче bigint в contrib/isn" -#: check.c:1271 +#: check.c:1279 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -548,12 +549,12 @@ msgstr "" "проблемных функций приведён в файле:\n" " %s" -#: check.c:1293 +#: check.c:1301 #, c-format msgid "Checking for user-defined postfix operators" msgstr "Проверка пользовательских постфиксных операторов" -#: check.c:1368 +#: check.c:1376 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" @@ -569,12 +570,12 @@ msgstr "" "Список пользовательских постфиксных операторов приведён в файле:\n" " %s" -#: check.c:1392 +#: check.c:1400 #, c-format msgid "Checking for incompatible polymorphic functions" msgstr "Проверка несовместимых полиморфных функций" -#: check.c:1493 +#: check.c:1501 #, c-format msgid "" "Your installation contains user-defined objects that refer to internal\n" @@ -595,12 +596,12 @@ msgstr "" "Список проблемных объектов приведён в файле:\n" " %s" -#: check.c:1517 +#: check.c:1525 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Проверка таблиц со свойством WITH OIDS" -#: check.c:1569 +#: check.c:1577 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -616,12 +617,36 @@ msgstr "" "Список проблемных таблиц приведён в файле:\n" " %s" -#: check.c:1596 +#: check.c:1602 +#, c-format +msgid "Checking for not-null constraint inconsistencies" +msgstr "Проверка несогласованных ограничений NOT NULL" + +#: check.c:1655 +#, c-format +msgid "" +"Your installation contains inconsistent NOT NULL constraints.\n" +"If the parent column(s) are NOT NULL, then the child column must\n" +"also be marked NOT NULL, or the upgrade will fail.\n" +"You can fix this by running\n" +" ALTER TABLE tablename ALTER column SET NOT NULL;\n" +"on each column listed in the file:\n" +" %s" +msgstr "" +"В вашей инсталляции содержатся несогласованные ограничения NOT NULL.\n" +"Если родительские столбцы помечены NOT NULL, пометку NOT NULL должны\n" +"иметь и их дочерние столбцы, иначе обновление невозможно.\n" +"Исправить эту ситуацию можно, выполнив:\n" +" ALTER TABLE имя_таблицы ALTER столбец SET NOT NULL;\n" +"для всех столбцов, перечисленных в файле:\n" +" %s" + +#: check.c:1683 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "Проверка ролей с именами, начинающимися с \"pg_\"" -#: check.c:1627 +#: check.c:1714 #, c-format msgid "" "Your installation contains roles starting with \"pg_\".\n" @@ -636,12 +661,12 @@ msgstr "" "Список ролей с префиксом \"pg_\" приведён в файле:\n" " %s" -#: check.c:1647 +#: check.c:1734 #, c-format msgid "Checking for user-defined encoding conversions" msgstr "Проверка пользовательских перекодировок" -#: check.c:1707 +#: check.c:1794 #, c-format msgid "" "Your installation contains user-defined encoding conversions.\n" @@ -658,32 +683,32 @@ msgstr "" "Список пользовательских перекодировок приведён в файле:\n" " %s" -#: check.c:1746 +#: check.c:1833 #, c-format msgid "Checking for new cluster logical replication slots" msgstr "Проверка слотов логической репликации в новом кластере" -#: check.c:1754 +#: check.c:1841 #, c-format msgid "could not count the number of logical replication slots" msgstr "не удалось получить количество слотов логической репликации" -#: check.c:1759 +#: check.c:1846 #, c-format msgid "expected 0 logical replication slots but found %d" msgstr "обнаружено слотов логической репликации: %d, тогда как ожидалось 0" -#: check.c:1769 check.c:1820 +#: check.c:1856 check.c:1907 #, c-format msgid "could not determine parameter settings on new cluster" msgstr "не удалось получить значения параметров в новом кластере" -#: check.c:1774 +#: check.c:1861 #, c-format msgid "\"wal_level\" must be \"logical\" but is set to \"%s\"" msgstr "\"wal_level\" должен иметь значение \"logical\", а имеет \"%s\"" -#: check.c:1780 +#: check.c:1867 #, c-format msgid "" "\"max_replication_slots\" (%d) must be greater than or equal to the number " @@ -692,12 +717,12 @@ msgstr "" "значение \"max_replication_slots\" (%d) должно быть больше или равно числу " "слотов логической репликации (%d) в старом кластере" -#: check.c:1812 +#: check.c:1899 #, c-format msgid "Checking for new cluster configuration for subscriptions" msgstr "Проверка конфигурации нового кластера для использования подписок" -#: check.c:1824 +#: check.c:1911 #, c-format msgid "" "\"max_replication_slots\" (%d) must be greater than or equal to the number " @@ -706,12 +731,12 @@ msgstr "" "значение \"max_replication_slots\" (%d) должно быть больше или равно числу " "подписок (%d) в старом кластере" -#: check.c:1846 +#: check.c:1933 #, c-format msgid "Checking for valid logical replication slots" msgstr "Проверка корректности слотов логической репликации" -#: check.c:1898 +#: check.c:1985 #, c-format msgid "" "Your installation contains logical replication slots that cannot be " @@ -729,12 +754,12 @@ msgstr "" "Список проблемных слотов приведён в файле:\n" " %s" -#: check.c:1922 +#: check.c:2009 #, c-format msgid "Checking for subscription state" msgstr "Проверка состояния подписок" -#: check.c:2023 +#: check.c:2110 #, c-format msgid "" "Your installation contains subscriptions without origin or having relations " @@ -810,8 +835,8 @@ msgstr "В исходном кластере не хватает информа 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 +#: 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 "%s" msgstr "%s" @@ -1915,80 +1940,80 @@ msgstr "" msgid "Setting locale and encoding for new cluster" msgstr "Установка локали и кодировки для нового кластера" -#: pg_upgrade.c:489 +#: pg_upgrade.c:491 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "Анализ всех строк в новом кластере" -#: pg_upgrade.c:502 +#: pg_upgrade.c:504 #, c-format msgid "Freezing all rows in the new cluster" msgstr "Замораживание всех строк в новом кластере" -#: pg_upgrade.c:522 +#: pg_upgrade.c:524 #, c-format msgid "Restoring global objects in the new cluster" msgstr "Восстановление глобальных объектов в новом кластере" -#: pg_upgrade.c:538 +#: pg_upgrade.c:540 #, c-format msgid "Restoring database schemas in the new cluster" msgstr "Восстановление схем баз данных в новом кластере" -#: pg_upgrade.c:662 +#: pg_upgrade.c:664 #, c-format msgid "Deleting files from new %s" msgstr "Удаление файлов из нового каталога %s" -#: pg_upgrade.c:666 +#: pg_upgrade.c:668 #, c-format msgid "could not delete directory \"%s\"" msgstr "ошибка при удалении каталога \"%s\"" -#: pg_upgrade.c:685 +#: pg_upgrade.c:687 #, c-format msgid "Copying old %s to new server" msgstr "Копирование старого каталога %s на новый сервер" -#: pg_upgrade.c:711 +#: pg_upgrade.c:713 #, c-format msgid "Setting oldest XID for new cluster" msgstr "Установка старейшего OID для нового кластера" -#: pg_upgrade.c:719 +#: pg_upgrade.c:721 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "" "Установка следующего идентификатора транзакции и эпохи для нового кластера" -#: pg_upgrade.c:749 +#: pg_upgrade.c:751 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "" "Установка следующего идентификатора и смещения мультитранзакции для нового " "кластера" -#: pg_upgrade.c:773 +#: pg_upgrade.c:775 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "Установка старейшего идентификатора мультитранзакции в новом кластере" -#: pg_upgrade.c:793 +#: pg_upgrade.c:795 #, c-format msgid "Resetting WAL archives" msgstr "Сброс архивов WAL" -#: pg_upgrade.c:836 +#: pg_upgrade.c:838 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "Установка счётчиков frozenxid и minmxid в новом кластере" -#: pg_upgrade.c:838 +#: pg_upgrade.c:840 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "Установка счётчика minmxid в новом кластере" -#: pg_upgrade.c:929 +#: pg_upgrade.c:931 #, c-format msgid "Restoring logical replication slots in the new cluster" msgstr "Восстановление слотов логической репликации в новом кластере" @@ -2083,7 +2108,7 @@ msgstr "не удалось открыть файл с версией \"%s\": %m msgid "could not parse version file \"%s\"" msgstr "не удалось разобрать файл с версией \"%s\"" -#: server.c:310 +#: server.c:299 #, c-format msgid "" "\n" @@ -2092,7 +2117,7 @@ msgstr "" "\n" "%s" -#: server.c:314 +#: server.c:303 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" @@ -2102,7 +2127,7 @@ msgstr "" "командой:\n" "%s" -#: server.c:318 +#: server.c:307 #, c-format msgid "" "could not connect to target postmaster started with the command:\n" @@ -2112,26 +2137,26 @@ msgstr "" "командой:\n" "%s" -#: server.c:332 +#: server.c:321 #, c-format msgid "pg_ctl failed to start the source server, or connection failed" msgstr "" "программа pg_ctl не смогла запустить исходный сервер, либо к нему не удалось " "подключиться" -#: server.c:334 +#: server.c:323 #, c-format msgid "pg_ctl failed to start the target server, or connection failed" msgstr "" "программа pg_ctl не смогла запустить целевой сервер, либо к нему не удалось " "подключиться" -#: server.c:379 +#: server.c:368 #, c-format msgid "out of memory" msgstr "нехватка памяти" -#: server.c:392 +#: server.c:381 #, c-format msgid "libpq environment variable %s has a non-local server value: %s" msgstr "" diff --git a/src/bin/pg_upgrade/po/sv.po b/src/bin/pg_upgrade/po/sv.po index 51ad41bff555c..309f6bc7965ad 100644 --- a/src/bin/pg_upgrade/po/sv.po +++ b/src/bin/pg_upgrade/po/sv.po @@ -7,8 +7,8 @@ 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:50+0000\n" -"PO-Revision-Date: 2025-02-12 20:38+0100\n" +"POT-Creation-Date: 2025-08-09 05:19+0000\n" +"PO-Revision-Date: 2025-08-09 20:08+0200\n" "Last-Translator: Dennis Björklund \n" "Language-Team: Swedish \n" "Language: sv\n" @@ -47,21 +47,21 @@ msgstr "användaren finns inte" msgid "user name lookup failure: error code %lu" msgstr "misslyckad sökning efter användarnamn: felkod %lu" -#: ../../fe_utils/string_utils.c:608 +#: ../../fe_utils/string_utils.c:587 #, 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 +#: ../../fe_utils/string_utils.c:760 #, 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 +#: check.c:112 msgid "Checking for system-defined composite types in user tables" msgstr "Letar i användartabeller efter systemdefinierade typer av sorten \"composite\"" -#: check.c:118 +#: check.c:119 msgid "" "Your installation contains system-defined composite types in user tables.\n" "These type OIDs are not stable across PostgreSQL versions,\n" @@ -73,11 +73,11 @@ msgstr "" "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 +#: check.c:133 msgid "Checking for incompatible \"line\" data type" msgstr "Letar efter inkompatibel \"line\"-datatyp" -#: check.c:137 +#: check.c:138 msgid "" "Your installation contains the \"line\" data type in user tables.\n" "This data type changed its internal and input/output format\n" @@ -91,11 +91,11 @@ msgstr "" "Du kan radera problemkolumnerna och återstarta uppgraderingen.\n" # FIXME: is this msgid correct? -#: check.c:154 +#: check.c:155 msgid "Checking for reg* data types in user tables" msgstr "Letar efter reg*-datatyper i användartabeller" -#: check.c:181 +#: check.c:182 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" @@ -107,11 +107,11 @@ msgstr "" "så detta kluster kan för närvarande inte uppgraderas. Du kan ta bort\n" "problemkolumnerna och starta om uppgraderingen.\n" -#: check.c:193 +#: check.c:194 msgid "Checking for incompatible \"aclitem\" data type" msgstr "Letar efter inkompatibel datatype \"aclitem\"" -#: check.c:198 +#: check.c:199 msgid "" "Your installation contains the \"aclitem\" data type in user tables.\n" "The internal format of \"aclitem\" changed in PostgreSQL version 16\n" @@ -123,11 +123,11 @@ msgstr "" "kan för närvarande inte uppgraderas. Du kan ta bort problemkolumnerna\n" "och starta om uppgraderingen.\n" -#: check.c:217 +#: check.c:218 msgid "Checking for invalid \"unknown\" user columns" msgstr "Letar efter ogiltiga användarkolumner av typen \"unknown\"" -#: check.c:222 +#: check.c:223 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" @@ -139,11 +139,11 @@ msgstr "" "för närvarande inte uppgraderas. Du kan radera problemkolumnerna och\n" "återstarta uppgraderingen.\n" -#: check.c:239 +#: check.c:240 msgid "Checking for invalid \"sql_identifier\" user columns" msgstr "Letar efter ogiltiga användarkolumner av typen \"sql_identifier\"" -#: check.c:244 +#: check.c:245 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" @@ -155,11 +155,11 @@ msgstr "" "närvarande inte uppgraderas. Du kan radera problemkolumnerna och\n" "återstarta uppgraderingen.\n" -#: check.c:255 +#: check.c:256 msgid "Checking for incompatible \"jsonb\" data type in user tables" msgstr "Letar efter inkompatibel datatyp \"jsonb\"-datatyp i användartabeller" -#: check.c:260 +#: check.c:261 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" @@ -171,11 +171,11 @@ msgstr "" "för närvarande inte uppgraderas. Du kan ta bort problemkolumnerna och\n" "starta om uppgraderingen.\n" -#: check.c:272 +#: check.c:273 msgid "Checking for removed \"abstime\" data type in user tables" msgstr "Letar efter borttagen datatype \"abstime\" i användartabeller" -#: check.c:277 +#: check.c:278 msgid "" "Your installation contains the \"abstime\" data type in user tables.\n" "The \"abstime\" type has been removed in PostgreSQL version 12,\n" @@ -188,11 +188,11 @@ msgstr "" "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 +#: check.c:286 msgid "Checking for removed \"reltime\" data type in user tables" msgstr "Letar efter borttagen datatype \"reltime\" i användartabeller" -#: check.c:290 +#: check.c:291 msgid "" "Your installation contains the \"reltime\" data type in user tables.\n" "The \"reltime\" type has been removed in PostgreSQL version 12,\n" @@ -205,11 +205,11 @@ msgstr "" "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 +#: check.c:299 msgid "Checking for removed \"tinterval\" data type in user tables" msgstr "Letar efter borttagen datatype \"tinterval\" i användartabeller" -#: check.c:303 +#: check.c:304 msgid "" "Your installation contains the \"tinterval\" data type in user tables.\n" "The \"tinterval\" type has been removed in PostgreSQL version 12,\n" @@ -222,34 +222,34 @@ msgstr "" "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 +#: check.c:346 #, c-format msgid "Checking data type usage" msgstr "Letar efter användning av datatyp" -#: check.c:480 +#: check.c:481 #, c-format msgid "failed check: %s" msgstr "misslyckad kontroll: %s" -#: check.c:483 +#: check.c:484 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 +#: check.c:496 check.c:971 check.c:1144 check.c:1259 check.c:1353 check.c:1481 +#: check.c:1557 check.c:1634 check.c:1700 check.c:1773 check.c:1952 +#: check.c:1971 check.c:2040 check.c:2092 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 +#: check.c:523 #, c-format msgid "Data type checks failed: %s" msgstr "Kontroll av datatyper misslyckades: %s" -#: check.c:563 +#: check.c:564 #, c-format msgid "" "Performing Consistency Checks on Old Live Server\n" @@ -258,7 +258,7 @@ msgstr "" "Utför konsistenskontroller på gamla live-servern\n" "------------------------------------------------" -#: check.c:569 +#: check.c:570 #, c-format msgid "" "Performing Consistency Checks\n" @@ -267,7 +267,7 @@ msgstr "" "Utför konsistenskontroller\n" "--------------------------" -#: check.c:718 +#: check.c:726 #, c-format msgid "" "\n" @@ -276,7 +276,7 @@ msgstr "" "\n" "*Klustren är kompatibla*" -#: check.c:726 +#: check.c:734 #, c-format msgid "" "\n" @@ -287,7 +287,7 @@ msgstr "" "Om pg_upgrade misslyckas efter denna punkt så måste du\n" "köra om initdb på nya klustret innan du fortsätter." -#: check.c:767 +#: check.c:775 #, c-format msgid "" "Optimizer statistics are not transferred by pg_upgrade.\n" @@ -298,7 +298,7 @@ msgstr "" "När du startar nya servern så vill du nog köra:\n" " %s/vacuumdb %s--all --analyze-in-stages" -#: check.c:773 +#: check.c:781 #, c-format msgid "" "Running this script will delete the old cluster's data files:\n" @@ -307,7 +307,7 @@ msgstr "" "När detta skript körs så raderas gamla klustrets datafiler:\n" " %s" -#: check.c:778 +#: check.c:786 #, c-format msgid "" "Could not create a script to delete the old cluster's data files\n" @@ -320,57 +320,57 @@ msgstr "" "ligger i gamla klusterkatalogen. Det gamla klustrets innehåll\n" "måste raderas för hand." -#: check.c:790 +#: check.c:798 #, c-format msgid "Checking cluster versions" msgstr "Kontrollerar klustrets versioner" -#: check.c:802 +#: check.c:810 #, c-format 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:807 +#: check.c:815 #, c-format msgid "This utility can only upgrade to PostgreSQL version %s." msgstr "Detta verktyg kan bara uppgradera till PostgreSQL version %s." -#: check.c:816 +#: check.c:824 #, c-format 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:821 +#: check.c:829 #, c-format 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:824 +#: check.c:832 #, c-format 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:839 +#: check.c:847 #, c-format 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:859 +#: check.c:867 #, c-format 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:882 +#: check.c:890 #, c-format msgid "Checking for new cluster tablespace directories" msgstr "Letar efter nya tablespace-kataloger i klustret" -#: check.c:893 +#: check.c:901 #, c-format msgid "new cluster tablespace directory already exists: \"%s\"" msgstr "i klustret finns redan ny tablespace-katalog: \"%s\"" -#: check.c:926 +#: check.c:934 #, c-format msgid "" "\n" @@ -379,7 +379,7 @@ msgstr "" "\n" "VARNING: nya datakatalogen skall inte ligga inuti den gamla datakatalogen, dvs. %s" -#: check.c:950 +#: check.c:958 #, c-format msgid "" "\n" @@ -388,53 +388,54 @@ msgstr "" "\n" "VARNING: användardefinierade tabellutrymmens plats skall inte vara i datakatalogen, dvs. %s" -#: check.c:960 +#: check.c:968 #, c-format msgid "Creating script to delete old cluster" msgstr "Skapar skript för att radera gamla klustret" -#: check.c:1014 +#: check.c:1022 #, c-format 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:1034 +#: check.c:1042 #, c-format msgid "Checking database user is the install user" msgstr "Kontrollerar att databasanvändaren är installationsanvändaren" -#: check.c:1050 +#: check.c:1058 #, c-format msgid "database user \"%s\" is not the install user" msgstr "databasanvändare \"%s\" är inte installationsanvändaren" -#: check.c:1061 +#: check.c:1069 #, c-format msgid "could not determine the number of users" msgstr "kunde inte bestämma antalet användare" -#: check.c:1069 +#: check.c:1077 #, c-format msgid "Only the install user can be defined in the new cluster." msgstr "Bara installationsanvändaren får finnas i nya klustret." -#: check.c:1098 +#: check.c:1106 #, c-format msgid "Checking database connection settings" msgstr "Kontrollerar databasens anslutningsinställningar" -#: check.c:1124 +#: check.c:1132 #, c-format 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: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 +#: check.c:1158 check.c:1278 check.c:1375 check.c:1500 check.c:1576 +#: check.c:1654 check.c:1713 check.c:1793 check.c:1984 check.c:2109 +#: function.c:210 #, c-format msgid "fatal" msgstr "fatalt" -#: check.c:1151 +#: check.c:1159 #, c-format msgid "" "All non-template0 databases must allow connections, i.e. their\n" @@ -453,27 +454,27 @@ msgstr "" "problemdatabaser finns i filen:\n" " %s" -#: check.c:1176 +#: check.c:1184 #, c-format msgid "Checking for prepared transactions" msgstr "Letar efter förberedda transaktioner" -#: check.c:1185 +#: check.c:1193 #, c-format msgid "The source cluster contains prepared transactions" msgstr "Källklustret innehåller förberedda transaktioner" -#: check.c:1187 +#: check.c:1195 #, c-format msgid "The target cluster contains prepared transactions" msgstr "Målklustret innehåller förberedda transaktioner" -#: check.c:1212 +#: check.c:1220 #, c-format msgid "Checking for contrib/isn with bigint-passing mismatch" msgstr "Letar efter contrib/isn med bigint-anropsfel" -#: check.c:1271 +#: check.c:1279 #, c-format msgid "" "Your installation contains \"contrib/isn\" functions which rely on the\n" @@ -492,12 +493,12 @@ msgstr "" "En lista med problemfunktionerna finns i filen:\n" " %s" -#: check.c:1293 +#: check.c:1301 #, c-format msgid "Checking for user-defined postfix operators" msgstr "Letar efter användardefinierade postfix-operatorer" -#: check.c:1368 +#: check.c:1376 #, c-format msgid "" "Your installation contains user-defined postfix operators, which are not\n" @@ -512,12 +513,12 @@ msgstr "" "En lista med användardefinierade postfix-operatorer finns i filen:\n" " %s" -#: check.c:1392 +#: check.c:1400 #, c-format msgid "Checking for incompatible polymorphic functions" msgstr "Letar efter inkompatibla polymorfa funktioner" -#: check.c:1493 +#: check.c:1501 #, c-format msgid "" "Your installation contains user-defined objects that refer to internal\n" @@ -538,12 +539,12 @@ msgstr "" "En lista med problemobjekten finns i filen:\n" " %s" -#: check.c:1517 +#: check.c:1525 #, c-format msgid "Checking for tables WITH OIDS" msgstr "Letar efter tabeller med WITH OIDS" -#: check.c:1569 +#: check.c:1577 #, c-format msgid "" "Your installation contains tables declared WITH OIDS, which is not\n" @@ -558,12 +559,36 @@ msgstr "" "En lista över tabeller med detta problem finns i filen:\n" " %s" -#: check.c:1596 +#: check.c:1602 +#, c-format +msgid "Checking for not-null constraint inconsistencies" +msgstr "Kontrollerar att icke-null-villkor är konsistenta" + +#: check.c:1655 +#, c-format +msgid "" +"Your installation contains inconsistent NOT NULL constraints.\n" +"If the parent column(s) are NOT NULL, then the child column must\n" +"also be marked NOT NULL, or the upgrade will fail.\n" +"You can fix this by running\n" +" ALTER TABLE tablename ALTER column SET NOT NULL;\n" +"on each column listed in the file:\n" +" %s" +msgstr "" +"Din installation har inkonsistenta NOT NULL-villkor.\n" +"Om en föräldrakolumn är NOT NULL så måste barnkolumnen också\n" +"sättas till NOT NULL annars så kommer uppgraderingen misslyckas.\n" +"Du kan lösa detta genom att köra\n" +" ALTER TABLE tablename ALTER column SET NOT NULL;\n" +"för varje kolumn som listas i filen:\n" +" %s" + +#: check.c:1683 #, c-format msgid "Checking for roles starting with \"pg_\"" msgstr "Letar efter roller som startar med \"pg_\"" -#: check.c:1627 +#: check.c:1714 #, c-format msgid "" "Your installation contains roles starting with \"pg_\".\n" @@ -578,12 +603,12 @@ msgstr "" "En lista med rollerna som startar på \"pg_\" finns i denna fil:\n" " %s" -#: check.c:1647 +#: check.c:1734 #, c-format msgid "Checking for user-defined encoding conversions" msgstr "Letar efter användardefinierade teckenkodkonverteringar" -#: check.c:1707 +#: check.c:1794 #, c-format msgid "" "Your installation contains user-defined encoding conversions.\n" @@ -600,52 +625,52 @@ msgstr "" "En lista med användardefinierade teckenkodkonverteringar finns i filen:\n" " %s" -#: check.c:1746 +#: check.c:1833 #, c-format msgid "Checking for new cluster logical replication slots" msgstr "Letar efter replikeringsslottar i nya klustret" -#: check.c:1754 +#: check.c:1841 #, c-format msgid "could not count the number of logical replication slots" msgstr "kunde inte räkna antalet logiska replikeringsslottar" -#: check.c:1759 +#: check.c:1846 #, c-format msgid "expected 0 logical replication slots but found %d" msgstr "förväntade 0 logiska replikeringsslottar men hittade %d." -#: check.c:1769 check.c:1820 +#: check.c:1856 check.c:1907 #, c-format msgid "could not determine parameter settings on new cluster" msgstr "kunde inte plocka fram inställningar i det nya klustret" -#: check.c:1774 +#: check.c:1861 #, c-format 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:1780 +#: check.c:1867 #, 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) måste vara större än eller lika med antalet logiska replikeringsslottar (%d) i gamla klustret" -#: check.c:1812 +#: check.c:1899 #, c-format msgid "Checking for new cluster configuration for subscriptions" msgstr "Letar efter konfiguration för prenumerationer i nya klustret" -#: check.c:1824 +#: check.c:1911 #, 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) måste vara större än eller lika med antaler prenumerationer (%d) i gamla klustret" +msgstr "\"max_replication_slots\" (%d) måste vara större än eller lika med antalet prenumerationer (%d) i gamla klustret" -#: check.c:1846 +#: check.c:1933 #, c-format msgid "Checking for valid logical replication slots" msgstr "Letar efter giltiga logiska replikeringsslottar" -#: check.c:1898 +#: check.c:1985 #, c-format msgid "" "Your installation contains logical replication slots that cannot be upgraded.\n" @@ -660,12 +685,12 @@ msgstr "" "En lista med problemkolumner finns i filen:\n" " %s" -#: check.c:1922 +#: check.c:2009 #, c-format msgid "Checking for subscription state" msgstr "Kontrollerar läget för prenumerationer" -#: check.c:2023 +#: check.c:2110 #, c-format msgid "" "Your installation contains subscriptions without origin or having relations not in i (initialize) or r (ready) state.\n" @@ -725,8 +750,8 @@ msgstr "Källklustret saknar information om kluster-state:" msgid "The target cluster lacks cluster state information:" msgstr "Målklustret saknar information om kluster-state:" -#: 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 +#: 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 "%s" msgstr "%s" @@ -1446,7 +1471,7 @@ msgstr " -V, --version visa versionsinformation, avsluta sedan\ #: 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" +msgstr " --clone klona istället för att kopiera filer till nya klustret\n" #: option.c:307 #, c-format @@ -1697,77 +1722,77 @@ msgstr "" msgid "Setting locale and encoding for new cluster" msgstr "Sätter lokal och teckenkodning för nya klustret" -#: pg_upgrade.c:489 +#: pg_upgrade.c:491 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "Analyserar alla rader i nya klustret" -#: pg_upgrade.c:502 +#: pg_upgrade.c:504 #, c-format msgid "Freezing all rows in the new cluster" msgstr "Fryser alla rader i nya klustret" -#: pg_upgrade.c:522 +#: pg_upgrade.c:524 #, c-format msgid "Restoring global objects in the new cluster" msgstr "Återställer globala objekt i nya klustret" -#: pg_upgrade.c:538 +#: pg_upgrade.c:540 #, c-format msgid "Restoring database schemas in the new cluster" msgstr "Återställer databasscheman i nya klustret" -#: pg_upgrade.c:662 +#: pg_upgrade.c:664 #, c-format msgid "Deleting files from new %s" msgstr "Raderar filer från ny %s" -#: pg_upgrade.c:666 +#: pg_upgrade.c:668 #, c-format msgid "could not delete directory \"%s\"" msgstr "kunde inte ta bort katalog \"%s\"" -#: pg_upgrade.c:685 +#: pg_upgrade.c:687 #, c-format msgid "Copying old %s to new server" msgstr "Kopierar gammal %s till ny server" -#: pg_upgrade.c:711 +#: pg_upgrade.c:713 #, c-format msgid "Setting oldest XID for new cluster" msgstr "Sätter äldsta XID för nya klustret" -#: pg_upgrade.c:719 +#: pg_upgrade.c:721 #, 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:749 +#: pg_upgrade.c:751 #, 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:773 +#: pg_upgrade.c:775 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "Sätter äldsta multixact-ID i nytt kluster" -#: pg_upgrade.c:793 +#: pg_upgrade.c:795 #, c-format msgid "Resetting WAL archives" msgstr "Resettar WAL-arkiv" -#: pg_upgrade.c:836 +#: pg_upgrade.c:838 #, 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:838 +#: pg_upgrade.c:840 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "Sätter räknarenm minmxid för nytt kluster" -#: pg_upgrade.c:929 +#: pg_upgrade.c:931 #, c-format msgid "Restoring logical replication slots in the new cluster" msgstr "Återställer logiska replikeringsslottar i nya klustret" @@ -1858,7 +1883,7 @@ msgstr "kunde inte öppna versionsfil \"%s\": %m" msgid "could not parse version file \"%s\"" msgstr "kunde inte tolka versionsfil \"%s\"" -#: server.c:310 +#: server.c:299 #, c-format msgid "" "\n" @@ -1867,7 +1892,7 @@ msgstr "" "\n" "%s" -#: server.c:314 +#: server.c:303 #, c-format msgid "" "could not connect to source postmaster started with the command:\n" @@ -1876,7 +1901,7 @@ msgstr "" "kunde inte ansluta till käll-postmaster som startats med kommandot:\n" "%s" -#: server.c:318 +#: server.c:307 #, c-format msgid "" "could not connect to target postmaster started with the command:\n" @@ -1885,22 +1910,22 @@ msgstr "" "kunde inte ansluta till mål-postmaster som startats med kommandot:\n" "%s" -#: server.c:332 +#: server.c:321 #, c-format 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:334 +#: server.c:323 #, c-format 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:379 +#: server.c:368 #, c-format msgid "out of memory" msgstr "slut på minne" -#: server.c:392 +#: server.c:381 #, c-format msgid "libpq environment variable %s has a non-local server value: %s" msgstr "libpq:s omgivningsvariabel %s har ett icke-lokalt servervärde: %s" diff --git a/src/bin/pg_upgrade/po/uk.po b/src/bin/pg_upgrade/po/uk.po index 4a0ec9a1eda8c..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: 2024-08-31 06:20+0000\n" -"PO-Revision-Date: 2024-09-23 19:38\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" @@ -47,12 +47,12 @@ msgstr "користувача не існує" msgid "user name lookup failure: error code %lu" msgstr "невдала підстановка імені користувача: код помилки %lu" -#: ../../fe_utils/string_utils.c:434 +#: ../../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:607 +#: ../../fe_utils/string_utils.c:760 #, c-format msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "назва бази даних містить символ нового рядка або повернення каретки: \"%s\"\n" @@ -208,8 +208,8 @@ msgstr "Перевірка використання типів даних" #: check.c:480 #, c-format -msgid " failed check: %s" -msgstr " помилка перевірки: %s" +msgid "failed check: %s" +msgstr "помилка перевірки: %s" #: check.c:483 msgid "A list of the problem columns is in the file:" @@ -657,8 +657,8 @@ msgstr "В початковому кластері відсутня інформ 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 +#: 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" @@ -1573,82 +1573,82 @@ msgid "There seems to be a postmaster servicing the new cluster.\n" msgstr "Мабуть, запущений процес postmaster, який обслуговує новий кластер.\n" "Будь ласка, завершіть роботу процесу і спробуйте знову." -#: pg_upgrade.c:413 +#: pg_upgrade.c:414 #, c-format msgid "Setting locale and encoding for new cluster" msgstr "Установка локалі та кодування для нового кластеру" -#: pg_upgrade.c:489 +#: pg_upgrade.c:488 #, c-format msgid "Analyzing all rows in the new cluster" msgstr "Аналіз всіх рядків у новому кластері" -#: pg_upgrade.c:502 +#: pg_upgrade.c:501 #, c-format msgid "Freezing all rows in the new cluster" msgstr "Закріплення всіх рядків у новому кластері" -#: pg_upgrade.c:522 +#: pg_upgrade.c:521 #, c-format msgid "Restoring global objects in the new cluster" msgstr "Відновлення глобальних об'єктів у новому кластері" -#: pg_upgrade.c:538 +#: pg_upgrade.c:537 #, c-format msgid "Restoring database schemas in the new cluster" msgstr "Відновлення схем баз даних у новому кластері" -#: pg_upgrade.c:662 +#: pg_upgrade.c:661 #, c-format msgid "Deleting files from new %s" msgstr "Видалення файлів з нового %s" -#: pg_upgrade.c:666 +#: pg_upgrade.c:665 #, c-format msgid "could not delete directory \"%s\"" msgstr "не вдалося видалити каталог \"%s\"" -#: pg_upgrade.c:685 +#: pg_upgrade.c:684 #, c-format msgid "Copying old %s to new server" msgstr "Копіювання старого %s до нового серверу" -#: pg_upgrade.c:711 +#: pg_upgrade.c:710 #, c-format msgid "Setting oldest XID for new cluster" msgstr "Встановлення найстарішого XID для нового кластеру" -#: pg_upgrade.c:719 +#: pg_upgrade.c:718 #, c-format msgid "Setting next transaction ID and epoch for new cluster" msgstr "Установка наступного ID транзакції й епохи для нового кластера" -#: pg_upgrade.c:749 +#: pg_upgrade.c:748 #, c-format msgid "Setting next multixact ID and offset for new cluster" msgstr "Установка наступного ID і зсуву мультитранзакції для нового кластера" -#: pg_upgrade.c:773 +#: pg_upgrade.c:772 #, c-format msgid "Setting oldest multixact ID in new cluster" msgstr "Установка найстаршого ID мультитранзакції в новому кластері" -#: pg_upgrade.c:793 +#: pg_upgrade.c:792 #, c-format msgid "Resetting WAL archives" msgstr "Скидання архівів WAL" -#: pg_upgrade.c:836 +#: pg_upgrade.c:835 #, c-format msgid "Setting frozenxid and minmxid counters in new cluster" msgstr "Установка лічильників frozenxid і minmxid у новому кластері" -#: pg_upgrade.c:838 +#: pg_upgrade.c:837 #, c-format msgid "Setting minmxid counter in new cluster" msgstr "Установка лічильника minmxid у новому кластері" -#: pg_upgrade.c:929 +#: pg_upgrade.c:928 #, c-format msgid "Restoring logical replication slots in the new cluster" msgstr "Відновлення слотів логічної реплікації в новому кластері" @@ -1701,7 +1701,7 @@ msgstr "копіювання \"%s\" в \"%s\"" #: relfilenumber.c:256 #, c-format msgid "copying \"%s\" to \"%s\" with copy_file_range" -msgstr "" +msgstr "копіювання \"%s\" в \"%s\" з copy_file_range" #: relfilenumber.c:261 #, c-format @@ -1793,7 +1793,7 @@ msgstr "каталог табличного простору \"%s\" не існ #: tablespace.c:87 #, c-format msgid "could not stat tablespace directory \"%s\": %m" -msgstr "" +msgstr "не вдалося отримати стан каталогу табличного простору \"%s\": %m" #: tablespace.c:92 #, c-format diff --git a/src/bin/pg_upgrade/server.c b/src/bin/pg_upgrade/server.c index 91bcb4dbc7e69..b223d5afddfff 100644 --- a/src/bin/pg_upgrade/server.c +++ b/src/bin/pg_upgrade/server.c @@ -241,17 +241,6 @@ start_postmaster(ClusterInfo *cluster, bool report_and_exit_on_error) 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). diff --git a/src/bin/pg_upgrade/t/002_pg_upgrade.pl b/src/bin/pg_upgrade/t/002_pg_upgrade.pl index 0431a7a977c42..af8933234f8de 100644 --- a/src/bin/pg_upgrade/t/002_pg_upgrade.pl +++ b/src/bin/pg_upgrade/t/002_pg_upgrade.pl @@ -15,10 +15,8 @@ use PostgreSQL::Test::AdjustUpgrade; use Test::More; -if (defined($ENV{TDE_MODE})) -{ - plan skip_all => "Running with TDE doesn't support special server starts yet"; -} +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_smgr + 'pg_restore fail to restore _pg_tde schema on cluster which already has it'; # Can be changed to test the other modes. my $mode = $ENV{PG_TEST_PG_UPGRADE_MODE} || '--copy'; @@ -320,6 +318,7 @@ sub filter_dump # that we need to use pg_dumpall from the new node here. my @dump_command = ( 'pg_dumpall', '--no-sync', '-d', $oldnode->connstr('postgres'), + '--restrict-key=test', '-f', $dump1_file); # --extra-float-digits is needed when upgrading from a version older than 11. push(@dump_command, '--extra-float-digits', '0') @@ -505,6 +504,7 @@ sub filter_dump # Second dump from the upgraded instance. @dump_command = ( 'pg_dumpall', '--no-sync', '-d', $newnode->connstr('postgres'), + '--restrict-key=test', '-f', $dump2_file); # --extra-float-digits is needed when upgrading from a version older than 11. push(@dump_command, '--extra-float-digits', '0') diff --git a/src/bin/pg_upgrade/t/003_logical_slots.pl b/src/bin/pg_upgrade/t/003_logical_slots.pl index 0a2483d3dfcde..97692f4ff99fb 100644 --- a/src/bin/pg_upgrade/t/003_logical_slots.pl +++ b/src/bin/pg_upgrade/t/003_logical_slots.pl @@ -11,6 +11,9 @@ use PostgreSQL::Test::Utils; use Test::More; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_smgr + 'pg_restore fail to restore _pg_tde schema on cluster which already has it'; + # Can be changed to test the other modes my $mode = $ENV{PG_TEST_PG_UPGRADE_MODE} || '--copy'; diff --git a/src/bin/pg_upgrade/t/004_subscription.pl b/src/bin/pg_upgrade/t/004_subscription.pl index c59b83af9cc10..1dbdedefb93d4 100644 --- a/src/bin/pg_upgrade/t/004_subscription.pl +++ b/src/bin/pg_upgrade/t/004_subscription.pl @@ -12,6 +12,9 @@ use PostgreSQL::Test::Utils; use Test::More; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_smgr + 'pg_restore fail to restore _pg_tde schema on cluster which already has it'; + # Can be changed to test the other modes. my $mode = $ENV{PG_TEST_PG_UPGRADE_MODE} || '--copy'; diff --git a/src/bin/pg_verifybackup/po/ja.po b/src/bin/pg_verifybackup/po/ja.po index 755ebf67d6d8a..fa5938d1274bf 100644 --- a/src/bin/pg_verifybackup/po/ja.po +++ b/src/bin/pg_verifybackup/po/ja.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: pg_verifybackup (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-10-03 09:19+0900\n" -"PO-Revision-Date: 2024-10-03 10:37+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" @@ -17,22 +17,22 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "X-Generator: Poedit 1.8.13\n" -#: ../../../src/common/logging.c:278 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:285 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "警告: " -#: ../../../src/common/logging.c:296 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "詳細: " -#: ../../../src/common/logging.c:303 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "ヒント: " @@ -42,8 +42,8 @@ msgstr "ヒント: " msgid "could not open file \"%s\" for reading: %m" msgstr "ファイル\"%s\"を読み込み用にオープンできませんでした: %m" -#: ../../common/controldata_utils.c:110 pg_verifybackup.c:439 -#: pg_verifybackup.c:477 pg_verifybackup.c:1024 pg_verifybackup.c:1143 +#: ../../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" @@ -54,7 +54,7 @@ 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:1029 pg_verifybackup.c:1149 +#: pg_verifybackup.c:902 #, c-format msgid "could not close file \"%s\": %m" msgstr "ファイル\"%s\"をクローズできませんでした: %m" @@ -76,8 +76,8 @@ msgstr "" "されるものと一致しないようです。この場合以下の結果は不正確になります。また、\n" "PostgreSQLインストレーションはこのデータディレクトリと互換性がなくなります。" -#: ../../common/controldata_utils.c:230 pg_verifybackup.c:407 -#: pg_verifybackup.c:1004 pg_verifybackup.c:1112 +#: ../../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" @@ -93,8 +93,7 @@ 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 +#: ../../common/parse_manifest.c:157 ../../common/parse_manifest.c:852 #, c-format msgid "out of memory" msgstr "メモリ不足です" @@ -123,434 +122,405 @@ msgstr "メモリ不足です\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "null ポインタを複製できません (内部エラー)\n" -#: ../../common/jsonapi.c:2342 +#: ../../common/jsonapi.c:2121 msgid "Recursive descent parser cannot use incremental lexer." msgstr "再帰降下パーサーは差分字句解析器を使用できません。" -#: ../../common/jsonapi.c:2344 +#: ../../common/jsonapi.c:2123 msgid "Incremental parser requires incremental lexer." msgstr "差分パーサーは差分字句解析器を必要とします。" -#: ../../common/jsonapi.c:2346 +#: ../../common/jsonapi.c:2125 msgid "JSON nested too deep, maximum permitted depth is 6400." msgstr "JSONのネストが深すぎます、可能な最大の深さは6400です。" -#: ../../common/jsonapi.c:2348 +#: ../../common/jsonapi.c:2127 #, c-format msgid "Escape sequence \"\\%.*s\" is invalid." msgstr "エスケープシーケンス\"\\%.*s\"は不正です。" -#: ../../common/jsonapi.c:2352 +#: ../../common/jsonapi.c:2131 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "0x%02x値を持つ文字はエスケープしなければなりません" -#: ../../common/jsonapi.c:2356 +#: ../../common/jsonapi.c:2135 #, c-format msgid "Expected end of input, but found \"%.*s\"." msgstr "入力の終端を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2359 +#: ../../common/jsonapi.c:2138 #, c-format msgid "Expected array element or \"]\", but found \"%.*s\"." msgstr "配列要素または\"]\"を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2362 +#: ../../common/jsonapi.c:2141 #, c-format msgid "Expected \",\" or \"]\", but found \"%.*s\"." msgstr "\",\"または\"]\"を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2365 +#: ../../common/jsonapi.c:2144 #, c-format msgid "Expected \":\", but found \"%.*s\"." msgstr "\":\"を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2368 +#: ../../common/jsonapi.c:2147 #, c-format msgid "Expected JSON value, but found \"%.*s\"." msgstr "JSON値を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2371 +#: ../../common/jsonapi.c:2150 msgid "The input string ended unexpectedly." msgstr "入力文字列が予期せず終了しました。" -#: ../../common/jsonapi.c:2373 +#: ../../common/jsonapi.c:2152 #, c-format msgid "Expected string or \"}\", but found \"%.*s\"." msgstr "文字列または\"}\"を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2376 +#: ../../common/jsonapi.c:2155 #, c-format msgid "Expected \",\" or \"}\", but found \"%.*s\"." msgstr "\",\"または\"}\"を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2379 +#: ../../common/jsonapi.c:2158 #, c-format msgid "Expected string, but found \"%.*s\"." msgstr "文字列を想定していましたが、\"\\%.*s\"でした。" -#: ../../common/jsonapi.c:2382 +#: ../../common/jsonapi.c:2161 #, c-format msgid "Token \"%.*s\" is invalid." msgstr "トークン\"\\%.*s\"は不正です。" -#: ../../common/jsonapi.c:2388 +#: ../../common/jsonapi.c:2164 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 はテキストに変換できません。" -#: ../../common/jsonapi.c:2390 +#: ../../common/jsonapi.c:2166 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "\"\\u\"の後には16進数の4桁が続かなければなりません。" -#: ../../common/jsonapi.c:2393 +#: ../../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:2402 +#: ../../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:2409 +#: ../../common/jsonapi.c:2185 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "Unicodeのハイサロゲートはハイサロゲートに続いてはいけません。" -#: ../../common/jsonapi.c:2411 +#: ../../common/jsonapi.c:2187 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 +#: ../../common/parse_manifest.c:159 ../../common/parse_manifest.c:854 #, c-format msgid "could not initialize checksum of manifest" msgstr "目録のチェックサムの初期化ができませんでした" -#: ../../common/parse_manifest.c:204 ../../common/parse_manifest.c:261 +#: ../../common/parse_manifest.c:203 ../../common/parse_manifest.c:260 msgid "manifest ended unexpectedly" msgstr "目録が予期せず終了しました。" -#: ../../common/parse_manifest.c:210 ../../common/parse_manifest.c:862 +#: ../../common/parse_manifest.c:209 ../../common/parse_manifest.c:861 #, c-format msgid "could not update checksum of manifest" msgstr "目録のチェックサムの更新ができませんでした" -#: ../../common/parse_manifest.c:302 +#: ../../common/parse_manifest.c:301 msgid "unexpected object start" msgstr "予期しないオブジェクトの開始" -#: ../../common/parse_manifest.c:337 +#: ../../common/parse_manifest.c:336 msgid "unexpected object end" msgstr "予期しないオブジェクトの終わり" -#: ../../common/parse_manifest.c:366 +#: ../../common/parse_manifest.c:365 msgid "unexpected array start" msgstr "予期しない配列の開始" -#: ../../common/parse_manifest.c:391 +#: ../../common/parse_manifest.c:390 msgid "unexpected array end" msgstr "予期しない配列の終わり" -#: ../../common/parse_manifest.c:418 +#: ../../common/parse_manifest.c:417 msgid "expected version indicator" msgstr "バージョン指示子を想定していました" -#: ../../common/parse_manifest.c:454 +#: ../../common/parse_manifest.c:453 msgid "unrecognized top-level field" msgstr "認識できないトップレベルフィールド" -#: ../../common/parse_manifest.c:473 +#: ../../common/parse_manifest.c:472 msgid "unexpected file field" msgstr "予期しないファイルフィールド" -#: ../../common/parse_manifest.c:487 +#: ../../common/parse_manifest.c:486 msgid "unexpected WAL range field" msgstr "予期しないWAL範囲フィールド" -#: ../../common/parse_manifest.c:493 +#: ../../common/parse_manifest.c:492 msgid "unexpected object field" msgstr "予期しないオブジェクトフィールド" -#: ../../common/parse_manifest.c:583 +#: ../../common/parse_manifest.c:582 msgid "unexpected scalar" msgstr "予期しないスカラー" -#: ../../common/parse_manifest.c:609 +#: ../../common/parse_manifest.c:608 msgid "manifest version not an integer" msgstr "目録バージョンが整数ではありません" -#: ../../common/parse_manifest.c:613 +#: ../../common/parse_manifest.c:612 msgid "unexpected manifest version" msgstr "予期しない目録バージョン" -#: ../../common/parse_manifest.c:637 +#: ../../common/parse_manifest.c:636 msgid "system identifier in manifest not an integer" msgstr "目録中のシステム識別子が整数ではありません" -#: ../../common/parse_manifest.c:662 +#: ../../common/parse_manifest.c:661 msgid "missing path name" msgstr "パス名がありません" -#: ../../common/parse_manifest.c:665 +#: ../../common/parse_manifest.c:664 msgid "both path name and encoded path name" msgstr "パス名とエンコードされたパス名の両方" -#: ../../common/parse_manifest.c:667 +#: ../../common/parse_manifest.c:666 msgid "missing size" msgstr "サイズがありません" -#: ../../common/parse_manifest.c:670 +#: ../../common/parse_manifest.c:669 msgid "checksum without algorithm" msgstr "アルゴリズムなしのチェックサム" -#: ../../common/parse_manifest.c:684 +#: ../../common/parse_manifest.c:683 msgid "could not decode file name" msgstr "ファイル名をデコードできませんでした" -#: ../../common/parse_manifest.c:694 +#: ../../common/parse_manifest.c:693 msgid "file size is not an integer" msgstr "ファイルサイズが整数ではありません" -#: ../../common/parse_manifest.c:700 +#: ../../common/parse_manifest.c:699 #, c-format msgid "unrecognized checksum algorithm: \"%s\"" msgstr "認識できないチェックサムアルゴリズム: \"%s\"" -#: ../../common/parse_manifest.c:719 +#: ../../common/parse_manifest.c:718 #, c-format msgid "invalid checksum for file \"%s\": \"%s\"" msgstr "\"%s\" ファイルのチェックサムが無効: \"%s\"" -#: ../../common/parse_manifest.c:762 +#: ../../common/parse_manifest.c:761 msgid "missing timeline" msgstr "タイムラインがありません" -#: ../../common/parse_manifest.c:764 +#: ../../common/parse_manifest.c:763 msgid "missing start LSN" msgstr "開始LSNがありません" -#: ../../common/parse_manifest.c:766 +#: ../../common/parse_manifest.c:765 msgid "missing end LSN" msgstr "終了LSNがありません" -#: ../../common/parse_manifest.c:772 +#: ../../common/parse_manifest.c:771 msgid "timeline is not an integer" msgstr "タイムラインが整数ではありません" -#: ../../common/parse_manifest.c:775 +#: ../../common/parse_manifest.c:774 msgid "could not parse start LSN" msgstr "開始LSNをパースできませんでした" -#: ../../common/parse_manifest.c:778 +#: ../../common/parse_manifest.c:777 msgid "could not parse end LSN" msgstr "終了LSNをパースできませんでした" -#: ../../common/parse_manifest.c:843 +#: ../../common/parse_manifest.c:842 msgid "expected at least 2 lines" msgstr "少なくとも2行が必要です" -#: ../../common/parse_manifest.c:846 +#: ../../common/parse_manifest.c:845 msgid "last line not newline-terminated" msgstr "最後の行が改行で終わっていません" -#: ../../common/parse_manifest.c:865 +#: ../../common/parse_manifest.c:864 #, c-format msgid "could not finalize checksum of manifest" msgstr "目録のチェックサムの完了ができませんでした" -#: ../../common/parse_manifest.c:869 +#: ../../common/parse_manifest.c:868 #, c-format msgid "manifest has no checksum" msgstr "目録にチェックサムがありません" -#: ../../common/parse_manifest.c:873 +#: ../../common/parse_manifest.c:872 #, c-format msgid "invalid manifest checksum: \"%s\"" msgstr "無効な目録チェックサム: \"%s\"" -#: ../../common/parse_manifest.c:877 +#: ../../common/parse_manifest.c:876 #, c-format msgid "manifest checksum mismatch" msgstr "目録チェックサムの不一致" -#: ../../common/parse_manifest.c:892 +#: ../../common/parse_manifest.c:891 #, c-format msgid "could not parse backup manifest: %s" msgstr "バックアップ目録をパースできませんでした: %s" -#: pg_verifybackup.c:207 -#, c-format -msgid "invalid backup format \"%s\", must be \"plain\" or \"tar\"" -msgstr "不正なバックアップフォーマット\"%s\"、\"plain\"か\"tar\"でなければなりません" - -#: pg_verifybackup.c:228 pg_verifybackup.c:237 pg_verifybackup.c:248 +#: 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:236 +#: pg_verifybackup.c:285 #, c-format msgid "no backup directory specified" msgstr "バックアップディレクトリが指定されていません" -#: pg_verifybackup.c:246 +#: pg_verifybackup.c:295 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "コマンドライン引数が多すぎます。(先頭は\"%s\")" -#: pg_verifybackup.c:254 +#: pg_verifybackup.c:303 #, c-format msgid "cannot specify both %s and %s" msgstr "%sと%sの両方を同時には指定できません" -#: pg_verifybackup.c:274 +#: 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:277 +#: 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:303 pg_verifybackup.c:624 +#: pg_verifybackup.c:381 #, c-format -msgid "could not open directory \"%s\": %m" -msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m" +msgid "backup successfully verified\n" +msgstr "バックアップが正常に検証されました\n" -#: pg_verifybackup.c:322 pg_verifybackup.c:411 +#: pg_verifybackup.c:410 #, c-format msgid "could not stat file \"%s\": %m" msgstr "ファイル\"%s\"のstatに失敗しました: %m" -#: pg_verifybackup.c:339 -#, c-format -msgid "pg_waldump cannot read tar files" -msgstr "pg_waldumpはtarファイルを読めません" - -#: pg_verifybackup.c:340 -#, c-format -msgid "You must use -n or --no-parse-wal when verifying a tar-format backup." -msgstr "tarフォーマットのバックアップを検証するときには -n または --no-parse-wal を使う必要があります。" - -#: pg_verifybackup.c:382 -#, c-format -msgid "backup successfully verified\n" -msgstr "バックアップが正常に検証されました\n" - -#: pg_verifybackup.c:441 +#: 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:479 +#: 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:562 +#: pg_verifybackup.c:561 #, c-format msgid "duplicate path name in backup manifest: \"%s\"" msgstr "バックアップ目録内の重複パス名: \"%s\"" -#: pg_verifybackup.c:656 pg_verifybackup.c:826 +#: pg_verifybackup.c:624 pg_verifybackup.c:631 +#, c-format +msgid "could not open directory \"%s\": %m" +msgstr "ディレクトリ\"%s\"をオープンできませんでした: %m" + +#: pg_verifybackup.c:663 #, c-format msgid "could not close directory \"%s\": %m" msgstr "ディレクトリ\"%s\"をクローズできませんでした: %m" -#: pg_verifybackup.c:677 pg_verifybackup.c:896 +#: pg_verifybackup.c:683 #, c-format msgid "could not stat file or directory \"%s\": %m" msgstr "\"%s\"というファイルまたはディレクトリの情報を取得できませんでした: %m" -#: pg_verifybackup.c:700 +#: pg_verifybackup.c:706 #, c-format msgid "\"%s\" is not a file or directory" msgstr "\"%s\"はファイルまたはディレクトリではありません" -#: pg_verifybackup.c:710 +#: pg_verifybackup.c:716 #, c-format msgid "\"%s\" is present on disk but not in the manifest" msgstr "\"%s\"はディスクに存在しますが、目録には存在しません" -#: pg_verifybackup.c:722 +#: pg_verifybackup.c:728 #, c-format -msgid "\"%s\" has size %llu on disk but size %llu in the manifest" -msgstr "\"%s\"はディスク上でのサイズは%lluですが、目録上は%lluとなっています" +msgid "\"%s\" has size %lld on disk but size %zu in the manifest" +msgstr "\"%s\"はディスク上でのサイズは%lldですが、目録上は%zuとなっています" -#: pg_verifybackup.c:764 +#: pg_verifybackup.c:768 #, c-format msgid "%s: CRC is incorrect" msgstr "%s: CRCが正しくありません" -#: pg_verifybackup.c:768 +#: pg_verifybackup.c:772 #, c-format msgid "%s: unexpected control file version" msgstr "%s: 予期しない制御ファイルバージョン" -#: pg_verifybackup.c:773 +#: 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:905 -#, c-format -msgid "\"%s\" is not a plain file" -msgstr "\"%s\"は通常ファイルではありません" - -#: pg_verifybackup.c:935 pg_verifybackup.c:956 -#, c-format -msgid "file \"%s\" is not expected in a tar format backup" -msgstr "tar形式のバックアップではファイル\"%s\"は想定外です" - -#: pg_verifybackup.c:1048 +#: pg_verifybackup.c:801 #, c-format msgid "\"%s\" is present in the manifest but not on disk" msgstr "\"%s\"は目録には存在しますが、ディスクには存在しません" -#: pg_verifybackup.c:1120 +#: pg_verifybackup.c:873 #, c-format msgid "could not initialize checksum of file \"%s\"" msgstr "ファイル\"%s\"のチェックサムの初期化ができませんでした" -#: pg_verifybackup.c:1132 +#: pg_verifybackup.c:885 #, c-format msgid "could not update checksum of file \"%s\"" msgstr "ファイル\"%s\"のチェックサムの更新ができませんでした" -#: pg_verifybackup.c:1168 +#: pg_verifybackup.c:921 #, c-format -msgid "file \"%s\" should contain %llu bytes, but read %llu bytes" -msgstr "file\"%s\"は%lluバイトを含む必要がありますが、%lluバイトが読み込まれました" +msgid "file \"%s\" should contain %zu bytes, but read %zu bytes" +msgstr "file\"%s\"は%zuバイトを含む必要がありますが、%zuバイトが読み込まれました" -#: pg_verifybackup.c:1179 +#: pg_verifybackup.c:931 #, c-format msgid "could not finalize checksum of file \"%s\"" msgstr "ファイル\"%s\"のチェックサムの完了ができませんでした" -#: pg_verifybackup.c:1187 +#: pg_verifybackup.c:939 #, c-format msgid "file \"%s\" has checksum of length %d, but expected %d" msgstr "ファイル\"%s\"のチェックサムの長さは%dですが、予期されるのは%dです" -#: pg_verifybackup.c:1191 +#: pg_verifybackup.c:943 #, c-format msgid "checksum mismatch for file \"%s\"" msgstr "ファイル\"%s\"のチェックサムが一致しません" -#: pg_verifybackup.c:1217 +#: pg_verifybackup.c:969 #, c-format msgid "WAL parsing failed for timeline %u" msgstr "タイムライン%uのWALのパースに失敗しました" -#: pg_verifybackup.c:1351 +#: pg_verifybackup.c:1072 #, c-format msgid "%*s/%s kB (%d%%) verified" msgstr "%*s/%s kB (%d%%) 検証しました" -#: pg_verifybackup.c:1368 +#: pg_verifybackup.c:1089 #, c-format msgid "" "%s verifies a backup against the backup manifest.\n" @@ -559,7 +529,7 @@ msgstr "" "%sはバックアップ目録に対してバックアップを検証します。\n" "\n" -#: pg_verifybackup.c:1369 +#: pg_verifybackup.c:1090 #, c-format msgid "" "Usage:\n" @@ -570,67 +540,62 @@ msgstr "" " %s [オプション]... BACKUPDIR\n" "\n" -#: pg_verifybackup.c:1370 +#: pg_verifybackup.c:1091 #, c-format msgid "Options:\n" msgstr "オプション:\n" -#: pg_verifybackup.c:1371 +#: 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:1372 -#, c-format -msgid " -F, --format=p|t backup format (plain, tar)\n" -msgstr " -F, --format=p|t 出力フォーマット(plain, tar)\n" - -#: pg_verifybackup.c:1373 +#: pg_verifybackup.c:1093 #, c-format msgid " -i, --ignore=RELATIVE_PATH ignore indicated path\n" msgstr " -i, --ignore=RELATIVE_PATH 指示されたパスを無視\n" -#: pg_verifybackup.c:1374 +#: 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:1375 +#: 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:1376 +#: pg_verifybackup.c:1096 #, c-format msgid " -P, --progress show progress information\n" msgstr " -P, --progress 進行状況を表示\n" -#: pg_verifybackup.c:1377 +#: 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:1378 +#: pg_verifybackup.c:1098 #, c-format msgid " -s, --skip-checksums skip checksum verification\n" msgstr " -s, --skip-checksums チェックサム検証をスキップ\n" -#: pg_verifybackup.c:1379 +#: 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:1380 +#: pg_verifybackup.c:1100 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: pg_verifybackup.c:1381 +#: pg_verifybackup.c:1101 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help このヘルプを表示して終了\n" -#: pg_verifybackup.c:1382 +#: pg_verifybackup.c:1102 #, c-format msgid "" "\n" @@ -639,7 +604,28 @@ msgstr "" "\n" "バグは<%s>に報告してください。\n" -#: pg_verifybackup.c:1383 +#: 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/ru.po b/src/bin/pg_verifybackup/po/ru.po index a5e7d099ba387..d634b785fea9f 100644 --- a/src/bin/pg_verifybackup/po/ru.po +++ b/src/bin/pg_verifybackup/po/ru.po @@ -3,7 +3,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_verifybackup (PostgreSQL) 13\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-02-08 07:44+0200\n" +"POT-Creation-Date: 2025-08-02 11:37+0300\n" "PO-Revision-Date: 2024-09-07 09:48+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -121,91 +121,91 @@ msgstr "нехватка памяти\n" msgid "cannot duplicate null pointer (internal error)\n" msgstr "попытка дублирования нулевого указателя (внутренняя ошибка)\n" -#: ../../common/jsonapi.c:2121 +#: ../../common/jsonapi.c:2124 msgid "Recursive descent parser cannot use incremental lexer." msgstr "" "Инкрементальный лексический анализатор не подходит для нисходящего " "рекурсивного разбора." -#: ../../common/jsonapi.c:2123 +#: ../../common/jsonapi.c:2126 msgid "Incremental parser requires incremental lexer." msgstr "" "Для инкрементального разбора требуется инкрементальный лексический " "анализатор." -#: ../../common/jsonapi.c:2125 +#: ../../common/jsonapi.c:2128 msgid "JSON nested too deep, maximum permitted depth is 6400." msgstr "" "Слишком большая вложенность JSON, максимальная допустимая глубина: 6400." -#: ../../common/jsonapi.c:2127 +#: ../../common/jsonapi.c:2130 #, c-format msgid "Escape sequence \"\\%.*s\" is invalid." msgstr "Неверная спецпоследовательность: \"\\%.*s\"." -#: ../../common/jsonapi.c:2131 +#: ../../common/jsonapi.c:2134 #, c-format msgid "Character with value 0x%02x must be escaped." msgstr "Символ с кодом 0x%02x необходимо экранировать." -#: ../../common/jsonapi.c:2135 +#: ../../common/jsonapi.c:2138 #, c-format msgid "Expected end of input, but found \"%.*s\"." msgstr "Ожидался конец текста, но обнаружено продолжение \"%.*s\"." -#: ../../common/jsonapi.c:2138 +#: ../../common/jsonapi.c:2141 #, c-format msgid "Expected array element or \"]\", but found \"%.*s\"." msgstr "Ожидался элемент массива или \"]\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2141 +#: ../../common/jsonapi.c:2144 #, c-format msgid "Expected \",\" or \"]\", but found \"%.*s\"." msgstr "Ожидалась \",\" или \"]\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2144 +#: ../../common/jsonapi.c:2147 #, c-format msgid "Expected \":\", but found \"%.*s\"." msgstr "Ожидалось \":\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2147 +#: ../../common/jsonapi.c:2150 #, c-format msgid "Expected JSON value, but found \"%.*s\"." msgstr "Ожидалось значение JSON, но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2150 +#: ../../common/jsonapi.c:2153 msgid "The input string ended unexpectedly." msgstr "Неожиданный конец входной строки." -#: ../../common/jsonapi.c:2152 +#: ../../common/jsonapi.c:2155 #, c-format msgid "Expected string or \"}\", but found \"%.*s\"." msgstr "Ожидалась строка или \"}\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2155 +#: ../../common/jsonapi.c:2158 #, c-format msgid "Expected \",\" or \"}\", but found \"%.*s\"." msgstr "Ожидалась \",\" или \"}\", но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2158 +#: ../../common/jsonapi.c:2161 #, c-format msgid "Expected string, but found \"%.*s\"." msgstr "Ожидалась строка, но обнаружено \"%.*s\"." -#: ../../common/jsonapi.c:2161 +#: ../../common/jsonapi.c:2164 #, c-format msgid "Token \"%.*s\" is invalid." msgstr "Ошибочный элемент \"%.*s\"." -#: ../../common/jsonapi.c:2164 +#: ../../common/jsonapi.c:2167 msgid "\\u0000 cannot be converted to text." msgstr "\\u0000 нельзя преобразовать в текст." -#: ../../common/jsonapi.c:2166 +#: ../../common/jsonapi.c:2169 msgid "\"\\u\" must be followed by four hexadecimal digits." msgstr "За \"\\u\" должны следовать четыре шестнадцатеричные цифры." -#: ../../common/jsonapi.c:2169 +#: ../../common/jsonapi.c:2172 msgid "" "Unicode escape values cannot be used for code point values above 007F when " "the encoding is not UTF8." @@ -213,18 +213,18 @@ msgstr "" "Спецкоды Unicode для значений выше 007F можно использовать только с " "кодировкой UTF8." -#: ../../common/jsonapi.c:2178 +#: ../../common/jsonapi.c:2181 #, c-format msgid "" "Unicode escape value could not be translated to the server's encoding %s." msgstr "Спецкод Unicode нельзя преобразовать в серверную кодировку %s." -#: ../../common/jsonapi.c:2185 +#: ../../common/jsonapi.c:2188 msgid "Unicode high surrogate must not follow a high surrogate." msgstr "" "Старшее слово суррогата Unicode не может следовать за другим старшим словом." -#: ../../common/jsonapi.c:2187 +#: ../../common/jsonapi.c:2190 msgid "Unicode low surrogate must follow a high surrogate." msgstr "Младшее слово суррогата Unicode должно следовать за старшим словом." diff --git a/src/bin/pg_verifybackup/t/008_untar.pl b/src/bin/pg_verifybackup/t/008_untar.pl index 7a09f3b75b2a7..7b589dd4bf13e 100644 --- a/src/bin/pg_verifybackup/t/008_untar.pl +++ b/src/bin/pg_verifybackup/t/008_untar.pl @@ -16,6 +16,22 @@ $primary->init(allows_streaming => 1); $primary->start; +# Create file with some random data and an arbitrary size, useful to check +# the solidity of the compression and decompression logic. The size of the +# file is chosen to be around 640kB. This has proven to be large enough to +# detect some issues related to LZ4, and low enough to not impact the runtime +# of the test significantly. +my $junk_data = $primary->safe_psql( + 'postgres', qq( + SELECT string_agg(encode(sha256(i::text::bytea), 'hex'), '') + FROM generate_series(1, 10240) s(i);)); +my $data_dir = $primary->data_dir; +my $junk_file = "$data_dir/junk"; +open my $jf, '>', $junk_file + or die "Could not create junk file: $!"; +print $jf $junk_data; +close $jf; + my $backup_path = $primary->backup_dir . '/server-backup'; my $extract_path = $primary->backup_dir . '/extracted-backup'; @@ -42,6 +58,14 @@ 'decompress_flags' => [ '-d', '-m' ], 'enabled' => check_pg_config("#define USE_LZ4 1") }, + { + 'compression_method' => 'lz4', + 'backup_flags' => [ '--compress', 'server-lz4:5' ], + 'backup_archive' => 'base.tar.lz4', + 'decompress_program' => $ENV{'LZ4'}, + 'decompress_flags' => [ '-d', '-m' ], + 'enabled' => check_pg_config("#define USE_LZ4 1") + }, { 'compression_method' => 'zstd', 'backup_flags' => [ '--compress', 'server-zstd' ], diff --git a/src/bin/pg_verifybackup/t/009_extract.pl b/src/bin/pg_verifybackup/t/009_extract.pl index 1d531dc20d52a..9a43d80d4b865 100644 --- a/src/bin/pg_verifybackup/t/009_extract.pl +++ b/src/bin/pg_verifybackup/t/009_extract.pl @@ -10,6 +10,10 @@ use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; use Test::More; + +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_wal + 'pg_basebackup without -E from server with encrypted WAL produces broken backups'; + my $primary = PostgreSQL::Test::Cluster->new('primary'); $primary->init(allows_streaming => 1); $primary->start; diff --git a/src/bin/pg_verifybackup/t/010_client_untar.pl b/src/bin/pg_verifybackup/t/010_client_untar.pl index 8c076d46dee00..dc26c296ad771 100644 --- a/src/bin/pg_verifybackup/t/010_client_untar.pl +++ b/src/bin/pg_verifybackup/t/010_client_untar.pl @@ -15,6 +15,22 @@ $primary->init(allows_streaming => 1); $primary->start; +# Create file with some random data and an arbitrary size, useful to check +# the solidity of the compression and decompression logic. The size of the +# file is chosen to be around 640kB. This has proven to be large enough to +# detect some issues related to LZ4, and low enough to not impact the runtime +# of the test significantly. +my $junk_data = $primary->safe_psql( + 'postgres', qq( + SELECT string_agg(encode(sha256(i::text::bytea), 'hex'), '') + FROM generate_series(1, 10240) s(i);)); +my $data_dir = $primary->data_dir; +my $junk_file = "$data_dir/junk"; +open my $jf, '>', $junk_file + or die "Could not create junk file: $!"; +print $jf $junk_data; +close $jf; + my $backup_path = $primary->backup_dir . '/client-backup'; my $extract_path = $primary->backup_dir . '/extracted-backup'; @@ -42,6 +58,15 @@ 'output_file' => 'base.tar', 'enabled' => check_pg_config("#define USE_LZ4 1") }, + { + 'compression_method' => 'lz4', + 'backup_flags' => [ '--compress', 'client-lz4:1' ], + 'backup_archive' => 'base.tar.lz4', + 'decompress_program' => $ENV{'LZ4'}, + 'decompress_flags' => ['-d'], + 'output_file' => 'base.tar', + 'enabled' => check_pg_config("#define USE_LZ4 1") + }, { 'compression_method' => 'zstd', 'backup_flags' => [ '--compress', 'client-zstd:5' ], diff --git a/src/bin/pg_waldump/meson.build b/src/bin/pg_waldump/meson.build index cab9de90846f2..2d9d67a02ed82 100644 --- a/src/bin/pg_waldump/meson.build +++ b/src/bin/pg_waldump/meson.build @@ -42,8 +42,6 @@ tests += { 'tests': [ 't/001_basic.pl', 't/002_save_fullpage.pl', - 't/003_basic_encrypted.pl', - 't/004_save_fullpage_encrypted.pl', ], }, } diff --git a/src/bin/pg_waldump/pg_waldump.c b/src/bin/pg_waldump/pg_waldump.c index 0ee07d33f4fa3..171d6a52955fa 100644 --- a/src/bin/pg_waldump/pg_waldump.c +++ b/src/bin/pg_waldump/pg_waldump.c @@ -34,7 +34,7 @@ #ifdef PERCONA_EXT #include "access/pg_tde_fe_init.h" -#include "access/pg_tde_xlog_encrypt.h" +#include "access/pg_tde_xlog_smgr.h" #include "access/xlog_smgr.h" #include "catalog/tde_global_space.h" #endif diff --git a/src/bin/pg_waldump/po/ru.po b/src/bin/pg_waldump/po/ru.po index bafe5a3233c66..12640ebcad14c 100644 --- a/src/bin/pg_waldump/po/ru.po +++ b/src/bin/pg_waldump/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: pg_waldump (PostgreSQL) 10\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-09-02 09:29+0300\n" +"POT-Creation-Date: 2025-08-02 11:37+0300\n" "PO-Revision-Date: 2024-09-07 08:59+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -501,52 +501,52 @@ msgstr "" msgid "contrecord is requested by %X/%X" msgstr "в позиции %X/%X запрошено продолжение записи" -#: xlogreader.c:669 xlogreader.c:1134 +#: xlogreader.c:669 xlogreader.c:1144 #, c-format msgid "invalid record length at %X/%X: expected at least %u, got %u" msgstr "" "неверная длина записи в позиции %X/%X: ожидалось минимум %u, получено %u" -#: xlogreader.c:758 +#: xlogreader.c:759 #, c-format msgid "there is no contrecord flag at %X/%X" msgstr "нет флага contrecord в позиции %X/%X" -#: xlogreader.c:771 +#: xlogreader.c:772 #, c-format msgid "invalid contrecord length %u (expected %lld) at %X/%X" msgstr "неверная длина contrecord: %u (ожидалась %lld) в позиции %X/%X" -#: xlogreader.c:1142 +#: xlogreader.c:1152 #, c-format msgid "invalid resource manager ID %u at %X/%X" msgstr "неверный ID менеджера ресурсов %u в позиции %X/%X" -#: xlogreader.c:1155 xlogreader.c:1171 +#: xlogreader.c:1165 xlogreader.c:1181 #, c-format msgid "record with incorrect prev-link %X/%X at %X/%X" msgstr "запись с неверной ссылкой назад %X/%X в позиции %X/%X" -#: xlogreader.c:1209 +#: xlogreader.c:1219 #, c-format msgid "incorrect resource manager data checksum in record at %X/%X" msgstr "" "некорректная контрольная сумма данных менеджера ресурсов в записи в позиции " "%X/%X" -#: xlogreader.c:1243 +#: xlogreader.c:1253 #, 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 +#: xlogreader.c:1268 xlogreader.c:1310 #, 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 +#: xlogreader.c:1284 #, c-format msgid "" "WAL file is from different database system: WAL file database system " @@ -555,7 +555,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: в нём указан идентификатор системы БД " "%llu, а идентификатор системы pg_control: %llu" -#: xlogreader.c:1282 +#: xlogreader.c:1292 #, c-format msgid "" "WAL file is from different database system: incorrect segment size in page " @@ -564,7 +564,7 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный размер сегмента в заголовке " "страницы" -#: xlogreader.c:1288 +#: xlogreader.c:1298 #, c-format msgid "" "WAL file is from different database system: incorrect XLOG_BLCKSZ in page " @@ -573,12 +573,12 @@ msgstr "" "файл WAL принадлежит другой СУБД: некорректный XLOG_BLCKSZ в заголовке " "страницы" -#: xlogreader.c:1320 +#: xlogreader.c:1330 #, 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 +#: xlogreader.c:1356 #, c-format msgid "" "out-of-sequence timeline ID %u (after %u) in WAL segment %s, LSN %X/%X, " @@ -587,23 +587,23 @@ msgstr "" "нарушение последовательности ID линии времени %u (после %u) в сегменте WAL " "%s, LSN %X/%X, смещение %u" -#: xlogreader.c:1749 +#: xlogreader.c:1759 #, c-format msgid "out-of-order block_id %u at %X/%X" msgstr "идентификатор блока %u идёт не по порядку в позиции %X/%X" -#: xlogreader.c:1773 +#: xlogreader.c:1783 #, c-format msgid "BKPBLOCK_HAS_DATA set, but no data included at %X/%X" msgstr "BKPBLOCK_HAS_DATA установлен, но данных в позиции %X/%X нет" -#: xlogreader.c:1780 +#: xlogreader.c:1790 #, 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 +#: xlogreader.c:1826 #, c-format msgid "" "BKPIMAGE_HAS_HOLE set, but hole offset %u length %u block image length %u at " @@ -612,21 +612,21 @@ msgstr "" "BKPIMAGE_HAS_HOLE установлен, но для пропуска заданы смещение %u и длина %u " "при длине образа блока %u в позиции %X/%X" -#: xlogreader.c:1832 +#: xlogreader.c:1842 #, 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 +#: xlogreader.c:1856 #, c-format msgid "BKPIMAGE_COMPRESSED set, but block image length %u at %X/%X" msgstr "" "BKPIMAGE_COMPRESSED установлен, но длина образа блока равна %u в позиции %X/" "%X" -#: xlogreader.c:1861 +#: xlogreader.c:1871 #, c-format msgid "" "neither BKPIMAGE_HAS_HOLE nor BKPIMAGE_COMPRESSED set, but block image " @@ -635,41 +635,41 @@ msgstr "" "ни BKPIMAGE_HAS_HOLE, ни BKPIMAGE_COMPRESSED не установлены, но длина образа " "блока равна %u в позиции %X/%X" -#: xlogreader.c:1877 +#: xlogreader.c:1887 #, c-format msgid "BKPBLOCK_SAME_REL set but no previous rel at %X/%X" msgstr "" "BKPBLOCK_SAME_REL установлен, но предыдущее значение не задано в позиции %X/" "%X" -#: xlogreader.c:1889 +#: xlogreader.c:1899 #, c-format msgid "invalid block_id %u at %X/%X" msgstr "неверный идентификатор блока %u в позиции %X/%X" -#: xlogreader.c:1956 +#: xlogreader.c:1966 #, c-format msgid "record with invalid length at %X/%X" msgstr "запись с неверной длиной в позиции %X/%X" -#: xlogreader.c:1982 +#: xlogreader.c:1992 #, c-format msgid "could not locate backup block with ID %d in WAL record" msgstr "не удалось найти копию блока с ID %d в записи журнала WAL" -#: xlogreader.c:2066 +#: xlogreader.c:2076 #, c-format msgid "could not restore image at %X/%X with invalid block %d specified" msgstr "" "не удалось восстановить образ в позиции %X/%X с указанным неверным блоком %d" -#: xlogreader.c:2073 +#: xlogreader.c:2083 #, 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 +#: xlogreader.c:2110 xlogreader.c:2127 #, c-format msgid "" "could not restore image at %X/%X compressed with %s not supported by build, " @@ -678,7 +678,7 @@ msgstr "" "не удалось восстановить образ в позиции %X/%X, сжатый методом %s, который не " "поддерживается этой сборкой, блок %d" -#: xlogreader.c:2126 +#: xlogreader.c:2136 #, c-format msgid "" "could not restore image at %X/%X compressed with unknown method, block %d" @@ -686,7 +686,7 @@ msgstr "" "не удалось восстановить образ в позиции %X/%X, сжатый неизвестным методом, " "блок %d" -#: xlogreader.c:2134 +#: xlogreader.c:2144 #, 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 578e473139432..e7a2ac689dc7c 100644 --- a/src/bin/pg_waldump/t/001_basic.pl +++ b/src/bin/pg_waldump/t/001_basic.pl @@ -7,6 +7,9 @@ use PostgreSQL::Test::Utils; use Test::More; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_wal + 'pg_waldump needs extra options for encrypted WAL'; + program_help_ok('pg_waldump'); program_version_ok('pg_waldump'); program_options_handling_ok('pg_waldump'); diff --git a/src/bin/pg_waldump/t/002_save_fullpage.pl b/src/bin/pg_waldump/t/002_save_fullpage.pl index 1f398b043a91f..377f2f1272240 100644 --- a/src/bin/pg_waldump/t/002_save_fullpage.pl +++ b/src/bin/pg_waldump/t/002_save_fullpage.pl @@ -9,6 +9,9 @@ use PostgreSQL::Test::Utils; use Test::More; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_wal + 'pg_waldump needs extra options for encrypted WAL'; + my ($blocksize, $walfile_name); # Function to extract the LSN from the given block structure diff --git a/src/bin/pgbench/pgbench.c b/src/bin/pgbench/pgbench.c index 0b45b7d453da1..7d2811ebe4277 100644 --- a/src/bin/pgbench/pgbench.c +++ b/src/bin/pgbench/pgbench.c @@ -3473,6 +3473,8 @@ doRetry(CState *st, pg_time_usec_t *now) static int discardUntilSync(CState *st) { + bool received_sync = false; + /* send a sync */ if (!PQpipelineSync(st->con)) { @@ -3487,10 +3489,21 @@ discardUntilSync(CState *st) PGresult *res = PQgetResult(st->con); if (PQresultStatus(res) == PGRES_PIPELINE_SYNC) + received_sync = true; + else if (received_sync) { - PQclear(res); - res = PQgetResult(st->con); + /* + * PGRES_PIPELINE_SYNC must be followed by another + * PGRES_PIPELINE_SYNC or NULL; otherwise, assert failure. + */ Assert(res == NULL); + + /* + * Reset ongoing sync count to 0 since all PGRES_PIPELINE_SYNC + * results have been discarded. + */ + st->num_syncs = 0; + PQclear(res); break; } PQclear(res); diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index f3f8fd0765ac7..877ed0796d648 100644 --- a/src/bin/psql/command.c +++ b/src/bin/psql/command.c @@ -123,6 +123,8 @@ static backslashResult exec_command_pset(PsqlScanState scan_state, bool active_b static backslashResult exec_command_quit(PsqlScanState scan_state, bool active_branch); static backslashResult exec_command_reset(PsqlScanState scan_state, bool active_branch, PQExpBuffer query_buf); +static backslashResult exec_command_restrict(PsqlScanState scan_state, bool active_branch, + const char *cmd); static backslashResult exec_command_s(PsqlScanState scan_state, bool active_branch); static backslashResult exec_command_set(PsqlScanState scan_state, bool active_branch); static backslashResult exec_command_setenv(PsqlScanState scan_state, bool active_branch, @@ -132,6 +134,8 @@ static backslashResult exec_command_sf_sv(PsqlScanState scan_state, bool active_ static backslashResult exec_command_t(PsqlScanState scan_state, bool active_branch); static backslashResult exec_command_T(PsqlScanState scan_state, bool active_branch); static backslashResult exec_command_timing(PsqlScanState scan_state, bool active_branch); +static backslashResult exec_command_unrestrict(PsqlScanState scan_state, bool active_branch, + const char *cmd); static backslashResult exec_command_unset(PsqlScanState scan_state, bool active_branch, const char *cmd); static backslashResult exec_command_write(PsqlScanState scan_state, bool active_branch, @@ -182,6 +186,8 @@ static char *pset_value_string(const char *param, printQueryOpt *popt); static void checkWin32Codepage(void); #endif +static bool restricted; +static char *restrict_key; /*---------- @@ -227,8 +233,19 @@ HandleSlashCmds(PsqlScanState scan_state, /* Parse off the command name */ cmd = psql_scan_slash_command(scan_state); - /* And try to execute it */ - status = exec_command(cmd, scan_state, cstack, query_buf, previous_buf); + /* + * And try to execute it. + * + * If we are in "restricted" mode, the only allowable backslash command is + * \unrestrict (to exit restricted mode). + */ + if (restricted && strcmp(cmd, "unrestrict") != 0) + { + pg_log_error("backslash commands are restricted; only \\unrestrict is allowed"); + status = PSQL_CMD_ERROR; + } + else + status = exec_command(cmd, scan_state, cstack, query_buf, previous_buf); if (status == PSQL_CMD_UNKNOWN) { @@ -389,6 +406,8 @@ exec_command(const char *cmd, status = exec_command_quit(scan_state, active_branch); else if (strcmp(cmd, "r") == 0 || strcmp(cmd, "reset") == 0) status = exec_command_reset(scan_state, active_branch, query_buf); + else if (strcmp(cmd, "restrict") == 0) + status = exec_command_restrict(scan_state, active_branch, cmd); else if (strcmp(cmd, "s") == 0) status = exec_command_s(scan_state, active_branch); else if (strcmp(cmd, "set") == 0) @@ -405,6 +424,8 @@ exec_command(const char *cmd, status = exec_command_T(scan_state, active_branch); else if (strcmp(cmd, "timing") == 0) status = exec_command_timing(scan_state, active_branch); + else if (strcmp(cmd, "unrestrict") == 0) + status = exec_command_unrestrict(scan_state, active_branch, cmd); else if (strcmp(cmd, "unset") == 0) status = exec_command_unset(scan_state, active_branch, cmd); else if (strcmp(cmd, "w") == 0 || strcmp(cmd, "write") == 0) @@ -2337,6 +2358,35 @@ exec_command_reset(PsqlScanState scan_state, bool active_branch, return PSQL_CMD_SKIP_LINE; } +/* + * \restrict -- enter "restricted mode" with the provided key + */ +static backslashResult +exec_command_restrict(PsqlScanState scan_state, bool active_branch, + const char *cmd) +{ + if (active_branch) + { + char *opt; + + Assert(!restricted); + + opt = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, true); + if (opt == NULL || opt[0] == '\0') + { + pg_log_error("\\%s: missing required argument", cmd); + return PSQL_CMD_ERROR; + } + + restrict_key = pstrdup(opt); + restricted = true; + } + else + ignore_slash_options(scan_state); + + return PSQL_CMD_SKIP_LINE; +} + /* * \s -- save history in a file or show it on the screen */ @@ -2624,6 +2674,46 @@ exec_command_timing(PsqlScanState scan_state, bool active_branch) return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR; } +/* + * \unrestrict -- exit "restricted mode" if provided key matches + */ +static backslashResult +exec_command_unrestrict(PsqlScanState scan_state, bool active_branch, + const char *cmd) +{ + if (active_branch) + { + char *opt; + + opt = psql_scan_slash_option(scan_state, OT_NORMAL, NULL, true); + if (opt == NULL || opt[0] == '\0') + { + pg_log_error("\\%s: missing required argument", cmd); + return PSQL_CMD_ERROR; + } + + if (!restricted) + { + pg_log_error("\\%s: not currently in restricted mode", cmd); + return PSQL_CMD_ERROR; + } + else if (strcmp(opt, restrict_key) == 0) + { + pfree(restrict_key); + restricted = false; + } + else + { + pg_log_error("\\%s: wrong key", cmd); + return PSQL_CMD_ERROR; + } + } + else + ignore_slash_options(scan_state); + + return PSQL_CMD_SKIP_LINE; +} + /* * \unset -- unset variable */ diff --git a/src/bin/psql/help.c b/src/bin/psql/help.c index 98af878724f8d..eb3b80f452090 100644 --- a/src/bin/psql/help.c +++ b/src/bin/psql/help.c @@ -175,6 +175,10 @@ 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(" \\restrict RESTRICT_KEY\n" + " enter restricted mode with provided key\n"); + HELP0(" \\unrestrict RESTRICT_KEY\n" + " exit restricted mode if key matches\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"); @@ -732,7 +736,7 @@ void print_copyright(void) { puts("PostgreSQL Database Management System\n" - "(formerly known as Postgres, then as Postgres95)\n\n" + "(also known as Postgres, formerly known as Postgres95)\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" diff --git a/src/bin/psql/po/ja.po b/src/bin/psql/po/ja.po index 7ad8a9b7aaf9e..1e2d3ce7a5097 100644 --- a/src/bin/psql/po/ja.po +++ b/src/bin/psql/po/ja.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: psql (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-02-06 11:07+0900\n" -"PO-Revision-Date: 2025-02-06 14:56+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" @@ -22,22 +22,22 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: ../../../src/common/logging.c:279 +#: ../../../src/common/logging.c:276 #, c-format msgid "error: " msgstr "エラー: " -#: ../../../src/common/logging.c:286 +#: ../../../src/common/logging.c:283 #, c-format msgid "warning: " msgstr "警告: " -#: ../../../src/common/logging.c:297 +#: ../../../src/common/logging.c:294 #, c-format msgid "detail: " msgstr "詳細: " -#: ../../../src/common/logging.c:304 +#: ../../../src/common/logging.c:301 #, c-format msgid "hint: " msgstr "ヒント: " @@ -62,28 +62,28 @@ msgstr "実行対象の\"%s\"が見つかりませんでした" msgid "could not resolve path \"%s\" to absolute form: %m" msgstr "パス\"%s\"を絶対パス形式に変換できませんでした: %m" -#: ../../common/exec.c:363 copy.c:326 +#: ../../common/exec.c:382 copy.c:326 #, c-format msgid "could not execute command \"%s\": %m" msgstr "コマンド\"%s\"を実行できませんでした: %m" -#: ../../common/exec.c:375 +#: ../../common/exec.c:394 #, c-format msgid "could not read from command \"%s\": %m" msgstr "コマンド\"%s\"から読み取れませんでした: %m" -#: ../../common/exec.c:378 +#: ../../common/exec.c:397 #, c-format msgid "no data was returned by command \"%s\"" msgstr "コマンド\"%s\"がデータを返却しませんでした" -#: ../../common/exec.c:405 +#: ../../common/exec.c:424 #, c-format msgid "%s() failed: %m" msgstr "%s() が失敗しました: %m" -#: ../../common/exec.c:543 ../../common/exec.c:588 ../../common/exec.c:680 -#: command.c:1486 command.c:3637 command.c:3686 command.c:3811 input.c:225 +#: ../../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" @@ -105,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:679 +#: ../../common/username.c:45 command.c:616 msgid "user does not exist" msgstr "ユーザーが存在しません" @@ -183,308 +183,312 @@ msgstr "テーブルの内容にセルを追加できません: セルの総数% msgid "invalid output format (internal error): %d" msgstr "出力フォーマットが無効(内部エラー):%d" -#: ../../fe_utils/psqlscan.l:723 -#, c-format -msgid "skipping recursive expansion of variable \"%s\"" -msgstr "変数\"%s\"の再帰展開をスキップしています" - -#: ../../fe_utils/string_utils.c:434 +#: ../../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:607 +#: ../../fe_utils/string_utils.c:760 #, c-format msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "データベース名に改行(LF)または復帰(CR)が含まれています: \"%s\"\n" -#: command.c:238 +#: ../../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 を持つローカルユーザーは存在しません" + +#: command.c:235 #, c-format msgid "invalid command \\%s" msgstr "不正なコマンド \\%s " -#: command.c:240 +#: command.c:237 #, c-format msgid "Try \\? for help." msgstr " \\? でヘルプを表示します。" -#: command.c:258 +#: command.c:255 #, c-format msgid "\\%s: extra argument \"%s\" ignored" msgstr "\\%s: 余分な引数\"%s\"は無視されました" -#: command.c:310 +#: 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:531 command.c:726 command.c:1686 command.c:1805 command.c:2118 -#: command.c:2132 command.c:2164 command.c:2253 command.c:2366 command.c:2607 -#: command.c:2812 command.c:2852 -#, c-format -msgid "\\%s: missing required argument" -msgstr "\\%s: 必要な引数がありません" - -#: command.c:677 +#: command.c:614 #, c-format msgid "could not get home directory for user ID %ld: %s" msgstr "ユーザーID %ldのホームディレクトリを取得できませんでした : %s" -#: command.c:696 +#: command.c:633 #, c-format msgid "\\%s: could not change directory to \"%s\": %m" msgstr "\\%s: ディレクトリを\"%s\"に変更できませんでした: %m" -#: command.c:753 +#: command.c:657 #, c-format msgid "You are currently not connected to a database.\n" msgstr "現在データベースに接続していません。\n" -#: command.c:763 +#: 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:766 +#: 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:772 +#: 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:775 +#: 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:1183 command.c:1284 command.c:2845 +#: command.c:1069 command.c:1170 command.c:2676 #, c-format msgid "no query buffer" msgstr "問い合わせバッファがありません" -#: command.c:1216 command.c:5957 +#: command.c:1102 command.c:5779 #, c-format msgid "invalid line number: %s" msgstr "不正な行番号です: %s" -#: command.c:1362 +#: command.c:1248 msgid "No changes" msgstr "変更されていません" -#: command.c:1447 +#: command.c:1333 #, c-format msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: エンコーディング名が不正であるか、または変換プロシージャが見つかりません。" -#: command.c:1482 command.c:2327 command.c:3633 command.c:3831 command.c:6063 +#: 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:1497 common.c:1563 -#: copy.c:486 copy.c:731 large_obj.c:157 large_obj.c:192 large_obj.c:254 +#: 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:1489 +#: command.c:1376 msgid "There is no previous error." msgstr "直前のエラーはありません。" -#: command.c:1602 +#: command.c:1489 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: 右括弧がありません" -#: command.c:1936 +#: 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:1823 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: \\else の後には置けません" -#: command.c:1941 +#: command.c:1828 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: 対応する \\if がありません" -#: command.c:2005 +#: command.c:1892 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: \\else の後には置けません" -#: command.c:2010 +#: command.c:1897 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: 対応する \\if がありません" -#: command.c:2050 +#: command.c:1937 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: 対応する \\if がありません" -#: command.c:2228 +#: command.c:2093 msgid "Query buffer is empty." msgstr "問い合わせバッファは空です。" -#: command.c:2305 +#: command.c:2136 #, c-format msgid "Enter new password for user \"%s\": " msgstr "ユーザー\"%s\"の新しいパスワードを入力してください: " -#: command.c:2309 +#: command.c:2140 msgid "Enter it again: " msgstr "もう一度入力してください: " -#: command.c:2318 +#: command.c:2149 #, c-format msgid "Passwords didn't match." msgstr "パスワードが一致しませんでした。" -#: command.c:2401 +#: command.c:2232 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: 変数の値を読み取ることができませんでした" -#: command.c:2503 +#: command.c:2334 msgid "Query buffer reset (cleared)." msgstr "問い合わせバッファがリセット(クリア)されました。" -#: command.c:2525 +#: command.c:2356 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "ファイル\"%s\"にヒストリーを出力しました。\n" -#: command.c:2612 +#: command.c:2443 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: 環境変数名に\"=\"を含めることはできません" -#: command.c:2660 +#: command.c:2491 #, c-format msgid "function name is required" msgstr "関数名が必要です" -#: command.c:2662 +#: command.c:2493 #, c-format msgid "view name is required" msgstr "ビュー名が必要です" -#: command.c:2784 +#: command.c:2615 msgid "Timing is on." msgstr "タイミングは on です。" -#: command.c:2786 +#: command.c:2617 msgid "Timing is off." msgstr "タイミングは off です。" -#: command.c:2872 command.c:2910 command.c:4344 command.c:4347 command.c:4350 -#: command.c:4356 command.c:4358 command.c:4384 command.c:4394 command.c:4406 -#: command.c:4420 command.c:4447 command.c:4505 common.c:77 copy.c:329 -#: copy.c:401 psqlscanslash.l:797 psqlscanslash.l:809 psqlscanslash.l:827 +#: 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:2899 copy.c:388 +#: command.c:2730 copy.c:388 #, c-format msgid "%s: %s" msgstr "%s: %s" -#: command.c:2971 command.c:3037 +#: command.c:2802 command.c:2868 #, c-format msgid "\\watch: interval value is specified more than once" msgstr "\\watch: インターバル値が2回以上指定されました" -#: command.c:2981 command.c:3047 +#: command.c:2812 command.c:2878 #, c-format msgid "\\watch: incorrect interval value \"%s\"" msgstr "\\watch: 不正なインターバル値 \"%s\"" -#: command.c:2991 +#: command.c:2822 #, c-format msgid "\\watch: iteration count is specified more than once" msgstr "\\watch: 反復回数が2回以上指定されました" -#: command.c:3001 +#: command.c:2832 #, c-format msgid "\\watch: incorrect iteration count \"%s\"" msgstr "\\watch: 不正な反復回数 '%s'" -#: command.c:3011 +#: command.c:2842 #, c-format msgid "\\watch: minimum row count specified more than once" msgstr "\\watch: 詐称行数が2回以上指定されました" -#: command.c:3021 +#: command.c:2852 #, c-format msgid "\\watch: incorrect minimum row count \"%s\"" msgstr "\\watch: 不正な最小行数 \"%s\"" -#: command.c:3028 +#: command.c:2859 #, c-format msgid "\\watch: unrecognized parameter \"%s\"" msgstr "\\watch: 認識できないパラーメータ \"%s\"" -#: command.c:3434 startup.c:243 startup.c:293 +#: command.c:3256 startup.c:243 startup.c:293 msgid "Password: " msgstr "パスワード: " -#: command.c:3439 startup.c:290 +#: command.c:3261 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "ユーザー %s のパスワード: " -#: command.c:3495 +#: command.c:3317 #, c-format msgid "Do not give user, host, or port separately when using a connection string" msgstr "接続文字列使用時はユーザー、ホストおよびポートは個別に指定しないでください" -#: command.c:3530 +#: command.c:3352 #, c-format msgid "No database connection exists to re-use parameters from" msgstr "パラメータ再利用に使用可能なデータベース接続がありません" -#: command.c:3837 +#: command.c:3659 #, c-format msgid "Previous connection kept" msgstr "以前の接続は保持されています" -#: command.c:3843 +#: command.c:3665 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3899 +#: 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:3902 +#: 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:3908 +#: 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:3911 +#: 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:3916 +#: command.c:3738 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "データベース\"%s\"にユーザー\"%s\"として接続しました。\n" -#: command.c:4022 +#: command.c:3844 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s、サーバー %s)\n" -#: command.c:4035 +#: command.c:3857 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -493,33 +497,33 @@ msgstr "" "警告: %s のメジャーバージョンは %s ですが、サーバーのメジャーバージョンは %s です。\n" " psql の機能の中で、動作しないものがあるかもしれません。\n" -#: command.c:4074 +#: command.c:3896 #, c-format msgid "SSL connection (protocol: %s, cipher: %s, compression: %s, ALPN: %s)\n" msgstr "SSL接続(プロトコル: %s、暗号化方式: %s、圧縮: %s、ALPN: %s)\n" -#: command.c:4075 command.c:4076 +#: command.c:3897 command.c:3898 msgid "unknown" msgstr "不明" -#: command.c:4077 help.c:39 +#: command.c:3899 help.c:42 msgid "off" msgstr "オフ" -#: command.c:4077 help.c:39 +#: command.c:3899 help.c:42 msgid "on" msgstr "オン" -#: command.c:4078 +#: command.c:3900 msgid "none" msgstr "なし" -#: command.c:4092 +#: command.c:3914 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "GSSAPI暗号化接続\n" -#: command.c:4112 +#: command.c:3934 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -530,283 +534,283 @@ msgstr "" " 8ビット文字が正しく表示されない可能性があります。詳細はpsqlリファレンスマニュアルの\n" " \"Windowsユーザー向けの注意\" (Notes for Windows users)を参照してください。\n" -#: command.c:4219 +#: 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:4249 +#: command.c:4071 #, c-format msgid "could not start editor \"%s\"" msgstr "エディタ\"%s\"を起動できませんでした" -#: command.c:4251 +#: command.c:4073 #, c-format msgid "could not start /bin/sh" msgstr "/bin/shを起動できませんでした" -#: command.c:4301 +#: command.c:4123 #, c-format msgid "could not locate temporary directory: %s" msgstr "一時ディレクトリが見つかりませんでした: %s" -#: command.c:4328 +#: command.c:4150 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "一時ファイル\"%s\"をオープンできませんでした: %m" -#: command.c:4664 +#: command.c:4486 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: 曖昧な短縮形\"%s\"が\"%s\"と\"%s\"のどちらにも合致します" -#: command.c:4684 +#: 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:4703 +#: command.c:4525 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: 有効な線のスタイルは ascii, old-ascii, unicode" -#: command.c:4718 +#: command.c:4540 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: 有効な Unicode 罫線のスタイルは single, double" -#: command.c:4733 +#: command.c:4555 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: 有効な Unicode 列罫線のスタイルは single, double" -#: command.c:4748 +#: command.c:4570 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: 有効な Unicode ヘッダー罫線のスタイルは single, double" -#: command.c:4800 +#: 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:4817 +#: command.c:4639 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsepは単一の1バイト文字でなければなりません" -#: command.c:4822 +#: 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:4960 command.c:5161 +#: command.c:4782 command.c:4983 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: 未定義のオプション:%s" -#: command.c:4980 +#: command.c:4802 #, c-format msgid "Border style is %d.\n" msgstr "罫線スタイルは %d です。\n" -#: command.c:4986 +#: command.c:4808 #, c-format msgid "Target width is unset.\n" msgstr "ターゲットの幅が設定されていません。\n" -#: command.c:4988 +#: command.c:4810 #, c-format msgid "Target width is %d.\n" msgstr "ターゲットの幅は %d です。\n" -#: command.c:4995 +#: command.c:4817 #, c-format msgid "Expanded display is on.\n" msgstr "拡張表示は on です。\n" -#: command.c:4997 +#: command.c:4819 #, c-format msgid "Expanded display is used automatically.\n" msgstr "拡張表示が自動的に使われます。\n" -#: command.c:4999 +#: command.c:4821 #, c-format msgid "Expanded display is off.\n" msgstr "拡張表示は off です。\n" -#: command.c:5006 command.c:5008 command.c:5010 +#: command.c:4828 command.c:4830 command.c:4832 #, c-format msgid "Expanded header width is \"%s\".\n" msgstr "拡張表示ヘッダ幅は\"%s\"です。\n" -#: command.c:5012 +#: command.c:4834 #, c-format msgid "Expanded header width is %d.\n" msgstr "拡張表示ヘッダ幅は%dです。\n" -#: command.c:5018 +#: command.c:4840 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "CSVのフィールド区切り文字は\"%s\"です。\n" -#: command.c:5026 command.c:5034 +#: command.c:4848 command.c:4856 #, c-format msgid "Field separator is zero byte.\n" msgstr "フィールド区切り文字はゼロバイトです。\n" -#: command.c:5028 +#: command.c:4850 #, c-format msgid "Field separator is \"%s\".\n" msgstr "フィールド区切り文字は\"%s\"です。\n" -#: command.c:5041 +#: command.c:4863 #, c-format msgid "Default footer is on.\n" msgstr "デフォルトフッター(行数の表示)は on です。\n" -#: command.c:5043 +#: command.c:4865 #, c-format msgid "Default footer is off.\n" msgstr "デフォルトフッター(行数の表示)は off です。\n" -#: command.c:5049 +#: command.c:4871 #, c-format msgid "Output format is %s.\n" msgstr "出力形式は %s です。\n" -#: command.c:5055 +#: command.c:4877 #, c-format msgid "Line style is %s.\n" msgstr "線のスタイルは %s です。\n" -#: command.c:5062 +#: command.c:4884 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null表示は\"%s\"です。\n" -#: command.c:5070 +#: command.c:4892 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "『数値出力時のロケール調整』は on です。\n" -#: command.c:5072 +#: command.c:4894 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "『数値出力時のロケール調整』は off です。\n" -#: command.c:5079 +#: command.c:4901 #, c-format msgid "Pager is used for long output.\n" msgstr "表示が縦に長くなる場合はページャーを使います。\n" -#: command.c:5081 +#: command.c:4903 #, c-format msgid "Pager is always used.\n" msgstr "常にページャーを使います。\n" -#: command.c:5083 +#: command.c:4905 #, c-format msgid "Pager usage is off.\n" msgstr "「ページャーを使う」は off です。\n" -#: command.c:5089 +#: 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:5099 command.c:5109 +#: command.c:4921 command.c:4931 #, c-format msgid "Record separator is zero byte.\n" msgstr "レコードの区切り文字はゼロバイトです\n" -#: command.c:5101 +#: command.c:4923 #, c-format msgid "Record separator is .\n" msgstr "レコード区切り文字はです。\n" -#: command.c:5103 +#: command.c:4925 #, c-format msgid "Record separator is \"%s\".\n" msgstr "レコード区切り記号は\"%s\"です。\n" -#: command.c:5116 +#: command.c:4938 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "テーブル属性は\"%s\"です。\n" -#: command.c:5119 +#: command.c:4941 #, c-format msgid "Table attributes unset.\n" msgstr "テーブル属性は設定されていません。\n" -#: command.c:5126 +#: command.c:4948 #, c-format msgid "Title is \"%s\".\n" msgstr "タイトルは\"%s\"です。\n" -#: command.c:5128 +#: command.c:4950 #, c-format msgid "Title is unset.\n" msgstr "タイトルは設定されていません。\n" -#: command.c:5135 +#: command.c:4957 #, c-format msgid "Tuples only is on.\n" msgstr "「タプルのみ表示」は on です。\n" -#: command.c:5137 +#: command.c:4959 #, c-format msgid "Tuples only is off.\n" msgstr "「タプルのみ表示」は off です。\n" -#: command.c:5143 +#: command.c:4965 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Unicode の罫線スタイルは\"%s\"です。\n" -#: command.c:5149 +#: command.c:4971 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Unicode 行罫線のスタイルは\"%s\"です。\n" -#: command.c:5155 +#: command.c:4977 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Unicodeヘッダー行のスタイルは\"%s\"です。\n" -#: command.c:5404 +#: command.c:5226 #, c-format msgid "\\!: failed" msgstr "\\!: 失敗" -#: command.c:5442 +#: command.c:5264 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watchは空の問い合わせでは使えません" -#: command.c:5474 +#: command.c:5296 #, c-format msgid "could not set timer: %m" msgstr "タイマーを設定できません: %m" -#: command.c:5543 +#: command.c:5365 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (%g 秒毎)\n" -#: command.c:5546 +#: command.c:5368 #, c-format msgid "%s (every %gs)\n" msgstr "%s (%g 秒毎)\n" -#: command.c:5610 +#: command.c:5432 #, c-format msgid "could not wait for signals: %m" msgstr "シグナルを待機できませんでした: %m" -#: command.c:5666 command.c:5673 common.c:632 common.c:639 common.c:1123 +#: command.c:5488 command.c:5495 common.c:632 common.c:639 common.c:1123 #, c-format msgid "" "/******** QUERY *********/\n" @@ -819,12 +823,12 @@ msgstr "" "/************************/\n" "\n" -#: command.c:5852 +#: command.c:5674 #, c-format msgid "\"%s.%s\" is not a view" msgstr "\"%s.%s\"はビューではありません" -#: command.c:5868 +#: command.c:5690 #, c-format msgid "could not parse reloptions array" msgstr "reloptions配列をパースできませんでした" @@ -884,7 +888,7 @@ msgstr "時間: %.3f ミリ秒 (%02d:%02d:%06.3f)\n" msgid "Time: %.3f ms (%.0f d %02d:%02d:%06.3f)\n" msgstr "時間: %.3f ミリ秒 (%.0f 日 %02d:%02d:%06.3f)\n" -#: common.c:626 common.c:683 common.c:1094 describe.c:6366 +#: common.c:626 common.c:683 common.c:1094 describe.c:6192 #, c-format msgid "You are currently not connected to a database." msgstr "現在データベースに接続していません。" @@ -940,14 +944,14 @@ msgstr "文: %s" msgid "unexpected transaction status (%d)" msgstr "想定外のトランザクション状態(%d)" -#: common.c:1362 describe.c:2059 +#: common.c:1362 describe.c:2025 msgid "Column" msgstr "列" -#: common.c:1363 describe.c:176 describe.c:362 describe.c:380 describe.c:1081 -#: describe.c:1239 describe.c:1769 describe.c:1793 describe.c:2060 -#: describe.c:4056 describe.c:4320 describe.c:4567 describe.c:4727 -#: describe.c:6003 +#: 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 "タイプ" @@ -956,7 +960,7 @@ msgstr "タイプ" msgid "The command has no result, or the result has no columns.\n" msgstr "このコマンドは結果を返却しないか、結果にカラムが含まれません。\n" -#: common.c:1526 +#: common.c:1504 #, c-format msgid "fetching results in chunked mode failed" msgstr "チャンクモードでの結果の取得に失敗しました" @@ -1013,11 +1017,11 @@ msgstr "" "コピーするデータに続いて改行を入力してください。\n" "バックスラッシュとピリオドだけの行、もしくは EOF シグナルで終了します。" -#: copy.c:693 +#: copy.c:684 msgid "aborted because of read failure" msgstr "読み取りエラーのため中止" -#: copy.c:727 +#: copy.c:718 msgid "trying to exit copy mode" msgstr "コピーモードを終了しようとしています。" @@ -1066,1263 +1070,1161 @@ msgstr "\\crosstabview: 列名があいまいです: \"%s\"" msgid "\\crosstabview: column name not found: \"%s\"" msgstr "\\crosstabview: 列名が見つかりませんでした: \"%s\"" -#: describe.c:94 describe.c:342 describe.c:649 describe.c:826 describe.c:1073 -#: describe.c:1228 describe.c:1302 describe.c:4045 describe.c:4307 -#: describe.c:4565 describe.c:4646 describe.c:4878 describe.c:5090 -#: describe.c:5339 describe.c:5580 describe.c:5649 describe.c:5660 -#: describe.c:5716 describe.c:6115 describe.c:6192 +#: 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:95 describe.c:173 describe.c:234 describe.c:343 describe.c:650 -#: describe.c:827 describe.c:958 describe.c:1074 describe.c:1303 -#: describe.c:4046 describe.c:4308 describe.c:4482 describe.c:4566 -#: describe.c:4647 describe.c:4808 describe.c:4879 describe.c:5091 -#: describe.c:5212 describe.c:5340 describe.c:5581 describe.c:5650 -#: describe.c:5661 describe.c:5717 describe.c:5914 describe.c:5984 -#: describe.c:6190 describe.c:6417 describe.c:6763 +#: 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:96 describe.c:355 describe.c:373 +#: describe.c:89 describe.c:348 describe.c:366 msgid "Result data type" msgstr "結果のデータ型" -#: describe.c:97 describe.c:356 describe.c:374 +#: describe.c:90 describe.c:349 describe.c:367 msgid "Argument data types" msgstr "引数のデータ型" -#: describe.c:105 describe.c:112 describe.c:184 describe.c:248 describe.c:432 -#: describe.c:681 describe.c:846 describe.c:1010 describe.c:1305 -#: describe.c:2080 describe.c:3772 describe.c:4104 describe.c:4361 -#: describe.c:4506 describe.c:4579 describe.c:4656 describe.c:4821 -#: describe.c:5003 describe.c:5149 describe.c:5221 describe.c:5341 -#: describe.c:5491 describe.c:5532 describe.c:5597 describe.c:5653 -#: describe.c:5662 describe.c:5718 describe.c:5932 describe.c:6006 -#: describe.c:6129 describe.c:6193 describe.c:7299 +#: 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:134 +#: describe.c:127 msgid "List of aggregate functions" msgstr "集約関数一覧" -#: describe.c:159 +#: describe.c:152 #, c-format msgid "The server (version %s) does not support access methods." msgstr "このサーバー(バージョン%s)はアクセスメソッドをサポートしていません。" -#: describe.c:174 +#: describe.c:167 msgid "Index" msgstr "インデックス" -#: describe.c:175 describe.c:4064 describe.c:4333 describe.c:6116 +#: describe.c:168 describe.c:3964 describe.c:4180 describe.c:5942 msgid "Table" msgstr "テーブル" -#: describe.c:183 describe.c:5916 +#: describe.c:176 describe.c:5742 msgid "Handler" msgstr "ハンドラ" -#: describe.c:206 +#: describe.c:199 msgid "List of access methods" msgstr "アクセスメソッド一覧" -#: describe.c:235 describe.c:415 describe.c:674 describe.c:959 describe.c:1227 -#: describe.c:4057 describe.c:4309 describe.c:4483 describe.c:4810 -#: describe.c:5213 describe.c:5915 describe.c:5985 describe.c:6418 -#: describe.c:6639 describe.c:6764 describe.c:6934 describe.c:7019 -#: describe.c:7287 +#: 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:236 +#: describe.c:229 msgid "Location" msgstr "場所" -#: describe.c:246 describe.c:3613 describe.c:3953 +#: describe.c:239 describe.c:3517 describe.c:3857 msgid "Options" msgstr "オプション" -#: describe.c:247 describe.c:672 describe.c:1008 describe.c:4103 +#: describe.c:240 describe.c:649 describe.c:970 describe.c:3999 msgid "Size" msgstr "サイズ" -#: describe.c:270 +#: describe.c:263 msgid "List of tablespaces" msgstr "テーブル空間一覧" -#: describe.c:315 +#: describe.c:308 #, c-format -msgid "\\df only takes [anptwSx+] as options" -msgstr "\\dfで指定できるオプションは [anptwSx+] のみです" +msgid "\\df only takes [anptwS+] as options" +msgstr "\\dfで指定できるオプションは [anptwS+] のみです" -#: describe.c:323 +#: 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:358 describe.c:376 +#: describe.c:351 describe.c:369 msgid "agg" msgstr "集約" -#: describe.c:359 describe.c:377 +#: describe.c:352 describe.c:370 msgid "window" msgstr "ウィンドウ" -#: describe.c:360 +#: describe.c:353 msgid "proc" msgstr "プロシージャ" -#: describe.c:361 describe.c:379 +#: describe.c:354 describe.c:372 msgid "func" msgstr "関数" -#: describe.c:378 describe.c:1435 +#: describe.c:371 describe.c:1397 msgid "trigger" msgstr "トリガー" -#: describe.c:393 +#: describe.c:383 msgid "immutable" msgstr "IMMUTABLE" -#: describe.c:394 +#: describe.c:384 msgid "stable" msgstr "STABLE" -#: describe.c:395 +#: describe.c:385 msgid "volatile" msgstr "VOLATILE" -#: describe.c:396 +#: describe.c:386 msgid "Volatility" msgstr "関数の変動性分類" -#: describe.c:407 +#: describe.c:394 msgid "restricted" msgstr "制限付き" -#: describe.c:408 +#: describe.c:395 msgid "safe" msgstr "安全" -#: describe.c:409 +#: describe.c:396 msgid "unsafe" msgstr "危険" -#: describe.c:410 +#: describe.c:397 msgid "Parallel" msgstr "並列実行" -#: describe.c:416 +#: describe.c:402 msgid "definer" msgstr "定義ロール" -#: describe.c:417 +#: describe.c:403 msgid "invoker" msgstr "起動ロール" -#: describe.c:418 +#: describe.c:404 msgid "Security" msgstr "セキュリティ" -#: describe.c:419 describe.c:837 describe.c:1774 describe.c:1798 -#: describe.c:1927 describe.c:4650 describe.c:4991 describe.c:5000 -#: describe.c:5138 describe.c:5143 describe.c:6922 describe.c:7121 -msgid "yes" -msgstr "はい" - -#: describe.c:420 describe.c:838 describe.c:1775 describe.c:1799 -#: describe.c:1928 describe.c:4650 describe.c:4988 describe.c:5001 -#: describe.c:5138 describe.c:6923 describe.c:7122 -msgid "no" -msgstr "いいえ" - -#: describe.c:421 describe.c:839 describe.c:5002 describe.c:7123 -msgid "Leakproof?" -msgstr "無漏洩?" - -#: describe.c:426 +#: describe.c:409 msgid "Language" msgstr "手続き言語" -#: describe.c:429 describe.c:671 +#: describe.c:412 describe.c:648 msgid "Internal name" msgstr "内部名" -#: describe.c:608 +#: describe.c:585 msgid "List of functions" msgstr "関数一覧" -#: describe.c:673 +#: describe.c:650 msgid "Elements" msgstr "構成要素" -#: describe.c:724 +#: describe.c:701 msgid "List of data types" msgstr "データ型一覧" -#: describe.c:828 +#: describe.c:804 msgid "Left arg type" msgstr "左辺の型" -#: describe.c:829 +#: describe.c:805 msgid "Right arg type" msgstr "右辺の型" -#: describe.c:830 +#: describe.c:806 msgid "Result type" msgstr "結果の型" -#: describe.c:836 describe.c:4816 describe.c:4980 describe.c:5490 -#: describe.c:7217 describe.c:7221 +#: describe.c:811 describe.c:4653 describe.c:4817 describe.c:5316 +#: describe.c:6996 describe.c:7000 msgid "Function" msgstr "関数" -#: describe.c:923 +#: describe.c:891 msgid "List of operators" msgstr "演算子一覧" -#: describe.c:960 +#: describe.c:926 msgid "Encoding" msgstr "エンコーディング" -#: describe.c:968 describe.c:972 +#: describe.c:930 describe.c:934 msgid "Locale Provider" msgstr "ロケールプロバイダー" -#: describe.c:976 describe.c:5110 +#: describe.c:938 describe.c:4936 msgid "Collate" msgstr "照合順序" -#: describe.c:977 describe.c:5111 +#: describe.c:939 describe.c:4937 msgid "Ctype" msgstr "Ctype(変換演算子)" -#: describe.c:981 describe.c:985 describe.c:989 describe.c:5116 describe.c:5120 -#: describe.c:5124 +#: describe.c:943 describe.c:947 describe.c:951 describe.c:4942 describe.c:4946 +#: describe.c:4950 msgid "Locale" msgstr "ロケール" -#: describe.c:993 describe.c:997 describe.c:5129 describe.c:5133 +#: describe.c:955 describe.c:959 describe.c:4955 describe.c:4959 msgid "ICU Rules" msgstr "ICUルール:" -#: describe.c:1009 +#: describe.c:971 msgid "Tablespace" msgstr "テーブル空間" -#: describe.c:1034 +#: describe.c:996 msgid "List of databases" msgstr "データベース一覧" -#: describe.c:1075 describe.c:1230 describe.c:4047 +#: describe.c:1037 describe.c:1192 describe.c:3947 msgid "table" msgstr "テーブル" -#: describe.c:1076 describe.c:4048 +#: describe.c:1038 describe.c:3948 msgid "view" msgstr "ビュー" -#: describe.c:1077 describe.c:4049 +#: describe.c:1039 describe.c:3949 msgid "materialized view" msgstr "実体化ビュー" -#: describe.c:1078 describe.c:1232 describe.c:4051 +#: describe.c:1040 describe.c:1194 describe.c:3951 msgid "sequence" msgstr "シーケンス" -#: describe.c:1079 describe.c:4053 +#: describe.c:1041 describe.c:3953 msgid "foreign table" msgstr "外部テーブル" -#: describe.c:1080 describe.c:4054 describe.c:4318 +#: describe.c:1042 describe.c:3954 describe.c:4165 msgid "partitioned table" msgstr "パーティションテーブル" -#: describe.c:1096 +#: describe.c:1058 msgid "Column privileges" msgstr "列の権限" -#: describe.c:1127 describe.c:1161 +#: describe.c:1089 describe.c:1123 msgid "Policies" msgstr "ポリシー" -#: describe.c:1189 describe.c:4733 describe.c:6879 +#: describe.c:1151 describe.c:4570 describe.c:6667 msgid "Access privileges" msgstr "アクセス権限" -#: describe.c:1234 +#: describe.c:1196 msgid "function" msgstr "関数" -#: describe.c:1236 +#: describe.c:1198 msgid "type" msgstr "型" -#: describe.c:1238 +#: describe.c:1200 msgid "schema" msgstr "スキーマ" -#: describe.c:1260 +#: describe.c:1222 msgid "Default access privileges" msgstr "デフォルトのアクセス権限" -#: describe.c:1304 +#: describe.c:1266 msgid "Object" msgstr "オブジェクト" -#: describe.c:1318 +#: describe.c:1280 msgid "table constraint" msgstr "テーブル制約" -#: describe.c:1342 +#: describe.c:1304 msgid "domain constraint" msgstr "ドメイン制約" -#: describe.c:1366 +#: describe.c:1328 msgid "operator class" msgstr "演算子クラス" -#: describe.c:1390 +#: describe.c:1352 msgid "operator family" msgstr "演算子族" -#: describe.c:1413 +#: describe.c:1375 msgid "rule" msgstr "ルール" -#: describe.c:1458 +#: describe.c:1420 msgid "Object descriptions" msgstr "オブジェクトの説明" -#: describe.c:1523 +#: describe.c:1485 describe.c:4072 #, c-format msgid "Did not find any relation named \"%s\"." msgstr "\"%s\"という名前のリレーションは見つかりませんでした。" -#: describe.c:1526 describe.c:4205 +#: describe.c:1488 describe.c:4075 #, c-format msgid "Did not find any relations." msgstr "リレーションが見つかりませんでした。" -#: describe.c:1722 +#: describe.c:1684 #, c-format msgid "Did not find any relation with OID %s." msgstr "OID %sを持つリレーションが見つかりませんでした。" -#: describe.c:1770 describe.c:1794 +#: describe.c:1732 describe.c:1756 msgid "Start" msgstr "開始" -#: describe.c:1771 describe.c:1795 +#: describe.c:1733 describe.c:1757 msgid "Minimum" msgstr "最小" -#: describe.c:1772 describe.c:1796 +#: describe.c:1734 describe.c:1758 msgid "Maximum" msgstr "最大" -#: describe.c:1773 describe.c:1797 +#: describe.c:1735 describe.c:1759 msgid "Increment" msgstr "増分" -#: describe.c:1776 describe.c:1800 +#: 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:1737 describe.c:1761 describe.c:1890 describe.c:4487 +#: describe.c:4825 describe.c:4964 describe.c:6711 +msgid "no" +msgstr "いいえ" + +#: describe.c:1738 describe.c:1762 msgid "Cycles?" msgstr "循環?" -#: describe.c:1777 describe.c:1801 +#: describe.c:1739 describe.c:1763 msgid "Cache" msgstr "キャッシュ" -#: describe.c:1842 +#: describe.c:1804 #, c-format msgid "Owned by: %s" msgstr "所有者: %s" -#: describe.c:1846 +#: describe.c:1808 #, c-format msgid "Sequence for identity column: %s" msgstr "識別列のシーケンス: %s" -#: describe.c:1854 +#: describe.c:1816 #, c-format msgid "Unlogged sequence \"%s.%s\"" msgstr "ログ出力なしのシーケンス\"%s.%s\"" -#: describe.c:1857 +#: describe.c:1819 #, c-format msgid "Sequence \"%s.%s\"" msgstr "シーケンス \"%s.%s\"" -#: describe.c:2000 +#: describe.c:1962 #, c-format msgid "Unlogged table \"%s.%s\"" msgstr "ログ出力なしのテーブル\"%s.%s\"" -#: describe.c:2003 +#: describe.c:1965 #, c-format msgid "Table \"%s.%s\"" msgstr "テーブル\"%s.%s\"" -#: describe.c:2007 +#: describe.c:1969 #, c-format msgid "View \"%s.%s\"" msgstr "ビュー\"%s.%s\"" -#: describe.c:2011 +#: describe.c:1974 +#, c-format +msgid "Unlogged materialized view \"%s.%s\"" +msgstr "ログ出力なしの実体化ビュー\"%s.%s\"" + +#: describe.c:1977 #, c-format msgid "Materialized view \"%s.%s\"" msgstr "実体化ビュー\"%s.%s\"" -#: describe.c:2016 +#: describe.c:1982 #, c-format msgid "Unlogged index \"%s.%s\"" msgstr "ログ出力なしのインデックス\"%s.%s\"" -#: describe.c:2019 +#: describe.c:1985 #, c-format msgid "Index \"%s.%s\"" msgstr "インデックス\"%s.%s\"" -#: describe.c:2024 +#: describe.c:1990 #, c-format msgid "Unlogged partitioned index \"%s.%s\"" msgstr "ログ出力なしのパーティション親インデックス\"%s.%s\"" -#: describe.c:2027 +#: describe.c:1993 #, c-format msgid "Partitioned index \"%s.%s\"" msgstr "パーティションインデックス\"%s.%s\"" -#: describe.c:2031 +#: describe.c:1997 #, c-format msgid "TOAST table \"%s.%s\"" msgstr "TOAST テーブル\"%s.%s\"" -#: describe.c:2035 +#: describe.c:2001 #, c-format msgid "Composite type \"%s.%s\"" msgstr "複合型\"%s.%s\"" -#: describe.c:2039 +#: describe.c:2005 #, c-format msgid "Foreign table \"%s.%s\"" msgstr "外部テーブル\"%s.%s\"" -#: describe.c:2044 +#: describe.c:2010 #, c-format msgid "Unlogged partitioned table \"%s.%s\"" msgstr "ログ出力なしのパーティション親テーブル\"%s.%s\"" -#: describe.c:2047 +#: describe.c:2013 #, c-format msgid "Partitioned table \"%s.%s\"" msgstr "パーティションテーブル\"%s.%s\"" -#: describe.c:2063 describe.c:4568 +#: describe.c:2029 describe.c:4405 msgid "Collation" msgstr "照合順序" -#: describe.c:2064 describe.c:4569 +#: describe.c:2030 describe.c:4406 msgid "Nullable" msgstr "Null 値を許容" -#: describe.c:2065 describe.c:4570 +#: describe.c:2031 describe.c:4407 msgid "Default" msgstr "デフォルト" -#: describe.c:2068 +#: describe.c:2034 msgid "Key?" msgstr "キー?" -#: describe.c:2070 describe.c:4886 describe.c:4897 +#: describe.c:2036 describe.c:4723 describe.c:4734 msgid "Definition" msgstr "定義" -#: describe.c:2072 describe.c:5931 describe.c:6005 describe.c:6070 -#: describe.c:6128 +#: describe.c:2038 describe.c:5757 describe.c:5831 describe.c:5896 +#: describe.c:5954 msgid "FDW options" msgstr "FDW オプション" -#: describe.c:2074 +#: describe.c:2040 msgid "Storage" msgstr "ストレージ" -#: describe.c:2076 +#: describe.c:2042 msgid "Compression" msgstr "圧縮" -#: describe.c:2078 +#: describe.c:2044 msgid "Stats target" msgstr "統計目標" -#: describe.c:2214 +#: describe.c:2180 #, c-format msgid "Partition of: %s %s%s" msgstr "親パーティション: %s %s%s" -#: describe.c:2227 +#: describe.c:2193 msgid "No partition constraint" msgstr "パーティション制約なし" -#: describe.c:2229 +#: describe.c:2195 #, c-format msgid "Partition constraint: %s" msgstr "パーティションの制約: %s" -#: describe.c:2253 +#: describe.c:2219 #, c-format msgid "Partition key: %s" msgstr "パーティションキー: %s" -#: describe.c:2279 +#: describe.c:2245 #, c-format msgid "Owning table: \"%s.%s\"" msgstr "所属先テーブル\"%s.%s\"" -#: describe.c:2352 +#: describe.c:2314 msgid "primary key, " msgstr "プライマリキー, " -#: describe.c:2355 +#: describe.c:2317 msgid "unique" msgstr "ユニーク" -#: describe.c:2357 +#: describe.c:2319 msgid " nulls not distinct" msgstr " nulls not distinct" -#: describe.c:2358 +#: describe.c:2320 msgid ", " msgstr ", " -#: describe.c:2365 +#: describe.c:2327 #, c-format msgid "for table \"%s.%s\"" msgstr "テーブル\"%s.%s\"用" -#: describe.c:2369 +#: describe.c:2331 #, c-format msgid ", predicate (%s)" msgstr "、述語 (%s)" -#: describe.c:2372 +#: describe.c:2334 msgid ", clustered" msgstr "、クラスター化" -#: describe.c:2375 +#: describe.c:2337 msgid ", invalid" msgstr "無効" -#: describe.c:2378 +#: describe.c:2340 msgid ", deferrable" msgstr "、遅延可能" -#: describe.c:2381 +#: describe.c:2343 msgid ", initially deferred" msgstr "、最初から遅延中" -#: describe.c:2384 +#: describe.c:2346 msgid ", replica identity" msgstr "、レプリカの id" -#: describe.c:2445 +#: describe.c:2400 msgid "Indexes:" msgstr "インデックス:" -#: describe.c:2533 +#: describe.c:2483 msgid "Check constraints:" msgstr "Check 制約:" -#: describe.c:2601 +#: describe.c:2551 msgid "Foreign-key constraints:" msgstr "外部キー制約:" -#: describe.c:2664 +#: describe.c:2614 msgid "Referenced by:" msgstr "参照元:" -#: describe.c:2714 +#: describe.c:2664 msgid "Policies:" msgstr "ポリシー:" -#: describe.c:2717 +#: describe.c:2667 msgid "Policies (forced row security enabled):" msgstr "ポリシー(行セキュリティを強制的に有効化):" -#: describe.c:2720 +#: describe.c:2670 msgid "Policies (row security enabled): (none)" msgstr "ポリシー(行セキュリティ有効化): (なし)" -#: describe.c:2723 +#: describe.c:2673 msgid "Policies (forced row security enabled): (none)" msgstr "ポリシー(行セキュリティを強制的に有効化): (なし)" -#: describe.c:2726 +#: describe.c:2676 msgid "Policies (row security disabled):" msgstr "ポリシー(行セキュリティを無効化):" -#: describe.c:2786 describe.c:2891 +#: describe.c:2736 describe.c:2841 msgid "Statistics objects:" msgstr "統計オブジェクト:" -#: describe.c:2993 describe.c:3190 +#: describe.c:2943 describe.c:3096 msgid "Rules:" msgstr "ルール:" -#: describe.c:2996 +#: describe.c:2946 msgid "Disabled rules:" msgstr "無効化されたルール:" -#: describe.c:2999 +#: describe.c:2949 msgid "Rules firing always:" msgstr "常に適用するルール:" -#: describe.c:3002 +#: describe.c:2952 msgid "Rules firing on replica only:" msgstr "レプリカ上でのみ適用するルール:" -#: describe.c:3081 describe.c:5274 +#: describe.c:3031 describe.c:5100 msgid "Publications:" msgstr "パブリケーション:" -#: describe.c:3127 -msgid "Not-null constraints:" -msgstr "非NULL制約:" - -#: describe.c:3140 -msgid " (local, inherited)" -msgstr "(ローカル、継承)" - -#: describe.c:3141 -msgid " (inherited)" -msgstr "(継承)" - -#: describe.c:3173 +#: describe.c:3079 msgid "View definition:" msgstr "ビューの定義:" -#: describe.c:3336 +#: describe.c:3242 msgid "Triggers:" msgstr "トリガー:" -#: describe.c:3339 +#: describe.c:3245 msgid "Disabled user triggers:" msgstr "無効化されたユーザートリガ:" -#: describe.c:3342 +#: describe.c:3248 msgid "Disabled internal triggers:" msgstr "無効化された内部トリガー:" -#: describe.c:3345 +#: describe.c:3251 msgid "Triggers firing always:" msgstr "常に適用するするトリガー:" -#: describe.c:3348 +#: describe.c:3254 msgid "Triggers firing on replica only:" msgstr "レプリカ上でのみ適用するトリガー:" -#: describe.c:3419 +#: describe.c:3325 #, c-format msgid "Server: %s" msgstr "サーバー: %s" -#: describe.c:3427 +#: describe.c:3333 #, c-format msgid "FDW options: (%s)" msgstr "FDW オプション: (%s)" -#: describe.c:3448 +#: describe.c:3354 msgid "Inherits" msgstr "継承元" -#: describe.c:3513 +#: describe.c:3419 #, c-format msgid "Number of partitions: %d" msgstr "パーティション数: %d" -#: describe.c:3522 +#: describe.c:3428 #, c-format msgid "Number of partitions: %d (Use \\d+ to list them.)" msgstr "パーティション数: %d (\\d+ で一覧を表示)。" -#: describe.c:3524 +#: describe.c:3430 #, c-format msgid "Number of child tables: %d (Use \\d+ to list them.)" msgstr "子テーブル数: %d (\\d+ で一覧を表示)" -#: describe.c:3531 +#: describe.c:3437 msgid "Child tables" msgstr "子テーブル" -#: describe.c:3531 +#: describe.c:3437 msgid "Partitions" msgstr "パーティション" -#: describe.c:3564 +#: describe.c:3470 #, c-format msgid "Typed table of type: %s" msgstr "%s 型の型付きテーブル" -#: describe.c:3582 +#: describe.c:3486 msgid "Replica Identity" msgstr "レプリカ識別" -#: describe.c:3595 +#: describe.c:3499 msgid "Has OIDs: yes" msgstr "OID あり: はい" -#: describe.c:3604 +#: describe.c:3508 #, c-format msgid "Access method: %s" msgstr "アクセスメソッド: %s" -#: describe.c:3681 +#: 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:3693 +#: describe.c:3597 #, c-format msgid ", tablespace \"%s\"" msgstr "、テーブル空間\"%s\"" -#: describe.c:3766 +#: describe.c:3670 msgid "List of roles" msgstr "ロール一覧" -#: describe.c:3768 describe.c:3936 +#: describe.c:3672 describe.c:3840 msgid "Role name" msgstr "ロール名" -#: describe.c:3769 +#: describe.c:3673 msgid "Attributes" msgstr "属性" -#: describe.c:3780 +#: describe.c:3684 msgid "Superuser" msgstr "スーパーユーザー" -#: describe.c:3783 +#: describe.c:3687 msgid "No inheritance" msgstr "継承なし" -#: describe.c:3786 +#: describe.c:3690 msgid "Create role" msgstr "ロール作成可" -#: describe.c:3789 +#: describe.c:3693 msgid "Create DB" msgstr "DB作成可" -#: describe.c:3792 +#: describe.c:3696 msgid "Cannot login" msgstr "ログインできません" -#: describe.c:3795 +#: describe.c:3699 msgid "Replication" msgstr "レプリケーション可" -#: describe.c:3799 +#: describe.c:3703 msgid "Bypass RLS" msgstr "RLS のバイパス" -#: describe.c:3808 +#: describe.c:3712 msgid "No connections" msgstr "接続なし" -#: describe.c:3810 +#: describe.c:3714 #, c-format msgid "%d connection" msgid_plural "%d connections" msgstr[0] "%d 個の接続" -#: describe.c:3820 +#: describe.c:3724 msgid "Password valid until " msgstr "パスワードの有効期限 " -#: describe.c:3871 +#: describe.c:3775 msgid "Role" msgstr "ロール" -#: describe.c:3872 +#: describe.c:3776 msgid "Database" msgstr "データベース" -#: describe.c:3873 +#: describe.c:3777 msgid "Settings" msgstr "設定" -#: describe.c:3897 +#: describe.c:3801 #, c-format msgid "Did not find any settings for role \"%s\" and database \"%s\"." msgstr "ロール\"%s\"とデータベース\"%s\"の設定が見つかりませんでした。" -#: describe.c:3900 +#: describe.c:3804 #, c-format msgid "Did not find any settings for role \"%s\"." msgstr "ロール\"%s\"の設定が見つかりませんでした。" -#: describe.c:3903 +#: describe.c:3807 #, c-format msgid "Did not find any settings." msgstr "設定が見つかりませんでした。" -#: describe.c:3907 +#: describe.c:3811 msgid "List of settings" msgstr "設定一覧" -#: describe.c:3937 +#: describe.c:3841 msgid "Member of" msgstr "所属グループ" -#: describe.c:3954 +#: describe.c:3858 msgid "Grantor" msgstr "付与者" -#: describe.c:3980 +#: describe.c:3884 msgid "List of role grants" msgstr "ロール権限付与一覧" -#: describe.c:4050 +#: describe.c:3950 msgid "index" msgstr "インデックス" -#: describe.c:4052 +#: describe.c:3952 msgid "TOAST table" msgstr "TOAST テーブル" -#: describe.c:4055 describe.c:4319 +#: describe.c:3955 describe.c:4166 msgid "partitioned index" msgstr "パーティションインデックス" -#: describe.c:4079 +#: describe.c:3975 msgid "permanent" msgstr "永続" -#: describe.c:4080 +#: describe.c:3976 msgid "temporary" msgstr "一時" -#: describe.c:4081 +#: describe.c:3977 msgid "unlogged" msgstr "ログなし" -#: describe.c:4082 +#: describe.c:3978 msgid "Persistence" msgstr "永続性" -#: describe.c:4098 describe.c:4342 +#: describe.c:3994 msgid "Access method" msgstr "アクセスメソッド" -#: describe.c:4178 -#, c-format -msgid "Did not find any relations named \"%s\"." -msgstr "\"%s\"という名前のリレーションは見つかりませんでした。" - -#: describe.c:4181 -#, c-format -msgid "Did not find any tables named \"%s\"." -msgstr "\"%s\"という名前のテーブルは見つかりませんでした。" - -#: describe.c:4184 -#, c-format -msgid "Did not find any indexes named \"%s\"." -msgstr "\"%s\"という名前のインデックスは見つかりませんでした。" - -#: describe.c:4187 -#, c-format -msgid "Did not find any views named \"%s\"." -msgstr "\"%s\"という名前のビューは見つかりませんでした。" - -#: describe.c:4190 -#, c-format -msgid "Did not find any materialized views named \"%s\"." -msgstr "\"%s\"という名前の実体化ビューは見つかりませんでした。" - -#: describe.c:4193 -#, c-format -msgid "Did not find any sequences named \"%s\"." -msgstr "\"%s\"という名前のシーケンスは見つかりませんでした。" - -#: describe.c:4196 -#, c-format -msgid "Did not find any foreign tables named \"%s\"." -msgstr "\"%s\"という名前の外部テーブルは見つかりませんでした。" - -#: describe.c:4207 -#, c-format -msgid "Did not find any tables." -msgstr "テーブルが見つかりませんでした。" - -#: describe.c:4209 -#, c-format -msgid "Did not find any indexes." -msgstr "インデックスが見つかりませんでした。" - -#: describe.c:4211 -#, c-format -msgid "Did not find any views." -msgstr "ビューが見つかりませんでした。" - -#: describe.c:4213 -#, c-format -msgid "Did not find any materialized views." -msgstr "実体化ビューが見つかりませんでした。" - -#: describe.c:4215 -#, c-format -msgid "Did not find any sequences." -msgstr "シーケンスが見つかりませんでした。" - -#: describe.c:4217 -#, c-format -msgid "Did not find any foreign tables." -msgstr "外部テーブルが見つかりませんでした。" - -#: describe.c:4225 +#: describe.c:4079 msgid "List of relations" msgstr "リレーション一覧" -#: describe.c:4226 -msgid "List of tables" -msgstr "テーブル一覧" - -#: describe.c:4227 -msgid "List of indexes" -msgstr "インデックス一覧" - -#: describe.c:4228 -msgid "List of views" -msgstr "ビュー一覧" - -#: describe.c:4229 -msgid "List of materialized views" -msgstr "実体化ビュー一覧" - -#: describe.c:4230 -msgid "List of sequences" -msgstr "シーケンス一覧" - -#: describe.c:4231 describe.c:6161 -msgid "List of foreign tables" -msgstr "外部テーブル一覧" - -#: describe.c:4280 +#: describe.c:4127 #, c-format msgid "The server (version %s) does not support declarative table partitioning." msgstr "このサーバー(バージョン%s)は宣言的テーブルパーティショニングをサポートしていません。" -#: describe.c:4291 +#: describe.c:4138 msgid "List of partitioned indexes" msgstr "パーティションインデックスの一覧" -#: describe.c:4293 +#: describe.c:4140 msgid "List of partitioned tables" msgstr "パーティションテーブルの一覧" -#: describe.c:4297 +#: describe.c:4144 msgid "List of partitioned relations" msgstr "パーティションリレーションの一覧" -#: describe.c:4328 +#: describe.c:4175 msgid "Parent name" msgstr "親の名前" -#: describe.c:4348 +#: describe.c:4188 msgid "Leaf partition size" msgstr "末端パーティションのサイズ" -#: describe.c:4351 describe.c:4357 +#: describe.c:4191 describe.c:4197 msgid "Total size" msgstr "トータルサイズ" -#: describe.c:4484 +#: describe.c:4321 msgid "Trusted" msgstr "信頼済み" -#: describe.c:4493 +#: describe.c:4330 msgid "Internal language" msgstr "内部言語" -#: describe.c:4494 +#: describe.c:4331 msgid "Call handler" msgstr "呼び出しハンドラー" -#: describe.c:4495 describe.c:5917 +#: describe.c:4332 describe.c:5743 msgid "Validator" msgstr "バリデーター" -#: describe.c:4496 +#: describe.c:4333 msgid "Inline handler" msgstr "インラインハンドラー" -#: describe.c:4530 +#: describe.c:4367 msgid "List of languages" msgstr "手続き言語一覧" -#: describe.c:4571 +#: describe.c:4408 msgid "Check" msgstr "CHECK制約" -#: describe.c:4614 +#: describe.c:4451 msgid "List of domains" msgstr "ドメイン一覧" -#: describe.c:4648 +#: describe.c:4485 msgid "Source" msgstr "変換元" -#: describe.c:4649 +#: describe.c:4486 msgid "Destination" msgstr "変換先" -#: describe.c:4651 describe.c:6924 +#: describe.c:4488 describe.c:6712 msgid "Default?" msgstr "デフォルト?" -#: describe.c:4692 +#: describe.c:4529 msgid "List of conversions" msgstr "符号化方式一覧" -#: describe.c:4720 +#: describe.c:4557 msgid "Parameter" msgstr "パラメータ" -#: describe.c:4721 +#: describe.c:4558 msgid "Value" msgstr "値" -#: describe.c:4728 +#: describe.c:4565 msgid "Context" msgstr "コンテクスト" -#: describe.c:4760 +#: describe.c:4597 msgid "List of configuration parameters" msgstr "設定パラメータの一覧" -#: describe.c:4762 +#: describe.c:4599 msgid "List of non-default configuration parameters" msgstr "非デフォルトの設定パラメータの一覧" -#: describe.c:4789 +#: describe.c:4626 #, c-format msgid "The server (version %s) does not support event triggers." msgstr "このサーバー(バージョン%s)はイベントトリガーをサポートしていません。" -#: describe.c:4809 +#: describe.c:4646 msgid "Event" msgstr "イベント" -#: describe.c:4811 +#: describe.c:4648 msgid "enabled" msgstr "有効" -#: describe.c:4812 +#: describe.c:4649 msgid "replica" msgstr "レプリカ" -#: describe.c:4813 +#: describe.c:4650 msgid "always" msgstr "常時" -#: describe.c:4814 +#: describe.c:4651 msgid "disabled" msgstr "無効" -#: describe.c:4815 describe.c:6765 +#: describe.c:4652 describe.c:6553 msgid "Enabled" msgstr "有効状態" -#: describe.c:4817 +#: describe.c:4654 msgid "Tags" msgstr "タグ" -#: describe.c:4840 +#: describe.c:4677 msgid "List of event triggers" msgstr "イベントトリガー一覧" -#: describe.c:4867 +#: describe.c:4704 #, c-format msgid "The server (version %s) does not support extended statistics." msgstr "このサーバー(バージョン%s)は拡張統計情報をサポートしていません。" -#: describe.c:4904 +#: describe.c:4741 msgid "Ndistinct" msgstr "Ndistinct" -#: describe.c:4905 +#: describe.c:4742 msgid "Dependencies" msgstr "Dependencies" -#: describe.c:4915 +#: describe.c:4752 msgid "MCV" msgstr "MCV" -#: describe.c:4938 +#: describe.c:4775 msgid "List of extended statistics" msgstr "拡張統計情報の一覧" -#: describe.c:4965 +#: describe.c:4802 msgid "Source type" msgstr "変換元の型" -#: describe.c:4966 +#: describe.c:4803 msgid "Target type" msgstr "変換先の型" -#: describe.c:4990 +#: describe.c:4827 msgid "in assignment" msgstr "代入時のみ" -#: describe.c:4992 +#: describe.c:4829 msgid "Implicit?" msgstr "暗黙的に適用 ?" -#: describe.c:5056 +#: describe.c:4887 msgid "List of casts" msgstr "キャスト一覧" -#: describe.c:5101 describe.c:5105 +#: describe.c:4927 describe.c:4931 msgid "Provider" msgstr "プロバイダー" -#: describe.c:5139 describe.c:5144 +#: describe.c:4965 describe.c:4970 msgid "Deterministic?" msgstr "確定的?" -#: describe.c:5183 +#: describe.c:5009 msgid "List of collations" msgstr "照合順序一覧" -#: describe.c:5244 +#: describe.c:5070 msgid "List of schemas" msgstr "スキーマ一覧" -#: describe.c:5360 +#: describe.c:5186 msgid "List of text search parsers" msgstr "テキスト検索用パーサ一覧" -#: describe.c:5410 +#: describe.c:5236 #, c-format msgid "Did not find any text search parser named \"%s\"." msgstr "テキスト検索用パーサ\"%s\"が見つかりませんでした。" -#: describe.c:5413 +#: describe.c:5239 #, c-format msgid "Did not find any text search parsers." msgstr "テキスト検索パーサが見つかりませんでした。" -#: describe.c:5488 +#: describe.c:5314 msgid "Start parse" msgstr "パース開始" -#: describe.c:5489 +#: describe.c:5315 msgid "Method" msgstr "メソッド" -#: describe.c:5493 +#: describe.c:5319 msgid "Get next token" msgstr "次のトークンを取得" -#: describe.c:5495 +#: describe.c:5321 msgid "End parse" msgstr "パース終了" -#: describe.c:5497 +#: describe.c:5323 msgid "Get headline" msgstr "見出しを取得" -#: describe.c:5499 +#: describe.c:5325 msgid "Get token types" msgstr "トークンタイプを取得" -#: describe.c:5509 +#: describe.c:5335 #, c-format msgid "Text search parser \"%s.%s\"" msgstr "テキスト検索パーサ\"%s.%s\"" -#: describe.c:5512 +#: describe.c:5338 #, c-format msgid "Text search parser \"%s\"" msgstr "テキスト検索パーサ\"%s\"" -#: describe.c:5531 +#: describe.c:5357 msgid "Token name" msgstr "トークン名" -#: describe.c:5544 +#: describe.c:5370 #, c-format msgid "Token types for parser \"%s.%s\"" msgstr "パーサ\"%s.%s\"のトークンタイプ" -#: describe.c:5547 +#: describe.c:5373 #, c-format msgid "Token types for parser \"%s\"" msgstr "パーサ\"%s\"のトークンタイプ" -#: describe.c:5591 +#: describe.c:5417 msgid "Template" msgstr "テンプレート" -#: describe.c:5592 +#: describe.c:5418 msgid "Init options" msgstr "初期化オプション" -#: describe.c:5618 +#: describe.c:5444 msgid "List of text search dictionaries" msgstr "テキスト検索用辞書一覧" -#: describe.c:5651 +#: describe.c:5477 msgid "Init" msgstr "初期化" -#: describe.c:5652 +#: describe.c:5478 msgid "Lexize" msgstr "Lex 処理" -#: describe.c:5683 +#: describe.c:5509 msgid "List of text search templates" msgstr "テキスト検索テンプレート一覧" -#: describe.c:5737 +#: describe.c:5563 msgid "List of text search configurations" msgstr "テキスト検索設定一覧" -#: describe.c:5788 +#: describe.c:5614 #, c-format msgid "Did not find any text search configuration named \"%s\"." msgstr "テキスト検索用設定\"%s\"が見つかりませんでした。" -#: describe.c:5791 +#: describe.c:5617 #, c-format msgid "Did not find any text search configurations." msgstr "テキスト検索設定が見つかりませんでした。" -#: describe.c:5857 +#: describe.c:5683 msgid "Token" msgstr "トークン" -#: describe.c:5858 +#: describe.c:5684 msgid "Dictionaries" msgstr "辞書" -#: describe.c:5869 +#: describe.c:5695 #, c-format msgid "Text search configuration \"%s.%s\"" msgstr "テキスト検索設定\"%s.%s\"" -#: describe.c:5872 +#: describe.c:5698 #, c-format msgid "Text search configuration \"%s\"" msgstr "テキスト検索設定\"%s\"" -#: describe.c:5876 +#: describe.c:5702 #, c-format msgid "" "\n" @@ -2331,7 +2233,7 @@ msgstr "" "\n" "パーサ: \"%s.%s\"" -#: describe.c:5879 +#: describe.c:5705 #, c-format msgid "" "\n" @@ -2340,273 +2242,273 @@ msgstr "" "\n" "パーサ: \"%s\"" -#: describe.c:5958 +#: describe.c:5784 msgid "List of foreign-data wrappers" msgstr "外部データラッパ一覧" -#: describe.c:5986 +#: describe.c:5812 msgid "Foreign-data wrapper" msgstr "外部データラッパ" -#: describe.c:6004 describe.c:6191 +#: describe.c:5830 describe.c:6017 msgid "Version" msgstr "バージョン" -#: describe.c:6034 +#: describe.c:5860 msgid "List of foreign servers" msgstr "外部サーバー一覧" -#: describe.c:6059 describe.c:6117 +#: describe.c:5885 describe.c:5943 msgid "Server" msgstr "サーバー" -#: describe.c:6060 +#: describe.c:5886 msgid "User name" msgstr "ユーザー名" -#: describe.c:6089 +#: describe.c:5915 msgid "List of user mappings" msgstr "ユーザーマッピング一覧" -#: describe.c:6212 +#: describe.c:5987 +msgid "List of foreign tables" +msgstr "外部テーブル一覧" + +#: describe.c:6038 msgid "List of installed extensions" msgstr "インストール済みの拡張一覧" -#: describe.c:6260 +#: describe.c:6086 #, c-format msgid "Did not find any extension named \"%s\"." msgstr "\"%s\"という名前の機能拡張が見つかりませんでした。" -#: describe.c:6263 +#: describe.c:6089 #, c-format msgid "Did not find any extensions." msgstr "機能拡張が見つかりませんでした。" -#: describe.c:6307 +#: describe.c:6133 msgid "Object description" msgstr "オブジェクトの説明" -#: describe.c:6316 +#: describe.c:6142 #, c-format msgid "Objects in extension \"%s\"" msgstr "機能拡張\"%s\"内のオブジェクト" -#: describe.c:6357 +#: describe.c:6183 #, c-format msgid "improper qualified name (too many dotted names): %s" msgstr "修飾名が不適切です(ドット区切りの名前が多すぎます): %s" -#: describe.c:6371 +#: describe.c:6197 #, c-format msgid "cross-database references are not implemented: %s" msgstr "データベース間の参照は実装されていません: %s" -#: describe.c:6402 describe.c:6538 +#: describe.c:6228 describe.c:6354 #, c-format msgid "The server (version %s) does not support publications." msgstr "このサーバー(バージョン%s)はパブリケーションをサポートしていません。" -#: describe.c:6419 describe.c:6640 +#: describe.c:6245 describe.c:6432 msgid "All tables" msgstr "全テーブル" -#: describe.c:6420 describe.c:6641 +#: describe.c:6246 describe.c:6433 msgid "Inserts" msgstr "Insert文" -#: describe.c:6421 describe.c:6642 +#: describe.c:6247 describe.c:6434 msgid "Updates" msgstr "Update文" -#: describe.c:6422 describe.c:6643 +#: describe.c:6248 describe.c:6435 msgid "Deletes" msgstr "Delete文" -#: describe.c:6426 describe.c:6645 +#: describe.c:6252 describe.c:6437 msgid "Truncates" msgstr "Truncate文" -#: describe.c:6435 describe.c:6569 describe.c:6647 -msgid "Generated columns" -msgstr "生成列" - -#: describe.c:6439 describe.c:6649 +#: describe.c:6256 describe.c:6439 msgid "Via root" msgstr "最上位パーティションテーブル経由" -#: describe.c:6460 +#: describe.c:6277 msgid "List of publications" msgstr "パブリケーション一覧" -#: describe.c:6607 +#: describe.c:6401 #, c-format msgid "Did not find any publication named \"%s\"." msgstr "\"%s\"という名前のパブリケーションが見つかりませんでした。" -#: describe.c:6610 +#: describe.c:6404 #, c-format msgid "Did not find any publications." msgstr "パブリケーションが見つかりませんでした。" -#: describe.c:6636 +#: describe.c:6428 #, c-format msgid "Publication %s" msgstr "パブリケーション %s" -#: describe.c:6693 +#: describe.c:6481 msgid "Tables:" msgstr "テーブル:" -#: describe.c:6705 +#: describe.c:6493 msgid "Tables from schemas:" msgstr "以下のスキーマ内のテーブル:" -#: describe.c:6750 +#: describe.c:6538 #, c-format msgid "The server (version %s) does not support subscriptions." msgstr "このサーバー(バージョン%s)はサブスクリプションをサポートしていません。" -#: describe.c:6766 +#: describe.c:6554 msgid "Publication" msgstr "パブリケーション" -#: describe.c:6775 +#: describe.c:6563 msgid "Binary" msgstr "バイナリ" -#: describe.c:6784 describe.c:6788 +#: describe.c:6572 describe.c:6576 msgid "Streaming" msgstr "ストリーミング" -#: describe.c:6796 +#: describe.c:6584 msgid "Two-phase commit" msgstr "2相コミット" -#: describe.c:6797 +#: describe.c:6585 msgid "Disable on error" msgstr "エラー時無効化" -#: describe.c:6804 +#: describe.c:6592 msgid "Origin" msgstr "起点" -#: describe.c:6805 +#: describe.c:6593 msgid "Password required" msgstr "パスワード必須" -#: describe.c:6806 +#: describe.c:6594 msgid "Run as owner?" msgstr "所有者として実行?" -#: describe.c:6811 +#: describe.c:6599 msgid "Failover" msgstr "フェイルオーバー" -#: describe.c:6816 +#: describe.c:6604 msgid "Synchronous commit" msgstr "同期コミット" -#: describe.c:6817 +#: describe.c:6605 msgid "Conninfo" msgstr "接続情報" -#: describe.c:6823 +#: describe.c:6611 msgid "Skip LSN" msgstr "スキップLSN" -#: describe.c:6849 +#: describe.c:6637 msgid "List of subscriptions" msgstr "サブスクリプション一覧" -#: describe.c:6878 +#: describe.c:6666 msgid "(none)" msgstr "(権限なし)" -#: describe.c:6918 describe.c:7013 describe.c:7105 describe.c:7208 +#: describe.c:6706 describe.c:6801 describe.c:6893 describe.c:6987 msgid "AM" msgstr "AM" -#: describe.c:6919 +#: describe.c:6707 msgid "Input type" msgstr "入力の型" -#: describe.c:6920 +#: describe.c:6708 msgid "Storage type" msgstr "ストレージタイプ" -#: describe.c:6921 +#: describe.c:6709 msgid "Operator class" msgstr "演算子クラス" -#: describe.c:6933 describe.c:7014 describe.c:7106 describe.c:7209 +#: describe.c:6721 describe.c:6802 describe.c:6894 describe.c:6988 msgid "Operator family" msgstr "演算子族" -#: describe.c:6968 +#: describe.c:6756 msgid "List of operator classes" msgstr "演算子クラス一覧" -#: describe.c:7015 +#: describe.c:6803 msgid "Applicable types" msgstr "適用可能型" -#: describe.c:7056 +#: describe.c:6844 msgid "List of operator families" msgstr "演算子族一覧" -#: describe.c:7107 +#: describe.c:6895 msgid "Operator" msgstr "演算子" -#: describe.c:7108 +#: describe.c:6896 msgid "Strategy" msgstr "ストラテジ" -#: describe.c:7109 +#: describe.c:6897 msgid "ordering" msgstr "順序付け" -#: describe.c:7110 +#: describe.c:6898 msgid "search" msgstr "検索" -#: describe.c:7111 +#: describe.c:6899 msgid "Purpose" msgstr "目的" -#: describe.c:7120 +#: describe.c:6904 msgid "Sort opfamily" msgstr "ソート演算子族" -#: describe.c:7163 +#: describe.c:6942 msgid "List of operators of operator families" msgstr "演算子族の演算子一覧" -#: describe.c:7210 +#: describe.c:6989 msgid "Registered left type" msgstr "登録左辺型" -#: describe.c:7211 +#: describe.c:6990 msgid "Registered right type" msgstr "登録右辺型" -#: describe.c:7212 +#: describe.c:6991 msgid "Number" msgstr "番号" -#: describe.c:7255 +#: describe.c:7034 msgid "List of support functions of operator families" msgstr "演算子族のサポート関数一覧" -#: describe.c:7286 +#: describe.c:7065 msgid "ID" msgstr "ID" -#: describe.c:7306 +#: describe.c:7085 msgid "Large objects" msgstr "ラージ オブジェクト" -#: help.c:60 +#: help.c:63 msgid "" "psql is the PostgreSQL interactive terminal.\n" "\n" @@ -2614,11 +2516,11 @@ msgstr "" "psql は PostgreSQL の対話型ターミナルです。\n" "\n" -#: help.c:61 help.c:373 help.c:457 help.c:503 +#: help.c:64 help.c:372 help.c:456 help.c:502 msgid "Usage:\n" msgstr "使い方:\n" -#: help.c:62 +#: help.c:65 msgid "" " psql [OPTION]... [DBNAME [USERNAME]]\n" "\n" @@ -2626,27 +2528,27 @@ msgstr "" " psql [オプション]... [データベース名 [ユーザー名]]\n" "\n" -#: help.c:64 +#: help.c:67 msgid "General options:\n" msgstr "一般的なオプション:\n" -#: help.c:65 +#: help.c:68 msgid " -c, --command=COMMAND run only single command (SQL or internal) and exit\n" msgstr " -c, --command=コマンド 単一の(SQLまたは内部)コマンドを一つだけ実行して終了\n" -#: help.c:66 +#: help.c:69 msgid " -d, --dbname=DBNAME database name to connect to\n" msgstr " -d, --dbname=DBNAME 接続先データベース名\n" -#: help.c:67 +#: help.c:70 msgid " -f, --file=FILENAME execute commands from file, then exit\n" msgstr " -f, --file=FILENAME ファイルからコマンドを読み込んで実行後、終了\n" -#: help.c:68 +#: help.c:71 msgid " -l, --list list available databases, then exit\n" msgstr " -l(エル), --list 使用可能なデータベース一覧を表示して終了\n" -#: help.c:69 +#: help.c:72 msgid "" " -v, --set=, --variable=NAME=VALUE\n" " set psql variable NAME to VALUE\n" @@ -2656,15 +2558,15 @@ msgstr "" " psql 変数 '名前' に '値' をセット\n" " (例: -v ON_ERROR_STOP=1)\n" -#: help.c:72 +#: help.c:75 msgid " -V, --version output version information, then exit\n" msgstr " -V, --version バージョン情報を表示して終了\n" -#: help.c:73 +#: help.c:76 msgid " -X, --no-psqlrc do not read startup file (~/.psqlrc)\n" msgstr " -X, --no-psqlrc 初期化ファイル (~/.psqlrc) を読み込まない\n" -#: help.c:74 +#: help.c:77 msgid "" " -1 (\"one\"), --single-transaction\n" " execute as a single transaction (if non-interactive)\n" @@ -2672,19 +2574,19 @@ msgstr "" " -1 (数字の1), --single-transaction\n" " (対話形式でない場合)単一のトランザクションとして実行\n" -#: help.c:76 +#: help.c:79 msgid " -?, --help[=options] show this help, then exit\n" msgstr " -?, --help[=options] このヘルプを表示して終了\n" -#: help.c:77 +#: help.c:80 msgid " --help=commands list backslash commands, then exit\n" msgstr " --help=commands バックスラッシュコマンドの一覧を表示して終了\n" -#: help.c:78 +#: help.c:81 msgid " --help=variables list special variables, then exit\n" msgstr " --help=variables 特殊変数の一覧を表示して終了\n" -#: help.c:80 +#: help.c:83 msgid "" "\n" "Input and output options:\n" @@ -2692,47 +2594,47 @@ msgstr "" "\n" "入出力オプション:\n" -#: help.c:81 +#: help.c:84 msgid " -a, --echo-all echo all input from script\n" msgstr " -a, --echo-all スクリプトから読み込んだ入力をすべて表示\n" -#: help.c:82 +#: help.c:85 msgid " -b, --echo-errors echo failed commands\n" msgstr " -b, --echo-errors 失敗したコマンドを表示\n" -#: help.c:83 +#: help.c:86 msgid " -e, --echo-queries echo commands sent to server\n" msgstr " -e, --echo-queries サーバーへ送信したコマンドを表示\n" -#: help.c:84 +#: help.c:87 msgid " -E, --echo-hidden display queries that internal commands generate\n" msgstr " -E, --echo-hidden 内部コマンドが生成した問い合わせを表示\n" -#: help.c:85 +#: help.c:88 msgid " -L, --log-file=FILENAME send session log to file\n" msgstr " -L, --log-file=FILENAME セッションログをファイルに書き込む\n" -#: help.c:86 +#: help.c:89 msgid " -n, --no-readline disable enhanced command line editing (readline)\n" msgstr " -n, --no-readline 拡張コマンドライン編集機能(readline)を無効にする\n" -#: help.c:87 +#: help.c:90 msgid " -o, --output=FILENAME send query results to file (or |pipe)\n" msgstr " -o, --output=FILENAME 問い合わせの結果をファイル (または |パイプ)に送る\n" -#: help.c:88 +#: help.c:91 msgid " -q, --quiet run quietly (no messages, only query output)\n" msgstr " -q, --quiet 静かに実行 (メッセージなしで、問い合わせの出力のみ)\n" -#: help.c:89 +#: help.c:92 msgid " -s, --single-step single-step mode (confirm each query)\n" msgstr " -s, --single-step シングルステップモード (各問い合わせごとに確認)\n" -#: help.c:90 +#: 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:92 +#: help.c:95 msgid "" "\n" "Output format options:\n" @@ -2740,15 +2642,15 @@ msgstr "" "\n" "出力フォーマットのオプション\n" -#: help.c:93 +#: help.c:96 msgid " -A, --no-align unaligned table output mode\n" msgstr " -A, --no-align 桁揃えなしのテーブル出力モード\n" -#: help.c:94 +#: help.c:97 msgid " --csv CSV (Comma-Separated Values) table output mode\n" msgstr " --csv CSV(カンマ区切り)テーブル出力モード\n" -#: help.c:95 +#: help.c:98 #, c-format msgid "" " -F, --field-separator=STRING\n" @@ -2758,17 +2660,17 @@ msgstr "" " 桁揃えなし出力時のフィールド区切り文字\n" " (デフォルト: \"%s\")\n" -#: help.c:98 +#: help.c:101 msgid " -H, --html HTML table output mode\n" msgstr " -H, --html HTML テーブル出力モード\n" -#: help.c:99 +#: 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:100 +#: help.c:103 msgid "" " -R, --record-separator=STRING\n" " record separator for unaligned output (default: newline)\n" @@ -2777,19 +2679,19 @@ msgstr "" " 桁揃えなし出力におけるレコード区切り文字\n" " (デフォルト: 改行)\n" -#: help.c:102 +#: help.c:105 msgid " -t, --tuples-only print rows only\n" msgstr " -t, --tuples-only 行のみを表示\n" -#: help.c:103 +#: 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:104 +#: help.c:107 msgid " -x, --expanded turn on expanded table output\n" msgstr " -x, --expanded 拡張テーブル出力に切り替える\n" -#: help.c:105 +#: help.c:108 msgid "" " -z, --field-separator-zero\n" " set field separator for unaligned output to zero byte\n" @@ -2797,7 +2699,7 @@ msgstr "" " -z, --field-separator-zero\n" " 桁揃えなし出力のフィールド区切りをバイト値の0に設定\n" -#: help.c:107 +#: help.c:110 msgid "" " -0, --record-separator-zero\n" " set record separator for unaligned output to zero byte\n" @@ -2805,7 +2707,7 @@ msgstr "" " -0, --record-separator-zero\n" " 桁揃えなし出力のレコード区切りをバイト値の0に設定\n" -#: help.c:110 +#: help.c:113 msgid "" "\n" "Connection options:\n" @@ -2813,29 +2715,29 @@ msgstr "" "\n" "接続オプション:\n" -#: help.c:111 +#: help.c:114 msgid " -h, --host=HOSTNAME database server host or socket directory\n" msgstr "" " -h, --host=HOSTNAME データベースサーバーのホストまたはソケット\n" " ディレクトリ\n" -#: help.c:112 +#: help.c:115 msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=PORT データベースサーバーのポート番号\n" -#: help.c:113 +#: help.c:116 msgid " -U, --username=USERNAME database user name\n" msgstr " -U, --username=USERNAME データベースのユーザー名\n" -#: help.c:114 +#: help.c:117 msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password パスワード入力を要求しない\n" -#: help.c:115 +#: help.c:118 msgid " -W, --password force password prompt (should happen automatically)\n" msgstr " -W, --password パスワードプロンプトの強制表示(本来は自動的に表示)\n" -#: help.c:117 +#: help.c:120 msgid "" "\n" "For more information, type \"\\?\" (for internal commands) or \"\\help\" (for SQL\n" @@ -2848,36 +2750,24 @@ msgstr "" "をタイプするか、PostgreSQLドキュメント中のpsqlのセクションを参照してください。\n" "\n" -#: help.c:120 +#: help.c:123 #, c-format msgid "Report bugs to <%s>.\n" msgstr "バグは<%s>に報告してください。\n" -#: help.c:121 +#: help.c:124 #, c-format msgid "%s home page: <%s>\n" msgstr "%s ホームページ: <%s>\n" -#: help.c:163 +#: help.c:166 msgid "General\n" msgstr "一般\n" -#: help.c:164 +#: help.c:167 msgid " \\bind [PARAM]... set query parameters\n" msgstr " \\bind [PARAM]... 問い合わせパラメータを設定\n" -#: help.c:165 -msgid "" -" \\bind_named STMT_NAME [PARAM]...\n" -" set query parameters for an existing prepared statement\n" -msgstr "" -" \\bind_named STMT_NAME [PARAM]...\n" -" 既存の準備済みの文にパラメータを設定します\n" - -#: help.c:167 -msgid " \\close STMT_NAME close an existing prepared statement\n" -msgstr " \\close STMT_NAME 準備済みの文をクローズします\n" - #: help.c:168 msgid " \\copyright show PostgreSQL usage and distribution terms\n" msgstr " \\copyright PostgreSQL の使い方と配布条件を表示\n" @@ -2900,7 +2790,7 @@ msgstr "" #: help.c:173 msgid " \\gdesc describe result of query, without executing it\n" -msgstr " \\gdesc 問い合わせを実行せずに結果の説明を行う\n" +msgstr " \\gdesc 問い合わせを実行せずに結果の形式を出力する\n" #: help.c:174 msgid " \\gexec execute query, then execute each value in its result\n" @@ -2915,379 +2805,376 @@ msgid " \\gx [(OPTIONS)] [FILE] as \\g, but forces expanded output mode\n" msgstr " \\gx [ファイル名] \\g と同じ、ただし拡張出力モードを強制\n" #: help.c:177 -msgid " \\parse STMT_NAME create a prepared statement\n" -msgstr " \\parse STMT_NAME 準備済みの文を作成します\n" - -#: help.c:178 msgid " \\q quit psql\n" msgstr " \\q psql を終了する\n" -#: help.c:179 +#: 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" +" SEC秒ごとに最大N回まで分を実行。返却行数がMIN行より\n" +" 少ない場合には停止する\n" -#: help.c:182 help.c:190 help.c:202 help.c:212 help.c:219 help.c:276 help.c:284 -#: help.c:304 help.c:317 help.c:326 +#: 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:184 +#: help.c:183 msgid "Help\n" msgstr "ヘルプ\n" -#: help.c:186 +#: help.c:185 msgid " \\? [commands] show help on backslash commands\n" msgstr " \\? [コマンド] バックスラッシュコマンドのヘルプを表示\n" -#: help.c:187 +#: help.c:186 msgid " \\? options show help on psql command-line options\n" msgstr " \\? オプション psql のコマンドライン・オプションのヘルプを表示\n" -#: help.c:188 +#: help.c:187 msgid " \\? variables show help on special variables\n" msgstr " \\? 変数名 特殊変数のヘルプを表示\n" -#: help.c:189 +#: help.c:188 msgid " \\h [NAME] help on syntax of SQL commands, * for all commands\n" msgstr " \\h [名前] SQLコマンドの文法ヘルプの表示。* で全コマンドを表示\n" -#: help.c:192 +#: help.c:191 msgid "Query Buffer\n" msgstr "問い合わせバッファ\n" -#: help.c:193 +#: help.c:192 msgid " \\e [FILE] [LINE] edit the query buffer (or file) with external editor\n" msgstr "" " \\e [ファイル] [行番号] 現在の問い合わせバッファ(やファイル)を外部エディタで\n" " 編集\n" -#: help.c:194 +#: help.c:193 msgid " \\ef [FUNCNAME [LINE]] edit function definition with external editor\n" msgstr " \\ef [関数名 [行番号]] 関数定義を外部エディタで編集\n" -#: help.c:195 +#: help.c:194 msgid " \\ev [VIEWNAME [LINE]] edit view definition with external editor\n" msgstr " \\ev [ビュー名 [行番号]] ビュー定義を外部エディタで編集\n" -#: help.c:196 +#: help.c:195 msgid " \\p show the contents of the query buffer\n" msgstr " \\p 問い合わせバッファの内容を表示\n" -#: help.c:197 +#: help.c:196 msgid " \\r reset (clear) the query buffer\n" msgstr " \\r 問い合わせバッファをリセット(クリア)\n" -#: help.c:199 +#: help.c:198 msgid " \\s [FILE] display history or save it to file\n" msgstr " \\s [ファイル] ヒストリを表示またはファイルに保存\n" -#: help.c:201 +#: help.c:200 msgid " \\w FILE write query buffer to file\n" msgstr " \\w ファイル 問い合わせバッファの内容をファイルに保存\n" -#: help.c:204 +#: help.c:203 msgid "Input/Output\n" msgstr "入出力\n" -#: help.c:205 +#: help.c:204 msgid " \\copy ... perform SQL COPY with data stream to the client host\n" msgstr "" " \\copy ... クライアントホストに対し、データストリームを使って\n" " SQL COPYを実行\n" -#: help.c:206 +#: help.c:205 msgid " \\echo [-n] [STRING] write string to standard output (-n for no newline)\n" msgstr " \\echo [-n] [文字列] 文字列を標準出力に書き込む (-n で改行しない)\n" -#: help.c:207 +#: help.c:206 msgid " \\i FILE execute commands from file\n" msgstr " \\i ファイル ファイルからコマンドを読み込んで実行\n" -#: help.c:208 +#: help.c:207 msgid " \\ir FILE as \\i, but relative to location of current script\n" msgstr "" " \\ir ファイル \\i と同じ。ただし現在のスクリプトの場所からの相対パス\n" " で指定\n" -#: help.c:209 +#: help.c:208 msgid " \\o [FILE] send all query results to file or |pipe\n" msgstr " \\o [ファイル] 問い合わせ結果をすべてファイルまたは |パイプ へ送出\n" -#: help.c:210 +#: 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:211 +#: help.c:210 msgid " \\warn [-n] [STRING] write string to standard error (-n for no newline)\n" msgstr " \\warn [-n] [文字列] 文字列を標準エラー出力に書き込む (-n で改行しない)\n" -#: help.c:214 +#: help.c:213 msgid "Conditional\n" msgstr "条件分岐\n" -#: help.c:215 +#: help.c:214 msgid " \\if EXPR begin conditional block\n" msgstr " \\if EXPR 条件分岐ブロックの開始\n" -#: help.c:216 +#: help.c:215 msgid " \\elif EXPR alternative within current conditional block\n" msgstr " \\elif EXPR 現在の条件分岐ブロック内の選択肢\n" -#: help.c:217 +#: help.c:216 msgid " \\else final alternative within current conditional block\n" msgstr " \\else 現在の条件分岐ブロックにおける最後の選択肢\n" -#: help.c:218 +#: help.c:217 msgid " \\endif end conditional block\n" msgstr " \\endif 条件分岐ブロックの終了\n" -#: help.c:221 +#: help.c:220 msgid "Informational\n" msgstr "情報表示\n" +#: help.c:221 +msgid " (options: S = show system objects, + = additional detail)\n" +msgstr " (オプション:S = システムオブジェクトを表示, + = 詳細表示)\n" + #: help.c:222 -msgid " (options: S = show system objects, x = expanded mode, + = additional detail)\n" -msgstr " (オプション:S = システムオブジェクトを表示、x = 拡張モード、+ = 詳細表示)\n" +msgid " \\d[S+] list tables, views, and sequences\n" +msgstr " \\d[S+] テーブル、ビュー、およびシーケンスの一覧を表示\n" #: help.c:223 -msgid " \\d[Sx+] list tables, views, and sequences\n" -msgstr " \\d[Sx+] テーブル、ビュー、およびシーケンスの一覧を表示\n" - -#: help.c:224 -msgid " \\d[S+] NAME describe table, view, sequence, or index\n" +msgid " \\d[S+] NAME describe table, view, sequence, or index\n" msgstr "" -" \\d[S+] 名前 テーブル、ビュー、シーケンス、またはインデックスの\n" +" \\d[S+] 名前 テーブル、ビュー、シーケンス、またはインデックスの\n" " 説明を表示\n" +#: help.c:224 +msgid " \\da[S] [PATTERN] list aggregates\n" +msgstr " \\da[S] [パターン] 集約関数の一覧を表示\n" + #: help.c:225 -msgid " \\da[Sx] [PATTERN] list aggregates\n" -msgstr " \\da[Sx] [パターン] 集約関数の一覧を表示\n" +msgid " \\dA[+] [PATTERN] list access methods\n" +msgstr " \\dA[+] [パターン] アクセスメソッドの一覧を表示\n" #: help.c:226 -msgid " \\dA[x+] [PATTERN] list access methods\n" -msgstr " \\dA[x+] [パターン] アクセスメソッドの一覧を表示\n" +msgid " \\dAc[+] [AMPTRN [TYPEPTRN]] list operator classes\n" +msgstr " \\dAc[+] [AMPTRN [TYPEPTRN]] 演算子クラスの一覧を表示\n" #: help.c:227 -msgid " \\dAc[x+] [AMPTRN [TYPEPTRN]] list operator classes\n" -msgstr " \\dAc[x+] [AMパターン [型パターン]] 演算子クラスの一覧を表示\n" +msgid " \\dAf[+] [AMPTRN [TYPEPTRN]] list operator families\n" +msgstr " \\dAf[+] [AMPTRN [TYPEPTRN]] 演算子族の一覧を表示\n" #: help.c:228 -msgid " \\dAf[x+] [AMPTRN [TYPEPTRN]] list operator families\n" -msgstr " \\dAf[x+] [AMパターン [型パターン]] 演算子族の一覧を表示\n" +msgid " \\dAo[+] [AMPTRN [OPFPTRN]] list operators of operator families\n" +msgstr " \\dAo[+] [AMPTRN [OPFPTRN]] 演算子族の演算子の一覧を表示\n" #: help.c:229 -msgid " \\dAo[x+] [AMPTRN [OPFPTRN]] list operators of operator families\n" -msgstr " \\dAo[x+] [AMパターン [型パターン]] 演算子族の演算子の一覧を表示\n" +msgid " \\dAp[+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" +msgstr " \\dAp[+] [AMPTRN [OPFPTRN]] 演算子族のサポート関数の一覧を表示\n" #: help.c:230 -msgid " \\dAp[x+] [AMPTRN [OPFPTRN]] list support functions of operator families\n" -msgstr " \\dAp[x+] [AMパターン [型パターン]] 演算子族のサポート関数の一覧を表示\n" +msgid " \\db[+] [PATTERN] list tablespaces\n" +msgstr " \\db[+] [パターン] テーブル空間の一覧を表示\n" #: help.c:231 -msgid " \\db[x+] [PATTERN] list tablespaces\n" -msgstr " \\db[x+] [パターン] テーブル空間の一覧を表示\n" +msgid " \\dc[S+] [PATTERN] list conversions\n" +msgstr " \\dc[S+] [パターン] 符号化方式間の変換の一覧を表示\n" #: help.c:232 -msgid " \\dc[Sx+] [PATTERN] list conversions\n" -msgstr " \\dc[Sx+] [パターン] 符号化方式間の変換の一覧を表示\n" +msgid " \\dconfig[+] [PATTERN] list configuration parameters\n" +msgstr " \\dconfig[+] [PATTERN] 設定パラメータの一覧を表示\n" #: help.c:233 -msgid " \\dconfig[x+] [PATTERN] list configuration parameters\n" -msgstr " \\dconfig[x+] [パターン] 設定パラメータの一覧を表示\n" +msgid " \\dC[+] [PATTERN] list casts\n" +msgstr " \\dC[+] [パターン] キャストの一覧を表示します。\n" #: help.c:234 -msgid " \\dC[x+] [PATTERN] list casts\n" -msgstr " \\dC[x+] [パターン] キャストの一覧を表示します。\n" +msgid " \\dd[S] [PATTERN] show object descriptions not displayed elsewhere\n" +msgstr " \\dd[S] [パターン] 他では表示されないオブジェクトの説明を表示\n" #: help.c:235 -msgid " \\dd[Sx] [PATTERN] show object descriptions not displayed elsewhere\n" -msgstr " \\dd[Sx] [パターン] 他では表示されないオブジェクトの説明を表示\n" +msgid " \\dD[S+] [PATTERN] list domains\n" +msgstr " \\dD[S+] [パターン] ドメインの一覧を表示\n" #: help.c:236 -msgid " \\dD[Sx+] [PATTERN] list domains\n" -msgstr " \\dD[Sx+] [パターン] ドメインの一覧を表示\n" +msgid " \\ddp [PATTERN] list default privileges\n" +msgstr " \\ddp [パターン] デフォルト権限の一覧を表示\n" #: help.c:237 -msgid " \\ddp[x] [PATTERN] list default privileges\n" -msgstr " \\ddp[x] [パターン] デフォルト権限の一覧を表示\n" +msgid " \\dE[S+] [PATTERN] list foreign tables\n" +msgstr " \\dE[S+] [パターン] 外部テーブルの一覧を表示\n" #: help.c:238 -msgid " \\dE[Sx+] [PATTERN] list foreign tables\n" -msgstr " \\dE[Sx+] [パターン] 外部テーブルの一覧を表示\n" +msgid " \\des[+] [PATTERN] list foreign servers\n" +msgstr " \\des[+] [パターン] 外部サーバーの一覧を表示\n" #: help.c:239 -msgid " \\des[x+] [PATTERN] list foreign servers\n" -msgstr " \\des[x+] [パターン] 外部サーバーの一覧を表示\n" +msgid " \\det[+] [PATTERN] list foreign tables\n" +msgstr " \\det[+] [パターン] 外部テーブルの一覧を表示\n" #: help.c:240 -msgid " \\det[x+] [PATTERN] list foreign tables\n" -msgstr " \\det[x+] [パターン] 外部テーブルの一覧を表示\n" +msgid " \\deu[+] [PATTERN] list user mappings\n" +msgstr " \\deu[+] [パターン] ユーザーマッピングの一覧を表示\n" #: help.c:241 -msgid " \\deu[x+] [PATTERN] list user mappings\n" -msgstr " \\deu[x+] [パターン] ユーザーマッピングの一覧を表示\n" +msgid " \\dew[+] [PATTERN] list foreign-data wrappers\n" +msgstr " \\dew[+] [パターン] 外部データラッパの一覧を表示\n" #: help.c:242 -msgid " \\dew[x+] [PATTERN] list foreign-data wrappers\n" -msgstr " \\dew[x+] [パターン] 外部データラッパの一覧を表示\n" - -#: help.c:243 msgid "" -" \\df[anptw][Sx+] [FUNCPTRN [TYPEPTRN ...]]\n" +" \\df[anptw][S+] [FUNCPTRN [TYPEPTRN ...]]\n" " list [only agg/normal/procedure/trigger/window] functions\n" msgstr "" -" \\df[anptw][Sx+] [関数パターン [型パターン ...]]\n" +" \\df[anptw][S+] [関数パターン [型パターン ...]]\n" " [集約/通常/プロシージャ/トリガー/ウィンドウ]\n" " 関数のみの一覧を表示\n" +#: help.c:244 +msgid " \\dF[+] [PATTERN] list text search configurations\n" +msgstr " \\dF[+] [パターン] テキスト検索設定の一覧を表示\n" + #: help.c:245 -msgid " \\dF[x+] [PATTERN] list text search configurations\n" -msgstr " \\dF[x+] [パターン] テキスト検索設定の一覧を表示\n" +msgid " \\dFd[+] [PATTERN] list text search dictionaries\n" +msgstr " \\dFd[+] [パターン] テキスト検索辞書の一覧を表示\n" #: help.c:246 -msgid " \\dFd[x+] [PATTERN] list text search dictionaries\n" -msgstr " \\dFd[x+] [パターン] テキスト検索辞書の一覧を表示\n" +msgid " \\dFp[+] [PATTERN] list text search parsers\n" +msgstr " \\dFp[+] [パターン] テキスト検索パーサの一覧を表示\n" #: help.c:247 -msgid " \\dFp[x+] [PATTERN] list text search parsers\n" -msgstr " \\dFp[x+] [パターン] テキスト検索パーサの一覧を表示\n" +msgid " \\dFt[+] [PATTERN] list text search templates\n" +msgstr " \\dFt[+] [パターン] テキスト検索テンプレートの一覧を表示\n" #: help.c:248 -msgid " \\dFt[x+] [PATTERN] list text search templates\n" -msgstr " \\dFt[x+] [パターン] テキスト検索テンプレートの一覧を表示\n" +msgid " \\dg[S+] [PATTERN] list roles\n" +msgstr " \\dg[S+] [パターン] ロールの一覧を表示\n" #: help.c:249 -msgid " \\dg[Sx+] [PATTERN] list roles\n" -msgstr " \\dg[Sx+] [パターン] ロールの一覧を表示\n" +msgid " \\di[S+] [PATTERN] list indexes\n" +msgstr " \\di[S+] [パターン] インデックスの一覧を表示\n" #: help.c:250 -msgid " \\di[Sx+] [PATTERN] list indexes\n" -msgstr " \\di[Sx+] [パターン] インデックスの一覧を表示\n" +msgid " \\dl[+] list large objects, same as \\lo_list\n" +msgstr " \\dl[+] ラージオブジェクトの一覧を表示、\\lo_list と同じ\n" #: help.c:251 -msgid " \\dl[x+] list large objects, same as \\lo_list\n" -msgstr " \\dl[x+] ラージオブジェクトの一覧を表示、\\lo_list と同じ\n" +msgid " \\dL[S+] [PATTERN] list procedural languages\n" +msgstr " \\dL[S+] [パターン] 手続き言語の一覧を表示\n" #: help.c:252 -msgid " \\dL[Sx+] [PATTERN] list procedural languages\n" -msgstr " \\dL[Sx+] [パターン] 手続き言語の一覧を表示\n" +msgid " \\dm[S+] [PATTERN] list materialized views\n" +msgstr " \\dm[S+] [パターン] 実体化ビューの一覧を表示\n" #: help.c:253 -msgid " \\dm[Sx+] [PATTERN] list materialized views\n" -msgstr " \\dm[Sx+] [パターン] 実体化ビューの一覧を表示\n" +msgid " \\dn[S+] [PATTERN] list schemas\n" +msgstr " \\dn[S+] [パターン] スキーマの一覧を表示\n" #: help.c:254 -msgid " \\dn[Sx+] [PATTERN] list schemas\n" -msgstr " \\dn[Sx+] [パターン] スキーマの一覧を表示\n" - -#: help.c:255 msgid "" -" \\do[Sx+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" +" \\do[S+] [OPPTRN [TYPEPTRN [TYPEPTRN]]]\n" " list operators\n" msgstr "" -" \\do[Sx+] [演算子パターン [型パターン [型パターン]]]\n" +" \\do[S+] [演算子パターン [型パターン [型パターン]]]\n" " 演算子の一覧を表示\n" +#: help.c:256 +msgid " \\dO[S+] [PATTERN] list collations\n" +msgstr " \\dO[S+] [パターン] 照合順序の一覧を表示\n" + #: help.c:257 -msgid " \\dO[Sx+] [PATTERN] list collations\n" -msgstr " \\dO[Sx+] [パターン] 照合順序の一覧を表示\n" +msgid " \\dp[S] [PATTERN] list table, view, and sequence access privileges\n" +msgstr " \\dp[S] [パターン] テーブル、ビュー、シーケンスのアクセス権の一覧を表示\n" #: help.c:258 -msgid " \\dp[Sx] [PATTERN] list table, view, and sequence access privileges\n" -msgstr " \\dp[Sx] [パターン] テーブル、ビュー、シーケンスのアクセス権の一覧を表示\n" +msgid " \\dP[itn+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" +msgstr "" +" \\dP[itn+] [パターン] パーティションリレーション[テーブル/インデックスのみ]\n" +" の一覧を表示 [n=入れ子]\n" #: help.c:259 -msgid " \\dP[itnx+] [PATTERN] list [only index/table] partitioned relations [n=nested]\n" +msgid " \\drds [ROLEPTRN [DBPTRN]] list per-database role settings\n" msgstr "" -" \\dP[itnx+] [パターン] パーティションリレーション[テーブル/インデックスのみ]\n" -" の一覧を表示 [n=入れ子]\n" -" \n" +" \\drds [ロールパターン [DBパターン]]\n" +" データベース毎のロール設定の一覧を表示\n" #: help.c:260 -msgid " \\drds[x] [ROLEPTRN [DBPTRN]] list per-database role settings\n" +msgid " \\drg[S] [PATTERN] list role grants\n" msgstr "" -" \\drds[x] [ロールパターン [DBパターン]]\n" -" データベース毎のロール設定の一覧を表示\n" +" \\drg[S] [PATTERN] ロール権限付与の一覧を表示\n" +"\n" #: help.c:261 -msgid " \\drg[Sx] [PATTERN] list role grants\n" -msgstr " \\drg[Sx] [パターン] ロール権限付与の一覧を表示\n" +msgid " \\dRp[+] [PATTERN] list replication publications\n" +msgstr " \\dRp[+] [パターン] レプリケーションのパブリケーションの一覧を表示\n" #: help.c:262 -msgid " \\dRp[x+] [PATTERN] list replication publications\n" -msgstr " \\dRp[x+] [パターン] レプリケーションのパブリケーションの一覧を表示\n" +msgid " \\dRs[+] [PATTERN] list replication subscriptions\n" +msgstr " \\dRs[+] [パターン] レプリケーションのサブスクリプションの一覧を表示\n" #: help.c:263 -msgid " \\dRs[x+] [PATTERN] list replication subscriptions\n" -msgstr " \\dRs[x+] [パターン] レプリケーションのサブスクリプションの一覧を表示\n" +msgid " \\ds[S+] [PATTERN] list sequences\n" +msgstr " \\ds[S+] [パターン] シーケンスの一覧を表示\n" #: help.c:264 -msgid " \\ds[Sx+] [PATTERN] list sequences\n" -msgstr " \\ds[Sx+] [パターン] シーケンスの一覧を表示\n" +msgid " \\dt[S+] [PATTERN] list tables\n" +msgstr " \\dt[S+] [パターン] テーブルの一覧を表示\n" #: help.c:265 -msgid " \\dt[Sx+] [PATTERN] list tables\n" -msgstr " \\dt[Sx+] [パターン] テーブルの一覧を表示\n" +msgid " \\dT[S+] [PATTERN] list data types\n" +msgstr " \\dT[S+] [パターン] データ型の一覧を表示\n" #: help.c:266 -msgid " \\dT[Sx+] [PATTERN] list data types\n" -msgstr " \\dT[Sx+] [パターン] データ型の一覧を表示\n" +msgid " \\du[S+] [PATTERN] list roles\n" +msgstr " \\du[S+] [パターン] ロールの一覧を表示\n" #: help.c:267 -msgid " \\du[Sx+] [PATTERN] list roles\n" -msgstr " \\du[Sx+] [パターン] ロールの一覧を表示\n" +msgid " \\dv[S+] [PATTERN] list views\n" +msgstr " \\dv[S+] [パターン] ビューの一覧を表示\n" #: help.c:268 -msgid " \\dv[Sx+] [PATTERN] list views\n" -msgstr " \\dv[Sx+] [パターン] ビューの一覧を表示\n" +msgid " \\dx[+] [PATTERN] list extensions\n" +msgstr " \\dx[+] [パターン] 機能拡張の一覧を表示\n" #: help.c:269 -msgid " \\dx[x+] [PATTERN] list extensions\n" -msgstr " \\dx[x+] [パターン] 機能拡張の一覧を表示\n" +msgid " \\dX [PATTERN] list extended statistics\n" +msgstr " \\dX [パターン] 拡張統計情報の一覧を表示\n" #: help.c:270 -msgid " \\dX[x] [PATTERN] list extended statistics\n" -msgstr " \\dX[x] [パターン] 拡張統計情報の一覧を表示\n" +msgid " \\dy[+] [PATTERN] list event triggers\n" +msgstr " \\dy[+] [パターン] イベントトリガーの一覧を表示\n" #: help.c:271 -msgid " \\dy[x+] [PATTERN] list event triggers\n" -msgstr " \\dy[x+] [パターン] イベントトリガーの一覧を表示\n" +msgid " \\l[+] [PATTERN] list databases\n" +msgstr " \\l[+] [パターン] データベースの一覧を表示\n" #: help.c:272 -msgid " \\l[x+] [PATTERN] list databases\n" -msgstr " \\l[x+] [パターン] データベースの一覧を表示\n" +msgid " \\sf[+] FUNCNAME show a function's definition\n" +msgstr " \\sf[+] 関数名 関数の定義を表示\n" #: help.c:273 -msgid " \\sf[+] FUNCNAME show a function's definition\n" -msgstr " \\sf[+] 関数名 関数の定義を表示\n" +msgid " \\sv[+] VIEWNAME show a view's definition\n" +msgstr " \\sv[+] ビュー名 ビューの定義を表示\n" #: help.c:274 -msgid " \\sv[+] VIEWNAME show a view's definition\n" -msgstr " \\sv[+] ビュー名 ビューの定義を表示\n" +msgid " \\z[S] [PATTERN] same as \\dp\n" +msgstr " \\z[S] [パターン] \\dp と同じ\n" -#: help.c:275 -msgid " \\z[Sx] [PATTERN] same as \\dp\n" -msgstr " \\z[Sx] [パターン] \\dp と同じ\n" - -#: help.c:278 +#: help.c:277 msgid "Large Objects\n" msgstr "ラージ・オブジェクト\n" -#: help.c:279 +#: help.c:278 msgid " \\lo_export LOBOID FILE write large object to file\n" msgstr "" " \\lo_export LOBOID ファイル名\n" " ラージ・オブエジェクトをファイルに書き込む\n" -#: help.c:280 +#: help.c:279 msgid "" " \\lo_import FILE [COMMENT]\n" " read large object from file\n" @@ -3295,38 +3182,38 @@ msgstr "" " \\lo_import ファイル名 [コメント]\n" " ラージ・オブジェクトをファイルから読み込む\n" -#: help.c:282 -msgid " \\lo_list[x+] list large objects\n" -msgstr " \\lo_list[x+] ラージ・オブジェクトの一覧を表示\n" +#: help.c:281 +msgid " \\lo_list[+] list large objects\n" +msgstr " \\lo_list[+] ラージ・オブジェクトの一覧を表示\n" -#: help.c:283 +#: help.c:282 msgid " \\lo_unlink LOBOID delete a large object\n" msgstr " \\lo_unlink LOBOID ラージ・オブジェクトを削除\n" -#: help.c:286 +#: help.c:285 msgid "Formatting\n" msgstr "書式設定\n" -#: help.c:287 +#: help.c:286 msgid " \\a toggle between unaligned and aligned output mode\n" msgstr " \\a 非整列と整列間の出力モードの切り替え\n" -#: help.c:288 +#: help.c:287 msgid " \\C [STRING] set table title, or unset if none\n" msgstr " \\C [文字列] テーブルのタイトルを設定、値がなければ削除\n" -#: help.c:289 +#: help.c:288 msgid " \\f [STRING] show or set field separator for unaligned query output\n" msgstr "" " \\f [文字列] 問い合わせ結果の非整列出力時のフィールド区切り文字を\n" " 表示または設定\n" -#: help.c:290 +#: help.c:289 #, c-format msgid " \\H toggle HTML output mode (currently %s)\n" msgstr " \\H HTML出力モードの切り替え (現在値: %s)\n" -#: help.c:292 +#: help.c:291 msgid "" " \\pset [NAME [VALUE]] set table output option\n" " (border|columns|csv_fieldsep|expanded|fieldsep|\n" @@ -3344,29 +3231,29 @@ msgstr "" " unicode_border_linestyle|unicode_column_linestyle|\n" " unicode_header_linestyle|xheader_width)\n" -#: help.c:299 +#: help.c:298 #, c-format msgid " \\t [on|off] show only rows (currently %s)\n" msgstr " \\t [on|off] 結果行のみ表示 (現在値: %s)\n" -#: help.c:301 +#: help.c:300 msgid " \\T [STRING] set HTML tag attributes, or unset if none\n" msgstr " \\T [文字列] HTMLの
タグ属性の設定、値がなければ解除\n" -#: help.c:302 +#: 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:303 +#: help.c:302 msgid "auto" msgstr "自動(auto)" -#: help.c:306 +#: help.c:305 msgid "Connection\n" msgstr "接続\n" -#: help.c:308 +#: help.c:307 #, c-format msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" @@ -3375,7 +3262,7 @@ msgstr "" " \\c[onnect] {[DB名|- ユーザー名|- ホスト名|- ポート番号|-] | 接続文字列}\n" " 新しいデータベースに接続 (現在: \"%s\")\n" -#: help.c:312 +#: help.c:311 msgid "" " \\c[onnect] {[DBNAME|- USER|- HOST|- PORT|-] | conninfo}\n" " connect to new database (currently no connection)\n" @@ -3383,64 +3270,64 @@ msgstr "" " \\c[onnect] {[DB名|- ユーザー名|- ホスト名|- ポート番号|-] | 接続文字列}\n" " 新しいデータベースに接続 (現在: 未接続)\n" -#: help.c:314 +#: help.c:313 msgid " \\conninfo display information about current connection\n" msgstr " \\conninfo 現在の接続に関する情報を表示\n" -#: help.c:315 +#: help.c:314 msgid " \\encoding [ENCODING] show or set client encoding\n" msgstr " \\encoding [エンコーディング] クライアントのエンコーディングを表示または設定\n" -#: help.c:316 +#: help.c:315 msgid " \\password [USERNAME] securely change the password for a user\n" msgstr " \\password [ユーザー名] ユーザーのパスワードを安全に変更\n" -#: help.c:319 +#: help.c:318 msgid "Operating System\n" msgstr "オペレーティングシステム\n" -#: help.c:320 +#: help.c:319 msgid " \\cd [DIR] change the current working directory\n" msgstr " \\cd [DIR] カレントディレクトリを変更\n" -#: help.c:321 +#: help.c:320 msgid " \\getenv PSQLVAR ENVVAR fetch environment variable\n" msgstr "" " \\getenv psql変数 環境変数\n" " 環境変数を取得\n" -#: help.c:322 +#: help.c:321 msgid " \\setenv NAME [VALUE] set or unset environment variable\n" msgstr " \\setenv 名前 [値] 環境変数を設定または解除\n" -#: help.c:323 +#: help.c:322 #, c-format msgid " \\timing [on|off] toggle timing of commands (currently %s)\n" msgstr " \\timing [on|off] コマンドの実行時間表示の切り替え (現在値: %s)\n" -#: help.c:325 +#: help.c:324 msgid " \\! [COMMAND] execute command in shell or start interactive shell\n" msgstr "" " \\! [コマンド] シェルでコマンドを実行するか、もしくは対話型シェルを\n" " 起動します。\n" -#: help.c:328 +#: help.c:327 msgid "Variables\n" msgstr "変数\n" -#: help.c:329 +#: help.c:328 msgid " \\prompt [TEXT] NAME prompt user to set internal variable\n" msgstr " \\prompt [テキスト] 変数名 ユーザーに対して内部変数の設定を要求します\n" -#: help.c:330 +#: help.c:329 msgid " \\set [NAME [VALUE]] set internal variable, or list all if no parameters\n" msgstr " \\set [変数名 [値]] 内部変数の値を設定、パラメータがなければ一覧を表示\n" -#: help.c:331 +#: help.c:330 msgid " \\unset NAME unset (delete) internal variable\n" msgstr " \\unset 変数名 内部変数を削除\n" -#: help.c:370 +#: help.c:369 msgid "" "List of specially treated variables\n" "\n" @@ -3448,11 +3335,11 @@ msgstr "" "特別に扱われる変数の一覧\n" "\n" -#: help.c:372 +#: help.c:371 msgid "psql variables:\n" msgstr "psql変数:\n" -#: help.c:374 +#: help.c:373 msgid "" " psql --set=NAME=VALUE\n" " or \\set NAME VALUE inside psql\n" @@ -3462,7 +3349,7 @@ msgstr "" " またはpsql内で \\set 名前 値\n" "\n" -#: help.c:376 +#: help.c:375 msgid "" " AUTOCOMMIT\n" " if set, successful SQL commands are automatically committed\n" @@ -3470,7 +3357,7 @@ msgstr "" " AUTOCOMMIT\n" " セットされている場合、SQLコマンドが成功した際に自動的にコミット\n" -#: help.c:378 +#: help.c:377 msgid "" " COMP_KEYWORD_CASE\n" " determines the case used to complete SQL key words\n" @@ -3480,7 +3367,7 @@ msgstr "" " SQLキーワードの補完に使う文字ケースを指定\n" " [lower, upper, preserve-lower, preserve-upper]\n" -#: help.c:381 +#: help.c:380 msgid "" " DBNAME\n" " the currently connected database name\n" @@ -3488,7 +3375,7 @@ msgstr "" " DBNAME\n" " 現在接続中のデータベース名\n" -#: help.c:383 +#: help.c:382 msgid "" " ECHO\n" " controls what input is written to standard output\n" @@ -3498,7 +3385,7 @@ msgstr "" " どの入力を標準出力への出力対象とするかを設定\n" " [all, errors, none, queries]\n" -#: help.c:386 +#: help.c:385 msgid "" " ECHO_HIDDEN\n" " if set, display internal queries executed by backslash commands;\n" @@ -3508,7 +3395,7 @@ msgstr "" " セットされていれば、バックスラッシュコマンドで実行される内部問い合わせを\n" " 表示; \"noexec\"を設定した場合は実行せずに表示のみ\n" -#: help.c:389 +#: help.c:388 msgid "" " ENCODING\n" " current client character set encoding\n" @@ -3516,7 +3403,7 @@ msgstr "" " ENCODING\n" " 現在のクライアント側の文字セットのエンコーディング\n" -#: help.c:391 +#: help.c:390 msgid "" " ERROR\n" " \"true\" if last query failed, else \"false\"\n" @@ -3524,7 +3411,7 @@ msgstr "" " ERROR\n" " 最後の問い合わせが失敗であれば\"true\"、そうでなければ\"false\"\n" -#: help.c:393 +#: help.c:392 msgid "" " FETCH_COUNT\n" " the number of result rows to fetch and display at a time (0 = unlimited)\n" @@ -3532,7 +3419,7 @@ msgstr "" " FETCH_COUNT\n" " 一度に取得および表示する結果の行数 (0 = 無制限)\n" -#: help.c:395 +#: help.c:394 msgid "" " HIDE_TABLEAM\n" " if set, table access methods are not displayed\n" @@ -3540,7 +3427,7 @@ msgstr "" " HIDE_TABLEAM\n" " 設定すると、テーブルアクセスメソッドは表示されない\n" -#: help.c:397 +#: help.c:396 msgid "" " HIDE_TOAST_COMPRESSION\n" " if set, compression methods are not displayed\n" @@ -3548,7 +3435,7 @@ msgstr "" " HIDE_TOAST_COMPRESSION\n" " 設定すると、圧縮方式は表示されない\n" -#: help.c:399 +#: help.c:398 msgid "" " HISTCONTROL\n" " controls command history [ignorespace, ignoredups, ignoreboth]\n" @@ -3556,7 +3443,7 @@ msgstr "" " HISTCONTROL\n" " コマンド履歴の制御 [ignorespace, ignoredups, ignoreboth]\n" -#: help.c:401 +#: help.c:400 msgid "" " HISTFILE\n" " file name used to store the command history\n" @@ -3564,7 +3451,7 @@ msgstr "" " HISTFILE\n" " コマンド履歴を保存するファイルの名前\n" -#: help.c:403 +#: help.c:402 msgid "" " HISTSIZE\n" " maximum number of commands to store in the command history\n" @@ -3572,7 +3459,7 @@ msgstr "" " HISTSIZE\n" " コマンド履歴で保存するコマンド数の上限\n" -#: help.c:405 +#: help.c:404 msgid "" " HOST\n" " the currently connected database server host\n" @@ -3580,7 +3467,7 @@ msgstr "" " HOST\n" " 現在接続中のデータベースサーバーホスト\n" -#: help.c:407 +#: help.c:406 msgid "" " IGNOREEOF\n" " number of EOFs needed to terminate an interactive session\n" @@ -3588,7 +3475,7 @@ msgstr "" " IGNOREEOF\n" " 対話形セッションを終わらせるのに必要なEOFの数\n" -#: help.c:409 +#: help.c:408 msgid "" " LASTOID\n" " value of the last affected OID\n" @@ -3596,7 +3483,7 @@ msgstr "" " LASTOID\n" " 最後の変更の影響を受けたOID\n" -#: help.c:411 +#: help.c:410 msgid "" " LAST_ERROR_MESSAGE\n" " LAST_ERROR_SQLSTATE\n" @@ -3607,7 +3494,7 @@ msgstr "" " 最後のエラーのメッセージおよび SQLSTATE、\n" " なにもなければ空の文字列および\"00000\"\n" -#: help.c:414 +#: help.c:413 msgid "" " ON_ERROR_ROLLBACK\n" " if set, an error doesn't stop a transaction (uses implicit savepoints)\n" @@ -3616,7 +3503,7 @@ msgstr "" " セットされている場合、エラーでトランザクションを停止しない (暗黙のセーブ\n" " ポイントを使用)\n" -#: help.c:416 +#: help.c:415 msgid "" " ON_ERROR_STOP\n" " stop batch execution after error\n" @@ -3624,7 +3511,7 @@ msgstr "" " ON_ERROR_STOP\n" " エラー発生後にバッチ実行を停止\n" -#: help.c:418 +#: help.c:417 msgid "" " PORT\n" " server port of the current connection\n" @@ -3632,7 +3519,7 @@ msgstr "" " PORT\n" " 現在の接続のサーバーポート\n" -#: help.c:420 +#: help.c:419 msgid "" " PROMPT1\n" " specifies the standard psql prompt\n" @@ -3640,7 +3527,7 @@ msgstr "" " PROMPT1\n" " psql の標準のプロンプトを指定\n" -#: help.c:422 +#: help.c:421 msgid "" " PROMPT2\n" " specifies the prompt used when a statement continues from a previous line\n" @@ -3648,7 +3535,7 @@ msgstr "" " PROMPT2\n" " 文が前行から継続する場合のプロンプトを指定\n" -#: help.c:424 +#: help.c:423 msgid "" " PROMPT3\n" " specifies the prompt used during COPY ... FROM STDIN\n" @@ -3656,7 +3543,7 @@ msgstr "" " PROMPT3\n" " COPY ... FROM STDIN の最中に使われるプロンプトを指定\n" -#: help.c:426 +#: help.c:425 msgid "" " QUIET\n" " run quietly (same as -q option)\n" @@ -3664,7 +3551,7 @@ msgstr "" " QUIET\n" " メッセージを表示しない (-q オプションと同じ)\n" -#: help.c:428 +#: help.c:427 msgid "" " ROW_COUNT\n" " number of rows returned or affected by last query, or 0\n" @@ -3672,7 +3559,7 @@ msgstr "" " ROW_COUNT\n" " 最後の問い合わせで返却した、または影響を与えた行の数、または0\n" -#: help.c:430 +#: help.c:429 msgid "" " SERVER_VERSION_NAME\n" " SERVER_VERSION_NUM\n" @@ -3682,7 +3569,7 @@ msgstr "" " SERVER_VERSION_NUM\n" " サーバーのバージョン(短い文字列または数値)\n" -#: help.c:433 +#: help.c:432 msgid "" " SHELL_ERROR\n" " \"true\" if the last shell command failed, \"false\" if it succeeded\n" @@ -3690,7 +3577,7 @@ msgstr "" " SHELL_ERROR\n" " 最後のシェルコマンドが失敗であれば\"true\"、成功であれば\"false\"\n" -#: help.c:435 +#: help.c:434 msgid "" " SHELL_EXIT_CODE\n" " exit status of the last shell command\n" @@ -3698,7 +3585,7 @@ msgstr "" " SHELL_EXIT_CODE\n" " 最後に実行したシェルコマンドの終了ステータス\n" -#: help.c:437 +#: help.c:436 msgid "" " SHOW_ALL_RESULTS\n" " show all results of a combined query (\\;) instead of only the last\n" @@ -3706,7 +3593,7 @@ msgstr "" " SHOW_ALL_RESULTS\n" " 複合問い合わせ(\\;)の最後の結果のみではなくすべてを表示する\n" -#: help.c:439 +#: help.c:438 msgid "" " SHOW_CONTEXT\n" " controls display of message context fields [never, errors, always]\n" @@ -3714,7 +3601,7 @@ msgstr "" " SHOW_CONTEXT\n" " メッセージコンテキストフィールドの表示を制御 [never, errors, always]\n" -#: help.c:441 +#: help.c:440 msgid "" " SINGLELINE\n" " if set, end of line terminates SQL commands (same as -S option)\n" @@ -3722,7 +3609,7 @@ msgstr "" " SINGLELINE\n" " セットした場合、改行はSQLコマンドを終端する (-S オプションと同じ)\n" -#: help.c:443 +#: help.c:442 msgid "" " SINGLESTEP\n" " single-step mode (same as -s option)\n" @@ -3730,7 +3617,7 @@ msgstr "" " SINGLESTEP\n" " シングルステップモード (-s オプションと同じ)\n" -#: help.c:445 +#: help.c:444 msgid "" " SQLSTATE\n" " SQLSTATE of last query, or \"00000\" if no error\n" @@ -3738,7 +3625,7 @@ msgstr "" " SQLSTATE\n" " 最後の問い合わせの SQLSTATE、またはエラーでなければ\"00000\"\n" -#: help.c:447 +#: help.c:446 msgid "" " USER\n" " the currently connected database user\n" @@ -3746,7 +3633,7 @@ msgstr "" " USER\n" " 現在接続中のデータベースユーザー\n" -#: help.c:449 +#: help.c:448 msgid "" " VERBOSITY\n" " controls verbosity of error reports [default, verbose, terse, sqlstate]\n" @@ -3754,7 +3641,7 @@ msgstr "" " VERBOSITY\n" " エラー報告の詳細度を制御 [default, verbose, terse, sqlstate]\n" -#: help.c:451 +#: help.c:450 msgid "" " VERSION\n" " VERSION_NAME\n" @@ -3766,7 +3653,7 @@ msgstr "" " VERSION_NUM\n" " psql のバージョン(長い文字列、短い文字列または数値)\n" -#: help.c:456 +#: help.c:455 msgid "" "\n" "Display settings:\n" @@ -3774,7 +3661,7 @@ msgstr "" "\n" "表示設定:\n" -#: help.c:458 +#: help.c:457 msgid "" " psql --pset=NAME[=VALUE]\n" " or \\pset NAME [VALUE] inside psql\n" @@ -3784,7 +3671,7 @@ msgstr "" " またはpsql内で \\pset 名前 [値]\n" "\n" -#: help.c:460 +#: help.c:459 msgid "" " border\n" " border style (number)\n" @@ -3792,7 +3679,7 @@ msgstr "" " border\n" " 境界線のスタイル (番号)\n" -#: help.c:462 +#: help.c:461 msgid "" " columns\n" " target width for the wrapped format\n" @@ -3800,7 +3687,7 @@ msgstr "" " columns\n" " 折り返し形式で目標とする横幅\n" -#: help.c:464 +#: help.c:463 msgid "" " expanded (or x)\n" " expanded output [on, off, auto]\n" @@ -3808,7 +3695,7 @@ msgstr "" " expanded (or x)\n" " 拡張出力 [on, off, auto]\n" -#: help.c:466 +#: help.c:465 #, c-format msgid "" " fieldsep\n" @@ -3817,7 +3704,7 @@ msgstr "" " fieldsep\n" " 非整列出力でのフィールド区切り文字(デフォルトは \"%s\")\n" -#: help.c:469 +#: help.c:468 msgid "" " fieldsep_zero\n" " set field separator for unaligned output to a zero byte\n" @@ -3825,7 +3712,7 @@ msgstr "" " fieldsep_zero\n" " 非整列出力でのフィールド区切り文字をバイト値の0に設定\n" -#: help.c:471 +#: help.c:470 msgid "" " footer\n" " enable or disable display of the table footer [on, off]\n" @@ -3833,7 +3720,7 @@ msgstr "" " footer\n" " テーブルフッター出力の要否を設定 [on, off]\n" -#: help.c:473 +#: help.c:472 msgid "" " format\n" " set output format [unaligned, aligned, wrapped, html, asciidoc, ...]\n" @@ -3841,7 +3728,7 @@ msgstr "" " format\n" " 出力フォーマットを設定 [unaligned, aligned, wrapped, html, asciidoc, ...]\n" -#: help.c:475 +#: help.c:474 msgid "" " linestyle\n" " set the border line drawing style [ascii, old-ascii, unicode]\n" @@ -3849,7 +3736,7 @@ msgstr "" " linestyle\n" " 境界線の描画スタイルを設定 [ascii, old-ascii, unicode]\n" -#: help.c:477 +#: help.c:476 msgid "" " null\n" " set the string to be printed in place of a null value\n" @@ -3857,7 +3744,7 @@ msgstr "" " null\n" " null 値の代わりに表示する文字列を設定\n" -#: help.c:479 +#: help.c:478 msgid "" " numericlocale\n" " enable display of a locale-specific character to separate groups of digits\n" @@ -3865,7 +3752,7 @@ msgstr "" " numericlocale\n" " ロケール固有文字での桁区切りを表示するかどうかを指定\n" -#: help.c:481 +#: help.c:480 msgid "" " pager\n" " control when an external pager is used [yes, no, always]\n" @@ -3873,7 +3760,7 @@ msgstr "" " pager\n" " いつ外部ページャーを使うかを制御 [yes, no, always]\n" -#: help.c:483 +#: help.c:482 msgid "" " recordsep\n" " record (line) separator for unaligned output\n" @@ -3881,7 +3768,7 @@ msgstr "" " recordsep\n" " 非整列出力でのレコード(行)区切り\n" -#: help.c:485 +#: help.c:484 msgid "" " recordsep_zero\n" " set record separator for unaligned output to a zero byte\n" @@ -3889,7 +3776,7 @@ msgstr "" " recordsep_zero\n" " 非整列出力でレコード区切りにバイト値の0に設定\n" -#: help.c:487 +#: help.c:486 msgid "" " tableattr (or T)\n" " specify attributes for table tag in html format, or proportional\n" @@ -3899,7 +3786,7 @@ msgstr "" " HTMLフォーマット時のtableタグの属性、もしくは latex-longtable\n" " フォーマット時に左寄せするデータ型の相対カラム幅を指定\n" -#: help.c:490 +#: help.c:489 msgid "" " title\n" " set the table title for subsequently printed tables\n" @@ -3907,7 +3794,7 @@ msgstr "" " title\n" " 以降に表示される表のタイトルを設定\n" -#: help.c:492 +#: help.c:491 msgid "" " tuples_only\n" " if set, only actual table data is shown\n" @@ -3915,7 +3802,7 @@ msgstr "" " tuples_only\n" " セットされた場合、実際のテーブルデータのみを表示\n" -#: help.c:494 +#: help.c:493 msgid "" " unicode_border_linestyle\n" " unicode_column_linestyle\n" @@ -3927,7 +3814,7 @@ msgstr "" " unicode_header_linestyle\n" " Unicode による線描画時のスタイルを設定 [single, double]\n" -#: help.c:498 +#: help.c:497 msgid "" " xheader_width\n" " set the maximum width of the header for expanded output\n" @@ -3937,7 +3824,7 @@ msgstr "" " 拡張出力のヘッダの最大幅を指定します\n" " [full, column, page, 整数値]\n" -#: help.c:502 +#: help.c:501 msgid "" "\n" "Environment variables:\n" @@ -3945,7 +3832,7 @@ msgstr "" "\n" "環境変数:\n" -#: help.c:506 +#: help.c:505 msgid "" " NAME=VALUE [NAME=VALUE] psql ...\n" " or \\setenv NAME [VALUE] inside psql\n" @@ -3955,7 +3842,7 @@ msgstr "" " またはpsql内で \\setenv 名前 [値]\n" "\n" -#: help.c:508 +#: help.c:507 msgid "" " set NAME=VALUE\n" " psql ...\n" @@ -3967,7 +3854,7 @@ msgstr "" " またはpsq内で \\setenv 名前 [値]\n" "\n" -#: help.c:511 +#: help.c:510 msgid "" " COLUMNS\n" " number of columns for wrapped format\n" @@ -3975,7 +3862,7 @@ msgstr "" " COLUMNS\n" " 折り返し書式におけるカラム数\n" -#: help.c:513 +#: help.c:512 msgid "" " PGAPPNAME\n" " same as the application_name connection parameter\n" @@ -3983,7 +3870,7 @@ msgstr "" " PGAPPNAME\n" " application_name 接続パラメータと同じ\n" -#: help.c:515 +#: help.c:514 msgid "" " PGDATABASE\n" " same as the dbname connection parameter\n" @@ -3991,7 +3878,7 @@ msgstr "" " PGDATABASE\n" " dbname 接続パラメータと同じ\n" -#: help.c:517 +#: help.c:516 msgid "" " PGHOST\n" " same as the host connection parameter\n" @@ -3999,7 +3886,7 @@ msgstr "" " PGHOST\n" " host 接続パラメータと同じ\n" -#: help.c:519 +#: help.c:518 msgid "" " PGPASSFILE\n" " password file name\n" @@ -4007,7 +3894,7 @@ msgstr "" " PGPASSFILE\n" " パスワードファイル名\n" -#: help.c:521 +#: help.c:520 msgid "" " PGPASSWORD\n" " connection password (not recommended)\n" @@ -4015,7 +3902,7 @@ msgstr "" " PGPASSWORD\n" " 接続用パスワード (推奨されません)\n" -#: help.c:523 +#: help.c:522 msgid "" " PGPORT\n" " same as the port connection parameter\n" @@ -4023,7 +3910,7 @@ msgstr "" " PGPORT\n" " port 接続パラメータと同じ\n" -#: help.c:525 +#: help.c:524 msgid "" " PGUSER\n" " same as the user connection parameter\n" @@ -4031,7 +3918,7 @@ msgstr "" " PGUSER\n" " user 接続パラメータと同じ\n" -#: help.c:527 +#: help.c:526 msgid "" " PSQL_EDITOR, EDITOR, VISUAL\n" " editor used by the \\e, \\ef, and \\ev commands\n" @@ -4039,7 +3926,7 @@ msgstr "" " PSQL_EDITOR, EDITOR, VISUAL\n" " \\e, \\ef, \\ev コマンドで使われるエディタ\n" -#: help.c:529 +#: help.c:528 msgid "" " PSQL_EDITOR_LINENUMBER_ARG\n" " how to specify a line number when invoking the editor\n" @@ -4047,7 +3934,7 @@ msgstr "" " PSQL_EDITOR_LINENUMBER_ARG\n" " エディタの起動時に行番号を指定する方法\n" -#: help.c:531 +#: help.c:530 msgid "" " PSQL_HISTORY\n" " alternative location for the command history file\n" @@ -4055,7 +3942,7 @@ msgstr "" " PSQL_HISTORY\n" " コマンドライン履歴ファイルの代替の場所\n" -#: help.c:533 +#: help.c:532 msgid "" " PSQL_PAGER, PAGER\n" " name of external pager program\n" @@ -4063,7 +3950,7 @@ msgstr "" " PSQL_PAGER, PAGER\n" " 外部ページャープログラムの名前\n" -#: help.c:536 +#: help.c:535 msgid "" " PSQL_WATCH_PAGER\n" " name of external pager program used for \\watch\n" @@ -4071,7 +3958,7 @@ msgstr "" " PSQL_PAGER, PAGER\n" " \\watchで使用する外部ページャープログラムの名前\n" -#: help.c:539 +#: help.c:538 msgid "" " PSQLRC\n" " alternative location for the user's .psqlrc file\n" @@ -4079,7 +3966,7 @@ msgstr "" " PSQLRC\n" " ユーザーの .psqlrc ファイルの代替の場所\n" -#: help.c:541 +#: help.c:540 msgid "" " SHELL\n" " shell used by the \\! command\n" @@ -4087,7 +3974,7 @@ msgstr "" " SHELL\n" " \\! コマンドで使われるシェル\n" -#: help.c:543 +#: help.c:542 msgid "" " TMPDIR\n" " directory for temporary files\n" @@ -4095,11 +3982,11 @@ msgstr "" " TMPDIR\n" " テンポラリファイル用ディレクトリ\n" -#: help.c:603 +#: help.c:602 msgid "Available help:\n" msgstr "利用可能なヘルプ:\n" -#: help.c:698 +#: help.c:697 #, c-format msgid "" "Command: %s\n" @@ -4118,7 +4005,7 @@ msgstr "" "URL: %s\n" "\n" -#: help.c:721 +#: help.c:720 #, c-format msgid "" "No help available for \"%s\".\n" @@ -4224,12 +4111,17 @@ msgstr "問い合わせは無視されました; \\endifかCtrl-Cで現在の\\i msgid "reached EOF without finding closing \\endif(s)" msgstr "ブロックを閉じる\\endifを検出中に、ファイルの終端(EOF)に達しました" -#: psqlscanslash.l:633 +#: psqlscan.l:732 +#, c-format +msgid "skipping recursive expansion of variable \"%s\"" +msgstr "変数\"%s\"の再帰展開をスキップしています" + +#: psqlscanslash.l:642 #, c-format msgid "unterminated quoted string" msgstr "文字列の引用符が閉じていません" -#: psqlscanslash.l:834 +#: psqlscanslash.l:842 #, c-format msgid "%s: out of memory" msgstr "%s: メモリ不足です" @@ -4253,52 +4145,52 @@ msgstr "%s: メモリ不足です" #: 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:1088 -#: sql_help.c:1098 sql_help.c:1099 sql_help.c:1101 sql_help.c:1103 -#: sql_help.c:1115 sql_help.c:1119 sql_help.c:1121 sql_help.c:1133 -#: sql_help.c:1135 sql_help.c:1137 sql_help.c:1139 sql_help.c:1158 -#: sql_help.c:1160 sql_help.c:1164 sql_help.c:1168 sql_help.c:1172 -#: sql_help.c:1175 sql_help.c:1176 sql_help.c:1177 sql_help.c:1180 -#: sql_help.c:1183 sql_help.c:1185 sql_help.c:1326 sql_help.c:1328 -#: sql_help.c:1331 sql_help.c:1334 sql_help.c:1336 sql_help.c:1338 -#: sql_help.c:1341 sql_help.c:1344 sql_help.c:1471 sql_help.c:1473 -#: sql_help.c:1475 sql_help.c:1478 sql_help.c:1499 sql_help.c:1502 -#: sql_help.c:1505 sql_help.c:1508 sql_help.c:1512 sql_help.c:1514 -#: sql_help.c:1516 sql_help.c:1518 sql_help.c:1532 sql_help.c:1535 -#: sql_help.c:1537 sql_help.c:1539 sql_help.c:1549 sql_help.c:1551 -#: sql_help.c:1561 sql_help.c:1563 sql_help.c:1573 sql_help.c:1576 -#: sql_help.c:1599 sql_help.c:1601 sql_help.c:1603 sql_help.c:1605 -#: sql_help.c:1608 sql_help.c:1610 sql_help.c:1613 sql_help.c:1616 -#: sql_help.c:1667 sql_help.c:1710 sql_help.c:1713 sql_help.c:1715 -#: sql_help.c:1717 sql_help.c:1720 sql_help.c:1722 sql_help.c:1724 -#: sql_help.c:1727 sql_help.c:1777 sql_help.c:1793 sql_help.c:2028 -#: sql_help.c:2097 sql_help.c:2116 sql_help.c:2129 sql_help.c:2187 -#: sql_help.c:2195 sql_help.c:2205 sql_help.c:2233 sql_help.c:2266 -#: sql_help.c:2284 sql_help.c:2312 sql_help.c:2427 sql_help.c:2473 -#: sql_help.c:2498 sql_help.c:2521 sql_help.c:2525 sql_help.c:2559 -#: sql_help.c:2579 sql_help.c:2601 sql_help.c:2615 sql_help.c:2636 -#: sql_help.c:2665 sql_help.c:2698 sql_help.c:2721 sql_help.c:2770 -#: sql_help.c:3074 sql_help.c:3087 sql_help.c:3104 sql_help.c:3120 -#: sql_help.c:3160 sql_help.c:3214 sql_help.c:3218 sql_help.c:3220 -#: sql_help.c:3227 sql_help.c:3246 sql_help.c:3273 sql_help.c:3308 -#: sql_help.c:3320 sql_help.c:3329 sql_help.c:3375 sql_help.c:3389 -#: sql_help.c:3417 sql_help.c:3425 sql_help.c:3437 sql_help.c:3447 -#: sql_help.c:3455 sql_help.c:3463 sql_help.c:3471 sql_help.c:3479 -#: sql_help.c:3488 sql_help.c:3499 sql_help.c:3507 sql_help.c:3515 -#: sql_help.c:3523 sql_help.c:3531 sql_help.c:3541 sql_help.c:3550 -#: sql_help.c:3559 sql_help.c:3567 sql_help.c:3577 sql_help.c:3588 -#: sql_help.c:3596 sql_help.c:3605 sql_help.c:3616 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:3673 sql_help.c:3681 sql_help.c:3689 -#: sql_help.c:3697 sql_help.c:3705 sql_help.c:3722 sql_help.c:3731 -#: sql_help.c:3739 sql_help.c:3756 sql_help.c:3771 sql_help.c:4086 -#: sql_help.c:4209 sql_help.c:4238 sql_help.c:4254 sql_help.c:4256 -#: sql_help.c:4760 sql_help.c:4808 sql_help.c:4967 +#: 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:340 sql_help.c:1870 -#: sql_help.c:3390 sql_help.c:4527 +#: 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 "集約関数のシグニチャー" @@ -4306,10 +4198,10 @@ msgstr "集約関数のシグニチャー" #: 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:1102 sql_help.c:1122 -#: sql_help.c:1136 sql_help.c:1186 sql_help.c:1335 sql_help.c:1472 -#: sql_help.c:1515 sql_help.c:1536 sql_help.c:1550 sql_help.c:1562 -#: sql_help.c:1575 sql_help.c:1602 sql_help.c:1668 sql_help.c:1721 +#: 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 "新しい名前" @@ -4317,21 +4209,21 @@ msgstr "新しい名前" #: 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:1100 sql_help.c:1120 sql_help.c:1134 sql_help.c:1184 -#: sql_help.c:1401 sql_help.c:1474 sql_help.c:1517 sql_help.c:1538 -#: sql_help.c:1600 sql_help.c:1716 sql_help.c:3060 +#: 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: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:1104 -#: sql_help.c:1138 sql_help.c:1337 sql_help.c:1519 sql_help.c:1540 -#: sql_help.c:1552 sql_help.c:1564 sql_help.c:1604 sql_help.c:1723 +#: 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:1934 sql_help.c:3391 sql_help.c:4556 +#: sql_help.c:44 sql_help.c:1927 sql_help.c:3368 sql_help.c:4529 msgid "where aggregate_signature is:" msgstr "集約関数のシグニチャーには以下のものがあります:" @@ -4340,13 +4232,13 @@ msgstr "集約関数のシグニチャーには以下のものがあります:" #: 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:1888 sql_help.c:1905 sql_help.c:1911 sql_help.c:1935 -#: sql_help.c:1938 sql_help.c:1941 sql_help.c:2098 sql_help.c:2117 -#: sql_help.c:2120 sql_help.c:2428 sql_help.c:2637 sql_help.c:3392 -#: sql_help.c:3395 sql_help.c:3398 sql_help.c:3489 sql_help.c:3578 -#: sql_help.c:3606 sql_help.c:3959 sql_help.c:4426 sql_help.c:4533 -#: sql_help.c:4540 sql_help.c:4546 sql_help.c:4557 sql_help.c:4560 -#: sql_help.c:4563 +#: 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 "引数のモード" @@ -4355,12 +4247,12 @@ msgstr "引数のモード" #: 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:1889 sql_help.c:1906 sql_help.c:1912 sql_help.c:1936 -#: sql_help.c:1939 sql_help.c:1942 sql_help.c:2099 sql_help.c:2118 -#: sql_help.c:2121 sql_help.c:2429 sql_help.c:2638 sql_help.c:3393 -#: sql_help.c:3396 sql_help.c:3399 sql_help.c:3490 sql_help.c:3579 -#: sql_help.c:3607 sql_help.c:4534 sql_help.c:4541 sql_help.c:4547 -#: sql_help.c:4558 sql_help.c:4561 sql_help.c:4564 +#: 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 "引数の名前" @@ -4369,70 +4261,70 @@ msgstr "引数の名前" #: 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:1890 sql_help.c:1907 sql_help.c:1913 sql_help.c:1937 -#: sql_help.c:1940 sql_help.c:1943 sql_help.c:2430 sql_help.c:2639 -#: sql_help.c:3394 sql_help.c:3397 sql_help.c:3400 sql_help.c:3491 -#: sql_help.c:3580 sql_help.c:3608 sql_help.c:4535 sql_help.c:4542 -#: sql_help.c:4548 sql_help.c:4559 sql_help.c:4562 sql_help.c:4565 +#: 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:407 sql_help.c:484 sql_help.c:496 sql_help.c:965 -#: sql_help.c:1117 sql_help.c:1533 sql_help.c:1662 sql_help.c:1694 -#: sql_help.c:1746 sql_help.c:1805 sql_help.c:1995 sql_help.c:2002 -#: sql_help.c:2315 sql_help.c:2368 sql_help.c:2375 sql_help.c:2384 -#: sql_help.c:2474 sql_help.c:2699 sql_help.c:2792 sql_help.c:3089 -#: sql_help.c:3274 sql_help.c:3296 sql_help.c:3438 sql_help.c:3795 -#: sql_help.c:4003 sql_help.c:4253 sql_help.c:4255 sql_help.c:5035 +#: 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:966 sql_help.c:1663 sql_help.c:2475 -#: sql_help.c:2700 sql_help.c:3275 sql_help.c:3439 +#: 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:2247 +#: sql_help.c:116 sql_help.c:2238 msgid "allowconn" msgstr "接続の可否(真偽値)" -#: sql_help.c:117 sql_help.c:967 sql_help.c:1664 sql_help.c:2248 -#: sql_help.c:2476 sql_help.c:2701 sql_help.c:3276 +#: 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:2249 +#: sql_help.c:118 sql_help.c:2240 msgid "istemplate" msgstr "テンプレートかどうか(真偽値)" -#: sql_help.c:124 sql_help.c:621 sql_help.c:689 sql_help.c:703 sql_help.c:1340 -#: sql_help.c:1394 sql_help.c:4259 +#: 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: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:1197 sql_help.c:1199 sql_help.c:1671 -#: sql_help.c:1675 sql_help.c:1678 sql_help.c:2440 sql_help.c:2643 -#: sql_help.c:3971 sql_help.c:4277 sql_help.c:4438 sql_help.c:4748 +#: 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: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:1118 -#: sql_help.c:1163 sql_help.c:1167 sql_help.c:1171 sql_help.c:1174 -#: sql_help.c:1179 sql_help.c:1182 sql_help.c:1198 sql_help.c:1373 -#: sql_help.c:1396 sql_help.c:1449 sql_help.c:1457 sql_help.c:1477 -#: sql_help.c:1534 sql_help.c:1618 sql_help.c:1672 sql_help.c:1695 -#: sql_help.c:2316 sql_help.c:2369 sql_help.c:2376 sql_help.c:2385 -#: sql_help.c:2441 sql_help.c:2442 sql_help.c:2506 sql_help.c:2509 -#: sql_help.c:2543 sql_help.c:2644 sql_help.c:2645 sql_help.c:2668 -#: sql_help.c:2793 sql_help.c:2832 sql_help.c:2943 sql_help.c:2956 -#: sql_help.c:2970 sql_help.c:3016 sql_help.c:3024 sql_help.c:3046 -#: sql_help.c:3063 sql_help.c:3090 sql_help.c:3297 sql_help.c:4004 -#: sql_help.c:4749 sql_help.c:4750 sql_help.c:4751 sql_help.c:4752 +#: 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 "値" @@ -4440,10 +4332,10 @@ msgstr "値" msgid "target_role" msgstr "対象のロール" -#: sql_help.c:203 sql_help.c:929 sql_help.c:2300 sql_help.c:2673 -#: sql_help.c:2746 sql_help.c:2751 sql_help.c:3934 sql_help.c:3943 -#: sql_help.c:3962 sql_help.c:3974 sql_help.c:4401 sql_help.c:4410 -#: sql_help.c:4429 sql_help.c:4441 +#: 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 "スキーマ名" @@ -4458,56 +4350,56 @@ msgstr "GRANT/REVOKEの省略形は以下のいずれかです:" #: 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:1339 sql_help.c:1682 sql_help.c:2479 sql_help.c:2480 -#: sql_help.c:2481 sql_help.c:2482 sql_help.c:2483 sql_help.c:2617 -#: sql_help.c:2704 sql_help.c:2705 sql_help.c:2706 sql_help.c:3279 -#: sql_help.c:3280 sql_help.c:3281 sql_help.c:3282 sql_help.c:3283 -#: sql_help.c:3983 sql_help.c:3987 sql_help.c:4450 sql_help.c:4454 -#: sql_help.c:4770 +#: 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:246 sql_help.c:265 sql_help.c:472 sql_help.c:928 sql_help.c:1355 -#: sql_help.c:1357 sql_help.c:1361 sql_help.c:1411 sql_help.c:1423 -#: sql_help.c:1453 sql_help.c:1712 sql_help.c:2269 sql_help.c:2273 -#: sql_help.c:2388 sql_help.c:2394 sql_help.c:2502 sql_help.c:2672 -#: sql_help.c:2809 sql_help.c:2814 sql_help.c:2816 sql_help.c:2938 -#: sql_help.c:2951 sql_help.c:2965 sql_help.c:2974 sql_help.c:2986 -#: sql_help.c:3020 sql_help.c:4036 sql_help.c:4052 sql_help.c:4054 -#: sql_help.c:4152 sql_help.c:4155 sql_help.c:4157 sql_help.c:4620 -#: sql_help.c:4621 sql_help.c:4630 sql_help.c:4677 sql_help.c:4678 -#: sql_help.c:4679 sql_help.c:4680 sql_help.c:4681 sql_help.c:4682 -#: sql_help.c:4723 sql_help.c:4724 sql_help.c:4729 sql_help.c:4734 -#: sql_help.c:4878 sql_help.c:4879 sql_help.c:4888 sql_help.c:4935 -#: sql_help.c:4936 sql_help.c:4937 sql_help.c:4938 sql_help.c:4939 -#: sql_help.c:4940 sql_help.c:4996 sql_help.c:4998 sql_help.c:5065 -#: sql_help.c:5125 sql_help.c:5126 sql_help.c:5135 sql_help.c:5182 -#: sql_help.c:5183 sql_help.c:5184 sql_help.c:5185 sql_help.c:5186 -#: sql_help.c:5187 +#: 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:249 sql_help.c:2270 +#: sql_help.c:249 sql_help.c:2261 msgid "domain_constraint" msgstr "ドメイン制約" #: 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:1332 sql_help.c:1381 sql_help.c:1382 -#: sql_help.c:1383 sql_help.c:1410 sql_help.c:1422 sql_help.c:1444 -#: sql_help.c:1876 sql_help.c:1878 sql_help.c:2272 sql_help.c:2387 -#: sql_help.c:2392 sql_help.c:2973 sql_help.c:2985 sql_help.c:4049 +#: 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:254 sql_help.c:1333 +#: sql_help.c:254 sql_help.c:1331 msgid "new_constraint_name" msgstr "新しい制約名" -#: sql_help.c:263 sql_help.c:2271 +#: sql_help.c:263 sql_help.c:2262 msgid "where domain_constraint is:" msgstr "ドメイン制約は以下の通りです:" -#: sql_help.c:330 sql_help.c:1116 +#: sql_help.c:330 sql_help.c:1115 msgid "new_version" msgstr "新しいバージョン" @@ -4523,82 +4415,82 @@ msgstr "メンバーオブジェクトは以下の通りです:" #: 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:1868 sql_help.c:1873 sql_help.c:1880 -#: sql_help.c:1881 sql_help.c:1882 sql_help.c:1883 sql_help.c:1884 -#: sql_help.c:1885 sql_help.c:1886 sql_help.c:1891 sql_help.c:1893 -#: sql_help.c:1897 sql_help.c:1899 sql_help.c:1903 sql_help.c:1908 -#: sql_help.c:1909 sql_help.c:1916 sql_help.c:1917 sql_help.c:1918 -#: sql_help.c:1919 sql_help.c:1920 sql_help.c:1921 sql_help.c:1922 -#: sql_help.c:1923 sql_help.c:1924 sql_help.c:1925 sql_help.c:1926 -#: sql_help.c:1931 sql_help.c:1932 sql_help.c:4523 sql_help.c:4528 -#: sql_help.c:4529 sql_help.c:4530 sql_help.c:4531 sql_help.c:4537 -#: sql_help.c:4538 sql_help.c:4543 sql_help.c:4544 sql_help.c:4549 -#: sql_help.c:4550 sql_help.c:4551 sql_help.c:4552 sql_help.c:4553 -#: sql_help.c:4554 +#: 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:339 sql_help.c:1869 sql_help.c:4526 +#: sql_help.c:339 sql_help.c:1862 sql_help.c:4499 msgid "aggregate_name" msgstr "集約関数名" -#: sql_help.c:341 sql_help.c:1871 sql_help.c:2163 sql_help.c:2167 -#: sql_help.c:2169 sql_help.c:3408 +#: 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:342 sql_help.c:1872 sql_help.c:2164 sql_help.c:2168 -#: sql_help.c:2170 sql_help.c:3409 +#: 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:349 sql_help.c:802 sql_help.c:1887 sql_help.c:2165 -#: sql_help.c:2208 sql_help.c:2288 sql_help.c:2560 sql_help.c:2591 -#: sql_help.c:3166 sql_help.c:4425 sql_help.c:4532 sql_help.c:4649 -#: sql_help.c:4653 sql_help.c:4657 sql_help.c:4660 sql_help.c:4907 -#: sql_help.c:4911 sql_help.c:4915 sql_help.c:4918 sql_help.c:5154 -#: sql_help.c:5158 sql_help.c:5162 sql_help.c:5165 +#: 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:354 sql_help.c:795 sql_help.c:1894 sql_help.c:2584 +#: sql_help.c:354 sql_help.c:795 sql_help.c:1887 sql_help.c:2571 msgid "operator_name" msgstr "演算子名" -#: sql_help.c:355 sql_help.c:729 sql_help.c:733 sql_help.c:737 sql_help.c:1895 -#: sql_help.c:2561 sql_help.c:3532 +#: 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:356 sql_help.c:730 sql_help.c:734 sql_help.c:738 sql_help.c:1896 -#: sql_help.c:2562 sql_help.c:3533 +#: 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: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:1431 sql_help.c:1898 sql_help.c:1900 sql_help.c:2581 -#: sql_help.c:2602 sql_help.c:2994 sql_help.c:3542 sql_help.c:3551 +#: 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:362 sql_help.c:1904 sql_help.c:4539 +#: sql_help.c:362 sql_help.c:1897 sql_help.c:4512 msgid "procedure_name" msgstr "プロシージャ名" -#: sql_help.c:366 sql_help.c:1910 sql_help.c:3958 sql_help.c:4545 +#: sql_help.c:366 sql_help.c:1903 sql_help.c:3935 sql_help.c:4518 msgid "routine_name" msgstr "ルーチン名" -#: sql_help.c:378 sql_help.c:1400 sql_help.c:1927 sql_help.c:2436 -#: sql_help.c:2642 sql_help.c:2946 sql_help.c:3133 sql_help.c:3713 -#: sql_help.c:3980 sql_help.c:4447 +#: 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:379 sql_help.c:1928 sql_help.c:2435 sql_help.c:2641 -#: sql_help.c:3134 sql_help.c:3366 sql_help.c:3714 sql_help.c:3965 -#: sql_help.c:4432 +#: 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 "言語名" @@ -4606,149 +4498,147 @@ msgstr "言語名" msgid "and aggregate_signature is:" msgstr "集約関数のシグニチャーは以下の通りです:" -#: sql_help.c:405 sql_help.c:2030 sql_help.c:2313 +#: sql_help.c:405 sql_help.c:2021 sql_help.c:2304 msgid "handler_function" msgstr "ハンドラー関数" -#: sql_help.c:406 sql_help.c:2314 +#: sql_help.c:406 sql_help.c:2305 msgid "validator_function" msgstr "バリデーター関数" #: sql_help.c:454 sql_help.c:533 sql_help.c:677 sql_help.c:869 sql_help.c:1019 -#: sql_help.c:1327 sql_help.c:1609 +#: sql_help.c:1325 sql_help.c:1602 msgid "action" msgstr "アクション" #: 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:1097 -#: sql_help.c:1329 sql_help.c:1347 sql_help.c:1351 sql_help.c:1352 -#: sql_help.c:1356 sql_help.c:1358 sql_help.c:1359 sql_help.c:1360 -#: sql_help.c:1362 sql_help.c:1363 sql_help.c:1365 sql_help.c:1368 -#: sql_help.c:1369 sql_help.c:1371 sql_help.c:1374 sql_help.c:1376 -#: sql_help.c:1377 sql_help.c:1424 sql_help.c:1425 sql_help.c:1426 -#: sql_help.c:1428 sql_help.c:1429 sql_help.c:1436 sql_help.c:1437 -#: sql_help.c:1447 sql_help.c:1452 sql_help.c:1459 sql_help.c:1460 -#: sql_help.c:1711 sql_help.c:1714 sql_help.c:1718 sql_help.c:1754 -#: sql_help.c:1875 sql_help.c:1992 sql_help.c:1998 sql_help.c:2012 -#: sql_help.c:2013 sql_help.c:2014 sql_help.c:2366 sql_help.c:2379 -#: sql_help.c:2393 sql_help.c:2433 sql_help.c:2501 sql_help.c:2507 -#: sql_help.c:2540 sql_help.c:2671 sql_help.c:2778 sql_help.c:2813 -#: sql_help.c:2815 sql_help.c:2928 sql_help.c:2937 sql_help.c:2947 -#: sql_help.c:2950 sql_help.c:2960 sql_help.c:2964 sql_help.c:2987 -#: sql_help.c:2988 sql_help.c:2989 sql_help.c:2991 sql_help.c:2992 -#: sql_help.c:2999 sql_help.c:3000 sql_help.c:3014 sql_help.c:3019 -#: sql_help.c:3026 sql_help.c:3027 sql_help.c:3043 sql_help.c:3169 -#: sql_help.c:3309 sql_help.c:3937 sql_help.c:3938 sql_help.c:4035 -#: sql_help.c:4051 sql_help.c:4053 sql_help.c:4055 sql_help.c:4151 -#: sql_help.c:4154 sql_help.c:4156 sql_help.c:4158 sql_help.c:4404 -#: sql_help.c:4405 sql_help.c:4525 sql_help.c:4686 sql_help.c:4693 -#: sql_help.c:4695 sql_help.c:4944 sql_help.c:4951 sql_help.c:4953 -#: sql_help.c:4995 sql_help.c:4997 sql_help.c:4999 sql_help.c:5053 -#: sql_help.c:5191 sql_help.c:5198 sql_help.c:5200 +#: 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:457 sql_help.c:682 sql_help.c:1330 sql_help.c:1719 +#: sql_help.c:457 sql_help.c:682 sql_help.c:1328 sql_help.c:1712 msgid "new_column_name" msgstr "新しい列名" #: sql_help.c:462 sql_help.c:554 sql_help.c:690 sql_help.c:890 sql_help.c:1040 -#: sql_help.c:1346 sql_help.c:1619 +#: sql_help.c:1344 sql_help.c:1612 msgid "where action is one of:" msgstr "アクションは以下のいずれかです:" -#: sql_help.c:464 sql_help.c:469 sql_help.c:1089 sql_help.c:1348 -#: sql_help.c:1353 sql_help.c:1621 sql_help.c:1625 sql_help.c:2267 -#: sql_help.c:2367 sql_help.c:2580 sql_help.c:2771 sql_help.c:2929 -#: sql_help.c:3216 sql_help.c:4210 +#: 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:465 sql_help.c:470 sql_help.c:1349 sql_help.c:1354 -#: sql_help.c:1454 sql_help.c:1622 sql_help.c:1626 sql_help.c:2268 -#: sql_help.c:2370 sql_help.c:2503 sql_help.c:2931 sql_help.c:2939 -#: sql_help.c:2952 sql_help.c:2966 sql_help.c:3021 sql_help.c:3217 -#: sql_help.c:3223 sql_help.c:4046 +#: 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:466 sql_help.c:1350 sql_help.c:2371 sql_help.c:2380 -#: sql_help.c:2932 sql_help.c:2948 sql_help.c:2961 +#: 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:476 sql_help.c:618 sql_help.c:692 sql_help.c:1370 sql_help.c:5047 +#: 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:478 sql_help.c:481 sql_help.c:694 sql_help.c:697 sql_help.c:1372 -#: sql_help.c:1375 +#: 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:486 sql_help.c:1379 sql_help.c:2372 sql_help.c:2381 -#: sql_help.c:2933 sql_help.c:2949 sql_help.c:2962 +#: 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:489 sql_help.c:490 sql_help.c:491 sql_help.c:492 sql_help.c:1384 -#: sql_help.c:1385 sql_help.c:1386 sql_help.c:1387 sql_help.c:1929 +#: 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:493 sql_help.c:494 sql_help.c:1398 sql_help.c:1399 -#: sql_help.c:2373 sql_help.c:2378 sql_help.c:2936 sql_help.c:2959 +#: 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:553 sql_help.c:610 sql_help.c:679 sql_help.c:889 sql_help.c:1039 -#: sql_help.c:1578 sql_help.c:2299 +#: sql_help.c:1571 sql_help.c:2290 msgid "extension_name" msgstr "拡張名" -#: sql_help.c:555 sql_help.c:1041 sql_help.c:2437 +#: sql_help.c:555 sql_help.c:1041 sql_help.c:2424 msgid "execution_cost" msgstr "実行コスト" -#: sql_help.c:556 sql_help.c:1042 sql_help.c:2438 +#: sql_help.c:556 sql_help.c:1042 sql_help.c:2425 msgid "result_rows" msgstr "結果の行数" -#: sql_help.c:557 sql_help.c:2439 +#: sql_help.c:557 sql_help.c:2426 msgid "support_function" msgstr "サポート関数" #: 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:1661 sql_help.c:1669 -#: sql_help.c:1673 sql_help.c:1676 sql_help.c:1679 sql_help.c:2747 -#: sql_help.c:2749 sql_help.c:2752 sql_help.c:2753 sql_help.c:3935 -#: sql_help.c:3936 sql_help.c:3940 sql_help.c:3941 sql_help.c:3944 -#: sql_help.c:3945 sql_help.c:3947 sql_help.c:3948 sql_help.c:3950 -#: sql_help.c:3951 sql_help.c:3953 sql_help.c:3954 sql_help.c:3956 -#: sql_help.c:3957 sql_help.c:3963 sql_help.c:3964 sql_help.c:3966 -#: sql_help.c:3967 sql_help.c:3969 sql_help.c:3970 sql_help.c:3972 -#: sql_help.c:3973 sql_help.c:3975 sql_help.c:3976 sql_help.c:3978 -#: sql_help.c:3979 sql_help.c:3981 sql_help.c:3982 sql_help.c:3984 -#: sql_help.c:3985 sql_help.c:4402 sql_help.c:4403 sql_help.c:4407 -#: sql_help.c:4408 sql_help.c:4411 sql_help.c:4412 sql_help.c:4414 -#: sql_help.c:4415 sql_help.c:4417 sql_help.c:4418 sql_help.c:4420 -#: sql_help.c:4421 sql_help.c:4423 sql_help.c:4424 sql_help.c:4430 -#: sql_help.c:4431 sql_help.c:4433 sql_help.c:4434 sql_help.c:4436 -#: sql_help.c:4437 sql_help.c:4439 sql_help.c:4440 sql_help.c:4442 -#: sql_help.c:4443 sql_help.c:4445 sql_help.c:4446 sql_help.c:4448 -#: sql_help.c:4449 sql_help.c:4451 sql_help.c:4452 +#: 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:580 sql_help.c:582 sql_help.c:1692 sql_help.c:2234 -#: sql_help.c:2755 sql_help.c:3294 sql_help.c:3747 sql_help.c:4780 +#: 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:583 sql_help.c:984 sql_help.c:1681 sql_help.c:2754 -#: sql_help.c:3986 sql_help.c:4453 +#: 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 "ロール指定は以下の通りです:" @@ -4756,22 +4646,22 @@ msgstr "ロール指定は以下の通りです:" msgid "group_name" msgstr "グループ名" -#: sql_help.c:606 sql_help.c:1450 sql_help.c:2246 sql_help.c:2510 -#: sql_help.c:2544 sql_help.c:2944 sql_help.c:2957 sql_help.c:2971 -#: sql_help.c:3017 sql_help.c:3047 sql_help.c:3059 sql_help.c:3977 -#: sql_help.c:4444 +#: 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:608 sql_help.c:701 sql_help.c:1392 sql_help.c:1402 -#: sql_help.c:1445 sql_help.c:1807 +#: 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:612 sql_help.c:615 sql_help.c:704 sql_help.c:706 sql_help.c:1395 -#: sql_help.c:1397 sql_help.c:1448 sql_help.c:2508 sql_help.c:2542 -#: sql_help.c:2942 sql_help.c:2955 sql_help.c:2969 sql_help.c:3015 -#: sql_help.c:3045 +#: 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 "ストレージパラメータ" @@ -4779,1916 +4669,1907 @@ msgstr "ストレージパラメータ" msgid "column_number" msgstr "列番号" -#: sql_help.c:641 sql_help.c:1892 sql_help.c:4536 +#: sql_help.c:641 sql_help.c:1885 sql_help.c:4509 msgid "large_object_oid" msgstr "ラージオブジェクトのOID" -#: sql_help.c:700 sql_help.c:1378 sql_help.c:2930 +#: sql_help.c:700 sql_help.c:1376 sql_help.c:2914 msgid "compression_method" msgstr "圧縮方式" -#: sql_help.c:702 sql_help.c:1393 +#: sql_help.c:702 sql_help.c:1391 msgid "new_access_method" msgstr "新しいアクセスメソッド" -#: sql_help.c:739 sql_help.c:2565 +#: sql_help.c:739 sql_help.c:2552 msgid "res_proc" msgstr "制約選択評価関数" -#: sql_help.c:740 sql_help.c:2566 +#: sql_help.c:740 sql_help.c:2553 msgid "join_proc" msgstr "結合選択評価関数" -#: sql_help.c:741 sql_help.c:2563 +#: sql_help.c:741 sql_help.c:2550 msgid "com_op" msgstr "交代演算子" -#: sql_help.c:742 sql_help.c:2564 +#: sql_help.c:742 sql_help.c:2551 msgid "neg_op" msgstr "否定演算子" -#: sql_help.c:794 sql_help.c:806 sql_help.c:2583 +#: sql_help.c:794 sql_help.c:806 sql_help.c:2570 msgid "strategy_number" msgstr "戦略番号" #: 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:2585 sql_help.c:2586 -#: sql_help.c:2589 sql_help.c:2590 +#: 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:798 sql_help.c:2587 +#: sql_help.c:798 sql_help.c:2574 msgid "sort_family_name" msgstr "ソートファミリー名" -#: sql_help.c:799 sql_help.c:809 sql_help.c:2588 +#: sql_help.c:799 sql_help.c:809 sql_help.c:2575 msgid "support_number" msgstr "サポート番号" -#: sql_help.c:803 sql_help.c:2166 sql_help.c:2592 sql_help.c:3136 -#: sql_help.c:3138 +#: 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:834 sql_help.c:837 sql_help.c:926 sql_help.c:1055 sql_help.c:1096 -#: sql_help.c:1574 sql_help.c:1577 sql_help.c:1753 sql_help.c:1806 -#: sql_help.c:1877 sql_help.c:1902 sql_help.c:1915 sql_help.c:1930 -#: sql_help.c:1991 sql_help.c:1997 sql_help.c:2365 sql_help.c:2377 -#: sql_help.c:2499 sql_help.c:2539 sql_help.c:2616 sql_help.c:2670 -#: sql_help.c:2723 sql_help.c:2777 sql_help.c:2810 sql_help.c:2817 -#: sql_help.c:2927 sql_help.c:2945 sql_help.c:2958 sql_help.c:3042 -#: sql_help.c:3162 sql_help.c:3344 sql_help.c:3568 sql_help.c:3617 -#: sql_help.c:3723 sql_help.c:3933 sql_help.c:3939 sql_help.c:4000 -#: sql_help.c:4033 sql_help.c:4400 sql_help.c:4406 sql_help.c:4524 -#: sql_help.c:4637 sql_help.c:4700 sql_help.c:4739 sql_help.c:4895 -#: sql_help.c:4958 sql_help.c:4993 sql_help.c:5052 sql_help.c:5142 -#: sql_help.c:5205 +#: 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:839 sql_help.c:2618 +#: sql_help.c:839 sql_help.c:2605 msgid "using_expression" msgstr "USING式" -#: sql_help.c:840 sql_help.c:2619 +#: sql_help.c:840 sql_help.c:2606 msgid "check_expression" msgstr "CHECK式" -#: sql_help.c:913 sql_help.c:915 sql_help.c:917 sql_help.c:2666 +#: 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:2667 +#: sql_help.c:919 sql_help.c:2654 msgid "publication_parameter" msgstr "パブリケーションパラメータ" -#: sql_help.c:925 sql_help.c:2669 +#: sql_help.c:925 sql_help.c:2656 msgid "where publication_object is one of:" msgstr "発行オブジェクトは以下のいずれかです:" -#: sql_help.c:968 sql_help.c:1665 sql_help.c:2477 sql_help.c:2702 -#: sql_help.c:3277 +#: 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:969 sql_help.c:1666 sql_help.c:2478 sql_help.c:2703 -#: sql_help.c:3278 +#: 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:973 sql_help.c:977 sql_help.c:980 sql_help.c:983 sql_help.c:1670 -#: sql_help.c:1674 sql_help.c:1677 sql_help.c:1680 sql_help.c:3946 -#: sql_help.c:4413 +#: 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:1090 sql_help.c:2772 +#: sql_help.c:1089 sql_help.c:2757 msgid "increment" msgstr "増分値" -#: sql_help.c:1091 sql_help.c:2773 +#: sql_help.c:1090 sql_help.c:2758 msgid "minvalue" msgstr "最小値" -#: sql_help.c:1092 sql_help.c:2774 +#: sql_help.c:1091 sql_help.c:2759 msgid "maxvalue" msgstr "最大値" -#: sql_help.c:1093 sql_help.c:2775 sql_help.c:4633 sql_help.c:4737 -#: sql_help.c:4891 sql_help.c:5069 sql_help.c:5138 +#: 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:1094 sql_help.c:1367 +#: sql_help.c:1093 sql_help.c:1365 msgid "restart" msgstr "再開始番号" -#: sql_help.c:1095 sql_help.c:2776 +#: sql_help.c:1094 sql_help.c:2761 msgid "cache" msgstr "キャッシュ割り当て数" -#: sql_help.c:1140 +#: sql_help.c:1139 msgid "new_target" msgstr "新しいターゲット" -#: sql_help.c:1159 sql_help.c:2829 +#: sql_help.c:1158 sql_help.c:2814 msgid "conninfo" msgstr "接続文字列" -#: sql_help.c:1161 sql_help.c:1165 sql_help.c:1169 sql_help.c:2830 +#: sql_help.c:1160 sql_help.c:1164 sql_help.c:1168 sql_help.c:2815 msgid "publication_name" msgstr "パブリケーション名" -#: sql_help.c:1162 sql_help.c:1166 sql_help.c:1170 +#: sql_help.c:1161 sql_help.c:1165 sql_help.c:1169 msgid "publication_option" msgstr "パブリケーション・オプション" -#: sql_help.c:1173 +#: sql_help.c:1172 msgid "refresh_option" msgstr "{REFRESH PUBLICATION の追加オプション}" -#: sql_help.c:1178 sql_help.c:2831 +#: sql_help.c:1177 sql_help.c:2816 msgid "subscription_parameter" msgstr "{SUBSCRIPTION パラメータ名}" -#: sql_help.c:1181 +#: sql_help.c:1180 msgid "skip_option" msgstr "スキップオプション" -#: sql_help.c:1342 sql_help.c:1345 +#: sql_help.c:1340 sql_help.c:1343 msgid "partition_name" msgstr "パーティション名" -#: sql_help.c:1343 sql_help.c:2382 sql_help.c:2963 +#: sql_help.c:1341 sql_help.c:2370 sql_help.c:2947 msgid "partition_bound_spec" msgstr "パーティション境界の仕様" -#: sql_help.c:1364 sql_help.c:1414 sql_help.c:2977 +#: sql_help.c:1362 sql_help.c:1412 sql_help.c:2961 msgid "sequence_options" msgstr "シーケンスオプション" -#: sql_help.c:1366 +#: sql_help.c:1364 msgid "sequence_option" msgstr "シーケンスオプション" -#: sql_help.c:1380 +#: sql_help.c:1378 msgid "table_constraint_using_index" msgstr "インデックスを使うテーブルの制約" -#: sql_help.c:1388 sql_help.c:1389 sql_help.c:1390 sql_help.c:1391 +#: sql_help.c:1386 sql_help.c:1387 sql_help.c:1388 sql_help.c:1389 msgid "rewrite_rule_name" msgstr "書き換えルール名" -#: sql_help.c:1403 sql_help.c:2395 sql_help.c:3007 +#: sql_help.c:1401 sql_help.c:2382 sql_help.c:2986 msgid "and partition_bound_spec is:" msgstr "パーティション境界の仕様は以下の通りです:" -#: sql_help.c:1404 sql_help.c:1405 sql_help.c:1406 sql_help.c:2396 -#: sql_help.c:2397 sql_help.c:2398 sql_help.c:3008 sql_help.c:3009 -#: sql_help.c:3010 +#: 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:1407 sql_help.c:1408 sql_help.c:2399 sql_help.c:2400 -#: sql_help.c:3011 sql_help.c:3012 +#: 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:1409 +#: sql_help.c:1407 msgid "and column_constraint is:" msgstr "そしてカラム制約は以下の通りです:" -#: sql_help.c:1412 sql_help.c:2389 sql_help.c:2431 sql_help.c:2640 -#: sql_help.c:2975 +#: 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:1413 sql_help.c:2390 sql_help.c:2976 +#: sql_help.c:1411 sql_help.c:2378 sql_help.c:2960 msgid "generation_expr" msgstr "生成式" -#: sql_help.c:1415 sql_help.c:1416 sql_help.c:1427 sql_help.c:1430 -#: sql_help.c:1434 sql_help.c:2978 sql_help.c:2979 sql_help.c:2990 -#: sql_help.c:2993 sql_help.c:2997 +#: 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:1417 sql_help.c:1438 sql_help.c:2980 sql_help.c:3001 +#: sql_help.c:1415 sql_help.c:1432 sql_help.c:2964 sql_help.c:2981 msgid "reftable" msgstr "参照テーブル" -#: sql_help.c:1418 sql_help.c:1439 sql_help.c:1440 sql_help.c:2981 -#: sql_help.c:3002 sql_help.c:3003 +#: sql_help.c:1416 sql_help.c:1433 sql_help.c:2965 sql_help.c:2982 msgid "refcolumn" msgstr "参照列" -#: sql_help.c:1419 sql_help.c:1420 sql_help.c:1441 sql_help.c:1442 -#: sql_help.c:2982 sql_help.c:2983 sql_help.c:3004 sql_help.c:3005 +#: 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:1421 sql_help.c:2391 sql_help.c:2984 +#: sql_help.c:1419 sql_help.c:2379 sql_help.c:2968 msgid "and table_constraint is:" msgstr "テーブル制約は以下の通りです:" -#: sql_help.c:1432 sql_help.c:2995 +#: sql_help.c:1427 sql_help.c:2976 msgid "exclude_element" msgstr "除外対象要素" -#: sql_help.c:1433 sql_help.c:2996 sql_help.c:4631 sql_help.c:4735 -#: sql_help.c:4889 sql_help.c:5067 sql_help.c:5136 +#: 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:1435 sql_help.c:2511 sql_help.c:2998 +#: sql_help.c:1430 sql_help.c:2498 sql_help.c:2979 msgid "predicate" msgstr "インデックスの述語" -#: sql_help.c:1443 +#: sql_help.c:1436 msgid "and table_constraint_using_index is:" msgstr "テーブル制約は以下の通りです:" -#: sql_help.c:1446 sql_help.c:3013 +#: 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:1451 sql_help.c:3018 +#: sql_help.c:1444 sql_help.c:2997 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "EXCLUDE 制約の除外対象要素は以下の通りです:" -#: sql_help.c:1455 sql_help.c:2504 sql_help.c:2940 sql_help.c:2953 -#: sql_help.c:2967 sql_help.c:3022 sql_help.c:4047 +#: 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:1456 sql_help.c:2505 sql_help.c:3023 +#: sql_help.c:1449 sql_help.c:2492 sql_help.c:3002 msgid "opclass_parameter" msgstr "演算子クラスパラメータ" -#: sql_help.c:1458 sql_help.c:3025 +#: 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:1476 sql_help.c:1479 sql_help.c:3062 +#: sql_help.c:1469 sql_help.c:1472 sql_help.c:3041 msgid "tablespace_option" msgstr "テーブル空間のオプション" -#: sql_help.c:1500 sql_help.c:1503 sql_help.c:1509 sql_help.c:1513 +#: sql_help.c:1493 sql_help.c:1496 sql_help.c:1502 sql_help.c:1506 msgid "token_type" msgstr "トークンの型" -#: sql_help.c:1501 sql_help.c:1504 +#: sql_help.c:1494 sql_help.c:1497 msgid "dictionary_name" msgstr "辞書名" -#: sql_help.c:1506 sql_help.c:1510 +#: sql_help.c:1499 sql_help.c:1503 msgid "old_dictionary" msgstr "元の辞書" -#: sql_help.c:1507 sql_help.c:1511 +#: sql_help.c:1500 sql_help.c:1504 msgid "new_dictionary" msgstr "新しい辞書" -#: sql_help.c:1606 sql_help.c:1620 sql_help.c:1623 sql_help.c:1624 -#: sql_help.c:3215 +#: 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:1607 +#: sql_help.c:1600 msgid "new_attribute_name" msgstr "新しい属性名" -#: sql_help.c:1611 sql_help.c:1615 +#: sql_help.c:1604 sql_help.c:1608 msgid "new_enum_value" msgstr "新しい列挙値" -#: sql_help.c:1612 +#: sql_help.c:1605 msgid "neighbor_enum_value" msgstr "隣接した列挙値" -#: sql_help.c:1614 +#: sql_help.c:1607 msgid "existing_enum_value" msgstr "既存の列挙値" -#: sql_help.c:1617 +#: sql_help.c:1610 msgid "property" msgstr "プロパティ" -#: sql_help.c:1693 sql_help.c:2374 sql_help.c:2383 sql_help.c:2788 -#: sql_help.c:3295 sql_help.c:3748 sql_help.c:3955 sql_help.c:4001 -#: sql_help.c:4422 +#: 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:1725 sql_help.c:1728 sql_help.c:3310 +#: sql_help.c:1718 sql_help.c:1721 sql_help.c:3289 msgid "view_option_name" msgstr "ビューのオプション名" -#: sql_help.c:1726 sql_help.c:3311 +#: sql_help.c:1719 sql_help.c:3290 msgid "view_option_value" msgstr "ビューオプションの値" -#: sql_help.c:1747 sql_help.c:5036 +#: sql_help.c:1740 sql_help.c:5007 msgid "table_and_columns" msgstr "テーブルおよび列" -#: sql_help.c:1748 sql_help.c:1808 sql_help.c:2003 sql_help.c:3797 -#: sql_help.c:4257 sql_help.c:5037 +#: 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:1749 sql_help.c:1750 sql_help.c:1809 sql_help.c:2005 -#: sql_help.c:2009 sql_help.c:2192 sql_help.c:3798 sql_help.c:3799 -#: sql_help.c:3800 sql_help.c:3801 sql_help.c:3802 sql_help.c:3803 -#: sql_help.c:3804 sql_help.c:3805 sql_help.c:3806 sql_help.c:3807 -#: sql_help.c:4258 sql_help.c:4260 sql_help.c:5038 sql_help.c:5039 -#: sql_help.c:5040 sql_help.c:5041 sql_help.c:5042 sql_help.c:5043 -#: sql_help.c:5044 sql_help.c:5045 sql_help.c:5046 sql_help.c:5048 -#: sql_help.c:5049 +#: 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:1751 sql_help.c:5050 +#: sql_help.c:1744 sql_help.c:5021 msgid "size" msgstr "サイズ" -#: sql_help.c:1752 sql_help.c:5051 +#: sql_help.c:1745 sql_help.c:5022 msgid "and table_and_columns is:" msgstr "そしてテーブルと列の指定は以下の通りです:" -#: sql_help.c:1768 sql_help.c:4796 sql_help.c:4798 sql_help.c:4822 +#: sql_help.c:1761 sql_help.c:4769 sql_help.c:4771 sql_help.c:4795 msgid "transaction_mode" msgstr "トランザクションのモード" -#: sql_help.c:1769 sql_help.c:4799 sql_help.c:4823 +#: sql_help.c:1762 sql_help.c:4772 sql_help.c:4796 msgid "where transaction_mode is one of:" msgstr "トランザクションのモードは以下の通りです:" -#: sql_help.c:1778 sql_help.c:4641 sql_help.c:4650 sql_help.c:4654 -#: sql_help.c:4658 sql_help.c:4661 sql_help.c:4899 sql_help.c:4908 -#: sql_help.c:4912 sql_help.c:4916 sql_help.c:4919 sql_help.c:5146 -#: sql_help.c:5155 sql_help.c:5159 sql_help.c:5163 sql_help.c:5166 +#: 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:1874 +#: sql_help.c:1867 msgid "relation_name" msgstr "リレーション名" -#: sql_help.c:1879 sql_help.c:3949 sql_help.c:4416 +#: sql_help.c:1872 sql_help.c:3926 sql_help.c:4389 msgid "domain_name" msgstr "ドメイン名" -#: sql_help.c:1901 +#: sql_help.c:1894 msgid "policy_name" msgstr "ポリシー名" -#: sql_help.c:1914 +#: sql_help.c:1907 msgid "rule_name" msgstr "ルール名" -#: sql_help.c:1933 sql_help.c:4555 +#: sql_help.c:1926 sql_help.c:4528 msgid "string_literal" msgstr "文字列リテラル" -#: sql_help.c:1958 sql_help.c:4219 sql_help.c:4469 +#: sql_help.c:1951 sql_help.c:4192 sql_help.c:4442 msgid "transaction_id" msgstr "トランザクションID" -#: sql_help.c:1993 sql_help.c:2000 sql_help.c:4073 +#: sql_help.c:1985 sql_help.c:1992 sql_help.c:4048 msgid "filename" msgstr "ファイル名" -#: sql_help.c:1994 sql_help.c:2001 sql_help.c:2725 sql_help.c:2726 -#: sql_help.c:2727 +#: 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:1996 sql_help.c:2724 sql_help.c:3165 sql_help.c:3347 -#: sql_help.c:4057 sql_help.c:4142 sql_help.c:4145 sql_help.c:4148 -#: sql_help.c:4624 sql_help.c:4626 sql_help.c:4728 sql_help.c:4730 -#: sql_help.c:4882 sql_help.c:4884 sql_help.c:5002 sql_help.c:5129 -#: sql_help.c:5131 +#: 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:1999 sql_help.c:2545 sql_help.c:3048 sql_help.c:3312 -#: sql_help.c:3330 sql_help.c:4037 +#: 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:2004 +#: sql_help.c:1996 msgid "format_name" msgstr "フォーマット名" -#: sql_help.c:2006 +#: sql_help.c:1998 msgid "delimiter_character" msgstr "区切り文字" -#: sql_help.c:2007 +#: sql_help.c:1999 msgid "null_string" msgstr "NULL文字列" -#: sql_help.c:2008 +#: sql_help.c:2000 msgid "default_string" msgstr "デフォルト文字列" -#: sql_help.c:2010 +#: sql_help.c:2002 msgid "quote_character" msgstr "引用符文字" -#: sql_help.c:2011 +#: sql_help.c:2003 msgid "escape_character" msgstr "エスケープ文字" -#: sql_help.c:2015 +#: sql_help.c:2007 msgid "error_action" msgstr "エラー処理" -#: sql_help.c:2016 -msgid "maxerror" -msgstr "許容エラー数" - -#: sql_help.c:2017 +#: sql_help.c:2008 msgid "encoding_name" msgstr "エンコーディング名" -#: sql_help.c:2018 +#: sql_help.c:2009 msgid "verbosity" msgstr "詳細度" -#: sql_help.c:2029 +#: sql_help.c:2020 msgid "access_method_type" msgstr "アクセスメソッドの型" -#: sql_help.c:2100 sql_help.c:2119 sql_help.c:2122 +#: sql_help.c:2091 sql_help.c:2110 sql_help.c:2113 msgid "arg_data_type" msgstr "入力データ型" -#: sql_help.c:2101 sql_help.c:2123 sql_help.c:2131 +#: sql_help.c:2092 sql_help.c:2114 sql_help.c:2122 msgid "sfunc" msgstr "状態遷移関数" -#: sql_help.c:2102 sql_help.c:2124 sql_help.c:2132 +#: sql_help.c:2093 sql_help.c:2115 sql_help.c:2123 msgid "state_data_type" msgstr "状態データの型" -#: sql_help.c:2103 sql_help.c:2125 sql_help.c:2133 +#: sql_help.c:2094 sql_help.c:2116 sql_help.c:2124 msgid "state_data_size" msgstr "状態データのサイズ" -#: sql_help.c:2104 sql_help.c:2126 sql_help.c:2134 +#: sql_help.c:2095 sql_help.c:2117 sql_help.c:2125 msgid "ffunc" msgstr "終了関数" -#: sql_help.c:2105 sql_help.c:2135 +#: sql_help.c:2096 sql_help.c:2126 msgid "combinefunc" msgstr "結合関数" -#: sql_help.c:2106 sql_help.c:2136 +#: sql_help.c:2097 sql_help.c:2127 msgid "serialfunc" msgstr "シリアライズ関数" -#: sql_help.c:2107 sql_help.c:2137 +#: sql_help.c:2098 sql_help.c:2128 msgid "deserialfunc" msgstr "デシリアライズ関数" -#: sql_help.c:2108 sql_help.c:2127 sql_help.c:2138 +#: sql_help.c:2099 sql_help.c:2118 sql_help.c:2129 msgid "initial_condition" msgstr "初期条件" -#: sql_help.c:2109 sql_help.c:2139 +#: sql_help.c:2100 sql_help.c:2130 msgid "msfunc" msgstr "前方状態遷移関数" -#: sql_help.c:2110 sql_help.c:2140 +#: sql_help.c:2101 sql_help.c:2131 msgid "minvfunc" msgstr "逆状態遷移関数" -#: sql_help.c:2111 sql_help.c:2141 +#: sql_help.c:2102 sql_help.c:2132 msgid "mstate_data_type" msgstr "移動集約モード時の状態値のデータ型" -#: sql_help.c:2112 sql_help.c:2142 +#: sql_help.c:2103 sql_help.c:2133 msgid "mstate_data_size" msgstr "移動集約モード時の状態値のデータサイズ" -#: sql_help.c:2113 sql_help.c:2143 +#: sql_help.c:2104 sql_help.c:2134 msgid "mffunc" msgstr "移動集約モード時の終了関数" -#: sql_help.c:2114 sql_help.c:2144 +#: sql_help.c:2105 sql_help.c:2135 msgid "minitial_condition" msgstr "移動集約モード時の初期条件" -#: sql_help.c:2115 sql_help.c:2145 +#: sql_help.c:2106 sql_help.c:2136 msgid "sort_operator" msgstr "ソート演算子" -#: sql_help.c:2128 +#: sql_help.c:2119 msgid "or the old syntax" msgstr "または古い構文" -#: sql_help.c:2130 +#: sql_help.c:2121 msgid "base_type" msgstr "基本の型" -#: sql_help.c:2188 sql_help.c:2238 +#: sql_help.c:2179 sql_help.c:2229 msgid "locale" msgstr "ロケール" -#: sql_help.c:2189 sql_help.c:2239 +#: sql_help.c:2180 sql_help.c:2230 msgid "lc_collate" msgstr "照合順序" -#: sql_help.c:2190 sql_help.c:2240 +#: sql_help.c:2181 sql_help.c:2231 msgid "lc_ctype" msgstr "Ctype(変換演算子)" -#: sql_help.c:2191 sql_help.c:4522 +#: sql_help.c:2182 sql_help.c:4495 msgid "provider" msgstr "プロバイダ" -#: sql_help.c:2193 +#: sql_help.c:2184 msgid "rules" msgstr "ルール" -#: sql_help.c:2194 sql_help.c:2301 +#: sql_help.c:2185 sql_help.c:2292 msgid "version" msgstr "バージョン" -#: sql_help.c:2196 +#: sql_help.c:2187 msgid "existing_collation" msgstr "既存の照合順序" -#: sql_help.c:2206 +#: sql_help.c:2197 msgid "source_encoding" msgstr "変換元のエンコーディング" -#: sql_help.c:2207 +#: sql_help.c:2198 msgid "dest_encoding" msgstr "変換先のエンコーディング" -#: sql_help.c:2235 sql_help.c:3088 +#: sql_help.c:2226 sql_help.c:3067 msgid "template" msgstr "テンプレート" -#: sql_help.c:2236 +#: sql_help.c:2227 msgid "encoding" msgstr "エンコード" -#: sql_help.c:2237 +#: sql_help.c:2228 msgid "strategy" msgstr "ストラテジ" -#: sql_help.c:2241 +#: sql_help.c:2232 msgid "builtin_locale" msgstr "組み込みロケール" -#: sql_help.c:2242 +#: sql_help.c:2233 msgid "icu_locale" msgstr "ICUロケール" -#: sql_help.c:2243 +#: sql_help.c:2234 msgid "icu_rules" msgstr "ICUルール(群)" -#: sql_help.c:2244 +#: sql_help.c:2235 msgid "locale_provider" msgstr "ロケールプロバイダ" -#: sql_help.c:2245 +#: sql_help.c:2236 msgid "collation_version" msgstr "照合順序バージョン" -#: sql_help.c:2250 +#: sql_help.c:2241 msgid "oid" msgstr "オブジェクトID" -#: sql_help.c:2285 sql_help.c:2722 sql_help.c:3161 +#: sql_help.c:2276 sql_help.c:2709 sql_help.c:3140 msgid "event" msgstr "イベント" -#: sql_help.c:2286 +#: sql_help.c:2277 msgid "filter_variable" msgstr "フィルター変数" -#: sql_help.c:2287 +#: sql_help.c:2278 msgid "filter_value" msgstr "フィルター値" -#: sql_help.c:2386 sql_help.c:2972 +#: sql_help.c:2374 sql_help.c:2956 msgid "where column_constraint is:" msgstr "カラム制約は以下の通りです:" -#: sql_help.c:2432 +#: sql_help.c:2419 msgid "rettype" msgstr "戻り値の型" -#: sql_help.c:2434 +#: sql_help.c:2421 msgid "column_type" msgstr "列の型" -#: sql_help.c:2443 sql_help.c:2646 +#: sql_help.c:2430 sql_help.c:2633 msgid "definition" msgstr "定義" -#: sql_help.c:2444 sql_help.c:2647 +#: sql_help.c:2431 sql_help.c:2634 msgid "obj_file" msgstr "オブジェクトファイル名" -#: sql_help.c:2445 sql_help.c:2648 +#: sql_help.c:2432 sql_help.c:2635 msgid "link_symbol" msgstr "リンクシンボル" -#: sql_help.c:2446 sql_help.c:2649 +#: sql_help.c:2433 sql_help.c:2636 msgid "sql_body" msgstr "SQL本体" -#: sql_help.c:2484 sql_help.c:2707 sql_help.c:3284 +#: sql_help.c:2471 sql_help.c:2694 sql_help.c:3263 msgid "uid" msgstr "UID" -#: sql_help.c:2500 sql_help.c:2541 sql_help.c:2941 sql_help.c:2954 -#: sql_help.c:2968 sql_help.c:3044 +#: 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:2522 +#: sql_help.c:2509 msgid "call_handler" msgstr "呼び出しハンドラー" -#: sql_help.c:2523 +#: sql_help.c:2510 msgid "inline_handler" msgstr "インラインハンドラー" -#: sql_help.c:2524 +#: sql_help.c:2511 msgid "valfunction" msgstr "バリデーション関数" -#: sql_help.c:2582 +#: sql_help.c:2569 msgid "family_name" msgstr "演算子族の名前" -#: sql_help.c:2593 +#: sql_help.c:2580 msgid "storage_type" msgstr "ストレージタイプ" -#: sql_help.c:2728 sql_help.c:3168 +#: sql_help.c:2715 sql_help.c:3147 msgid "where event can be one of:" msgstr "イベントは以下のいずれかです:" -#: sql_help.c:2748 sql_help.c:2750 +#: sql_help.c:2735 sql_help.c:2737 msgid "schema_element" msgstr "スキーマ要素" -#: sql_help.c:2789 +#: sql_help.c:2774 msgid "server_type" msgstr "サーバーのタイプ" -#: sql_help.c:2790 +#: sql_help.c:2775 msgid "server_version" msgstr "サーバーのバージョン" -#: sql_help.c:2791 sql_help.c:3952 sql_help.c:4419 +#: sql_help.c:2776 sql_help.c:3929 sql_help.c:4392 msgid "fdw_name" msgstr "外部データラッパ名" -#: sql_help.c:2808 sql_help.c:2811 +#: sql_help.c:2793 sql_help.c:2796 msgid "statistics_name" msgstr "統計オブジェクト名" -#: sql_help.c:2812 +#: sql_help.c:2797 msgid "statistics_kind" msgstr "統計種別" -#: sql_help.c:2828 +#: sql_help.c:2813 msgid "subscription_name" msgstr "サブスクリプション名" -#: sql_help.c:2934 +#: sql_help.c:2918 msgid "source_table" msgstr "コピー元のテーブル" -#: sql_help.c:2935 +#: sql_help.c:2919 msgid "like_option" msgstr "LIKEオプション" -#: sql_help.c:3006 +#: sql_help.c:2985 msgid "and like_option is:" msgstr "LIKE オプションは以下の通りです:" -#: sql_help.c:3061 +#: sql_help.c:3040 msgid "directory" msgstr "ディレクトリ" -#: sql_help.c:3075 +#: sql_help.c:3054 msgid "parser_name" msgstr "パーサ名" -#: sql_help.c:3076 +#: sql_help.c:3055 msgid "source_config" msgstr "複製元の設定" -#: sql_help.c:3105 +#: sql_help.c:3084 msgid "start_function" msgstr "開始関数" -#: sql_help.c:3106 +#: sql_help.c:3085 msgid "gettoken_function" msgstr "トークン取得関数" -#: sql_help.c:3107 +#: sql_help.c:3086 msgid "end_function" msgstr "終了関数" -#: sql_help.c:3108 +#: sql_help.c:3087 msgid "lextypes_function" msgstr "LEXTYPE関数" -#: sql_help.c:3109 +#: sql_help.c:3088 msgid "headline_function" msgstr "見出し関数" -#: sql_help.c:3121 +#: sql_help.c:3100 msgid "init_function" msgstr "初期処理関数" -#: sql_help.c:3122 +#: sql_help.c:3101 msgid "lexize_function" msgstr "LEXIZE関数" -#: sql_help.c:3135 +#: sql_help.c:3114 msgid "from_sql_function_name" msgstr "{FROM SQL 関数名}" -#: sql_help.c:3137 +#: sql_help.c:3116 msgid "to_sql_function_name" msgstr "{TO SQL 関数名}" -#: sql_help.c:3163 +#: sql_help.c:3142 msgid "referenced_table_name" msgstr "被参照テーブル名" -#: sql_help.c:3164 +#: sql_help.c:3143 msgid "transition_relation_name" msgstr "移行用リレーション名" -#: sql_help.c:3167 +#: sql_help.c:3146 msgid "arguments" msgstr "引数" -#: sql_help.c:3219 +#: sql_help.c:3198 msgid "label" msgstr "ラベル" -#: sql_help.c:3221 +#: sql_help.c:3200 msgid "subtype" msgstr "当該範囲のデータ型" -#: sql_help.c:3222 +#: sql_help.c:3201 msgid "subtype_operator_class" msgstr "当該範囲のデータ型の演算子クラス" -#: sql_help.c:3224 +#: sql_help.c:3203 msgid "canonical_function" msgstr "正規化関数" -#: sql_help.c:3225 +#: sql_help.c:3204 msgid "subtype_diff_function" msgstr "当該範囲のデータ型の差分抽出関数" -#: sql_help.c:3226 +#: sql_help.c:3205 msgid "multirange_type_name" msgstr "複範囲型名" -#: sql_help.c:3228 +#: sql_help.c:3207 msgid "input_function" msgstr "入力関数" -#: sql_help.c:3229 +#: sql_help.c:3208 msgid "output_function" msgstr "出力関数" -#: sql_help.c:3230 +#: sql_help.c:3209 msgid "receive_function" msgstr "受信関数" -#: sql_help.c:3231 +#: sql_help.c:3210 msgid "send_function" msgstr "送信関数" -#: sql_help.c:3232 +#: sql_help.c:3211 msgid "type_modifier_input_function" msgstr "型修飾子の入力関数" -#: sql_help.c:3233 +#: sql_help.c:3212 msgid "type_modifier_output_function" msgstr "型修飾子の出力関数" -#: sql_help.c:3234 +#: sql_help.c:3213 msgid "analyze_function" msgstr "分析関数" -#: sql_help.c:3235 +#: sql_help.c:3214 msgid "subscript_function" msgstr "添字関数" -#: sql_help.c:3236 +#: sql_help.c:3215 msgid "internallength" msgstr "内部長" -#: sql_help.c:3237 +#: sql_help.c:3216 msgid "alignment" msgstr "バイト境界" -#: sql_help.c:3238 +#: sql_help.c:3217 msgid "storage" msgstr "ストレージ" -#: sql_help.c:3239 +#: sql_help.c:3218 msgid "like_type" msgstr "LIKEの型" -#: sql_help.c:3240 +#: sql_help.c:3219 msgid "category" msgstr "カテゴリー" -#: sql_help.c:3241 +#: sql_help.c:3220 msgid "preferred" msgstr "優先データ型かどうか(真偽値)" -#: sql_help.c:3242 +#: sql_help.c:3221 msgid "default" msgstr "デフォルト" -#: sql_help.c:3243 +#: sql_help.c:3222 msgid "element" msgstr "要素のデータ型" -#: sql_help.c:3244 +#: sql_help.c:3223 msgid "delimiter" msgstr "区切り記号" -#: sql_help.c:3245 +#: sql_help.c:3224 msgid "collatable" msgstr "照合可能" -#: sql_help.c:3343 sql_help.c:4032 sql_help.c:4128 sql_help.c:4619 -#: sql_help.c:4722 sql_help.c:4877 sql_help.c:4992 sql_help.c:5124 +#: 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:3345 sql_help.c:4034 sql_help.c:4638 sql_help.c:4644 -#: sql_help.c:4647 sql_help.c:4651 sql_help.c:4655 sql_help.c:4663 -#: sql_help.c:4896 sql_help.c:4902 sql_help.c:4905 sql_help.c:4909 -#: sql_help.c:4913 sql_help.c:4921 sql_help.c:4994 sql_help.c:5143 -#: sql_help.c:5149 sql_help.c:5152 sql_help.c:5156 sql_help.c:5160 -#: sql_help.c:5168 +#: 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:3346 sql_help.c:4623 sql_help.c:4665 sql_help.c:4667 -#: sql_help.c:4671 sql_help.c:4673 sql_help.c:4674 sql_help.c:4675 -#: sql_help.c:4727 sql_help.c:4881 sql_help.c:4923 sql_help.c:4925 -#: sql_help.c:4929 sql_help.c:4931 sql_help.c:4932 sql_help.c:4933 -#: sql_help.c:5001 sql_help.c:5128 sql_help.c:5170 sql_help.c:5172 -#: sql_help.c:5176 sql_help.c:5178 sql_help.c:5179 sql_help.c:5180 +#: 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:3348 sql_help.c:3833 sql_help.c:4186 sql_help.c:5003 +#: sql_help.c:3326 sql_help.c:3810 sql_help.c:4159 sql_help.c:4975 msgid "cursor_name" msgstr "カーソル名" -#: sql_help.c:3349 sql_help.c:4040 sql_help.c:4134 sql_help.c:5004 -msgid "output_alias" -msgstr "出力別名" - -#: sql_help.c:3350 sql_help.c:4041 sql_help.c:4135 sql_help.c:5005 +#: sql_help.c:3327 sql_help.c:4016 sql_help.c:4108 sql_help.c:4976 msgid "output_expression" msgstr "出力表現" -#: sql_help.c:3351 sql_help.c:4042 sql_help.c:4136 sql_help.c:4622 -#: sql_help.c:4725 sql_help.c:4880 sql_help.c:5006 sql_help.c:5127 +#: 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:3367 +#: sql_help.c:3344 msgid "code" msgstr "コードブロック" -#: sql_help.c:3772 +#: sql_help.c:3749 msgid "parameter" msgstr "パラメータ" -#: sql_help.c:3796 sql_help.c:4211 +#: sql_help.c:3773 sql_help.c:4184 msgid "statement" msgstr "文" -#: sql_help.c:3832 sql_help.c:4185 +#: sql_help.c:3809 sql_help.c:4158 msgid "direction" msgstr "方向" -#: sql_help.c:3834 sql_help.c:4187 +#: sql_help.c:3811 sql_help.c:4160 msgid "where direction can be one of:" msgstr "方向 は以下のうちのいずれか:" -#: sql_help.c:3835 sql_help.c:3836 sql_help.c:3837 sql_help.c:3838 -#: sql_help.c:3839 sql_help.c:4188 sql_help.c:4189 sql_help.c:4190 -#: sql_help.c:4191 sql_help.c:4192 sql_help.c:4632 sql_help.c:4634 -#: sql_help.c:4736 sql_help.c:4738 sql_help.c:4890 sql_help.c:4892 -#: sql_help.c:5068 sql_help.c:5070 sql_help.c:5137 sql_help.c:5139 +#: 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:3942 sql_help.c:4409 +#: sql_help.c:3919 sql_help.c:4382 msgid "sequence_name" msgstr "シーケンス名" -#: sql_help.c:3960 sql_help.c:4427 +#: sql_help.c:3937 sql_help.c:4400 msgid "arg_name" msgstr "引数名" -#: sql_help.c:3961 sql_help.c:4428 +#: sql_help.c:3938 sql_help.c:4401 msgid "arg_type" msgstr "引数の型" -#: sql_help.c:3968 sql_help.c:4435 +#: sql_help.c:3945 sql_help.c:4408 msgid "loid" msgstr "ラージオブジェクトid" -#: sql_help.c:3999 +#: sql_help.c:3976 msgid "remote_schema" msgstr "リモートスキーマ" -#: sql_help.c:4002 +#: sql_help.c:3979 msgid "local_schema" msgstr "ローカルスキーマ" -#: sql_help.c:4038 +#: sql_help.c:4014 msgid "conflict_target" msgstr "競合ターゲット" -#: sql_help.c:4039 +#: sql_help.c:4015 msgid "conflict_action" msgstr "競合時アクション" -#: sql_help.c:4043 +#: sql_help.c:4018 msgid "where conflict_target can be one of:" msgstr "競合ターゲットは以下のいずれかです:" -#: sql_help.c:4044 +#: sql_help.c:4019 msgid "index_column_name" msgstr "インデックスのカラム名" -#: sql_help.c:4045 +#: sql_help.c:4020 msgid "index_expression" msgstr "インデックス表現" -#: sql_help.c:4048 +#: sql_help.c:4023 msgid "index_predicate" msgstr "インデックスの述語" -#: sql_help.c:4050 +#: sql_help.c:4025 msgid "and conflict_action is one of:" msgstr "競合時アクションは以下のいずれかです:" -#: sql_help.c:4056 sql_help.c:4159 sql_help.c:5000 +#: sql_help.c:4031 sql_help.c:4132 sql_help.c:4972 msgid "sub-SELECT" msgstr "副問い合わせ句" -#: sql_help.c:4065 sql_help.c:4200 sql_help.c:4975 +#: sql_help.c:4040 sql_help.c:4173 sql_help.c:4948 msgid "channel" msgstr "チャネル" -#: sql_help.c:4087 +#: sql_help.c:4062 msgid "lockmode" msgstr "ロックモード" -#: sql_help.c:4088 +#: sql_help.c:4063 msgid "where lockmode is one of:" msgstr "ロックモードは以下のいずれかです:" -#: sql_help.c:4129 +#: sql_help.c:4103 msgid "target_table_name" msgstr "ターゲットテーブル名" -#: sql_help.c:4130 +#: sql_help.c:4104 msgid "target_alias" msgstr "ターゲット別名" -#: sql_help.c:4131 +#: sql_help.c:4105 msgid "data_source" msgstr "データ源" -#: sql_help.c:4132 sql_help.c:4668 sql_help.c:4926 sql_help.c:5173 +#: sql_help.c:4106 sql_help.c:4641 sql_help.c:4899 sql_help.c:5144 msgid "join_condition" msgstr "JOIN条件" -#: sql_help.c:4133 +#: sql_help.c:4107 msgid "when_clause" msgstr "WHEN句" -#: sql_help.c:4137 +#: sql_help.c:4110 msgid "where data_source is:" msgstr "ここで\"データ源\"は以下の通り:" -#: sql_help.c:4138 +#: sql_help.c:4111 msgid "source_table_name" msgstr "データ源テーブル名" -#: sql_help.c:4139 +#: sql_help.c:4112 msgid "source_query" msgstr "データ源問い合わせ" -#: sql_help.c:4140 +#: sql_help.c:4113 msgid "source_alias" msgstr "データ源別名" -#: sql_help.c:4141 +#: sql_help.c:4114 msgid "and when_clause is:" msgstr "WHEN句は以下の通り:" -#: sql_help.c:4143 sql_help.c:4146 +#: sql_help.c:4116 sql_help.c:4119 msgid "merge_update" msgstr "マージ更新" -#: sql_help.c:4144 sql_help.c:4147 +#: sql_help.c:4117 sql_help.c:4120 msgid "merge_delete" msgstr "マージ削除" -#: sql_help.c:4149 +#: sql_help.c:4122 msgid "merge_insert" msgstr "マージ挿入" -#: sql_help.c:4150 +#: sql_help.c:4123 msgid "and merge_insert is:" msgstr "そして\"マージ挿入\"は以下の通り:" -#: sql_help.c:4153 +#: sql_help.c:4126 msgid "and merge_update is:" msgstr "そして\"マージ更新\"は以下の通り:" -#: sql_help.c:4160 +#: sql_help.c:4133 msgid "and merge_delete is:" msgstr "そして\"マージ削除\"は以下の通り:" -#: sql_help.c:4201 +#: sql_help.c:4174 msgid "payload" msgstr "ペイロード" -#: sql_help.c:4228 +#: sql_help.c:4201 msgid "old_role" msgstr "元のロール" -#: sql_help.c:4229 +#: sql_help.c:4202 msgid "new_role" msgstr "新しいロール" -#: sql_help.c:4268 sql_help.c:4477 sql_help.c:4485 +#: sql_help.c:4241 sql_help.c:4450 sql_help.c:4458 msgid "savepoint_name" msgstr "セーブポイント名" -#: sql_help.c:4625 sql_help.c:4683 sql_help.c:4883 sql_help.c:4941 -#: sql_help.c:5130 sql_help.c:5188 +#: 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:4627 sql_help.c:4731 sql_help.c:4885 sql_help.c:5132 +#: sql_help.c:4600 sql_help.c:4704 sql_help.c:4858 sql_help.c:5103 msgid "window_name" msgstr "ウィンドウ名" -#: sql_help.c:4628 sql_help.c:4732 sql_help.c:4886 sql_help.c:5133 +#: sql_help.c:4601 sql_help.c:4705 sql_help.c:4859 sql_help.c:5104 msgid "window_definition" msgstr "ウィンドウ定義" -#: sql_help.c:4629 sql_help.c:4643 sql_help.c:4687 sql_help.c:4733 -#: sql_help.c:4887 sql_help.c:4901 sql_help.c:4945 sql_help.c:5134 -#: sql_help.c:5148 sql_help.c:5192 +#: 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:4635 sql_help.c:4893 sql_help.c:5140 +#: sql_help.c:4608 sql_help.c:4866 sql_help.c:5111 msgid "from_reference" msgstr "FROM参照" -#: sql_help.c:4636 sql_help.c:4894 sql_help.c:5141 +#: 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:4639 sql_help.c:4645 sql_help.c:4648 sql_help.c:4652 -#: sql_help.c:4664 sql_help.c:4897 sql_help.c:4903 sql_help.c:4906 -#: sql_help.c:4910 sql_help.c:4922 sql_help.c:5144 sql_help.c:5150 -#: sql_help.c:5153 sql_help.c:5157 sql_help.c:5169 +#: 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:4640 sql_help.c:4898 sql_help.c:5145 +#: sql_help.c:4613 sql_help.c:4871 sql_help.c:5116 msgid "sampling_method" msgstr "サンプリングメソッド" -#: sql_help.c:4642 sql_help.c:4900 sql_help.c:5147 +#: sql_help.c:4615 sql_help.c:4873 sql_help.c:5118 msgid "seed" msgstr "乱数シード" -#: sql_help.c:4646 sql_help.c:4685 sql_help.c:4904 sql_help.c:4943 -#: sql_help.c:5151 sql_help.c:5190 +#: 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:4656 sql_help.c:4659 sql_help.c:4662 sql_help.c:4914 -#: sql_help.c:4917 sql_help.c:4920 sql_help.c:5161 sql_help.c:5164 -#: sql_help.c:5167 +#: 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:4666 sql_help.c:4672 sql_help.c:4924 sql_help.c:4930 -#: sql_help.c:5171 sql_help.c:5177 +#: 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:4669 sql_help.c:4927 sql_help.c:5174 +#: sql_help.c:4642 sql_help.c:4900 sql_help.c:5145 msgid "join_column" msgstr "JOINカラム" -#: sql_help.c:4670 sql_help.c:4928 sql_help.c:5175 +#: sql_help.c:4643 sql_help.c:4901 sql_help.c:5146 msgid "join_using_alias" msgstr "JOIN用別名" -#: sql_help.c:4676 sql_help.c:4934 sql_help.c:5181 +#: sql_help.c:4649 sql_help.c:4907 sql_help.c:5152 msgid "and grouping_element can be one of:" msgstr "グルーピング要素は以下のいずれかです:" -#: sql_help.c:4684 sql_help.c:4942 sql_help.c:5189 +#: sql_help.c:4657 sql_help.c:4915 sql_help.c:5160 msgid "and with_query is:" msgstr "WITH問い合わせは以下のいずれかです:" -#: sql_help.c:4688 sql_help.c:4946 sql_help.c:5193 +#: sql_help.c:4661 sql_help.c:4919 sql_help.c:5164 msgid "values" msgstr "VALUES句" -#: sql_help.c:4689 sql_help.c:4947 sql_help.c:5194 +#: sql_help.c:4662 sql_help.c:4920 sql_help.c:5165 msgid "insert" msgstr "INSERT句" -#: sql_help.c:4690 sql_help.c:4948 sql_help.c:5195 +#: sql_help.c:4663 sql_help.c:4921 sql_help.c:5166 msgid "update" msgstr "UPDATE句" -#: sql_help.c:4691 sql_help.c:4949 sql_help.c:5196 +#: sql_help.c:4664 sql_help.c:4922 sql_help.c:5167 msgid "delete" msgstr "DELETE句" -#: sql_help.c:4692 sql_help.c:4950 sql_help.c:5197 +#: sql_help.c:4665 sql_help.c:4923 sql_help.c:5168 msgid "merge" msgstr "MERGE句" -#: sql_help.c:4694 sql_help.c:4952 sql_help.c:5199 +#: sql_help.c:4667 sql_help.c:4925 sql_help.c:5170 msgid "search_seq_col_name" msgstr "SEARCH順序列名" -#: sql_help.c:4696 sql_help.c:4954 sql_help.c:5201 +#: sql_help.c:4669 sql_help.c:4927 sql_help.c:5172 msgid "cycle_mark_col_name" msgstr "循環識別列名" -#: sql_help.c:4697 sql_help.c:4955 sql_help.c:5202 +#: sql_help.c:4670 sql_help.c:4928 sql_help.c:5173 msgid "cycle_mark_value" msgstr "循環識別値" -#: sql_help.c:4698 sql_help.c:4956 sql_help.c:5203 +#: sql_help.c:4671 sql_help.c:4929 sql_help.c:5174 msgid "cycle_mark_default" msgstr "循環識別デフォルト" -#: sql_help.c:4699 sql_help.c:4957 sql_help.c:5204 +#: sql_help.c:4672 sql_help.c:4930 sql_help.c:5175 msgid "cycle_path_col_name" msgstr "循環パス列名" -#: sql_help.c:4726 +#: sql_help.c:4699 msgid "new_table" msgstr "新しいテーブル" -#: sql_help.c:4797 +#: sql_help.c:4770 msgid "snapshot_id" msgstr "スナップショットID" -#: sql_help.c:5066 +#: sql_help.c:5037 msgid "sort_expression" msgstr "ソート表現" -#: sql_help.c:5211 sql_help.c:6195 +#: sql_help.c:5182 sql_help.c:6166 msgid "abort the current transaction" msgstr "現在のトランザクションを中止します" -#: sql_help.c:5217 +#: sql_help.c:5188 msgid "change the definition of an aggregate function" msgstr "集約関数の定義を変更します" -#: sql_help.c:5223 +#: sql_help.c:5194 msgid "change the definition of a collation" msgstr "照合順序の定義を変更します" -#: sql_help.c:5229 +#: sql_help.c:5200 msgid "change the definition of a conversion" msgstr "エンコーディング変換ルールの定義を変更します" -#: sql_help.c:5235 +#: sql_help.c:5206 msgid "change a database" msgstr "データベースを変更します" -#: sql_help.c:5241 +#: sql_help.c:5212 msgid "define default access privileges" msgstr "デフォルトのアクセス権限を定義します" -#: sql_help.c:5247 +#: sql_help.c:5218 msgid "change the definition of a domain" msgstr "ドメインの定義を変更します" -#: sql_help.c:5253 +#: sql_help.c:5224 msgid "change the definition of an event trigger" msgstr "イベントトリガーの定義を変更します" -#: sql_help.c:5259 +#: sql_help.c:5230 msgid "change the definition of an extension" msgstr "機能拡張の定義を変更します" -#: sql_help.c:5265 +#: sql_help.c:5236 msgid "change the definition of a foreign-data wrapper" msgstr "外部データラッパの定義を変更します" -#: sql_help.c:5271 +#: sql_help.c:5242 msgid "change the definition of a foreign table" msgstr "外部テーブルの定義を変更します" -#: sql_help.c:5277 +#: sql_help.c:5248 msgid "change the definition of a function" msgstr "関数の定義を変更します" -#: sql_help.c:5283 +#: sql_help.c:5254 msgid "change role name or membership" msgstr "ロール名またはメンバーシップを変更します" -#: sql_help.c:5289 +#: sql_help.c:5260 msgid "change the definition of an index" msgstr "インデックスの定義を変更します" -#: sql_help.c:5295 +#: sql_help.c:5266 msgid "change the definition of a procedural language" msgstr "手続き言語の定義を変更します" -#: sql_help.c:5301 +#: sql_help.c:5272 msgid "change the definition of a large object" msgstr "ラージオブジェクトの定義を変更します" -#: sql_help.c:5307 +#: sql_help.c:5278 msgid "change the definition of a materialized view" msgstr "実体化ビューの定義を変更します" -#: sql_help.c:5313 +#: sql_help.c:5284 msgid "change the definition of an operator" msgstr "演算子の定義を変更します" -#: sql_help.c:5319 +#: sql_help.c:5290 msgid "change the definition of an operator class" msgstr "演算子クラスの定義を変更します" -#: sql_help.c:5325 +#: sql_help.c:5296 msgid "change the definition of an operator family" msgstr "演算子族の定義を変更します" -#: sql_help.c:5331 +#: sql_help.c:5302 msgid "change the definition of a row-level security policy" msgstr "行レベルのセキュリティ ポリシーの定義を変更します" -#: sql_help.c:5337 +#: sql_help.c:5308 msgid "change the definition of a procedure" msgstr "プロシージャの定義を変更します" -#: sql_help.c:5343 +#: sql_help.c:5314 msgid "change the definition of a publication" msgstr "パブリケーションの定義を変更します" -#: sql_help.c:5349 sql_help.c:5451 +#: sql_help.c:5320 sql_help.c:5422 msgid "change a database role" msgstr "データベースロールを変更します" -#: sql_help.c:5355 +#: sql_help.c:5326 msgid "change the definition of a routine" msgstr "ルーチンの定義を変更します" -#: sql_help.c:5361 +#: sql_help.c:5332 msgid "change the definition of a rule" msgstr "ルールの定義を変更します" -#: sql_help.c:5367 +#: sql_help.c:5338 msgid "change the definition of a schema" msgstr "スキーマの定義を変更します" -#: sql_help.c:5373 +#: sql_help.c:5344 msgid "change the definition of a sequence generator" msgstr "シーケンス生成器の定義を変更します" -#: sql_help.c:5379 +#: sql_help.c:5350 msgid "change the definition of a foreign server" msgstr "外部サーバーの定義を変更します" -#: sql_help.c:5385 +#: sql_help.c:5356 msgid "change the definition of an extended statistics object" msgstr "拡張統計情報オブジェクトの定義を変更します" -#: sql_help.c:5391 +#: sql_help.c:5362 msgid "change the definition of a subscription" msgstr "サブスクリプションの定義を変更します" -#: sql_help.c:5397 +#: sql_help.c:5368 msgid "change a server configuration parameter" msgstr "サーバーの設定パラメータを変更します" -#: sql_help.c:5403 +#: sql_help.c:5374 msgid "change the definition of a table" msgstr "テーブルの定義を変更します。" -#: sql_help.c:5409 +#: sql_help.c:5380 msgid "change the definition of a tablespace" msgstr "テーブル空間の定義を変更します" -#: sql_help.c:5415 +#: sql_help.c:5386 msgid "change the definition of a text search configuration" msgstr "テキスト検索設定の定義を変更します" -#: sql_help.c:5421 +#: sql_help.c:5392 msgid "change the definition of a text search dictionary" msgstr "テキスト検索辞書の定義を変更します" -#: sql_help.c:5427 +#: sql_help.c:5398 msgid "change the definition of a text search parser" msgstr "テキスト検索パーサーの定義を変更します" -#: sql_help.c:5433 +#: sql_help.c:5404 msgid "change the definition of a text search template" msgstr "テキスト検索テンプレートの定義を変更します" -#: sql_help.c:5439 +#: sql_help.c:5410 msgid "change the definition of a trigger" msgstr "トリガーの定義を変更します" -#: sql_help.c:5445 +#: sql_help.c:5416 msgid "change the definition of a type" msgstr "型の定義を変更します" -#: sql_help.c:5457 +#: sql_help.c:5428 msgid "change the definition of a user mapping" msgstr "ユーザーマッピングの定義を変更します" -#: sql_help.c:5463 +#: sql_help.c:5434 msgid "change the definition of a view" msgstr "ビューの定義を変更します" -#: sql_help.c:5469 +#: sql_help.c:5440 msgid "collect statistics about a database" msgstr "データベースの統計情報を収集します" -#: sql_help.c:5475 sql_help.c:6273 +#: sql_help.c:5446 sql_help.c:6244 msgid "start a transaction block" msgstr "トランザクション区間を開始します" -#: sql_help.c:5481 +#: sql_help.c:5452 msgid "invoke a procedure" msgstr "プロシージャを実行します" -#: sql_help.c:5487 +#: sql_help.c:5458 msgid "force a write-ahead log checkpoint" msgstr "先行書き込みログのチェックポイントを強制的に実行します" -#: sql_help.c:5493 +#: sql_help.c:5464 msgid "close a cursor" msgstr "カーソルを閉じます" -#: sql_help.c:5499 +#: sql_help.c:5470 msgid "cluster a table according to an index" msgstr "インデックスに従ってテーブルをクラスタ化します" -#: sql_help.c:5505 +#: sql_help.c:5476 msgid "define or change the comment of an object" msgstr "オブジェクトのコメントを定義または変更します" -#: sql_help.c:5511 sql_help.c:6069 +#: sql_help.c:5482 sql_help.c:6040 msgid "commit the current transaction" msgstr "現在のトランザクションをコミットします" -#: sql_help.c:5517 +#: sql_help.c:5488 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "二相コミットのために事前に準備されたトランザクションをコミットします" -#: sql_help.c:5523 +#: sql_help.c:5494 msgid "copy data between a file and a table" msgstr "ファイルとテーブルとの間でデータをコピーします" -#: sql_help.c:5529 +#: sql_help.c:5500 msgid "define a new access method" msgstr "新しいアクセスメソッドを定義します" -#: sql_help.c:5535 +#: sql_help.c:5506 msgid "define a new aggregate function" msgstr "新しい集約関数を定義します" -#: sql_help.c:5541 +#: sql_help.c:5512 msgid "define a new cast" msgstr "新しい型変換を定義します" -#: sql_help.c:5547 +#: sql_help.c:5518 msgid "define a new collation" msgstr "新しい照合順序を定義します" -#: sql_help.c:5553 +#: sql_help.c:5524 msgid "define a new encoding conversion" msgstr "新しいエンコーディング変換を定義します" -#: sql_help.c:5559 +#: sql_help.c:5530 msgid "create a new database" msgstr "新しいデータベースを作成します" -#: sql_help.c:5565 +#: sql_help.c:5536 msgid "define a new domain" msgstr "新しいドメインを定義します" -#: sql_help.c:5571 +#: sql_help.c:5542 msgid "define a new event trigger" msgstr "新しいイベントトリガーを定義します" -#: sql_help.c:5577 +#: sql_help.c:5548 msgid "install an extension" msgstr "機能拡張をインストールします" -#: sql_help.c:5583 +#: sql_help.c:5554 msgid "define a new foreign-data wrapper" msgstr "新しい外部データラッパを定義します" -#: sql_help.c:5589 +#: sql_help.c:5560 msgid "define a new foreign table" msgstr "新しい外部テーブルを定義します" -#: sql_help.c:5595 +#: sql_help.c:5566 msgid "define a new function" msgstr "新しい関数を定義します" -#: sql_help.c:5601 sql_help.c:5661 sql_help.c:5763 +#: sql_help.c:5572 sql_help.c:5632 sql_help.c:5734 msgid "define a new database role" msgstr "新しいデータベースロールを定義します" -#: sql_help.c:5607 +#: sql_help.c:5578 msgid "define a new index" msgstr "新しいインデックスを定義します" -#: sql_help.c:5613 +#: sql_help.c:5584 msgid "define a new procedural language" msgstr "新しい手続き言語を定義します" -#: sql_help.c:5619 +#: sql_help.c:5590 msgid "define a new materialized view" msgstr "新しい実体化ビューを定義します" -#: sql_help.c:5625 +#: sql_help.c:5596 msgid "define a new operator" msgstr "新しい演算子を定義します" -#: sql_help.c:5631 +#: sql_help.c:5602 msgid "define a new operator class" msgstr "新しい演算子クラスを定義します" -#: sql_help.c:5637 +#: sql_help.c:5608 msgid "define a new operator family" msgstr "新しい演算子族を定義します" -#: sql_help.c:5643 +#: sql_help.c:5614 msgid "define a new row-level security policy for a table" msgstr "テーブルに対して新しい行レベルセキュリティポリシーを定義します" -#: sql_help.c:5649 +#: sql_help.c:5620 msgid "define a new procedure" msgstr "新しいプロシージャを定義します" -#: sql_help.c:5655 +#: sql_help.c:5626 msgid "define a new publication" msgstr "新しいパブリケーションを定義します" -#: sql_help.c:5667 +#: sql_help.c:5638 msgid "define a new rewrite rule" msgstr "新しい書き換えルールを定義します" -#: sql_help.c:5673 +#: sql_help.c:5644 msgid "define a new schema" msgstr "新しいスキーマを定義します" -#: sql_help.c:5679 +#: sql_help.c:5650 msgid "define a new sequence generator" msgstr "新しいシーケンス生成器を定義します。" -#: sql_help.c:5685 +#: sql_help.c:5656 msgid "define a new foreign server" msgstr "新しい外部サーバーを定義します" -#: sql_help.c:5691 +#: sql_help.c:5662 msgid "define extended statistics" msgstr "拡張統計情報を定義します" -#: sql_help.c:5697 +#: sql_help.c:5668 msgid "define a new subscription" msgstr "新しいサブスクリプションを定義します" -#: sql_help.c:5703 +#: sql_help.c:5674 msgid "define a new table" msgstr "新しいテーブルを定義します" -#: sql_help.c:5709 sql_help.c:6231 +#: sql_help.c:5680 sql_help.c:6202 msgid "define a new table from the results of a query" msgstr "問い合わせの結果から新しいテーブルを定義します" -#: sql_help.c:5715 +#: sql_help.c:5686 msgid "define a new tablespace" msgstr "新しいテーブル空間を定義します" -#: sql_help.c:5721 +#: sql_help.c:5692 msgid "define a new text search configuration" msgstr "新しいテキスト検索設定を定義します" -#: sql_help.c:5727 +#: sql_help.c:5698 msgid "define a new text search dictionary" msgstr "新しいテキスト検索辞書を定義します" -#: sql_help.c:5733 +#: sql_help.c:5704 msgid "define a new text search parser" msgstr "新しいテキスト検索パーサーを定義します" -#: sql_help.c:5739 +#: sql_help.c:5710 msgid "define a new text search template" msgstr "新しいテキスト検索テンプレートを定義します" -#: sql_help.c:5745 +#: sql_help.c:5716 msgid "define a new transform" msgstr "新しいデータ変換を定義します" -#: sql_help.c:5751 +#: sql_help.c:5722 msgid "define a new trigger" msgstr "新しいトリガーを定義します" -#: sql_help.c:5757 +#: sql_help.c:5728 msgid "define a new data type" msgstr "新しいデータ型を定義します" -#: sql_help.c:5769 +#: sql_help.c:5740 msgid "define a new mapping of a user to a foreign server" msgstr "外部サーバーに対するユーザーの新しいマッピングを定義します。" -#: sql_help.c:5775 +#: sql_help.c:5746 msgid "define a new view" msgstr "新しいビューを定義します" -#: sql_help.c:5781 +#: sql_help.c:5752 msgid "deallocate a prepared statement" msgstr "準備した文を解放します" -#: sql_help.c:5787 +#: sql_help.c:5758 msgid "define a cursor" msgstr "カーソルを定義します" -#: sql_help.c:5793 +#: sql_help.c:5764 msgid "delete rows of a table" msgstr "テーブルの行を削除します" -#: sql_help.c:5799 +#: sql_help.c:5770 msgid "discard session state" msgstr "セッション状態を破棄します" -#: sql_help.c:5805 +#: sql_help.c:5776 msgid "execute an anonymous code block" msgstr "無名コードブロックを実行します" -#: sql_help.c:5811 +#: sql_help.c:5782 msgid "remove an access method" msgstr "アクセスメソッドを削除します" -#: sql_help.c:5817 +#: sql_help.c:5788 msgid "remove an aggregate function" msgstr "集約関数を削除します" -#: sql_help.c:5823 +#: sql_help.c:5794 msgid "remove a cast" msgstr "型変換を削除します" -#: sql_help.c:5829 +#: sql_help.c:5800 msgid "remove a collation" msgstr "照合順序を削除します" -#: sql_help.c:5835 +#: sql_help.c:5806 msgid "remove a conversion" msgstr "符号化方式変換を削除します" -#: sql_help.c:5841 +#: sql_help.c:5812 msgid "remove a database" msgstr "データベースを削除します" -#: sql_help.c:5847 +#: sql_help.c:5818 msgid "remove a domain" msgstr "ドメインを削除します" -#: sql_help.c:5853 +#: sql_help.c:5824 msgid "remove an event trigger" msgstr "イベントトリガーを削除します" -#: sql_help.c:5859 +#: sql_help.c:5830 msgid "remove an extension" msgstr "機能拡張を削除します" -#: sql_help.c:5865 +#: sql_help.c:5836 msgid "remove a foreign-data wrapper" msgstr "外部データラッパを削除します" -#: sql_help.c:5871 +#: sql_help.c:5842 msgid "remove a foreign table" msgstr "外部テーブルを削除します" -#: sql_help.c:5877 +#: sql_help.c:5848 msgid "remove a function" msgstr "関数を削除します" -#: sql_help.c:5883 sql_help.c:5949 sql_help.c:6051 +#: sql_help.c:5854 sql_help.c:5920 sql_help.c:6022 msgid "remove a database role" msgstr "データベースロールを削除します" -#: sql_help.c:5889 +#: sql_help.c:5860 msgid "remove an index" msgstr "インデックスを削除します" -#: sql_help.c:5895 +#: sql_help.c:5866 msgid "remove a procedural language" msgstr "手続き言語を削除します" -#: sql_help.c:5901 +#: sql_help.c:5872 msgid "remove a materialized view" msgstr "実体化ビューを削除します" -#: sql_help.c:5907 +#: sql_help.c:5878 msgid "remove an operator" msgstr "演算子を削除します" -#: sql_help.c:5913 +#: sql_help.c:5884 msgid "remove an operator class" msgstr "演算子クラスを削除します" -#: sql_help.c:5919 +#: sql_help.c:5890 msgid "remove an operator family" msgstr "演算子族を削除します" -#: sql_help.c:5925 +#: sql_help.c:5896 msgid "remove database objects owned by a database role" msgstr "データベースロールが所有するデータベースオブジェクトを削除します" -#: sql_help.c:5931 +#: sql_help.c:5902 msgid "remove a row-level security policy from a table" msgstr "テーブルから行レベルのセキュリティポリシーを削除します" -#: sql_help.c:5937 +#: sql_help.c:5908 msgid "remove a procedure" msgstr "プロシージャを削除します" -#: sql_help.c:5943 +#: sql_help.c:5914 msgid "remove a publication" msgstr "パブリケーションを削除します" -#: sql_help.c:5955 +#: sql_help.c:5926 msgid "remove a routine" msgstr "ルーチンを削除します" -#: sql_help.c:5961 +#: sql_help.c:5932 msgid "remove a rewrite rule" msgstr "書き換えルールを削除します" -#: sql_help.c:5967 +#: sql_help.c:5938 msgid "remove a schema" msgstr "スキーマを削除します" -#: sql_help.c:5973 +#: sql_help.c:5944 msgid "remove a sequence" msgstr "シーケンスを削除します" -#: sql_help.c:5979 +#: sql_help.c:5950 msgid "remove a foreign server descriptor" msgstr "外部サーバー記述子を削除します" -#: sql_help.c:5985 +#: sql_help.c:5956 msgid "remove extended statistics" msgstr "拡張統計情報を削除します" -#: sql_help.c:5991 +#: sql_help.c:5962 msgid "remove a subscription" msgstr "サブスクリプションを削除します" -#: sql_help.c:5997 +#: sql_help.c:5968 msgid "remove a table" msgstr "テーブルを削除します" -#: sql_help.c:6003 +#: sql_help.c:5974 msgid "remove a tablespace" msgstr "テーブル空間を削除します" -#: sql_help.c:6009 +#: sql_help.c:5980 msgid "remove a text search configuration" msgstr "テキスト検索設定を削除します" -#: sql_help.c:6015 +#: sql_help.c:5986 msgid "remove a text search dictionary" msgstr "テキスト検索辞書を削除します" -#: sql_help.c:6021 +#: sql_help.c:5992 msgid "remove a text search parser" msgstr "テキスト検索パーサーを削除します" -#: sql_help.c:6027 +#: sql_help.c:5998 msgid "remove a text search template" msgstr "テキスト検索テンプレートを削除します" -#: sql_help.c:6033 +#: sql_help.c:6004 msgid "remove a transform" msgstr "データ変換を削除します" -#: sql_help.c:6039 +#: sql_help.c:6010 msgid "remove a trigger" msgstr "トリガーを削除します" -#: sql_help.c:6045 +#: sql_help.c:6016 msgid "remove a data type" msgstr "データ型を削除します" -#: sql_help.c:6057 +#: sql_help.c:6028 msgid "remove a user mapping for a foreign server" msgstr "外部サーバーのユーザーマッピングを削除します" -#: sql_help.c:6063 +#: sql_help.c:6034 msgid "remove a view" msgstr "ビューを削除します" -#: sql_help.c:6075 +#: sql_help.c:6046 msgid "execute a prepared statement" msgstr "準備した文を実行します" -#: sql_help.c:6081 +#: sql_help.c:6052 msgid "show the execution plan of a statement" msgstr "文の実行計画を表示します" -#: sql_help.c:6087 +#: sql_help.c:6058 msgid "retrieve rows from a query using a cursor" msgstr "カーソルを使って問い合わせから行を取り出します" -#: sql_help.c:6093 +#: sql_help.c:6064 msgid "define access privileges" msgstr "アクセス権限を定義します" -#: sql_help.c:6099 +#: sql_help.c:6070 msgid "import table definitions from a foreign server" msgstr "外部サーバーからテーブル定義をインポートします" -#: sql_help.c:6105 +#: sql_help.c:6076 msgid "create new rows in a table" msgstr "テーブルに新しい行を作成します" -#: sql_help.c:6111 +#: sql_help.c:6082 msgid "listen for a notification" msgstr "通知メッセージを監視します" -#: sql_help.c:6117 +#: sql_help.c:6088 msgid "load a shared library file" msgstr "共有ライブラリファイルをロードします" -#: sql_help.c:6123 +#: sql_help.c:6094 msgid "lock a table" msgstr "テーブルをロックします" -#: sql_help.c:6129 +#: sql_help.c:6100 msgid "conditionally insert, update, or delete rows of a table" msgstr "条件によってテーブルの行を挿入、更新または削除する" -#: sql_help.c:6135 +#: sql_help.c:6106 msgid "position a cursor" msgstr "カーソルを位置づけます" -#: sql_help.c:6141 +#: sql_help.c:6112 msgid "generate a notification" msgstr "通知を生成します" -#: sql_help.c:6147 +#: sql_help.c:6118 msgid "prepare a statement for execution" msgstr "実行に備えて文を準備します" -#: sql_help.c:6153 +#: sql_help.c:6124 msgid "prepare the current transaction for two-phase commit" msgstr "二相コミットに備えて現在のトランザクションを準備します" -#: sql_help.c:6159 +#: sql_help.c:6130 msgid "change the ownership of database objects owned by a database role" msgstr "データベースロールが所有するデータベースオブジェクトの所有権を変更します" -#: sql_help.c:6165 +#: sql_help.c:6136 msgid "replace the contents of a materialized view" msgstr "実体化ビューの内容を置き換えます" -#: sql_help.c:6171 +#: sql_help.c:6142 msgid "rebuild indexes" msgstr "インデックスを再構築します" -#: sql_help.c:6177 +#: sql_help.c:6148 msgid "release a previously defined savepoint" msgstr "以前に定義されたセーブポイントを解放します" -#: sql_help.c:6183 +#: sql_help.c:6154 msgid "restore the value of a run-time parameter to the default value" msgstr "実行時パラメータの値をデフォルト値に戻します" -#: sql_help.c:6189 +#: sql_help.c:6160 msgid "remove access privileges" msgstr "アクセス権限を削除します" -#: sql_help.c:6201 +#: sql_help.c:6172 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "二相コミットのために事前に準備されたトランザクションをキャンセルします" -#: sql_help.c:6207 +#: sql_help.c:6178 msgid "roll back to a savepoint" msgstr "セーブポイントまでロールバックします" -#: sql_help.c:6213 +#: sql_help.c:6184 msgid "define a new savepoint within the current transaction" msgstr "現在のトランザクション内で新しいセーブポイントを定義します" -#: sql_help.c:6219 +#: sql_help.c:6190 msgid "define or change a security label applied to an object" msgstr "オブジェクトに適用されるセキュリティラベルを定義または変更します" -#: sql_help.c:6225 sql_help.c:6279 sql_help.c:6315 +#: sql_help.c:6196 sql_help.c:6250 sql_help.c:6286 msgid "retrieve rows from a table or view" msgstr "テーブルまたはビューから行を取得します" -#: sql_help.c:6237 +#: sql_help.c:6208 msgid "change a run-time parameter" msgstr "実行時パラメータを変更します" -#: sql_help.c:6243 +#: sql_help.c:6214 msgid "set constraint check timing for the current transaction" msgstr "現在のトランザクションについて、制約チェックのタイミングを設定します" -#: sql_help.c:6249 +#: sql_help.c:6220 msgid "set the current user identifier of the current session" msgstr "現在のセッションの現在のユーザー識別子を設定します" -#: sql_help.c:6255 +#: sql_help.c:6226 msgid "set the session user identifier and the current user identifier of the current session" msgstr "セッションのユーザー識別子および現在のセッションの現在のユーザー識別子を設定します" -#: sql_help.c:6261 +#: sql_help.c:6232 msgid "set the characteristics of the current transaction" msgstr "現在のトランザクションの特性を設定します" -#: sql_help.c:6267 +#: sql_help.c:6238 msgid "show the value of a run-time parameter" msgstr "実行時パラメータの値を表示します" -#: sql_help.c:6285 +#: sql_help.c:6256 msgid "empty a table or set of tables" msgstr "一つの、または複数のテーブルを空にします" -#: sql_help.c:6291 +#: sql_help.c:6262 msgid "stop listening for a notification" msgstr "通知メッセージの監視を中止します" -#: sql_help.c:6297 +#: sql_help.c:6268 msgid "update rows of a table" msgstr "テーブルの行を更新します" -#: sql_help.c:6303 +#: sql_help.c:6274 msgid "garbage-collect and optionally analyze a database" msgstr "ガーベッジコレクションを行い、また必要に応じてデータベースを分析します" -#: sql_help.c:6309 +#: sql_help.c:6280 msgid "compute a set of rows" msgstr "行セットを計算します" @@ -6731,7 +6612,7 @@ msgstr "余分なコマンドライン引数\"%s\"は無視されました" msgid "could not find own program executable" msgstr "実行可能ファイルが見つかりませんでした" -#: tab-complete.in.c:6568 +#: tab-complete.c:6216 #, c-format msgid "" "tab completion query failed: %s\n" @@ -6766,5 +6647,130 @@ msgstr "" "\"%2$s\"の値\"%1$s\"が認識できません。\n" "有効な値は %3$s。" -#~ msgid "Unlogged materialized view \"%s.%s\"" -#~ msgstr "ログ出力なしの実体化ビュー\"%s.%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/ru.po b/src/bin/psql/po/ru.po index 9ffcab1d2b8e9..c92ba9873deb0 100644 --- a/src/bin/psql/po/ru.po +++ b/src/bin/psql/po/ru.po @@ -10,7 +10,7 @@ msgid "" msgstr "" "Project-Id-Version: psql (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-02-08 07:44+0200\n" +"POT-Creation-Date: 2025-08-02 11:37+0300\n" "PO-Revision-Date: 2025-02-08 08:33+0200\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -82,7 +82,7 @@ msgid "%s() failed: %m" msgstr "ошибка в %s(): %m" #: ../../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 +#: 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" @@ -195,14 +195,14 @@ msgstr "неверный формат вывода (внутренняя оши msgid "skipping recursive expansion of variable \"%s\"" msgstr "рекурсивное расширение переменной \"%s\" пропускается" -#: ../../fe_utils/string_utils.c:434 +#: ../../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:607 +#: ../../fe_utils/string_utils.c:760 #, c-format msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "" @@ -291,12 +291,12 @@ msgstr "" "Вы подключены к базе данных \"%s\" как пользователь \"%s\" (компьютер " "\"%s\", порт \"%s\").\n" -#: command.c:1069 command.c:1170 command.c:2675 +#: command.c:1069 command.c:1170 command.c:2676 #, c-format msgid "no query buffer" msgstr "нет буфера запросов" -#: command.c:1102 command.c:5776 +#: command.c:1102 command.c:5779 #, c-format msgid "invalid line number: %s" msgstr "неверный номер строки: %s" @@ -312,7 +312,7 @@ msgstr "" "%s: неверное название кодировки символов или не найдена процедура " "перекодировки" -#: command.c:1368 command.c:2157 command.c:3454 command.c:3652 command.c:5882 +#: 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 @@ -321,159 +321,159 @@ msgstr "" msgid "%s" msgstr "%s" -#: command.c:1375 +#: command.c:1376 msgid "There is no previous error." msgstr "Ошибки не было." -#: command.c:1488 +#: command.c:1489 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: отсутствует правая скобка" -#: 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 +#: 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:1822 +#: command.c:1823 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif не может находиться после \\else" -#: command.c:1827 +#: command.c:1828 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif без соответствующего \\if" -#: command.c:1891 +#: command.c:1892 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else не может находиться после \\else" -#: command.c:1896 +#: command.c:1897 #, c-format msgid "\\else: no matching \\if" msgstr "\\else без соответствующего \\if" -#: command.c:1936 +#: command.c:1937 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif без соответствующего \\if" -#: command.c:2092 +#: command.c:2093 msgid "Query buffer is empty." msgstr "Буфер запроса пуст." -#: command.c:2135 +#: command.c:2136 #, c-format msgid "Enter new password for user \"%s\": " msgstr "Введите новый пароль для пользователя \"%s\": " -#: command.c:2139 +#: command.c:2140 msgid "Enter it again: " msgstr "Повторите его: " -#: command.c:2148 +#: command.c:2149 #, c-format msgid "Passwords didn't match." msgstr "Пароли не совпадают." -#: command.c:2231 +#: command.c:2232 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: не удалось прочитать значение переменной" -#: command.c:2333 +#: command.c:2334 msgid "Query buffer reset (cleared)." msgstr "Буфер запроса сброшен (очищен)." -#: command.c:2355 +#: command.c:2356 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "История записана в файл \"%s\".\n" -#: command.c:2442 +#: command.c:2443 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: имя переменной окружения не может содержать знак \"=\"" -#: command.c:2490 +#: command.c:2491 #, c-format msgid "function name is required" msgstr "требуется имя функции" -#: command.c:2492 +#: command.c:2493 #, c-format msgid "view name is required" msgstr "требуется имя представления" -#: command.c:2614 +#: command.c:2615 msgid "Timing is on." msgstr "Секундомер включён." -#: command.c:2616 +#: command.c:2617 msgid "Timing is off." msgstr "Секундомер выключен." -#: 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 +#: 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:2729 copy.c:388 +#: command.c:2730 copy.c:388 #, c-format msgid "%s: %s" msgstr "%s: %s" -#: command.c:2801 command.c:2867 +#: command.c:2802 command.c:2868 #, c-format msgid "\\watch: interval value is specified more than once" msgstr "\\watch: длительность интервала указана неоднократно" -#: command.c:2811 command.c:2877 +#: command.c:2812 command.c:2878 #, c-format msgid "\\watch: incorrect interval value \"%s\"" msgstr "\\watch: некорректная длительность интервала \"%s\"" -#: command.c:2821 +#: command.c:2822 #, c-format msgid "\\watch: iteration count is specified more than once" msgstr "\\watch: число итераций указано неоднократно" -#: command.c:2831 +#: 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: минимальное число строк указано неоднократно" -#: command.c:2851 +#: command.c:2852 #, c-format msgid "\\watch: incorrect minimum row count \"%s\"" msgstr "\\watch: некорректное минимальное число строк \"%s\"" -#: command.c:2858 +#: command.c:2859 #, c-format msgid "\\watch: unrecognized parameter \"%s\"" msgstr "\\watch: нераспознанный параметр \"%s\"" -#: command.c:3255 startup.c:243 startup.c:293 +#: command.c:3256 startup.c:243 startup.c:293 msgid "Password: " msgstr "Пароль: " -#: command.c:3260 startup.c:290 +#: command.c:3261 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Пароль пользователя %s: " -#: command.c:3316 +#: command.c:3317 #, c-format msgid "" "Do not give user, host, or port separately when using a connection string" @@ -481,23 +481,23 @@ msgstr "" "Не указывайте пользователя, компьютер или порт отдельно, когда используете " "строку подключения" -#: command.c:3351 +#: command.c:3352 #, c-format msgid "No database connection exists to re-use parameters from" msgstr "" "Нет подключения к базе, из которого можно было бы использовать параметры" -#: command.c:3658 +#: command.c:3659 #, c-format msgid "Previous connection kept" msgstr "Сохранено предыдущее подключение" -#: command.c:3664 +#: command.c:3665 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3720 +#: command.c:3721 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" on address \"%s\" at " @@ -506,7 +506,7 @@ msgstr "" "Сейчас вы подключены к базе данных \"%s\" как пользователь \"%s\" (адрес " "сервера \"%s\", порт \"%s\").\n" -#: command.c:3723 +#: command.c:3724 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" via socket in \"%s\" " @@ -515,7 +515,7 @@ msgstr "" "Вы подключены к базе данных \"%s\" как пользователь \"%s\" через сокет в " "\"%s\", порт \"%s\".\n" -#: command.c:3729 +#: command.c:3730 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" on host " @@ -524,7 +524,7 @@ msgstr "" "Сейчас вы подключены к базе данных \"%s\" как пользователь \"%s\" (компьютер " "\"%s\": адрес \"%s\", порт \"%s\").\n" -#: command.c:3732 +#: command.c:3733 #, c-format msgid "" "You are now connected to database \"%s\" as user \"%s\" on host \"%s\" at " @@ -533,17 +533,17 @@ msgstr "" "Вы подключены к базе данных \"%s\" как пользователь \"%s\" (компьютер " "\"%s\", порт \"%s\").\n" -#: command.c:3737 +#: command.c:3738 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "Вы подключены к базе данных \"%s\" как пользователь \"%s\".\n" -#: command.c:3843 +#: command.c:3844 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, сервер %s)\n" -#: command.c:3856 +#: command.c:3857 #, c-format msgid "" "WARNING: %s major version %s, server major version %s.\n" @@ -552,33 +552,33 @@ msgstr "" "ПРЕДУПРЕЖДЕНИЕ: %s имеет базовую версию %s, а сервер - %s.\n" " Часть функций psql может не работать.\n" -#: command.c:3895 +#: command.c:3896 #, c-format msgid "SSL connection (protocol: %s, cipher: %s, compression: %s, ALPN: %s)\n" msgstr "SSL-соединение (протокол: %s, шифр: %s, сжатие: %s, ALPN: %s)\n" -#: command.c:3896 command.c:3897 +#: command.c:3897 command.c:3898 msgid "unknown" msgstr "неизвестно" -#: command.c:3898 help.c:42 +#: command.c:3899 help.c:42 msgid "off" msgstr "выкл." -#: command.c:3898 help.c:42 +#: command.c:3899 help.c:42 msgid "on" msgstr "вкл." -#: command.c:3899 +#: command.c:3900 msgid "none" msgstr "нет" -#: command.c:3913 +#: command.c:3914 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "Соединение зашифровано GSSAPI\n" -#: command.c:3933 +#: command.c:3934 #, c-format msgid "" "WARNING: Console code page (%u) differs from Windows code page (%u)\n" @@ -591,7 +591,7 @@ msgstr "" " Подробнее об этом смотрите документацию psql, раздел\n" " \"Notes for Windows users\".\n" -#: command.c:4038 +#: command.c:4041 #, c-format msgid "" "environment variable PSQL_EDITOR_LINENUMBER_ARG must be set to specify a " @@ -600,33 +600,33 @@ msgstr "" "в переменной окружения PSQL_EDITOR_LINENUMBER_ARG должен быть указан номер " "строки" -#: command.c:4068 +#: command.c:4071 #, c-format msgid "could not start editor \"%s\"" msgstr "не удалось запустить редактор \"%s\"" -#: command.c:4070 +#: command.c:4073 #, c-format msgid "could not start /bin/sh" msgstr "не удалось запустить /bin/sh" -#: command.c:4120 +#: command.c:4123 #, c-format msgid "could not locate temporary directory: %s" msgstr "не удалось найти временный каталог: %s" -#: command.c:4147 +#: command.c:4150 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "не удалось открыть временный файл \"%s\": %m" -#: command.c:4483 +#: command.c:4486 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "" "\\pset: неоднозначному сокращению \"%s\" соответствует и \"%s\", и \"%s\"" -#: command.c:4503 +#: command.c:4506 #, c-format msgid "" "\\pset: allowed formats are aligned, asciidoc, csv, html, latex, latex-" @@ -635,27 +635,27 @@ msgstr "" "\\pset: допустимые форматы: aligned, asciidoc, csv, html, latex, latex-" "longtable, troff-ms, unaligned, wrapped" -#: command.c:4522 +#: command.c:4525 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: допустимые стили линий: ascii, old-ascii, unicode" -#: command.c:4537 +#: command.c:4540 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: допустимые стили Unicode-линий границ: single, double" -#: command.c:4552 +#: command.c:4555 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: допустимые стили Unicode-линий столбцов: single, double" -#: command.c:4567 +#: command.c:4570 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: допустимые стили Unicode-линий заголовков: single, double" -#: command.c:4619 +#: command.c:4622 #, c-format msgid "" "\\pset: allowed xheader_width values are \"%s\" (default), \"%s\", \"%s\", " @@ -664,12 +664,12 @@ msgstr "" "\\pset: допустимые значения xheader_width: \"%s\" (по умолчанию), \"%s\", " "\"%s\", а также число, задающее точную ширину" -#: command.c:4636 +#: command.c:4639 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: символ csv_fieldsep должен быть однобайтовым" -#: command.c:4641 +#: command.c:4644 #, c-format msgid "" "\\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage " @@ -678,117 +678,117 @@ msgstr "" "\\pset: в качестве csv_fieldsep нельзя выбрать символ кавычек, новой строки " "или возврата каретки" -#: command.c:4779 command.c:4980 +#: command.c:4782 command.c:4983 #, c-format msgid "\\pset: unknown option: %s" msgstr "неизвестный параметр \\pset: %s" -#: command.c:4799 +#: command.c:4802 #, c-format msgid "Border style is %d.\n" msgstr "Стиль границ: %d.\n" -#: command.c:4805 +#: command.c:4808 #, c-format msgid "Target width is unset.\n" msgstr "Ширина вывода сброшена.\n" -#: command.c:4807 +#: command.c:4810 #, c-format msgid "Target width is %d.\n" msgstr "Ширина вывода: %d.\n" -#: command.c:4814 +#: command.c:4817 #, c-format msgid "Expanded display is on.\n" msgstr "Расширенный вывод включён.\n" -#: command.c:4816 +#: command.c:4819 #, c-format msgid "Expanded display is used automatically.\n" msgstr "Расширенный вывод применяется автоматически.\n" -#: command.c:4818 +#: command.c:4821 #, c-format msgid "Expanded display is off.\n" msgstr "Расширенный вывод выключен.\n" -#: command.c:4825 command.c:4827 command.c:4829 +#: command.c:4828 command.c:4830 command.c:4832 #, c-format msgid "Expanded header width is \"%s\".\n" msgstr "Ширина расширенного заголовка: \"%s\".\n" -#: command.c:4831 +#: command.c:4834 #, c-format msgid "Expanded header width is %d.\n" msgstr "Ширина расширенного заголовка: %d.\n" -#: command.c:4837 +#: command.c:4840 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "Разделитель полей для CSV: \"%s\".\n" -#: command.c:4845 command.c:4853 +#: command.c:4848 command.c:4856 #, c-format msgid "Field separator is zero byte.\n" msgstr "Разделитель полей - нулевой байт.\n" -#: command.c:4847 +#: command.c:4850 #, c-format msgid "Field separator is \"%s\".\n" msgstr "Разделитель полей: \"%s\".\n" -#: command.c:4860 +#: command.c:4863 #, c-format msgid "Default footer is on.\n" msgstr "Строка итогов включена.\n" -#: command.c:4862 +#: command.c:4865 #, c-format msgid "Default footer is off.\n" msgstr "Строка итогов выключена.\n" -#: command.c:4868 +#: command.c:4871 #, c-format msgid "Output format is %s.\n" msgstr "Формат вывода: %s.\n" -#: command.c:4874 +#: command.c:4877 #, c-format msgid "Line style is %s.\n" msgstr "Установлен стиль линий: %s.\n" -#: command.c:4881 +#: command.c:4884 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null выводится как: \"%s\".\n" -#: command.c:4889 +#: command.c:4892 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "Локализованный вывод чисел включён.\n" -#: command.c:4891 +#: command.c:4894 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "Локализованный вывод чисел выключен.\n" -#: command.c:4898 +#: command.c:4901 #, c-format msgid "Pager is used for long output.\n" msgstr "Постраничник используется для вывода длинного текста.\n" -#: command.c:4900 +#: command.c:4903 #, c-format msgid "Pager is always used.\n" msgstr "Постраничник используется всегда.\n" -#: command.c:4902 +#: command.c:4905 #, c-format msgid "Pager usage is off.\n" msgstr "Постраничник выключен.\n" -#: command.c:4908 +#: 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" @@ -796,97 +796,97 @@ msgstr[0] "Постраничник не будет использоваться msgstr[1] "Постраничник не будет использоваться, если строк меньше %d\n" msgstr[2] "Постраничник не будет использоваться, если строк меньше %d\n" -#: command.c:4918 command.c:4928 +#: command.c:4921 command.c:4931 #, c-format msgid "Record separator is zero byte.\n" msgstr "Разделитель записей - нулевой байт.\n" -#: command.c:4920 +#: command.c:4923 #, c-format msgid "Record separator is .\n" msgstr "Разделитель записей: <новая строка>.\n" -#: command.c:4922 +#: command.c:4925 #, c-format msgid "Record separator is \"%s\".\n" msgstr "Разделитель записей: \"%s\".\n" -#: command.c:4935 +#: command.c:4938 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Атрибуты HTML-таблицы: \"%s\".\n" -#: command.c:4938 +#: command.c:4941 #, c-format msgid "Table attributes unset.\n" msgstr "Атрибуты HTML-таблицы не заданы.\n" -#: command.c:4945 +#: command.c:4948 #, c-format msgid "Title is \"%s\".\n" msgstr "Заголовок: \"%s\".\n" -#: command.c:4947 +#: command.c:4950 #, c-format msgid "Title is unset.\n" msgstr "Заголовок не задан.\n" -#: command.c:4954 +#: command.c:4957 #, c-format msgid "Tuples only is on.\n" msgstr "Режим вывода только кортежей включён.\n" -#: command.c:4956 +#: command.c:4959 #, c-format msgid "Tuples only is off.\n" msgstr "Режим вывода только кортежей выключен.\n" -#: command.c:4962 +#: command.c:4965 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Стиль Unicode-линий границ: \"%s\".\n" -#: command.c:4968 +#: command.c:4971 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Стиль Unicode-линий столбцов: \"%s\".\n" -#: command.c:4974 +#: command.c:4977 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Стиль Unicode-линий границ: \"%s\".\n" -#: command.c:5223 +#: command.c:5226 #, c-format msgid "\\!: failed" msgstr "\\!: ошибка" -#: command.c:5261 +#: command.c:5264 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch нельзя использовать с пустым запросом" -#: command.c:5293 +#: command.c:5296 #, c-format msgid "could not set timer: %m" msgstr "не удалось установить таймер: %m" -#: command.c:5362 +#: command.c:5365 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (обновление: %g с)\n" -#: command.c:5365 +#: command.c:5368 #, c-format msgid "%s (every %gs)\n" msgstr "%s (обновление: %g с)\n" -#: command.c:5429 +#: command.c:5432 #, 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 +#: command.c:5488 command.c:5495 common.c:632 common.c:639 common.c:1123 #, c-format msgid "" "/******** QUERY *********/\n" @@ -899,12 +899,12 @@ msgstr "" "/************************/\n" "\n" -#: command.c:5671 +#: command.c:5674 #, c-format msgid "\"%s.%s\" is not a view" msgstr "\"%s.%s\" — не представление" -#: command.c:5687 +#: command.c:5690 #, c-format msgid "could not parse reloptions array" msgstr "не удалось разобрать массив reloptions" @@ -6889,7 +6889,7 @@ msgstr "лишний аргумент \"%s\" проигнорирован" msgid "could not find own program executable" msgstr "не удалось найти свой исполняемый файл" -#: tab-complete.c:6216 +#: tab-complete.c:6230 #, c-format msgid "" "tab completion query failed: %s\n" diff --git a/src/bin/psql/po/uk.po b/src/bin/psql/po/uk.po index bd64a745d18e1..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: 2024-09-23 10:48+0000\n" -"PO-Revision-Date: 2024-09-23 19:38\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" @@ -78,7 +78,7 @@ msgid "%s() failed: %m" msgstr "%s() помилка: %m" #: ../../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 +#: 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" @@ -186,12 +186,12 @@ msgstr "невірний формат виводу (внутрішня поми msgid "skipping recursive expansion of variable \"%s\"" msgstr "пропуск рекурсивного розгортання змінної \"%s\"" -#: ../../fe_utils/string_utils.c:434 +#: ../../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:607 +#: ../../fe_utils/string_utils.c:760 #, c-format msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "назва бази даних містить символ нового рядка або повернення каретки: \"%s\"\n" @@ -261,12 +261,12 @@ msgstr "Ви під'єднані до бази даних \"%s\" як корис 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:1069 command.c:1170 command.c:2675 +#: command.c:1069 command.c:1170 command.c:2676 #, c-format msgid "no query buffer" msgstr "немає буферу запитів" -#: command.c:1102 command.c:5771 +#: command.c:1102 command.c:5779 #, c-format msgid "invalid line number: %s" msgstr "невірний номер рядка: %s" @@ -280,7 +280,7 @@ msgstr "Без змін" msgid "%s: invalid encoding name or conversion procedure not found" msgstr "%s: невірне ім'я кодування або не знайдено процедуру конверсії" -#: command.c:1368 command.c:2157 command.c:3454 command.c:3652 command.c:5877 +#: 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 @@ -289,242 +289,242 @@ msgstr "%s: невірне ім'я кодування або не знайден msgid "%s" msgstr "%s" -#: command.c:1375 +#: command.c:1376 msgid "There is no previous error." msgstr "Попередня помилка відсутня." -#: command.c:1488 +#: command.c:1489 #, c-format msgid "\\%s: missing right parenthesis" msgstr "\\%s: відсутня права дужка" -#: 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 +#: 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:1822 +#: command.c:1823 #, c-format msgid "\\elif: cannot occur after \\else" msgstr "\\elif: не може йти після \\else" -#: command.c:1827 +#: command.c:1828 #, c-format msgid "\\elif: no matching \\if" msgstr "\\elif: немає відповідного \\if" -#: command.c:1891 +#: command.c:1892 #, c-format msgid "\\else: cannot occur after \\else" msgstr "\\else: не може йти після \\else" -#: command.c:1896 +#: command.c:1897 #, c-format msgid "\\else: no matching \\if" msgstr "\\else: немає відповідного \\if" -#: command.c:1936 +#: command.c:1937 #, c-format msgid "\\endif: no matching \\if" msgstr "\\endif: немає відповідного \\if" -#: command.c:2092 +#: command.c:2093 msgid "Query buffer is empty." msgstr "Буфер запиту порожній." -#: command.c:2135 +#: command.c:2136 #, c-format msgid "Enter new password for user \"%s\": " msgstr "Введіть новий пароль користувача \"%s\": " -#: command.c:2139 +#: command.c:2140 msgid "Enter it again: " msgstr "Введіть знову: " -#: command.c:2148 +#: command.c:2149 #, c-format msgid "Passwords didn't match." msgstr "Паролі не співпадають." -#: command.c:2231 +#: command.c:2232 #, c-format msgid "\\%s: could not read value for variable" msgstr "\\%s: не вдалося прочитати значення змінної" -#: command.c:2333 +#: command.c:2334 msgid "Query buffer reset (cleared)." msgstr "Буфер запитів скинуто (очищено)." -#: command.c:2355 +#: command.c:2356 #, c-format msgid "Wrote history to file \"%s\".\n" msgstr "Історію записано до файлу \"%s\".\n" -#: command.c:2442 +#: command.c:2443 #, c-format msgid "\\%s: environment variable name must not contain \"=\"" msgstr "\\%s: змінна середовища не повинна містити \"=\"" -#: command.c:2490 +#: command.c:2491 #, c-format msgid "function name is required" msgstr "необхідне ім'я функції" -#: command.c:2492 +#: command.c:2493 #, c-format msgid "view name is required" msgstr "необхідне ім'я подання" -#: command.c:2614 +#: command.c:2615 msgid "Timing is on." msgstr "Таймер увімкнено." -#: command.c:2616 +#: command.c:2617 msgid "Timing is off." msgstr "Таймер вимкнено." -#: 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 +#: 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:2729 copy.c:388 +#: command.c:2730 copy.c:388 #, c-format msgid "%s: %s" msgstr "%s: %s" -#: command.c:2801 command.c:2867 +#: command.c:2802 command.c:2868 #, c-format msgid "\\watch: interval value is specified more than once" msgstr "\\watch: інтервал зазначається неодноразово" -#: command.c:2811 command.c:2877 +#: command.c:2812 command.c:2878 #, c-format msgid "\\watch: incorrect interval value \"%s\"" msgstr "\\watch: неправильне значення інтервалу \"%s\"" -#: command.c:2821 +#: command.c:2822 #, c-format msgid "\\watch: iteration count is specified more than once" msgstr "\\watch: інтервал зазначається неодноразово" -#: command.c:2831 +#: 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: мінімальна кількість рядків вказана більше одного разу" -#: command.c:2851 +#: command.c:2852 #, c-format msgid "\\watch: incorrect minimum row count \"%s\"" msgstr "\\watch: неправильна мінімальна кількість рядків \"%s\"" -#: command.c:2858 +#: command.c:2859 #, c-format msgid "\\watch: unrecognized parameter \"%s\"" msgstr "\\watch: нерозпізнаний параметр \"%s\"" -#: command.c:3255 startup.c:243 startup.c:293 +#: command.c:3256 startup.c:243 startup.c:293 msgid "Password: " msgstr "Пароль: " -#: command.c:3260 startup.c:290 +#: command.c:3261 startup.c:290 #, c-format msgid "Password for user %s: " msgstr "Пароль користувача %s:" -#: command.c:3316 +#: command.c:3317 #, c-format msgid "Do not give user, host, or port separately when using a connection string" msgstr "Не надайте користувачеві, хосту або порту окремо під час використання рядка підключення" -#: command.c:3351 +#: command.c:3352 #, c-format msgid "No database connection exists to re-use parameters from" msgstr "Не існує підключення до бази даних для повторного використання параметрів" -#: command.c:3658 +#: command.c:3659 #, c-format msgid "Previous connection kept" msgstr "Попереднє підключення триває" -#: command.c:3664 +#: command.c:3665 #, c-format msgid "\\connect: %s" msgstr "\\connect: %s" -#: command.c:3720 +#: 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:3723 +#: 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:3729 +#: 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:3732 +#: 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:3737 +#: command.c:3738 #, c-format msgid "You are now connected to database \"%s\" as user \"%s\".\n" msgstr "Ви тепер під'єднані до бази даних \"%s\" як користувач \"%s\".\n" -#: command.c:3843 +#: command.c:3844 #, c-format msgid "%s (%s, server %s)\n" msgstr "%s (%s, сервер %s)\n" -#: command.c:3856 +#: command.c:3857 #, c-format msgid "WARNING: %s major version %s, server major version %s.\n" " Some psql features might not work.\n" msgstr "УВАГА: мажорна версія %s %s, мажорна версія сервера %s.\n" " Деякі функції psql можуть не працювати.\n" -#: command.c:3895 +#: command.c:3896 #, c-format msgid "SSL connection (protocol: %s, cipher: %s, compression: %s, ALPN: %s)\n" msgstr "З'єднання SSL (протокол: %s, шифр: %s, компресія: %s, ALPN: %s)\n" -#: command.c:3896 command.c:3897 +#: command.c:3897 command.c:3898 msgid "unknown" msgstr "невідомо" -#: command.c:3898 help.c:42 +#: command.c:3899 help.c:42 msgid "off" msgstr "вимк" -#: command.c:3898 help.c:42 +#: command.c:3899 help.c:42 msgid "on" msgstr "увімк" -#: command.c:3899 +#: command.c:3900 msgid "none" msgstr "нічого" -#: command.c:3913 +#: command.c:3914 #, c-format msgid "GSSAPI-encrypted connection\n" msgstr "З'єднання зашифровано GSSAPI\n" -#: command.c:3933 +#: command.c:3934 #, 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" @@ -533,187 +533,187 @@ msgstr "УВАГА: Кодова сторінка консолі (%u) відрі " 8-бітові символи можуть працювати неправильно. Детальніше у розділі \n" " \"Нотатки для користувачів Windows\" у документації psql.\n" -#: command.c:4038 +#: 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:4068 +#: command.c:4071 #, c-format msgid "could not start editor \"%s\"" msgstr "неможливо запустити редактор \"%s\"" -#: command.c:4070 +#: command.c:4073 #, c-format msgid "could not start /bin/sh" msgstr "неможливо запустити /bin/sh" -#: command.c:4120 +#: command.c:4123 #, c-format msgid "could not locate temporary directory: %s" msgstr "неможливо знайти тимчасову директорію: %s" -#: command.c:4147 +#: command.c:4150 #, c-format msgid "could not open temporary file \"%s\": %m" msgstr "неможливо відкрити тимчасовий файл \"%s\": %m" -#: command.c:4483 +#: command.c:4486 #, c-format msgid "\\pset: ambiguous abbreviation \"%s\" matches both \"%s\" and \"%s\"" msgstr "\\pset: неоднозначна абревіатура \"%s\" відповідає обом \"%s\" і \"%s" -#: command.c:4503 +#: 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:4522 +#: command.c:4525 #, c-format msgid "\\pset: allowed line styles are ascii, old-ascii, unicode" msgstr "\\pset: дозволені стилі ліній: ascii, old-ascii, unicode" -#: command.c:4537 +#: command.c:4540 #, c-format msgid "\\pset: allowed Unicode border line styles are single, double" msgstr "\\pset: дозволені стилі ліній рамок Unicode: single, double" -#: command.c:4552 +#: command.c:4555 #, c-format msgid "\\pset: allowed Unicode column line styles are single, double" msgstr "\\pset: дозволені стилі ліній стовпців для Unicode: single, double" -#: command.c:4567 +#: command.c:4570 #, c-format msgid "\\pset: allowed Unicode header line styles are single, double" msgstr "\\pset: дозволені стилі ліній заголовків для Unicode: single, double" -#: command.c:4619 +#: 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:4636 +#: command.c:4639 #, c-format msgid "\\pset: csv_fieldsep must be a single one-byte character" msgstr "\\pset: csv_fieldsep повинен бути однобайтовим символом" -#: command.c:4641 +#: 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:4779 command.c:4980 +#: command.c:4782 command.c:4983 #, c-format msgid "\\pset: unknown option: %s" msgstr "\\pset: невідомий параметр: %s" -#: command.c:4799 +#: command.c:4802 #, c-format msgid "Border style is %d.\n" msgstr "Стиль рамки %d.\n" -#: command.c:4805 +#: command.c:4808 #, c-format msgid "Target width is unset.\n" msgstr "Цільова ширина не встановлена.\n" -#: command.c:4807 +#: command.c:4810 #, c-format msgid "Target width is %d.\n" msgstr "Цільова ширина %d.\n" -#: command.c:4814 +#: command.c:4817 #, c-format msgid "Expanded display is on.\n" msgstr "Розширене відображення увімкнуто.\n" -#: command.c:4816 +#: command.c:4819 #, c-format msgid "Expanded display is used automatically.\n" msgstr "Розширене відображення використовується автоматично.\n" -#: command.c:4818 +#: command.c:4821 #, c-format msgid "Expanded display is off.\n" msgstr "Розширене відображення вимкнуто.\n" -#: command.c:4825 command.c:4827 command.c:4829 +#: command.c:4828 command.c:4830 command.c:4832 #, c-format msgid "Expanded header width is \"%s\".\n" msgstr "Розширена ширина заголовка \"%s\".\n" -#: command.c:4831 +#: command.c:4834 #, c-format msgid "Expanded header width is %d.\n" msgstr "Розширена ширина заголовка %d.\n" -#: command.c:4837 +#: command.c:4840 #, c-format msgid "Field separator for CSV is \"%s\".\n" msgstr "Розділювач полів CSV: \"%s\".\n" -#: command.c:4845 command.c:4853 +#: command.c:4848 command.c:4856 #, c-format msgid "Field separator is zero byte.\n" msgstr "Розділювач полів - нульовий байт.\n" -#: command.c:4847 +#: command.c:4850 #, c-format msgid "Field separator is \"%s\".\n" msgstr "Розділювач полів \"%s\".\n" -#: command.c:4860 +#: command.c:4863 #, c-format msgid "Default footer is on.\n" msgstr "Нинжній колонтитул увімкнуто за замовчуванням.\n" -#: command.c:4862 +#: command.c:4865 #, c-format msgid "Default footer is off.\n" msgstr "Нинжній колонтитул вимкнуто за замовчуванням.\n" -#: command.c:4868 +#: command.c:4871 #, c-format msgid "Output format is %s.\n" msgstr "Формат виводу %s.\n" -#: command.c:4874 +#: command.c:4877 #, c-format msgid "Line style is %s.\n" msgstr "Стиль лінії %s.\n" -#: command.c:4881 +#: command.c:4884 #, c-format msgid "Null display is \"%s\".\n" msgstr "Null відображається як \"%s\".\n" -#: command.c:4889 +#: command.c:4892 #, c-format msgid "Locale-adjusted numeric output is on.\n" msgstr "Локалізоване виведення чисел ввімкнено.\n" -#: command.c:4891 +#: command.c:4894 #, c-format msgid "Locale-adjusted numeric output is off.\n" msgstr "Локалізоване виведення чисел вимкнено.\n" -#: command.c:4898 +#: command.c:4901 #, c-format msgid "Pager is used for long output.\n" msgstr "Пейджер використовується для виведення довгого тексту.\n" -#: command.c:4900 +#: command.c:4903 #, c-format msgid "Pager is always used.\n" msgstr "Завжди використовується пейджер.\n" -#: command.c:4902 +#: command.c:4905 #, c-format msgid "Pager usage is off.\n" msgstr "Пейджер не використовується.\n" -#: command.c:4908 +#: 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" @@ -722,97 +722,97 @@ msgstr[1] "Пейджер не буде використовуватися дл msgstr[2] "Пейджер не буде використовуватися для менш ніж %d рядків.\n" msgstr[3] "Пейджер не буде використовуватися для менш ніж %d рядка.\n" -#: command.c:4918 command.c:4928 +#: command.c:4921 command.c:4931 #, c-format msgid "Record separator is zero byte.\n" msgstr "Розділювач записів - нульовий байт.\n" -#: command.c:4920 +#: command.c:4923 #, c-format msgid "Record separator is .\n" msgstr "Розділювач записів: .\n" -#: command.c:4922 +#: command.c:4925 #, c-format msgid "Record separator is \"%s\".\n" msgstr "Розділювач записів: \"%s\".\n" -#: command.c:4935 +#: command.c:4938 #, c-format msgid "Table attributes are \"%s\".\n" msgstr "Табличні атрибути \"%s\".\n" -#: command.c:4938 +#: command.c:4941 #, c-format msgid "Table attributes unset.\n" msgstr "Атрибути таблиць не задані.\n" -#: command.c:4945 +#: command.c:4948 #, c-format msgid "Title is \"%s\".\n" msgstr "Заголовок: \"%s\".\n" -#: command.c:4947 +#: command.c:4950 #, c-format msgid "Title is unset.\n" msgstr "Заголовок не встановлено.\n" -#: command.c:4954 +#: command.c:4957 #, c-format msgid "Tuples only is on.\n" msgstr "Увімкнуто тільки кортежі.\n" -#: command.c:4956 +#: command.c:4959 #, c-format msgid "Tuples only is off.\n" msgstr "Вимкнуто тільки кортежі.\n" -#: command.c:4962 +#: command.c:4965 #, c-format msgid "Unicode border line style is \"%s\".\n" msgstr "Стиль ліній рамки для Unicode: \"%s\".\n" -#: command.c:4968 +#: command.c:4971 #, c-format msgid "Unicode column line style is \"%s\".\n" msgstr "Стиль ліній стовпців для Unicode: \"%s\".\n" -#: command.c:4974 +#: command.c:4977 #, c-format msgid "Unicode header line style is \"%s\".\n" msgstr "Стиль ліній заголовків для Unicode: \"%s\".\n" -#: command.c:5223 +#: command.c:5226 #, c-format msgid "\\!: failed" msgstr "\\!: помилка" -#: command.c:5257 +#: command.c:5264 #, c-format msgid "\\watch cannot be used with an empty query" msgstr "\\watch не може бути використано із пустим запитом" -#: command.c:5289 +#: command.c:5296 #, c-format msgid "could not set timer: %m" msgstr "не вдалося встановити таймер: %m" -#: command.c:5358 +#: command.c:5365 #, c-format msgid "%s\t%s (every %gs)\n" msgstr "%s\t%s (кожні %g сек)\n" -#: command.c:5361 +#: command.c:5368 #, c-format msgid "%s (every %gs)\n" msgstr "%s (кожні %g сек)\n" -#: command.c:5424 +#: command.c:5432 #, c-format msgid "could not wait for signals: %m" msgstr "не вдалося дочекатися сигналів: %m" -#: command.c:5480 command.c:5487 common.c:632 common.c:639 common.c:1123 +#: command.c:5488 command.c:5495 common.c:632 common.c:639 common.c:1123 #, c-format msgid "/******** QUERY *********/\n" "%s\n" @@ -821,12 +821,12 @@ msgstr "/******** ЗАПИТ *********/\n" "%s\n" "/************************/\n\n" -#: command.c:5666 +#: command.c:5674 #, c-format msgid "\"%s.%s\" is not a view" msgstr "\"%s.%s\" не є поданням" -#: command.c:5682 +#: command.c:5690 #, c-format msgid "could not parse reloptions array" msgstr "неможливо розібрати масив reloptions" @@ -2505,7 +2505,7 @@ msgstr "Великі об'єкти" msgid "psql is the PostgreSQL interactive terminal.\n\n" msgstr "psql - це інтерактивний термінал PostgreSQL.\n\n" -#: help.c:64 help.c:372 help.c:456 help.c:499 +#: help.c:64 help.c:372 help.c:456 help.c:502 msgid "Usage:\n" msgstr "Використання:\n" @@ -3147,14 +3147,14 @@ msgid " \\pset [NAME [VALUE]] set table output option\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" 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:298 #, c-format @@ -3598,19 +3598,27 @@ msgstr " unicode_border_linestyle\n" " unicode_header_linestyle\n" " задає стиль мальювання ліній (Unicode) [single, double]\n" -#: help.c:498 +#: 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" "Змінні оточення:\n" -#: help.c:502 +#: 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:504 +#: help.c:507 msgid " set NAME=VALUE\n" " psql ...\n" " or \\setenv NAME [VALUE] inside psql\n\n" @@ -3618,107 +3626,107 @@ msgstr " встановлює ІМ'Я=ЗНАЧЕННЯ\n" " psql ...\n" " або \\setenv ІМ'Я [VALUE] всередині psql\n\n" -#: help.c:507 +#: help.c:510 msgid " COLUMNS\n" " number of columns for wrapped format\n" msgstr " COLUMNS\n" " число стовпців для форматування з переносом\n" -#: help.c:509 +#: help.c:512 msgid " PGAPPNAME\n" " same as the application_name connection parameter\n" msgstr " PGAPPNAME\n" " те саме, що параметр підключення application_name\n" -#: help.c:511 +#: help.c:514 msgid " PGDATABASE\n" " same as the dbname connection parameter\n" msgstr " PGDATABASE\n" " те саме, що параметр підключення dbname\n" -#: help.c:513 +#: help.c:516 msgid " PGHOST\n" " same as the host connection parameter\n" msgstr " PGHOST\n" " те саме, що параметр підключення host\n" -#: help.c:515 +#: help.c:518 msgid " PGPASSFILE\n" " password file name\n" msgstr " PGPASSFILE\n" " назва файлу з паролем\n" -#: help.c:517 +#: help.c:520 msgid " PGPASSWORD\n" " connection password (not recommended)\n" msgstr " PGPASSWORD\n" " пароль для підключення (не рекомендується)\n" -#: help.c:519 +#: help.c:522 msgid " PGPORT\n" " same as the port connection parameter\n" msgstr " PGPORT\n" " те саме, що параметр підключення port\n" -#: help.c:521 +#: help.c:524 msgid " PGUSER\n" " same as the user connection parameter\n" msgstr " PGUSER\n" " те саме, що параметр підключення user\n" -#: help.c:523 +#: 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" " редактор для команд \\e, \\ef і \\ev\n" -#: help.c:525 +#: 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" " як вказати номер рядка при виклику редактора\n" -#: help.c:527 +#: help.c:530 msgid " PSQL_HISTORY\n" " alternative location for the command history file\n" msgstr " PSQL_HISTORY\n" " альтернативне розміщення файлу з історією команд\n" -#: help.c:529 +#: help.c:532 msgid " PSQL_PAGER, PAGER\n" " name of external pager program\n" msgstr " PSQL_PAGER, PAGER\n" " ім'я програми зовнішнього пейджеру\n" -#: help.c:532 +#: 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:535 +#: help.c:538 msgid " PSQLRC\n" " alternative location for the user's .psqlrc file\n" msgstr " PSQLRC\n" " альтернативне розміщення користувацького файла .psqlrc\n" -#: help.c:537 +#: help.c:540 msgid " SHELL\n" " shell used by the \\! command\n" msgstr " SHELL\n" " оболонка, що використовується командою \\!\n" -#: help.c:539 +#: help.c:542 msgid " TMPDIR\n" " directory for temporary files\n" msgstr " TMPDIR\n" " каталог для тимчасових файлів\n" -#: help.c:599 +#: help.c:602 msgid "Available help:\n" msgstr "Доступна довідка:\n" -#: help.c:694 +#: help.c:697 #, c-format msgid "Command: %s\n" "Description: %s\n" @@ -3731,7 +3739,7 @@ msgstr "Команда: %s\n" "%s\n\n" "URL: %s\n\n" -#: help.c:717 +#: help.c:720 #, c-format msgid "No help available for \"%s\".\n" "Try \\h with no arguments to see available help.\n" @@ -3844,202 +3852,202 @@ 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:240 -#: sql_help.c:242 sql_help.c:243 sql_help.c:245 sql_help.c:247 sql_help.c:250 -#: sql_help.c:252 sql_help.c:254 sql_help.c:256 sql_help.c:268 sql_help.c:269 -#: sql_help.c:270 sql_help.c:272 sql_help.c:321 sql_help.c:323 sql_help.c:325 -#: sql_help.c:327 sql_help.c:396 sql_help.c:401 sql_help.c:403 sql_help.c:445 -#: sql_help.c:447 sql_help.c:450 sql_help.c:452 sql_help.c:521 sql_help.c:526 -#: sql_help.c:531 sql_help.c:536 sql_help.c:541 sql_help.c:595 sql_help.c:597 -#: sql_help.c:599 sql_help.c:601 sql_help.c:603 sql_help.c:606 sql_help.c:608 -#: sql_help.c:611 sql_help.c:622 sql_help.c:624 sql_help.c:668 sql_help.c:670 -#: sql_help.c:672 sql_help.c:675 sql_help.c:677 sql_help.c:679 sql_help.c:720 -#: sql_help.c:724 sql_help.c:728 sql_help.c:749 sql_help.c:752 sql_help.c:755 -#: sql_help.c:784 sql_help.c:796 sql_help.c:804 sql_help.c:807 sql_help.c:810 -#: sql_help.c:825 sql_help.c:828 sql_help.c:857 sql_help.c:862 sql_help.c:867 -#: sql_help.c:872 sql_help.c:877 sql_help.c:904 sql_help.c:906 sql_help.c:908 -#: sql_help.c:910 sql_help.c:913 sql_help.c:915 sql_help.c:962 sql_help.c:1007 -#: sql_help.c:1012 sql_help.c:1017 sql_help.c:1022 sql_help.c:1027 -#: sql_help.c:1046 sql_help.c:1057 sql_help.c:1059 sql_help.c:1079 -#: sql_help.c:1089 sql_help.c:1090 sql_help.c:1092 sql_help.c:1094 -#: sql_help.c:1106 sql_help.c:1110 sql_help.c:1112 sql_help.c:1124 -#: sql_help.c:1126 sql_help.c:1128 sql_help.c:1130 sql_help.c:1149 -#: sql_help.c:1151 sql_help.c:1155 sql_help.c:1159 sql_help.c:1163 -#: sql_help.c:1166 sql_help.c:1167 sql_help.c:1168 sql_help.c:1171 -#: sql_help.c:1174 sql_help.c:1176 sql_help.c:1316 sql_help.c:1318 -#: sql_help.c:1321 sql_help.c:1324 sql_help.c:1326 sql_help.c:1328 -#: sql_help.c:1331 sql_help.c:1334 sql_help.c:1456 sql_help.c:1458 -#: sql_help.c:1460 sql_help.c:1463 sql_help.c:1484 sql_help.c:1487 -#: sql_help.c:1490 sql_help.c:1493 sql_help.c:1497 sql_help.c:1499 -#: sql_help.c:1501 sql_help.c:1503 sql_help.c:1517 sql_help.c:1520 -#: sql_help.c:1522 sql_help.c:1524 sql_help.c:1534 sql_help.c:1536 -#: sql_help.c:1546 sql_help.c:1548 sql_help.c:1558 sql_help.c:1561 -#: sql_help.c:1584 sql_help.c:1586 sql_help.c:1588 sql_help.c:1590 -#: sql_help.c:1593 sql_help.c:1595 sql_help.c:1598 sql_help.c:1601 -#: sql_help.c:1652 sql_help.c:1695 sql_help.c:1698 sql_help.c:1700 -#: sql_help.c:1702 sql_help.c:1705 sql_help.c:1707 sql_help.c:1709 -#: sql_help.c:1712 sql_help.c:1762 sql_help.c:1778 sql_help.c:2011 -#: sql_help.c:2080 sql_help.c:2099 sql_help.c:2112 sql_help.c:2170 -#: sql_help.c:2178 sql_help.c:2188 sql_help.c:2216 sql_help.c:2249 -#: sql_help.c:2267 sql_help.c:2295 sql_help.c:2406 sql_help.c:2452 -#: sql_help.c:2477 sql_help.c:2500 sql_help.c:2504 sql_help.c:2538 -#: sql_help.c:2558 sql_help.c:2580 sql_help.c:2594 sql_help.c:2615 -#: sql_help.c:2644 sql_help.c:2677 sql_help.c:2700 sql_help.c:2747 -#: sql_help.c:3045 sql_help.c:3058 sql_help.c:3075 sql_help.c:3091 -#: sql_help.c:3131 sql_help.c:3185 sql_help.c:3189 sql_help.c:3191 -#: sql_help.c:3198 sql_help.c:3217 sql_help.c:3244 sql_help.c:3279 -#: sql_help.c:3291 sql_help.c:3300 sql_help.c:3344 sql_help.c:3358 -#: sql_help.c:3386 sql_help.c:3394 sql_help.c:3406 sql_help.c:3416 -#: sql_help.c:3424 sql_help.c:3432 sql_help.c:3440 sql_help.c:3448 -#: sql_help.c:3457 sql_help.c:3468 sql_help.c:3476 sql_help.c:3484 -#: sql_help.c:3492 sql_help.c:3500 sql_help.c:3510 sql_help.c:3519 -#: sql_help.c:3528 sql_help.c:3536 sql_help.c:3546 sql_help.c:3557 -#: sql_help.c:3565 sql_help.c:3574 sql_help.c:3585 sql_help.c:3594 -#: 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:3691 sql_help.c:3700 -#: sql_help.c:3708 sql_help.c:3725 sql_help.c:3740 sql_help.c:4053 -#: sql_help.c:4174 sql_help.c:4203 sql_help.c:4219 sql_help.c:4221 -#: sql_help.c:4725 sql_help.c:4773 sql_help.c:4932 +#: 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:332 sql_help.c:1855 -#: sql_help.c:3359 sql_help.c:4492 +#: 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:255 -#: sql_help.c:273 sql_help.c:404 sql_help.c:451 sql_help.c:530 sql_help.c:578 -#: sql_help.c:596 sql_help.c:623 sql_help.c:676 sql_help.c:751 sql_help.c:806 -#: sql_help.c:827 sql_help.c:866 sql_help.c:916 sql_help.c:963 sql_help.c:1016 -#: sql_help.c:1048 sql_help.c:1058 sql_help.c:1093 sql_help.c:1113 -#: sql_help.c:1127 sql_help.c:1177 sql_help.c:1325 sql_help.c:1457 -#: sql_help.c:1500 sql_help.c:1521 sql_help.c:1535 sql_help.c:1547 -#: sql_help.c:1560 sql_help.c:1587 sql_help.c:1653 sql_help.c:1706 +#: 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:253 -#: sql_help.c:271 sql_help.c:402 sql_help.c:487 sql_help.c:535 sql_help.c:625 -#: sql_help.c:634 sql_help.c:699 sql_help.c:723 sql_help.c:754 sql_help.c:809 -#: sql_help.c:871 sql_help.c:914 sql_help.c:1021 sql_help.c:1060 -#: sql_help.c:1091 sql_help.c:1111 sql_help.c:1125 sql_help.c:1175 -#: sql_help.c:1391 sql_help.c:1459 sql_help.c:1502 sql_help.c:1523 -#: sql_help.c:1585 sql_help.c:1701 sql_help.c:3031 +#: 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:257 sql_help.c:324 -#: sql_help.c:453 sql_help.c:540 sql_help.c:678 sql_help.c:727 sql_help.c:757 -#: sql_help.c:812 sql_help.c:876 sql_help.c:1026 sql_help.c:1095 -#: sql_help.c:1129 sql_help.c:1327 sql_help.c:1504 sql_help.c:1525 -#: sql_help.c:1537 sql_help.c:1549 sql_help.c:1589 sql_help.c:1708 +#: 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:1919 sql_help.c:3360 sql_help.c:4521 +#: 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: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:858 -#: sql_help.c:863 sql_help.c:868 sql_help.c:873 sql_help.c:878 sql_help.c:1008 -#: sql_help.c:1013 sql_help.c:1018 sql_help.c:1023 sql_help.c:1028 -#: sql_help.c:1873 sql_help.c:1890 sql_help.c:1896 sql_help.c:1920 -#: sql_help.c:1923 sql_help.c:1926 sql_help.c:2081 sql_help.c:2100 -#: sql_help.c:2103 sql_help.c:2407 sql_help.c:2616 sql_help.c:3361 -#: sql_help.c:3364 sql_help.c:3367 sql_help.c:3458 sql_help.c:3547 -#: sql_help.c:3575 sql_help.c:3928 sql_help.c:4391 sql_help.c:4498 -#: sql_help.c:4505 sql_help.c:4511 sql_help.c:4522 sql_help.c:4525 -#: sql_help.c:4528 +#: 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: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:859 -#: sql_help.c:864 sql_help.c:869 sql_help.c:874 sql_help.c:879 sql_help.c:1009 -#: sql_help.c:1014 sql_help.c:1019 sql_help.c:1024 sql_help.c:1029 -#: sql_help.c:1874 sql_help.c:1891 sql_help.c:1897 sql_help.c:1921 -#: sql_help.c:1924 sql_help.c:1927 sql_help.c:2082 sql_help.c:2101 -#: sql_help.c:2104 sql_help.c:2408 sql_help.c:2617 sql_help.c:3362 -#: sql_help.c:3365 sql_help.c:3368 sql_help.c:3459 sql_help.c:3548 -#: sql_help.c:3576 sql_help.c:4499 sql_help.c:4506 sql_help.c:4512 -#: sql_help.c:4523 sql_help.c:4526 sql_help.c:4529 +#: 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:344 sql_help.c:357 -#: sql_help.c:361 sql_help.c:377 sql_help.c:380 sql_help.c:383 sql_help.c:524 -#: sql_help.c:529 sql_help.c:534 sql_help.c:539 sql_help.c:544 sql_help.c:860 -#: sql_help.c:865 sql_help.c:870 sql_help.c:875 sql_help.c:880 sql_help.c:1010 -#: sql_help.c:1015 sql_help.c:1020 sql_help.c:1025 sql_help.c:1030 -#: sql_help.c:1875 sql_help.c:1892 sql_help.c:1898 sql_help.c:1922 -#: sql_help.c:1925 sql_help.c:1928 sql_help.c:2409 sql_help.c:2618 -#: sql_help.c:3363 sql_help.c:3366 sql_help.c:3369 sql_help.c:3460 -#: sql_help.c:3549 sql_help.c:3577 sql_help.c:4500 sql_help.c:4507 -#: sql_help.c:4513 sql_help.c:4524 sql_help.c:4527 sql_help.c:4530 +#: 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:399 sql_help.c:476 sql_help.c:488 sql_help.c:957 -#: sql_help.c:1108 sql_help.c:1518 sql_help.c:1647 sql_help.c:1679 -#: sql_help.c:1731 sql_help.c:1790 sql_help.c:1979 sql_help.c:1986 -#: sql_help.c:2298 sql_help.c:2348 sql_help.c:2355 sql_help.c:2364 -#: sql_help.c:2453 sql_help.c:2678 sql_help.c:2769 sql_help.c:3060 -#: sql_help.c:3245 sql_help.c:3267 sql_help.c:3407 sql_help.c:3764 -#: sql_help.c:3972 sql_help.c:4218 sql_help.c:4220 sql_help.c:4998 +#: 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:958 sql_help.c:1648 sql_help.c:2454 -#: sql_help.c:2679 sql_help.c:3246 sql_help.c:3408 +#: 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:2230 +#: sql_help.c:116 sql_help.c:2238 msgid "allowconn" msgstr "дозвол_підкл" -#: sql_help.c:117 sql_help.c:959 sql_help.c:1649 sql_help.c:2231 -#: sql_help.c:2455 sql_help.c:2680 sql_help.c:3247 +#: 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:2232 +#: sql_help.c:118 sql_help.c:2240 msgid "istemplate" msgstr "чи_шаблон" -#: sql_help.c:124 sql_help.c:613 sql_help.c:681 sql_help.c:695 sql_help.c:1330 -#: sql_help.c:1384 sql_help.c:4224 +#: 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:550 sql_help.c:552 -#: sql_help.c:553 sql_help.c:883 sql_help.c:885 sql_help.c:886 sql_help.c:966 -#: sql_help.c:970 sql_help.c:973 sql_help.c:1035 sql_help.c:1037 -#: sql_help.c:1038 sql_help.c:1188 sql_help.c:1190 sql_help.c:1656 -#: sql_help.c:1660 sql_help.c:1663 sql_help.c:2419 sql_help.c:2622 -#: sql_help.c:3940 sql_help.c:4242 sql_help.c:4403 sql_help.c:4713 +#: 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:400 sql_help.c:471 sql_help.c:477 sql_help.c:489 -#: sql_help.c:551 sql_help.c:605 sql_help.c:687 sql_help.c:697 sql_help.c:884 -#: sql_help.c:912 sql_help.c:967 sql_help.c:1036 sql_help.c:1109 -#: sql_help.c:1154 sql_help.c:1158 sql_help.c:1162 sql_help.c:1165 -#: sql_help.c:1170 sql_help.c:1173 sql_help.c:1189 sql_help.c:1363 -#: sql_help.c:1386 sql_help.c:1434 sql_help.c:1442 sql_help.c:1462 -#: sql_help.c:1519 sql_help.c:1603 sql_help.c:1657 sql_help.c:1680 -#: sql_help.c:2299 sql_help.c:2349 sql_help.c:2356 sql_help.c:2365 -#: sql_help.c:2420 sql_help.c:2421 sql_help.c:2485 sql_help.c:2488 -#: sql_help.c:2522 sql_help.c:2623 sql_help.c:2624 sql_help.c:2647 -#: sql_help.c:2770 sql_help.c:2809 sql_help.c:2919 sql_help.c:2932 -#: sql_help.c:2946 sql_help.c:2987 sql_help.c:2995 sql_help.c:3017 -#: sql_help.c:3034 sql_help.c:3061 sql_help.c:3268 sql_help.c:3973 -#: sql_help.c:4714 sql_help.c:4715 sql_help.c:4716 sql_help.c:4717 +#: 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 "значення" @@ -4047,10 +4055,10 @@ msgstr "значення" msgid "target_role" msgstr "цільова_роль" -#: sql_help.c:203 sql_help.c:921 sql_help.c:2283 sql_help.c:2652 -#: sql_help.c:2725 sql_help.c:2730 sql_help.c:3903 sql_help.c:3912 -#: sql_help.c:3931 sql_help.c:3943 sql_help.c:4366 sql_help.c:4375 -#: sql_help.c:4394 sql_help.c:4406 +#: 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 "ім'я_схеми" @@ -4064,2226 +4072,2227 @@ msgstr "де скорочено_GRANT_або_REVOKE є одним з:" #: 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:576 sql_help.c:612 sql_help.c:680 sql_help.c:830 sql_help.c:977 -#: sql_help.c:1329 sql_help.c:1667 sql_help.c:2458 sql_help.c:2459 -#: sql_help.c:2460 sql_help.c:2461 sql_help.c:2462 sql_help.c:2596 -#: sql_help.c:2683 sql_help.c:2684 sql_help.c:2685 sql_help.c:3250 -#: sql_help.c:3251 sql_help.c:3252 sql_help.c:3253 sql_help.c:3254 -#: sql_help.c:3952 sql_help.c:3956 sql_help.c:4415 sql_help.c:4419 -#: sql_help.c:4735 +#: 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:241 sql_help.c:464 sql_help.c:920 sql_help.c:1345 sql_help.c:1347 -#: sql_help.c:1351 sql_help.c:1401 sql_help.c:1413 sql_help.c:1438 -#: sql_help.c:1697 sql_help.c:2252 sql_help.c:2256 sql_help.c:2368 -#: sql_help.c:2373 sql_help.c:2481 sql_help.c:2651 sql_help.c:2786 -#: sql_help.c:2791 sql_help.c:2793 sql_help.c:2914 sql_help.c:2927 -#: sql_help.c:2941 sql_help.c:2950 sql_help.c:2962 sql_help.c:2991 -#: sql_help.c:4004 sql_help.c:4019 sql_help.c:4021 sql_help.c:4117 -#: sql_help.c:4120 sql_help.c:4122 sql_help.c:4585 sql_help.c:4586 -#: sql_help.c:4595 sql_help.c:4642 sql_help.c:4643 sql_help.c:4644 -#: sql_help.c:4645 sql_help.c:4646 sql_help.c:4647 sql_help.c:4688 -#: sql_help.c:4689 sql_help.c:4694 sql_help.c:4699 sql_help.c:4843 -#: sql_help.c:4844 sql_help.c:4853 sql_help.c:4900 sql_help.c:4901 -#: sql_help.c:4902 sql_help.c:4903 sql_help.c:4904 sql_help.c:4905 -#: sql_help.c:4960 sql_help.c:4962 sql_help.c:5028 sql_help.c:5088 -#: sql_help.c:5089 sql_help.c:5098 sql_help.c:5145 sql_help.c:5146 -#: sql_help.c:5147 sql_help.c:5148 sql_help.c:5149 sql_help.c:5150 +#: 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:244 sql_help.c:2253 +#: sql_help.c:249 sql_help.c:2261 msgid "domain_constraint" msgstr "обмеження_домену" -#: sql_help.c:246 sql_help.c:248 sql_help.c:251 sql_help.c:479 sql_help.c:480 -#: sql_help.c:1322 sql_help.c:1371 sql_help.c:1372 sql_help.c:1373 -#: sql_help.c:1400 sql_help.c:1412 sql_help.c:1429 sql_help.c:1861 -#: sql_help.c:1863 sql_help.c:2255 sql_help.c:2367 sql_help.c:2372 -#: sql_help.c:2949 sql_help.c:2961 sql_help.c:4016 +#: 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:249 sql_help.c:1323 +#: sql_help.c:254 sql_help.c:1331 msgid "new_constraint_name" msgstr "ім'я_нового_обмеження" -#: sql_help.c:322 sql_help.c:1107 +#: 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:326 sql_help.c:328 +#: sql_help.c:334 sql_help.c:336 msgid "member_object" msgstr "елемент_об'єкт" -#: sql_help.c:329 +#: sql_help.c:337 msgid "where member_object is:" msgstr "де елемент_об'єкт є:" -#: sql_help.c:330 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:345 sql_help.c:349 sql_help.c:351 -#: sql_help.c:353 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:369 sql_help.c:372 -#: sql_help.c:373 sql_help.c:1853 sql_help.c:1858 sql_help.c:1865 -#: sql_help.c:1866 sql_help.c:1867 sql_help.c:1868 sql_help.c:1869 -#: sql_help.c:1870 sql_help.c:1871 sql_help.c:1876 sql_help.c:1878 -#: sql_help.c:1882 sql_help.c:1884 sql_help.c:1888 sql_help.c:1893 -#: sql_help.c:1894 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:1908 sql_help.c:1909 sql_help.c:1910 sql_help.c:1911 -#: sql_help.c:1916 sql_help.c:1917 sql_help.c:4488 sql_help.c:4493 -#: sql_help.c:4494 sql_help.c:4495 sql_help.c:4496 sql_help.c:4502 -#: sql_help.c:4503 sql_help.c:4508 sql_help.c:4509 sql_help.c:4514 -#: sql_help.c:4515 sql_help.c:4516 sql_help.c:4517 sql_help.c:4518 -#: sql_help.c:4519 +#: 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:331 sql_help.c:1854 sql_help.c:4491 +#: sql_help.c:339 sql_help.c:1862 sql_help.c:4499 msgid "aggregate_name" msgstr "ім'я_агр_функції" -#: sql_help.c:333 sql_help.c:1856 sql_help.c:2146 sql_help.c:2150 -#: sql_help.c:2152 sql_help.c:3377 +#: 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:334 sql_help.c:1857 sql_help.c:2147 sql_help.c:2151 -#: sql_help.c:2153 sql_help.c:3378 +#: 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:341 sql_help.c:794 sql_help.c:1872 sql_help.c:2148 -#: sql_help.c:2191 sql_help.c:2271 sql_help.c:2539 sql_help.c:2570 -#: sql_help.c:3137 sql_help.c:4390 sql_help.c:4497 sql_help.c:4614 -#: sql_help.c:4618 sql_help.c:4622 sql_help.c:4625 sql_help.c:4872 -#: sql_help.c:4876 sql_help.c:4880 sql_help.c:4883 sql_help.c:5117 -#: sql_help.c:5121 sql_help.c:5125 sql_help.c:5128 +#: 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:346 sql_help.c:787 sql_help.c:1879 sql_help.c:2563 +#: sql_help.c:354 sql_help.c:795 sql_help.c:1887 sql_help.c:2571 msgid "operator_name" msgstr "ім'я_оператора" -#: sql_help.c:347 sql_help.c:721 sql_help.c:725 sql_help.c:729 sql_help.c:1880 -#: sql_help.c:2540 sql_help.c:3501 +#: 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:348 sql_help.c:722 sql_help.c:726 sql_help.c:730 sql_help.c:1881 -#: sql_help.c:2541 sql_help.c:3502 +#: 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:350 sql_help.c:352 sql_help.c:750 sql_help.c:753 sql_help.c:756 -#: sql_help.c:785 sql_help.c:797 sql_help.c:805 sql_help.c:808 sql_help.c:811 -#: sql_help.c:1418 sql_help.c:1883 sql_help.c:1885 sql_help.c:2560 -#: sql_help.c:2581 sql_help.c:2967 sql_help.c:3511 sql_help.c:3520 +#: 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:354 sql_help.c:1889 sql_help.c:4504 +#: sql_help.c:362 sql_help.c:1897 sql_help.c:4512 msgid "procedure_name" msgstr "назва_процедури" -#: sql_help.c:358 sql_help.c:1895 sql_help.c:3927 sql_help.c:4510 +#: sql_help.c:366 sql_help.c:1903 sql_help.c:3935 sql_help.c:4518 msgid "routine_name" msgstr "ім'я_підпрограми" -#: sql_help.c:370 sql_help.c:1390 sql_help.c:1912 sql_help.c:2415 -#: sql_help.c:2621 sql_help.c:2922 sql_help.c:3104 sql_help.c:3682 -#: sql_help.c:3949 sql_help.c:4412 +#: 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:371 sql_help.c:1913 sql_help.c:2414 sql_help.c:2620 -#: sql_help.c:3105 sql_help.c:3335 sql_help.c:3683 sql_help.c:3934 -#: sql_help.c:4397 +#: 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:374 +#: sql_help.c:382 msgid "and aggregate_signature is:" msgstr "і сигнатура_агр_функції:" -#: sql_help.c:397 sql_help.c:2013 sql_help.c:2296 +#: sql_help.c:405 sql_help.c:2021 sql_help.c:2304 msgid "handler_function" msgstr "функція_обробник" -#: sql_help.c:398 sql_help.c:2297 +#: sql_help.c:406 sql_help.c:2305 msgid "validator_function" msgstr "функція_перевірки" -#: sql_help.c:446 sql_help.c:525 sql_help.c:669 sql_help.c:861 sql_help.c:1011 -#: sql_help.c:1317 sql_help.c:1594 +#: 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:448 sql_help.c:455 sql_help.c:459 sql_help.c:460 sql_help.c:463 -#: sql_help.c:465 sql_help.c:466 sql_help.c:467 sql_help.c:469 sql_help.c:472 -#: sql_help.c:474 sql_help.c:475 sql_help.c:673 sql_help.c:683 sql_help.c:685 -#: sql_help.c:688 sql_help.c:690 sql_help.c:691 sql_help.c:919 sql_help.c:1088 -#: sql_help.c:1319 sql_help.c:1337 sql_help.c:1341 sql_help.c:1342 -#: sql_help.c:1346 sql_help.c:1348 sql_help.c:1349 sql_help.c:1350 -#: sql_help.c:1352 sql_help.c:1353 sql_help.c:1355 sql_help.c:1358 -#: sql_help.c:1359 sql_help.c:1361 sql_help.c:1364 sql_help.c:1366 -#: sql_help.c:1367 sql_help.c:1414 sql_help.c:1416 sql_help.c:1423 -#: sql_help.c:1432 sql_help.c:1437 sql_help.c:1444 sql_help.c:1445 -#: sql_help.c:1696 sql_help.c:1699 sql_help.c:1703 sql_help.c:1739 -#: sql_help.c:1860 sql_help.c:1976 sql_help.c:1982 sql_help.c:1996 -#: sql_help.c:1997 sql_help.c:1998 sql_help.c:2346 sql_help.c:2359 -#: sql_help.c:2412 sql_help.c:2480 sql_help.c:2486 sql_help.c:2519 -#: sql_help.c:2650 sql_help.c:2755 sql_help.c:2790 sql_help.c:2792 -#: sql_help.c:2904 sql_help.c:2913 sql_help.c:2923 sql_help.c:2926 -#: sql_help.c:2936 sql_help.c:2940 sql_help.c:2963 sql_help.c:2965 -#: sql_help.c:2972 sql_help.c:2985 sql_help.c:2990 sql_help.c:2997 -#: sql_help.c:2998 sql_help.c:3014 sql_help.c:3140 sql_help.c:3280 -#: sql_help.c:3906 sql_help.c:3907 sql_help.c:4003 sql_help.c:4018 -#: sql_help.c:4020 sql_help.c:4022 sql_help.c:4116 sql_help.c:4119 -#: sql_help.c:4121 sql_help.c:4123 sql_help.c:4369 sql_help.c:4370 -#: sql_help.c:4490 sql_help.c:4651 sql_help.c:4658 sql_help.c:4660 -#: sql_help.c:4909 sql_help.c:4916 sql_help.c:4918 sql_help.c:4959 -#: sql_help.c:4961 sql_help.c:4963 sql_help.c:5016 sql_help.c:5154 -#: sql_help.c:5161 sql_help.c:5163 +#: 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:449 sql_help.c:674 sql_help.c:1320 sql_help.c:1704 +#: sql_help.c:457 sql_help.c:682 sql_help.c:1328 sql_help.c:1712 msgid "new_column_name" msgstr "нова_назва_стовпця" -#: sql_help.c:454 sql_help.c:546 sql_help.c:682 sql_help.c:882 sql_help.c:1032 -#: sql_help.c:1336 sql_help.c:1604 +#: 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:456 sql_help.c:461 sql_help.c:1080 sql_help.c:1338 -#: sql_help.c:1343 sql_help.c:1606 sql_help.c:1610 sql_help.c:2250 -#: sql_help.c:2347 sql_help.c:2559 sql_help.c:2748 sql_help.c:2905 -#: sql_help.c:3187 sql_help.c:4175 +#: 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:457 sql_help.c:462 sql_help.c:1339 sql_help.c:1344 -#: sql_help.c:1439 sql_help.c:1607 sql_help.c:1611 sql_help.c:2251 -#: sql_help.c:2350 sql_help.c:2482 sql_help.c:2907 sql_help.c:2915 -#: sql_help.c:2928 sql_help.c:2942 sql_help.c:2992 sql_help.c:3188 -#: sql_help.c:3194 sql_help.c:4013 +#: 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:458 sql_help.c:1340 sql_help.c:2351 sql_help.c:2360 -#: sql_help.c:2908 sql_help.c:2924 sql_help.c:2937 +#: 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:468 sql_help.c:610 sql_help.c:684 sql_help.c:1360 sql_help.c:5010 +#: 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:470 sql_help.c:473 sql_help.c:686 sql_help.c:689 sql_help.c:1362 -#: sql_help.c:1365 +#: 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:478 sql_help.c:1369 sql_help.c:2352 sql_help.c:2361 -#: sql_help.c:2909 sql_help.c:2925 sql_help.c:2938 +#: 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:481 sql_help.c:482 sql_help.c:483 sql_help.c:484 sql_help.c:1374 -#: sql_help.c:1375 sql_help.c:1376 sql_help.c:1377 sql_help.c:1914 +#: 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:485 sql_help.c:486 sql_help.c:1388 sql_help.c:1389 -#: sql_help.c:2353 sql_help.c:2358 sql_help.c:2912 sql_help.c:2935 +#: 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:545 sql_help.c:602 sql_help.c:671 sql_help.c:881 sql_help.c:1031 -#: sql_help.c:1563 sql_help.c:2282 +#: 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:547 sql_help.c:1033 sql_help.c:2416 +#: sql_help.c:555 sql_help.c:1041 sql_help.c:2424 msgid "execution_cost" msgstr "вартість_виконання" -#: sql_help.c:548 sql_help.c:1034 sql_help.c:2417 +#: sql_help.c:556 sql_help.c:1042 sql_help.c:2425 msgid "result_rows" msgstr "рядки_результату" -#: sql_help.c:549 sql_help.c:2418 +#: sql_help.c:557 sql_help.c:2426 msgid "support_function" msgstr "функція_підтримки" -#: sql_help.c:571 sql_help.c:573 sql_help.c:956 sql_help.c:964 sql_help.c:968 -#: sql_help.c:971 sql_help.c:974 sql_help.c:1646 sql_help.c:1654 -#: sql_help.c:1658 sql_help.c:1661 sql_help.c:1664 sql_help.c:2726 -#: sql_help.c:2728 sql_help.c:2731 sql_help.c:2732 sql_help.c:3904 -#: sql_help.c:3905 sql_help.c:3909 sql_help.c:3910 sql_help.c:3913 -#: sql_help.c:3914 sql_help.c:3916 sql_help.c:3917 sql_help.c:3919 -#: sql_help.c:3920 sql_help.c:3922 sql_help.c:3923 sql_help.c:3925 -#: sql_help.c:3926 sql_help.c:3932 sql_help.c:3933 sql_help.c:3935 -#: sql_help.c:3936 sql_help.c:3938 sql_help.c:3939 sql_help.c:3941 -#: sql_help.c:3942 sql_help.c:3944 sql_help.c:3945 sql_help.c:3947 -#: sql_help.c:3948 sql_help.c:3950 sql_help.c:3951 sql_help.c:3953 -#: sql_help.c:3954 sql_help.c:4367 sql_help.c:4368 sql_help.c:4372 -#: sql_help.c:4373 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:4395 -#: sql_help.c:4396 sql_help.c:4398 sql_help.c:4399 sql_help.c:4401 -#: sql_help.c:4402 sql_help.c:4404 sql_help.c:4405 sql_help.c:4407 -#: sql_help.c:4408 sql_help.c:4410 sql_help.c:4411 sql_help.c:4413 -#: sql_help.c:4414 sql_help.c:4416 sql_help.c:4417 +#: 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:572 sql_help.c:574 sql_help.c:1677 sql_help.c:2217 -#: sql_help.c:2734 sql_help.c:3265 sql_help.c:3716 sql_help.c:4745 +#: 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:575 sql_help.c:976 sql_help.c:1666 sql_help.c:2733 -#: sql_help.c:3955 sql_help.c:4418 +#: 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:577 +#: sql_help.c:585 msgid "group_name" msgstr "ім'я_групи" -#: sql_help.c:598 sql_help.c:1435 sql_help.c:2229 sql_help.c:2489 -#: sql_help.c:2523 sql_help.c:2920 sql_help.c:2933 sql_help.c:2947 -#: sql_help.c:2988 sql_help.c:3018 sql_help.c:3030 sql_help.c:3946 -#: sql_help.c:4409 +#: 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:600 sql_help.c:693 sql_help.c:1382 sql_help.c:1392 -#: sql_help.c:1430 sql_help.c:1792 +#: 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:604 sql_help.c:607 sql_help.c:696 sql_help.c:698 sql_help.c:1385 -#: sql_help.c:1387 sql_help.c:1433 sql_help.c:2487 sql_help.c:2521 -#: sql_help.c:2918 sql_help.c:2931 sql_help.c:2945 sql_help.c:2986 -#: sql_help.c:3016 +#: 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:609 +#: sql_help.c:617 msgid "column_number" msgstr "номер_стовпця" -#: sql_help.c:633 sql_help.c:1877 sql_help.c:4501 +#: sql_help.c:641 sql_help.c:1885 sql_help.c:4509 msgid "large_object_oid" msgstr "oid_великого_об'єкта" -#: sql_help.c:692 sql_help.c:1368 sql_help.c:2906 +#: sql_help.c:700 sql_help.c:1376 sql_help.c:2914 msgid "compression_method" msgstr "compression_method" -#: sql_help.c:694 sql_help.c:1383 +#: sql_help.c:702 sql_help.c:1391 msgid "new_access_method" msgstr "новий_метод_доступа" -#: sql_help.c:731 sql_help.c:2544 +#: sql_help.c:739 sql_help.c:2552 msgid "res_proc" msgstr "res_процедура" -#: sql_help.c:732 sql_help.c:2545 +#: sql_help.c:740 sql_help.c:2553 msgid "join_proc" msgstr "процедура_приєднання" -#: sql_help.c:733 sql_help.c:2542 +#: sql_help.c:741 sql_help.c:2550 msgid "com_op" msgstr "комут_оператор" -#: sql_help.c:734 sql_help.c:2543 +#: sql_help.c:742 sql_help.c:2551 msgid "neg_op" msgstr "зворотній_оператор" -#: sql_help.c:786 sql_help.c:798 sql_help.c:2562 +#: sql_help.c:794 sql_help.c:806 sql_help.c:2570 msgid "strategy_number" msgstr "номер_стратегії" -#: sql_help.c:788 sql_help.c:789 sql_help.c:792 sql_help.c:793 sql_help.c:799 -#: sql_help.c:800 sql_help.c:802 sql_help.c:803 sql_help.c:2564 sql_help.c:2565 -#: sql_help.c:2568 sql_help.c:2569 +#: 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:790 sql_help.c:2566 +#: sql_help.c:798 sql_help.c:2574 msgid "sort_family_name" msgstr "ім'я_родини_сортування" -#: sql_help.c:791 sql_help.c:801 sql_help.c:2567 +#: sql_help.c:799 sql_help.c:809 sql_help.c:2575 msgid "support_number" msgstr "номер_підтримки" -#: sql_help.c:795 sql_help.c:2149 sql_help.c:2571 sql_help.c:3107 -#: sql_help.c:3109 +#: 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:826 sql_help.c:829 sql_help.c:918 sql_help.c:1047 sql_help.c:1087 -#: sql_help.c:1559 sql_help.c:1562 sql_help.c:1738 sql_help.c:1791 -#: sql_help.c:1862 sql_help.c:1887 sql_help.c:1900 sql_help.c:1915 -#: sql_help.c:1975 sql_help.c:1981 sql_help.c:2345 sql_help.c:2357 -#: sql_help.c:2478 sql_help.c:2518 sql_help.c:2595 sql_help.c:2649 -#: sql_help.c:2702 sql_help.c:2754 sql_help.c:2787 sql_help.c:2794 -#: sql_help.c:2903 sql_help.c:2921 sql_help.c:2934 sql_help.c:3013 -#: sql_help.c:3133 sql_help.c:3314 sql_help.c:3537 sql_help.c:3586 -#: sql_help.c:3692 sql_help.c:3902 sql_help.c:3908 sql_help.c:3969 -#: sql_help.c:4001 sql_help.c:4365 sql_help.c:4371 sql_help.c:4489 -#: sql_help.c:4602 sql_help.c:4665 sql_help.c:4704 sql_help.c:4860 -#: sql_help.c:4923 sql_help.c:4957 sql_help.c:5015 sql_help.c:5105 -#: sql_help.c:5168 +#: 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:831 sql_help.c:2597 +#: sql_help.c:839 sql_help.c:2605 msgid "using_expression" msgstr "вираз_використання" -#: sql_help.c:832 sql_help.c:2598 +#: sql_help.c:840 sql_help.c:2606 msgid "check_expression" msgstr "вираз_перевірки" -#: sql_help.c:905 sql_help.c:907 sql_help.c:909 sql_help.c:2645 +#: sql_help.c:913 sql_help.c:915 sql_help.c:917 sql_help.c:2653 msgid "publication_object" msgstr "об'єкт_публікація" -#: sql_help.c:911 sql_help.c:2646 +#: sql_help.c:919 sql_help.c:2654 msgid "publication_parameter" msgstr "параметр_публікації" -#: sql_help.c:917 sql_help.c:2648 +#: sql_help.c:925 sql_help.c:2656 msgid "where publication_object is one of:" msgstr "де об'єкт_публікація є одним з:" -#: sql_help.c:960 sql_help.c:1650 sql_help.c:2456 sql_help.c:2681 -#: sql_help.c:3248 +#: 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:961 sql_help.c:1651 sql_help.c:2457 sql_help.c:2682 -#: sql_help.c:3249 +#: 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:965 sql_help.c:969 sql_help.c:972 sql_help.c:975 sql_help.c:1655 -#: sql_help.c:1659 sql_help.c:1662 sql_help.c:1665 sql_help.c:3915 -#: sql_help.c:4378 +#: 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:1081 sql_help.c:2749 +#: sql_help.c:1089 sql_help.c:2757 msgid "increment" msgstr "інкремент" -#: sql_help.c:1082 sql_help.c:2750 +#: sql_help.c:1090 sql_help.c:2758 msgid "minvalue" msgstr "мін_значення" -#: sql_help.c:1083 sql_help.c:2751 +#: sql_help.c:1091 sql_help.c:2759 msgid "maxvalue" msgstr "макс_значення" -#: sql_help.c:1084 sql_help.c:2752 sql_help.c:4598 sql_help.c:4702 -#: sql_help.c:4856 sql_help.c:5032 sql_help.c:5101 +#: 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:1085 sql_help.c:1357 +#: sql_help.c:1093 sql_help.c:1365 msgid "restart" msgstr "перезапуск" -#: sql_help.c:1086 sql_help.c:2753 +#: sql_help.c:1094 sql_help.c:2761 msgid "cache" msgstr "кеш" -#: sql_help.c:1131 +#: sql_help.c:1139 msgid "new_target" msgstr "нова_ціль" -#: sql_help.c:1150 sql_help.c:2806 +#: sql_help.c:1158 sql_help.c:2814 msgid "conninfo" msgstr "інформація_підключення" -#: sql_help.c:1152 sql_help.c:1156 sql_help.c:1160 sql_help.c:2807 +#: sql_help.c:1160 sql_help.c:1164 sql_help.c:1168 sql_help.c:2815 msgid "publication_name" msgstr "назва_публікації" -#: sql_help.c:1153 sql_help.c:1157 sql_help.c:1161 +#: sql_help.c:1161 sql_help.c:1165 sql_help.c:1169 msgid "publication_option" msgstr "publication_option" -#: sql_help.c:1164 +#: sql_help.c:1172 msgid "refresh_option" msgstr "опція_оновлення" -#: sql_help.c:1169 sql_help.c:2808 +#: sql_help.c:1177 sql_help.c:2816 msgid "subscription_parameter" msgstr "параметр_підписки" -#: sql_help.c:1172 +#: sql_help.c:1180 msgid "skip_option" msgstr "опція_пропуска" -#: sql_help.c:1332 sql_help.c:1335 +#: sql_help.c:1340 sql_help.c:1343 msgid "partition_name" msgstr "ім'я_розділу" -#: sql_help.c:1333 sql_help.c:2362 sql_help.c:2939 +#: sql_help.c:1341 sql_help.c:2370 sql_help.c:2947 msgid "partition_bound_spec" msgstr "специфікація_рамок_розділу" -#: sql_help.c:1354 sql_help.c:1404 sql_help.c:2953 +#: sql_help.c:1362 sql_help.c:1412 sql_help.c:2961 msgid "sequence_options" msgstr "опції_послідовності" -#: sql_help.c:1356 +#: sql_help.c:1364 msgid "sequence_option" msgstr "опція_послідовності" -#: sql_help.c:1370 +#: sql_help.c:1378 msgid "table_constraint_using_index" msgstr "індекс_обмеження_таблиці" -#: sql_help.c:1378 sql_help.c:1379 sql_help.c:1380 sql_help.c:1381 +#: sql_help.c:1386 sql_help.c:1387 sql_help.c:1388 sql_help.c:1389 msgid "rewrite_rule_name" msgstr "ім'я_правила_перезапису" -#: sql_help.c:1393 sql_help.c:2374 sql_help.c:2978 +#: sql_help.c:1401 sql_help.c:2382 sql_help.c:2986 msgid "and partition_bound_spec is:" msgstr "і специфікація_рамок_розділу:" -#: sql_help.c:1394 sql_help.c:1395 sql_help.c:1396 sql_help.c:2375 -#: sql_help.c:2376 sql_help.c:2377 sql_help.c:2979 sql_help.c:2980 -#: sql_help.c:2981 +#: 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:1397 sql_help.c:1398 sql_help.c:2378 sql_help.c:2379 -#: sql_help.c:2982 sql_help.c:2983 +#: 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:1399 +#: sql_help.c:1407 msgid "and column_constraint is:" msgstr "і обмеження_стовпця:" -#: sql_help.c:1402 sql_help.c:2369 sql_help.c:2410 sql_help.c:2619 -#: sql_help.c:2951 +#: 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:1403 sql_help.c:2370 sql_help.c:2952 +#: sql_help.c:1411 sql_help.c:2378 sql_help.c:2960 msgid "generation_expr" msgstr "код_генерації" -#: sql_help.c:1405 sql_help.c:1406 sql_help.c:1415 sql_help.c:1417 -#: sql_help.c:1421 sql_help.c:2954 sql_help.c:2955 sql_help.c:2964 -#: sql_help.c:2966 sql_help.c:2970 +#: 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:1407 sql_help.c:1424 sql_help.c:2956 sql_help.c:2973 +#: sql_help.c:1415 sql_help.c:1432 sql_help.c:2964 sql_help.c:2981 msgid "reftable" msgstr "залежна_таблиця" -#: sql_help.c:1408 sql_help.c:1425 sql_help.c:2957 sql_help.c:2974 +#: sql_help.c:1416 sql_help.c:1433 sql_help.c:2965 sql_help.c:2982 msgid "refcolumn" msgstr "залежний_стовпець" -#: sql_help.c:1409 sql_help.c:1410 sql_help.c:1426 sql_help.c:1427 -#: sql_help.c:2958 sql_help.c:2959 sql_help.c:2975 sql_help.c:2976 +#: 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:1411 sql_help.c:2371 sql_help.c:2960 +#: sql_help.c:1419 sql_help.c:2379 sql_help.c:2968 msgid "and table_constraint is:" msgstr "і обмеження_таблиці:" -#: sql_help.c:1419 sql_help.c:2968 +#: sql_help.c:1427 sql_help.c:2976 msgid "exclude_element" msgstr "об'єкт_виключення" -#: sql_help.c:1420 sql_help.c:2969 sql_help.c:4596 sql_help.c:4700 -#: sql_help.c:4854 sql_help.c:5030 sql_help.c:5099 +#: 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:1422 sql_help.c:2490 sql_help.c:2971 +#: sql_help.c:1430 sql_help.c:2498 sql_help.c:2979 msgid "predicate" msgstr "предикат" -#: sql_help.c:1428 +#: sql_help.c:1436 msgid "and table_constraint_using_index is:" msgstr "і індекс_обмеження_таблиці:" -#: sql_help.c:1431 sql_help.c:2984 +#: 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:1436 sql_help.c:2989 +#: sql_help.c:1444 sql_help.c:2997 msgid "exclude_element in an EXCLUDE constraint is:" msgstr "елемент_виключення в обмеженні EXCLUDE:" -#: sql_help.c:1440 sql_help.c:2483 sql_help.c:2916 sql_help.c:2929 -#: sql_help.c:2943 sql_help.c:2993 sql_help.c:4014 +#: 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:1441 sql_help.c:2484 sql_help.c:2994 +#: sql_help.c:1449 sql_help.c:2492 sql_help.c:3002 msgid "opclass_parameter" msgstr "opclass_parameter" -#: sql_help.c:1443 sql_help.c:2996 +#: 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:1461 sql_help.c:1464 sql_help.c:3033 +#: sql_help.c:1469 sql_help.c:1472 sql_help.c:3041 msgid "tablespace_option" msgstr "опція_табличного_простору" -#: sql_help.c:1485 sql_help.c:1488 sql_help.c:1494 sql_help.c:1498 +#: sql_help.c:1493 sql_help.c:1496 sql_help.c:1502 sql_help.c:1506 msgid "token_type" msgstr "тип_токену" -#: sql_help.c:1486 sql_help.c:1489 +#: sql_help.c:1494 sql_help.c:1497 msgid "dictionary_name" msgstr "ім'я_словника" -#: sql_help.c:1491 sql_help.c:1495 +#: sql_help.c:1499 sql_help.c:1503 msgid "old_dictionary" msgstr "старий_словник" -#: sql_help.c:1492 sql_help.c:1496 +#: sql_help.c:1500 sql_help.c:1504 msgid "new_dictionary" msgstr "новий_словник" -#: sql_help.c:1591 sql_help.c:1605 sql_help.c:1608 sql_help.c:1609 -#: sql_help.c:3186 +#: 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:1592 +#: sql_help.c:1600 msgid "new_attribute_name" msgstr "нове_ім'я_атрибута" -#: sql_help.c:1596 sql_help.c:1600 +#: sql_help.c:1604 sql_help.c:1608 msgid "new_enum_value" msgstr "нове_значення_перерахування" -#: sql_help.c:1597 +#: sql_help.c:1605 msgid "neighbor_enum_value" msgstr "сусіднє_значення_перерахування" -#: sql_help.c:1599 +#: sql_help.c:1607 msgid "existing_enum_value" msgstr "існуюче_значення_перерахування" -#: sql_help.c:1602 +#: sql_help.c:1610 msgid "property" msgstr "властивість" -#: sql_help.c:1678 sql_help.c:2354 sql_help.c:2363 sql_help.c:2765 -#: sql_help.c:3266 sql_help.c:3717 sql_help.c:3924 sql_help.c:3970 -#: sql_help.c:4387 +#: 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:1710 sql_help.c:1713 sql_help.c:3281 +#: sql_help.c:1718 sql_help.c:1721 sql_help.c:3289 msgid "view_option_name" msgstr "ім'я_параметра_представлення" -#: sql_help.c:1711 sql_help.c:3282 +#: sql_help.c:1719 sql_help.c:3290 msgid "view_option_value" msgstr "значення_параметра_представлення" -#: sql_help.c:1732 sql_help.c:4999 +#: sql_help.c:1740 sql_help.c:5007 msgid "table_and_columns" msgstr "таблиця_і_стовпці" -#: sql_help.c:1733 sql_help.c:1793 sql_help.c:1987 sql_help.c:3766 -#: sql_help.c:4222 sql_help.c:5000 +#: 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:1734 sql_help.c:1735 sql_help.c:1794 sql_help.c:1989 -#: sql_help.c:1993 sql_help.c:2175 sql_help.c:3767 sql_help.c:3768 -#: sql_help.c:3769 sql_help.c:3770 sql_help.c:3771 sql_help.c:3772 -#: sql_help.c:3773 sql_help.c:3774 sql_help.c:3775 sql_help.c:3776 -#: sql_help.c:4223 sql_help.c:4225 sql_help.c:5001 sql_help.c:5002 -#: sql_help.c:5003 sql_help.c:5004 sql_help.c:5005 sql_help.c:5006 -#: sql_help.c:5007 sql_help.c:5008 sql_help.c:5009 sql_help.c:5011 -#: sql_help.c:5012 +#: 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:1736 sql_help.c:5013 +#: sql_help.c:1744 sql_help.c:5021 msgid "size" msgstr "розмір" -#: sql_help.c:1737 sql_help.c:5014 +#: sql_help.c:1745 sql_help.c:5022 msgid "and table_and_columns is:" msgstr "і таблиця_і_стовпці:" -#: sql_help.c:1753 sql_help.c:4761 sql_help.c:4763 sql_help.c:4787 +#: sql_help.c:1761 sql_help.c:4769 sql_help.c:4771 sql_help.c:4795 msgid "transaction_mode" msgstr "режим_транзакції" -#: sql_help.c:1754 sql_help.c:4764 sql_help.c:4788 +#: sql_help.c:1762 sql_help.c:4772 sql_help.c:4796 msgid "where transaction_mode is one of:" msgstr "де режим_транзакції один з:" -#: sql_help.c:1763 sql_help.c:4606 sql_help.c:4615 sql_help.c:4619 -#: sql_help.c:4623 sql_help.c:4626 sql_help.c:4864 sql_help.c:4873 -#: sql_help.c:4877 sql_help.c:4881 sql_help.c:4884 sql_help.c:5109 -#: sql_help.c:5118 sql_help.c:5122 sql_help.c:5126 sql_help.c:5129 +#: 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:1859 +#: sql_help.c:1867 msgid "relation_name" msgstr "назва_відношення" -#: sql_help.c:1864 sql_help.c:3918 sql_help.c:4381 +#: sql_help.c:1872 sql_help.c:3926 sql_help.c:4389 msgid "domain_name" msgstr "назва_домену" -#: sql_help.c:1886 +#: sql_help.c:1894 msgid "policy_name" msgstr "назва_політики" -#: sql_help.c:1899 +#: sql_help.c:1907 msgid "rule_name" msgstr "назва_правила" -#: sql_help.c:1918 sql_help.c:4520 +#: sql_help.c:1926 sql_help.c:4528 msgid "string_literal" msgstr "рядковий_літерал" -#: sql_help.c:1943 sql_help.c:4184 sql_help.c:4434 +#: sql_help.c:1951 sql_help.c:4192 sql_help.c:4442 msgid "transaction_id" msgstr "ідентифікатор_транзакції" -#: sql_help.c:1977 sql_help.c:1984 sql_help.c:4040 +#: sql_help.c:1985 sql_help.c:1992 sql_help.c:4048 msgid "filename" msgstr "ім'я файлу" -#: sql_help.c:1978 sql_help.c:1985 sql_help.c:2704 sql_help.c:2705 -#: sql_help.c:2706 +#: 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:1980 sql_help.c:2703 sql_help.c:3136 sql_help.c:3317 -#: sql_help.c:4024 sql_help.c:4107 sql_help.c:4110 sql_help.c:4113 -#: sql_help.c:4589 sql_help.c:4591 sql_help.c:4693 sql_help.c:4695 -#: sql_help.c:4847 sql_help.c:4849 sql_help.c:4966 sql_help.c:5092 -#: sql_help.c:5094 +#: 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:1983 sql_help.c:2524 sql_help.c:3019 sql_help.c:3283 -#: sql_help.c:3301 sql_help.c:4005 +#: 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:1988 +#: sql_help.c:1996 msgid "format_name" msgstr "назва_формату" -#: sql_help.c:1990 +#: sql_help.c:1998 msgid "delimiter_character" msgstr "символ_роздільник" -#: sql_help.c:1991 +#: sql_help.c:1999 msgid "null_string" msgstr "представлення_NULL" -#: sql_help.c:1992 +#: sql_help.c:2000 msgid "default_string" msgstr "рядок_за_замовчуванням" -#: sql_help.c:1994 +#: sql_help.c:2002 msgid "quote_character" msgstr "символ_лапок" -#: sql_help.c:1995 +#: sql_help.c:2003 msgid "escape_character" msgstr "символ_екранування" -#: sql_help.c:1999 +#: sql_help.c:2007 msgid "error_action" msgstr "error_action" -#: sql_help.c:2000 +#: sql_help.c:2008 msgid "encoding_name" msgstr "ім'я_кодування" -#: sql_help.c:2001 +#: sql_help.c:2009 msgid "verbosity" msgstr "детальність" -#: sql_help.c:2012 +#: sql_help.c:2020 msgid "access_method_type" msgstr "тип_метода_доступа" -#: sql_help.c:2083 sql_help.c:2102 sql_help.c:2105 +#: sql_help.c:2091 sql_help.c:2110 sql_help.c:2113 msgid "arg_data_type" msgstr "тип_даних_аргумента" -#: sql_help.c:2084 sql_help.c:2106 sql_help.c:2114 +#: sql_help.c:2092 sql_help.c:2114 sql_help.c:2122 msgid "sfunc" msgstr "функція_стану" -#: sql_help.c:2085 sql_help.c:2107 sql_help.c:2115 +#: sql_help.c:2093 sql_help.c:2115 sql_help.c:2123 msgid "state_data_type" msgstr "тип_даних_стану" -#: sql_help.c:2086 sql_help.c:2108 sql_help.c:2116 +#: sql_help.c:2094 sql_help.c:2116 sql_help.c:2124 msgid "state_data_size" msgstr "розмір_даних_стану" -#: sql_help.c:2087 sql_help.c:2109 sql_help.c:2117 +#: sql_help.c:2095 sql_help.c:2117 sql_help.c:2125 msgid "ffunc" msgstr "функція_завершення" -#: sql_help.c:2088 sql_help.c:2118 +#: sql_help.c:2096 sql_help.c:2126 msgid "combinefunc" msgstr "комбінуюча_функція" -#: sql_help.c:2089 sql_help.c:2119 +#: sql_help.c:2097 sql_help.c:2127 msgid "serialfunc" msgstr "функція_серіалізації" -#: sql_help.c:2090 sql_help.c:2120 +#: sql_help.c:2098 sql_help.c:2128 msgid "deserialfunc" msgstr "функція_десеріалізації" -#: sql_help.c:2091 sql_help.c:2110 sql_help.c:2121 +#: sql_help.c:2099 sql_help.c:2118 sql_help.c:2129 msgid "initial_condition" msgstr "початкова_умова" -#: sql_help.c:2092 sql_help.c:2122 +#: sql_help.c:2100 sql_help.c:2130 msgid "msfunc" msgstr "функція_стану_рух" -#: sql_help.c:2093 sql_help.c:2123 +#: sql_help.c:2101 sql_help.c:2131 msgid "minvfunc" msgstr "зворотна_функція_рух" -#: sql_help.c:2094 sql_help.c:2124 +#: sql_help.c:2102 sql_help.c:2132 msgid "mstate_data_type" msgstr "тип_даних_стану_рух" -#: sql_help.c:2095 sql_help.c:2125 +#: sql_help.c:2103 sql_help.c:2133 msgid "mstate_data_size" msgstr "розмір_даних_стану_рух" -#: sql_help.c:2096 sql_help.c:2126 +#: sql_help.c:2104 sql_help.c:2134 msgid "mffunc" msgstr "функція_завершення_рух" -#: sql_help.c:2097 sql_help.c:2127 +#: sql_help.c:2105 sql_help.c:2135 msgid "minitial_condition" msgstr "початкова_умова_рух" -#: sql_help.c:2098 sql_help.c:2128 +#: sql_help.c:2106 sql_help.c:2136 msgid "sort_operator" msgstr "оператор_сортування" -#: sql_help.c:2111 +#: sql_help.c:2119 msgid "or the old syntax" msgstr "або старий синтаксис" -#: sql_help.c:2113 +#: sql_help.c:2121 msgid "base_type" msgstr "базовий_тип" -#: sql_help.c:2171 sql_help.c:2221 +#: sql_help.c:2179 sql_help.c:2229 msgid "locale" msgstr "локаль" -#: sql_help.c:2172 sql_help.c:2222 +#: sql_help.c:2180 sql_help.c:2230 msgid "lc_collate" msgstr "код_правила_сортування" -#: sql_help.c:2173 sql_help.c:2223 +#: sql_help.c:2181 sql_help.c:2231 msgid "lc_ctype" msgstr "код_класифікації_символів" -#: sql_help.c:2174 sql_help.c:4487 +#: sql_help.c:2182 sql_help.c:4495 msgid "provider" msgstr "постачальник" -#: sql_help.c:2176 +#: sql_help.c:2184 msgid "rules" msgstr "правила" -#: sql_help.c:2177 sql_help.c:2284 +#: sql_help.c:2185 sql_help.c:2292 msgid "version" msgstr "версія" -#: sql_help.c:2179 +#: sql_help.c:2187 msgid "existing_collation" msgstr "існуюче_правило_сортування" -#: sql_help.c:2189 +#: sql_help.c:2197 msgid "source_encoding" msgstr "початкове_кодування" -#: sql_help.c:2190 +#: sql_help.c:2198 msgid "dest_encoding" msgstr "цільве_кодування" -#: sql_help.c:2218 sql_help.c:3059 +#: sql_help.c:2226 sql_help.c:3067 msgid "template" msgstr "шаблон" -#: sql_help.c:2219 +#: sql_help.c:2227 msgid "encoding" msgstr "кодування" -#: sql_help.c:2220 +#: sql_help.c:2228 msgid "strategy" msgstr "стратегія" -#: sql_help.c:2224 +#: sql_help.c:2232 msgid "builtin_locale" msgstr "вбудована_локаль" -#: sql_help.c:2225 +#: sql_help.c:2233 msgid "icu_locale" msgstr "icu_locale" -#: sql_help.c:2226 +#: sql_help.c:2234 msgid "icu_rules" msgstr "правила_icu" -#: sql_help.c:2227 +#: sql_help.c:2235 msgid "locale_provider" msgstr "локаль_провайдер" -#: sql_help.c:2228 +#: sql_help.c:2236 msgid "collation_version" msgstr "версія_сортування" -#: sql_help.c:2233 +#: sql_help.c:2241 msgid "oid" msgstr "oid" -#: sql_help.c:2254 -msgid "where domain_constraint is:" -msgstr "де обмеження_домену:" - -#: sql_help.c:2268 sql_help.c:2701 sql_help.c:3132 +#: sql_help.c:2276 sql_help.c:2709 sql_help.c:3140 msgid "event" msgstr "подія" -#: sql_help.c:2269 +#: sql_help.c:2277 msgid "filter_variable" msgstr "змінна_фільтру" -#: sql_help.c:2270 +#: sql_help.c:2278 msgid "filter_value" msgstr "значення_фільтру" -#: sql_help.c:2366 sql_help.c:2948 +#: sql_help.c:2374 sql_help.c:2956 msgid "where column_constraint is:" msgstr "де обмеження_стовпців:" -#: sql_help.c:2411 +#: sql_help.c:2419 msgid "rettype" msgstr "тип_результату" -#: sql_help.c:2413 +#: sql_help.c:2421 msgid "column_type" msgstr "тип_стовпця" -#: sql_help.c:2422 sql_help.c:2625 +#: sql_help.c:2430 sql_help.c:2633 msgid "definition" msgstr "визначення" -#: sql_help.c:2423 sql_help.c:2626 +#: sql_help.c:2431 sql_help.c:2634 msgid "obj_file" msgstr "об'єктний_файл" -#: sql_help.c:2424 sql_help.c:2627 +#: sql_help.c:2432 sql_help.c:2635 msgid "link_symbol" msgstr "символ_експорту" -#: sql_help.c:2425 sql_help.c:2628 +#: sql_help.c:2433 sql_help.c:2636 msgid "sql_body" msgstr "sql_body" -#: sql_help.c:2463 sql_help.c:2686 sql_help.c:3255 +#: sql_help.c:2471 sql_help.c:2694 sql_help.c:3263 msgid "uid" msgstr "uid" -#: sql_help.c:2479 sql_help.c:2520 sql_help.c:2917 sql_help.c:2930 -#: sql_help.c:2944 sql_help.c:3015 +#: 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:2501 +#: sql_help.c:2509 msgid "call_handler" msgstr "обробник_виклику" -#: sql_help.c:2502 +#: sql_help.c:2510 msgid "inline_handler" msgstr "обробник_впровадженого_коду" -#: sql_help.c:2503 +#: sql_help.c:2511 msgid "valfunction" msgstr "функція_перевірки" -#: sql_help.c:2561 +#: sql_help.c:2569 msgid "family_name" msgstr "назва_сімейства" -#: sql_help.c:2572 +#: sql_help.c:2580 msgid "storage_type" msgstr "тип_зберігання" -#: sql_help.c:2707 sql_help.c:3139 +#: sql_help.c:2715 sql_help.c:3147 msgid "where event can be one of:" msgstr "де подія може бути однією з:" -#: sql_help.c:2727 sql_help.c:2729 +#: sql_help.c:2735 sql_help.c:2737 msgid "schema_element" msgstr "елемент_схеми" -#: sql_help.c:2766 +#: sql_help.c:2774 msgid "server_type" msgstr "тип_серверу" -#: sql_help.c:2767 +#: sql_help.c:2775 msgid "server_version" msgstr "версія_серверу" -#: sql_help.c:2768 sql_help.c:3921 sql_help.c:4384 +#: sql_help.c:2776 sql_help.c:3929 sql_help.c:4392 msgid "fdw_name" msgstr "назва_fdw" -#: sql_help.c:2785 sql_help.c:2788 +#: sql_help.c:2793 sql_help.c:2796 msgid "statistics_name" msgstr "назва_статистики" -#: sql_help.c:2789 +#: sql_help.c:2797 msgid "statistics_kind" msgstr "вид_статистики" -#: sql_help.c:2805 +#: sql_help.c:2813 msgid "subscription_name" msgstr "назва_підписки" -#: sql_help.c:2910 +#: sql_help.c:2918 msgid "source_table" msgstr "вихідна_таблиця" -#: sql_help.c:2911 +#: sql_help.c:2919 msgid "like_option" msgstr "параметр_породження" -#: sql_help.c:2977 +#: sql_help.c:2985 msgid "and like_option is:" msgstr "і параметр_породження:" -#: sql_help.c:3032 +#: sql_help.c:3040 msgid "directory" msgstr "каталог" -#: sql_help.c:3046 +#: sql_help.c:3054 msgid "parser_name" msgstr "назва_парсера" -#: sql_help.c:3047 +#: sql_help.c:3055 msgid "source_config" msgstr "початкова_конфігурація" -#: sql_help.c:3076 +#: sql_help.c:3084 msgid "start_function" msgstr "функція_початку" -#: sql_help.c:3077 +#: sql_help.c:3085 msgid "gettoken_function" msgstr "функція_видачі_токену" -#: sql_help.c:3078 +#: sql_help.c:3086 msgid "end_function" msgstr "функція_завершення" -#: sql_help.c:3079 +#: sql_help.c:3087 msgid "lextypes_function" msgstr "функція_лекс_типів" -#: sql_help.c:3080 +#: sql_help.c:3088 msgid "headline_function" msgstr "функція_створення_заголовків" -#: sql_help.c:3092 +#: sql_help.c:3100 msgid "init_function" msgstr "функція_ініціалізації" -#: sql_help.c:3093 +#: sql_help.c:3101 msgid "lexize_function" msgstr "функція_виділення_лексем" -#: sql_help.c:3106 +#: sql_help.c:3114 msgid "from_sql_function_name" msgstr "ім'я_функції_з_sql" -#: sql_help.c:3108 +#: sql_help.c:3116 msgid "to_sql_function_name" msgstr "ім'я_функції_в_sql" -#: sql_help.c:3134 +#: sql_help.c:3142 msgid "referenced_table_name" msgstr "ім'я_залежної_таблиці" -#: sql_help.c:3135 +#: sql_help.c:3143 msgid "transition_relation_name" msgstr "ім'я_перехідного_відношення" -#: sql_help.c:3138 +#: sql_help.c:3146 msgid "arguments" msgstr "аргументи" -#: sql_help.c:3190 +#: sql_help.c:3198 msgid "label" msgstr "мітка" -#: sql_help.c:3192 +#: sql_help.c:3200 msgid "subtype" msgstr "підтип" -#: sql_help.c:3193 +#: sql_help.c:3201 msgid "subtype_operator_class" msgstr "клас_оператора_підтипу" -#: sql_help.c:3195 +#: sql_help.c:3203 msgid "canonical_function" msgstr "канонічна_функція" -#: sql_help.c:3196 +#: sql_help.c:3204 msgid "subtype_diff_function" msgstr "функція_розбіжностей_підтипу" -#: sql_help.c:3197 +#: sql_help.c:3205 msgid "multirange_type_name" msgstr "multirange_type_name" -#: sql_help.c:3199 +#: sql_help.c:3207 msgid "input_function" msgstr "функція_вводу" -#: sql_help.c:3200 +#: sql_help.c:3208 msgid "output_function" msgstr "функція_виводу" -#: sql_help.c:3201 +#: sql_help.c:3209 msgid "receive_function" msgstr "функція_отримання" -#: sql_help.c:3202 +#: sql_help.c:3210 msgid "send_function" msgstr "функція_відправки" -#: sql_help.c:3203 +#: sql_help.c:3211 msgid "type_modifier_input_function" msgstr "функція_введення_модифікатора_типу" -#: sql_help.c:3204 +#: sql_help.c:3212 msgid "type_modifier_output_function" msgstr "функція_виводу_модифікатора_типу" -#: sql_help.c:3205 +#: sql_help.c:3213 msgid "analyze_function" msgstr "функція_аналізу" -#: sql_help.c:3206 +#: sql_help.c:3214 msgid "subscript_function" msgstr "subscript_function" -#: sql_help.c:3207 +#: sql_help.c:3215 msgid "internallength" msgstr "внутр_довжина" -#: sql_help.c:3208 +#: sql_help.c:3216 msgid "alignment" msgstr "вирівнювання" -#: sql_help.c:3209 +#: sql_help.c:3217 msgid "storage" msgstr "зберігання" -#: sql_help.c:3210 +#: sql_help.c:3218 msgid "like_type" msgstr "тип_зразок" -#: sql_help.c:3211 +#: sql_help.c:3219 msgid "category" msgstr "категорія" -#: sql_help.c:3212 +#: sql_help.c:3220 msgid "preferred" msgstr "привілейований" -#: sql_help.c:3213 +#: sql_help.c:3221 msgid "default" msgstr "за_замовчуванням" -#: sql_help.c:3214 +#: sql_help.c:3222 msgid "element" msgstr "елемент" -#: sql_help.c:3215 +#: sql_help.c:3223 msgid "delimiter" msgstr "роздільник" -#: sql_help.c:3216 +#: sql_help.c:3224 msgid "collatable" msgstr "сортувальний" -#: sql_help.c:3313 sql_help.c:4000 sql_help.c:4094 sql_help.c:4584 -#: sql_help.c:4687 sql_help.c:4842 sql_help.c:4956 sql_help.c:5087 +#: 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:3315 sql_help.c:4002 sql_help.c:4603 sql_help.c:4609 -#: sql_help.c:4612 sql_help.c:4616 sql_help.c:4620 sql_help.c:4628 -#: sql_help.c:4861 sql_help.c:4867 sql_help.c:4870 sql_help.c:4874 -#: sql_help.c:4878 sql_help.c:4886 sql_help.c:4958 sql_help.c:5106 -#: sql_help.c:5112 sql_help.c:5115 sql_help.c:5119 sql_help.c:5123 -#: sql_help.c:5131 +#: 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:3316 sql_help.c:4588 sql_help.c:4630 sql_help.c:4632 -#: sql_help.c:4636 sql_help.c:4638 sql_help.c:4639 sql_help.c:4640 -#: sql_help.c:4692 sql_help.c:4846 sql_help.c:4888 sql_help.c:4890 -#: sql_help.c:4894 sql_help.c:4896 sql_help.c:4897 sql_help.c:4898 -#: sql_help.c:4965 sql_help.c:5091 sql_help.c:5133 sql_help.c:5135 -#: sql_help.c:5139 sql_help.c:5141 sql_help.c:5142 sql_help.c:5143 +#: 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:3318 sql_help.c:3802 sql_help.c:4151 sql_help.c:4967 +#: sql_help.c:3326 sql_help.c:3810 sql_help.c:4159 sql_help.c:4975 msgid "cursor_name" msgstr "ім'я_курсору" -#: sql_help.c:3319 sql_help.c:4008 sql_help.c:4100 sql_help.c:4968 +#: sql_help.c:3327 sql_help.c:4016 sql_help.c:4108 sql_help.c:4976 msgid "output_expression" msgstr "вираз_результату" -#: sql_help.c:3320 sql_help.c:4009 sql_help.c:4101 sql_help.c:4587 -#: sql_help.c:4690 sql_help.c:4845 sql_help.c:4969 sql_help.c:5090 +#: 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:3336 +#: sql_help.c:3344 msgid "code" msgstr "код" -#: sql_help.c:3741 +#: sql_help.c:3749 msgid "parameter" msgstr "параметр" -#: sql_help.c:3765 sql_help.c:4176 +#: sql_help.c:3773 sql_help.c:4184 msgid "statement" msgstr "оператор" -#: sql_help.c:3801 sql_help.c:4150 +#: sql_help.c:3809 sql_help.c:4158 msgid "direction" msgstr "напрямок" -#: sql_help.c:3803 sql_help.c:4152 +#: sql_help.c:3811 sql_help.c:4160 msgid "where direction can be one of:" msgstr "де напрямок може бути одним із:" -#: sql_help.c:3804 sql_help.c:3805 sql_help.c:3806 sql_help.c:3807 -#: sql_help.c:3808 sql_help.c:4153 sql_help.c:4154 sql_help.c:4155 -#: sql_help.c:4156 sql_help.c:4157 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:5031 sql_help.c:5033 sql_help.c:5100 sql_help.c:5102 +#: 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:3911 sql_help.c:4374 +#: sql_help.c:3919 sql_help.c:4382 msgid "sequence_name" msgstr "ім'я_послідовності" -#: sql_help.c:3929 sql_help.c:4392 +#: sql_help.c:3937 sql_help.c:4400 msgid "arg_name" msgstr "ім'я_аргументу" -#: sql_help.c:3930 sql_help.c:4393 +#: sql_help.c:3938 sql_help.c:4401 msgid "arg_type" msgstr "тип_аргументу" -#: sql_help.c:3937 sql_help.c:4400 +#: sql_help.c:3945 sql_help.c:4408 msgid "loid" msgstr "код_вел_об'єкту" -#: sql_help.c:3968 +#: sql_help.c:3976 msgid "remote_schema" msgstr "віддалена_схема" -#: sql_help.c:3971 +#: sql_help.c:3979 msgid "local_schema" msgstr "локальна_схема" -#: sql_help.c:4006 +#: sql_help.c:4014 msgid "conflict_target" msgstr "ціль_конфлікту" -#: sql_help.c:4007 +#: sql_help.c:4015 msgid "conflict_action" msgstr "дія_при_конфлікті" -#: sql_help.c:4010 +#: sql_help.c:4018 msgid "where conflict_target can be one of:" msgstr "де ціль_конфлікту може бути одним з:" -#: sql_help.c:4011 +#: sql_help.c:4019 msgid "index_column_name" msgstr "ім'я_стовпця_індексу" -#: sql_help.c:4012 +#: sql_help.c:4020 msgid "index_expression" msgstr "вираз_індексу" -#: sql_help.c:4015 +#: sql_help.c:4023 msgid "index_predicate" msgstr "предикат_індексу" -#: sql_help.c:4017 +#: sql_help.c:4025 msgid "and conflict_action is one of:" msgstr "і дія_при_конфлікті одна з:" -#: sql_help.c:4023 sql_help.c:4124 sql_help.c:4964 +#: sql_help.c:4031 sql_help.c:4132 sql_help.c:4972 msgid "sub-SELECT" msgstr "вкладений-SELECT" -#: sql_help.c:4032 sql_help.c:4165 sql_help.c:4940 +#: sql_help.c:4040 sql_help.c:4173 sql_help.c:4948 msgid "channel" msgstr "канал" -#: sql_help.c:4054 +#: sql_help.c:4062 msgid "lockmode" msgstr "режим_блокування" -#: sql_help.c:4055 +#: sql_help.c:4063 msgid "where lockmode is one of:" msgstr "де режим_блокування один з:" -#: sql_help.c:4095 +#: sql_help.c:4103 msgid "target_table_name" msgstr "ім'я_цілі_таблиці" -#: sql_help.c:4096 +#: sql_help.c:4104 msgid "target_alias" msgstr "псевдонім_цілі" -#: sql_help.c:4097 +#: sql_help.c:4105 msgid "data_source" msgstr "джерело_даних" -#: sql_help.c:4098 sql_help.c:4633 sql_help.c:4891 sql_help.c:5136 +#: sql_help.c:4106 sql_help.c:4641 sql_help.c:4899 sql_help.c:5144 msgid "join_condition" msgstr "умова_поєднання" -#: sql_help.c:4099 +#: sql_help.c:4107 msgid "when_clause" msgstr "when_твердження" -#: sql_help.c:4102 +#: sql_help.c:4110 msgid "where data_source is:" msgstr "де джерело_даних:" -#: sql_help.c:4103 +#: sql_help.c:4111 msgid "source_table_name" msgstr "ім'я_початкова_таблиці" -#: sql_help.c:4104 +#: sql_help.c:4112 msgid "source_query" msgstr "джерело_запит" -#: sql_help.c:4105 +#: sql_help.c:4113 msgid "source_alias" msgstr "джерело_псевдоніма" -#: sql_help.c:4106 +#: sql_help.c:4114 msgid "and when_clause is:" msgstr "і when_clause:" -#: sql_help.c:4108 sql_help.c:4111 +#: sql_help.c:4116 sql_help.c:4119 msgid "merge_update" msgstr "merge_update" -#: sql_help.c:4109 sql_help.c:4112 +#: sql_help.c:4117 sql_help.c:4120 msgid "merge_delete" msgstr "merge_delete" -#: sql_help.c:4114 +#: sql_help.c:4122 msgid "merge_insert" msgstr "merge_insert" -#: sql_help.c:4115 +#: sql_help.c:4123 msgid "and merge_insert is:" msgstr "і merge_insert:" -#: sql_help.c:4118 +#: sql_help.c:4126 msgid "and merge_update is:" msgstr "і merge_update:" -#: sql_help.c:4125 +#: sql_help.c:4133 msgid "and merge_delete is:" msgstr "і merge_delete:" -#: sql_help.c:4166 +#: sql_help.c:4174 msgid "payload" msgstr "зміст" -#: sql_help.c:4193 +#: sql_help.c:4201 msgid "old_role" msgstr "стара_роль" -#: sql_help.c:4194 +#: sql_help.c:4202 msgid "new_role" msgstr "нова_роль" -#: sql_help.c:4233 sql_help.c:4442 sql_help.c:4450 +#: sql_help.c:4241 sql_help.c:4450 sql_help.c:4458 msgid "savepoint_name" msgstr "ім'я_точки_збереження" -#: sql_help.c:4590 sql_help.c:4648 sql_help.c:4848 sql_help.c:4906 -#: sql_help.c:5093 sql_help.c:5151 +#: 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:4592 sql_help.c:4696 sql_help.c:4850 sql_help.c:5095 +#: sql_help.c:4600 sql_help.c:4704 sql_help.c:4858 sql_help.c:5103 msgid "window_name" msgstr "назва_вікна" -#: sql_help.c:4593 sql_help.c:4697 sql_help.c:4851 sql_help.c:5096 +#: sql_help.c:4601 sql_help.c:4705 sql_help.c:4859 sql_help.c:5104 msgid "window_definition" msgstr "визначення_вікна" -#: sql_help.c:4594 sql_help.c:4608 sql_help.c:4652 sql_help.c:4698 -#: sql_help.c:4852 sql_help.c:4866 sql_help.c:4910 sql_help.c:5097 -#: sql_help.c:5111 sql_help.c:5155 +#: 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:4600 sql_help.c:4858 sql_help.c:5103 +#: sql_help.c:4608 sql_help.c:4866 sql_help.c:5111 msgid "from_reference" msgstr "from_reference" -#: sql_help.c:4601 sql_help.c:4859 sql_help.c:5104 +#: sql_help.c:4609 sql_help.c:4867 sql_help.c:5112 msgid "where from_item can be one of:" msgstr "де джерело_даних може бути одним з:" -#: sql_help.c:4604 sql_help.c:4610 sql_help.c:4613 sql_help.c:4617 -#: sql_help.c:4629 sql_help.c:4862 sql_help.c:4868 sql_help.c:4871 -#: sql_help.c:4875 sql_help.c:4887 sql_help.c:5107 sql_help.c:5113 -#: sql_help.c:5116 sql_help.c:5120 sql_help.c:5132 +#: 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:4605 sql_help.c:4863 sql_help.c:5108 +#: sql_help.c:4613 sql_help.c:4871 sql_help.c:5116 msgid "sampling_method" msgstr "метод_вибірки" -#: sql_help.c:4607 sql_help.c:4865 sql_help.c:5110 +#: sql_help.c:4615 sql_help.c:4873 sql_help.c:5118 msgid "seed" msgstr "початкове_число" -#: sql_help.c:4611 sql_help.c:4650 sql_help.c:4869 sql_help.c:4908 -#: sql_help.c:5114 sql_help.c:5153 +#: 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:4621 sql_help.c:4624 sql_help.c:4627 sql_help.c:4879 -#: sql_help.c:4882 sql_help.c:4885 sql_help.c:5124 sql_help.c:5127 -#: sql_help.c:5130 +#: 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:4631 sql_help.c:4637 sql_help.c:4889 sql_help.c:4895 -#: sql_help.c:5134 sql_help.c:5140 +#: 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:4634 sql_help.c:4892 sql_help.c:5137 +#: sql_help.c:4642 sql_help.c:4900 sql_help.c:5145 msgid "join_column" msgstr "стовпець_поєднання" -#: sql_help.c:4635 sql_help.c:4893 sql_help.c:5138 +#: sql_help.c:4643 sql_help.c:4901 sql_help.c:5146 msgid "join_using_alias" msgstr "join_using_alias" -#: sql_help.c:4641 sql_help.c:4899 sql_help.c:5144 +#: sql_help.c:4649 sql_help.c:4907 sql_help.c:5152 msgid "and grouping_element can be one of:" msgstr "і елемент_групування може бути одним з:" -#: sql_help.c:4649 sql_help.c:4907 sql_help.c:5152 +#: sql_help.c:4657 sql_help.c:4915 sql_help.c:5160 msgid "and with_query is:" msgstr "і запит_WITH:" -#: sql_help.c:4653 sql_help.c:4911 sql_help.c:5156 +#: sql_help.c:4661 sql_help.c:4919 sql_help.c:5164 msgid "values" msgstr "значення" -#: sql_help.c:4654 sql_help.c:4912 sql_help.c:5157 +#: sql_help.c:4662 sql_help.c:4920 sql_help.c:5165 msgid "insert" msgstr "вставка" -#: sql_help.c:4655 sql_help.c:4913 sql_help.c:5158 +#: sql_help.c:4663 sql_help.c:4921 sql_help.c:5166 msgid "update" msgstr "оновлення" -#: sql_help.c:4656 sql_help.c:4914 sql_help.c:5159 +#: sql_help.c:4664 sql_help.c:4922 sql_help.c:5167 msgid "delete" msgstr "видалення" -#: sql_help.c:4657 sql_help.c:4915 sql_help.c:5160 +#: sql_help.c:4665 sql_help.c:4923 sql_help.c:5168 msgid "merge" msgstr "об’єднати" -#: sql_help.c:4659 sql_help.c:4917 sql_help.c:5162 +#: 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:4661 sql_help.c:4919 sql_help.c:5164 +#: 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:4662 sql_help.c:4920 sql_help.c:5165 +#: sql_help.c:4670 sql_help.c:4928 sql_help.c:5173 msgid "cycle_mark_value" msgstr "cycle_mark_value" -#: sql_help.c:4663 sql_help.c:4921 sql_help.c:5166 +#: sql_help.c:4671 sql_help.c:4929 sql_help.c:5174 msgid "cycle_mark_default" msgstr "cycle_mark_default" -#: sql_help.c:4664 sql_help.c:4922 sql_help.c:5167 +#: 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:4691 +#: sql_help.c:4699 msgid "new_table" msgstr "нова_таблиця" -#: sql_help.c:4762 +#: sql_help.c:4770 msgid "snapshot_id" msgstr "код_знімку" -#: sql_help.c:5029 +#: sql_help.c:5037 msgid "sort_expression" msgstr "вираз_сортування" -#: sql_help.c:5174 sql_help.c:6158 +#: sql_help.c:5182 sql_help.c:6166 msgid "abort the current transaction" msgstr "перервати поточну транзакцію" -#: sql_help.c:5180 +#: sql_help.c:5188 msgid "change the definition of an aggregate function" msgstr "змінити визначення агрегатної функції" -#: sql_help.c:5186 +#: sql_help.c:5194 msgid "change the definition of a collation" msgstr "змінити визначення правила сортування" -#: sql_help.c:5192 +#: sql_help.c:5200 msgid "change the definition of a conversion" msgstr "змінити визначення перетворення" -#: sql_help.c:5198 +#: sql_help.c:5206 msgid "change a database" msgstr "змінити базу даних" -#: sql_help.c:5204 +#: sql_help.c:5212 msgid "define default access privileges" msgstr "визначити права доступу за замовчуванням" -#: sql_help.c:5210 +#: sql_help.c:5218 msgid "change the definition of a domain" msgstr "змінити визначення домену" -#: sql_help.c:5216 +#: sql_help.c:5224 msgid "change the definition of an event trigger" msgstr "змінити визначення тригеру події" -#: sql_help.c:5222 +#: sql_help.c:5230 msgid "change the definition of an extension" msgstr "змінити визначення розширення" -#: sql_help.c:5228 +#: sql_help.c:5236 msgid "change the definition of a foreign-data wrapper" msgstr "змінити визначення джерела сторонніх даних" -#: sql_help.c:5234 +#: sql_help.c:5242 msgid "change the definition of a foreign table" msgstr "змінити визначення сторонньої таблиці" -#: sql_help.c:5240 +#: sql_help.c:5248 msgid "change the definition of a function" msgstr "змінити визначення функції" -#: sql_help.c:5246 +#: sql_help.c:5254 msgid "change role name or membership" msgstr "змінити назву ролі або членства" -#: sql_help.c:5252 +#: sql_help.c:5260 msgid "change the definition of an index" msgstr "змінити визначення індексу" -#: sql_help.c:5258 +#: sql_help.c:5266 msgid "change the definition of a procedural language" msgstr "змінити визначення процедурної мови" -#: sql_help.c:5264 +#: sql_help.c:5272 msgid "change the definition of a large object" msgstr "змінити визначення великого об'єкту" -#: sql_help.c:5270 +#: sql_help.c:5278 msgid "change the definition of a materialized view" msgstr "змінити визначення матеріалізованого подання" -#: sql_help.c:5276 +#: sql_help.c:5284 msgid "change the definition of an operator" msgstr "змінити визначення оператора" -#: sql_help.c:5282 +#: sql_help.c:5290 msgid "change the definition of an operator class" msgstr "змінити визначення класа операторів" -#: sql_help.c:5288 +#: sql_help.c:5296 msgid "change the definition of an operator family" msgstr "змінити визначення сімейства операторів" -#: sql_help.c:5294 +#: sql_help.c:5302 msgid "change the definition of a row-level security policy" msgstr "змінити визначення політики безпеки на рівні рядків" -#: sql_help.c:5300 +#: sql_help.c:5308 msgid "change the definition of a procedure" msgstr "змінити визначення процедури" -#: sql_help.c:5306 +#: sql_help.c:5314 msgid "change the definition of a publication" msgstr "змінити визначення публікації" -#: sql_help.c:5312 sql_help.c:5414 +#: sql_help.c:5320 sql_help.c:5422 msgid "change a database role" msgstr "змінити роль бази даних" -#: sql_help.c:5318 +#: sql_help.c:5326 msgid "change the definition of a routine" msgstr "змінити визначення підпрограми" -#: sql_help.c:5324 +#: sql_help.c:5332 msgid "change the definition of a rule" msgstr "змінити визначення правила" -#: sql_help.c:5330 +#: sql_help.c:5338 msgid "change the definition of a schema" msgstr "змінити визначення схеми" -#: sql_help.c:5336 +#: sql_help.c:5344 msgid "change the definition of a sequence generator" msgstr "змінити визначення генератору послідовності" -#: sql_help.c:5342 +#: sql_help.c:5350 msgid "change the definition of a foreign server" msgstr "змінити визначення стороннього серверу" -#: sql_help.c:5348 +#: sql_help.c:5356 msgid "change the definition of an extended statistics object" msgstr "змінити визначення об'єкту розширеної статистики" -#: sql_help.c:5354 +#: sql_help.c:5362 msgid "change the definition of a subscription" msgstr "змінити визначення підписки" -#: sql_help.c:5360 +#: sql_help.c:5368 msgid "change a server configuration parameter" msgstr "змінити параметр конфігурації сервера" -#: sql_help.c:5366 +#: sql_help.c:5374 msgid "change the definition of a table" msgstr "змінити визначення таблиці" -#: sql_help.c:5372 +#: sql_help.c:5380 msgid "change the definition of a tablespace" msgstr "змінити визначення табличного простору" -#: sql_help.c:5378 +#: sql_help.c:5386 msgid "change the definition of a text search configuration" msgstr "змінити визначення конфігурації текстового пошуку" -#: sql_help.c:5384 +#: sql_help.c:5392 msgid "change the definition of a text search dictionary" msgstr "змінити визначення словника текстового пошуку" -#: sql_help.c:5390 +#: sql_help.c:5398 msgid "change the definition of a text search parser" msgstr "змінити визначення парсера текстового пошуку" -#: sql_help.c:5396 +#: sql_help.c:5404 msgid "change the definition of a text search template" msgstr "змінити визначення шаблона текстового пошуку" -#: sql_help.c:5402 +#: sql_help.c:5410 msgid "change the definition of a trigger" msgstr "змінити визначення тригеру" -#: sql_help.c:5408 +#: sql_help.c:5416 msgid "change the definition of a type" msgstr "змінити визначення типу" -#: sql_help.c:5420 +#: sql_help.c:5428 msgid "change the definition of a user mapping" msgstr "змінити визначення зіставлень користувачів" -#: sql_help.c:5426 +#: sql_help.c:5434 msgid "change the definition of a view" msgstr "змінити визначення подання" -#: sql_help.c:5432 +#: sql_help.c:5440 msgid "collect statistics about a database" msgstr "зібрати статистику про базу даних" -#: sql_help.c:5438 sql_help.c:6236 +#: sql_help.c:5446 sql_help.c:6244 msgid "start a transaction block" msgstr "розпочати транзакцію" -#: sql_help.c:5444 +#: sql_help.c:5452 msgid "invoke a procedure" msgstr "викликати процедуру" -#: sql_help.c:5450 +#: sql_help.c:5458 msgid "force a write-ahead log checkpoint" msgstr "провести контрольну точку в журналі попереднього запису" -#: sql_help.c:5456 +#: sql_help.c:5464 msgid "close a cursor" msgstr "закрити курсор" -#: sql_help.c:5462 +#: sql_help.c:5470 msgid "cluster a table according to an index" msgstr "перегрупувати таблицю за індексом" -#: sql_help.c:5468 +#: sql_help.c:5476 msgid "define or change the comment of an object" msgstr "задати або змінити коментар об'єкта" -#: sql_help.c:5474 sql_help.c:6032 +#: sql_help.c:5482 sql_help.c:6040 msgid "commit the current transaction" msgstr "затвердити поточну транзакцію" -#: sql_help.c:5480 +#: sql_help.c:5488 msgid "commit a transaction that was earlier prepared for two-phase commit" msgstr "затвердити транзакцію, раніше підготовлену до двохфазного затвердження" -#: sql_help.c:5486 +#: sql_help.c:5494 msgid "copy data between a file and a table" msgstr "копіювати дані між файлом та таблицею" -#: sql_help.c:5492 +#: sql_help.c:5500 msgid "define a new access method" msgstr "визначити новий метод доступу" -#: sql_help.c:5498 +#: sql_help.c:5506 msgid "define a new aggregate function" msgstr "визначити нову агрегатну функцію" -#: sql_help.c:5504 +#: sql_help.c:5512 msgid "define a new cast" msgstr "визначити приведення типів" -#: sql_help.c:5510 +#: sql_help.c:5518 msgid "define a new collation" msgstr "визначити нове правило сортування" -#: sql_help.c:5516 +#: sql_help.c:5524 msgid "define a new encoding conversion" msgstr "визначити нове перетворення кодування" -#: sql_help.c:5522 +#: sql_help.c:5530 msgid "create a new database" msgstr "створити нову базу даних" -#: sql_help.c:5528 +#: sql_help.c:5536 msgid "define a new domain" msgstr "визначити новий домен" -#: sql_help.c:5534 +#: sql_help.c:5542 msgid "define a new event trigger" msgstr "визначити новий тригер події" -#: sql_help.c:5540 +#: sql_help.c:5548 msgid "install an extension" msgstr "встановити розширення" -#: sql_help.c:5546 +#: sql_help.c:5554 msgid "define a new foreign-data wrapper" msgstr "визначити нове джерело сторонніх даних" -#: sql_help.c:5552 +#: sql_help.c:5560 msgid "define a new foreign table" msgstr "визначити нову сторонню таблицю" -#: sql_help.c:5558 +#: sql_help.c:5566 msgid "define a new function" msgstr "визначити нову функцію" -#: sql_help.c:5564 sql_help.c:5624 sql_help.c:5726 +#: sql_help.c:5572 sql_help.c:5632 sql_help.c:5734 msgid "define a new database role" msgstr "визначити нову роль бази даних" -#: sql_help.c:5570 +#: sql_help.c:5578 msgid "define a new index" msgstr "визначити новий індекс" -#: sql_help.c:5576 +#: sql_help.c:5584 msgid "define a new procedural language" msgstr "визначити нову процедурну мову" -#: sql_help.c:5582 +#: sql_help.c:5590 msgid "define a new materialized view" msgstr "визначити нове матеріалізоване подання" -#: sql_help.c:5588 +#: sql_help.c:5596 msgid "define a new operator" msgstr "визначити новий оператор" -#: sql_help.c:5594 +#: sql_help.c:5602 msgid "define a new operator class" msgstr "визначити новий клас оператора" -#: sql_help.c:5600 +#: sql_help.c:5608 msgid "define a new operator family" msgstr "визначити нове сімейство операторів" -#: sql_help.c:5606 +#: sql_help.c:5614 msgid "define a new row-level security policy for a table" msgstr "визначити нову політику безпеки на рівні рядків для таблиці" -#: sql_help.c:5612 +#: sql_help.c:5620 msgid "define a new procedure" msgstr "визначити нову процедуру" -#: sql_help.c:5618 +#: sql_help.c:5626 msgid "define a new publication" msgstr "визначити нову публікацію" -#: sql_help.c:5630 +#: sql_help.c:5638 msgid "define a new rewrite rule" msgstr "визначити нове правило перезапису" -#: sql_help.c:5636 +#: sql_help.c:5644 msgid "define a new schema" msgstr "визначити нову схему" -#: sql_help.c:5642 +#: sql_help.c:5650 msgid "define a new sequence generator" msgstr "визначити новий генератор послідовностей" -#: sql_help.c:5648 +#: sql_help.c:5656 msgid "define a new foreign server" msgstr "визначити новий сторонній сервер" -#: sql_help.c:5654 +#: sql_help.c:5662 msgid "define extended statistics" msgstr "визначити розширену статистику" -#: sql_help.c:5660 +#: sql_help.c:5668 msgid "define a new subscription" msgstr "визначити нову підписку" -#: sql_help.c:5666 +#: sql_help.c:5674 msgid "define a new table" msgstr "визначити нову таблицю" -#: sql_help.c:5672 sql_help.c:6194 +#: sql_help.c:5680 sql_help.c:6202 msgid "define a new table from the results of a query" msgstr "визначити нову таблицю з результатів запиту" -#: sql_help.c:5678 +#: sql_help.c:5686 msgid "define a new tablespace" msgstr "визначити новий табличний простір" -#: sql_help.c:5684 +#: sql_help.c:5692 msgid "define a new text search configuration" msgstr "визначити нову конфігурацію текстового пошуку" -#: sql_help.c:5690 +#: sql_help.c:5698 msgid "define a new text search dictionary" msgstr "визначити новий словник текстового пошуку" -#: sql_help.c:5696 +#: sql_help.c:5704 msgid "define a new text search parser" msgstr "визначити новий аналізатор текстового пошуку" -#: sql_help.c:5702 +#: sql_help.c:5710 msgid "define a new text search template" msgstr "визначити новий шаблон текстового пошуку" -#: sql_help.c:5708 +#: sql_help.c:5716 msgid "define a new transform" msgstr "визначити нове перетворення" -#: sql_help.c:5714 +#: sql_help.c:5722 msgid "define a new trigger" msgstr "визначити новий тригер" -#: sql_help.c:5720 +#: sql_help.c:5728 msgid "define a new data type" msgstr "визначити новий тип даних" -#: sql_help.c:5732 +#: sql_help.c:5740 msgid "define a new mapping of a user to a foreign server" msgstr "визначити нове зіставлення користувача для стороннього сервера" -#: sql_help.c:5738 +#: sql_help.c:5746 msgid "define a new view" msgstr "визначити нове подання" -#: sql_help.c:5744 +#: sql_help.c:5752 msgid "deallocate a prepared statement" msgstr "звільнити підготовлену команду" -#: sql_help.c:5750 +#: sql_help.c:5758 msgid "define a cursor" msgstr "визначити курсор" -#: sql_help.c:5756 +#: sql_help.c:5764 msgid "delete rows of a table" msgstr "видалити рядки таблиці" -#: sql_help.c:5762 +#: sql_help.c:5770 msgid "discard session state" msgstr "очистити стан сесії" -#: sql_help.c:5768 +#: sql_help.c:5776 msgid "execute an anonymous code block" msgstr "виконати анонімний блок коду" -#: sql_help.c:5774 +#: sql_help.c:5782 msgid "remove an access method" msgstr "видалити метод доступу" -#: sql_help.c:5780 +#: sql_help.c:5788 msgid "remove an aggregate function" msgstr "видалити агрегатну функцію" -#: sql_help.c:5786 +#: sql_help.c:5794 msgid "remove a cast" msgstr "видалити приведення типів" -#: sql_help.c:5792 +#: sql_help.c:5800 msgid "remove a collation" msgstr "видалити правило сортування" -#: sql_help.c:5798 +#: sql_help.c:5806 msgid "remove a conversion" msgstr "видалити перетворення" -#: sql_help.c:5804 +#: sql_help.c:5812 msgid "remove a database" msgstr "видалити базу даних" -#: sql_help.c:5810 +#: sql_help.c:5818 msgid "remove a domain" msgstr "видалити домен" -#: sql_help.c:5816 +#: sql_help.c:5824 msgid "remove an event trigger" msgstr "видалити тригер події" -#: sql_help.c:5822 +#: sql_help.c:5830 msgid "remove an extension" msgstr "видалити розширення" -#: sql_help.c:5828 +#: sql_help.c:5836 msgid "remove a foreign-data wrapper" msgstr "видалити джерело сторонніх даних" -#: sql_help.c:5834 +#: sql_help.c:5842 msgid "remove a foreign table" msgstr "видалити сторонню таблицю" -#: sql_help.c:5840 +#: sql_help.c:5848 msgid "remove a function" msgstr "видалити функцію" -#: sql_help.c:5846 sql_help.c:5912 sql_help.c:6014 +#: sql_help.c:5854 sql_help.c:5920 sql_help.c:6022 msgid "remove a database role" msgstr "видалити роль бази даних" -#: sql_help.c:5852 +#: sql_help.c:5860 msgid "remove an index" msgstr "видалити індекс" -#: sql_help.c:5858 +#: sql_help.c:5866 msgid "remove a procedural language" msgstr "видалити процедурну мову" -#: sql_help.c:5864 +#: sql_help.c:5872 msgid "remove a materialized view" msgstr "видалити матеріалізоване подання" -#: sql_help.c:5870 +#: sql_help.c:5878 msgid "remove an operator" msgstr "видалити оператор" -#: sql_help.c:5876 +#: sql_help.c:5884 msgid "remove an operator class" msgstr "видалити клас операторів" -#: sql_help.c:5882 +#: sql_help.c:5890 msgid "remove an operator family" msgstr "видалити сімейство операторів" -#: sql_help.c:5888 +#: sql_help.c:5896 msgid "remove database objects owned by a database role" msgstr "видалити об'єкти бази даних, що належать ролі" -#: sql_help.c:5894 +#: sql_help.c:5902 msgid "remove a row-level security policy from a table" msgstr "видалити політику безпеки на рівні рядків з таблиці" -#: sql_help.c:5900 +#: sql_help.c:5908 msgid "remove a procedure" msgstr "видалити процедуру" -#: sql_help.c:5906 +#: sql_help.c:5914 msgid "remove a publication" msgstr "видалити публікацію" -#: sql_help.c:5918 +#: sql_help.c:5926 msgid "remove a routine" msgstr "видалити підпрограму" -#: sql_help.c:5924 +#: sql_help.c:5932 msgid "remove a rewrite rule" msgstr "видалити правило перезапису" -#: sql_help.c:5930 +#: sql_help.c:5938 msgid "remove a schema" msgstr "видалити схему" -#: sql_help.c:5936 +#: sql_help.c:5944 msgid "remove a sequence" msgstr "видалити послідовність" -#: sql_help.c:5942 +#: sql_help.c:5950 msgid "remove a foreign server descriptor" msgstr "видалити опис стороннього серверу" -#: sql_help.c:5948 +#: sql_help.c:5956 msgid "remove extended statistics" msgstr "видалити розширену статистику" -#: sql_help.c:5954 +#: sql_help.c:5962 msgid "remove a subscription" msgstr "видалити підписку" -#: sql_help.c:5960 +#: sql_help.c:5968 msgid "remove a table" msgstr "видалити таблицю" -#: sql_help.c:5966 +#: sql_help.c:5974 msgid "remove a tablespace" msgstr "видалити табличний простір" -#: sql_help.c:5972 +#: sql_help.c:5980 msgid "remove a text search configuration" msgstr "видалити конфігурацію тектового пошуку" -#: sql_help.c:5978 +#: sql_help.c:5986 msgid "remove a text search dictionary" msgstr "видалити словник тектового пошуку" -#: sql_help.c:5984 +#: sql_help.c:5992 msgid "remove a text search parser" msgstr "видалити парсер тектового пошуку" -#: sql_help.c:5990 +#: sql_help.c:5998 msgid "remove a text search template" msgstr "видалити шаблон тектового пошуку" -#: sql_help.c:5996 +#: sql_help.c:6004 msgid "remove a transform" msgstr "видалити перетворення" -#: sql_help.c:6002 +#: sql_help.c:6010 msgid "remove a trigger" msgstr "видалити тригер" -#: sql_help.c:6008 +#: sql_help.c:6016 msgid "remove a data type" msgstr "видалити тип даних" -#: sql_help.c:6020 +#: sql_help.c:6028 msgid "remove a user mapping for a foreign server" msgstr "видалити зіставлення користувача для стороннього серверу" -#: sql_help.c:6026 +#: sql_help.c:6034 msgid "remove a view" msgstr "видалити подання" -#: sql_help.c:6038 +#: sql_help.c:6046 msgid "execute a prepared statement" msgstr "виконати підготовлену команду" -#: sql_help.c:6044 +#: sql_help.c:6052 msgid "show the execution plan of a statement" msgstr "показати план виконання команди" -#: sql_help.c:6050 +#: sql_help.c:6058 msgid "retrieve rows from a query using a cursor" msgstr "отримати рядки запиту з курсору" -#: sql_help.c:6056 +#: sql_help.c:6064 msgid "define access privileges" msgstr "визначити права доступу" -#: sql_help.c:6062 +#: sql_help.c:6070 msgid "import table definitions from a foreign server" msgstr "імпортувати визначення таблиць зі стороннього серверу" -#: sql_help.c:6068 +#: sql_help.c:6076 msgid "create new rows in a table" msgstr "створити нові рядки в таблиці" -#: sql_help.c:6074 +#: sql_help.c:6082 msgid "listen for a notification" msgstr "очікувати на повідомлення" -#: sql_help.c:6080 +#: sql_help.c:6088 msgid "load a shared library file" msgstr "завантажити файл спільної бібліотеки" -#: sql_help.c:6086 +#: sql_help.c:6094 msgid "lock a table" msgstr "заблокувати таблицю" -#: sql_help.c:6092 +#: sql_help.c:6100 msgid "conditionally insert, update, or delete rows of a table" msgstr "умовно вставити, оновити або видалити рядки таблиці" -#: sql_help.c:6098 +#: sql_help.c:6106 msgid "position a cursor" msgstr "розташувати курсор" -#: sql_help.c:6104 +#: sql_help.c:6112 msgid "generate a notification" msgstr "згенерувати повідомлення" -#: sql_help.c:6110 +#: sql_help.c:6118 msgid "prepare a statement for execution" msgstr "підготувати команду для виконання" -#: sql_help.c:6116 +#: sql_help.c:6124 msgid "prepare the current transaction for two-phase commit" msgstr "підготувати поточну транзакцію для двохфазного затвердження" -#: sql_help.c:6122 +#: sql_help.c:6130 msgid "change the ownership of database objects owned by a database role" msgstr "змінити власника об'єктів БД, що належать заданій ролі" -#: sql_help.c:6128 +#: sql_help.c:6136 msgid "replace the contents of a materialized view" msgstr "замінити вміст матеріалізованого подання" -#: sql_help.c:6134 +#: sql_help.c:6142 msgid "rebuild indexes" msgstr "перебудувати індекси" -#: sql_help.c:6140 +#: sql_help.c:6148 msgid "release a previously defined savepoint" msgstr "звільнити раніше визначену точку збереження" -#: sql_help.c:6146 +#: sql_help.c:6154 msgid "restore the value of a run-time parameter to the default value" msgstr "відновити початкове значення параметру виконання" -#: sql_help.c:6152 +#: sql_help.c:6160 msgid "remove access privileges" msgstr "видалити права доступу" -#: sql_help.c:6164 +#: sql_help.c:6172 msgid "cancel a transaction that was earlier prepared for two-phase commit" msgstr "скасувати транзакцію, раніше підготовлену до двохфазного затвердження" -#: sql_help.c:6170 +#: sql_help.c:6178 msgid "roll back to a savepoint" msgstr "відкотитися до точки збереження" -#: sql_help.c:6176 +#: sql_help.c:6184 msgid "define a new savepoint within the current transaction" msgstr "визначити нову точку збереження в рамках поточної транзакції" -#: sql_help.c:6182 +#: sql_help.c:6190 msgid "define or change a security label applied to an object" msgstr "визначити або змінити мітку безпеки, застосовану до об'єкта" -#: sql_help.c:6188 sql_help.c:6242 sql_help.c:6278 +#: sql_help.c:6196 sql_help.c:6250 sql_help.c:6286 msgid "retrieve rows from a table or view" msgstr "отримати рядки з таблиці або подання" -#: sql_help.c:6200 +#: sql_help.c:6208 msgid "change a run-time parameter" msgstr "змінити параметр виконання" -#: sql_help.c:6206 +#: sql_help.c:6214 msgid "set constraint check timing for the current transaction" msgstr "встановити час перевірки обмеження для поточної транзакції" -#: sql_help.c:6212 +#: sql_help.c:6220 msgid "set the current user identifier of the current session" msgstr "встановити ідентифікатор поточного користувача в поточній сесії" -#: sql_help.c:6218 +#: sql_help.c:6226 msgid "set the session user identifier and the current user identifier of the current session" msgstr "встановити ідентифікатор користувача сесії й ідентифікатор поточного користувача в поточній сесії" -#: sql_help.c:6224 +#: sql_help.c:6232 msgid "set the characteristics of the current transaction" msgstr "встановити характеристики поточної транзакції" -#: sql_help.c:6230 +#: sql_help.c:6238 msgid "show the value of a run-time parameter" msgstr "показати значення параметра виконання" -#: sql_help.c:6248 +#: sql_help.c:6256 msgid "empty a table or set of tables" msgstr "очистити таблицю або декілька таблиць" -#: sql_help.c:6254 +#: sql_help.c:6262 msgid "stop listening for a notification" msgstr "припинити очікування повідомлень" -#: sql_help.c:6260 +#: sql_help.c:6268 msgid "update rows of a table" msgstr "змінити рядки таблиці" -#: sql_help.c:6266 +#: sql_help.c:6274 msgid "garbage-collect and optionally analyze a database" msgstr "виконати збір сміття і проаналізувати базу даних" -#: sql_help.c:6272 +#: sql_help.c:6280 msgid "compute a set of rows" msgstr "отримати набір рядків" diff --git a/src/bin/psql/t/001_basic.pl b/src/bin/psql/t/001_basic.pl index bd4fdd2030a37..96c0a064ae913 100644 --- a/src/bin/psql/t/001_basic.pl +++ b/src/bin/psql/t/001_basic.pl @@ -443,4 +443,11 @@ sub psql_fails_like my $c4 = slurp_file($g_file); like($c4, qr/foo.*bar/s); +psql_fails_like( + $node, + qq{\\restrict test +\\! should_fail}, + qr/backslash commands are restricted; only \\unrestrict is allowed/, + 'meta-command in restrict mode fails'); + done_testing(); diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c index 1bd01ff865ff5..d4c5f6c3798be 100644 --- a/src/bin/psql/tab-complete.c +++ b/src/bin/psql/tab-complete.c @@ -1169,6 +1169,19 @@ Alter_procedure_options, "COST", "IMMUTABLE", "LEAKPROOF", "NOT LEAKPROOF", \ Alter_routine_options, "CALLED ON NULL INPUT", "RETURNS NULL ON NULL INPUT", \ "STRICT", "SUPPORT" +/* COPY options shared between FROM and TO */ +#define Copy_common_options \ +"DELIMITER", "ENCODING", "ESCAPE", "FORMAT", "HEADER", "NULL", "QUOTE" + +/* COPY FROM options */ +#define Copy_from_options \ +Copy_common_options, "DEFAULT", "FORCE_NOT_NULL", "FORCE_NULL", "FREEZE", \ +"LOG_VERBOSITY", "ON_ERROR" + +/* COPY TO options */ +#define Copy_to_options \ +Copy_common_options, "FORCE_QUOTE" + /* * These object types were introduced later than our support cutoff of * server version 9.2. We use the VersionedQuery infrastructure so that @@ -1733,10 +1746,10 @@ psql_completion(const char *text, int start, int end) "\\out", "\\password", "\\print", "\\prompt", "\\pset", "\\qecho", "\\quit", - "\\reset", + "\\reset", "\\restrict", "\\s", "\\set", "\\setenv", "\\sf", "\\sv", "\\t", "\\T", "\\timing", - "\\unset", + "\\unrestrict", "\\unset", "\\x", "\\warn", "\\watch", "\\write", "\\z", @@ -2899,23 +2912,24 @@ psql_completion(const char *text, int start, int end) else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAny)) COMPLETE_WITH("WITH (", "WHERE"); - /* Complete COPY FROM|TO filename WITH ( */ - else if (Matches("COPY|\\copy", MatchAny, "FROM|TO", MatchAny, "WITH", "(")) - COMPLETE_WITH("FORMAT", "FREEZE", "DELIMITER", "NULL", - "HEADER", "QUOTE", "ESCAPE", "FORCE_QUOTE", - "FORCE_NOT_NULL", "FORCE_NULL", "ENCODING", "DEFAULT", - "ON_ERROR", "LOG_VERBOSITY"); + /* Complete COPY FROM filename WITH ( */ + else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAny, "WITH", "(")) + COMPLETE_WITH(Copy_from_options); + + /* Complete COPY TO filename WITH ( */ + else if (Matches("COPY|\\copy", MatchAny, "TO", MatchAny, "WITH", "(")) + COMPLETE_WITH(Copy_to_options); /* 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")) + else if (Matches("COPY|\\copy", MatchAny, "FROM", 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")) + else if (Matches("COPY|\\copy", MatchAny, "FROM", MatchAny, "WITH", "(", "LOG_VERBOSITY")) COMPLETE_WITH("default", "verbose"); /* Complete COPY FROM WITH () */ diff --git a/src/bin/scripts/po/ru.po b/src/bin/scripts/po/ru.po index 2afac56ec193f..d630253ffc6b7 100644 --- a/src/bin/scripts/po/ru.po +++ b/src/bin/scripts/po/ru.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: pgscripts (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-02-08 07:44+0200\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" @@ -212,14 +212,14 @@ msgstr "ошибка при выполнении запроса: %s" msgid "Query was: %s" msgstr "Выполнялся запрос: %s" -#: ../../fe_utils/string_utils.c:434 +#: ../../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:607 +#: ../../fe_utils/string_utils.c:760 #, c-format msgid "database name contains a newline or carriage return: \"%s\"\n" msgstr "" @@ -228,13 +228,13 @@ msgstr "" #: 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 +#: 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:131 createdb.c:166 createuser.c:208 dropdb.c:119 dropuser.c:108 -#: pg_isready.c:109 reindexdb.c:194 vacuumdb.c:298 +#: pg_isready.c:109 reindexdb.c:197 vacuumdb.c:298 #, c-format msgid "too many command-line arguments (first is \"%s\")" msgstr "слишком много аргументов командной строки (первый: \"%s\")" @@ -268,19 +268,19 @@ msgstr "" "%s упорядочивает данные всех кластеризованных таблиц в базе данных.\n" "\n" -#: clusterdb.c:275 createdb.c:298 createuser.c:415 dropdb.c:172 dropuser.c:170 -#: pg_isready.c:226 reindexdb.c:872 vacuumdb.c:1170 +#: 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:276 reindexdb.c:873 vacuumdb.c:1171 +#: clusterdb.c:276 reindexdb.c:888 vacuumdb.c:1172 #, c-format msgid " %s [OPTION]... [DBNAME]\n" msgstr " %s [ПАРАМЕТР]... [ИМЯ_БД]\n" -#: clusterdb.c:277 createdb.c:300 createuser.c:417 dropdb.c:174 dropuser.c:172 -#: pg_isready.c:229 reindexdb.c:874 vacuumdb.c:1172 +#: 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" @@ -299,7 +299,7 @@ msgstr " -a, --all кластеризовать все базы msgid " -d, --dbname=DBNAME database to cluster\n" msgstr " -d, --dbname=ИМЯ_БД имя базы данных для кластеризации\n" -#: clusterdb.c:280 createuser.c:423 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" @@ -321,18 +321,18 @@ msgstr "" msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose выводить исчерпывающие сообщения\n" -#: clusterdb.c:284 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 показать версию и выйти\n" -#: clusterdb.c:285 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 показать эту справку и выйти\n" -#: clusterdb.c:286 createdb.c:317 createuser.c:448 dropdb.c:181 dropuser.c:179 -#: pg_isready.c:235 reindexdb.c:889 vacuumdb.c:1201 +#: 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" @@ -341,35 +341,35 @@ msgstr "" "\n" "Параметры подключения:\n" -#: clusterdb.c:287 createuser.c:449 dropdb.c:182 dropuser.c:180 vacuumdb.c:1202 +#: 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" -#: clusterdb.c:288 createuser.c:450 dropdb.c:183 dropuser.c:181 vacuumdb.c:1203 +#: 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:289 dropdb.c:184 vacuumdb.c:1204 +#: 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:290 createuser.c:452 dropdb.c:185 dropuser.c:183 vacuumdb.c:1205 +#: 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:291 createuser.c:453 dropdb.c:186 dropuser.c:184 vacuumdb.c:1206 +#: 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:292 dropdb.c:187 vacuumdb.c:1207 +#: clusterdb.c:292 dropdb.c:186 vacuumdb.c:1208 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=ИМЯ_БД сменить опорную базу данных\n" @@ -383,8 +383,8 @@ msgstr "" "\n" "Подробнее о кластеризации вы можете узнать в описании SQL-команды CLUSTER.\n" -#: clusterdb.c:294 createdb.c:325 createuser.c:454 dropdb.c:188 dropuser.c:185 -#: pg_isready.c:240 reindexdb.c:897 vacuumdb.c:1209 +#: 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" @@ -393,8 +393,8 @@ msgstr "" "\n" "Об ошибках сообщайте по адресу <%s>.\n" -#: clusterdb.c:295 createdb.c:326 createuser.c:455 dropdb.c:189 dropuser.c:186 -#: pg_isready.c:241 reindexdb.c:898 vacuumdb.c:1210 +#: 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" @@ -408,23 +408,23 @@ 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" @@ -434,17 +434,17 @@ msgstr "Пожалуйста, введите \"%s\" или \"%s\".\n" msgid "\"%s\" is not a valid encoding name" msgstr "\"%s\" не является верным названием кодировки" -#: createdb.c:260 +#: createdb.c:262 #, c-format msgid "database creation failed: %s" msgstr "создать базу данных не удалось: %s" -#: createdb.c:279 +#: createdb.c:281 #, c-format msgid "comment creation failed (database was created): %s" msgstr "создать комментарий не удалось (база данных была создана): %s" -#: createdb.c:297 +#: createdb.c:299 #, c-format msgid "" "%s creates a PostgreSQL database.\n" @@ -453,65 +453,65 @@ msgstr "" "%s создаёт базу данных PostgreSQL.\n" "\n" -#: createdb.c:299 +#: createdb.c:301 #, c-format msgid " %s [OPTION]... [DBNAME] [DESCRIPTION]\n" msgstr " %s [ПАРАМЕТР]... [ИМЯ_БД] [ОПИСАНИЕ]\n" # well-spelled: ПРОСТР -#: createdb.c:301 +#: createdb.c:303 #, c-format msgid " -D, --tablespace=TABLESPACE default tablespace for the database\n" msgstr "" " -D, --tablespace=ТАБЛ_ПРОСТР табличное пространство по умолчанию для базы " "данных\n" -#: createdb.c:302 reindexdb.c:878 +#: 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:303 +#: createdb.c:305 #, c-format msgid " -E, --encoding=ENCODING encoding for the database\n" msgstr " -E, --encoding=КОДИРОВКА кодировка базы данных\n" -#: createdb.c:304 +#: createdb.c:306 #, c-format msgid " -l, --locale=LOCALE locale settings for the database\n" msgstr " -l, --locale=ЛОКАЛЬ локаль для базы данных\n" -#: createdb.c:305 +#: createdb.c:307 #, c-format msgid " --lc-collate=LOCALE LC_COLLATE setting for the database\n" msgstr " --lc-collate=ЛОКАЛЬ параметр LC_COLLATE для базы данных\n" -#: createdb.c:306 +#: createdb.c:308 #, c-format msgid " --lc-ctype=LOCALE LC_CTYPE setting for the database\n" msgstr " --lc-ctype=ЛОКАЛЬ параметр LC_CTYPE для базы данных\n" -#: createdb.c:307 +#: createdb.c:309 #, c-format msgid "" " --builtin-locale=LOCALE builtin locale setting for the database\n" msgstr " --builtin-locale=ЛОКАЛЬ имя встроенной локали для базы данных\n" -#: createdb.c:308 +#: createdb.c:310 #, c-format msgid " --icu-locale=LOCALE ICU locale setting for the database\n" msgstr " --icu-locale=ЛОКАЛЬ локаль ICU для базы данных\n" -#: createdb.c:309 +#: createdb.c:311 #, c-format msgid " --icu-rules=RULES ICU rules setting for the database\n" msgstr "" " --icu-rules=ПРАВИЛА настройка правил сортировки ICU для базы " "данных\n" -#: createdb.c:310 +#: createdb.c:312 #, c-format msgid "" " --locale-provider={builtin|libc|icu}\n" @@ -522,13 +522,13 @@ msgstr "" " провайдер локали для основного правила " "сортировки БД\n" -#: createdb.c:312 +#: createdb.c:314 #, c-format msgid " -O, --owner=OWNER database user to own the new database\n" msgstr "" " -O, --owner=ВЛАДЕЛЕЦ пользователь-владелец новой базы данных\n" -#: createdb.c:313 +#: createdb.c:315 #, c-format msgid "" " -S, --strategy=STRATEGY database creation strategy wal_log or " @@ -537,22 +537,22 @@ msgstr "" " -S, --strategy=STRATEGY стратегия создания базы данных: wal_log или " "file_copy\n" -#: createdb.c:314 +#: createdb.c:316 #, c-format msgid " -T, --template=TEMPLATE template database to copy\n" msgstr " -T, --template=ШАБЛОН исходная база данных для копирования\n" -#: createdb.c:315 reindexdb.c:887 +#: createdb.c:317 reindexdb.c:902 #, c-format msgid " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: createdb.c:316 reindexdb.c:888 +#: createdb.c:318 reindexdb.c:903 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" -#: createdb.c:318 reindexdb.c:890 +#: createdb.c:320 reindexdb.c:905 #, c-format msgid "" " -h, --host=HOSTNAME database server host or socket directory\n" @@ -560,33 +560,33 @@ msgstr "" " -h, --host=ИМЯ компьютер с сервером баз данных или каталог " "сокетов\n" -#: createdb.c:319 reindexdb.c:891 +#: createdb.c:321 reindexdb.c:906 #, c-format msgid " -p, --port=PORT database server port\n" msgstr " -p, --port=ПОРТ порт сервера баз данных\n" -#: createdb.c:320 reindexdb.c:892 +#: createdb.c:322 reindexdb.c:907 #, c-format msgid " -U, --username=USERNAME user name to connect as\n" msgstr "" " -U, --username=ИМЯ имя пользователя для подключения к серверу\n" -#: createdb.c:321 reindexdb.c:893 +#: createdb.c:323 reindexdb.c:908 #, c-format msgid " -w, --no-password never prompt for password\n" msgstr " -w, --no-password не запрашивать пароль\n" -#: createdb.c:322 reindexdb.c:894 +#: createdb.c:324 reindexdb.c:909 #, c-format msgid " -W, --password force password prompt\n" msgstr " -W, --password запросить пароль\n" -#: createdb.c:323 reindexdb.c:895 +#: createdb.c:325 reindexdb.c:910 #, c-format msgid " --maintenance-db=DBNAME alternate maintenance database\n" msgstr " --maintenance-db=ИМЯ_БД сменить опорную базу данных\n" -#: createdb.c:324 +#: createdb.c:326 #, c-format msgid "" "\n" @@ -624,17 +624,17 @@ msgstr "Новая роль должна иметь право создават msgid "Shall the new role be allowed to create more new roles?" msgstr "Новая роль должна иметь право создавать другие роли?" -#: createuser.c:309 +#: createuser.c:311 #, c-format msgid "password encryption failed: %s" msgstr "ошибка при шифровании пароля: %s" -#: createuser.c:400 +#: createuser.c:402 #, c-format msgid "creation of new role failed: %s" msgstr "создать роль не удалось: %s" -#: createuser.c:414 +#: createuser.c:416 #, c-format msgid "" "%s creates a new PostgreSQL role.\n" @@ -643,12 +643,12 @@ msgstr "" "%s создаёт роль пользователя PostgreSQL.\n" "\n" -#: createuser.c:416 dropuser.c:171 +#: createuser.c:418 dropuser.c:172 #, c-format msgid " %s [OPTION]... [ROLENAME]\n" msgstr " %s [ПАРАМЕТР]... [ИМЯ_РОЛИ]\n" -#: createuser.c:418 +#: createuser.c:420 #, c-format msgid "" " -a, --with-admin=ROLE ROLE will be a member of new role with admin\n" @@ -658,7 +658,7 @@ msgstr "" "привилегией\n" " ADMIN\n" -#: createuser.c:420 +#: createuser.c:422 #, c-format msgid "" " -c, --connection-limit=N connection limit for role (default: no limit)\n" @@ -666,29 +666,29 @@ msgstr "" " -c, --connection-limit=N предел подключений для роли\n" " (по умолчанию предела нет)\n" -#: createuser.c:421 +#: createuser.c:423 #, c-format msgid " -d, --createdb role can create new databases\n" msgstr " -d, --createdb роль с правом создания баз данных\n" -#: createuser.c:422 +#: createuser.c:424 #, c-format msgid " -D, --no-createdb role cannot create databases (default)\n" msgstr "" " -D, --no-createdb роль без права создания баз данных (по " "умолчанию)\n" -#: createuser.c:424 +#: createuser.c:426 #, c-format msgid " -g, --member-of=ROLE new role will be a member of ROLE\n" msgstr " -g, --member-of=РОЛЬ новая роль будет членом заданной роли\n" -#: createuser.c:425 +#: createuser.c:427 #, c-format msgid " --role=ROLE (same as --member-of, deprecated)\n" msgstr " --role=РОЛЬ (устаревшая альтернатива --member-of)\n" -#: createuser.c:426 +#: createuser.c:428 #, c-format msgid "" " -i, --inherit role inherits privileges of roles it is a\n" @@ -698,57 +698,57 @@ msgstr "" "она\n" " включена (по умолчанию)\n" -#: createuser.c:428 +#: createuser.c:430 #, c-format msgid " -I, --no-inherit role does not inherit privileges\n" msgstr " -I, --no-inherit роль не наследует права\n" -#: createuser.c:429 +#: createuser.c:431 #, c-format msgid " -l, --login role can login (default)\n" msgstr "" " -l, --login роль с правом подключения к серверу (по " "умолчанию)\n" -#: createuser.c:430 +#: createuser.c:432 #, c-format msgid " -L, --no-login role cannot login\n" msgstr " -L, --no-login роль без права подключения\n" -#: createuser.c:431 +#: 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:432 +#: createuser.c:434 #, c-format msgid " -P, --pwprompt assign a password to new role\n" msgstr " -P, --pwprompt назначить пароль новой роли\n" -#: createuser.c:433 +#: createuser.c:435 #, c-format msgid " -r, --createrole role can create new roles\n" msgstr " -r, --createrole роль с правом создания других ролей\n" -#: createuser.c:434 +#: createuser.c:436 #, c-format msgid " -R, --no-createrole role cannot create roles (default)\n" msgstr "" " -R, --no-createrole роль без права создания ролей (по умолчанию)\n" -#: createuser.c:435 +#: createuser.c:437 #, c-format msgid " -s, --superuser role will be superuser\n" msgstr " -s, --superuser роль с полномочиями суперпользователя\n" -#: createuser.c:436 +#: createuser.c:438 #, c-format msgid " -S, --no-superuser role will not be superuser (default)\n" msgstr "" " -S, --no-superuser роль без полномочий суперпользователя (по " "умолчанию)\n" -#: createuser.c:437 +#: createuser.c:439 #, c-format msgid "" " -v, --valid-until=TIMESTAMP\n" @@ -757,7 +757,7 @@ msgstr "" " -v, --valid-until=ДАТА_ВРЕМЯ\n" " дата и время истечения срока пароля для роли\n" -#: createuser.c:440 +#: createuser.c:442 #, c-format msgid "" " --interactive prompt for missing role name and attributes " @@ -767,7 +767,7 @@ msgstr "" " --interactive запрашивать отсутствующие атрибуты и имя роли,\n" " а не использовать значения по умолчанию\n" -#: createuser.c:442 +#: createuser.c:444 #, c-format msgid "" " --bypassrls role can bypass row-level security (RLS) policy\n" @@ -775,7 +775,7 @@ msgstr "" " --bypassrls роль не будет подчиняться политикам защиты на\n" " уровне строк (RLS)\n" -#: createuser.c:443 +#: createuser.c:445 #, c-format msgid "" " --no-bypassrls role cannot bypass row-level security (RLS) " @@ -785,12 +785,12 @@ msgstr "" " --no-bypassrls роль будет подчиняться политикам защиты на\n" " уровне строк (по умолчанию)\n" -#: createuser.c:445 +#: createuser.c:447 #, c-format msgid " --replication role can initiate replication\n" msgstr " --replication роль может инициировать репликацию\n" -#: createuser.c:446 +#: createuser.c:448 #, c-format msgid "" " --no-replication role cannot initiate replication (default)\n" @@ -798,7 +798,7 @@ msgstr "" " --no-replication роль не может инициировать репликацию\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" @@ -820,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" @@ -834,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 " @@ -848,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" @@ -874,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" @@ -888,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" @@ -897,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" @@ -1002,20 +1002,20 @@ msgid " -U, --username=USERNAME user name to connect as\n" msgstr "" " -U, --username=ИМЯ имя пользователя для подключения к серверу\n" -#: reindexdb.c:210 +#: reindexdb.c:213 #, c-format msgid "cannot use multiple jobs to reindex system catalogs" msgstr "" "нельзя задействовать несколько заданий для переиндексирования системных " "каталогов" -#: reindexdb.c:215 +#: reindexdb.c:218 #, c-format msgid "cannot reindex all databases and a specific one at the same time" msgstr "" "нельзя переиндексировать все базы данных и одну конкретную одновременно" -#: reindexdb.c:296 reindexdb.c:303 vacuumdb.c:514 vacuumdb.c:521 vacuumdb.c:528 +#: 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 @@ -1024,37 +1024,37 @@ msgid "" msgstr "" "параметр \"%s\" нельзя использовать с серверами PostgreSQL версии старее %s" -#: reindexdb.c:584 +#: reindexdb.c:604 #, c-format msgid "reindexing of database \"%s\" failed: %s" msgstr "переиндексировать базу данных \"%s\" не удалось: %s" -#: reindexdb.c:588 +#: reindexdb.c:608 #, c-format msgid "reindexing of index \"%s\" in database \"%s\" failed: %s" msgstr "перестроить индекс \"%s\" в базе \"%s\" не удалось: %s" -#: reindexdb.c:592 +#: reindexdb.c:612 #, c-format msgid "reindexing of schema \"%s\" in database \"%s\" failed: %s" msgstr "переиндексировать схему \"%s\" в базе \"%s\" не удалось: %s" -#: reindexdb.c:596 +#: reindexdb.c:616 #, c-format msgid "reindexing of system catalogs in database \"%s\" failed: %s" msgstr "переиндексировать системные каталоги в базе \"%s\" не удалось: %s" -#: reindexdb.c:600 +#: reindexdb.c:620 #, c-format msgid "reindexing of table \"%s\" in database \"%s\" failed: %s" msgstr "переиндексировать таблицу \"%s\" в базе \"%s\" не удалось: %s" -#: reindexdb.c:828 +#: reindexdb.c:843 #, c-format msgid "%s: reindexing database \"%s\"\n" msgstr "%s: переиндексация базы данных \"%s\"\n" -#: reindexdb.c:871 +#: reindexdb.c:886 #, c-format msgid "" "%s reindexes a PostgreSQL database.\n" @@ -1063,29 +1063,29 @@ msgstr "" "%s переиндексирует базу данных PostgreSQL.\n" "\n" -#: reindexdb.c:875 +#: reindexdb.c:890 #, c-format msgid " -a, --all reindex all databases\n" msgstr " -a, --all переиндексировать все базы данных\n" -#: reindexdb.c:876 +#: reindexdb.c:891 #, c-format msgid " --concurrently reindex concurrently\n" msgstr "" " --concurrently переиндексировать в неблокирующем режиме\n" -#: reindexdb.c:877 +#: reindexdb.c:892 #, c-format msgid " -d, --dbname=DBNAME database to reindex\n" msgstr " -d, --dbname=БД имя базы для переиндексации\n" -#: reindexdb.c:879 +#: reindexdb.c:894 #, c-format msgid " -i, --index=INDEX recreate specific index(es) only\n" msgstr "" " -i, --index=ИНДЕКС пересоздать только указанный индекс(ы)\n" -#: reindexdb.c:880 +#: reindexdb.c:895 #, c-format msgid "" " -j, --jobs=NUM use this many concurrent connections to " @@ -1094,24 +1094,24 @@ msgstr "" " -j, --jobs=ЧИСЛО запускать для переиндексации заданное число\n" " заданий\n" -#: reindexdb.c:881 +#: reindexdb.c:896 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet не выводить сообщения\n" -#: reindexdb.c:882 +#: reindexdb.c:897 #, c-format msgid " -s, --system reindex system catalogs only\n" msgstr "" " -s, --system переиндексировать только системные каталоги\n" -#: reindexdb.c:883 +#: reindexdb.c:898 #, c-format msgid " -S, --schema=SCHEMA reindex specific schema(s) only\n" msgstr "" " -S, --schema=СХЕМА переиндексировать только указанную схему(ы)\n" -#: reindexdb.c:884 +#: reindexdb.c:899 #, c-format msgid " -t, --table=TABLE reindex specific table(s) only\n" msgstr "" @@ -1119,19 +1119,19 @@ msgstr "" "таблицу(ы)\n" # well-spelled: ПРОСТР -#: reindexdb.c:885 +#: reindexdb.c:900 #, c-format msgid " --tablespace=TABLESPACE tablespace where indexes are rebuilt\n" msgstr "" " --tablespace=ТАБЛ_ПРОСТР табличное пространство, в котором будут\n" " перестраиваться индексы\n" -#: reindexdb.c:886 +#: reindexdb.c:901 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose выводить исчерпывающие сообщения\n" -#: reindexdb.c:896 +#: reindexdb.c:911 #, c-format msgid "" "\n" @@ -1209,17 +1209,17 @@ msgstr "%s: обработка базы данных \"%s\": %s\n" msgid "%s: vacuuming database \"%s\"\n" msgstr "%s: очистка базы данных \"%s\"\n" -#: vacuumdb.c:1158 +#: vacuumdb.c:1159 #, c-format msgid "vacuuming of table \"%s\" in database \"%s\" failed: %s" msgstr "очистить таблицу \"%s\" в базе \"%s\" не удалось: %s" -#: vacuumdb.c:1161 +#: vacuumdb.c:1162 #, c-format msgid "vacuuming of database \"%s\" failed: %s" msgstr "очистить базу данных \"%s\" не удалось: %s" -#: vacuumdb.c:1169 +#: vacuumdb.c:1170 #, c-format msgid "" "%s cleans and analyzes a PostgreSQL database.\n" @@ -1228,12 +1228,12 @@ msgstr "" "%s очищает и анализирует базу данных PostgreSQL.\n" "\n" -#: vacuumdb.c:1173 +#: vacuumdb.c:1174 #, c-format msgid " -a, --all vacuum all databases\n" msgstr " -a, --all очистить все базы данных\n" -#: vacuumdb.c:1174 +#: vacuumdb.c:1175 #, c-format msgid " --buffer-usage-limit=SIZE size of ring buffer used for vacuum\n" msgstr "" @@ -1241,18 +1241,18 @@ msgstr "" "при\n" " очистке\n" -#: vacuumdb.c:1175 +#: vacuumdb.c:1176 #, c-format msgid " -d, --dbname=DBNAME database to vacuum\n" msgstr " -d, --dbname=ИМЯ_БД очистить указанную базу данных\n" -#: vacuumdb.c:1176 +#: vacuumdb.c:1177 #, c-format msgid " --disable-page-skipping disable all page-skipping behavior\n" msgstr "" " --disable-page-skipping исключить все варианты пропуска страниц\n" -#: vacuumdb.c:1177 +#: vacuumdb.c:1178 #, c-format msgid "" " -e, --echo show the commands being sent to the " @@ -1260,19 +1260,19 @@ msgid "" msgstr "" " -e, --echo отображать команды, отправляемые серверу\n" -#: vacuumdb.c:1178 +#: vacuumdb.c:1179 #, c-format msgid " -f, --full do full vacuuming\n" msgstr " -f, --full произвести полную очистку\n" -#: vacuumdb.c:1179 +#: vacuumdb.c:1180 #, c-format msgid " -F, --freeze freeze row transaction information\n" msgstr "" " -F, --freeze заморозить информацию о транзакциях в " "строках\n" -#: vacuumdb.c:1180 +#: vacuumdb.c:1181 #, c-format msgid "" " --force-index-cleanup always remove index entries that point to " @@ -1282,7 +1282,7 @@ msgstr "" "указывающие\n" " на мёртвые кортежи\n" -#: vacuumdb.c:1181 +#: vacuumdb.c:1182 #, c-format msgid "" " -j, --jobs=NUM use this many concurrent connections to " @@ -1291,7 +1291,7 @@ msgstr "" " -j, --jobs=ЧИСЛО запускать для очистки заданное число " "заданий\n" -#: vacuumdb.c:1182 +#: vacuumdb.c:1183 #, c-format msgid "" " --min-mxid-age=MXID_AGE minimum multixact ID age of tables to " @@ -1300,7 +1300,7 @@ msgstr "" " --min-mxid-age=ВОЗРАСТ минимальный возраст мультитранзакций для\n" " таблиц, подлежащих очистке\n" -#: vacuumdb.c:1183 +#: vacuumdb.c:1184 #, c-format msgid "" " --min-xid-age=XID_AGE minimum transaction ID age of tables to " @@ -1310,7 +1310,7 @@ msgstr "" "таблиц,\n" " подлежащих очистке\n" -#: vacuumdb.c:1184 +#: vacuumdb.c:1185 #, c-format msgid "" " --no-index-cleanup don't remove index entries that point to " @@ -1319,12 +1319,12 @@ msgstr "" " --no-index-cleanup не удалять элементы индекса, указывающие\n" " на мёртвые кортежи\n" -#: vacuumdb.c:1185 +#: vacuumdb.c:1186 #, c-format msgid " --no-process-main skip the main relation\n" msgstr " --no-process-main пропускать основное отношение\n" -#: vacuumdb.c:1186 +#: vacuumdb.c:1187 #, c-format msgid "" " --no-process-toast skip the TOAST table associated with the " @@ -1333,7 +1333,7 @@ msgstr "" " --no-process-toast пропускать TOAST-таблицу, связанную\n" " с очищаемой таблицей\n" -#: vacuumdb.c:1187 +#: vacuumdb.c:1188 #, c-format msgid "" " --no-truncate don't truncate empty pages at the end of " @@ -1342,7 +1342,7 @@ msgstr "" " --no-truncate не отсекать пустые страницы в конце " "таблицы\n" -#: vacuumdb.c:1188 +#: vacuumdb.c:1189 #, c-format msgid "" " -n, --schema=SCHEMA vacuum tables in the specified schema(s) " @@ -1351,7 +1351,7 @@ msgstr "" " -n, --schema=СХЕМА очищать таблицы только в указанной " "схеме(ах)\n" -#: vacuumdb.c:1189 +#: vacuumdb.c:1190 #, c-format msgid "" " -N, --exclude-schema=SCHEMA do not vacuum tables in the specified " @@ -1359,7 +1359,7 @@ msgid "" msgstr "" " -N, --exclude-schema=СХЕМА не очищать таблицы в указанной схеме(ах)\n" -#: vacuumdb.c:1190 +#: vacuumdb.c:1191 #, c-format msgid "" " -P, --parallel=PARALLEL_WORKERS use this many background workers for " @@ -1369,12 +1369,12 @@ msgstr "" " по возможности использовать для очистки\n" " заданное число фоновых процессов\n" -#: vacuumdb.c:1191 +#: vacuumdb.c:1192 #, c-format msgid " -q, --quiet don't write any messages\n" msgstr " -q, --quiet не выводить сообщения\n" -#: vacuumdb.c:1192 +#: vacuumdb.c:1193 #, c-format msgid "" " --skip-locked skip relations that cannot be immediately " @@ -1383,29 +1383,29 @@ msgstr "" " --skip-locked пропускать отношения, которые не удаётся\n" " заблокировать немедленно\n" -#: vacuumdb.c:1193 +#: vacuumdb.c:1194 #, c-format msgid " -t, --table='TABLE[(COLUMNS)]' vacuum specific table(s) only\n" msgstr "" " -t, --table='ТАБЛ[(СТОЛБЦЫ)]' очистить только указанную таблицу(ы)\n" -#: vacuumdb.c:1194 +#: vacuumdb.c:1195 #, c-format msgid " -v, --verbose write a lot of output\n" msgstr " -v, --verbose выводить исчерпывающие сообщения\n" -#: vacuumdb.c:1195 +#: vacuumdb.c:1196 #, c-format msgid "" " -V, --version output version information, then exit\n" msgstr " -V, --version показать версию и выйти\n" -#: vacuumdb.c:1196 +#: vacuumdb.c:1197 #, c-format msgid " -z, --analyze update optimizer statistics\n" msgstr " -z, --analyze обновить статистику оптимизатора\n" -#: vacuumdb.c:1197 +#: vacuumdb.c:1198 #, c-format msgid "" " -Z, --analyze-only only update optimizer statistics; no " @@ -1414,7 +1414,7 @@ msgstr "" " -Z, --analyze-only только обновить статистику оптимизатора,\n" " не очищать БД\n" -#: vacuumdb.c:1198 +#: vacuumdb.c:1199 #, c-format msgid "" " --analyze-in-stages only update optimizer statistics, in " @@ -1426,12 +1426,12 @@ msgstr "" " (в несколько проходов для большей " "скорости), без очистки\n" -#: vacuumdb.c:1200 +#: vacuumdb.c:1201 #, c-format msgid " -?, --help show this help, then exit\n" msgstr " -?, --help показать эту справку и выйти\n" -#: vacuumdb.c:1208 +#: vacuumdb.c:1209 #, c-format msgid "" "\n" diff --git a/src/bin/scripts/reindexdb.c b/src/bin/scripts/reindexdb.c index e736b2baccc06..2ff16140ad880 100644 --- a/src/bin/scripts/reindexdb.c +++ b/src/bin/scripts/reindexdb.c @@ -50,10 +50,13 @@ static void reindex_all_databases(ConnParams *cparams, bool syscatalog, SimpleStringList *schemas, SimpleStringList *tables, SimpleStringList *indexes); -static void run_reindex_command(PGconn *conn, ReindexType type, +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); @@ -285,7 +288,6 @@ reindex_one_database(ConnParams *cparams, ReindexType type, ParallelSlotArray *sa; bool failed = false; int items_count = 0; - char *prev_index_table_name = NULL; ParallelSlot *free_slot = NULL; conn = connectDatabase(cparams, progname, echo, false, true); @@ -421,8 +423,8 @@ reindex_one_database(ConnParams *cparams, ReindexType type, cell = process_list->head; do { + PQExpBufferData sql; const char *objname = cell->val; - bool need_new_slot = true; if (CancelRequested) { @@ -430,35 +432,45 @@ reindex_one_database(ConnParams *cparams, ReindexType type, goto finish; } - /* - * 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 don't switch the job as soon as the index belongs to the same - * table as the previous one. - */ - if (parallel && process_type == REINDEX_INDEX) + free_slot = ParallelSlotsGetIdle(sa, NULL); + if (!free_slot) { - if (prev_index_table_name != NULL && - strcmp(prev_index_table_name, indices_tables_cell->val) == 0) - need_new_slot = false; - prev_index_table_name = indices_tables_cell->val; - indices_tables_cell = indices_tables_cell->next; + failed = true; + goto finish; } - if (need_new_slot) + ParallelSlotSetHandler(free_slot, TableCommandResultHandler, NULL); + initPQExpBuffer(&sql); + if (parallel && process_type == REINDEX_INDEX) { - free_slot = ParallelSlotsGetIdle(sa, NULL); - if (!free_slot) + /* + * 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) { - failed = true; - goto finish; + 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); } - - ParallelSlotSetHandler(free_slot, TableCommandResultHandler, NULL); + 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); @@ -486,57 +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, + 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; } @@ -546,37 +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, + 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) { @@ -603,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); } /* diff --git a/src/bin/scripts/t/020_createdb.pl b/src/bin/scripts/t/020_createdb.pl index 4a0e2c883a11e..160769d156e28 100644 --- a/src/bin/scripts/t/020_createdb.pl +++ b/src/bin/scripts/t/020_createdb.pl @@ -8,6 +8,9 @@ use PostgreSQL::Test::Utils; use Test::More; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_smgr + 'tries to use FILE_COPY strategy for database creation with encrypted objects in the template'; + program_help_ok('createdb'); program_version_ok('createdb'); program_options_handling_ok('createdb'); diff --git a/src/common/jsonapi.c b/src/common/jsonapi.c index 2527dbe1da921..cd34986d1a41d 100644 --- a/src/common/jsonapi.c +++ b/src/common/jsonapi.c @@ -1689,8 +1689,11 @@ json_lex_string(JsonLexContext *lex) } while (0) #define FAIL_AT_CHAR_END(code) \ do { \ - const char *term = s + pg_encoding_mblen(lex->input_encoding, s); \ - lex->token_terminator = (term <= end) ? term : end; \ + 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) diff --git a/src/common/scram-common.c b/src/common/scram-common.c index 51cc12e8c3e33..c36ed7124c2a2 100644 --- a/src/common/scram-common.c +++ b/src/common/scram-common.c @@ -74,7 +74,7 @@ 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 /* diff --git a/src/common/wchar.c b/src/common/wchar.c index 40588beb48d86..402ad281eb608 100644 --- a/src/common/wchar.c +++ b/src/common/wchar.c @@ -12,6 +12,8 @@ */ #include "c.h" +#include + #include "mb/pg_wchar.h" #include "utils/ascii.h" @@ -2107,10 +2109,27 @@ const pg_wchar_tbl pg_wchar_table[] = { /* * 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) @@ -2121,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) diff --git a/src/include/access/amapi.h b/src/include/access/amapi.h index d3e5e5d591882..098014508160e 100644 --- a/src/include/access/amapi.h +++ b/src/include/access/amapi.h @@ -271,7 +271,7 @@ typedef struct IndexAmRoutine ambuild_function ambuild; ambuildempty_function ambuildempty; aminsert_function aminsert; - aminsertcleanup_function aminsertcleanup; + aminsertcleanup_function aminsertcleanup; /* can be NULL */ ambulkdelete_function ambulkdelete; amvacuumcleanup_function amvacuumcleanup; amcanreturn_function amcanreturn; /* can be NULL */ diff --git a/src/include/access/xlog_smgr.h b/src/include/access/xlog_smgr.h index 808a07f502fc1..b1f7c4c425f48 100644 --- a/src/include/access/xlog_smgr.h +++ b/src/include/access/xlog_smgr.h @@ -12,12 +12,12 @@ typedef struct XLogSmgr TimeLineID tli, XLogSegNo segno, int segSize); ssize_t (*seg_write) (int fd, const void *buf, size_t count, off_t offset, - TimeLineID tli, XLogSegNo segno); + TimeLineID tli, XLogSegNo segno, int segSize); } XLogSmgr; static inline ssize_t default_seg_write(int fd, const void *buf, size_t count, off_t offset, - TimeLineID tli, XLogSegNo segno) + TimeLineID tli, XLogSegNo segno, int segSize) { return pg_pwrite(fd, buf, count, offset); } diff --git a/src/include/catalog/heap.h b/src/include/catalog/heap.h index fc5a13f0b8318..1e376579b0f33 100644 --- a/src/include/catalog/heap.h +++ b/src/include/catalog/heap.h @@ -29,7 +29,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; @@ -117,6 +117,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/pg_subscription_rel.h b/src/include/catalog/pg_subscription_rel.h index 8244ad537aea9..0afda8832197e 100644 --- a/src/include/catalog/pg_subscription_rel.h +++ b/src/include/catalog/pg_subscription_rel.h @@ -86,6 +86,8 @@ extern void AddSubscriptionRelState(Oid subid, Oid relid, char state, XLogRecPtr sublsn, bool retain_lock); extern void UpdateSubscriptionRelState(Oid subid, Oid relid, char state, XLogRecPtr sublsn); +extern void UpdateSubscriptionRelStateEx(Oid subid, Oid relid, char state, + XLogRecPtr sublsn, bool already_locked); extern char GetSubscriptionRelState(Oid subid, Oid relid, XLogRecPtr *sublsn); extern void RemoveSubscriptionRel(Oid subid, Oid relid); diff --git a/src/include/commands/trigger.h b/src/include/commands/trigger.h index 8a5a9fe642274..f9e4dc4f3cdbc 100644 --- a/src/include/commands/trigger.h +++ b/src/include/commands/trigger.h @@ -206,6 +206,15 @@ extern void ExecBSDeleteTriggers(EState *estate, extern void ExecASDeleteTriggers(EState *estate, ResultRelInfo *relinfo, TransitionCaptureState *transition_capture); +extern bool ExecBRDeleteTriggersNew(EState *estate, + EPQState *epqstate, + ResultRelInfo *relinfo, + ItemPointer tupleid, + HeapTuple fdw_trigtuple, + TupleTableSlot **epqslot, + TM_Result *tmresult, + TM_FailureData *tmfd, + bool is_merge_delete); extern bool ExecBRDeleteTriggers(EState *estate, EPQState *epqstate, ResultRelInfo *relinfo, @@ -228,6 +237,15 @@ extern void ExecBSUpdateTriggers(EState *estate, extern void ExecASUpdateTriggers(EState *estate, ResultRelInfo *relinfo, TransitionCaptureState *transition_capture); +extern bool ExecBRUpdateTriggersNew(EState *estate, + EPQState *epqstate, + ResultRelInfo *relinfo, + ItemPointer tupleid, + HeapTuple fdw_trigtuple, + TupleTableSlot *newslot, + TM_Result *tmresult, + TM_FailureData *tmfd, + bool is_merge_update); extern bool ExecBRUpdateTriggers(EState *estate, EPQState *epqstate, ResultRelInfo *relinfo, diff --git a/src/include/common/hashfn_unstable.h b/src/include/common/hashfn_unstable.h index e67a4d3158d08..101f118077e37 100644 --- a/src/include/common/hashfn_unstable.h +++ b/src/include/common/hashfn_unstable.h @@ -14,8 +14,6 @@ #ifndef HASHFN_UNSTABLE_H #define HASHFN_UNSTABLE_H -#include "port/pg_bitutils.h" -#include "port/pg_bswap.h" /* * fasthash is a modification of code taken from @@ -262,26 +260,13 @@ fasthash_accum_cstring_aligned(fasthash_state *hs, const char *str) /* * For every chunk of input, check for zero bytes before mixing into the - * hash. The chunk with zeros must contain the NUL terminator. We arrange - * so that zero_byte_low tells us not only that a zero exists, but also - * where it is, so we can hash the remainder of the string. - * - * The haszero64 calculation will set bits corresponding to the lowest - * byte where a zero exists, so that suffices for little-endian machines. - * For big-endian machines, we would need bits set for the highest zero - * byte in the chunk, since the trailing junk past the terminator could - * contain additional zeros. haszero64 does not give us that, so we - * byteswap the chunk first. + * hash. The chunk with zeros must contain the NUL terminator. */ for (;;) { uint64 chunk = *(uint64 *) str; -#ifdef WORDS_BIGENDIAN - zero_byte_low = haszero64(pg_bswap64(chunk)); -#else zero_byte_low = haszero64(chunk); -#endif if (zero_byte_low) break; @@ -290,13 +275,8 @@ fasthash_accum_cstring_aligned(fasthash_state *hs, const char *str) str += FH_SIZEOF_ACCUM; } - /* - * The byte corresponding to the NUL will be 0x80, so the rightmost bit - * position will be in the range 7, 15, ..., 63. Turn this into byte - * position by dividing by 8. - */ - remainder = pg_rightmost_one_pos64(zero_byte_low) / BITS_PER_BYTE; - fasthash_accum(hs, str, remainder); + /* mix in remaining bytes */ + remainder = fasthash_accum_cstring_unaligned(hs, str); str += remainder; return str - start; diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h index 9770752ea3c1b..7e6e366ceacd6 100644 --- a/src/include/executor/executor.h +++ b/src/include/executor/executor.h @@ -210,6 +210,7 @@ extern void standard_ExecutorEnd(QueryDesc *queryDesc); extern void ExecutorRewind(QueryDesc *queryDesc); extern bool ExecCheckPermissions(List *rangeTable, List *rteperminfos, bool ereport_on_violation); +extern bool ExecCheckOneRelPerms(RTEPermissionInfo *perminfo); extern void CheckValidResultRel(ResultRelInfo *resultRelInfo, CmdType operation, List *mergeActions); extern void InitResultRelInfo(ResultRelInfo *resultRelInfo, diff --git a/src/include/mb/pg_wchar.h b/src/include/mb/pg_wchar.h index 08f6fa6e0858f..e5babf3e3579a 100644 --- a/src/include/mb/pg_wchar.h +++ b/src/include/mb/pg_wchar.h @@ -664,6 +664,8 @@ extern int pg_valid_server_encoding_id(int encoding); */ 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); diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index 17b0ec513864a..0696ec05b1629 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -164,7 +164,7 @@ typedef struct ExprState * UniqueProcs * UniqueStrats * Unique is it a unique index? - * OpclassOptions opclass-specific options, or NULL if none + * NullsNotDistinct is NULLS NOT DISTINCT? * ReadyForInserts is it valid for inserts? * CheckedUnchanged IndexUnchanged status determined yet? * IndexUnchanged aminsert hint, cached for retail inserts diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 0ed589426af86..67c90a2bd328d 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -945,7 +945,7 @@ typedef struct PartitionRangeDatum typedef struct SinglePartitionSpec { NodeTag type; -} SinglePartitionSpec; +} SinglePartitionSpec; /* * PartitionCmd - info for ALTER TABLE/INDEX ATTACH/DETACH PARTITION commands diff --git a/src/include/nodes/pathnodes.h b/src/include/nodes/pathnodes.h index 50b09781f25ca..576f1c7e9b911 100644 --- a/src/include/nodes/pathnodes.h +++ b/src/include/nodes/pathnodes.h @@ -1101,8 +1101,7 @@ typedef struct IndexOptInfo IndexOptInfo; #define HAVE_INDEXOPTINFO_TYPEDEF 1 #endif -struct IndexPath; /* avoid including pathnodes.h here */ -struct PlannerInfo; /* avoid including pathnodes.h here */ +struct IndexPath; /* forward declaration */ struct IndexOptInfo { diff --git a/src/include/optimizer/plancat.h b/src/include/optimizer/plancat.h index f59b77b10125c..1206f60a715ba 100644 --- a/src/include/optimizer/plancat.h +++ b/src/include/optimizer/plancat.h @@ -72,6 +72,8 @@ extern double get_function_rows(PlannerInfo *root, Oid funcid, Node *node); extern bool has_row_triggers(PlannerInfo *root, Index rti, CmdType event); +extern bool has_transition_tables(PlannerInfo *root, Index rti, CmdType event); + extern bool has_stored_generated_columns(PlannerInfo *root, Index rti); extern Bitmapset *get_dependent_generated_columns(PlannerInfo *root, Index rti, diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index aa94e038953cf..65d95d0775ff7 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -103,6 +103,10 @@ `LLVMCreatePerfJITEventListener', and to 0 if you don't. */ #undef HAVE_DECL_LLVMCREATEPERFJITEVENTLISTENER +/* Define to 1 if you have the declaration of `memset_s', and to 0 if you + don't. */ +#undef HAVE_DECL_MEMSET_S + /* Define to 1 if you have the declaration of `posix_fadvise', and to 0 if you don't. */ #undef HAVE_DECL_POSIX_FADVISE @@ -115,6 +119,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 @@ -300,9 +308,6 @@ /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H -/* Define to 1 if you have the `memset_s' function. */ -#undef HAVE_MEMSET_S - /* Define to 1 if you have the `mkdtemp' function. */ #undef HAVE_MKDTEMP @@ -396,9 +401,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 diff --git a/src/include/pg_config_manual.h b/src/include/pg_config_manual.h index 78353b03d70cb..588d6e987cd30 100644 --- a/src/include/pg_config_manual.h +++ b/src/include/pg_config_manual.h @@ -384,4 +384,4 @@ */ /* #define TRACE_SYNCSCAN */ -#define PERCONA_API_VERSION 1 +#define PERCONA_API_VERSION 2 diff --git a/src/include/port/pg_iovec.h b/src/include/port/pg_iovec.h index e5fe677b3711e..10fecdd42ac37 100644 --- a/src/include/port/pg_iovec.h +++ b/src/include/port/pg_iovec.h @@ -21,9 +21,6 @@ #else -/* POSIX requires at least 16 as a maximum iovcnt. */ -#define IOV_MAX 16 - /* Define our own POSIX-compatible iovec struct. */ struct iovec { @@ -33,6 +30,15 @@ struct iovec #endif +/* + * If didn't define IOV_MAX, define our own. X/Open requires at + * least 16. (GNU Hurd apparently feel that they're not bound by X/Open, + * because they don't define this symbol at all.) + */ +#ifndef IOV_MAX +#define IOV_MAX 16 +#endif + /* Define a reasonable maximum that is safe to use on the stack. */ #define PG_IOV_MAX Min(IOV_MAX, 32) diff --git a/src/include/port/solaris.h b/src/include/port/solaris.h index e63a3bd824d6d..8ff40007c7f6a 100644 --- a/src/include/port/solaris.h +++ b/src/include/port/solaris.h @@ -24,3 +24,12 @@ #if defined(__i386__) #include #endif + +/* + * On original Solaris, PAM conversation procs lack a "const" in their + * declaration; but recent OpenIndiana versions put it there by default. + * The least messy way to deal with this is to define _PAM_LEGACY_NONCONST, + * which causes OpenIndiana to declare pam_conv per the Solaris tradition, + * and also use that symbol to control omitting the "const" in our own code. + */ +#define _PAM_LEGACY_NONCONST 1 diff --git a/src/include/replication/reorderbuffer.h b/src/include/replication/reorderbuffer.h index 7de50462dcfa1..0cfa9005141a1 100644 --- a/src/include/replication/reorderbuffer.h +++ b/src/include/replication/reorderbuffer.h @@ -159,15 +159,16 @@ typedef struct ReorderBufferChange } ReorderBufferChange; /* ReorderBufferTXN txn_flags */ -#define RBTXN_HAS_CATALOG_CHANGES 0x0001 -#define RBTXN_IS_SUBXACT 0x0002 -#define RBTXN_IS_SERIALIZED 0x0004 -#define RBTXN_IS_SERIALIZED_CLEAR 0x0008 -#define RBTXN_IS_STREAMED 0x0010 -#define RBTXN_HAS_PARTIAL_CHANGE 0x0020 -#define RBTXN_PREPARE 0x0040 -#define RBTXN_SKIPPED_PREPARE 0x0080 -#define RBTXN_HAS_STREAMABLE_CHANGE 0x0100 +#define RBTXN_HAS_CATALOG_CHANGES 0x0001 +#define RBTXN_IS_SUBXACT 0x0002 +#define RBTXN_IS_SERIALIZED 0x0004 +#define RBTXN_IS_SERIALIZED_CLEAR 0x0008 +#define RBTXN_IS_STREAMED 0x0010 +#define RBTXN_HAS_PARTIAL_CHANGE 0x0020 +#define RBTXN_PREPARE 0x0040 +#define RBTXN_SKIPPED_PREPARE 0x0080 +#define RBTXN_HAS_STREAMABLE_CHANGE 0x0100 +#define RBTXN_DISTR_INVAL_OVERFLOWED 0x0200 /* Does the transaction have catalog changes? */ #define rbtxn_has_catalog_changes(txn) \ @@ -231,6 +232,12 @@ typedef struct ReorderBufferChange ((txn)->txn_flags & RBTXN_SKIPPED_PREPARE) != 0 \ ) +/* Is the array of distributed inval messages overflowed? */ +#define rbtxn_distr_inval_overflowed(txn) \ +( \ + ((txn)->txn_flags & RBTXN_DISTR_INVAL_OVERFLOWED) != 0 \ +) + /* Is this a top-level transaction? */ #define rbtxn_is_toptxn(txn) \ ( \ @@ -422,6 +429,12 @@ typedef struct ReorderBufferTXN * Private data pointer of the output plugin. */ void *output_plugin_private; + + /* + * Stores cache invalidation messages distributed by other transactions. + */ + uint32 ninvalidations_distributed; + SharedInvalidationMessage *invalidations_distributed; } ReorderBufferTXN; /* so we can define the callbacks used inside struct ReorderBuffer itself */ @@ -709,6 +722,9 @@ extern void ReorderBufferAddNewTupleCids(ReorderBuffer *rb, TransactionId xid, CommandId cmin, CommandId cmax, CommandId combocid); extern void ReorderBufferAddInvalidations(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn, Size nmsgs, SharedInvalidationMessage *msgs); +extern void ReorderBufferAddDistributedInvalidations(ReorderBuffer *rb, TransactionId xid, + XLogRecPtr lsn, Size nmsgs, + SharedInvalidationMessage *msgs); extern void ReorderBufferImmediateInvalidation(ReorderBuffer *rb, uint32 ninvalidations, SharedInvalidationMessage *invalidations); extern void ReorderBufferProcessXid(ReorderBuffer *rb, TransactionId xid, XLogRecPtr lsn); @@ -729,6 +745,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/walsender_private.h b/src/include/replication/walsender_private.h index cf32ac2488a8d..443644bae1b73 100644 --- a/src/include/replication/walsender_private.h +++ b/src/include/replication/walsender_private.h @@ -103,11 +103,11 @@ 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; @@ -123,6 +123,21 @@ typedef struct 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/utils/guc_hooks.h b/src/include/utils/guc_hooks.h index 8fd91af3887f7..1babff78bf35c 100644 --- a/src/include/utils/guc_hooks.h +++ b/src/include/utils/guc_hooks.h @@ -86,8 +86,6 @@ 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); diff --git a/src/include/utils/percona.h b/src/include/utils/percona.h index 87bad00df784a..e8de53618c551 100644 --- a/src/include/utils/percona.h +++ b/src/include/utils/percona.h @@ -14,16 +14,13 @@ extern const PGDLLIMPORT int percona_api_version; -static inline bool +static inline void check_percona_api_version(void) { if (PERCONA_API_VERSION != percona_api_version) { elog(FATAL, "Percona API version mismatch, the extension was built against a different PostgreSQL version!"); - return false; } - - return true; } #endif diff --git a/src/include/utils/pg_locale.h b/src/include/utils/pg_locale.h index 040968d6ff295..0bc93142e9121 100644 --- a/src/include/utils/pg_locale.h +++ b/src/include/utils/pg_locale.h @@ -16,6 +16,11 @@ #include #endif #ifdef USE_ICU +/* only include the C APIs, to avoid errors in cpluspluscheck */ +#undef U_SHOW_CPLUSPLUS_API +#define U_SHOW_CPLUSPLUS_API 0 +#undef U_SHOW_CPLUSPLUS_HEADER_API +#define U_SHOW_CPLUSPLUS_HEADER_API 0 #include #endif diff --git a/src/include/utils/selfuncs.h b/src/include/utils/selfuncs.h index f2563ad1cb3a8..0de77aeaeabc1 100644 --- a/src/include/utils/selfuncs.h +++ b/src/include/utils/selfuncs.h @@ -95,7 +95,8 @@ typedef struct VariableStatData Oid atttype; /* actual type (after stripping relabel) */ int32 atttypmod; /* actual typmod (after stripping relabel) */ bool isunique; /* matches unique index or DISTINCT clause */ - bool acl_ok; /* result of ACL check on table or column */ + bool acl_ok; /* true if user has SELECT privilege on all + * rows from the table or column */ } VariableStatData; #define ReleaseVariableStats(vardata) \ @@ -152,6 +153,7 @@ extern PGDLLIMPORT get_index_stats_hook_type get_index_stats_hook; extern void examine_variable(PlannerInfo *root, Node *node, int varRelid, VariableStatData *vardata); +extern bool all_rows_selectable(PlannerInfo *root, Index varno, Bitmapset *varattnos); extern bool statistic_proc_security_check(VariableStatData *vardata, Oid func_oid); extern bool get_restriction_variable(PlannerInfo *root, List *args, int varRelid, diff --git a/src/interfaces/ecpg/ecpglib/connect.c b/src/interfaces/ecpg/ecpglib/connect.c index 8afb1f0a26fba..b912441f12e31 100644 --- a/src/interfaces/ecpg/ecpglib/connect.c +++ b/src/interfaces/ecpg/ecpglib/connect.c @@ -58,7 +58,12 @@ ecpg_get_connection_nr(const char *connection_name) for (con = all_connections; con != NULL; con = con->next) { - if (strcmp(connection_name, con->name) == 0) + /* + * Check for the case of a NULL connection name, stored as such in + * the connection information by ECPGconnect() when the database + * name is not specified by its caller. + */ + if (con->name != NULL && strcmp(connection_name, con->name) == 0) break; } ret = con; diff --git a/src/interfaces/ecpg/ecpglib/po/ru.po b/src/interfaces/ecpg/ecpglib/po/ru.po index 91b23dbc9fc07..bfb49a07e31b9 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: 2024-09-02 09:29+0300\n" +"POT-Creation-Date: 2025-08-02 11:37+0300\n" "PO-Revision-Date: 2019-09-09 13:30+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -17,11 +17,11 @@ 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" -#: connect.c:221 +#: connect.c:226 msgid "empty message text" msgstr "пустое сообщение" -#: connect.c:386 connect.c:645 +#: connect.c:391 connect.c:650 msgid "" msgstr "<ПО_УМОЛЧАНИЮ>" diff --git a/src/interfaces/ecpg/preproc/po/ja.po b/src/interfaces/ecpg/preproc/po/ja.po index 79d5fe498a9e6..df2902110f9a4 100644 --- a/src/interfaces/ecpg/preproc/po/ja.po +++ b/src/interfaces/ecpg/preproc/po/ja.po @@ -6,8 +6,8 @@ msgid "" msgstr "" "Project-Id-Version: ecpg (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-10-17 09:46+0900\n" -"PO-Revision-Date: 2024-10-17 11:54+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" @@ -17,42 +17,42 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\n" -#: descriptor.c:63 +#: descriptor.c:64 #, c-format msgid "variable \"%s\" must have a numeric type" msgstr "変数\"%s\"は数値型でなければなりません" -#: descriptor.c:119 descriptor.c:149 +#: descriptor.c:124 descriptor.c:155 #, c-format msgid "descriptor %s bound to connection %s does not exist" msgstr "接続%2$sに関連付けられている記述子%1$sは存在しません" -#: descriptor.c:121 descriptor.c:151 +#: descriptor.c:126 descriptor.c:157 #, c-format msgid "descriptor %s bound to the default connection does not exist" msgstr "デフォルト接続に関連付けられている記述子%sは存在しません" -#: descriptor.c:166 descriptor.c:218 +#: descriptor.c:172 descriptor.c:224 #, c-format msgid "descriptor header item \"%d\" does not exist" msgstr "記述子ヘッダ項目%dは存在しません" -#: descriptor.c:188 +#: descriptor.c:194 #, c-format msgid "nullable is always 1" msgstr "nullableは常に1です" -#: descriptor.c:191 +#: descriptor.c:197 #, c-format msgid "key_member is always 0" msgstr "key_memberは常に0です" -#: descriptor.c:285 +#: descriptor.c:291 #, c-format msgid "descriptor item \"%s\" is not implemented" msgstr "記述子項目%sは実装されていません" -#: descriptor.c:295 +#: descriptor.c:301 #, c-format msgid "descriptor item \"%s\" cannot be set" msgstr "記述子項目%sは設定できません" @@ -231,7 +231,7 @@ msgstr "%s: 入力ファイルが指定されていません\n" msgid "cursor \"%s\" has been declared but not opened" msgstr "カーソル%sは宣言されましたが、オープンされていません" -#: ecpg.c:504 +#: ecpg.c:504 preproc.y:130 #, c-format msgid "could not remove output file \"%s\"\n" msgstr "出力ファイル\"%s\"を削除できませんでした\n" @@ -241,393 +241,403 @@ msgstr "出力ファイル\"%s\"を削除できませんでした\n" msgid "unterminated /* comment" msgstr "/*コメントが閉じていません" -#: pgc.l:560 +#: pgc.l:559 #, c-format msgid "unterminated bit string literal" msgstr "ビット文字列リテラルの終端がありません" -#: pgc.l:570 +#: pgc.l:567 #, c-format msgid "unterminated hexadecimal string literal" msgstr "16進数文字列リテラルの終端がありません" -#: pgc.l:644 +#: pgc.l:642 #, c-format msgid "invalid bit string literal" msgstr "無効なビット列リテラルです" -#: pgc.l:649 +#: pgc.l:647 #, c-format msgid "invalid hexadecimal string literal" msgstr "不正な16進数文字列リテラル" -#: pgc.l:667 +#: pgc.l:665 #, c-format msgid "unhandled previous state in xqs\n" msgstr "xqsの中で処理されない前ステート\n" -#: pgc.l:700 pgc.l:820 +#: pgc.l:691 pgc.l:800 #, c-format msgid "unterminated quoted string" msgstr "文字列の引用符が閉じていません" -#: pgc.l:753 +#: pgc.l:742 #, c-format msgid "unterminated dollar-quoted string" msgstr "文字列のドル引用符が閉じていません" -#: pgc.l:772 pgc.l:793 +#: pgc.l:760 pgc.l:780 #, c-format msgid "zero-length delimited identifier" msgstr "区切りつき識別子の長さがゼロです" -#: pgc.l:809 +#: pgc.l:791 #, c-format msgid "unterminated quoted identifier" msgstr "識別子の引用符が閉じていません" -#: pgc.l:985 -#, c-format -msgid "parameter number too large" -msgstr "パラメータ数が多すぎます" - -#: pgc.l:990 +#: pgc.l:960 #, c-format msgid "trailing junk after parameter" msgstr "パラメータの後に余分な文字" -#: pgc.l:1042 pgc.l:1045 pgc.l:1048 +#: pgc.l:1012 pgc.l:1015 pgc.l:1018 #, c-format msgid "trailing junk after numeric literal" msgstr "数値リテラルの後ろにゴミがあります" -#: pgc.l:1177 +#: pgc.l:1141 #, c-format msgid "nested /* ... */ comments" msgstr "入れ子状の /* ... */ コメント" -#: pgc.l:1279 +#: pgc.l:1240 #, c-format msgid "missing identifier in EXEC SQL UNDEF command" msgstr "EXEC SQL UNDEFコマンドにおいて識別子がありません" -#: pgc.l:1299 pgc.l:1312 pgc.l:1328 pgc.l:1341 +#: 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:1357 pgc.l:1368 pgc.l:1384 pgc.l:1406 +#: 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:1359 pgc.l:1370 pgc.l:1565 +#: pgc.l:1318 pgc.l:1329 pgc.l:1522 #, c-format msgid "missing \"EXEC SQL ENDIF;\"" msgstr "\"EXEC SQL ENDIF;\"がありません" -#: pgc.l:1386 pgc.l:1408 +#: pgc.l:1344 pgc.l:1366 #, c-format msgid "more than one EXEC SQL ELSE" msgstr "1つ以上のEXEC SQL ELSE\"が存在します" -#: pgc.l:1431 pgc.l:1445 +#: pgc.l:1389 pgc.l:1403 #, c-format msgid "unmatched EXEC SQL ENDIF" msgstr "EXEC SQL ENDIFに対応するものがありません" -#: pgc.l:1507 +#: pgc.l:1464 #, c-format msgid "missing identifier in EXEC SQL IFDEF command" msgstr "EXEC SQL IFDEFコマンドにおいて識別子がありません" -#: pgc.l:1516 +#: pgc.l:1473 #, c-format msgid "missing identifier in EXEC SQL DEFINE command" msgstr "EXEC SQL DEFINEコマンドにおいて識別子がありません" -#: pgc.l:1554 +#: pgc.l:1511 #, c-format msgid "syntax error in EXEC SQL INCLUDE command" msgstr "EXEC SQL INCLUDEコマンドにおいて構文エラーがあります" -#: pgc.l:1609 +#: pgc.l:1566 #, c-format msgid "internal error: unreachable state; please report this to <%s>" msgstr "内部エラー: 到達しないはずの状態です。<%s>まで報告してください" -#: pgc.l:1766 +#: 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:1793 +#: pgc.l:1741 #, c-format msgid "could not open include file \"%s\" on line %d" msgstr "行番号%2$dのインクルードファイル\"%1$s\"をオープンすることができませんでした" -#: preproc.y:28 +#: preproc.y:31 msgid "syntax error" msgstr "構文エラー" -#: preproc.y:454 +#: preproc.y:84 +#, c-format +msgid "WARNING: " +msgstr "警告: " + +#: preproc.y:87 +#, c-format +msgid "ERROR: " +msgstr "エラー: " + +#: preproc.y:514 #, c-format msgid "cursor \"%s\" does not exist" msgstr "カーソル\"%s\"は存在しません" -#: preproc.y:490 +#: preproc.y:543 #, c-format msgid "initializer not allowed in type definition" msgstr "型定義では初期化子は許されません" -#: preproc.y:492 +#: preproc.y:545 #, c-format msgid "type name \"string\" is reserved in Informix mode" msgstr "型名\"string\"はInformixモードですでに予約されています" -#: preproc.y:499 preproc.y:8764 +#: preproc.y:552 preproc.y:19034 #, c-format msgid "type \"%s\" is already defined" msgstr "\"%s\"型はすでに定義されています" -#: preproc.y:525 preproc.y:9474 preproc.y:9816 variable.c:631 +#: 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:548 +#: preproc.y:599 #, c-format msgid "connection %s is overwritten with %s by DECLARE statement %s" msgstr "DECLARE文%3$sにより接続%1$sは%2$sで上書きされます" -#: preproc.y:904 +#: preproc.y:1831 #, c-format msgid "AT option not allowed in CLOSE DATABASE statement" msgstr "CLOSE DATABASE文ではATオプションは許されません" -#: preproc.y:1156 +#: preproc.y:2081 #, c-format msgid "AT option not allowed in CONNECT statement" msgstr "CONNECT文ではATオプションは許されません" -#: preproc.y:1192 +#: preproc.y:2121 #, c-format msgid "AT option not allowed in DISCONNECT statement" msgstr "DISCONNECT文ではATオプションは許されません" -#: preproc.y:1244 +#: preproc.y:2176 #, c-format msgid "AT option not allowed in SET CONNECTION statement" msgstr "SET CONNECTION文ではATオプションは許されません" -#: preproc.y:1262 +#: preproc.y:2198 #, c-format msgid "AT option not allowed in TYPE statement" msgstr "TYPE文ではATオプションは許されません" -#: preproc.y:1270 +#: preproc.y:2207 #, c-format msgid "AT option not allowed in VAR statement" msgstr "VAR文ではATオプションは許されません" -#: preproc.y:1277 +#: preproc.y:2214 #, c-format msgid "AT option not allowed in WHENEVER statement" msgstr "WHENEVER文ではATオプションは許されません" -#: preproc.y:1345 preproc.y:1468 preproc.y:2219 preproc.y:2545 preproc.y:2974 -#: preproc.y:3061 preproc.y:6042 +#: 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:1580 +#: preproc.y:2884 #, c-format msgid "SHOW ALL is not implemented" msgstr "SHOW ALLは実装されていません" -#: preproc.y:1865 +#: preproc.y:3596 #, c-format msgid "COPY FROM STDIN is not implemented" msgstr "COPY FROM STDINは実装されていません" -#: preproc.y:5102 preproc.y:8218 +#: preproc.y:10444 preproc.y:18503 #, c-format msgid "\"database\" cannot be used as cursor name in INFORMIX mode" msgstr "INFORMIXモードでは\"database\"をカーソル名として使用できません" -#: preproc.y:5109 preproc.y:8228 +#: preproc.y:10451 preproc.y:18513 #, c-format msgid "using variable \"%s\" in different declare statements is not supported" msgstr "異なったdeclareステートメントにおける変数\"%s\"の使用はサポートされていません" -#: preproc.y:5111 preproc.y:8230 +#: preproc.y:10453 preproc.y:18515 #, c-format msgid "cursor \"%s\" is already defined" msgstr "カーソル\"%s\"はすでに定義されています" -#: preproc.y:5358 +#: preproc.y:10927 #, c-format msgid "no longer supported LIMIT #,# syntax passed to server" msgstr "サーバーに渡されるLIMIT #,#構文はもはやサポートされていません" -#: preproc.y:7868 preproc.y:7876 +#: preproc.y:18195 preproc.y:18202 #, c-format msgid "CREATE TABLE AS cannot specify INTO" msgstr "CREATE TABLE ASはINTOを指定できません" -#: preproc.y:7919 +#: preproc.y:18238 #, c-format msgid "expected \"@\", found \"%s\"" msgstr "想定では\"@\"、結果では\"%s\"" -#: preproc.y:7931 +#: preproc.y:18250 #, c-format msgid "only protocols \"tcp\" and \"unix\" and database type \"postgresql\" are supported" msgstr "プロトコルでは\"tcp\"および\"unix\"のみ、データベースの種類では\"postgresql\"のみがサポートされています" -#: preproc.y:7934 +#: preproc.y:18253 #, c-format msgid "expected \"://\", found \"%s\"" msgstr "想定では\"://\"、結果では\"%s\"" -#: preproc.y:7939 +#: preproc.y:18258 #, c-format msgid "Unix-domain sockets only work on \"localhost\" but not on \"%s\"" msgstr "Unixドメインソケットは\"localhost\"でのみで動作し、\"%s\"では動作しません" -#: preproc.y:7966 +#: preproc.y:18284 #, c-format msgid "expected \"postgresql\", found \"%s\"" msgstr "想定では\"postgresql\"、結果では\"%s\"" -#: preproc.y:7969 +#: preproc.y:18287 #, c-format msgid "invalid connection type: %s" msgstr "無効な接続種類: %s" -#: preproc.y:7978 +#: preproc.y:18296 #, c-format msgid "expected \"@\" or \"://\", found \"%s\"" msgstr "想定では\"@または\"\"://\"、結果では\"%s\"" -#: preproc.y:8076 preproc.y:8094 +#: preproc.y:18371 preproc.y:18389 #, c-format msgid "invalid data type" msgstr "無効なデータ型" -#: preproc.y:8105 preproc.y:8122 +#: preproc.y:18400 preproc.y:18417 #, c-format msgid "incomplete statement" msgstr "不完全な文" -#: preproc.y:8108 preproc.y:8125 +#: preproc.y:18403 preproc.y:18420 #, c-format msgid "unrecognized token \"%s\"" msgstr "認識できないトークン\"%s\"" -#: preproc.y:8180 +#: preproc.y:18465 #, c-format msgid "name \"%s\" is already declared" msgstr "名前\"%s\"はすでに定義されています" -#: preproc.y:8485 +#: preproc.y:18754 #, c-format msgid "only data types numeric and decimal have precision/scale argument" msgstr "数値データ型または10進数データ型のみが精度/位取り引数と取ることができます" -#: preproc.y:8583 +#: preproc.y:18853 #, c-format msgid "interval specification not allowed here" msgstr "時間間隔の指定はここでは許されません" -#: preproc.y:8735 preproc.y:8791 +#: preproc.y:19009 preproc.y:19061 #, c-format msgid "too many levels in nested structure/union definition" msgstr "構造体/ユニオンの定義の入れ子レベルが深すぎます" -#: preproc.y:8924 +#: preproc.y:19184 #, c-format msgid "pointers to varchar are not implemented" msgstr "varcharを指し示すポインタは実装されていません" -#: preproc.y:9439 +#: preproc.y:19635 #, c-format msgid "initializer not allowed in EXEC SQL VAR command" msgstr "EXEC SQL VARコマンドでは初期化子は許されません" -#: preproc.y:9759 +#: preproc.y:19949 #, c-format msgid "arrays of indicators are not allowed on input" msgstr "指示子配列は入力として許されません" -#: preproc.y:9993 +#: preproc.y:20136 #, c-format msgid "operator not allowed in variable definition" msgstr "変数定義では演算子は許されません" #. translator: %s is typically the translation of "syntax error" -#: preproc.y:10038 +#: preproc.y:20177 #, c-format msgid "%s at or near \"%s\"" msgstr "\"%2$s\"またはその近辺で%1$s" -#: type.c:190 type.c:661 +#: type.c:18 type.c:30 +#, c-format +msgid "out of memory" +msgstr "メモリ不足です" + +#: type.c:214 type.c:685 #, c-format msgid "unrecognized variable type code %d" msgstr "認識できない変数型コード%d" -#: type.c:239 +#: type.c:263 #, c-format msgid "variable \"%s\" is hidden by a local variable of a different type" msgstr "変数\"%s\"は、異なった型を持つローカル変数により隠蔽されています" -#: type.c:241 +#: type.c:265 #, c-format msgid "variable \"%s\" is hidden by a local variable" msgstr "変数\"%s\"はローカル変数により隠蔽されています" -#: type.c:253 +#: type.c:277 #, c-format msgid "indicator variable \"%s\" is hidden by a local variable of a different type" msgstr "指示子変数\"%s\"は、異なった型を持つローカル変数により隠蔽されています" -#: type.c:255 +#: type.c:279 #, c-format msgid "indicator variable \"%s\" is hidden by a local variable" msgstr "指示子変数\"%s\"はローカル変数により隠蔽されています" -#: type.c:263 +#: type.c:287 #, c-format msgid "indicator for array/pointer has to be array/pointer" msgstr "配列/ポインタ用の指示子は配列/ポインタでなければなりません" -#: type.c:267 +#: type.c:291 #, c-format msgid "nested arrays are not supported (except strings)" msgstr "入れ子状の配列はサポートされません (文字列は除きます)" -#: type.c:309 +#: type.c:333 #, c-format msgid "indicator for struct has to be a struct" msgstr "構造体用の指示子は構造体でなければなりません" -#: type.c:329 type.c:350 type.c:370 +#: type.c:353 type.c:374 type.c:394 #, c-format msgid "indicator for simple data type has to be simple" msgstr "単純なデータ型用の指示子は単純型でなければなりません" -#: type.c:601 +#: type.c:625 #, c-format msgid "indicator struct \"%s\" has too few members" msgstr "指示子構造体\"%s\"のメンバが足りません" -#: type.c:609 +#: type.c:633 #, c-format msgid "indicator struct \"%s\" has too many members" msgstr "指示子構造体\"%s\"のメンバが多すぎます" -#: type.c:720 +#: type.c:744 #, c-format msgid "unrecognized descriptor item code %d" msgstr "認識できない記述子項目コード%dです" @@ -657,43 +667,44 @@ msgstr "変数\"%s\"は構造体でもユニオンでもありません" msgid "variable \"%s\" is not an array" msgstr "変数\"%s\"は配列ではありません" -#: variable.c:220 -#, c-format -msgid "unmatched brace in variable \"%s\"" -msgstr "変数\"%s\"に閉じられていないブレースがあります" - -#: variable.c:235 variable.c:257 +#: variable.c:232 variable.c:254 #, c-format msgid "variable \"%s\" is not declared" msgstr "変数\"%s\"は宣言されていません" -#: variable.c:496 +#: variable.c:492 #, c-format msgid "indicator variable must have an integer type" msgstr "指示子変数は整数型でなければなりません" -#: variable.c:513 +#: variable.c:509 #, c-format msgid "unrecognized data type name \"%s\"" msgstr "データ型名\"%s\"は認識できません" -#: variable.c:527 variable.c:535 variable.c:552 variable.c:555 +#: variable.c:520 variable.c:528 variable.c:545 variable.c:548 #, c-format msgid "multidimensional arrays are not supported" msgstr "多次元配列はサポートされません" -#: variable.c:544 +#: 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:549 +#: variable.c:542 #, c-format msgid "pointer to pointer is not supported for this data type" msgstr "このデータ型では、ポインタを指し示すポインタはサポートされていません" -#: variable.c:569 +#: variable.c:562 #, c-format msgid "multidimensional arrays for structures are not supported" msgstr "構造体の多次元配列はサポートされていません" + +#~ msgid "parameter number too large" +#~ msgstr "パラメータ数が多すぎます" + +#~ msgid "unmatched brace in variable \"%s\"" +#~ msgstr "変数\"%s\"に閉じられていないブレースがあります" diff --git a/src/interfaces/libpq/Makefile b/src/interfaces/libpq/Makefile index b36a7657648a7..e4206ac854013 100644 --- a/src/interfaces/libpq/Makefile +++ b/src/interfaces/libpq/Makefile @@ -22,7 +22,7 @@ NAME= pq SO_MAJOR_VERSION= 5 SO_MINOR_VERSION= $(MAJORVERSION) -override CPPFLAGS := -I$(srcdir) $(CPPFLAGS) -I$(top_builddir)/src/port -I$(top_srcdir)/src/port +override CPPFLAGS := -I$(srcdir) -I$(top_builddir)/src/port -I$(top_srcdir)/src/port $(CPPFLAGS) ifneq ($(PORTNAME), win32) override CFLAGS += $(PTHREAD_CFLAGS) endif diff --git a/src/interfaces/libpq/fe-cancel.c b/src/interfaces/libpq/fe-cancel.c index 213a6f43c2d76..8c7aff42b5a54 100644 --- a/src/interfaces/libpq/fe-cancel.c +++ b/src/interfaces/libpq/fe-cancel.c @@ -119,6 +119,7 @@ PQcancelCreate(PGconn *conn) goto oom_error; originalHost = conn->connhost[conn->whichhost]; + cancelConn->connhost[0].type = originalHost.type; if (originalHost.host) { cancelConn->connhost[0].host = strdup(originalHost.host); diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 2f87961a71ede..454d2ea3fb7c1 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -7074,7 +7074,9 @@ PQport(const PGconn *conn) if (!conn) return NULL; - if (conn->connhost != NULL) + if (conn->connhost != NULL && + conn->connhost[conn->whichhost].port != NULL && + conn->connhost[conn->whichhost].port[0] != '\0') return conn->connhost[conn->whichhost].port; return ""; diff --git a/src/interfaces/libpq/fe-exec.c b/src/interfaces/libpq/fe-exec.c index cb55b986422a6..91063b159e676 100644 --- a/src/interfaces/libpq/fe-exec.c +++ b/src/interfaces/libpq/fe-exec.c @@ -4101,7 +4101,8 @@ PQescapeStringInternal(PGconn *conn, } /* Slow path for possible multibyte characters */ - charlen = pg_encoding_mblen(encoding, source); + charlen = pg_encoding_mblen_or_incomplete(encoding, + source, remaining); if (remaining < charlen || pg_encoding_verifymbchar(encoding, source, charlen) == -1) @@ -4245,7 +4246,8 @@ 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); if (charlen > remaining) { diff --git a/src/interfaces/libpq/fe-misc.c b/src/interfaces/libpq/fe-misc.c index f235bfbb41fb5..3ed89450ff503 100644 --- a/src/interfaces/libpq/fe-misc.c +++ b/src/interfaces/libpq/fe-misc.c @@ -538,9 +538,35 @@ pqPutMsgEnd(PGconn *conn) /* Make message eligible to send */ conn->outCount = conn->outMsgEnd; + /* If appropriate, try to push out some data */ if (conn->outCount >= 8192) { - int toSend = conn->outCount - (conn->outCount % 8192); + int toSend = conn->outCount; + + /* + * On Unix-pipe connections, it seems profitable to prefer sending + * pipe-buffer-sized packets not randomly-sized ones, so retain the + * last partial-8K chunk in our buffer for now. On TCP connections, + * the advantage of that is far less clear. Moreover, it flat out + * isn't safe when using SSL or GSSAPI, because those code paths have + * API stipulations that if they fail to send all the data that was + * offered in the previous write attempt, we mustn't offer less data + * in this write attempt. The previous write attempt might've been + * pqFlush attempting to send everything in the buffer, so we mustn't + * offer less now. (Presently, we won't try to use SSL or GSSAPI on + * Unix connections, so those checks are just Asserts. They'll have + * to become part of the regular if-test if we ever change that.) + */ + if (conn->raddr.addr.ss_family == AF_UNIX) + { +#ifdef USE_SSL + Assert(!conn->ssl_in_use); +#endif +#ifdef ENABLE_GSS + Assert(!conn->gssenc); +#endif + toSend -= toSend % 8192; + } if (pqSendSome(conn, toSend) < 0) return EOF; @@ -1197,13 +1223,9 @@ PQgetCurrentTimeUSec(void) */ /* - * 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) @@ -1212,8 +1234,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) diff --git a/src/interfaces/libpq/fe-secure-gssapi.c b/src/interfaces/libpq/fe-secure-gssapi.c index 98b314613c36c..d093be9ba5aea 100644 --- a/src/interfaces/libpq/fe-secure-gssapi.c +++ b/src/interfaces/libpq/fe-secure-gssapi.c @@ -47,11 +47,18 @@ * don't want the other side to send arbitrarily huge packets as we * would have to allocate memory for them to then pass them to GSSAPI. * - * Therefore, these two #define's are effectively part of the protocol + * Therefore, this #define is effectively part of the protocol * spec and can't ever be changed. */ -#define PQ_GSS_SEND_BUFFER_SIZE 16384 -#define PQ_GSS_RECV_BUFFER_SIZE 16384 +#define PQ_GSS_MAX_PACKET_SIZE 16384 /* includes uint32 header word */ + +/* + * However, during the authentication exchange we must cope with whatever + * message size the GSSAPI library wants to send (because our protocol + * doesn't support splitting those messages). Depending on configuration + * those messages might be as much as 64kB. + */ +#define PQ_GSS_AUTH_BUFFER_SIZE 65536 /* includes uint32 header word */ /* * We need these state variables per-connection. To allow the functions @@ -105,9 +112,9 @@ pg_GSS_write(PGconn *conn, const void *ptr, size_t len) * 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, + * we've successfully sent any encrypted packets. However, doing that + * expands the state space of this processing and has been responsible for + * bugs in the past (cf. commit d053a879b). We won't save much, * typically, by letting callers discard data early, so don't risk it. */ if (len < PqGSSSendConsumed) @@ -203,11 +210,11 @@ pg_GSS_write(PGconn *conn, const void *ptr, size_t len) goto cleanup; } - if (output.length > PQ_GSS_SEND_BUFFER_SIZE - sizeof(uint32)) + if (output.length > PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32)) { libpq_append_conn_error(conn, "client tried to send oversize GSSAPI packet (%zu > %zu)", (size_t) output.length, - PQ_GSS_SEND_BUFFER_SIZE - sizeof(uint32)); + PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32)); errno = EIO; /* for lack of a better idea */ goto cleanup; } @@ -342,11 +349,11 @@ pg_GSS_read(PGconn *conn, void *ptr, size_t len) /* Decode the packet length and check for overlength packet */ input.length = pg_ntoh32(*(uint32 *) PqGSSRecvBuffer); - if (input.length > PQ_GSS_RECV_BUFFER_SIZE - sizeof(uint32)) + if (input.length > PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32)) { libpq_append_conn_error(conn, "oversize GSSAPI packet sent by the server (%zu > %zu)", (size_t) input.length, - PQ_GSS_RECV_BUFFER_SIZE - sizeof(uint32)); + PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32)); errno = EIO; /* for lack of a better idea */ return -1; } @@ -485,12 +492,15 @@ pqsecure_open_gss(PGconn *conn) * initialize state variables. By malloc'ing the buffers separately, we * ensure that they are sufficiently aligned for the length-word accesses * that we do in some places in this file. + * + * We'll use PQ_GSS_AUTH_BUFFER_SIZE-sized buffers until transport + * negotiation is complete, then switch to PQ_GSS_MAX_PACKET_SIZE. */ if (PqGSSSendBuffer == NULL) { - PqGSSSendBuffer = malloc(PQ_GSS_SEND_BUFFER_SIZE); - PqGSSRecvBuffer = malloc(PQ_GSS_RECV_BUFFER_SIZE); - PqGSSResultBuffer = malloc(PQ_GSS_RECV_BUFFER_SIZE); + PqGSSSendBuffer = malloc(PQ_GSS_AUTH_BUFFER_SIZE); + PqGSSRecvBuffer = malloc(PQ_GSS_AUTH_BUFFER_SIZE); + PqGSSResultBuffer = malloc(PQ_GSS_AUTH_BUFFER_SIZE); if (!PqGSSSendBuffer || !PqGSSRecvBuffer || !PqGSSResultBuffer) { libpq_append_conn_error(conn, "out of memory"); @@ -564,13 +574,13 @@ pqsecure_open_gss(PGconn *conn) * so leave a spot at the end for a NULL byte too) and report that * back to the caller. */ - result = gss_read(conn, PqGSSRecvBuffer + PqGSSRecvLength, PQ_GSS_RECV_BUFFER_SIZE - PqGSSRecvLength - 1, &ret); + result = gss_read(conn, PqGSSRecvBuffer + PqGSSRecvLength, PQ_GSS_AUTH_BUFFER_SIZE - PqGSSRecvLength - 1, &ret); if (result != PGRES_POLLING_OK) return result; PqGSSRecvLength += ret; - Assert(PqGSSRecvLength < PQ_GSS_RECV_BUFFER_SIZE); + Assert(PqGSSRecvLength < PQ_GSS_AUTH_BUFFER_SIZE); PqGSSRecvBuffer[PqGSSRecvLength] = '\0'; appendPQExpBuffer(&conn->errorMessage, "%s\n", PqGSSRecvBuffer + 1); @@ -584,11 +594,11 @@ pqsecure_open_gss(PGconn *conn) /* Get the length and check for over-length packet */ input.length = pg_ntoh32(*(uint32 *) PqGSSRecvBuffer); - if (input.length > PQ_GSS_RECV_BUFFER_SIZE - sizeof(uint32)) + if (input.length > PQ_GSS_AUTH_BUFFER_SIZE - sizeof(uint32)) { libpq_append_conn_error(conn, "oversize GSSAPI packet sent by the server (%zu > %zu)", (size_t) input.length, - PQ_GSS_RECV_BUFFER_SIZE - sizeof(uint32)); + PQ_GSS_AUTH_BUFFER_SIZE - sizeof(uint32)); return PGRES_POLLING_FAILED; } @@ -668,12 +678,33 @@ pqsecure_open_gss(PGconn *conn) conn->gcred = GSS_C_NO_CREDENTIAL; gss_release_buffer(&minor, &output); + /* + * Release the large authentication buffers and allocate the ones we + * want for normal operation. (This maneuver is safe only because + * pqDropConnection will drop the buffers; otherwise, during a + * reconnection we'd be at risk of using undersized buffers during + * negotiation.) + */ + free(PqGSSSendBuffer); + free(PqGSSRecvBuffer); + free(PqGSSResultBuffer); + PqGSSSendBuffer = malloc(PQ_GSS_MAX_PACKET_SIZE); + PqGSSRecvBuffer = malloc(PQ_GSS_MAX_PACKET_SIZE); + PqGSSResultBuffer = malloc(PQ_GSS_MAX_PACKET_SIZE); + if (!PqGSSSendBuffer || !PqGSSRecvBuffer || !PqGSSResultBuffer) + { + libpq_append_conn_error(conn, "out of memory"); + return PGRES_POLLING_FAILED; + } + PqGSSSendLength = PqGSSSendNext = PqGSSSendConsumed = 0; + PqGSSRecvLength = PqGSSResultLength = PqGSSResultNext = 0; + /* * Determine the max packet size which will fit in our buffer, after * accounting for the length. pg_GSS_write will need this. */ major = gss_wrap_size_limit(&minor, conn->gctx, 1, GSS_C_QOP_DEFAULT, - PQ_GSS_SEND_BUFFER_SIZE - sizeof(uint32), + PQ_GSS_MAX_PACKET_SIZE - sizeof(uint32), &PqGSSMaxPktSize); if (GSS_ERROR(major)) @@ -687,10 +718,11 @@ pqsecure_open_gss(PGconn *conn) } /* Must have output.length > 0 */ - if (output.length > PQ_GSS_SEND_BUFFER_SIZE - sizeof(uint32)) + if (output.length > PQ_GSS_AUTH_BUFFER_SIZE - sizeof(uint32)) { - pg_GSS_error(libpq_gettext("GSSAPI context establishment error"), - conn, major, minor); + libpq_append_conn_error(conn, "client tried to send oversize GSSAPI packet (%zu > %zu)", + (size_t) output.length, + PQ_GSS_AUTH_BUFFER_SIZE - sizeof(uint32)); gss_release_buffer(&minor, &output); return PGRES_POLLING_FAILED; } diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h index f36d76bf3fedf..ba4a2850223fa 100644 --- a/src/interfaces/libpq/libpq-int.h +++ b/src/interfaces/libpq/libpq-int.h @@ -351,7 +351,8 @@ typedef struct pg_conn_host pg_conn_host_type type; /* type of host address */ char *host; /* host name or socket path */ char *hostaddr; /* host numeric IP address */ - char *port; /* port number (always provided) */ + char *port; /* port number (if NULL or empty, use + * DEF_PGPORT[_STR]) */ char *password; /* password for this host, read from the * password file; NULL if not sought or not * found in password file. */ diff --git a/src/interfaces/libpq/po/de.po b/src/interfaces/libpq/po/de.po index a711e01da3a79..a43d355e53ad0 100644 --- a/src/interfaces/libpq/po/de.po +++ b/src/interfaces/libpq/po/de.po @@ -1,5 +1,5 @@ # German message translation file for libpq -# Peter Eisentraut , 2001 - 2024. +# Peter Eisentraut , 2001 - 2025. # # Use these quotes: »%s« # @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: PostgreSQL 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-02-06 20:10+0000\n" -"PO-Revision-Date: 2025-02-07 08:28+0100\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" @@ -77,7 +77,7 @@ msgstr "konnte Nonce nicht erzeugen" #: 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-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 @@ -975,11 +975,16 @@ msgstr "Parameternummer %d ist außerhalb des zulässigen Bereichs 0..%d" msgid "could not interpret result from server: %s" msgstr "konnte Ergebnis vom Server nicht interpretieren: %s" -#: fe-exec.c:4127 fe-exec.c:4217 +#: 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" diff --git a/src/interfaces/libpq/po/ja.po b/src/interfaces/libpq/po/ja.po index f41c580b7764c..0dc7053bc1310 100644 --- a/src/interfaces/libpq/po/ja.po +++ b/src/interfaces/libpq/po/ja.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: libpq (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2025-02-07 09:53+0900\n" -"PO-Revision-Date: 2025-02-07 11:56+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" @@ -70,7 +70,7 @@ msgstr "nonce を生成できませんでした" #: 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:4234 fe-exec.c:4398 +#: 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 @@ -1028,11 +1028,16 @@ msgstr "パラメータ%dは0..%dの範囲を超えています" msgid "could not interpret result from server: %s" msgstr "サーバーからの結果を解釈できませんでした: %s" -#: fe-exec.c:4127 fe-exec.c:4217 +#: 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名のインポートエラー" diff --git a/src/interfaces/libpq/po/ka.po b/src/interfaces/libpq/po/ka.po index 4c84ef0e86899..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) 17\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-11-28 22:40+0000\n" -"PO-Revision-Date: 2024-11-29 05:06+0100\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" @@ -78,7 +78,7 @@ msgstr "ერთჯერადი კოდის გენერაციი #: 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-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 @@ -976,11 +976,16 @@ msgstr "პარამეტრების რაოდენობა %d ზ msgid "could not interpret result from server: %s" msgstr "სერვერის პასუხის გაურკვეველია: %s" -#: fe-exec.c:4127 fe-exec.c:4217 +#: 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-ის სახელის შემოტანის შეცდომა" diff --git a/src/interfaces/libpq/po/ru.po b/src/interfaces/libpq/po/ru.po index fbdef3a7cf444..0b59976f33824 100644 --- a/src/interfaces/libpq/po/ru.po +++ b/src/interfaces/libpq/po/ru.po @@ -4,14 +4,14 @@ # Serguei A. Mokhov , 2001-2004. # Oleg Bartunov , 2005. # Andrey Sudnik , 2010. -# Alexander Lakhin , 2012-2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024. +# 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: 2024-11-14 04:45+0300\n" -"PO-Revision-Date: 2024-11-14 05:02+0300\n" +"POT-Creation-Date: 2025-08-02 11:37+0300\n" +"PO-Revision-Date: 2025-05-03 16:34+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" "Language: ru\n" @@ -76,18 +76,18 @@ msgstr "не удалось сгенерировать разовый код" #: 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-auth.c:1363 fe-cancel.c:160 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-exec.c:530 fe-exec.c:1315 fe-exec.c:3254 fe-exec.c:4293 fe-exec.c:4459 #: 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 +#: fe-protocol3.c:2187 fe-secure-common.c:110 fe-secure-gssapi.c:506 +#: fe-secure-gssapi.c:696 fe-secure-openssl.c:427 fe-secure-openssl.c:1277 #, c-format msgid "out of memory" msgstr "нехватка памяти" @@ -360,17 +360,17 @@ msgstr "нераспознанный алгоритм шифрования па msgid "connection pointer is NULL" msgstr "нулевой указатель соединения" -#: fe-cancel.c:82 fe-misc.c:572 +#: fe-cancel.c:82 fe-misc.c:598 #, c-format msgid "connection not open" msgstr "соединение не открыто" -#: fe-cancel.c:193 +#: fe-cancel.c:194 #, c-format msgid "cancel request is already being sent on this connection" msgstr "через это соединение уже передаётся запрос отмены" -#: fe-cancel.c:263 +#: fe-cancel.c:264 #, c-format msgid "unexpected response from server" msgstr "неожиданный ответ сервера" @@ -847,21 +847,21 @@ msgstr "неверный символ, закодированный с %%: \"%s\ msgid "forbidden value %%00 in percent-encoded value: \"%s\"" msgstr "недопустимое значение %%00 для символа, закодированного с %%: \"%s\"" -#: fe-connect.c:7160 +#: fe-connect.c:7162 msgid "connection pointer is NULL\n" msgstr "нулевой указатель соединения\n" -#: fe-connect.c:7168 fe-exec.c:713 fe-exec.c:975 fe-exec.c:3459 +#: fe-connect.c:7170 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 +#: fe-connect.c:7461 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "ПРЕДУПРЕЖДЕНИЕ: файл паролей \"%s\" - не обычный файл\n" -#: fe-connect.c:7468 +#: fe-connect.c:7470 #, c-format msgid "" "WARNING: password file \"%s\" has group or world access; permissions should " @@ -870,12 +870,12 @@ msgstr "" "ПРЕДУПРЕЖДЕНИЕ: к файлу паролей \"%s\" имеют доступ все или группа; права " "должны быть u=rw (0600) или более ограниченные\n" -#: fe-connect.c:7575 +#: fe-connect.c:7577 #, c-format msgid "password retrieved from file \"%s\"" msgstr "пароль получен из файла \"%s\"" -#: fe-connect.c:7727 +#: fe-connect.c:7729 #, c-format msgid "invalid integer value \"%s\" for connection option \"%s\"" msgstr "неверное целочисленное значение \"%s\" для параметра соединения \"%s\"" @@ -1036,11 +1036,16 @@ msgstr "номер параметра %d вне диапазона 0..%d" msgid "could not interpret result from server: %s" msgstr "не удалось интерпретировать ответ сервера: %s" -#: fe-exec.c:4127 fe-exec.c:4217 +#: fe-exec.c:4141 fe-exec.c:4255 #, c-format msgid "incomplete multibyte character" msgstr "неполный многобайтный символ" +#: fe-exec.c:4143 fe-exec.c:4274 +#, c-format +msgid "invalid multibyte character" +msgstr "неверный многобайтный символ" + #: fe-gssapi-common.c:122 msgid "GSSAPI name import error" msgstr "ошибка импорта имени в GSSAPI" @@ -1097,7 +1102,7 @@ msgstr "функция pqGetInt не поддерживает integer разме msgid "integer of size %lu not supported by pqPutInt" msgstr "функция pqPutInt не поддерживает integer размером %lu байт" -#: fe-misc.c:750 fe-secure-openssl.c:203 fe-secure-openssl.c:309 +#: fe-misc.c:776 fe-secure-openssl.c:203 fe-secure-openssl.c:309 #: fe-secure.c:237 fe-secure.c:404 #, c-format msgid "" @@ -1109,21 +1114,21 @@ msgstr "" "\tСкорее всего сервер прекратил работу из-за сбоя\n" "\tдо или в процессе выполнения запроса." -#: fe-misc.c:817 +#: fe-misc.c:843 msgid "connection not open\n" msgstr "соединение не открыто\n" -#: fe-misc.c:1005 +#: fe-misc.c:1031 #, c-format msgid "timeout expired" msgstr "тайм-аут" -#: fe-misc.c:1049 +#: fe-misc.c:1075 #, c-format msgid "invalid socket" msgstr "неверный сокет" -#: fe-misc.c:1071 +#: fe-misc.c:1097 #, c-format msgid "%s() failed: %s" msgstr "ошибка в %s(): %s" @@ -1337,46 +1342,42 @@ msgstr "серверный сертификат для \"%s\" не соотве msgid "could not get server's host name from server certificate" msgstr "не удалось получить имя сервера из серверного сертификата" -#: fe-secure-gssapi.c:194 +#: fe-secure-gssapi.c:201 msgid "GSSAPI wrap error" msgstr "ошибка обёртывания сообщения в GSSAPI" -#: fe-secure-gssapi.c:201 +#: fe-secure-gssapi.c:208 #, c-format msgid "outgoing GSSAPI message would not use confidentiality" msgstr "исходящее сообщение GSSAPI не будет защищено" -#: fe-secure-gssapi.c:208 +#: fe-secure-gssapi.c:215 fe-secure-gssapi.c:723 #, c-format msgid "client tried to send oversize GSSAPI packet (%zu > %zu)" msgstr "клиент попытался передать чрезмерно большой пакет GSSAPI (%zu > %zu)" -#: fe-secure-gssapi.c:347 fe-secure-gssapi.c:589 +#: fe-secure-gssapi.c:354 fe-secure-gssapi.c:599 #, c-format msgid "oversize GSSAPI packet sent by the server (%zu > %zu)" msgstr "сервер передал чрезмерно большой пакет GSSAPI (%zu > %zu)" -#: fe-secure-gssapi.c:386 +#: fe-secure-gssapi.c:393 msgid "GSSAPI unwrap error" msgstr "ошибка развёртывания сообщения в GSSAPI" -#: fe-secure-gssapi.c:395 +#: fe-secure-gssapi.c:402 #, c-format msgid "incoming GSSAPI message did not use confidentiality" msgstr "входящее сообщение GSSAPI не защищено" -#: fe-secure-gssapi.c:652 +#: fe-secure-gssapi.c:662 msgid "could not initiate GSSAPI security context" msgstr "не удалось инициализировать контекст безопасности GSSAPI" -#: fe-secure-gssapi.c:681 +#: fe-secure-gssapi.c:712 msgid "GSSAPI size check error" msgstr "ошибка проверки размера в GSSAPI" -#: fe-secure-gssapi.c:692 -msgid "GSSAPI context establishment error" -msgstr "ошибка установления контекста в GSSAPI" - #: fe-secure-openssl.c:207 fe-secure-openssl.c:313 fe-secure-openssl.c:1524 #, c-format msgid "SSL SYSCALL error: %s" @@ -1631,6 +1632,9 @@ msgstr "не удалось передать данные серверу: %s" msgid "unrecognized socket error: 0x%08X/%d" msgstr "нераспознанная ошибка сокета: 0x%08X/%d" +#~ msgid "GSSAPI context establishment error" +#~ msgstr "ошибка установления контекста в GSSAPI" + #, c-format #~ msgid "keepalives parameter must be an integer" #~ msgstr "параметр keepalives должен быть целым числом" diff --git a/src/interfaces/libpq/po/uk.po b/src/interfaces/libpq/po/uk.po index 6c57f4501b011..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: 2024-08-31 06:10+0000\n" -"PO-Revision-Date: 2024-09-23 19:38\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" @@ -72,12 +72,12 @@ msgstr "не вдалося згенерувати одноразовий іде #: 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:4775 -#: fe-connect.c:5087 fe-connect.c:5342 fe-connect.c:5460 fe-connect.c:5707 -#: fe-connect.c:5787 fe-connect.c:5885 fe-connect.c:6136 fe-connect.c:6163 -#: fe-connect.c:6239 fe-connect.c:6262 fe-connect.c:6286 fe-connect.c:6321 -#: fe-connect.c:6407 fe-connect.c:6415 fe-connect.c:6772 fe-connect.c:6922 -#: fe-exec.c:530 fe-exec.c:1315 fe-exec.c:3254 fe-exec.c:4234 fe-exec.c:4398 +#: 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 @@ -489,12 +489,12 @@ msgstr "Шлях Unix-сокету \"%s\" занадто довгий (макс msgid "could not translate Unix-domain socket path \"%s\" to address: %s" msgstr "не вдалося перекласти шлях Unix-сокету \"%s\" в адресу: %s" -#: fe-connect.c:2950 fe-connect.c:4319 +#: 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:4448 +#: fe-connect.c:2958 fe-connect.c:4434 #, c-format msgid "GSSAPI encryption required but no credential cache" msgstr "Шифрування GSSAPI необхідне, але немає кешу облікових даних" @@ -514,11 +514,6 @@ msgstr "не вдалося встановити сокет у режим без msgid "could not set socket to close-on-exec mode: %s" msgstr "не вдалося встановити сокет у режим закриття по виконанню: %s" -#: fe-connect.c:3086 -#, c-format -msgid "keepalives parameter must be an integer" -msgstr "параметр keepalives має бути цілим числом" - #: fe-connect.c:3225 #, c-format msgid "could not get socket error status: %s" @@ -568,250 +563,260 @@ msgstr "не вдалося передати стартовий пакет: %s" msgid "server does not support SSL, but SSL was required" msgstr "сервер не підтримує протокол SSL, але протокол SSL вимагається" -#: fe-connect.c:3534 +#: 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:3562 +#: fe-connect.c:3552 #, c-format msgid "received unencrypted data after SSL response" msgstr "отримані незашифровані дані після відповіді SSL" -#: fe-connect.c:3643 +#: 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:3647 +#: fe-connect.c:3633 #, c-format msgid "received invalid response to GSSAPI negotiation: %c" msgstr "отримано неприпустиму відповідь на узгодження GSSAPI: %c" -#: fe-connect.c:3665 +#: fe-connect.c:3651 #, c-format msgid "received unencrypted data after GSSAPI encryption response" msgstr "отримані незашифровані дані після відповіді шифрування GSSAPI" -#: fe-connect.c:3725 +#: fe-connect.c:3711 #, c-format msgid "expected authentication request from server, but received %c" msgstr "очікувався запит автентифікації від сервера, але отримано %c" -#: fe-connect.c:3753 fe-connect.c:3876 +#: fe-connect.c:3739 fe-connect.c:3862 #, c-format msgid "received invalid authentication request" msgstr "отримано неприпустимий запит на аутентифікацію" -#: fe-connect.c:3759 fe-connect.c:3861 +#: fe-connect.c:3745 fe-connect.c:3847 #, c-format msgid "received invalid protocol negotiation message" msgstr "отримано неприпустиме повідомлення узгодження протоколу" -#: fe-connect.c:3778 fe-connect.c:3832 +#: fe-connect.c:3764 fe-connect.c:3818 #, c-format msgid "received invalid error message" msgstr "отримано неприпустиме повідомлення про помилку" -#: fe-connect.c:3947 +#: fe-connect.c:3933 #, c-format msgid "unexpected message from server during startup" msgstr "неочікуване повідомлення від сервера під час запуску" -#: fe-connect.c:4038 +#: fe-connect.c:4024 #, c-format msgid "session is read-only" msgstr "сесія доступна тільки для читання" -#: fe-connect.c:4040 +#: fe-connect.c:4026 #, c-format msgid "session is not read-only" msgstr "сесія доступна не лише для читання" -#: fe-connect.c:4093 +#: fe-connect.c:4079 #, c-format msgid "server is in hot standby mode" msgstr "сервер знаходиться у режимі hot standby" -#: fe-connect.c:4095 +#: fe-connect.c:4081 #, c-format msgid "server is not in hot standby mode" msgstr "сервер не в режимі hot standby" -#: fe-connect.c:4217 fe-connect.c:4267 +#: fe-connect.c:4203 fe-connect.c:4253 #, c-format msgid "\"%s\" failed" msgstr "\"%s\" помилка" -#: fe-connect.c:4281 +#: fe-connect.c:4267 #, c-format msgid "invalid connection state %d, probably indicative of memory corruption" msgstr "неприпустимий стан підключення %d, можливо, пошкоджена пам'ять" -#: fe-connect.c:5100 +#: fe-connect.c:5086 #, c-format msgid "invalid LDAP URL \"%s\": scheme must be ldap://" msgstr "неприпустима URL-адреса протоколу LDAP \"%s\": схема має бути ldap://" -#: fe-connect.c:5115 +#: fe-connect.c:5101 #, c-format msgid "invalid LDAP URL \"%s\": missing distinguished name" msgstr "неприпустима URL-адреса протоколу LDAP \"%s\": відсутнє унікальне ім'я" -#: fe-connect.c:5127 fe-connect.c:5185 +#: 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:5139 fe-connect.c:5201 +#: 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:5151 +#: fe-connect.c:5137 #, c-format msgid "invalid LDAP URL \"%s\": no filter" msgstr "неприпустима URL-адреса протоколу LDAP \"%s\": відсутній фільтр" -#: fe-connect.c:5173 +#: fe-connect.c:5159 #, c-format msgid "invalid LDAP URL \"%s\": invalid port number" msgstr "неприпустима URL-адреса протоколу LDAP \"%s\": неприпустимий номер порту" -#: fe-connect.c:5210 +#: fe-connect.c:5196 #, c-format msgid "could not create LDAP structure" msgstr "не вдалось створити структуру LDAP" -#: fe-connect.c:5285 +#: fe-connect.c:5271 #, c-format msgid "lookup on LDAP server failed: %s" msgstr "помилка підстановки на сервері протоколу LDAP: %s" -#: fe-connect.c:5295 +#: fe-connect.c:5281 #, c-format msgid "more than one entry found on LDAP lookup" msgstr "знайдено більше одного входження при підстановці протоколу LDAP" -#: fe-connect.c:5297 fe-connect.c:5308 +#: fe-connect.c:5283 fe-connect.c:5294 #, c-format msgid "no entry found on LDAP lookup" msgstr "не знайдено входження при підстановці протоколу LDAP" -#: fe-connect.c:5318 fe-connect.c:5330 +#: fe-connect.c:5304 fe-connect.c:5316 #, c-format msgid "attribute has no values on LDAP lookup" msgstr "атрибут не має значення при підстановці протоколу LDAP" -#: fe-connect.c:5381 fe-connect.c:5400 fe-connect.c:5924 +#: 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:5471 fe-connect.c:6107 fe-connect.c:6905 +#: fe-connect.c:5457 fe-connect.c:6093 fe-connect.c:6891 #, c-format msgid "invalid connection option \"%s\"" msgstr "неприпустимий параметр підключення \"%s\"" -#: fe-connect.c:5486 fe-connect.c:5972 +#: fe-connect.c:5472 fe-connect.c:5958 #, c-format msgid "unterminated quoted string in connection info string" msgstr "відкриті лапки у рядку інформації про підключення" -#: fe-connect.c:5566 +#: fe-connect.c:5552 #, c-format msgid "definition of service \"%s\" not found" msgstr "не знайдено визначення сервера \"%s\"" -#: fe-connect.c:5592 +#: fe-connect.c:5578 #, c-format msgid "service file \"%s\" not found" msgstr "не знайдено сервісний файл \"%s\"" -#: fe-connect.c:5605 +#: fe-connect.c:5591 #, c-format msgid "line %d too long in service file \"%s\"" msgstr "рядок %d занадто довгий у сервісному файлі \"%s\"" -#: fe-connect.c:5676 fe-connect.c:5719 +#: 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:5687 +#: fe-connect.c:5673 #, c-format msgid "nested service specifications not supported in service file \"%s\", line %d" msgstr "вкладені сервісні специфікації не підтримуються у сервісному файлі \"%s\", рядок %d" -#: fe-connect.c:6426 +#: fe-connect.c:6412 #, c-format msgid "invalid URI propagated to internal parser routine: \"%s\"" msgstr "у внутрішню процедуру аналізу рядка передано помилковий URI: \"%s\"" -#: fe-connect.c:6503 +#: 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:6510 +#: fe-connect.c:6496 #, c-format msgid "IPv6 host address may not be empty in URI: \"%s\"" msgstr "IPv6 адреса хоста не може бути порожньою в URI: \"%s\"" -#: fe-connect.c:6525 +#: 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:6654 +#: fe-connect.c:6640 #, c-format msgid "extra key/value separator \"=\" in URI query parameter: \"%s\"" msgstr "зайвий розділювач ключа/значення \"=\" в параметрі запиту URI: \"%s\"" -#: fe-connect.c:6674 +#: fe-connect.c:6660 #, c-format msgid "missing key/value separator \"=\" in URI query parameter: \"%s\"" msgstr "відсутній розділювач ключа/значення \"=\" у параметрі запиту URI: \"%s\"" -#: fe-connect.c:6726 +#: fe-connect.c:6712 #, c-format msgid "invalid URI query parameter: \"%s\"" msgstr "неприпустимий параметр запиту URI: \"%s\"" -#: fe-connect.c:6800 +#: fe-connect.c:6786 #, c-format msgid "invalid percent-encoded token: \"%s\"" msgstr "неприпустимий токен, закодований відсотками: \"%s\"" -#: fe-connect.c:6810 +#: fe-connect.c:6796 #, c-format msgid "forbidden value %%00 in percent-encoded value: \"%s\"" msgstr "неприпустиме значення %%00 в відсотковому значенні: \"%s\"" -#: fe-connect.c:7174 +#: fe-connect.c:7160 msgid "connection pointer is NULL\n" msgstr "нульове значення вказівника підключення \n" -#: fe-connect.c:7182 fe-exec.c:713 fe-exec.c:975 fe-exec.c:3459 +#: 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:7473 +#: fe-connect.c:7459 #, c-format msgid "WARNING: password file \"%s\" is not a plain file\n" msgstr "ПОПЕРЕДЖЕННЯ: файл паролів \"%s\" не є простим файлом\n" -#: fe-connect.c:7482 +#: 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:7589 +#: fe-connect.c:7575 #, c-format msgid "password retrieved from file \"%s\"" msgstr "пароль отримано з файлу \"%s\"" -#: fe-connect.c:7741 +#: fe-connect.c:7727 #, c-format msgid "invalid integer value \"%s\" for connection option \"%s\"" msgstr "неприпустиме ціле значення \"%s\" для параметра з'єднання \"%s\"" @@ -970,11 +975,16 @@ msgstr "число параметрів %d поза діапазоном 0..%d" msgid "could not interpret result from server: %s" msgstr "не вдалося інтерпретувати результат від сервера: %s" -#: fe-exec.c:4127 fe-exec.c:4217 +#: 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" diff --git a/src/libtde/Makefile b/src/libtde/Makefile index 57c72e1d6bb86..4ed386e20ee58 100644 --- a/src/libtde/Makefile +++ b/src/libtde/Makefile @@ -1,4 +1,3 @@ - subdir = src/libtde top_builddir = ../.. @@ -7,4 +6,4 @@ include $(top_srcdir)/contrib/pg_tde/Makefile.tools all: tdelibs -install: all \ No newline at end of file +install: all diff --git a/src/pl/plpgsql/src/expected/plpgsql_simple.out b/src/pl/plpgsql/src/expected/plpgsql_simple.out index 7b22e60f1984f..da351873e742e 100644 --- a/src/pl/plpgsql/src/expected/plpgsql_simple.out +++ b/src/pl/plpgsql/src/expected/plpgsql_simple.out @@ -118,3 +118,14 @@ select 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/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index ea9740e3f89b5..e7b0f2544b46e 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -5711,7 +5711,7 @@ exec_eval_expr(PLpgSQL_execstate *estate, /* * Else do it the hard way via exec_run_select */ - rc = exec_run_select(estate, expr, 2, NULL); + rc = exec_run_select(estate, expr, 0, NULL); if (rc != SPI_OK_SELECT) ereport(ERROR, (errcode(ERRCODE_WRONG_OBJECT_TYPE), @@ -5765,6 +5765,10 @@ exec_eval_expr(PLpgSQL_execstate *estate, /* ---------- * exec_run_select Execute a select query + * + * Note: passing maxtuples different from 0 ("return all tuples") is + * deprecated because it will prevent parallel execution of the query. + * However, we retain the parameter in case we need it someday. * ---------- */ static int @@ -8141,10 +8145,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 (;;) @@ -8162,7 +8168,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 && diff --git a/src/pl/plpgsql/src/po/ru.po b/src/pl/plpgsql/src/po/ru.po index 99ba5ac7e11d4..635aa462297f0 100644 --- a/src/pl/plpgsql/src/po/ru.po +++ b/src/pl/plpgsql/src/po/ru.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: plpgsql (PostgreSQL current)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-09-02 09:29+0300\n" +"POT-Creation-Date: 2025-08-02 11:37+0300\n" "PO-Revision-Date: 2024-09-04 20:00+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -79,7 +79,7 @@ msgid "It could refer to either a PL/pgSQL variable or a table column." msgstr "Подразумевается ссылка на переменную PL/pgSQL или столбец таблицы." #: pl_comp.c:1314 pl_exec.c:5260 pl_exec.c:5433 pl_exec.c:5520 pl_exec.c:5611 -#: pl_exec.c:6636 +#: pl_exec.c:6640 #, c-format msgid "record \"%s\" has no field \"%s\"" msgstr "в записи \"%s\" нет поля \"%s\"" @@ -114,7 +114,7 @@ msgstr "переменная \"%s\" имеет псевдотип %s" msgid "type \"%s\" is only a shell" msgstr "тип \"%s\" является пустышкой" -#: pl_comp.c:2157 pl_exec.c:6937 +#: pl_comp.c:2157 pl_exec.c:6941 #, c-format msgid "type %s is not composite" msgstr "тип %s не является составным" @@ -369,7 +369,7 @@ msgstr "" msgid "structure of query does not match function result type" msgstr "структура запроса не соответствует типу результата функции" -#: pl_exec.c:3632 pl_exec.c:4469 pl_exec.c:8759 +#: pl_exec.c:3632 pl_exec.c:4469 pl_exec.c:8765 #, c-format msgid "query string argument of EXECUTE is null" msgstr "в качестве текста запроса в EXECUTE передан NULL" @@ -501,7 +501,7 @@ msgstr "присвоить значение системному столбцу msgid "query did not return data" msgstr "запрос не вернул данные" -#: pl_exec.c:5719 pl_exec.c:5731 pl_exec.c:5756 pl_exec.c:5832 pl_exec.c:5837 +#: pl_exec.c:5719 pl_exec.c:5731 pl_exec.c:5756 pl_exec.c:5836 pl_exec.c:5841 #, c-format msgid "query: %s" msgstr "запрос: %s" @@ -514,17 +514,17 @@ msgstr[0] "запрос вернул %d столбец" msgstr[1] "запрос вернул %d столбца" msgstr[2] "запрос вернул %d столбцов" -#: pl_exec.c:5831 +#: pl_exec.c:5835 #, c-format msgid "query is SELECT INTO, but it should be plain SELECT" msgstr "запрос - не просто SELECT, а SELECT INTO" -#: pl_exec.c:5836 +#: pl_exec.c:5840 #, c-format msgid "query is not a SELECT" msgstr "запрос - не SELECT" -#: pl_exec.c:6650 pl_exec.c:6690 pl_exec.c:6730 +#: pl_exec.c:6654 pl_exec.c:6694 pl_exec.c:6734 #, c-format msgid "" "type of parameter %d (%s) does not match that when preparing the plan (%s)" @@ -532,35 +532,35 @@ msgstr "" "тип параметра %d (%s) не соответствует тому, с которым подготавливался план " "(%s)" -#: pl_exec.c:7141 pl_exec.c:7175 pl_exec.c:7249 pl_exec.c:7275 +#: pl_exec.c:7145 pl_exec.c:7179 pl_exec.c:7253 pl_exec.c:7279 #, 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:7143 pl_exec.c:7177 pl_exec.c:7251 pl_exec.c:7277 +#: pl_exec.c:7147 pl_exec.c:7181 pl_exec.c:7255 pl_exec.c:7281 #, c-format msgid "%s check of %s is active." msgstr "Включена проверка %s (с %s)." -#: pl_exec.c:7147 pl_exec.c:7181 pl_exec.c:7255 pl_exec.c:7281 +#: pl_exec.c:7151 pl_exec.c:7185 pl_exec.c:7259 pl_exec.c:7285 #, c-format msgid "Make sure the query returns the exact list of columns." msgstr "" "Измените запрос, чтобы он возвращал в точности требуемый список столбцов." -#: pl_exec.c:7668 +#: pl_exec.c:7672 #, c-format msgid "record \"%s\" is not assigned yet" msgstr "записи \"%s\" не присвоено значение" -#: pl_exec.c:7669 +#: pl_exec.c:7673 #, c-format msgid "The tuple structure of a not-yet-assigned record is indeterminate." msgstr "" "Для записи, которой не присвоено значение, структура кортежа не определена." -#: pl_exec.c:8357 pl_gram.y:3498 +#: pl_exec.c:8363 pl_gram.y:3498 #, c-format msgid "variable \"%s\" is declared CONSTANT" msgstr "переменная \"%s\" объявлена как CONSTANT" diff --git a/src/pl/plpgsql/src/sql/plpgsql_simple.sql b/src/pl/plpgsql/src/sql/plpgsql_simple.sql index 143bf09dce469..72d8afe4500d1 100644 --- a/src/pl/plpgsql/src/sql/plpgsql_simple.sql +++ b/src/pl/plpgsql/src/sql/plpgsql_simple.sql @@ -102,3 +102,15 @@ 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 f959083a0bdec..25f295c3709e2 100644 --- a/src/pl/plpython/Makefile +++ b/src/pl/plpython/Makefile @@ -11,7 +11,7 @@ ifeq ($(PORTNAME), win32) override python_libspec = endif -override CPPFLAGS := -I. -I$(srcdir) $(python_includespec) $(CPPFLAGS) +override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS) $(python_includespec) rpathdir = $(python_libdir) diff --git a/src/pl/plpython/plpy_elog.c b/src/pl/plpython/plpy_elog.c index 70de5ba13d74b..13f6b87a9f20b 100644 --- a/src/pl/plpython/plpy_elog.c +++ b/src/pl/plpython/plpy_elog.c @@ -18,7 +18,8 @@ PyObject *PLy_exc_spi_error = NULL; static void PLy_traceback(PyObject *e, PyObject *v, PyObject *tb, - char **xmsg, char **tbmsg, int *tb_depth); + char *volatile *xmsg, char *volatile *tbmsg, + int *tb_depth); static void PLy_get_spi_error_data(PyObject *exc, int *sqlerrcode, char **detail, char **hint, char **query, int *position, char **schema_name, char **table_name, char **column_name, @@ -43,78 +44,82 @@ void PLy_elog_impl(int elevel, const char *fmt,...) { int save_errno = errno; - char *xmsg; - char *tbmsg; + char *volatile xmsg = NULL; + char *volatile tbmsg = NULL; int tb_depth; StringInfoData emsg; PyObject *exc, *val, *tb; - const char *primary = NULL; - int sqlerrcode = 0; - char *detail = NULL; - char *hint = NULL; - char *query = NULL; - int position = 0; - char *schema_name = NULL; - char *table_name = NULL; - char *column_name = NULL; - char *datatype_name = NULL; - char *constraint_name = NULL; + + /* If we'll need emsg, must initialize it before entering PG_TRY */ + if (fmt) + initStringInfo(&emsg); PyErr_Fetch(&exc, &val, &tb); - if (exc != NULL) + /* Use a PG_TRY block to ensure we release the PyObjects just acquired */ + PG_TRY(); { - PyErr_NormalizeException(&exc, &val, &tb); - - if (PyErr_GivenExceptionMatches(val, PLy_exc_spi_error)) - PLy_get_spi_error_data(val, &sqlerrcode, - &detail, &hint, &query, &position, + const char *primary = NULL; + int sqlerrcode = 0; + char *detail = NULL; + char *hint = NULL; + char *query = NULL; + int position = 0; + char *schema_name = NULL; + char *table_name = NULL; + char *column_name = NULL; + char *datatype_name = NULL; + char *constraint_name = NULL; + + if (exc != NULL) + { + PyErr_NormalizeException(&exc, &val, &tb); + + if (PyErr_GivenExceptionMatches(val, PLy_exc_spi_error)) + PLy_get_spi_error_data(val, &sqlerrcode, + &detail, &hint, &query, &position, + &schema_name, &table_name, &column_name, + &datatype_name, &constraint_name); + else if (PyErr_GivenExceptionMatches(val, PLy_exc_error)) + PLy_get_error_data(val, &sqlerrcode, &detail, &hint, &schema_name, &table_name, &column_name, &datatype_name, &constraint_name); - else if (PyErr_GivenExceptionMatches(val, PLy_exc_error)) - PLy_get_error_data(val, &sqlerrcode, &detail, &hint, - &schema_name, &table_name, &column_name, - &datatype_name, &constraint_name); - else if (PyErr_GivenExceptionMatches(val, PLy_exc_fatal)) - elevel = FATAL; - } + else if (PyErr_GivenExceptionMatches(val, PLy_exc_fatal)) + elevel = FATAL; + } - /* this releases our refcount on tb! */ - PLy_traceback(exc, val, tb, - &xmsg, &tbmsg, &tb_depth); + PLy_traceback(exc, val, tb, + &xmsg, &tbmsg, &tb_depth); - if (fmt) - { - initStringInfo(&emsg); - for (;;) + if (fmt) { - va_list ap; - int needed; - - errno = save_errno; - va_start(ap, fmt); - needed = appendStringInfoVA(&emsg, dgettext(TEXTDOMAIN, fmt), ap); - va_end(ap); - if (needed == 0) - break; - enlargeStringInfo(&emsg, needed); - } - primary = emsg.data; + for (;;) + { + va_list ap; + int needed; + + errno = save_errno; + va_start(ap, fmt); + needed = appendStringInfoVA(&emsg, dgettext(TEXTDOMAIN, fmt), ap); + va_end(ap); + if (needed == 0) + break; + enlargeStringInfo(&emsg, needed); + } + primary = emsg.data; - /* If there's an exception message, it goes in the detail. */ - if (xmsg) - detail = xmsg; - } - else - { - if (xmsg) - primary = xmsg; - } + /* If there's an exception message, it goes in the detail. */ + if (xmsg) + detail = xmsg; + } + else + { + if (xmsg) + primary = xmsg; + } - PG_TRY(); - { ereport(elevel, (errcode(sqlerrcode ? sqlerrcode : ERRCODE_EXTERNAL_ROUTINE_EXCEPTION), errmsg_internal("%s", primary ? primary : "no exception data"), @@ -136,14 +141,23 @@ PLy_elog_impl(int elevel, const char *fmt,...) } PG_FINALLY(); { + Py_XDECREF(exc); + Py_XDECREF(val); + /* Must release all the objects in the traceback stack */ + while (tb != NULL && tb != Py_None) + { + PyObject *tb_prev = tb; + + tb = PyObject_GetAttrString(tb, "tb_next"); + Py_DECREF(tb_prev); + } + /* For neatness' sake, also release our string buffers */ if (fmt) pfree(emsg.data); if (xmsg) pfree(xmsg); if (tbmsg) pfree(tbmsg); - Py_XDECREF(exc); - Py_XDECREF(val); } PG_END_TRY(); } @@ -154,21 +168,14 @@ PLy_elog_impl(int elevel, const char *fmt,...) * The exception error message is returned in xmsg, the traceback in * tbmsg (both as palloc'd strings) and the traceback depth in * tb_depth. - * - * We release refcounts on all the Python objects in the traceback stack, - * but not on e or v. */ static void PLy_traceback(PyObject *e, PyObject *v, PyObject *tb, - char **xmsg, char **tbmsg, int *tb_depth) + char *volatile *xmsg, char *volatile *tbmsg, int *tb_depth) { - PyObject *e_type_o; - PyObject *e_module_o; - char *e_type_s = NULL; - char *e_module_s = NULL; - PyObject *vob = NULL; - char *vstr; - StringInfoData xstr; + PyObject *volatile e_type_o = NULL; + PyObject *volatile e_module_o = NULL; + PyObject *volatile vob = NULL; StringInfoData tbstr; /* @@ -186,47 +193,59 @@ PLy_traceback(PyObject *e, PyObject *v, PyObject *tb, /* * Format the exception and its value and put it in xmsg. */ - - e_type_o = PyObject_GetAttrString(e, "__name__"); - e_module_o = PyObject_GetAttrString(e, "__module__"); - if (e_type_o) - e_type_s = PLyUnicode_AsString(e_type_o); - if (e_type_s) - e_module_s = PLyUnicode_AsString(e_module_o); - - if (v && ((vob = PyObject_Str(v)) != NULL)) - vstr = PLyUnicode_AsString(vob); - else - vstr = "unknown"; - - initStringInfo(&xstr); - if (!e_type_s || !e_module_s) + PG_TRY(); { - /* shouldn't happen */ - appendStringInfoString(&xstr, "unrecognized exception"); + char *e_type_s = NULL; + char *e_module_s = NULL; + const char *vstr; + StringInfoData xstr; + + e_type_o = PyObject_GetAttrString(e, "__name__"); + e_module_o = PyObject_GetAttrString(e, "__module__"); + if (e_type_o) + e_type_s = PLyUnicode_AsString(e_type_o); + if (e_module_o) + e_module_s = PLyUnicode_AsString(e_module_o); + + if (v && ((vob = PyObject_Str(v)) != NULL)) + vstr = PLyUnicode_AsString(vob); + else + vstr = "unknown"; + + initStringInfo(&xstr); + if (!e_type_s || !e_module_s) + { + /* shouldn't happen */ + appendStringInfoString(&xstr, "unrecognized exception"); + } + /* mimics behavior of traceback.format_exception_only */ + else if (strcmp(e_module_s, "builtins") == 0 + || strcmp(e_module_s, "__main__") == 0 + || strcmp(e_module_s, "exceptions") == 0) + appendStringInfoString(&xstr, e_type_s); + else + appendStringInfo(&xstr, "%s.%s", e_module_s, e_type_s); + appendStringInfo(&xstr, ": %s", vstr); + + *xmsg = xstr.data; } - /* mimics behavior of traceback.format_exception_only */ - else if (strcmp(e_module_s, "builtins") == 0 - || strcmp(e_module_s, "__main__") == 0 - || strcmp(e_module_s, "exceptions") == 0) - appendStringInfoString(&xstr, e_type_s); - else - appendStringInfo(&xstr, "%s.%s", e_module_s, e_type_s); - appendStringInfo(&xstr, ": %s", vstr); - - *xmsg = xstr.data; + PG_FINALLY(); + { + Py_XDECREF(e_type_o); + Py_XDECREF(e_module_o); + Py_XDECREF(vob); + } + PG_END_TRY(); /* * Now format the traceback and put it in tbmsg. */ - *tb_depth = 0; initStringInfo(&tbstr); /* Mimic Python traceback reporting as close as possible. */ appendStringInfoString(&tbstr, "Traceback (most recent call last):"); while (tb != NULL && tb != Py_None) { - PyObject *volatile tb_prev = NULL; PyObject *volatile frame = NULL; PyObject *volatile code = NULL; PyObject *volatile name = NULL; @@ -254,84 +273,74 @@ PLy_traceback(PyObject *e, PyObject *v, PyObject *tb, filename = PyObject_GetAttrString(code, "co_filename"); if (filename == NULL) elog(ERROR, "could not get file name from Python code object"); + + /* The first frame always points at , skip it. */ + if (*tb_depth > 0) + { + PLyExecutionContext *exec_ctx = PLy_current_execution_context(); + char *proname; + char *fname; + char *line; + char *plain_filename; + long plain_lineno; + + /* + * The second frame points at the internal function, but to + * mimic Python error reporting we want to say . + */ + if (*tb_depth == 1) + fname = ""; + else + fname = PLyUnicode_AsString(name); + + proname = PLy_procedure_name(exec_ctx->curr_proc); + plain_filename = PLyUnicode_AsString(filename); + plain_lineno = PyLong_AsLong(lineno); + + if (proname == NULL) + appendStringInfo(&tbstr, "\n PL/Python anonymous code block, line %ld, in %s", + plain_lineno - 1, fname); + else + appendStringInfo(&tbstr, "\n PL/Python function \"%s\", line %ld, in %s", + proname, plain_lineno - 1, fname); + + /* + * function code object was compiled with "" as the + * filename + */ + if (exec_ctx->curr_proc && plain_filename != NULL && + strcmp(plain_filename, "") == 0) + { + /* + * If we know the current procedure, append the exact line + * from the source, again mimicking Python's traceback.py + * module behavior. We could store the already line-split + * source to avoid splitting it every time, but producing + * a traceback is not the most important scenario to + * optimize for. But we do not go as far as traceback.py + * in reading the source of imported modules. + */ + line = get_source_line(exec_ctx->curr_proc->src, plain_lineno); + if (line) + { + appendStringInfo(&tbstr, "\n %s", line); + pfree(line); + } + } + } } - PG_CATCH(); + PG_FINALLY(); { Py_XDECREF(frame); Py_XDECREF(code); Py_XDECREF(name); Py_XDECREF(lineno); Py_XDECREF(filename); - PG_RE_THROW(); } PG_END_TRY(); - /* The first frame always points at , skip it. */ - if (*tb_depth > 0) - { - PLyExecutionContext *exec_ctx = PLy_current_execution_context(); - char *proname; - char *fname; - char *line; - char *plain_filename; - long plain_lineno; - - /* - * The second frame points at the internal function, but to mimic - * Python error reporting we want to say . - */ - if (*tb_depth == 1) - fname = ""; - else - fname = PLyUnicode_AsString(name); - - proname = PLy_procedure_name(exec_ctx->curr_proc); - plain_filename = PLyUnicode_AsString(filename); - plain_lineno = PyLong_AsLong(lineno); - - if (proname == NULL) - appendStringInfo(&tbstr, "\n PL/Python anonymous code block, line %ld, in %s", - plain_lineno - 1, fname); - else - appendStringInfo(&tbstr, "\n PL/Python function \"%s\", line %ld, in %s", - proname, plain_lineno - 1, fname); - - /* - * function code object was compiled with "" as the - * filename - */ - if (exec_ctx->curr_proc && plain_filename != NULL && - strcmp(plain_filename, "") == 0) - { - /* - * If we know the current procedure, append the exact line - * from the source, again mimicking Python's traceback.py - * module behavior. We could store the already line-split - * source to avoid splitting it every time, but producing a - * traceback is not the most important scenario to optimize - * for. But we do not go as far as traceback.py in reading - * the source of imported modules. - */ - line = get_source_line(exec_ctx->curr_proc->src, plain_lineno); - if (line) - { - appendStringInfo(&tbstr, "\n %s", line); - pfree(line); - } - } - } - - Py_DECREF(frame); - Py_DECREF(code); - Py_DECREF(name); - Py_DECREF(lineno); - Py_DECREF(filename); - - /* Release the current frame and go to the next one. */ - tb_prev = tb; + /* Advance to the next frame. */ tb = PyObject_GetAttrString(tb, "tb_next"); - Assert(tb_prev != Py_None); - Py_DECREF(tb_prev); if (tb == NULL) elog(ERROR, "could not traverse Python traceback"); (*tb_depth)++; @@ -339,10 +348,6 @@ PLy_traceback(PyObject *e, PyObject *v, PyObject *tb, /* Return the traceback. */ *tbmsg = tbstr.data; - - Py_XDECREF(e_type_o); - Py_XDECREF(e_module_o); - Py_XDECREF(vob); } /* diff --git a/src/pl/plpython/po/ru.po b/src/pl/plpython/po/ru.po index 0b57951c61093..55c717b2d7011 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: 2025-02-08 07:44+0200\n" +"POT-Creation-Date: 2025-08-02 11:37+0300\n" "PO-Revision-Date: 2019-08-29 15:42+0300\n" "Last-Translator: Alexander Lakhin \n" "Language-Team: Russian \n" @@ -66,7 +66,7 @@ msgstr "" msgid "closing a cursor in an aborted subtransaction" msgstr "закрытие курсора в прерванной подтранзакции" -#: plpy_elog.c:122 plpy_elog.c:123 plpy_plpymodule.c:530 +#: plpy_elog.c:127 plpy_elog.c:128 plpy_plpymodule.c:530 #, c-format msgid "%s" msgstr "%s" diff --git a/src/pl/tcl/Makefile b/src/pl/tcl/Makefile index ea52a2efc229d..dd57f7d694c82 100644 --- a/src/pl/tcl/Makefile +++ b/src/pl/tcl/Makefile @@ -11,7 +11,7 @@ top_builddir = ../../.. include $(top_builddir)/src/Makefile.global -override CPPFLAGS := -I. -I$(srcdir) $(TCL_INCLUDE_SPEC) $(CPPFLAGS) +override CPPFLAGS := -I. -I$(srcdir) $(CPPFLAGS) $(TCL_INCLUDE_SPEC) # On Windows, we don't link directly with the Tcl library; see below ifneq ($(PORTNAME), win32) diff --git a/src/pl/tcl/po/ja.po b/src/pl/tcl/po/ja.po index b29b1b35eba55..3ac5ac4fdfe21 100644 --- a/src/pl/tcl/po/ja.po +++ b/src/pl/tcl/po/ja.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: pltcl (PostgreSQL 17)\n" "Report-Msgid-Bugs-To: pgsql-bugs@lists.postgresql.org\n" -"POT-Creation-Date: 2024-07-08 10:16+0900\n" -"PO-Revision-Date: 2024-07-08 10:28+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" @@ -18,105 +18,105 @@ msgstr "" "Plural-Forms: nplurals=1; plural=0;\n" "X-Generator: Poedit 1.8.13\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/TclU 関数。" -#: pltcl.c:638 +#: pltcl.c:640 #, c-format msgid "function \"%s\" is in the wrong language" msgstr "関数\"%s\"は言語が異なります" -#: pltcl.c:649 +#: 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:683 +#: pltcl.c:685 #, c-format msgid "processing %s parameter" msgstr "%sパラメーターを処理しています" -#: pltcl.c:836 +#: pltcl.c:838 #, c-format msgid "set-valued function called in context that cannot accept a set" msgstr "このコンテキストでは、集合値の関数は集合を受け付けられません" -#: pltcl.c:841 +#: pltcl.c:843 #, c-format msgid "materialize mode required, but it is not allowed in this context" msgstr "マテリアライズモードが必要ですが、現在のコンテクストで禁止されています" -#: pltcl.c:1014 +#: pltcl.c:1016 #, c-format msgid "function returning record called in context that cannot accept type record" msgstr "レコード型を受け付けられないコンテキストでレコードを返す関数が呼び出されました" -#: pltcl.c:1033 +#: pltcl.c:1035 #, c-format msgid "could not parse function return value: %s" msgstr "関数の戻り値をパースできませんでした: %s" -#: pltcl.c:1300 +#: pltcl.c:1302 #, c-format msgid "could not parse trigger return value: %s" msgstr "トリガの戻り値をパースできませんでした: %s" -#: pltcl.c:1401 pltcl.c:1895 +#: pltcl.c:1387 pltcl.c:1814 #, c-format msgid "%s" msgstr "%s" -#: pltcl.c:1402 +#: pltcl.c:1388 #, c-format msgid "" "%s\n" -"in PL/Tcl function %s" +"in PL/Tcl function \"%s\"" msgstr "" "%s\n" -"PL/Tcl 関数 %s 内" +"PL/Tcl 関数 \"%s\" 内" -#: pltcl.c:1630 +#: pltcl.c:1551 #, c-format msgid "trigger functions can only be called as triggers" msgstr "トリガー関数はトリガーとしてのみコールできます" -#: pltcl.c:1634 +#: pltcl.c:1555 #, c-format msgid "PL/Tcl functions cannot return type %s" msgstr "PL/Tcl 関数は%s型の戻り値を返せません" -#: pltcl.c:1673 +#: pltcl.c:1594 #, c-format msgid "PL/Tcl functions cannot accept type %s" msgstr "PL/Tcl 関数は%s型を受け付けません" -#: pltcl.c:1785 +#: pltcl.c:1706 #, c-format msgid "could not create internal procedure \"%s\": %s" msgstr "内部プロシージャ\"%s\"を作成できませんでした: %s" -#: pltcl.c:3292 +#: pltcl.c:3211 #, c-format msgid "column name/value list must have even number of elements" msgstr "列名/値のリストの要素は偶数個でなければなりません" -#: pltcl.c:3310 +#: pltcl.c:3229 #, c-format msgid "column name/value list contains nonexistent column name \"%s\"" msgstr "列名/値のリストの中に、存在しない列名\"%s\"が含まれています" -#: pltcl.c:3317 +#: pltcl.c:3236 #, c-format msgid "cannot set system attribute \"%s\"" msgstr "システム属性\"%s\"は設定できません" -#: pltcl.c:3323 +#: pltcl.c:3242 #, c-format msgid "cannot set generated column \"%s\"" msgstr "生成列\"%s\"を変更できません" diff --git a/src/port/explicit_bzero.c b/src/port/explicit_bzero.c index 735e21c8b36da..7d2ad7439f764 100644 --- a/src/port/explicit_bzero.c +++ b/src/port/explicit_bzero.c @@ -12,9 +12,11 @@ *------------------------------------------------------------------------- */ +#define __STDC_WANT_LIB_EXT1__ 1 /* needed to access memset_s() */ + #include "c.h" -#if defined(HAVE_MEMSET_S) +#if HAVE_DECL_MEMSET_S void explicit_bzero(void *buf, size_t len) diff --git a/src/port/pqsignal.c b/src/port/pqsignal.c index bbd28da080531..9dadce8357dca 100644 --- a/src/port/pqsignal.c +++ b/src/port/pqsignal.c @@ -87,6 +87,9 @@ wrapper_handler(SIGNAL_ARGS) { int save_errno = errno; + Assert(postgres_signal_arg > 0); + Assert(postgres_signal_arg < PG_NSIG); + #ifndef FRONTEND /* @@ -139,6 +142,7 @@ pqsignal(int signo, pqsigfunc func) pqsigfunc ret; #endif + Assert(signo > 0); Assert(signo < PG_NSIG); if (func != SIG_IGN && func != SIG_DFL) diff --git a/src/port/snprintf.c b/src/port/snprintf.c index 884f0262dd15c..14fb1783866c5 100644 --- a/src/port/snprintf.c +++ b/src/port/snprintf.c @@ -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/strtof.c b/src/port/strtof.c index b93bafd1dfa6d..43d88f8f802b8 100644 --- a/src/port/strtof.c +++ b/src/port/strtof.c @@ -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/test/isolation/expected/merge-match-recheck.out b/src/test/isolation/expected/merge-match-recheck.out index 9a44a5959270b..90300f1db5ab3 100644 --- a/src/test/isolation/expected/merge-match-recheck.out +++ b/src/test/isolation/expected/merge-match-recheck.out @@ -241,19 +241,28 @@ starting permutation: update_bal1_tg merge_bal_tg c2 select1_tg c1 s2: NOTICE: Update: (1,160,s1,setup) -> (1,50,s1,"setup updated by update_bal1_tg") step update_bal1_tg: UPDATE target_tg t SET balance = 50, val = t.val || ' updated by update_bal1_tg' WHERE t.key = 1; step merge_bal_tg: - MERGE INTO target_tg t - USING (SELECT 1 as key) s - ON s.key = t.key - WHEN MATCHED AND balance < 100 THEN - UPDATE SET balance = balance * 2, val = t.val || ' when1' - WHEN MATCHED AND balance < 200 THEN - UPDATE SET balance = balance * 4, val = t.val || ' when2' - WHEN MATCHED AND balance < 300 THEN - UPDATE SET balance = balance * 8, val = t.val || ' when3'; + WITH t AS ( + MERGE INTO target_tg t + USING (SELECT 1 as key) s + ON s.key = t.key + WHEN MATCHED AND balance < 100 THEN + UPDATE SET balance = balance * 2, val = t.val || ' when1' + WHEN MATCHED AND balance < 200 THEN + UPDATE SET balance = balance * 4, val = t.val || ' when2' + WHEN MATCHED AND balance < 300 THEN + UPDATE SET balance = balance * 8, val = t.val || ' when3' + RETURNING t.* + ) + SELECT * FROM t; step c2: COMMIT; s1: NOTICE: Update: (1,50,s1,"setup updated by update_bal1_tg") -> (1,100,s1,"setup updated by update_bal1_tg when1") step merge_bal_tg: <... completed> +key|balance|status|val +---+-------+------+------------------------------------- + 1| 100|s1 |setup updated by update_bal1_tg when1 +(1 row) + step select1_tg: SELECT * FROM target_tg; key|balance|status|val ---+-------+------+------------------------------------- diff --git a/src/test/isolation/specs/merge-match-recheck.spec b/src/test/isolation/specs/merge-match-recheck.spec index 298b2bfdcd609..22688bb635525 100644 --- a/src/test/isolation/specs/merge-match-recheck.spec +++ b/src/test/isolation/specs/merge-match-recheck.spec @@ -99,15 +99,19 @@ step "merge_bal_pa" } step "merge_bal_tg" { - MERGE INTO target_tg t - USING (SELECT 1 as key) s - ON s.key = t.key - WHEN MATCHED AND balance < 100 THEN - UPDATE SET balance = balance * 2, val = t.val || ' when1' - WHEN MATCHED AND balance < 200 THEN - UPDATE SET balance = balance * 4, val = t.val || ' when2' - WHEN MATCHED AND balance < 300 THEN - UPDATE SET balance = balance * 8, val = t.val || ' when3'; + WITH t AS ( + MERGE INTO target_tg t + USING (SELECT 1 as key) s + ON s.key = t.key + WHEN MATCHED AND balance < 100 THEN + UPDATE SET balance = balance * 2, val = t.val || ' when1' + WHEN MATCHED AND balance < 200 THEN + UPDATE SET balance = balance * 4, val = t.val || ' when2' + WHEN MATCHED AND balance < 300 THEN + UPDATE SET balance = balance * 8, val = t.val || ' when3' + RETURNING t.* + ) + SELECT * FROM t; } step "merge_delete" diff --git a/src/test/modules/commit_ts/t/001_base.pl b/src/test/modules/commit_ts/t/001_base.pl index e608ec67704af..638e3f15cec9d 100644 --- a/src/test/modules/commit_ts/t/001_base.pl +++ b/src/test/modules/commit_ts/t/001_base.pl @@ -11,8 +11,7 @@ use PostgreSQL::Test::Cluster; my $node = PostgreSQL::Test::Cluster->new('foxtrot'); -$node->init; -$node->append_conf('postgresql.conf', 'track_commit_timestamp = on'); +$node->init(extra => [ '-c', "track_commit_timestamp=on" ]); $node->start; # Create a table, compare "now()" to the commit TS of its xmin diff --git a/src/test/modules/injection_points/Makefile b/src/test/modules/injection_points/Makefile index f19c9643ba968..84ff27c5c5672 100644 --- a/src/test/modules/injection_points/Makefile +++ b/src/test/modules/injection_points/Makefile @@ -9,7 +9,7 @@ EXTENSION = injection_points DATA = injection_points--1.0.sql PGFILEDESC = "injection_points - facility for injection points" -REGRESS = injection_points reindex_conc +REGRESS = injection_points reindex_conc vacuum REGRESS_OPTS = --dlpath=$(top_builddir)/src/test/regress ISOLATION = inplace syscache-update-pruned diff --git a/src/test/modules/injection_points/expected/syscache-update-pruned.out b/src/test/modules/injection_points/expected/syscache-update-pruned.out index 5dc5a1ddc5e4b..a6a4e8db996b1 100644 --- a/src/test/modules/injection_points/expected/syscache-update-pruned.out +++ b/src/test/modules/injection_points/expected/syscache-update-pruned.out @@ -7,11 +7,11 @@ step at2: FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); step waitprunable4: CALL vactest.wait_prunable(); -step vac4: VACUUM pg_class; +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('AtEOXact_Inval-with-transInvalInfo'); - SELECT FROM injection_points_wakeup('AtEOXact_Inval-with-transInvalInfo'); + SELECT FROM injection_points_detach('transaction-end-process-inval'); + SELECT FROM injection_points_wakeup('transaction-end-process-inval'); step at2: <... completed> step wakeinval4: <... completed> @@ -30,11 +30,11 @@ step at2: FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); step waitprunable4: CALL vactest.wait_prunable(); -step vac4: VACUUM pg_class; +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('AtEOXact_Inval-with-transInvalInfo'); - SELECT FROM injection_points_wakeup('AtEOXact_Inval-with-transInvalInfo'); + SELECT FROM injection_points_detach('transaction-end-process-inval'); + SELECT FROM injection_points_wakeup('transaction-end-process-inval'); step at2: <... completed> step wakeinval4: <... completed> @@ -61,11 +61,11 @@ step mkrels4: step r3: ROLLBACK; step waitprunable4: CALL vactest.wait_prunable(); -step vac4: VACUUM pg_class; +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('AtEOXact_Inval-with-transInvalInfo'); - SELECT FROM injection_points_wakeup('AtEOXact_Inval-with-transInvalInfo'); + SELECT FROM injection_points_detach('transaction-end-process-inval'); + SELECT FROM injection_points_wakeup('transaction-end-process-inval'); step at2: <... completed> step wakeinval4: <... completed> 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 index b18857c902eb7..4dca2b86bc888 100644 --- a/src/test/modules/injection_points/expected/syscache-update-pruned_1.out +++ b/src/test/modules/injection_points/expected/syscache-update-pruned_1.out @@ -7,11 +7,11 @@ step at2: FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); step waitprunable4: CALL vactest.wait_prunable(); -step vac4: VACUUM pg_class; +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('AtEOXact_Inval-with-transInvalInfo'); - SELECT FROM injection_points_wakeup('AtEOXact_Inval-with-transInvalInfo'); + SELECT FROM injection_points_detach('transaction-end-process-inval'); + SELECT FROM injection_points_wakeup('transaction-end-process-inval'); step at2: <... completed> step wakeinval4: <... completed> @@ -29,11 +29,11 @@ step at2: FOR EACH ROW EXECUTE PROCEDURE suppress_redundant_updates_trigger(); step waitprunable4: CALL vactest.wait_prunable(); -step vac4: VACUUM pg_class; +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('AtEOXact_Inval-with-transInvalInfo'); - SELECT FROM injection_points_wakeup('AtEOXact_Inval-with-transInvalInfo'); + SELECT FROM injection_points_detach('transaction-end-process-inval'); + SELECT FROM injection_points_wakeup('transaction-end-process-inval'); step at2: <... completed> step wakeinval4: <... completed> @@ -59,11 +59,11 @@ step mkrels4: step r3: ROLLBACK; step waitprunable4: CALL vactest.wait_prunable(); -step vac4: VACUUM pg_class; +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('AtEOXact_Inval-with-transInvalInfo'); - SELECT FROM injection_points_wakeup('AtEOXact_Inval-with-transInvalInfo'); + SELECT FROM injection_points_detach('transaction-end-process-inval'); + SELECT FROM injection_points_wakeup('transaction-end-process-inval'); step at2: <... completed> step wakeinval4: <... completed> diff --git a/src/test/modules/injection_points/expected/vacuum.out b/src/test/modules/injection_points/expected/vacuum.out new file mode 100644 index 0000000000000..f07152342d5ce --- /dev/null +++ b/src/test/modules/injection_points/expected/vacuum.out @@ -0,0 +1,103 @@ +-- Tests for VACUUM +CREATE EXTENSION injection_points; +SELECT injection_points_set_local(); + injection_points_set_local +---------------------------- + +(1 row) + +SELECT injection_points_attach('vacuum-index-cleanup-auto', 'notice'); + injection_points_attach +------------------------- + +(1 row) + +SELECT injection_points_attach('vacuum-index-cleanup-disabled', 'notice'); + injection_points_attach +------------------------- + +(1 row) + +SELECT injection_points_attach('vacuum-index-cleanup-enabled', 'notice'); + injection_points_attach +------------------------- + +(1 row) + +SELECT injection_points_attach('vacuum-truncate-auto', 'notice'); + injection_points_attach +------------------------- + +(1 row) + +SELECT injection_points_attach('vacuum-truncate-disabled', 'notice'); + injection_points_attach +------------------------- + +(1 row) + +SELECT injection_points_attach('vacuum-truncate-enabled', 'notice'); + injection_points_attach +------------------------- + +(1 row) + +-- Check state of index_cleanup and truncate in VACUUM. +CREATE TABLE vac_tab_on_toast_off(i int, j text) WITH + (autovacuum_enabled=false, + vacuum_index_cleanup=true, toast.vacuum_index_cleanup=false, + vacuum_truncate=true, toast.vacuum_truncate=false); +CREATE TABLE vac_tab_off_toast_on(i int, j text) WITH + (autovacuum_enabled=false, + vacuum_index_cleanup=false, toast.vacuum_index_cleanup=true, + vacuum_truncate=false, toast.vacuum_truncate=true); +-- Multiple relations should use their options in isolation. +VACUUM vac_tab_on_toast_off, vac_tab_off_toast_on; +NOTICE: notice triggered for injection point vacuum-index-cleanup-enabled +NOTICE: notice triggered for injection point vacuum-truncate-enabled +NOTICE: notice triggered for injection point vacuum-index-cleanup-disabled +NOTICE: notice triggered for injection point vacuum-truncate-disabled +NOTICE: notice triggered for injection point vacuum-index-cleanup-disabled +NOTICE: notice triggered for injection point vacuum-truncate-disabled +NOTICE: notice triggered for injection point vacuum-index-cleanup-enabled +NOTICE: notice triggered for injection point vacuum-truncate-enabled +DROP TABLE vac_tab_on_toast_off; +DROP TABLE vac_tab_off_toast_on; +-- Cleanup +SELECT injection_points_detach('vacuum-index-cleanup-auto'); + injection_points_detach +------------------------- + +(1 row) + +SELECT injection_points_detach('vacuum-index-cleanup-disabled'); + injection_points_detach +------------------------- + +(1 row) + +SELECT injection_points_detach('vacuum-index-cleanup-enabled'); + injection_points_detach +------------------------- + +(1 row) + +SELECT injection_points_detach('vacuum-truncate-auto'); + injection_points_detach +------------------------- + +(1 row) + +SELECT injection_points_detach('vacuum-truncate-disabled'); + injection_points_detach +------------------------- + +(1 row) + +SELECT injection_points_detach('vacuum-truncate-enabled'); + injection_points_detach +------------------------- + +(1 row) + +DROP EXTENSION injection_points; diff --git a/src/test/modules/injection_points/meson.build b/src/test/modules/injection_points/meson.build index 169c415f9c478..c1892d760aa55 100644 --- a/src/test/modules/injection_points/meson.build +++ b/src/test/modules/injection_points/meson.build @@ -34,6 +34,7 @@ tests += { 'sql': [ 'injection_points', 'reindex_conc', + 'vacuum', ], 'regress_args': ['--dlpath', meson.build_root() / 'src/test/regress'], # The injection points are cluster-wide, so disable installcheck diff --git a/src/test/modules/injection_points/regress_injection.c b/src/test/modules/injection_points/regress_injection.c index 422f4168935fb..7bba1c97d0f26 100644 --- a/src/test/modules/injection_points/regress_injection.c +++ b/src/test/modules/injection_points/regress_injection.c @@ -17,7 +17,9 @@ #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" /* @@ -28,11 +30,12 @@ * 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 arranges for concurrent activity not to reach - * AbortTransaction() and not to allocate an XID while connected to another - * database. Non-runningcheck tests can control most concurrent activity, - * except autovacuum and the isolationtester control connection. Neither - * allocates XIDs, and AbortTransaction() in those would justify test failure. + * 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 @@ -47,6 +50,10 @@ removable_cutoff(PG_FUNCTION_ARGS) 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 diff --git a/src/test/modules/injection_points/specs/syscache-update-pruned.spec b/src/test/modules/injection_points/specs/syscache-update-pruned.spec index b48e897431e39..e3a4295bd12e8 100644 --- a/src/test/modules/injection_points/specs/syscache-update-pruned.spec +++ b/src/test/modules/injection_points/specs/syscache-update-pruned.spec @@ -53,10 +53,12 @@ setup barrier := pg_current_xact_id(); -- autovacuum worker RelationCacheInitializePhase3() or the -- isolationtester control connection might hold a snapshot that - -- limits pruning. Sleep until that clears. + -- 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_class'); + cutoff := removable_cutoff('pg_database'); EXIT WHEN cutoff >= barrier; RAISE LOG 'removable cutoff %; waiting for %', cutoff, barrier; PERFORM pg_sleep(.1); @@ -64,9 +66,24 @@ setup END $$; } -setup { CALL vactest.wait_prunable(); -- maximize next two VACUUMs } +# 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 } -setup { VACUUM FREEZE pg_class; -- populate fsm etc. } +# 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); @@ -100,7 +117,7 @@ session s2 setup { SELECT FROM injection_points_set_local(); SELECT FROM - injection_points_attach('AtEOXact_Inval-with-transInvalInfo', 'wait'); + injection_points_attach('transaction-end-process-inval', 'wait'); } step at2 { CREATE TRIGGER to_set_relhastriggers BEFORE UPDATE ON vactest.orig50 @@ -115,7 +132,8 @@ step r3 { ROLLBACK; } # Non-blocking actions. session s4 step waitprunable4 { CALL vactest.wait_prunable(); } -step vac4 { VACUUM pg_class; } +# 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 { @@ -127,8 +145,8 @@ step wakegrant4 { } step at4 { ALTER TABLE vactest.child50 INHERIT vactest.orig50; } step wakeinval4 { - SELECT FROM injection_points_detach('AtEOXact_Inval-with-transInvalInfo'); - SELECT FROM injection_points_wakeup('AtEOXact_Inval-with-transInvalInfo'); + 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 { diff --git a/src/test/modules/injection_points/sql/vacuum.sql b/src/test/modules/injection_points/sql/vacuum.sql new file mode 100644 index 0000000000000..a799116b6cb6f --- /dev/null +++ b/src/test/modules/injection_points/sql/vacuum.sql @@ -0,0 +1,35 @@ +-- Tests for VACUUM + +CREATE EXTENSION injection_points; + +SELECT injection_points_set_local(); +SELECT injection_points_attach('vacuum-index-cleanup-auto', 'notice'); +SELECT injection_points_attach('vacuum-index-cleanup-disabled', 'notice'); +SELECT injection_points_attach('vacuum-index-cleanup-enabled', 'notice'); +SELECT injection_points_attach('vacuum-truncate-auto', 'notice'); +SELECT injection_points_attach('vacuum-truncate-disabled', 'notice'); +SELECT injection_points_attach('vacuum-truncate-enabled', 'notice'); + +-- Check state of index_cleanup and truncate in VACUUM. +CREATE TABLE vac_tab_on_toast_off(i int, j text) WITH + (autovacuum_enabled=false, + vacuum_index_cleanup=true, toast.vacuum_index_cleanup=false, + vacuum_truncate=true, toast.vacuum_truncate=false); +CREATE TABLE vac_tab_off_toast_on(i int, j text) WITH + (autovacuum_enabled=false, + vacuum_index_cleanup=false, toast.vacuum_index_cleanup=true, + vacuum_truncate=false, toast.vacuum_truncate=true); +-- Multiple relations should use their options in isolation. +VACUUM vac_tab_on_toast_off, vac_tab_off_toast_on; + +DROP TABLE vac_tab_on_toast_off; +DROP TABLE vac_tab_off_toast_on; + +-- Cleanup +SELECT injection_points_detach('vacuum-index-cleanup-auto'); +SELECT injection_points_detach('vacuum-index-cleanup-disabled'); +SELECT injection_points_detach('vacuum-index-cleanup-enabled'); +SELECT injection_points_detach('vacuum-truncate-auto'); +SELECT injection_points_detach('vacuum-truncate-disabled'); +SELECT injection_points_detach('vacuum-truncate-enabled'); +DROP EXTENSION injection_points; diff --git a/src/test/modules/test_dsm_registry/test_dsm_registry.c b/src/test/modules/test_dsm_registry/test_dsm_registry.c index 96eaa850bfa92..9aa96dc45d1bb 100644 --- a/src/test/modules/test_dsm_registry/test_dsm_registry.c +++ b/src/test/modules/test_dsm_registry/test_dsm_registry.c @@ -54,7 +54,7 @@ set_val_in_shmem(PG_FUNCTION_ARGS) tdr_attach_shmem(); LWLockAcquire(&tdr_state->lck, LW_EXCLUSIVE); - tdr_state->val = PG_GETARG_UINT32(0); + tdr_state->val = PG_GETARG_INT32(0); LWLockRelease(&tdr_state->lck); PG_RETURN_VOID(); @@ -72,5 +72,5 @@ get_val_in_shmem(PG_FUNCTION_ARGS) ret = tdr_state->val; LWLockRelease(&tdr_state->lck); - PG_RETURN_UINT32(ret); + PG_RETURN_INT32(ret); } diff --git a/src/test/modules/test_escape/test_escape.c b/src/test/modules/test_escape/test_escape.c index 09303a00a20a8..7208c12187f4b 100644 --- a/src/test/modules/test_escape/test_escape.c +++ b/src/test/modules/test_escape/test_escape.c @@ -12,6 +12,7 @@ #include #include +#include "common/jsonapi.h" #include "fe_utils/psqlscan.h" #include "fe_utils/string_utils.h" #include "getopt_long.h" @@ -31,6 +32,8 @@ typedef struct pe_test_config int failure_count; } pe_test_config; +#define NEVER_ACCESS_STR "\xff never-to-be-touched" + /* * An escape function to be tested by this test. @@ -86,6 +89,164 @@ static const PsqlScanCallbacks test_scan_callbacks = { }; +/* + * 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, @@ -376,88 +537,23 @@ static pe_test_vector pe_test_vectors[] = * 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), }; -/* - * 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, - PQExpBuffer testname, - PQExpBuffer 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->data); - - if (print_result) - printf("%s %d - %s: %s: %s\n", - success ? "ok" : "not ok", - test_id, testname->data, - 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; -} - static const char * scan_res_s(PsqlScanResult res) { @@ -532,7 +628,7 @@ test_psql_parse(pe_test_config *tc, PQExpBuffer testname, else resdesc = "ok"; - report_result(tc, !test_fails, testname, details, + report_result(tc, !test_fails, testname->data, details->data, "psql parse", resdesc); } @@ -617,7 +713,6 @@ test_one_vector_escape(pe_test_config *tc, const pe_test_vector *tv, const pe_te */ appendBinaryPQExpBuffer(raw_buf, tv->escape, tv->escape_len); -#define NEVER_ACCESS_STR "\xff never-to-be-touched" if (ef->supports_input_length) { /* @@ -671,7 +766,7 @@ test_one_vector_escape(pe_test_config *tc, const pe_test_vector *tv, const pe_te * here, but that's not available everywhere. */ contains_never = strstr(escape_buf->data, NEVER_ACCESS_STR) == NULL; - report_result(tc, contains_never, testname, details, + report_result(tc, contains_never, testname->data, details->data, "escaped data beyond end of input", contains_never ? "no" : "all secrets revealed"); } @@ -714,7 +809,7 @@ test_one_vector_escape(pe_test_config *tc, const pe_test_vector *tv, const pe_te resdesc = "valid input failed to escape, due to zero byte"; } - report_result(tc, ok, testname, details, + report_result(tc, ok, testname->data, details->data, "input validity vs escape success", resdesc); } @@ -744,7 +839,7 @@ test_one_vector_escape(pe_test_config *tc, const pe_test_vector *tv, const pe_te resdesc = "invalid input produced valid output"; } - report_result(tc, ok, testname, details, + report_result(tc, ok, testname->data, details->data, "input and escaped encoding validity", resdesc); } @@ -801,7 +896,7 @@ usage(const char *hint) " -c, --conninfo=CONNINFO connection information to use\n" " -v, --verbose show test details even for successes\n" " -q, --quiet only show failures\n" - " --force-unsupported test invalid input even if unsupported\n" + " -f, --force-unsupported test invalid input even if unsupported\n" ); if (hint) @@ -824,7 +919,7 @@ main(int argc, char *argv[]) {NULL, 0, NULL, 0}, }; - while ((c = getopt_long(argc, argv, "vqh", long_options, &option_index)) != -1) + while ((c = getopt_long(argc, argv, "c:fhqv", long_options, &option_index)) != -1) { switch (c) { @@ -862,6 +957,9 @@ main(int argc, char *argv[]) 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]); diff --git a/src/test/modules/test_misc/t/008_percona_server_version.pl b/src/test/modules/test_misc/t/008_percona_server_version.pl new file mode 100644 index 0000000000000..8dc0ff0621d8d --- /dev/null +++ b/src/test/modules/test_misc/t/008_percona_server_version.pl @@ -0,0 +1,62 @@ +#!/usr/bin/perl +use strict; +use warnings FATAL => 'all'; +use PostgreSQL::Test::Cluster; +use PostgreSQL::Test::Utils; +use Test::More; +use lib 't'; +use Env; + +plan tests => 6; + +# Initialize a test cluster +my $node = PostgreSQL::Test::Cluster->new('pg_server'); +$node->init(); +my $pgdata = $node->data_dir; + +# To make this testcase work, PERCONA_SERVER_VERSION variable should be available in environment. +# If you are using ci_scripts it is already declated in ci_scripts/env.sh +# If you are using command line make for regression then export like: +# export PERCONA_SERVER_VERSION=17.5.3 + +if (!defined($ENV{PERCONA_SERVER_VERSION})) +{ + BAIL_OUT("PERCONA_SERVER_VERSION variable not present in the environment"); +} + +my $percona_expected_server_version = $ENV{PERCONA_SERVER_VERSION}; + +# Start server +my $rt_value = $node->start; +ok($rt_value == 1, "Start Server"); + +# Get PG Server version (e.g 17.4) from pg_config +my $pg_server_version = `pg_config --version | awk {'print \$2'}`; +$pg_server_version=~ s/^\s+|\s+$//g; + +# Check pg_config output. +my $pg_config_output = `pg_config --version`; +$pg_config_output=~ s/^\s+|\s+$//g; +cmp_ok($pg_config_output,'eq',"PostgreSQL $pg_server_version - Percona Server for PostgreSQL $percona_expected_server_version", "Test pg_config --version output"); + +# Check psql --version output. +my $psql_version_output = `psql --version`; +$psql_version_output=~ s/^\s+|\s+$//g; +cmp_ok($psql_version_output,'eq',"psql (PostgreSQL) $pg_server_version - Percona Server for PostgreSQL $percona_expected_server_version", "Test psql --version output"); + +# Check postgres --version output. +my $postgres_output = `postgres --version`; +$postgres_output=~ s/^\s+|\s+$//g; +cmp_ok($postgres_output,'eq',"postgres (PostgreSQL) $pg_server_version - Percona Server for PostgreSQL $percona_expected_server_version", "Test postgres --version output"); + +# Check select version() output. +my ($cmdret, $stdout, $stderr) = $node->psql('postgres', "select version();", extra_params => ['-a', '-Pformat=aligned','-Ptuples_only=on']); +ok($cmdret == 0, "# Get output of select version();"); +$stdout=~ s/^\s+|\s+$//g; +like($stdout, "/PostgreSQL $pg_server_version - Percona Server for PostgreSQL $percona_expected_server_version/", "Test select version() output"); + +# Stop the server +$node->stop; + +# Done testing for this testcase file. +done_testing(); diff --git a/src/test/modules/test_shm_mq/worker.c b/src/test/modules/test_shm_mq/worker.c index 6c4fbc7827471..ff6e6712bb376 100644 --- a/src/test/modules/test_shm_mq/worker.c +++ b/src/test/modules/test_shm_mq/worker.c @@ -77,7 +77,7 @@ test_shm_mq_main(Datum main_arg) * exit, which is fine. If there were a ResourceOwner, it would acquire * ownership of the mapping, but we have no need for that. */ - seg = dsm_attach(DatumGetInt32(main_arg)); + seg = dsm_attach(DatumGetUInt32(main_arg)); if (seg == NULL) ereport(ERROR, (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), diff --git a/src/test/perl/Makefile b/src/test/perl/Makefile index 82ea63b08e2dd..810346844cce3 100644 --- a/src/test/perl/Makefile +++ b/src/test/perl/Makefile @@ -24,6 +24,9 @@ install: all installdirs $(INSTALL_DATA) $(srcdir)/PostgreSQL/Test/RecursiveCopy.pm '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/RecursiveCopy.pm' $(INSTALL_DATA) $(srcdir)/PostgreSQL/Test/Cluster.pm '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/Cluster.pm' $(INSTALL_DATA) $(srcdir)/PostgreSQL/Test/BackgroundPsql.pm '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/BackgroundPsql.pm' + $(INSTALL_DATA) $(srcdir)/PostgreSQL/Test/Kerberos.pm '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/Kerberos.pm' + $(INSTALL_DATA) $(srcdir)/PostgreSQL/Test/AdjustUpgrade.pm '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/AdjustUpgrade.pm' + $(INSTALL_DATA) $(srcdir)/PostgreSQL/Test/TdeCluster.pm '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/TdeCluster.pm' $(INSTALL_DATA) $(srcdir)/PostgreSQL/Version.pm '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Version.pm' uninstall: @@ -32,6 +35,9 @@ uninstall: rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/RecursiveCopy.pm' rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/Cluster.pm' rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/BackgroundPsql.pm' + rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/Kerberos.pm' + rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/AdjustUpgrade.pm' + rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Test/TdeCluster.pm' rm -f '$(DESTDIR)$(pgxsdir)/$(subdir)/PostgreSQL/Version.pm' endif diff --git a/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm b/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm index 3cec72d9d4ff2..90c74bde40bf0 100644 --- a/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm +++ b/src/test/perl/PostgreSQL/Test/AdjustUpgrade.pm @@ -511,6 +511,7 @@ my @_unused_view_qualifiers = ( { obj => 'VIEW public.limit_thousand_v_2', qual => 'onek' }, { obj => 'VIEW public.limit_thousand_v_3', qual => 'onek' }, { obj => 'VIEW public.limit_thousand_v_4', qual => 'onek' }, + { obj => 'VIEW public.limit_thousand_v_5', qual => 'onek' }, # Since 14 { obj => 'MATERIALIZED VIEW public.compressmv', qual => 'cmdata1' }); @@ -627,6 +628,12 @@ sub adjust_new_dumpfile # 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 3c2aca1c5d7bc..a552132484ec9 100644 --- a/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm +++ b/src/test/perl/PostgreSQL/Test/BackgroundPsql.pm @@ -68,7 +68,7 @@ use Test::More; =over -=item PostgreSQL::Test::BackgroundPsql->new(interactive, @psql_params, timeout) +=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, $timeout) = @_; + my ($interactive, $psql_params, $timeout, $wait) = @_; my $psql = { 'stdin' => '', 'stdout' => '', 'stderr' => '', - 'query_timer_restart' => undef + 'query_timer_restart' => undef, + 'query_cnt' => 1, }; my $run; @@ -119,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) = @_; @@ -134,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; } @@ -187,7 +216,7 @@ sub reconnect_and_clear $self->{stdin} = ''; $self->{stdout} = ''; - $self->_wait_connect(); + $self->wait_connect(); } =pod @@ -205,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\n$//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} = ''; diff --git a/src/test/perl/PostgreSQL/Test/Cluster.pm b/src/test/perl/PostgreSQL/Test/Cluster.pm index d7a5deda7d9cb..45ee854a724a7 100644 --- a/src/test/perl/PostgreSQL/Test/Cluster.pm +++ b/src/test/perl/PostgreSQL/Test/Cluster.pm @@ -107,6 +107,7 @@ use File::Temp (); use IPC::Run; use PostgreSQL::Version; use PostgreSQL::Test::RecursiveCopy; +use PostgreSQL::Test::TdeCluster; use Socket; use Test::More; use PostgreSQL::Test::Utils (); @@ -167,9 +168,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; @@ -1529,6 +1528,11 @@ sub new } } + if ($PostgreSQL::Test::TdeCluster::tde_mode) + { + bless $node, 'PostgreSQL::Test::TdeCluster'; + } + # Add node to list of nodes push(@all_nodes, $node); @@ -2191,6 +2195,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 @@ -2214,13 +2224,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, $timeout); + return PostgreSQL::Test::BackgroundPsql->new(0, \@psql_params, $timeout, + $params{wait}); } =pod @@ -2698,7 +2710,7 @@ sub log_content =pod -=item $node->log_check($offset, $test_name, %parameters) +=item $node->log_check($test_name, $offset, %params) Check contents of server logs. diff --git a/src/test/perl/PostgreSQL/Test/TdeCluster.pm b/src/test/perl/PostgreSQL/Test/TdeCluster.pm new file mode 100644 index 0000000000000..068989dfebe6f --- /dev/null +++ b/src/test/perl/PostgreSQL/Test/TdeCluster.pm @@ -0,0 +1,250 @@ +package PostgreSQL::Test::TdeCluster; + +use parent 'PostgreSQL::Test::Cluster'; + +use strict; +use warnings FATAL => 'all'; + +use List::Util (); +use PostgreSQL::Test::RecursiveCopy (); +use PostgreSQL::Test::Utils (); +use Test::More; + +our $tde_mode = defined($ENV{TDE_MODE}) ? $ENV{TDE_MODE} + 0 : 0; +my $tde_mode_noskip = defined($ENV{TDE_MODE_NOSKIP}) ? $ENV{TDE_MODE_NOSKIP} + 0 : 0; +my $tde_mode_smgr = defined($ENV{TDE_MODE_SMGR}) ? $ENV{TDE_MODE_SMGR} + 0 : $tde_mode; +my $tde_mode_wal = defined($ENV{TDE_MODE_WAL}) ? $ENV{TDE_MODE_WAL} + 0 : $tde_mode; + +sub init +{ + my ($self, %params) = @_; + + $self->SUPER::init(%params); + + $self->SUPER::append_conf('postgresql.conf', + 'shared_preload_libraries = pg_tde'); + + $self->_tde_init_pg_tde_dir($params{extra}); + + if ($tde_mode_smgr) + { + # Enable the TDE extension in all databases created by initdb, this is + # necessary for the tde_heap access method to be available everywhere. + foreach ('postgres', 'template0', 'template1') + { + _tde_init_sql_command( + $self->data_dir, $_, q( + CREATE SCHEMA _pg_tde; + CREATE EXTENSION pg_tde WITH SCHEMA _pg_tde; + )); + } + $self->SUPER::append_conf('postgresql.conf', + 'default_table_access_method = tde_heap'); + } + + if ($tde_mode_wal) + { + $self->SUPER::append_conf('postgresql.conf', + 'pg_tde.wal_encrypt = on'); + } + + return; +} + +sub append_conf +{ + my ($self, $filename, $str) = @_; + + if ($filename eq 'postgresql.conf' or $filename eq 'postgresql.auto.conf') + { + # TODO: Will not work with shared_preload_libraries= without any + # libraries, but no TAP test currently do that. + $str =~ + s/shared_preload_libraries *= *'?([^'\n]+)'?/shared_preload_libraries = 'pg_tde,$1'/; + } + + $self->SUPER::append_conf($filename, $str); +} + +sub backup +{ + my ($self, $backup_name, %params) = @_; + my $backup_dir = $self->backup_dir . '/' . $backup_name; + + mkdir $backup_dir or die "mkdir($backup_dir) failed: $!"; + + if ($tde_mode_wal) + { + PostgreSQL::Test::Utils::system_log('cp', '-R', '-P', '-p', + $self->pg_tde_dir, $backup_dir . '/pg_tde',); + + # TODO: More thorough checking for options incompatible with --encrypt-wal + $params{backup_options} = [] unless defined $params{backup_options}; + unless ( + List::Util::any { $_ eq '-Ft' or $_ eq '-Xnone' } + @{ $params{backup_options} }) + { + push @{ $params{backup_options} }, '--encrypt-wal'; + } + } + + $self->SUPER::backup($backup_name, %params); +} + +sub enable_archiving +{ + my ($self) = @_; + my $path = $self->archive_dir; + + $self->SUPER::enable_archiving; + if ($tde_mode_wal) + { + $self->adjust_conf('postgresql.conf', 'archive_command', + qq('pg_tde_archive_decrypt %f %p "cp \\"%%p\\" \\"$path/%%f\\""') + ); + } + + return; +} + +sub enable_restoring +{ + my ($self, $root_node, $standby) = @_; + my $path = $root_node->archive_dir; + + $self->SUPER::enable_restoring($root_node, $standby); + if ($tde_mode_wal) + { + $self->adjust_conf('postgresql.conf', 'restore_command', + qq('pg_tde_restore_encrypt %f %p "cp \\"$path/%%f\\" \\"%%p\\""') + ); + } + + return; +} + +sub pg_tde_dir +{ + my ($self) = @_; + return $self->data_dir . '/pg_tde'; +} + +sub _tde_init_pg_tde_dir +{ + my ($self, $extra) = @_; + my $tde_source_dir; + + if (defined($extra)) + { + $tde_source_dir = $self->_tde_generate_pg_tde_dir($extra); + } + else + { + $tde_source_dir = $self->_tde_init_pg_tde_dir_template; + } + + PostgreSQL::Test::Utils::system_log('cp', '-R', '-P', '-p', + $tde_source_dir . '/pg_tde', + $self->pg_tde_dir); + + # We don't want clusters sharing the KMS file as any concurrent writes will + # mess it up. + PostgreSQL::Test::Utils::system_log( + 'cp', '-R', '-P', '-p', + $tde_source_dir . '/pg_tde_test_keys', + $self->basedir . '/pg_tde_test_keys'); + + PostgreSQL::Test::Utils::system_log( + 'pg_tde_change_key_provider', + '-D' => $self->data_dir, + '1664', + 'global_test_provider', + 'file', + $self->basedir . '/pg_tde_test_keys'); +} + +sub _tde_init_pg_tde_dir_template +{ + my ($self) = @_; + my $tde_template_dir; + + if (defined($ENV{TDE_TEMPLATE_DIR})) + { + $tde_template_dir = $ENV{TDE_TEMPLATE_DIR}; + } + else + { + $tde_template_dir = + $PostgreSQL::Test::Utils::tmp_check . '/pg_tde_template'; + } + + unless (-e $tde_template_dir) + { + my $temp_dir = $self->_tde_generate_pg_tde_dir; + mkdir $tde_template_dir; + + PostgreSQL::Test::Utils::system_log('cp', '-R', '-P', '-p', + $temp_dir . '/pg_tde', + $tde_template_dir); + + PostgreSQL::Test::Utils::system_log( + 'cp', '-R', '-P', '-p', + $temp_dir . '/pg_tde_test_keys', + $tde_template_dir . '/pg_tde_test_keys'); + } + + return $tde_template_dir; +} + +sub _tde_generate_pg_tde_dir +{ + my ($self, $extra) = @_; + my $temp_dir = PostgreSQL::Test::Utils::tempdir(); + + PostgreSQL::Test::Utils::system_log( + 'initdb', + '-D' => $temp_dir, + '--set' => 'shared_preload_libraries=pg_tde', + @{ $extra }); + + _tde_init_sql_command( + $temp_dir, 'postgres', qq( + CREATE EXTENSION pg_tde; + SELECT pg_tde_add_global_key_provider_file('global_test_provider', '$temp_dir/pg_tde_test_keys'); + SELECT pg_tde_create_key_using_global_key_provider('default_test_key', 'global_test_provider'); + SELECT pg_tde_set_default_key_using_global_key_provider('default_test_key', 'global_test_provider'); + )); + + return $temp_dir; +} + +sub _tde_init_sql_command +{ + my ($datadir, $database, $sql) = @_; + PostgreSQL::Test::Utils::run_log( + [ + 'postgres', + '--single', '-j', '-F', + '-D' => $datadir, + '-c' => 'exit_on_error=true', + '-c' => 'log_checkpoints=false', + '-c' => 'archive_mode=off', + $database, + ], + '<', + \$sql); +} + +sub skip_if_tde_mode_wal +{ + my ($msg) = @_; + plan(skip_all => $msg) if ($tde_mode_wal && !$tde_mode_noskip); +} + +sub skip_if_tde_mode_smgr +{ + my ($msg) = @_; + plan(skip_all => $msg) if ($tde_mode_smgr && !$tde_mode_noskip); +} + +1; diff --git a/src/test/recovery/meson.build b/src/test/recovery/meson.build index 7623cb1fe6334..9f01d71dc3b10 100644 --- a/src/test/recovery/meson.build +++ b/src/test/recovery/meson.build @@ -52,6 +52,10 @@ tests += { 't/041_checkpoint_at_promote.pl', 't/042_low_level_backup.pl', 't/043_no_contrecord_switch.pl', + 't/045_archive_restartpoint.pl', + 't/046_checkpoint_logical_slot.pl', + 't/047_checkpoint_physical_slot.pl', + 't/048_vacuum_horizon_floor.pl' ], }, } diff --git a/src/test/recovery/t/006_logical_decoding.pl b/src/test/recovery/t/006_logical_decoding.pl index b95d95c06f942..75fd8261ce15f 100644 --- a/src/test/recovery/t/006_logical_decoding.pl +++ b/src/test/recovery/t/006_logical_decoding.pl @@ -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,8 +168,8 @@ 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. diff --git a/src/test/recovery/t/010_logical_decoding_timelines.pl b/src/test/recovery/t/010_logical_decoding_timelines.pl index afcd5241aa665..40f4fb0d91821 100644 --- a/src/test/recovery/t/010_logical_decoding_timelines.pl +++ b/src/test/recovery/t/010_logical_decoding_timelines.pl @@ -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 2f74bfc9a5af5..8d83c0687c838 100644 --- a/src/test/recovery/t/012_subtransactions.pl +++ b/src/test/recovery/t/012_subtransactions.pl @@ -16,6 +16,10 @@ 'postgresql.conf', qq( max_prepared_transactions = 10 log_checkpoints = true + + ## Workaround to make tests pass with enabled UBSAN + ## https://www.postgresql.org/message-id/flat/1775221.1658699459%40sss.pgh.pa.us#18ac2074d2383f232a20bf8b7b32c526 + max_stack_depth = 8MB )); $node_primary->start; $node_primary->backup('primary_backup'); diff --git a/src/test/recovery/t/014_unlogged_reinit.pl b/src/test/recovery/t/014_unlogged_reinit.pl index a37fc9249b5dd..7b1e33bb58eb7 100644 --- a/src/test/recovery/t/014_unlogged_reinit.pl +++ b/src/test/recovery/t/014_unlogged_reinit.pl @@ -12,6 +12,9 @@ use PostgreSQL::Test::Utils; use Test::More; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_smgr + 'invalid page in block'; + my $node = PostgreSQL::Test::Cluster->new('main'); $node->init; diff --git a/src/test/recovery/t/016_min_consistency.pl b/src/test/recovery/t/016_min_consistency.pl index 23d161aebc771..fda8e177a9447 100644 --- a/src/test/recovery/t/016_min_consistency.pl +++ b/src/test/recovery/t/016_min_consistency.pl @@ -13,6 +13,9 @@ use PostgreSQL::Test::Utils; use Test::More; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_smgr + 'reads LSN directly from relation files'; + # Find the largest LSN in the set of pages part of the given relation # file. This is used for offline checks of page consistency. The LSN # is historically stored as a set of two numbers of 4 byte-length diff --git a/src/test/recovery/t/018_wal_optimize.pl b/src/test/recovery/t/018_wal_optimize.pl index 3fb31e643b69d..fecb767441fc0 100644 --- a/src/test/recovery/t/018_wal_optimize.pl +++ b/src/test/recovery/t/018_wal_optimize.pl @@ -16,6 +16,9 @@ use PostgreSQL::Test::Utils; use Test::More; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_smgr + 'invalid page in block'; + sub check_orphan_relfilenodes { local $Test::Builder::Level = $Test::Builder::Level + 1; diff --git a/src/test/recovery/t/027_stream_regress.pl b/src/test/recovery/t/027_stream_regress.pl index 5178466fd0c4f..7bd9054a618c0 100644 --- a/src/test/recovery/t/027_stream_regress.pl +++ b/src/test/recovery/t/027_stream_regress.pl @@ -9,11 +9,6 @@ use Test::More; use File::Basename; -if (defined($ENV{TDE_MODE})) -{ - plan skip_all => "Running with TDE doesn't support special server starts yet"; -} - # Initialize primary node my $node_primary = PostgreSQL::Test::Cluster->new('primary'); $node_primary->init(allows_streaming => 1); @@ -111,6 +106,7 @@ command_ok( [ 'pg_dumpall', '-f', $outputdir . '/primary.dump', + '--restrict-key=test', '--no-sync', '-p', $node_primary->port, '--no-unlogged-table-data' # if unlogged, standby has schema only ], @@ -118,6 +114,7 @@ command_ok( [ 'pg_dumpall', '-f', $outputdir . '/standby.dump', + '--restrict-key=test', '--no-sync', '-p', $node_standby_1->port ], 'dump standby server'); @@ -136,6 +133,7 @@ ('--schema', 'pg_catalog'), ('-f', $outputdir . '/catalogs_primary.dump'), '--no-sync', + '--restrict-key=test', ('-p', $node_primary->port), '--no-unlogged-table-data', 'regression' @@ -147,6 +145,7 @@ ('--schema', 'pg_catalog'), ('-f', $outputdir . '/catalogs_standby.dump'), '--no-sync', + '--restrict-key=test', ('-p', $node_standby_1->port), 'regression' ], diff --git a/src/test/recovery/t/032_relfilenode_reuse.pl b/src/test/recovery/t/032_relfilenode_reuse.pl index 96a8104b80267..7acc68f915b06 100644 --- a/src/test/recovery/t/032_relfilenode_reuse.pl +++ b/src/test/recovery/t/032_relfilenode_reuse.pl @@ -8,6 +8,8 @@ use Test::More; use File::Basename; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_smgr + 'invalid page in block'; my $node_primary = PostgreSQL::Test::Cluster->new('primary'); $node_primary->init(allows_streaming => 1); diff --git a/src/test/recovery/t/035_standby_logical_decoding.pl b/src/test/recovery/t/035_standby_logical_decoding.pl index 4628f9fb80635..9c5b1ba64a811 100644 --- a/src/test/recovery/t/035_standby_logical_decoding.pl +++ b/src/test/recovery/t/035_standby_logical_decoding.pl @@ -8,6 +8,7 @@ use PostgreSQL::Test::Cluster; use PostgreSQL::Test::Utils; +use Time::HiRes qw(usleep); use Test::More; my ($stdin, $stdout, $stderr, @@ -205,9 +206,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 +213,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 +229,17 @@ 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 @@ -250,7 +252,11 @@ sub check_for_invalidation # 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. +# 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) = @_; @@ -345,6 +351,44 @@ sub wait_until_vacuum_can_remove \$psql_subscriber{subscriber_stderr}, 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 # behaves correctly. @@ -494,11 +538,8 @@ sub wait_until_vacuum_can_remove $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 -# -# In passing, ensure that replication slot stats are not removed when the -# active slot is invalidated. ################################################## # One way to produce recovery conflict is to create/drop a relation and @@ -512,10 +553,6 @@ sub wait_until_vacuum_can_remove $node_primary->safe_psql('testdb', qq[INSERT INTO decoding_test(x,y) SELECT 100,'100';]); -$node_standby->poll_query_until('testdb', - qq[SELECT total_txns > 0 FROM pg_stat_replication_slots WHERE slot_name = 'vacuum_full_activeslot'] -) or die "replication slot stats of vacuum_full_activeslot not updated"; - # This should trigger the conflict wait_until_vacuum_can_remove( 'full', 'CREATE TABLE conflict_test(x integer, y text); @@ -524,19 +561,11 @@ sub wait_until_vacuum_can_remove $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 reason for conflict is 'rows_removed' in pg_replication_slots check_slots_conflict_reason('vacuum_full_', 'rows_removed'); -# Ensure that replication slot stats are not removed after invalidation. -is( $node_standby->safe_psql( - 'testdb', - qq[SELECT total_txns > 0 FROM pg_stat_replication_slots WHERE slot_name = 'vacuum_full_activeslot'] - ), - 't', - 'replication slot stats not removed after invalidation'); - $handle = make_slot_active($node_standby, 'vacuum_full_', 0, \$stdout, \$stderr); @@ -545,7 +574,16 @@ sub wait_until_vacuum_can_remove "can no longer get changes from replication slot \"vacuum_full_activeslot\"" ); -# Turn hot_standby_feedback back on +# 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"); + +# Set hot_standby_feedback to on change_hot_standby_feedback_and_wait_for_xmins(1, 1); ################################################## @@ -592,7 +630,7 @@ sub wait_until_vacuum_can_remove "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. ################################################## @@ -613,7 +651,7 @@ sub wait_until_vacuum_can_remove $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 reason for conflict is 'rows_removed' in pg_replication_slots check_slots_conflict_reason('row_removal_', 'rows_removed'); @@ -649,7 +687,7 @@ sub wait_until_vacuum_can_remove # 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 reason for conflict is 'rows_removed' in pg_replication_slots check_slots_conflict_reason('shared_row_removal_', 'rows_removed'); @@ -673,6 +711,10 @@ sub wait_until_vacuum_can_remove 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 wait_until_vacuum_can_remove( '', 'CREATE TABLE conflict_test(x integer, y text); @@ -683,12 +725,12 @@ sub wait_until_vacuum_can_remove # message should not be issued ok( !$node_standby->log_contains( - "invalidating obsolete slot \"no_conflict_inactiveslot\"", $logstart), + "invalidating obsolete replication slot \"no_conflict_inactiveslot\"", $logstart), 'inactiveslot slot invalidation is not logged with vacuum on conflict_test' ); ok( !$node_standby->log_contains( - "invalidating obsolete slot \"no_conflict_activeslot\"", $logstart), + "invalidating obsolete replication slot \"no_conflict_activeslot\"", $logstart), 'activeslot slot invalidation is not logged with vacuum on conflict_test' ); @@ -716,7 +758,7 @@ sub wait_until_vacuum_can_remove $node_standby->restart; ################################################## -# Recovery conflict: Invalidate conflicting slots, including in-use slots +# Recovery conflict: Invalidate conflicting slots # Scenario 5: conflict due to on-access pruning. ################################################## @@ -741,7 +783,7 @@ sub wait_until_vacuum_can_remove $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 reason for conflict is 'rows_removed' in pg_replication_slots check_slots_conflict_reason('pruning_', 'rows_removed'); @@ -785,7 +827,7 @@ sub wait_until_vacuum_can_remove $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 reason for conflict is 'wal_level_insufficient' in pg_replication_slots check_slots_conflict_reason('wal_level_', 'wal_level_insufficient'); diff --git a/src/test/recovery/t/037_invalid_database.pl b/src/test/recovery/t/037_invalid_database.pl index 6d1c711796421..3735086aee4c0 100644 --- a/src/test/recovery/t/037_invalid_database.pl +++ b/src/test/recovery/t/037_invalid_database.pl @@ -96,13 +96,12 @@ my $pid = $bgpsql->query('SELECT pg_backend_pid()'); # create the database, prevent drop database via lock held by a 2PC transaction -ok( $bgpsql->query_safe( - qq( +$bgpsql->query_safe( + qq( CREATE DATABASE regression_invalid_interrupt; BEGIN; LOCK pg_tablespace; - PREPARE TRANSACTION 'lock_tblspc';)), - "blocked DROP DATABASE completion"); + 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"); @@ -135,11 +134,8 @@ # To properly drop the database, we need to release the lock previously preventing # doing so. -ok($bgpsql->query_safe(qq(ROLLBACK PREPARED 'lock_tblspc')), - "unblock DROP DATABASE"); - -ok($bgpsql->query(qq(DROP DATABASE regression_invalid_interrupt)), - "DROP DATABASE invalid_interrupt"); +$bgpsql->query_safe(qq(ROLLBACK PREPARED 'lock_tblspc')); +$bgpsql->query_safe(qq(DROP DATABASE regression_invalid_interrupt)); $bgpsql->quit(); diff --git a/src/test/recovery/t/039_end_of_wal.pl b/src/test/recovery/t/039_end_of_wal.pl index eb1e051d43dab..7d0db88c5ef6d 100644 --- a/src/test/recovery/t/039_end_of_wal.pl +++ b/src/test/recovery/t/039_end_of_wal.pl @@ -13,6 +13,9 @@ use integer; # causes / operator to use integer math +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_wal + 'uses write_wal to hack wal directly'; + # 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 diff --git a/src/test/recovery/t/042_low_level_backup.pl b/src/test/recovery/t/042_low_level_backup.pl index 61d23187e0f90..73156e29be4bc 100644 --- a/src/test/recovery/t/042_low_level_backup.pl +++ b/src/test/recovery/t/042_low_level_backup.pl @@ -13,6 +13,9 @@ use PostgreSQL::Test::Utils; use Test::More; +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_wal + 'directly copies archived data without using restore_command'; + # Start primary node with archiving. my $node_primary = PostgreSQL::Test::Cluster->new('primary'); $node_primary->init(has_archiving => 1, allows_streaming => 1); diff --git a/src/test/recovery/t/043_no_contrecord_switch.pl b/src/test/recovery/t/043_no_contrecord_switch.pl index a473d3e7d3e63..71d0aa9bf40a4 100644 --- a/src/test/recovery/t/043_no_contrecord_switch.pl +++ b/src/test/recovery/t/043_no_contrecord_switch.pl @@ -12,6 +12,9 @@ use integer; # causes / operator to use integer math +PostgreSQL::Test::TdeCluster::skip_if_tde_mode_smgr + 'uses write_wal to hack wal directly'; + # Values queried from the server my $WAL_SEGMENT_SIZE; my $WAL_BLOCK_SIZE; 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/046_checkpoint_logical_slot.pl b/src/test/recovery/t/046_checkpoint_logical_slot.pl new file mode 100644 index 0000000000000..d2cf1cb4464e6 --- /dev/null +++ b/src/test/recovery/t/046_checkpoint_logical_slot.pl @@ -0,0 +1,145 @@ +# Copyright (c) 2025, PostgreSQL Global Development Group +# +# This test verifies the case when the logical slot is advanced during +# checkpoint. The test checks that the logical slot's restart_lsn still refers +# to an existed WAL segment after immediate restart. +# +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'; +} + +my ($node, $result); + +$node = PostgreSQL::Test::Cluster->new('mike'); +$node->init; +$node->append_conf('postgresql.conf', "wal_level = 'logical'"); +$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. +$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', q(CREATE EXTENSION injection_points)); + +# Create the two slots we'll need. +$node->safe_psql('postgres', + q{select pg_create_logical_replication_slot('slot_logical', 'test_decoding')} +); +$node->safe_psql('postgres', + q{select pg_create_physical_replication_slot('slot_physical', true)}); + +# Advance both slots to the current position just to have everything "valid". +$node->safe_psql('postgres', + q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null)} +); +$node->safe_psql('postgres', + q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())} +); + +# Run checkpoint to flush current state to disk and set a baseline. +$node->safe_psql('postgres', q{checkpoint}); + +# Generate some transactions to get RUNNING_XACTS. +my $xacts = $node->background_psql('postgres'); +$xacts->query_until( + qr/run_xacts/, + q(\echo run_xacts +SELECT 1 \watch 0.1 +\q +)); + +$node->advance_wal(20); + +# Run another checkpoint to set a new restore LSN. +$node->safe_psql('postgres', q{checkpoint}); + +$node->advance_wal(20); + +# Run another checkpoint, this time in the background, and make it wait +# on the injection point) so that the checkpoint stops right before +# removing old WAL segments. +note('starting checkpoint'); + +my $checkpoint = $node->background_psql('postgres'); +$checkpoint->query_safe( + q(select injection_points_attach('checkpoint-before-old-wal-removal','wait')) +); +$checkpoint->query_until( + qr/starting_checkpoint/, + q(\echo starting_checkpoint +checkpoint; +\q +)); + +# Wait until the checkpoint stops right before removing WAL segments. +note('waiting for injection_point'); +$node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal'); +note('injection_point is reached'); + +# Try to advance the logical slot, but make it stop when it moves to the next +# WAL segment (this has to happen in the background, too). +my $logical = $node->background_psql('postgres'); +$logical->query_safe( + q{select injection_points_attach('logical-replication-slot-advance-segment','wait');} +); +$logical->query_until( + qr/get_changes/, + q( +\echo get_changes +select count(*) from pg_logical_slot_get_changes('slot_logical', null, null) \watch 1 +\q +)); + +# Wait until the slot's restart_lsn points to the next WAL segment. +note('waiting for injection_point'); +$node->wait_for_event('client backend', + 'logical-replication-slot-advance-segment'); +note('injection_point is reached'); + +# OK, we're in the right situation: time to advance the physical slot, which +# recalculates the required LSN, and then unblock the checkpoint, which +# removes the WAL still needed by the logical slot. +$node->safe_psql('postgres', + q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())} +); + +# Generate a long WAL record, spawning at least two pages for the follow-up +# post-recovery check. +$node->safe_psql('postgres', + q{select pg_logical_emit_message(false, '', repeat('123456789', 1000))}); + +# Continue the checkpoint. +my $log_offset = -s $node->logfile; +$node->safe_psql('postgres', + q{select injection_points_wakeup('checkpoint-before-old-wal-removal')}); +$node->wait_for_log(qr/checkpoint complete/, $log_offset); + +# Abruptly stop the server. +$node->stop('immediate'); + +$node->start; + +eval { + $node->safe_psql('postgres', + q{select count(*) from pg_logical_slot_get_changes('slot_logical', null, null);} + ); +}; +is($@, '', "Logical slot still valid"); + +done_testing(); diff --git a/src/test/recovery/t/047_checkpoint_physical_slot.pl b/src/test/recovery/t/047_checkpoint_physical_slot.pl new file mode 100644 index 0000000000000..a909bf2ba0171 --- /dev/null +++ b/src/test/recovery/t/047_checkpoint_physical_slot.pl @@ -0,0 +1,136 @@ +# Copyright (c) 2025, PostgreSQL Global Development Group +# +# This test verifies the case when the physical slot is advanced during +# checkpoint. The test checks that the physical slot's restart_lsn still refers +# to an existed WAL segment after immediate restart. +# +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'; +} + +my ($node, $result); + +$node = PostgreSQL::Test::Cluster->new('mike'); +$node->init; +$node->append_conf('postgresql.conf', "wal_level = 'replica'"); +$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. +$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', q(CREATE EXTENSION injection_points)); + +# Create a physical replication slot. +$node->safe_psql('postgres', + q{select pg_create_physical_replication_slot('slot_physical', true)}); + +# Advance slot to the current position, just to have everything "valid". +$node->safe_psql('postgres', + q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())} +); + +# Run checkpoint to flush current state to disk and set a baseline. +$node->safe_psql('postgres', q{checkpoint}); + +# Insert 2M rows; that's about 260MB (~20 segments) worth of WAL. +$node->advance_wal(20); + +# Advance slot to the current position, just to have everything "valid". +$node->safe_psql('postgres', + q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())} +); + +# Run another checkpoint to set a new restore LSN. +$node->safe_psql('postgres', q{checkpoint}); + +# Another 2M rows; that's about 260MB (~20 segments) worth of WAL. +$node->advance_wal(20); + +my $restart_lsn_init = $node->safe_psql('postgres', + q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'} +); +chomp($restart_lsn_init); +note("restart lsn before checkpoint: $restart_lsn_init"); + +# Run another checkpoint, this time in the background, and make it wait +# on the injection point) so that the checkpoint stops right before +# removing old WAL segments. +note('starting checkpoint'); + +my $checkpoint = $node->background_psql('postgres'); +$checkpoint->query_safe( + q{select injection_points_attach('checkpoint-before-old-wal-removal','wait')} +); +$checkpoint->query_until( + qr/starting_checkpoint/, + q(\echo starting_checkpoint +checkpoint; +\q +)); + +# Wait until the checkpoint stops right before removing WAL segments. +note('waiting for injection_point'); +$node->wait_for_event('checkpointer', 'checkpoint-before-old-wal-removal'); +note('injection_point is reached'); + +# OK, we're in the right situation: time to advance the physical slot, which +# recalculates the required LSN and then unblock the checkpoint, which +# removes the WAL still needed by the physical slot. +$node->safe_psql('postgres', + q{select pg_replication_slot_advance('slot_physical', pg_current_wal_lsn())} +); + +# Continue the checkpoint and wait for its completion. +my $log_offset = -s $node->logfile; +$node->safe_psql('postgres', + q{select injection_points_wakeup('checkpoint-before-old-wal-removal')}); +$node->wait_for_log(qr/checkpoint complete/, $log_offset); + +my $restart_lsn_old = $node->safe_psql('postgres', + q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'} +); +chomp($restart_lsn_old); +note("restart lsn before stop: $restart_lsn_old"); + +# Abruptly stop the server. +$node->stop('immediate'); + +$node->start; + +# Get the restart_lsn of the slot right after restarting. +my $restart_lsn = $node->safe_psql('postgres', + q{select restart_lsn from pg_replication_slots where slot_name = 'slot_physical'} +); +chomp($restart_lsn); +note("restart lsn: $restart_lsn"); + +# Get the WAL segment name for the slot's restart_lsn. +my $restart_lsn_segment = $node->safe_psql('postgres', + "SELECT pg_walfile_name('$restart_lsn'::pg_lsn)"); +chomp($restart_lsn_segment); + +# Check if the required wal segment exists. +note("required by slot segment name: $restart_lsn_segment"); +my $datadir = $node->data_dir; +ok( -f "$datadir/pg_wal/$restart_lsn_segment", + "WAL segment $restart_lsn_segment for physical slot's restart_lsn $restart_lsn exists" +); + +done_testing(); diff --git a/src/test/recovery/t/048_vacuum_horizon_floor.pl b/src/test/recovery/t/048_vacuum_horizon_floor.pl new file mode 100644 index 0000000000000..d48a6ef7e0f24 --- /dev/null +++ b/src/test/recovery/t/048_vacuum_horizon_floor.pl @@ -0,0 +1,278 @@ +use strict; +use warnings; +use PostgreSQL::Test::Cluster; +use Test::More; + +# Test that vacuum prunes away all dead tuples killed before OldestXmin +# +# This test creates a table on a primary, updates the table to generate dead +# tuples for vacuum, and then, during the vacuum, uses the replica to force +# GlobalVisState->maybe_needed on the primary to move backwards and precede +# the value of OldestXmin set at the beginning of vacuuming the table. + +# Set up nodes +my $node_primary = PostgreSQL::Test::Cluster->new('primary'); +$node_primary->init(allows_streaming => 'physical'); + +# io_combine_limit is set to 1 to avoid pinning more than one buffer at a time +# to ensure test determinism. +$node_primary->append_conf( + 'postgresql.conf', qq[ +hot_standby_feedback = on +autovacuum = off +log_min_messages = INFO +maintenance_work_mem = 64 +io_combine_limit = 1 +]); +$node_primary->start; + +my $node_replica = PostgreSQL::Test::Cluster->new('standby'); + +$node_primary->backup('my_backup'); +$node_replica->init_from_backup($node_primary, 'my_backup', + has_streaming => 1); + +$node_replica->start; + +my $test_db = "test_db"; +$node_primary->safe_psql('postgres', "CREATE DATABASE $test_db"); + +# Save the original connection info for later use +my $orig_conninfo = $node_primary->connstr(); + +my $table1 = "vac_horizon_floor_table"; + +# Long-running Primary Session A +my $psql_primaryA = + $node_primary->background_psql($test_db, on_error_stop => 1); + +# Long-running Primary Session B +my $psql_primaryB = + $node_primary->background_psql($test_db, on_error_stop => 1); + +# Our test relies on two rounds of index vacuuming for reasons elaborated +# later. To trigger two rounds of index vacuuming, we must fill up the +# TIDStore with dead items partway through a vacuum of the table. The number +# of rows is just enough to ensure we exceed maintenance_work_mem on all +# supported platforms, while keeping test runtime as short as we can. +my $nrows = 2000; + +# Because vacuum's first pass, pruning, is where we use the GlobalVisState to +# check tuple visibility, GlobalVisState->maybe_needed must move backwards +# during pruning before checking the visibility for a tuple which would have +# been considered HEAPTUPLE_DEAD prior to maybe_needed moving backwards but +# HEAPTUPLE_RECENTLY_DEAD compared to the new, older value of maybe_needed. +# +# We must not only force the horizon on the primary to move backwards but also +# force the vacuuming backend's GlobalVisState to be updated. GlobalVisState +# is forced to update during index vacuuming. +# +# _bt_pendingfsm_finalize() calls GetOldestNonRemovableTransactionId() at the +# end of a round of index vacuuming, updating the backend's GlobalVisState +# and, in our case, moving maybe_needed backwards. +# +# Then vacuum's first (pruning) pass will continue and pruning will find our +# later inserted and updated tuple HEAPTUPLE_RECENTLY_DEAD when compared to +# maybe_needed but HEAPTUPLE_DEAD when compared to OldestXmin. +# +# Thus, we must force at least two rounds of index vacuuming to ensure that +# some tuple visibility checks will happen after a round of index vacuuming. +# To accomplish this, we set maintenance_work_mem to its minimum value and +# insert and delete enough rows that we force at least one round of index +# vacuuming before getting to a dead tuple which was killed after the standby +# is disconnected. +$node_primary->safe_psql($test_db, qq[ + CREATE TABLE ${table1}(col1 int) + WITH (autovacuum_enabled=false, fillfactor=10); + INSERT INTO $table1 VALUES(7); + INSERT INTO $table1 SELECT generate_series(1, $nrows) % 3; + CREATE INDEX on ${table1}(col1); + DELETE FROM $table1 WHERE col1 = 0; + INSERT INTO $table1 VALUES(7); +]); + +# We will later move the primary forward while the standby is disconnected. +# For now, however, there is no reason not to wait for the standby to catch +# up. +my $primary_lsn = $node_primary->lsn('flush'); +$node_primary->wait_for_catchup($node_replica, 'replay', $primary_lsn); + +# Test that the WAL receiver is up and running. +$node_replica->poll_query_until($test_db, qq[ + SELECT EXISTS (SELECT * FROM pg_stat_wal_receiver);] , 't'); + +# Set primary_conninfo to something invalid on the replica and reload the +# config. Once the config is reloaded, the startup process will force the WAL +# receiver to restart and it will be unable to reconnect because of the +# invalid connection information. +$node_replica->safe_psql($test_db, qq[ + ALTER SYSTEM SET primary_conninfo = ''; + SELECT pg_reload_conf(); + ]); + +# Wait until the WAL receiver has shut down and been unable to start up again. +$node_replica->poll_query_until($test_db, qq[ + SELECT EXISTS (SELECT * FROM pg_stat_wal_receiver);] , 'f'); + +# Now insert and update a tuple which will be visible to the vacuum on the +# primary but which will have xmax newer than the oldest xmin on the standby +# that was recently disconnected. +my $res = $psql_primaryA->query_safe( + qq[ + INSERT INTO $table1 VALUES (99); + UPDATE $table1 SET col1 = 100 WHERE col1 = 99; + SELECT 'after_update'; + ] + ); + +# Make sure the UPDATE finished +like($res, qr/^after_update$/m, "UPDATE occurred on primary session A"); + +# Open a cursor on the primary whose pin will keep VACUUM from getting a +# cleanup lock on the first page of the relation. We want VACUUM to be able to +# start, calculate initial values for OldestXmin and GlobalVisState and then +# be unable to proceed with pruning our dead tuples. This will allow us to +# reconnect the standby and push the horizon back before we start actual +# pruning and vacuuming. +my $primary_cursor1 = "vac_horizon_floor_cursor1"; + +# The first value inserted into the table was a 7, so FETCH FORWARD should +# return a 7. That's how we know the cursor has a pin. +# Disable index scans so the cursor pins heap pages and not index pages. +$res = $psql_primaryB->query_safe( + qq[ + BEGIN; + SET enable_bitmapscan = off; + SET enable_indexscan = off; + SET enable_indexonlyscan = off; + DECLARE $primary_cursor1 CURSOR FOR SELECT * FROM $table1 WHERE col1 = 7; + FETCH $primary_cursor1; + ] + ); + +is($res, 7, qq[Cursor query returned $res. Expected value 7.]); + +# Get the PID of the session which will run the VACUUM FREEZE so that we can +# use it to filter pg_stat_activity later. +my $vacuum_pid = $psql_primaryA->query_safe("SELECT pg_backend_pid();"); + +# Now start a VACUUM FREEZE on the primary. It will call vacuum_get_cutoffs() +# and establish values of OldestXmin and GlobalVisState which are newer than +# all of our dead tuples. Then it will be unable to get a cleanup lock to +# start pruning, so it will hang. +# +# We use VACUUM FREEZE because it will wait for a cleanup lock instead of +# skipping the page pinned by the cursor. Note that works because the target +# tuple's xmax precedes OldestXmin which ensures that lazy_scan_noprune() will +# return false and we will wait for the cleanup lock. +# +# Disable any prefetching, parallelism, or other concurrent I/O by vacuum. The +# pages of the heap must be processed in order by a single worker to ensure +# test stability (PARALLEL 0 shouldn't be necessary but guards against the +# possibility of parallel heap vacuuming). +$psql_primaryA->{stdin} .= qq[ + SET maintenance_io_concurrency = 0; + VACUUM (VERBOSE, FREEZE, PARALLEL 0) $table1; + \\echo VACUUM + ]; + +# Make sure the VACUUM command makes it to the server. +$psql_primaryA->{run}->pump_nb(); + +# Make sure that the VACUUM has already called vacuum_get_cutoffs() and is +# just waiting on the lock to start vacuuming. We don't want the standby to +# re-establish a connection to the primary and push the horizon back until +# we've saved initial values in GlobalVisState and calculated OldestXmin. +$node_primary->poll_query_until($test_db, + qq[ + SELECT count(*) >= 1 FROM pg_stat_activity + WHERE pid = $vacuum_pid + AND wait_event = 'BufferPin'; + ], + 't'); + +# Ensure the WAL receiver is still not active on the replica. +$node_replica->poll_query_until($test_db, qq[ + SELECT EXISTS (SELECT * FROM pg_stat_wal_receiver);] , 'f'); + +# Allow the WAL receiver connection to re-establish. +$node_replica->safe_psql( + $test_db, qq[ + ALTER SYSTEM SET primary_conninfo = '$orig_conninfo'; + SELECT pg_reload_conf(); + ]); + +# Ensure the new WAL receiver has connected. +$node_replica->poll_query_until($test_db, qq[ + SELECT EXISTS (SELECT * FROM pg_stat_wal_receiver);] , 't'); + +# Once the WAL sender is shown on the primary, the replica should have +# connected with the primary and pushed the horizon backward. Primary Session +# A won't see that until the VACUUM FREEZE proceeds and does its first round +# of index vacuuming. +$node_primary->poll_query_until($test_db, qq[ + SELECT EXISTS (SELECT * FROM pg_stat_replication);] , 't'); + +# Move the cursor forward to the next 7. We inserted the 7 much later, so +# advancing the cursor should allow vacuum to proceed vacuuming most pages of +# the relation. Because we set maintanence_work_mem sufficiently low, we +# expect that a round of index vacuuming has happened and that the vacuum is +# now waiting for the cursor to release its pin on the last page of the +# relation. +$res = $psql_primaryB->query_safe("FETCH $primary_cursor1"); +is($res, 7, + qq[Cursor query returned $res from second fetch. Expected value 7.]); + +# Prevent the test from incorrectly passing by confirming that we did indeed +# do a pass of index vacuuming. +$node_primary->poll_query_until($test_db, qq[ + SELECT index_vacuum_count > 0 + FROM pg_stat_progress_vacuum + WHERE datname='$test_db' AND relid::regclass = '$table1'::regclass; + ] , 't'); + +# Commit the transaction with the open cursor so that the VACUUM can finish. +$psql_primaryB->query_until( + qr/^commit$/m, + qq[ + COMMIT; + \\echo commit + ] + ); + +# VACUUM proceeds with pruning and does a visibility check on each tuple. In +# older versions of Postgres, pruning found our final dead tuple +# non-removable (HEAPTUPLE_RECENTLY_DEAD) since its xmax is after the new +# value of maybe_needed. Then heap_prepare_freeze_tuple() would decide the +# tuple xmax should be frozen because it precedes OldestXmin. Vacuum would +# then error out in heap_pre_freeze_checks() with "cannot freeze committed +# xmax". This was fixed by changing pruning to find all +# HEAPTUPLE_RECENTLY_DEAD tuples with xmaxes preceding OldestXmin +# HEAPTUPLE_DEAD and removing them. + +# With the fix, VACUUM should finish successfully, incrementing the table +# vacuum_count. +$node_primary->poll_query_until($test_db, + qq[ + SELECT vacuum_count > 0 + FROM pg_stat_all_tables WHERE relname = '${table1}'; + ] + , 't'); + +$primary_lsn = $node_primary->lsn('flush'); + +# Make sure something causes us to flush +$node_primary->safe_psql($test_db, "INSERT INTO $table1 VALUES (1);"); + +# Nothing on the replica should cause a recovery conflict, so this should +# finish successfully. +$node_primary->wait_for_catchup($node_replica, 'replay', $primary_lsn); + +## Shut down psqls +$psql_primaryA->quit; +$psql_primaryB->quit; + +$node_replica->stop(); +$node_primary->stop(); + +done_testing(); diff --git a/src/test/regress/GNUmakefile b/src/test/regress/GNUmakefile index 9003435aabeef..090e49ea55b6e 100644 --- a/src/test/regress/GNUmakefile +++ b/src/test/regress/GNUmakefile @@ -40,7 +40,7 @@ pg_regress$(X): pg_regress.o pg_regress_main.o $(WIN32RES) | submake-libpgport # 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 -I$(libpq_srcdir) $(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 diff --git a/src/test/regress/expected/aggregates.out b/src/test/regress/expected/aggregates.out index 1c1ca7573ad3a..9b97fcf40b54a 100644 --- a/src/test/regress/expected/aggregates.out +++ b/src/test/regress/expected/aggregates.out @@ -1586,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 -- @@ -2033,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 ---+------+------+------------+------+------+------------+------+------+------------+-------+-------+------------- @@ -2050,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; diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out index 6de74a26a95f2..7cebd50a673c2 100644 --- a/src/test/regress/expected/alter_table.out +++ b/src/test/regress/expected/alter_table.out @@ -4615,6 +4615,21 @@ alter table attbl alter column p1 set data type bigint; alter table atref alter column c1 set data type bigint; drop table attbl, atref; /* End test case for bug #17409 */ +/* Test case for bug #18970 */ +create table attbl(a int); +create table atref(b attbl check ((b).a is not null)); +alter table attbl alter column a type numeric; -- someday this should work +ERROR: cannot alter table "attbl" because column "atref.b" uses its row type +alter table atref drop constraint atref_b_check; +create statistics atref_stat on ((b).a is not null) from atref; +alter table attbl alter column a type numeric; -- someday this should work +ERROR: cannot alter table "attbl" because column "atref.b" uses its row type +drop statistics atref_stat; +create index atref_idx on atref (((b).a)); +alter table attbl alter column a type numeric; -- someday this should work +ERROR: cannot alter table "attbl" because column "atref.b" uses its row type +drop table attbl, atref; +/* End test case for bug #18970 */ -- Test that ALTER TABLE rewrite preserves a clustered index -- for normal indexes and indexes on constraints. create table alttype_cluster (a int); diff --git a/src/test/regress/expected/arrays.out b/src/test/regress/expected/arrays.out index a6d81fd5f9284..44fa7b214c71a 100644 --- a/src/test/regress/expected/arrays.out +++ b/src/test/regress/expected/arrays.out @@ -2457,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/constraints.out b/src/test/regress/expected/constraints.out index cf0b80d616965..a5b5795e58736 100644 --- a/src/test/regress/expected/constraints.out +++ b/src/test/regress/expected/constraints.out @@ -830,3 +830,7 @@ DROP TABLE constraint_comments_tbl; DROP DOMAIN constraint_comments_dom; DROP ROLE regress_constraint_comments; DROP ROLE regress_constraint_comments_noaccess; +-- Leave some constraints for the pg_upgrade test to pick up +CREATE DOMAIN constraint_comments_dom AS int; +ALTER DOMAIN constraint_comments_dom ADD CONSTRAINT inv_ck CHECK (value > 0) NOT VALID; +COMMENT ON CONSTRAINT inv_ck ON DOMAIN constraint_comments_dom IS 'comment on invalid constraint'; diff --git a/src/test/regress/expected/conversion.out b/src/test/regress/expected/conversion.out index d785f92561e5b..7dd1ef6161f06 100644 --- a/src/test/regress/expected/conversion.out +++ b/src/test/regress/expected/conversion.out @@ -508,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 | | @@ -520,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; @@ -534,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/create_am_1.out b/src/test/regress/expected/create_am_1.out deleted file mode 100644 index f5b9b91674e29..0000000000000 --- a/src/test/regress/expected/create_am_1.out +++ /dev/null @@ -1,577 +0,0 @@ --- --- Create access method tests --- --- Make gist2 over gisthandler. In fact, it would be a synonym to gist. -CREATE ACCESS METHOD gist2 TYPE INDEX HANDLER gisthandler; --- Verify return type checks for handlers -CREATE ACCESS METHOD bogus TYPE INDEX HANDLER int4in; -ERROR: function int4in(internal) does not exist -CREATE ACCESS METHOD bogus TYPE INDEX HANDLER heap_tableam_handler; -ERROR: function heap_tableam_handler must return type index_am_handler --- Try to create gist2 index on fast_emp4000: fail because opclass doesn't exist -CREATE INDEX grect2ind2 ON fast_emp4000 USING gist2 (home_base); -ERROR: data type box has no default operator class for access method "gist2" -HINT: You must specify an operator class for the index or define a default operator class for the data type. --- Make operator class for boxes using gist2 -CREATE OPERATOR CLASS box_ops DEFAULT - FOR TYPE box USING gist2 AS - OPERATOR 1 <<, - OPERATOR 2 &<, - OPERATOR 3 &&, - OPERATOR 4 &>, - OPERATOR 5 >>, - OPERATOR 6 ~=, - OPERATOR 7 @>, - OPERATOR 8 <@, - OPERATOR 9 &<|, - OPERATOR 10 <<|, - OPERATOR 11 |>>, - OPERATOR 12 |&>, - FUNCTION 1 gist_box_consistent(internal, box, smallint, oid, internal), - FUNCTION 2 gist_box_union(internal, internal), - -- don't need compress, decompress, or fetch functions - FUNCTION 5 gist_box_penalty(internal, internal, internal), - FUNCTION 6 gist_box_picksplit(internal, internal), - FUNCTION 7 gist_box_same(box, box, internal); --- Create gist2 index on fast_emp4000 -CREATE INDEX grect2ind2 ON fast_emp4000 USING gist2 (home_base); --- Now check the results from plain indexscan; temporarily drop existing --- index grect2ind to ensure it doesn't capture the plan -BEGIN; -DROP INDEX grect2ind; -SET enable_seqscan = OFF; -SET enable_indexscan = ON; -SET enable_bitmapscan = OFF; -EXPLAIN (COSTS OFF) -SELECT * FROM fast_emp4000 - WHERE home_base <@ '(200,200),(2000,1000)'::box - ORDER BY (home_base[0])[0]; - QUERY PLAN ------------------------------------------------------------------ - Sort - Sort Key: ((home_base[0])[0]) - -> Index Only Scan using grect2ind2 on fast_emp4000 - Index Cond: (home_base <@ '(2000,1000),(200,200)'::box) -(4 rows) - -SELECT * FROM fast_emp4000 - WHERE home_base <@ '(200,200),(2000,1000)'::box - ORDER BY (home_base[0])[0]; - home_base ------------------------ - (337,455),(240,359) - (1444,403),(1346,344) -(2 rows) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM fast_emp4000 WHERE home_base && '(1000,1000,0,0)'::box; - QUERY PLAN -------------------------------------------------------------- - Aggregate - -> Index Only Scan using grect2ind2 on fast_emp4000 - Index Cond: (home_base && '(1000,1000),(0,0)'::box) -(3 rows) - -SELECT count(*) FROM fast_emp4000 WHERE home_base && '(1000,1000,0,0)'::box; - count -------- - 2 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; - QUERY PLAN --------------------------------------------------------- - Aggregate - -> Index Only Scan using grect2ind2 on fast_emp4000 - Index Cond: (home_base IS NULL) -(3 rows) - -SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; - count -------- - 278 -(1 row) - -ROLLBACK; --- Try to drop access method: fail because of dependent objects -DROP ACCESS METHOD gist2; -ERROR: cannot drop access method gist2 because other objects depend on it -DETAIL: index grect2ind2 depends on operator class box_ops for access method gist2 -HINT: Use DROP ... CASCADE to drop the dependent objects too. --- Drop access method cascade --- To prevent a (rare) deadlock against autovacuum, --- we must lock the table that owns the index that will be dropped -BEGIN; -LOCK TABLE fast_emp4000; -DROP ACCESS METHOD gist2 CASCADE; -NOTICE: drop cascades to index grect2ind2 -COMMIT; --- --- Test table access methods --- --- 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. --- 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" -DETAIL: Table access method "I do not exist AM" does not exist. --- prevent setting it to an index AM -SET default_table_access_method = 'btree'; -ERROR: access method "btree" is not of type TABLE --- Create a heap2 table am handler with heapam handler -CREATE ACCESS METHOD heap2 TYPE TABLE HANDLER heap_tableam_handler; --- Verify return type checks for handlers -CREATE ACCESS METHOD bogus TYPE TABLE HANDLER int4in; -ERROR: function int4in(internal) does not exist -CREATE ACCESS METHOD bogus TYPE TABLE HANDLER bthandler; -ERROR: function bthandler must return type table_am_handler -SELECT amname, amhandler, amtype FROM pg_am where amtype = 't' ORDER BY 1, 2; - amname | amhandler | amtype -----------+----------------------+-------- - heap | heap_tableam_handler | t - heap2 | heap_tableam_handler | t - tde_heap | pg_tdeam_handler | t -(3 rows) - --- First create tables employing the new AM using USING --- plain CREATE TABLE -CREATE TABLE tableam_tbl_heap2(f1 int) USING heap2; -INSERT INTO tableam_tbl_heap2 VALUES(1); -SELECT f1 FROM tableam_tbl_heap2 ORDER BY f1; - f1 ----- - 1 -(1 row) - --- CREATE TABLE AS -CREATE TABLE tableam_tblas_heap2 USING heap2 AS SELECT * FROM tableam_tbl_heap2; -SELECT f1 FROM tableam_tbl_heap2 ORDER BY f1; - f1 ----- - 1 -(1 row) - --- SELECT INTO doesn't support USING -SELECT INTO tableam_tblselectinto_heap2 USING heap2 FROM tableam_tbl_heap2; -ERROR: syntax error at or near "USING" -LINE 1: SELECT INTO tableam_tblselectinto_heap2 USING heap2 FROM tab... - ^ --- CREATE VIEW doesn't support USING -CREATE VIEW tableam_view_heap2 USING heap2 AS SELECT * FROM tableam_tbl_heap2; -ERROR: syntax error at or near "USING" -LINE 1: CREATE VIEW tableam_view_heap2 USING heap2 AS SELECT * FROM ... - ^ --- CREATE SEQUENCE doesn't support USING -CREATE SEQUENCE tableam_seq_heap2 USING heap2; -ERROR: syntax error at or near "USING" -LINE 1: CREATE SEQUENCE tableam_seq_heap2 USING heap2; - ^ --- CREATE MATERIALIZED VIEW does support USING -CREATE MATERIALIZED VIEW tableam_tblmv_heap2 USING heap2 AS SELECT * FROM tableam_tbl_heap2; -SELECT f1 FROM tableam_tblmv_heap2 ORDER BY f1; - f1 ----- - 1 -(1 row) - --- 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; - 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'; -CREATE TABLE tableam_parted_a_heap2 PARTITION OF tableam_parted_heap2 FOR VALUES IN ('a'); -SET default_table_access_method = 'heap2'; -CREATE TABLE tableam_parted_b_heap2 PARTITION OF tableam_parted_heap2 FOR VALUES IN ('b'); -RESET default_table_access_method; --- but the method can be explicitly specified -CREATE TABLE tableam_parted_c_heap2 PARTITION OF tableam_parted_heap2 FOR VALUES IN ('c') USING heap; -CREATE TABLE tableam_parted_d_heap2 PARTITION OF tableam_parted_heap2 FOR VALUES IN ('d') USING heap2; --- List all objects in AM -SELECT - pc.relkind, - pa.amname, - CASE WHEN relkind = 't' THEN - (SELECT 'toast for ' || relname::regclass FROM pg_class pcm WHERE pcm.reltoastrelid = pc.oid) - ELSE - relname::regclass::text - END COLLATE "C" AS relname -FROM pg_class AS pc, - pg_am AS pa -WHERE pa.oid = pc.relam - AND pa.amname = 'heap2' -ORDER BY 3, 1, 2; - relkind | amname | relname ----------+--------+---------------------------------- - r | heap2 | tableam_parted_b_heap2 - r | heap2 | tableam_parted_d_heap2 - r | heap2 | tableam_tbl_heap2 - r | heap2 | tableam_tblas_heap2 - m | heap2 | tableam_tblmv_heap2 - t | heap2 | toast for tableam_parted_b_heap2 - t | heap2 | toast for tableam_parted_d_heap2 -(7 rows) - --- Show dependencies onto AM - there shouldn't be any for toast -SELECT pg_describe_object(classid,objid,objsubid) AS obj -FROM pg_depend, pg_am -WHERE pg_depend.refclassid = 'pg_am'::regclass - AND pg_am.oid = pg_depend.refobjid - AND pg_am.amname = 'heap2' -ORDER BY classid, objid, objsubid; - obj ---------------------------------------- - table tableam_tbl_heap2 - table tableam_tblas_heap2 - materialized view tableam_tblmv_heap2 - table tableam_parted_b_heap2 - table tableam_parted_d_heap2 -(5 rows) - --- ALTER TABLE SET ACCESS METHOD -CREATE TABLE heaptable USING heap AS - SELECT a, repeat(a::text, 100) FROM generate_series(1,9) AS a; -SELECT amname FROM pg_class c, pg_am am - WHERE c.relam = am.oid AND c.oid = 'heaptable'::regclass; - amname --------- - heap -(1 row) - --- Switching to heap2 adds new dependency entry to the AM. -ALTER TABLE heaptable SET ACCESS METHOD heap2; -SELECT pg_describe_object(classid, objid, objsubid) as obj, - pg_describe_object(refclassid, refobjid, refobjsubid) as objref, - deptype - FROM pg_depend - WHERE classid = 'pg_class'::regclass AND - objid = 'heaptable'::regclass - ORDER BY 1, 2; - obj | objref | deptype ------------------+---------------------+--------- - table heaptable | access method heap2 | n - table heaptable | schema public | n -(2 rows) - --- Switching to heap should not have a dependency entry to the AM. -ALTER TABLE heaptable SET ACCESS METHOD heap; -SELECT pg_describe_object(classid, objid, objsubid) as obj, - pg_describe_object(refclassid, refobjid, refobjsubid) as objref, - deptype - FROM pg_depend - WHERE classid = 'pg_class'::regclass AND - objid = 'heaptable'::regclass - ORDER BY 1, 2; - obj | objref | deptype ------------------+---------------+--------- - table heaptable | schema public | n -(1 row) - -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; - amname --------- - heap2 -(1 row) - -SELECT COUNT(a), COUNT(1) FILTER(WHERE a=1) FROM heaptable; - count | count --------+------- - 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 - WHERE c.relam = am.oid AND c.oid = 'heapmv'::regclass; - amname --------- - heap -(1 row) - -ALTER MATERIALIZED VIEW heapmv SET ACCESS METHOD heap2; -SELECT amname FROM pg_class c, pg_am am - WHERE c.relam = am.oid AND c.oid = 'heapmv'::regclass; - amname --------- - heap2 -(1 row) - -SELECT COUNT(a), COUNT(1) FILTER(WHERE a=1) FROM heapmv; - count | count --------+------- - 9 | 1 -(1 row) - --- 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; --- 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; -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'; --- following tests should all respect the default AM -CREATE TABLE tableam_tbl_heapx(f1 int); -CREATE TABLE tableam_tblas_heapx AS SELECT * FROM tableam_tbl_heapx; -SELECT INTO tableam_tblselectinto_heapx FROM tableam_tbl_heapx; -CREATE MATERIALIZED VIEW tableam_tblmv_heapx USING heap2 AS SELECT * FROM tableam_tbl_heapx; -CREATE TABLE tableam_parted_heapx (a text, b int) PARTITION BY list (a); -CREATE TABLE tableam_parted_1_heapx PARTITION OF tableam_parted_heapx FOR VALUES IN ('a', 'b'); --- but an explicitly set AM overrides it -CREATE TABLE tableam_parted_2_heapx PARTITION OF tableam_parted_heapx FOR VALUES IN ('c', 'd') USING heap; --- sequences, views and foreign servers shouldn't have an AM -CREATE VIEW tableam_view_heapx AS SELECT * FROM tableam_tbl_heapx; -CREATE SEQUENCE tableam_seq_heapx; -CREATE FOREIGN DATA WRAPPER fdw_heap2 VALIDATOR postgresql_fdw_validator; -CREATE SERVER fs_heap2 FOREIGN DATA WRAPPER fdw_heap2 ; -CREATE FOREIGN table tableam_fdw_heapx () SERVER fs_heap2; --- Verify that new AM was used for tables, matviews, but not for sequences, views and fdws -SELECT - pc.relkind, - pa.amname, - CASE WHEN relkind = 't' THEN - (SELECT 'toast for ' || relname::regclass FROM pg_class pcm WHERE pcm.reltoastrelid = pc.oid) - ELSE - relname::regclass::text - END COLLATE "C" AS relname -FROM pg_class AS pc - LEFT JOIN pg_am AS pa ON (pa.oid = pc.relam) -WHERE pc.relname LIKE 'tableam_%_heapx' -ORDER BY 3, 1, 2; - relkind | amname | relname ----------+--------+----------------------------- - f | | tableam_fdw_heapx - r | heap2 | tableam_parted_1_heapx - r | heap | tableam_parted_2_heapx - p | | tableam_parted_heapx - S | | tableam_seq_heapx - r | heap2 | tableam_tbl_heapx - r | heap2 | tableam_tblas_heapx - m | heap2 | tableam_tblmv_heapx - r | heap2 | tableam_tblselectinto_heapx - v | | tableam_view_heapx -(10 rows) - --- don't want to keep those tables, nor the default -ROLLBACK; --- Third, check that we can neither create a table using a nonexistent --- AM, nor using an index AM -CREATE TABLE i_am_a_failure() USING ""; -ERROR: zero-length delimited identifier at or near """" -LINE 1: CREATE TABLE i_am_a_failure() USING ""; - ^ -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 "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 -DETAIL: table tableam_tbl_heap2 depends on access method heap2 -table tableam_tblas_heap2 depends on access method heap2 -materialized view tableam_tblmv_heap2 depends on access method heap2 -table tableam_parted_b_heap2 depends on access method heap2 -table tableam_parted_d_heap2 depends on access method heap2 -HINT: Use DROP ... CASCADE to drop the dependent objects too. --- we intentionally leave the objects created above alive, to verify pg_dump support diff --git a/src/test/regress/expected/create_index.out b/src/test/regress/expected/create_index.out index cf6eac57349a0..b1df05593c4e8 100644 --- a/src/test/regress/expected/create_index.out +++ b/src/test/regress/expected/create_index.out @@ -1606,8 +1606,8 @@ DROP TABLE cwi_test; -- CREATE TABLE syscol_table (a INT); -- System columns cannot be indexed -CREATE INDEX ON syscolcol_table (ctid); -ERROR: relation "syscolcol_table" does not exist +CREATE INDEX ON syscol_table (ctid); +ERROR: index creation on system columns is not supported -- nor used in expressions CREATE INDEX ON syscol_table ((ctid >= '(1000,0)')); ERROR: index creation on system columns is not supported diff --git a/src/test/regress/expected/create_index_1.out b/src/test/regress/expected/create_index_1.out deleted file mode 100644 index f29407adc69c9..0000000000000 --- a/src/test/regress/expected/create_index_1.out +++ /dev/null @@ -1,3000 +0,0 @@ --- --- CREATE_INDEX --- Create ancillary data structures (i.e. indices) --- --- directory paths are passed to us in environment variables -\getenv abs_srcdir PG_ABS_SRCDIR --- --- BTREE --- -CREATE INDEX onek_unique1 ON onek USING btree(unique1 int4_ops); -CREATE INDEX IF NOT EXISTS onek_unique1 ON onek USING btree(unique1 int4_ops); -NOTICE: relation "onek_unique1" already exists, skipping -CREATE INDEX IF NOT EXISTS ON onek USING btree(unique1 int4_ops); -ERROR: syntax error at or near "ON" -LINE 1: CREATE INDEX IF NOT EXISTS ON onek USING btree(unique1 int4_... - ^ -CREATE INDEX onek_unique2 ON onek USING btree(unique2 int4_ops); -CREATE INDEX onek_hundred ON onek USING btree(hundred int4_ops); -CREATE INDEX onek_stringu1 ON onek USING btree(stringu1 name_ops); -CREATE INDEX tenk1_unique1 ON tenk1 USING btree(unique1 int4_ops); -CREATE INDEX tenk1_unique2 ON tenk1 USING btree(unique2 int4_ops); -CREATE INDEX tenk1_hundred ON tenk1 USING btree(hundred int4_ops); -CREATE INDEX tenk1_thous_tenthous ON tenk1 (thousand, tenthous); -CREATE INDEX tenk2_unique1 ON tenk2 USING btree(unique1 int4_ops); -CREATE INDEX tenk2_unique2 ON tenk2 USING btree(unique2 int4_ops); -CREATE INDEX tenk2_hundred ON tenk2 USING btree(hundred int4_ops); -CREATE INDEX rix ON road USING btree (name text_ops); -CREATE INDEX iix ON ihighway USING btree (name text_ops); -CREATE INDEX six ON shighway USING btree (name text_ops); --- test comments -COMMENT ON INDEX six_wrong IS 'bad index'; -ERROR: relation "six_wrong" does not exist -COMMENT ON INDEX six IS 'good index'; -COMMENT ON INDEX six IS NULL; --- --- BTREE partial indices --- -CREATE INDEX onek2_u1_prtl ON onek2 USING btree(unique1 int4_ops) - where unique1 < 20 or unique1 > 980; -CREATE INDEX onek2_u2_prtl ON onek2 USING btree(unique2 int4_ops) - where stringu1 < 'B'; -CREATE INDEX onek2_stu1_prtl ON onek2 USING btree(stringu1 name_ops) - where onek2.stringu1 >= 'J' and onek2.stringu1 < 'K'; --- --- GiST (rtree-equivalent opclasses only) --- -CREATE TABLE slow_emp4000 ( - home_base box -); -CREATE TABLE fast_emp4000 ( - home_base box -); -\set filename :abs_srcdir '/data/rect.data' -COPY slow_emp4000 FROM :'filename'; -INSERT INTO fast_emp4000 SELECT * FROM slow_emp4000; -ANALYZE slow_emp4000; -ANALYZE fast_emp4000; -CREATE INDEX grect2ind ON fast_emp4000 USING gist (home_base); --- we want to work with a point_tbl that includes a null -CREATE TEMP TABLE point_tbl AS SELECT * FROM public.point_tbl; -INSERT INTO POINT_TBL(f1) VALUES (NULL); -CREATE INDEX gpointind ON point_tbl USING gist (f1); -CREATE TEMP TABLE gpolygon_tbl AS - SELECT polygon(home_base) AS f1 FROM slow_emp4000; -INSERT INTO gpolygon_tbl VALUES ( '(1000,0,0,1000)' ); -INSERT INTO gpolygon_tbl VALUES ( '(0,1000,1000,1000)' ); -CREATE TEMP TABLE gcircle_tbl AS - SELECT circle(home_base) AS f1 FROM slow_emp4000; -CREATE INDEX ggpolygonind ON gpolygon_tbl USING gist (f1); -CREATE INDEX ggcircleind ON gcircle_tbl USING gist (f1); --- --- Test GiST indexes --- --- get non-indexed results for comparison purposes -SET enable_seqscan = ON; -SET enable_indexscan = OFF; -SET enable_bitmapscan = OFF; -SELECT * FROM fast_emp4000 - WHERE home_base <@ '(200,200),(2000,1000)'::box - ORDER BY (home_base[0])[0]; - home_base ------------------------ - (337,455),(240,359) - (1444,403),(1346,344) -(2 rows) - -SELECT count(*) FROM fast_emp4000 WHERE home_base && '(1000,1000,0,0)'::box; - count -------- - 2 -(1 row) - -SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; - count -------- - 278 -(1 row) - -SELECT count(*) FROM gpolygon_tbl WHERE f1 && '(1000,1000,0,0)'::polygon; - count -------- - 2 -(1 row) - -SELECT count(*) FROM gcircle_tbl WHERE f1 && '<(500,500),500>'::circle; - count -------- - 2 -(1 row) - -SELECT count(*) FROM point_tbl WHERE f1 <@ box '(0,0,100,100)'; - count -------- - 3 -(1 row) - -SELECT count(*) FROM point_tbl WHERE box '(0,0,100,100)' @> f1; - count -------- - 3 -(1 row) - -SELECT count(*) FROM point_tbl WHERE f1 <@ polygon '(0,0),(0,100),(100,100),(50,50),(100,0),(0,0)'; - count -------- - 5 -(1 row) - -SELECT count(*) FROM point_tbl WHERE f1 <@ circle '<(50,50),50>'; - count -------- - 1 -(1 row) - -SELECT count(*) FROM point_tbl p WHERE p.f1 << '(0.0, 0.0)'; - count -------- - 3 -(1 row) - -SELECT count(*) FROM point_tbl p WHERE p.f1 >> '(0.0, 0.0)'; - count -------- - 4 -(1 row) - -SELECT count(*) FROM point_tbl p WHERE p.f1 <<| '(0.0, 0.0)'; - count -------- - 1 -(1 row) - -SELECT count(*) FROM point_tbl p WHERE p.f1 |>> '(0.0, 0.0)'; - count -------- - 5 -(1 row) - -SELECT count(*) FROM point_tbl p WHERE p.f1 ~= '(-5, -12)'; - count -------- - 1 -(1 row) - -SELECT * FROM point_tbl ORDER BY f1 <-> '0,1'; - f1 -------------------- - (0,0) - (1e-300,-1e-300) - (-3,4) - (-10,0) - (10,10) - (-5,-12) - (5.1,34.5) - (Infinity,1e+300) - (1e+300,Infinity) - (NaN,NaN) - -(11 rows) - -SELECT * FROM point_tbl WHERE f1 IS NULL; - f1 ----- - -(1 row) - -SELECT * FROM point_tbl WHERE f1 IS NOT NULL ORDER BY f1 <-> '0,1'; - f1 -------------------- - (0,0) - (1e-300,-1e-300) - (-3,4) - (-10,0) - (10,10) - (-5,-12) - (5.1,34.5) - (1e+300,Infinity) - (Infinity,1e+300) - (NaN,NaN) -(10 rows) - -SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; - f1 ------------------- - (0,0) - (1e-300,-1e-300) - (-3,4) - (-10,0) - (10,10) -(5 rows) - -SELECT * FROM gpolygon_tbl ORDER BY f1 <-> '(0,0)'::point LIMIT 10; - f1 -------------------------------------------------- - ((240,359),(240,455),(337,455),(337,359)) - ((662,163),(662,187),(759,187),(759,163)) - ((1000,0),(0,1000)) - ((0,1000),(1000,1000)) - ((1346,344),(1346,403),(1444,403),(1444,344)) - ((278,1409),(278,1457),(369,1457),(369,1409)) - ((907,1156),(907,1201),(948,1201),(948,1156)) - ((1517,971),(1517,1043),(1594,1043),(1594,971)) - ((175,1820),(175,1850),(259,1850),(259,1820)) - ((2424,81),(2424,160),(2424,160),(2424,81)) -(10 rows) - -SELECT circle_center(f1), round(radius(f1)) as radius FROM gcircle_tbl ORDER BY f1 <-> '(200,300)'::point LIMIT 10; - circle_center | radius -----------------+-------- - (288.5,407) | 68 - (710.5,175) | 50 - (323.5,1433) | 51 - (927.5,1178.5) | 30 - (1395,373.5) | 57 - (1555.5,1007) | 53 - (217,1835) | 45 - (489,2421.5) | 22 - (2424,120.5) | 40 - (751.5,2655) | 20 -(10 rows) - --- Now check the results from plain indexscan -SET enable_seqscan = OFF; -SET enable_indexscan = ON; -SET enable_bitmapscan = OFF; -EXPLAIN (COSTS OFF) -SELECT * FROM fast_emp4000 - WHERE home_base <@ '(200,200),(2000,1000)'::box - ORDER BY (home_base[0])[0]; - QUERY PLAN ------------------------------------------------------------------ - Sort - Sort Key: ((home_base[0])[0]) - -> Index Only Scan using grect2ind on fast_emp4000 - Index Cond: (home_base <@ '(2000,1000),(200,200)'::box) -(4 rows) - -SELECT * FROM fast_emp4000 - WHERE home_base <@ '(200,200),(2000,1000)'::box - ORDER BY (home_base[0])[0]; - home_base ------------------------ - (337,455),(240,359) - (1444,403),(1346,344) -(2 rows) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM fast_emp4000 WHERE home_base && '(1000,1000,0,0)'::box; - QUERY PLAN -------------------------------------------------------------- - Aggregate - -> Index Only Scan using grect2ind on fast_emp4000 - Index Cond: (home_base && '(1000,1000),(0,0)'::box) -(3 rows) - -SELECT count(*) FROM fast_emp4000 WHERE home_base && '(1000,1000,0,0)'::box; - count -------- - 2 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; - QUERY PLAN -------------------------------------------------------- - Aggregate - -> Index Only Scan using grect2ind on fast_emp4000 - Index Cond: (home_base IS NULL) -(3 rows) - -SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; - count -------- - 278 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM gpolygon_tbl WHERE f1 && '(1000,1000,0,0)'::polygon; - QUERY PLAN ------------------------------------------------------------- - Aggregate - -> Index Scan using ggpolygonind on gpolygon_tbl - Index Cond: (f1 && '((1000,1000),(0,0))'::polygon) -(3 rows) - -SELECT count(*) FROM gpolygon_tbl WHERE f1 && '(1000,1000,0,0)'::polygon; - count -------- - 2 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM gcircle_tbl WHERE f1 && '<(500,500),500>'::circle; - QUERY PLAN -------------------------------------------------------- - Aggregate - -> Index Scan using ggcircleind on gcircle_tbl - Index Cond: (f1 && '<(500,500),500>'::circle) -(3 rows) - -SELECT count(*) FROM gcircle_tbl WHERE f1 && '<(500,500),500>'::circle; - count -------- - 2 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM point_tbl WHERE f1 <@ box '(0,0,100,100)'; - QUERY PLAN ----------------------------------------------------- - Aggregate - -> Index Only Scan using gpointind on point_tbl - Index Cond: (f1 <@ '(100,100),(0,0)'::box) -(3 rows) - -SELECT count(*) FROM point_tbl WHERE f1 <@ box '(0,0,100,100)'; - count -------- - 3 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM point_tbl WHERE box '(0,0,100,100)' @> f1; - QUERY PLAN ----------------------------------------------------- - Aggregate - -> Index Only Scan using gpointind on point_tbl - Index Cond: (f1 <@ '(100,100),(0,0)'::box) -(3 rows) - -SELECT count(*) FROM point_tbl WHERE box '(0,0,100,100)' @> f1; - count -------- - 3 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM point_tbl WHERE f1 <@ polygon '(0,0),(0,100),(100,100),(50,50),(100,0),(0,0)'; - QUERY PLAN ----------------------------------------------------------------------------------------- - Aggregate - -> Index Only Scan using gpointind on point_tbl - Index Cond: (f1 <@ '((0,0),(0,100),(100,100),(50,50),(100,0),(0,0))'::polygon) -(3 rows) - -SELECT count(*) FROM point_tbl WHERE f1 <@ polygon '(0,0),(0,100),(100,100),(50,50),(100,0),(0,0)'; - count -------- - 4 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM point_tbl WHERE f1 <@ circle '<(50,50),50>'; - QUERY PLAN ----------------------------------------------------- - Aggregate - -> Index Only Scan using gpointind on point_tbl - Index Cond: (f1 <@ '<(50,50),50>'::circle) -(3 rows) - -SELECT count(*) FROM point_tbl WHERE f1 <@ circle '<(50,50),50>'; - count -------- - 1 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM point_tbl p WHERE p.f1 << '(0.0, 0.0)'; - QUERY PLAN ------------------------------------------------------- - Aggregate - -> Index Only Scan using gpointind on point_tbl p - Index Cond: (f1 << '(0,0)'::point) -(3 rows) - -SELECT count(*) FROM point_tbl p WHERE p.f1 << '(0.0, 0.0)'; - count -------- - 3 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM point_tbl p WHERE p.f1 >> '(0.0, 0.0)'; - QUERY PLAN ------------------------------------------------------- - Aggregate - -> Index Only Scan using gpointind on point_tbl p - Index Cond: (f1 >> '(0,0)'::point) -(3 rows) - -SELECT count(*) FROM point_tbl p WHERE p.f1 >> '(0.0, 0.0)'; - count -------- - 4 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM point_tbl p WHERE p.f1 <<| '(0.0, 0.0)'; - QUERY PLAN ------------------------------------------------------- - Aggregate - -> Index Only Scan using gpointind on point_tbl p - Index Cond: (f1 <<| '(0,0)'::point) -(3 rows) - -SELECT count(*) FROM point_tbl p WHERE p.f1 <<| '(0.0, 0.0)'; - count -------- - 1 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM point_tbl p WHERE p.f1 |>> '(0.0, 0.0)'; - QUERY PLAN ------------------------------------------------------- - Aggregate - -> Index Only Scan using gpointind on point_tbl p - Index Cond: (f1 |>> '(0,0)'::point) -(3 rows) - -SELECT count(*) FROM point_tbl p WHERE p.f1 |>> '(0.0, 0.0)'; - count -------- - 5 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM point_tbl p WHERE p.f1 ~= '(-5, -12)'; - QUERY PLAN ------------------------------------------------------- - Aggregate - -> Index Only Scan using gpointind on point_tbl p - Index Cond: (f1 ~= '(-5,-12)'::point) -(3 rows) - -SELECT count(*) FROM point_tbl p WHERE p.f1 ~= '(-5, -12)'; - count -------- - 1 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT * FROM point_tbl ORDER BY f1 <-> '0,1'; - QUERY PLAN ----------------------------------------------- - Index Only Scan using gpointind on point_tbl - Order By: (f1 <-> '(0,1)'::point) -(2 rows) - -SELECT * FROM point_tbl ORDER BY f1 <-> '0,1'; - f1 -------------------- - (1e-300,-1e-300) - (0,0) - (-3,4) - (-10,0) - (10,10) - (-5,-12) - (5.1,34.5) - (Infinity,1e+300) - (1e+300,Infinity) - (NaN,NaN) - -(11 rows) - -EXPLAIN (COSTS OFF) -SELECT * FROM point_tbl WHERE f1 IS NULL; - QUERY PLAN ----------------------------------------------- - Index Only Scan using gpointind on point_tbl - Index Cond: (f1 IS NULL) -(2 rows) - -SELECT * FROM point_tbl WHERE f1 IS NULL; - f1 ----- - -(1 row) - -EXPLAIN (COSTS OFF) -SELECT * FROM point_tbl WHERE f1 IS NOT NULL ORDER BY f1 <-> '0,1'; - QUERY PLAN ----------------------------------------------- - Index Only Scan using gpointind on point_tbl - Index Cond: (f1 IS NOT NULL) - Order By: (f1 <-> '(0,1)'::point) -(3 rows) - -SELECT * FROM point_tbl WHERE f1 IS NOT NULL ORDER BY f1 <-> '0,1'; - f1 -------------------- - (1e-300,-1e-300) - (0,0) - (-3,4) - (-10,0) - (10,10) - (-5,-12) - (5.1,34.5) - (Infinity,1e+300) - (1e+300,Infinity) - (NaN,NaN) -(10 rows) - -EXPLAIN (COSTS OFF) -SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; - QUERY PLAN ------------------------------------------------- - Index Only Scan using gpointind on point_tbl - Index Cond: (f1 <@ '(10,10),(-10,-10)'::box) - Order By: (f1 <-> '(0,1)'::point) -(3 rows) - -SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; - f1 ------------------- - (1e-300,-1e-300) - (0,0) - (-3,4) - (-10,0) - (10,10) -(5 rows) - -EXPLAIN (COSTS OFF) -SELECT * FROM gpolygon_tbl ORDER BY f1 <-> '(0,0)'::point LIMIT 10; - QUERY PLAN ------------------------------------------------------ - Limit - -> Index Scan using ggpolygonind on gpolygon_tbl - Order By: (f1 <-> '(0,0)'::point) -(3 rows) - -SELECT * FROM gpolygon_tbl ORDER BY f1 <-> '(0,0)'::point LIMIT 10; - f1 -------------------------------------------------- - ((240,359),(240,455),(337,455),(337,359)) - ((662,163),(662,187),(759,187),(759,163)) - ((1000,0),(0,1000)) - ((0,1000),(1000,1000)) - ((1346,344),(1346,403),(1444,403),(1444,344)) - ((278,1409),(278,1457),(369,1457),(369,1409)) - ((907,1156),(907,1201),(948,1201),(948,1156)) - ((1517,971),(1517,1043),(1594,1043),(1594,971)) - ((175,1820),(175,1850),(259,1850),(259,1820)) - ((2424,81),(2424,160),(2424,160),(2424,81)) -(10 rows) - -EXPLAIN (COSTS OFF) -SELECT circle_center(f1), round(radius(f1)) as radius FROM gcircle_tbl ORDER BY f1 <-> '(200,300)'::point LIMIT 10; - QUERY PLAN ---------------------------------------------------- - Limit - -> Index Scan using ggcircleind on gcircle_tbl - Order By: (f1 <-> '(200,300)'::point) -(3 rows) - -SELECT circle_center(f1), round(radius(f1)) as radius FROM gcircle_tbl ORDER BY f1 <-> '(200,300)'::point LIMIT 10; - circle_center | radius -----------------+-------- - (288.5,407) | 68 - (710.5,175) | 50 - (323.5,1433) | 51 - (927.5,1178.5) | 30 - (1395,373.5) | 57 - (1555.5,1007) | 53 - (217,1835) | 45 - (489,2421.5) | 22 - (2424,120.5) | 40 - (751.5,2655) | 20 -(10 rows) - -EXPLAIN (COSTS OFF) -SELECT point(x,x), (SELECT f1 FROM gpolygon_tbl ORDER BY f1 <-> point(x,x) LIMIT 1) as c FROM generate_series(0,10,1) x; - QUERY PLAN --------------------------------------------------------------------------------------------- - Function Scan on generate_series x - SubPlan 1 - -> Limit - -> Index Scan using ggpolygonind on gpolygon_tbl - Order By: (f1 <-> point((x.x)::double precision, (x.x)::double precision)) -(5 rows) - -SELECT point(x,x), (SELECT f1 FROM gpolygon_tbl ORDER BY f1 <-> point(x,x) LIMIT 1) as c FROM generate_series(0,10,1) x; - point | c ----------+------------------------------------------- - (0,0) | ((240,359),(240,455),(337,455),(337,359)) - (1,1) | ((240,359),(240,455),(337,455),(337,359)) - (2,2) | ((240,359),(240,455),(337,455),(337,359)) - (3,3) | ((240,359),(240,455),(337,455),(337,359)) - (4,4) | ((240,359),(240,455),(337,455),(337,359)) - (5,5) | ((240,359),(240,455),(337,455),(337,359)) - (6,6) | ((240,359),(240,455),(337,455),(337,359)) - (7,7) | ((240,359),(240,455),(337,455),(337,359)) - (8,8) | ((240,359),(240,455),(337,455),(337,359)) - (9,9) | ((240,359),(240,455),(337,455),(337,359)) - (10,10) | ((240,359),(240,455),(337,455),(337,359)) -(11 rows) - --- Now check the results from bitmap indexscan -SET enable_seqscan = OFF; -SET enable_indexscan = OFF; -SET enable_bitmapscan = ON; -EXPLAIN (COSTS OFF) -SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; - QUERY PLAN ------------------------------------------------------------- - Sort - Sort Key: ((f1 <-> '(0,1)'::point)) - -> Bitmap Heap Scan on point_tbl - Recheck Cond: (f1 <@ '(10,10),(-10,-10)'::box) - -> Bitmap Index Scan on gpointind - Index Cond: (f1 <@ '(10,10),(-10,-10)'::box) -(6 rows) - -SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; - f1 ------------------- - (0,0) - (1e-300,-1e-300) - (-3,4) - (-10,0) - (10,10) -(5 rows) - -RESET enable_seqscan; -RESET enable_indexscan; -RESET enable_bitmapscan; --- --- GIN over int[] and text[] --- --- Note: GIN currently supports only bitmap scans, not plain indexscans --- -CREATE TABLE array_index_op_test ( - seqno int4, - i int4[], - t text[] -); -\set filename :abs_srcdir '/data/array.data' -COPY array_index_op_test FROM :'filename'; -ANALYZE array_index_op_test; -SELECT * FROM array_index_op_test WHERE i = '{NULL}' ORDER BY seqno; - seqno | i | t --------+--------+-------- - 102 | {NULL} | {NULL} -(1 row) - -SELECT * FROM array_index_op_test WHERE i @> '{NULL}' ORDER BY seqno; - seqno | i | t --------+---+--- -(0 rows) - -SELECT * FROM array_index_op_test WHERE i && '{NULL}' ORDER BY seqno; - seqno | i | t --------+---+--- -(0 rows) - -SELECT * FROM array_index_op_test WHERE i <@ '{NULL}' ORDER BY seqno; - seqno | i | t --------+----+---- - 101 | {} | {} -(1 row) - -SET enable_seqscan = OFF; -SET enable_indexscan = OFF; -SET enable_bitmapscan = ON; -CREATE INDEX intarrayidx ON array_index_op_test USING gin (i); -explain (costs off) -SELECT * FROM array_index_op_test WHERE i @> '{32}' ORDER BY seqno; - QUERY PLAN ----------------------------------------------------- - Sort - Sort Key: seqno - -> Bitmap Heap Scan on array_index_op_test - Recheck Cond: (i @> '{32}'::integer[]) - -> Bitmap Index Scan on intarrayidx - Index Cond: (i @> '{32}'::integer[]) -(6 rows) - -SELECT * FROM array_index_op_test WHERE i @> '{32}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} - 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} -(6 rows) - -SELECT * FROM array_index_op_test WHERE i && '{32}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} - 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} -(6 rows) - -SELECT * FROM array_index_op_test WHERE i @> '{17}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} - 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} - 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} - 53 | {38,17} | {AAAAAAAAAAA21658} - 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} -(8 rows) - -SELECT * FROM array_index_op_test WHERE i && '{17}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} - 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} - 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} - 53 | {38,17} | {AAAAAAAAAAA21658} - 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} -(8 rows) - -SELECT * FROM array_index_op_test WHERE i @> '{32,17}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} -(3 rows) - -SELECT * FROM array_index_op_test WHERE i && '{32,17}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} - 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} - 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} - 53 | {38,17} | {AAAAAAAAAAA21658} - 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} - 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} - 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} -(11 rows) - -SELECT * FROM array_index_op_test WHERE i <@ '{38,34,32,89}' ORDER BY seqno; - seqno | i | t --------+---------------+---------------------------------------------------------------------------------------------------------------------------- - 40 | {34} | {AAAAAAAAAAAAAA10611,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAA31334,AAAAA70466,AAAAAAAA81587,AAAAAAA74623} - 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} - 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} - 101 | {} | {} -(4 rows) - -SELECT * FROM array_index_op_test WHERE i = '{47,77}' ORDER BY seqno; - seqno | i | t --------+---------+----------------------------------------------------------------------------------------------------------------- - 95 | {47,77} | {AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA74076,AAAAAAAAAA18107,AAAAA40681,AAAAAAAAAAAAAAA35875,AAAAA60038,AAAAAAA56483} -(1 row) - -SELECT * FROM array_index_op_test WHERE i = '{}' ORDER BY seqno; - seqno | i | t --------+----+---- - 101 | {} | {} -(1 row) - -SELECT * FROM array_index_op_test WHERE i @> '{}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - 1 | {92,75,71,52,64,83} | {AAAAAAAA44066,AAAAAA1059,AAAAAAAAAAA176,AAAAAAA48038} - 2 | {3,6} | {AAAAAA98232,AAAAAAAA79710,AAAAAAAAAAAAAAAAA69675,AAAAAAAAAAAAAAAA55798,AAAAAAAAA12793} - 3 | {37,64,95,43,3,41,13,30,11,43} | {AAAAAAAAAA48845,AAAAA75968,AAAAA95309,AAA54451,AAAAAAAAAA22292,AAAAAAA99836,A96617,AA17009,AAAAAAAAAAAAAA95246} - 4 | {71,39,99,55,33,75,45} | {AAAAAAAAA53663,AAAAAAAAAAAAAAA67062,AAAAAAAAAA64777,AAA99043,AAAAAAAAAAAAAAAAAAA91804,39557} - 5 | {50,42,77,50,4} | {AAAAAAAAAAAAAAAAA26540,AAAAAAA79710,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA176,AAAAA95309,AAAAAAAAAAA46154,AAAAAA66777,AAAAAAAAA27249,AAAAAAAAAA64777,AAAAAAAAAAAAAAAAAAA70104} - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 7 | {12,51,88,64,8} | {AAAAAAAAAAAAAAAAAA12591,AAAAAAAAAAAAAAAAA50407,AAAAAAAAAAAA67946} - 8 | {60,84} | {AAAAAAA81898,AAAAAA1059,AAAAAAAAAAAA81511,AAAAA961,AAAAAAAAAAAAAAAA31334,AAAAA64741,AA6416,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAAAA50407} - 9 | {56,52,35,27,80,44,81,22} | {AAAAAAAAAAAAAAA73034,AAAAAAAAAAAAA7929,AAAAAAA66161,AA88409,39557,A27153,AAAAAAAA9523,AAAAAAAAAAA99000} - 10 | {71,5,45} | {AAAAAAAAAAA21658,AAAAAAAAAAAA21089,AAA54451,AAAAAAAAAAAAAAAAAA54141,AAAAAAAAAAAAAA28620,AAAAAAAAAAA21658,AAAAAAAAAAA74076,AAAAAAAAA27249} - 11 | {41,86,74,48,22,74,47,50} | {AAAAAAAA9523,AAAAAAAAAAAA37562,AAAAAAAAAAAAAAAA14047,AAAAAAAAAAA46154,AAAA41702,AAAAAAAAAAAAAAAAA764,AAAAA62737,39557} - 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} - 13 | {3,52,34,23} | {AAAAAA98232,AAAA49534,AAAAAAAAAAA21658} - 14 | {78,57,19} | {AAAA8857,AAAAAAAAAAAAAAA73034,AAAAAAAA81587,AAAAAAAAAAAAAAA68526,AAAAA75968,AAAAAAAAAAAAAA65909,AAAAAAAAA10012,AAAAAAAAAAAAAA65909} - 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} - 16 | {14,63,85,11} | {AAAAAA66777} - 17 | {7,10,81,85} | {AAAAAA43678,AAAAAAA12144,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAAAAA15356} - 18 | {1} | {AAAAAAAAAAA33576,AAAAA95309,64261,AAA59323,AAAAAAAAAAAAAA95246,55847,AAAAAAAAAAAA67946,AAAAAAAAAAAAAAAAAA64374} - 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} - 20 | {72,89,70,51,54,37,8,49,79} | {AAAAAA58494} - 21 | {2,8,65,10,5,79,43} | {AAAAAAAAAAAAAAAAA88852,AAAAAAAAAAAAAAAAAAA91804,AAAAA64669,AAAAAAAAAAAAAAAA1443,AAAAAAAAAAAAAAAA23657,AAAAA12179,AAAAAAAAAAAAAAAAA88852,AAAAAAAAAAAAAAAA31334,AAAAAAAAAAAAAAAA41303,AAAAAAAAAAAAAAAAAAA85420} - 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} - 23 | {40,90,5,38,72,40,30,10,43,55} | {A6053,AAAAAAAAAAA6119,AA44673,AAAAAAAAAAAAAAAAA764,AA17009,AAAAA17383,AAAAA70514,AAAAA33250,AAAAA95309,AAAAAAAAAAAA37562} - 24 | {94,61,99,35,48} | {AAAAAAAAAAA50956,AAAAAAAAAAA15165,AAAA85070,AAAAAAAAAAAAAAA36627,AAAAA961,AAAAAAAAAA55219} - 25 | {31,1,10,11,27,79,38} | {AAAAAAAAAAAAAAAAAA59334,45449} - 26 | {71,10,9,69,75} | {47735,AAAAAAA21462,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAAAAA91804,AAAAAAAAA72121,AAAAAAAAAAAAAAAAAAA1205,AAAAA41597,AAAA8857,AAAAAAAAAAAAAAAAAAA15356,AA17009} - 27 | {94} | {AA6416,A6053,AAAAAAA21462,AAAAAAA57334,AAAAAAAAAAAAAAAAAA12591,AA88409,AAAAAAAAAAAAA70254} - 28 | {14,33,6,34,14} | {AAAAAAAAAAAAAAA13198,AAAAAAAA69452,AAAAAAAAAAA82945,AAAAAAA12144,AAAAAAAAA72121,AAAAAAAAAA18601} - 29 | {39,21} | {AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAAAAA38885,AAAA85070,AAAAAAAAAAAAAAAAAAA70104,AAAAA66674,AAAAAAAAAAAAA62007,AAAAAAAA69452,AAAAAAA1242,AAAAAAAAAAAAAAAA1729,AAAA35194} - 30 | {26,81,47,91,34} | {AAAAAAAAAAAAAAAAAAA70104,AAAAAAA80240} - 31 | {80,24,18,21,54} | {AAAAAAAAAAAAAAA13198,AAAAAAAAAAAAAAAAAAA70415,A27153,AAAAAAAAA53663,AAAAAAAAAAAAAAAAA50407,A68938} - 32 | {58,79,82,80,67,75,98,10,41} | {AAAAAAAAAAAAAAAAAA61286,AAA54451,AAAAAAAAAAAAAAAAAAA87527,A96617,51533} - 33 | {74,73} | {A85417,AAAAAAA56483,AAAAA17383,AAAAAAAAAAAAA62159,AAAAAAAAAAAA52814,AAAAAAAAAAAAA85723,AAAAAAAAAAAAAAAAAA55796} - 34 | {70,45} | {AAAAAAAAAAAAAAAAAA71621,AAAAAAAAAAAAAA28620,AAAAAAAAAA55219,AAAAAAAA23648,AAAAAAAAAA22292,AAAAAAA1242} - 35 | {23,40} | {AAAAAAAAAAAA52814,AAAA48949,AAAAAAAAA34727,AAAA8857,AAAAAAAAAAAAAAAAAAA62179,AAAAAAAAAAAAAAA68526,AAAAAAA99836,AAAAAAAA50094,AAAA91194,AAAAAAAAAAAAA73084} - 36 | {79,82,14,52,30,5,79} | {AAAAAAAAA53663,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA89194,AA88409,AAAAAAAAAAAAAAA81326,AAAAAAAAAAAAAAAAA63050,AAAAAAAAAAAAAAAA33598} - 37 | {53,11,81,39,3,78,58,64,74} | {AAAAAAAAAAAAAAAAAAA17075,AAAAAAA66161,AAAAAAAA23648,AAAAAAAAAAAAAA10611} - 38 | {59,5,4,95,28} | {AAAAAAAAAAA82945,A96617,47735,AAAAA12179,AAAAA64669,AAAAAA99807,AA74433,AAAAAAAAAAAAAAAAA59387} - 39 | {82,43,99,16,74} | {AAAAAAAAAAAAAAA67062,AAAAAAA57334,AAAAAAAAAAAAAA65909,A27153,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAA64777,AAAAAAAAAAAA81511,AAAAAAAAAAAAAA65909,AAAAAAAAAAAAAA28620} - 40 | {34} | {AAAAAAAAAAAAAA10611,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAA31334,AAAAA70466,AAAAAAAA81587,AAAAAAA74623} - 41 | {19,26,63,12,93,73,27,94} | {AAAAAAA79710,AAAAAAAAAA55219,AAAA41702,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA71621,AAAAAAAAAAAAAAAAA63050,AAAAAAA99836,AAAAAAAAAAAAAA8666} - 42 | {15,76,82,75,8,91} | {AAAAAAAAAAA176,AAAAAA38063,45449,AAAAAA54032,AAAAAAA81898,AA6416,AAAAAAAAAAAAAAAAAAA62179,45449,AAAAA60038,AAAAAAAA81587} - 43 | {39,87,91,97,79,28} | {AAAAAAAAAAA74076,A96617,AAAAAAAAAAAAAAAAAAA89194,AAAAAAAAAAAAAAAAAA55796,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAA67946} - 44 | {40,58,68,29,54} | {AAAAAAA81898,AAAAAA66777,AAAAAA98232} - 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} - 46 | {53,24} | {AAAAAAAAAAA53908,AAAAAA54032,AAAAA17383,AAAA48949,AAAAAAAAAA18601,AAAAA64669,45449,AAAAAAAAAAA98051,AAAAAAAAAAAAAAAAAA71621} - 47 | {98,23,64,12,75,61} | {AAA59323,AAAAA95309,AAAAAAAAAAAAAAAA31334,AAAAAAAAA27249,AAAAA17383,AAAAAAAAAAAA37562,AAAAAA1059,A84822,55847,AAAAA70466} - 48 | {76,14} | {AAAAAAAAAAAAA59671,AAAAAAAAAAAAAAAAAAA91804,AAAAAA66777,AAAAAAAAAAAAAAAAAAA89194,AAAAAAAAAAAAAAA36627,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAA73084,AAAAAAA79710,AAAAAAAAAAAAAAA40402,AAAAAAAAAAAAAAAAAAA65037} - 49 | {56,5,54,37,49} | {AA21643,AAAAAAAAAAA92631,AAAAAAAA81587} - 50 | {20,12,37,64,93} | {AAAAAAAAAA5483,AAAAAAAAAAAAAAAAAAA1205,AA6416,AAAAAAAAAAAAAAAAA63050,AAAAAAAAAAAAAAAAAA47955} - 51 | {47} | {AAAAAAAAAAAAAA96505,AAAAAAAAAAAAAAAAAA36842,AAAAA95309,AAAAAAAA81587,AA6416,AAAA91194,AAAAAA58494,AAAAAA1059,AAAAAAAA69452} - 52 | {89,0} | {AAAAAAAAAAAAAAAAAA47955,AAAAAAA48038,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAAAAA73084,AAAAA70466,AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA46154,AA66862} - 53 | {38,17} | {AAAAAAAAAAA21658} - 54 | {70,47} | {AAAAAAAAAAAAAAAAAA54141,AAAAA40681,AAAAAAA48038,AAAAAAAAAAAAAAAA29150,AAAAA41597,AAAAAAAAAAAAAAAAAA59334,AA15322} - 55 | {47,79,47,64,72,25,71,24,93} | {AAAAAAAAAAAAAAAAAA55796,AAAAA62737} - 56 | {33,7,60,54,93,90,77,85,39} | {AAAAAAAAAAAAAAAAAA32918,AA42406} - 57 | {23,45,10,42,36,21,9,96} | {AAAAAAAAAAAAAAAAAAA70415} - 58 | {92} | {AAAAAAAAAAAAAAAA98414,AAAAAAAA23648,AAAAAAAAAAAAAAAAAA55796,AA25381,AAAAAAAAAAA6119} - 59 | {9,69,46,77} | {39557,AAAAAAA89932,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAAAAAAAAA26540,AAA20874,AA6416,AAAAAAAAAAAAAAAAAA47955} - 60 | {62,2,59,38,89} | {AAAAAAA89932,AAAAAAAAAAAAAAAAAAA15356,AA99927,AA17009,AAAAAAAAAAAAAAA35875} - 61 | {72,2,44,95,54,54,13} | {AAAAAAAAAAAAAAAAAAA91804} - 62 | {83,72,29,73} | {AAAAAAAAAAAAA15097,AAAA8857,AAAAAAAAAAAA35809,AAAAAAAAAAAA52814,AAAAAAAAAAAAAAAAAAA38885,AAAAAAAAAAAAAAAAAA24183,AAAAAA43678,A96617} - 63 | {11,4,61,87} | {AAAAAAAAA27249,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAA13198,AAA20874,39557,51533,AAAAAAAAAAA53908,AAAAAAAAAAAAAA96505,AAAAAAAA78938} - 64 | {26,19,34,24,81,78} | {A96617,AAAAAAAAAAAAAAAAAAA70104,A68938,AAAAAAAAAAA53908,AAAAAAAAAAAAAAA453,AA17009,AAAAAAA80240} - 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} - 66 | {31,23,70,52,4,33,48,25} | {AAAAAAAAAAAAAAAAA69675,AAAAAAAA50094,AAAAAAAAAAA92631,AAAA35194,39557,AAAAAAA99836} - 67 | {31,94,7,10} | {AAAAAA38063,A96617,AAAA35194,AAAAAAAAAAAA67946} - 68 | {90,43,38} | {AA75092,AAAAAAAAAAAAAAAAA69675,AAAAAAAAAAA92631,AAAAAAAAA10012,AAAAAAAAAAAAA7929,AA21643} - 69 | {67,35,99,85,72,86,44} | {AAAAAAAAAAAAAAAAAAA1205,AAAAAAAA50094,AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAAAAAAA47955} - 70 | {56,70,83} | {AAAA41702,AAAAAAAAAAA82945,AA21643,AAAAAAAAAAA99000,A27153,AA25381,AAAAAAAAAAAAAA96505,AAAAAAA1242} - 71 | {74,26} | {AAAAAAAAAAA50956,AA74433,AAAAAAA21462,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAA36627,AAAAAAAAAAAAA70254,AAAAAAAAAA43419,39557} - 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} - 73 | {88,25,96,78,65,15,29,19} | {AAA54451,AAAAAAAAA27249,AAAAAAA9228,AAAAAAAAAAAAAAA67062,AAAAAAAAAAAAAAAAAAA70415,AAAAA17383,AAAAAAAAAAAAAAAA33598} - 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} - 75 | {12,96,83,24,71,89,55} | {AAAA48949,AAAAAAAA29716,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAAA67946,AAAAAAAAAAAAAAAA29150,AAA28075,AAAAAAAAAAAAAAAAA43052} - 76 | {92,55,10,7} | {AAAAAAAAAAAAAAA67062} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 78 | {55,89,44,84,34} | {AAAAAAAAAAA6119,AAAAAAAAAAAAAA8666,AA99927,AA42406,AAAAAAA81898,AAAAAAA9228,AAAAAAAAAAA92631,AA21643,AAAAAAAAAAAAAA28620} - 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} - 80 | {74,89,44,80,0} | {AAAA35194,AAAAAAAA79710,AAA20874,AAAAAAAAAAAAAAAAAAA70104,AAAAAAAAAAAAA73084,AAAAAAA57334,AAAAAAA9228,AAAAAAAAAAAAA62007} - 81 | {63,77,54,48,61,53,97} | {AAAAAAAAAAAAAAA81326,AAAAAAAAAA22292,AA25381,AAAAAAAAAAA74076,AAAAAAA81898,AAAAAAAAA72121} - 82 | {34,60,4,79,78,16,86,89,42,50} | {AAAAA40681,AAAAAAAAAAAAAAAAAA12591,AAAAAAA80240,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA70104} - 83 | {14,10} | {AAAAAAAAAA22292,AAAAAAAAAAAAA70254,AAAAAAAAAAA6119} - 84 | {11,83,35,13,96,94} | {AAAAA95309,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAAAAA24183} - 85 | {39,60} | {AAAAAAAAAAAAAAAA55798,AAAAAAAAAA22292,AAAAAAA66161,AAAAAAA21462,AAAAAAAAAAAAAAAAAA12591,55847,AAAAAA98232,AAAAAAAAAAA46154} - 86 | {33,81,72,74,45,36,82} | {AAAAAAAA81587,AAAAAAAAAAAAAA96505,45449,AAAA80176} - 87 | {57,27,50,12,97,68} | {AAAAAAAAAAAAAAAAA26540,AAAAAAAAA10012,AAAAAAAAAAAA35809,AAAAAAAAAAAAAAAA29150,AAAAAAAAAAA82945,AAAAAA66777,31228,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAA96505} - 88 | {41,90,77,24,6,24} | {AAAA35194,AAAA35194,AAAAAAA80240,AAAAAAAAAAA46154,AAAAAA58494,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA59334,AAAAAAAAAAAAAAAAAAA91804,AA74433} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} - 90 | {88,75} | {AAAAA60038,AAAAAAAA23648,AAAAAAAAAAA99000,AAAA41702,AAAAAAAAAAAAA22860,AAAAAAAAAAAAAAA68526} - 91 | {78} | {AAAAAAAAAAAAA62007,AAA99043} - 92 | {85,63,49,45} | {AAAAAAA89932,AAAAAAAAAAAAA22860,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAAA21089} - 93 | {11} | {AAAAAAAAAAA176,AAAAAAAAAAAAAA8666,AAAAAAAAAAAAAAA453,AAAAAAAAAAAAA85723,A68938,AAAAAAAAAAAAA9821,AAAAAAA48038,AAAAAAAAAAAAAAAAA59387,AA99927,AAAAA17383} - 94 | {98,9,85,62,88,91,60,61,38,86} | {AAAAAAAA81587,AAAAA17383,AAAAAAAA81587} - 95 | {47,77} | {AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA74076,AAAAAAAAAA18107,AAAAA40681,AAAAAAAAAAAAAAA35875,AAAAA60038,AAAAAAA56483} - 96 | {23,97,43} | {AAAAAAAAAA646,A87088} - 97 | {54,2,86,65} | {47735,AAAAAAA99836,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAA29150,AAAAAAA80240,AAAAAAAAAAAAAAAA98414,AAAAAAA56483,AAAAAAAAAAAAAAAA29150,AAAAAAA39692,AA21643} - 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} - 99 | {37,86} | {AAAAAAAAAAAAAAAAAA32918,AAAAA70514,AAAAAAAAA10012,AAAAAAAAAAAAAAAAA59387,AAAAAAAAAA64777,AAAAAAAAAAAAAAAAAAA15356} - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} - 101 | {} | {} - 102 | {NULL} | {NULL} -(102 rows) - -SELECT * FROM array_index_op_test WHERE i && '{}' ORDER BY seqno; - seqno | i | t --------+---+--- -(0 rows) - -SELECT * FROM array_index_op_test WHERE i <@ '{}' ORDER BY seqno; - seqno | i | t --------+----+---- - 101 | {} | {} -(1 row) - -CREATE INDEX textarrayidx ON array_index_op_test USING gin (t); -explain (costs off) -SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno; - QUERY PLAN ------------------------------------------------------------- - Sort - Sort Key: seqno - -> Bitmap Heap Scan on array_index_op_test - Recheck Cond: (t @> '{AAAAAAAA72908}'::text[]) - -> Bitmap Index Scan on textarrayidx - Index Cond: (t @> '{AAAAAAAA72908}'::text[]) -(6 rows) - -SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno; - seqno | i | t --------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------- - 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} - 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} - 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} - 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} -(4 rows) - -SELECT * FROM array_index_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno; - seqno | i | t --------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------- - 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} - 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} - 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} - 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} -(4 rows) - -SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno; - seqno | i | t --------+------------------+-------------------------------------------------------------------- - 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} - 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} - 96 | {23,97,43} | {AAAAAAAAAA646,A87088} -(3 rows) - -SELECT * FROM array_index_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno; - seqno | i | t --------+------------------+-------------------------------------------------------------------- - 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} - 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} - 96 | {23,97,43} | {AAAAAAAAAA646,A87088} -(3 rows) - -SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno; - seqno | i | t --------+------+-------------------------------------------------------------------- - 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} -(1 row) - -SELECT * FROM array_index_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno; - seqno | i | t --------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------- - 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} - 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} - 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} - 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} - 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} - 96 | {23,97,43} | {AAAAAAAAAA646,A87088} -(6 rows) - -SELECT * FROM array_index_op_test WHERE t <@ '{AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}' ORDER BY seqno; - seqno | i | t --------+--------------------+----------------------------------------------------------------------------------------------------------- - 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} - 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} - 101 | {} | {} -(3 rows) - -SELECT * FROM array_index_op_test WHERE t = '{AAAAAAAAAA646,A87088}' ORDER BY seqno; - seqno | i | t --------+------------+------------------------ - 96 | {23,97,43} | {AAAAAAAAAA646,A87088} -(1 row) - -SELECT * FROM array_index_op_test WHERE t = '{}' ORDER BY seqno; - seqno | i | t --------+----+---- - 101 | {} | {} -(1 row) - -SELECT * FROM array_index_op_test WHERE t @> '{}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - 1 | {92,75,71,52,64,83} | {AAAAAAAA44066,AAAAAA1059,AAAAAAAAAAA176,AAAAAAA48038} - 2 | {3,6} | {AAAAAA98232,AAAAAAAA79710,AAAAAAAAAAAAAAAAA69675,AAAAAAAAAAAAAAAA55798,AAAAAAAAA12793} - 3 | {37,64,95,43,3,41,13,30,11,43} | {AAAAAAAAAA48845,AAAAA75968,AAAAA95309,AAA54451,AAAAAAAAAA22292,AAAAAAA99836,A96617,AA17009,AAAAAAAAAAAAAA95246} - 4 | {71,39,99,55,33,75,45} | {AAAAAAAAA53663,AAAAAAAAAAAAAAA67062,AAAAAAAAAA64777,AAA99043,AAAAAAAAAAAAAAAAAAA91804,39557} - 5 | {50,42,77,50,4} | {AAAAAAAAAAAAAAAAA26540,AAAAAAA79710,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA176,AAAAA95309,AAAAAAAAAAA46154,AAAAAA66777,AAAAAAAAA27249,AAAAAAAAAA64777,AAAAAAAAAAAAAAAAAAA70104} - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 7 | {12,51,88,64,8} | {AAAAAAAAAAAAAAAAAA12591,AAAAAAAAAAAAAAAAA50407,AAAAAAAAAAAA67946} - 8 | {60,84} | {AAAAAAA81898,AAAAAA1059,AAAAAAAAAAAA81511,AAAAA961,AAAAAAAAAAAAAAAA31334,AAAAA64741,AA6416,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAAAA50407} - 9 | {56,52,35,27,80,44,81,22} | {AAAAAAAAAAAAAAA73034,AAAAAAAAAAAAA7929,AAAAAAA66161,AA88409,39557,A27153,AAAAAAAA9523,AAAAAAAAAAA99000} - 10 | {71,5,45} | {AAAAAAAAAAA21658,AAAAAAAAAAAA21089,AAA54451,AAAAAAAAAAAAAAAAAA54141,AAAAAAAAAAAAAA28620,AAAAAAAAAAA21658,AAAAAAAAAAA74076,AAAAAAAAA27249} - 11 | {41,86,74,48,22,74,47,50} | {AAAAAAAA9523,AAAAAAAAAAAA37562,AAAAAAAAAAAAAAAA14047,AAAAAAAAAAA46154,AAAA41702,AAAAAAAAAAAAAAAAA764,AAAAA62737,39557} - 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} - 13 | {3,52,34,23} | {AAAAAA98232,AAAA49534,AAAAAAAAAAA21658} - 14 | {78,57,19} | {AAAA8857,AAAAAAAAAAAAAAA73034,AAAAAAAA81587,AAAAAAAAAAAAAAA68526,AAAAA75968,AAAAAAAAAAAAAA65909,AAAAAAAAA10012,AAAAAAAAAAAAAA65909} - 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} - 16 | {14,63,85,11} | {AAAAAA66777} - 17 | {7,10,81,85} | {AAAAAA43678,AAAAAAA12144,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAAAAA15356} - 18 | {1} | {AAAAAAAAAAA33576,AAAAA95309,64261,AAA59323,AAAAAAAAAAAAAA95246,55847,AAAAAAAAAAAA67946,AAAAAAAAAAAAAAAAAA64374} - 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} - 20 | {72,89,70,51,54,37,8,49,79} | {AAAAAA58494} - 21 | {2,8,65,10,5,79,43} | {AAAAAAAAAAAAAAAAA88852,AAAAAAAAAAAAAAAAAAA91804,AAAAA64669,AAAAAAAAAAAAAAAA1443,AAAAAAAAAAAAAAAA23657,AAAAA12179,AAAAAAAAAAAAAAAAA88852,AAAAAAAAAAAAAAAA31334,AAAAAAAAAAAAAAAA41303,AAAAAAAAAAAAAAAAAAA85420} - 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} - 23 | {40,90,5,38,72,40,30,10,43,55} | {A6053,AAAAAAAAAAA6119,AA44673,AAAAAAAAAAAAAAAAA764,AA17009,AAAAA17383,AAAAA70514,AAAAA33250,AAAAA95309,AAAAAAAAAAAA37562} - 24 | {94,61,99,35,48} | {AAAAAAAAAAA50956,AAAAAAAAAAA15165,AAAA85070,AAAAAAAAAAAAAAA36627,AAAAA961,AAAAAAAAAA55219} - 25 | {31,1,10,11,27,79,38} | {AAAAAAAAAAAAAAAAAA59334,45449} - 26 | {71,10,9,69,75} | {47735,AAAAAAA21462,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAAAAA91804,AAAAAAAAA72121,AAAAAAAAAAAAAAAAAAA1205,AAAAA41597,AAAA8857,AAAAAAAAAAAAAAAAAAA15356,AA17009} - 27 | {94} | {AA6416,A6053,AAAAAAA21462,AAAAAAA57334,AAAAAAAAAAAAAAAAAA12591,AA88409,AAAAAAAAAAAAA70254} - 28 | {14,33,6,34,14} | {AAAAAAAAAAAAAAA13198,AAAAAAAA69452,AAAAAAAAAAA82945,AAAAAAA12144,AAAAAAAAA72121,AAAAAAAAAA18601} - 29 | {39,21} | {AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAAAAA38885,AAAA85070,AAAAAAAAAAAAAAAAAAA70104,AAAAA66674,AAAAAAAAAAAAA62007,AAAAAAAA69452,AAAAAAA1242,AAAAAAAAAAAAAAAA1729,AAAA35194} - 30 | {26,81,47,91,34} | {AAAAAAAAAAAAAAAAAAA70104,AAAAAAA80240} - 31 | {80,24,18,21,54} | {AAAAAAAAAAAAAAA13198,AAAAAAAAAAAAAAAAAAA70415,A27153,AAAAAAAAA53663,AAAAAAAAAAAAAAAAA50407,A68938} - 32 | {58,79,82,80,67,75,98,10,41} | {AAAAAAAAAAAAAAAAAA61286,AAA54451,AAAAAAAAAAAAAAAAAAA87527,A96617,51533} - 33 | {74,73} | {A85417,AAAAAAA56483,AAAAA17383,AAAAAAAAAAAAA62159,AAAAAAAAAAAA52814,AAAAAAAAAAAAA85723,AAAAAAAAAAAAAAAAAA55796} - 34 | {70,45} | {AAAAAAAAAAAAAAAAAA71621,AAAAAAAAAAAAAA28620,AAAAAAAAAA55219,AAAAAAAA23648,AAAAAAAAAA22292,AAAAAAA1242} - 35 | {23,40} | {AAAAAAAAAAAA52814,AAAA48949,AAAAAAAAA34727,AAAA8857,AAAAAAAAAAAAAAAAAAA62179,AAAAAAAAAAAAAAA68526,AAAAAAA99836,AAAAAAAA50094,AAAA91194,AAAAAAAAAAAAA73084} - 36 | {79,82,14,52,30,5,79} | {AAAAAAAAA53663,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA89194,AA88409,AAAAAAAAAAAAAAA81326,AAAAAAAAAAAAAAAAA63050,AAAAAAAAAAAAAAAA33598} - 37 | {53,11,81,39,3,78,58,64,74} | {AAAAAAAAAAAAAAAAAAA17075,AAAAAAA66161,AAAAAAAA23648,AAAAAAAAAAAAAA10611} - 38 | {59,5,4,95,28} | {AAAAAAAAAAA82945,A96617,47735,AAAAA12179,AAAAA64669,AAAAAA99807,AA74433,AAAAAAAAAAAAAAAAA59387} - 39 | {82,43,99,16,74} | {AAAAAAAAAAAAAAA67062,AAAAAAA57334,AAAAAAAAAAAAAA65909,A27153,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAA64777,AAAAAAAAAAAA81511,AAAAAAAAAAAAAA65909,AAAAAAAAAAAAAA28620} - 40 | {34} | {AAAAAAAAAAAAAA10611,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAA31334,AAAAA70466,AAAAAAAA81587,AAAAAAA74623} - 41 | {19,26,63,12,93,73,27,94} | {AAAAAAA79710,AAAAAAAAAA55219,AAAA41702,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA71621,AAAAAAAAAAAAAAAAA63050,AAAAAAA99836,AAAAAAAAAAAAAA8666} - 42 | {15,76,82,75,8,91} | {AAAAAAAAAAA176,AAAAAA38063,45449,AAAAAA54032,AAAAAAA81898,AA6416,AAAAAAAAAAAAAAAAAAA62179,45449,AAAAA60038,AAAAAAAA81587} - 43 | {39,87,91,97,79,28} | {AAAAAAAAAAA74076,A96617,AAAAAAAAAAAAAAAAAAA89194,AAAAAAAAAAAAAAAAAA55796,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAA67946} - 44 | {40,58,68,29,54} | {AAAAAAA81898,AAAAAA66777,AAAAAA98232} - 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} - 46 | {53,24} | {AAAAAAAAAAA53908,AAAAAA54032,AAAAA17383,AAAA48949,AAAAAAAAAA18601,AAAAA64669,45449,AAAAAAAAAAA98051,AAAAAAAAAAAAAAAAAA71621} - 47 | {98,23,64,12,75,61} | {AAA59323,AAAAA95309,AAAAAAAAAAAAAAAA31334,AAAAAAAAA27249,AAAAA17383,AAAAAAAAAAAA37562,AAAAAA1059,A84822,55847,AAAAA70466} - 48 | {76,14} | {AAAAAAAAAAAAA59671,AAAAAAAAAAAAAAAAAAA91804,AAAAAA66777,AAAAAAAAAAAAAAAAAAA89194,AAAAAAAAAAAAAAA36627,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAA73084,AAAAAAA79710,AAAAAAAAAAAAAAA40402,AAAAAAAAAAAAAAAAAAA65037} - 49 | {56,5,54,37,49} | {AA21643,AAAAAAAAAAA92631,AAAAAAAA81587} - 50 | {20,12,37,64,93} | {AAAAAAAAAA5483,AAAAAAAAAAAAAAAAAAA1205,AA6416,AAAAAAAAAAAAAAAAA63050,AAAAAAAAAAAAAAAAAA47955} - 51 | {47} | {AAAAAAAAAAAAAA96505,AAAAAAAAAAAAAAAAAA36842,AAAAA95309,AAAAAAAA81587,AA6416,AAAA91194,AAAAAA58494,AAAAAA1059,AAAAAAAA69452} - 52 | {89,0} | {AAAAAAAAAAAAAAAAAA47955,AAAAAAA48038,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAAAAA73084,AAAAA70466,AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA46154,AA66862} - 53 | {38,17} | {AAAAAAAAAAA21658} - 54 | {70,47} | {AAAAAAAAAAAAAAAAAA54141,AAAAA40681,AAAAAAA48038,AAAAAAAAAAAAAAAA29150,AAAAA41597,AAAAAAAAAAAAAAAAAA59334,AA15322} - 55 | {47,79,47,64,72,25,71,24,93} | {AAAAAAAAAAAAAAAAAA55796,AAAAA62737} - 56 | {33,7,60,54,93,90,77,85,39} | {AAAAAAAAAAAAAAAAAA32918,AA42406} - 57 | {23,45,10,42,36,21,9,96} | {AAAAAAAAAAAAAAAAAAA70415} - 58 | {92} | {AAAAAAAAAAAAAAAA98414,AAAAAAAA23648,AAAAAAAAAAAAAAAAAA55796,AA25381,AAAAAAAAAAA6119} - 59 | {9,69,46,77} | {39557,AAAAAAA89932,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAAAAAAAAA26540,AAA20874,AA6416,AAAAAAAAAAAAAAAAAA47955} - 60 | {62,2,59,38,89} | {AAAAAAA89932,AAAAAAAAAAAAAAAAAAA15356,AA99927,AA17009,AAAAAAAAAAAAAAA35875} - 61 | {72,2,44,95,54,54,13} | {AAAAAAAAAAAAAAAAAAA91804} - 62 | {83,72,29,73} | {AAAAAAAAAAAAA15097,AAAA8857,AAAAAAAAAAAA35809,AAAAAAAAAAAA52814,AAAAAAAAAAAAAAAAAAA38885,AAAAAAAAAAAAAAAAAA24183,AAAAAA43678,A96617} - 63 | {11,4,61,87} | {AAAAAAAAA27249,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAA13198,AAA20874,39557,51533,AAAAAAAAAAA53908,AAAAAAAAAAAAAA96505,AAAAAAAA78938} - 64 | {26,19,34,24,81,78} | {A96617,AAAAAAAAAAAAAAAAAAA70104,A68938,AAAAAAAAAAA53908,AAAAAAAAAAAAAAA453,AA17009,AAAAAAA80240} - 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} - 66 | {31,23,70,52,4,33,48,25} | {AAAAAAAAAAAAAAAAA69675,AAAAAAAA50094,AAAAAAAAAAA92631,AAAA35194,39557,AAAAAAA99836} - 67 | {31,94,7,10} | {AAAAAA38063,A96617,AAAA35194,AAAAAAAAAAAA67946} - 68 | {90,43,38} | {AA75092,AAAAAAAAAAAAAAAAA69675,AAAAAAAAAAA92631,AAAAAAAAA10012,AAAAAAAAAAAAA7929,AA21643} - 69 | {67,35,99,85,72,86,44} | {AAAAAAAAAAAAAAAAAAA1205,AAAAAAAA50094,AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAAAAAAA47955} - 70 | {56,70,83} | {AAAA41702,AAAAAAAAAAA82945,AA21643,AAAAAAAAAAA99000,A27153,AA25381,AAAAAAAAAAAAAA96505,AAAAAAA1242} - 71 | {74,26} | {AAAAAAAAAAA50956,AA74433,AAAAAAA21462,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAA36627,AAAAAAAAAAAAA70254,AAAAAAAAAA43419,39557} - 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} - 73 | {88,25,96,78,65,15,29,19} | {AAA54451,AAAAAAAAA27249,AAAAAAA9228,AAAAAAAAAAAAAAA67062,AAAAAAAAAAAAAAAAAAA70415,AAAAA17383,AAAAAAAAAAAAAAAA33598} - 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} - 75 | {12,96,83,24,71,89,55} | {AAAA48949,AAAAAAAA29716,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAAA67946,AAAAAAAAAAAAAAAA29150,AAA28075,AAAAAAAAAAAAAAAAA43052} - 76 | {92,55,10,7} | {AAAAAAAAAAAAAAA67062} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 78 | {55,89,44,84,34} | {AAAAAAAAAAA6119,AAAAAAAAAAAAAA8666,AA99927,AA42406,AAAAAAA81898,AAAAAAA9228,AAAAAAAAAAA92631,AA21643,AAAAAAAAAAAAAA28620} - 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} - 80 | {74,89,44,80,0} | {AAAA35194,AAAAAAAA79710,AAA20874,AAAAAAAAAAAAAAAAAAA70104,AAAAAAAAAAAAA73084,AAAAAAA57334,AAAAAAA9228,AAAAAAAAAAAAA62007} - 81 | {63,77,54,48,61,53,97} | {AAAAAAAAAAAAAAA81326,AAAAAAAAAA22292,AA25381,AAAAAAAAAAA74076,AAAAAAA81898,AAAAAAAAA72121} - 82 | {34,60,4,79,78,16,86,89,42,50} | {AAAAA40681,AAAAAAAAAAAAAAAAAA12591,AAAAAAA80240,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA70104} - 83 | {14,10} | {AAAAAAAAAA22292,AAAAAAAAAAAAA70254,AAAAAAAAAAA6119} - 84 | {11,83,35,13,96,94} | {AAAAA95309,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAAAAA24183} - 85 | {39,60} | {AAAAAAAAAAAAAAAA55798,AAAAAAAAAA22292,AAAAAAA66161,AAAAAAA21462,AAAAAAAAAAAAAAAAAA12591,55847,AAAAAA98232,AAAAAAAAAAA46154} - 86 | {33,81,72,74,45,36,82} | {AAAAAAAA81587,AAAAAAAAAAAAAA96505,45449,AAAA80176} - 87 | {57,27,50,12,97,68} | {AAAAAAAAAAAAAAAAA26540,AAAAAAAAA10012,AAAAAAAAAAAA35809,AAAAAAAAAAAAAAAA29150,AAAAAAAAAAA82945,AAAAAA66777,31228,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAA96505} - 88 | {41,90,77,24,6,24} | {AAAA35194,AAAA35194,AAAAAAA80240,AAAAAAAAAAA46154,AAAAAA58494,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA59334,AAAAAAAAAAAAAAAAAAA91804,AA74433} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} - 90 | {88,75} | {AAAAA60038,AAAAAAAA23648,AAAAAAAAAAA99000,AAAA41702,AAAAAAAAAAAAA22860,AAAAAAAAAAAAAAA68526} - 91 | {78} | {AAAAAAAAAAAAA62007,AAA99043} - 92 | {85,63,49,45} | {AAAAAAA89932,AAAAAAAAAAAAA22860,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAAA21089} - 93 | {11} | {AAAAAAAAAAA176,AAAAAAAAAAAAAA8666,AAAAAAAAAAAAAAA453,AAAAAAAAAAAAA85723,A68938,AAAAAAAAAAAAA9821,AAAAAAA48038,AAAAAAAAAAAAAAAAA59387,AA99927,AAAAA17383} - 94 | {98,9,85,62,88,91,60,61,38,86} | {AAAAAAAA81587,AAAAA17383,AAAAAAAA81587} - 95 | {47,77} | {AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA74076,AAAAAAAAAA18107,AAAAA40681,AAAAAAAAAAAAAAA35875,AAAAA60038,AAAAAAA56483} - 96 | {23,97,43} | {AAAAAAAAAA646,A87088} - 97 | {54,2,86,65} | {47735,AAAAAAA99836,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAA29150,AAAAAAA80240,AAAAAAAAAAAAAAAA98414,AAAAAAA56483,AAAAAAAAAAAAAAAA29150,AAAAAAA39692,AA21643} - 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} - 99 | {37,86} | {AAAAAAAAAAAAAAAAAA32918,AAAAA70514,AAAAAAAAA10012,AAAAAAAAAAAAAAAAA59387,AAAAAAAAAA64777,AAAAAAAAAAAAAAAAAAA15356} - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} - 101 | {} | {} - 102 | {NULL} | {NULL} -(102 rows) - -SELECT * FROM array_index_op_test WHERE t && '{}' ORDER BY seqno; - seqno | i | t --------+---+--- -(0 rows) - -SELECT * FROM array_index_op_test WHERE t <@ '{}' ORDER BY seqno; - seqno | i | t --------+----+---- - 101 | {} | {} -(1 row) - --- And try it with a multicolumn GIN index -DROP INDEX intarrayidx, textarrayidx; -CREATE INDEX botharrayidx ON array_index_op_test USING gin (i, t); -SELECT * FROM array_index_op_test WHERE i @> '{32}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} - 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} -(6 rows) - -SELECT * FROM array_index_op_test WHERE i && '{32}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} - 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} -(6 rows) - -SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAA80240}' ORDER BY seqno; - seqno | i | t --------+--------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------- - 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} - 30 | {26,81,47,91,34} | {AAAAAAAAAAAAAAAAAAA70104,AAAAAAA80240} - 64 | {26,19,34,24,81,78} | {A96617,AAAAAAAAAAAAAAAAAAA70104,A68938,AAAAAAAAAAA53908,AAAAAAAAAAAAAAA453,AA17009,AAAAAAA80240} - 82 | {34,60,4,79,78,16,86,89,42,50} | {AAAAA40681,AAAAAAAAAAAAAAAAAA12591,AAAAAAA80240,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA70104} - 88 | {41,90,77,24,6,24} | {AAAA35194,AAAA35194,AAAAAAA80240,AAAAAAAAAAA46154,AAAAAA58494,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA59334,AAAAAAAAAAAAAAAAAAA91804,AA74433} - 97 | {54,2,86,65} | {47735,AAAAAAA99836,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAA29150,AAAAAAA80240,AAAAAAAAAAAAAAAA98414,AAAAAAA56483,AAAAAAAAAAAAAAAA29150,AAAAAAA39692,AA21643} - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} -(7 rows) - -SELECT * FROM array_index_op_test WHERE t && '{AAAAAAA80240}' ORDER BY seqno; - seqno | i | t --------+--------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------- - 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} - 30 | {26,81,47,91,34} | {AAAAAAAAAAAAAAAAAAA70104,AAAAAAA80240} - 64 | {26,19,34,24,81,78} | {A96617,AAAAAAAAAAAAAAAAAAA70104,A68938,AAAAAAAAAAA53908,AAAAAAAAAAAAAAA453,AA17009,AAAAAAA80240} - 82 | {34,60,4,79,78,16,86,89,42,50} | {AAAAA40681,AAAAAAAAAAAAAAAAAA12591,AAAAAAA80240,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA70104} - 88 | {41,90,77,24,6,24} | {AAAA35194,AAAA35194,AAAAAAA80240,AAAAAAAAAAA46154,AAAAAA58494,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA59334,AAAAAAAAAAAAAAAAAAA91804,AA74433} - 97 | {54,2,86,65} | {47735,AAAAAAA99836,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAA29150,AAAAAAA80240,AAAAAAAAAAAAAAAA98414,AAAAAAA56483,AAAAAAAAAAAAAAAA29150,AAAAAAA39692,AA21643} - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} -(7 rows) - -SELECT * FROM array_index_op_test WHERE i @> '{32}' AND t && '{AAAAAAA80240}' ORDER BY seqno; - seqno | i | t --------+-----------------------------+------------------------------------------------------------------------------ - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} -(1 row) - -SELECT * FROM array_index_op_test WHERE i && '{32}' AND t @> '{AAAAAAA80240}' ORDER BY seqno; - seqno | i | t --------+-----------------------------+------------------------------------------------------------------------------ - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} -(1 row) - -SELECT * FROM array_index_op_test WHERE t = '{}' ORDER BY seqno; - seqno | i | t --------+----+---- - 101 | {} | {} -(1 row) - -RESET enable_seqscan; -RESET enable_indexscan; -RESET enable_bitmapscan; --- --- Try a GIN index with a lot of items with same key. (GIN creates a posting --- tree when there are enough duplicates) --- -CREATE TABLE array_gin_test (a int[]); -INSERT INTO array_gin_test SELECT ARRAY[1, g%5, g] FROM generate_series(1, 10000) g; -CREATE INDEX array_gin_test_idx ON array_gin_test USING gin (a); -SELECT COUNT(*) FROM array_gin_test WHERE a @> '{2}'; - count -------- - 2000 -(1 row) - -DROP TABLE array_gin_test; --- --- Test GIN index's reloptions --- -CREATE INDEX gin_relopts_test ON array_index_op_test USING gin (i) - WITH (FASTUPDATE=on, GIN_PENDING_LIST_LIMIT=128); -\d+ gin_relopts_test - Index "public.gin_relopts_test" - Column | Type | Key? | Definition | Storage | Stats target ---------+---------+------+------------+---------+-------------- - i | integer | yes | i | plain | -gin, for table "public.array_index_op_test" -Options: fastupdate=on, gin_pending_list_limit=128 - --- --- HASH --- -CREATE UNLOGGED TABLE unlogged_hash_table (id int4); -CREATE INDEX unlogged_hash_index ON unlogged_hash_table USING hash (id int4_ops); -DROP TABLE unlogged_hash_table; --- CREATE INDEX hash_ovfl_index ON hash_ovfl_heap USING hash (x int4_ops); --- Test hash index build tuplesorting. Force hash tuplesort using low --- maintenance_work_mem setting and fillfactor: -SET maintenance_work_mem = '1MB'; -CREATE INDEX hash_tuplesort_idx ON tenk1 USING hash (stringu1 name_ops) WITH (fillfactor = 10); -EXPLAIN (COSTS OFF) -SELECT count(*) FROM tenk1 WHERE stringu1 = 'TVAAAA'; - QUERY PLAN -------------------------------------------------------- - Aggregate - -> Bitmap Heap Scan on tenk1 - Recheck Cond: (stringu1 = 'TVAAAA'::name) - -> Bitmap Index Scan on hash_tuplesort_idx - Index Cond: (stringu1 = 'TVAAAA'::name) -(5 rows) - -SELECT count(*) FROM tenk1 WHERE stringu1 = 'TVAAAA'; - count -------- - 14 -(1 row) - -DROP INDEX hash_tuplesort_idx; -RESET maintenance_work_mem; --- --- Test unique null behavior --- -CREATE TABLE unique_tbl (i int, t text); -CREATE UNIQUE INDEX unique_idx1 ON unique_tbl (i) NULLS DISTINCT; -CREATE UNIQUE INDEX unique_idx2 ON unique_tbl (i) NULLS NOT DISTINCT; -INSERT INTO unique_tbl VALUES (1, 'one'); -INSERT INTO unique_tbl VALUES (2, 'two'); -INSERT INTO unique_tbl VALUES (3, 'three'); -INSERT INTO unique_tbl VALUES (4, 'four'); -INSERT INTO unique_tbl VALUES (5, 'one'); -INSERT INTO unique_tbl (t) VALUES ('six'); -INSERT INTO unique_tbl (t) VALUES ('seven'); -- error from unique_idx2 -ERROR: duplicate key value violates unique constraint "unique_idx2" -DETAIL: Key (i)=(null) already exists. -DROP INDEX unique_idx1, unique_idx2; -INSERT INTO unique_tbl (t) VALUES ('seven'); --- build indexes on filled table -CREATE UNIQUE INDEX unique_idx3 ON unique_tbl (i) NULLS DISTINCT; -- ok -CREATE UNIQUE INDEX unique_idx4 ON unique_tbl (i) NULLS NOT DISTINCT; -- error -ERROR: could not create unique index "unique_idx4" -DETAIL: Key (i)=(null) is duplicated. -DELETE FROM unique_tbl WHERE t = 'seven'; -CREATE UNIQUE INDEX unique_idx4 ON unique_tbl (i) NULLS NOT DISTINCT; -- ok now -\d unique_tbl - Table "public.unique_tbl" - Column | Type | Collation | Nullable | Default ---------+---------+-----------+----------+--------- - i | integer | | | - t | text | | | -Indexes: - "unique_idx3" UNIQUE, btree (i) - "unique_idx4" UNIQUE, btree (i) NULLS NOT DISTINCT - -\d unique_idx3 - Index "public.unique_idx3" - Column | Type | Key? | Definition ---------+---------+------+------------ - i | integer | yes | i -unique, btree, for table "public.unique_tbl" - -\d unique_idx4 - Index "public.unique_idx4" - Column | Type | Key? | Definition ---------+---------+------+------------ - i | integer | yes | i -unique nulls not distinct, btree, for table "public.unique_tbl" - -SELECT pg_get_indexdef('unique_idx3'::regclass); - pg_get_indexdef ----------------------------------------------------------------------- - CREATE UNIQUE INDEX unique_idx3 ON public.unique_tbl USING btree (i) -(1 row) - -SELECT pg_get_indexdef('unique_idx4'::regclass); - pg_get_indexdef ------------------------------------------------------------------------------------------ - CREATE UNIQUE INDEX unique_idx4 ON public.unique_tbl USING btree (i) NULLS NOT DISTINCT -(1 row) - -DROP TABLE unique_tbl; --- --- Test functional index --- -CREATE TABLE func_index_heap (f1 text, f2 text); -CREATE UNIQUE INDEX func_index_index on func_index_heap (textcat(f1,f2)); -INSERT INTO func_index_heap VALUES('ABC','DEF'); -INSERT INTO func_index_heap VALUES('AB','CDEFG'); -INSERT INTO func_index_heap VALUES('QWE','RTY'); --- this should fail because of unique index: -INSERT INTO func_index_heap VALUES('ABCD', 'EF'); -ERROR: duplicate key value violates unique constraint "func_index_index" -DETAIL: Key (textcat(f1, f2))=(ABCDEF) already exists. --- but this shouldn't: -INSERT INTO func_index_heap VALUES('QWERTY'); --- while we're here, see that the metadata looks sane -\d func_index_heap - Table "public.func_index_heap" - Column | Type | Collation | Nullable | Default ---------+------+-----------+----------+--------- - f1 | text | | | - f2 | text | | | -Indexes: - "func_index_index" UNIQUE, btree (textcat(f1, f2)) - -\d func_index_index - Index "public.func_index_index" - Column | Type | Key? | Definition ----------+------+------+----------------- - textcat | text | yes | textcat(f1, f2) -unique, btree, for table "public.func_index_heap" - --- --- Same test, expressional index --- -DROP TABLE func_index_heap; -CREATE TABLE func_index_heap (f1 text, f2 text); -CREATE UNIQUE INDEX func_index_index on func_index_heap ((f1 || f2) text_ops); -INSERT INTO func_index_heap VALUES('ABC','DEF'); -INSERT INTO func_index_heap VALUES('AB','CDEFG'); -INSERT INTO func_index_heap VALUES('QWE','RTY'); --- this should fail because of unique index: -INSERT INTO func_index_heap VALUES('ABCD', 'EF'); -ERROR: duplicate key value violates unique constraint "func_index_index" -DETAIL: Key ((f1 || f2))=(ABCDEF) already exists. --- but this shouldn't: -INSERT INTO func_index_heap VALUES('QWERTY'); --- while we're here, see that the metadata looks sane -\d func_index_heap - Table "public.func_index_heap" - Column | Type | Collation | Nullable | Default ---------+------+-----------+----------+--------- - f1 | text | | | - f2 | text | | | -Indexes: - "func_index_index" UNIQUE, btree ((f1 || f2)) - -\d func_index_index - Index "public.func_index_index" - Column | Type | Key? | Definition ---------+------+------+------------ - expr | text | yes | (f1 || f2) -unique, btree, for table "public.func_index_heap" - --- this should fail because of unsafe column type (anonymous record) -create index on func_index_heap ((f1 || f2), (row(f1, f2))); -ERROR: column "row" has pseudo-type record --- --- Test unique index with included columns --- -CREATE TABLE covering_index_heap (f1 int, f2 int, f3 text); -CREATE UNIQUE INDEX covering_index_index on covering_index_heap (f1,f2) INCLUDE(f3); -INSERT INTO covering_index_heap VALUES(1,1,'AAA'); -INSERT INTO covering_index_heap VALUES(1,2,'AAA'); --- this should fail because of unique index on f1,f2: -INSERT INTO covering_index_heap VALUES(1,2,'BBB'); -ERROR: duplicate key value violates unique constraint "covering_index_index" -DETAIL: Key (f1, f2)=(1, 2) already exists. --- and this shouldn't: -INSERT INTO covering_index_heap VALUES(1,4,'AAA'); --- Try to build index on table that already contains data -CREATE UNIQUE INDEX covering_pkey on covering_index_heap (f1,f2) INCLUDE(f3); --- Try to use existing covering index as primary key -ALTER TABLE covering_index_heap ADD CONSTRAINT covering_pkey PRIMARY KEY USING INDEX -covering_pkey; -DROP TABLE covering_index_heap; --- --- Try some concurrent index builds --- --- Unfortunately this only tests about half the code paths because there are --- no concurrent updates happening to the table at the same time. -CREATE TABLE concur_heap (f1 text, f2 text); --- empty table -CREATE INDEX CONCURRENTLY concur_index1 ON concur_heap(f2,f1); -CREATE INDEX CONCURRENTLY IF NOT EXISTS concur_index1 ON concur_heap(f2,f1); -NOTICE: relation "concur_index1" already exists, skipping -INSERT INTO concur_heap VALUES ('a','b'); -INSERT INTO concur_heap VALUES ('b','b'); --- unique index -CREATE UNIQUE INDEX CONCURRENTLY concur_index2 ON concur_heap(f1); -CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS concur_index2 ON concur_heap(f1); -NOTICE: relation "concur_index2" already exists, skipping --- check if constraint is set up properly to be enforced -INSERT INTO concur_heap VALUES ('b','x'); -ERROR: duplicate key value violates unique constraint "concur_index2" -DETAIL: Key (f1)=(b) already exists. --- check if constraint is enforced properly at build time -CREATE UNIQUE INDEX CONCURRENTLY concur_index3 ON concur_heap(f2); -ERROR: could not create unique index "concur_index3" -DETAIL: Key (f2)=(b) is duplicated. --- test that expression indexes and partial indexes work concurrently -CREATE INDEX CONCURRENTLY concur_index4 on concur_heap(f2) WHERE f1='a'; -CREATE INDEX CONCURRENTLY concur_index5 on concur_heap(f2) WHERE f1='x'; --- here we also check that you can default the index name -CREATE INDEX CONCURRENTLY on concur_heap((f2||f1)); --- You can't do a concurrent index build in a transaction -BEGIN; -CREATE INDEX CONCURRENTLY concur_index7 ON concur_heap(f1); -ERROR: CREATE INDEX CONCURRENTLY cannot run inside a transaction block -COMMIT; --- test where predicate is able to do a transactional update during --- a concurrent build before switching pg_index state flags. -CREATE FUNCTION predicate_stable() RETURNS bool IMMUTABLE -LANGUAGE plpgsql AS $$ -BEGIN - EXECUTE 'SELECT txid_current()'; - RETURN true; -END; $$; -CREATE INDEX CONCURRENTLY concur_index8 ON concur_heap (f1) - WHERE predicate_stable(); -DROP INDEX concur_index8; -DROP FUNCTION predicate_stable(); --- But you can do a regular index build in a transaction -BEGIN; -CREATE INDEX std_index on concur_heap(f2); -COMMIT; --- Failed builds are left invalid by VACUUM FULL, fixed by REINDEX -VACUUM FULL concur_heap; -REINDEX TABLE concur_heap; -ERROR: could not create unique index "concur_index3" -DETAIL: Key (f2)=(b) is duplicated. -DELETE FROM concur_heap WHERE f1 = 'b'; -VACUUM FULL concur_heap; -\d concur_heap - Table "public.concur_heap" - Column | Type | Collation | Nullable | Default ---------+------+-----------+----------+--------- - f1 | text | | | - f2 | text | | | -Indexes: - "concur_heap_expr_idx" btree ((f2 || f1)) - "concur_index1" btree (f2, f1) - "concur_index2" UNIQUE, btree (f1) - "concur_index3" UNIQUE, btree (f2) INVALID - "concur_index4" btree (f2) WHERE f1 = 'a'::text - "concur_index5" btree (f2) WHERE f1 = 'x'::text - "std_index" btree (f2) - -REINDEX TABLE concur_heap; -\d concur_heap - Table "public.concur_heap" - Column | Type | Collation | Nullable | Default ---------+------+-----------+----------+--------- - f1 | text | | | - f2 | text | | | -Indexes: - "concur_heap_expr_idx" btree ((f2 || f1)) - "concur_index1" btree (f2, f1) - "concur_index2" UNIQUE, btree (f1) - "concur_index3" UNIQUE, btree (f2) - "concur_index4" btree (f2) WHERE f1 = 'a'::text - "concur_index5" btree (f2) WHERE f1 = 'x'::text - "std_index" btree (f2) - --- Temporary tables with concurrent builds and on-commit actions --- CONCURRENTLY used with CREATE INDEX and DROP INDEX is ignored. --- PRESERVE ROWS, the default. -CREATE TEMP TABLE concur_temp (f1 int, f2 text) - ON COMMIT PRESERVE ROWS; -INSERT INTO concur_temp VALUES (1, 'foo'), (2, 'bar'); -CREATE INDEX CONCURRENTLY concur_temp_ind ON concur_temp(f1); -DROP INDEX CONCURRENTLY concur_temp_ind; -DROP TABLE concur_temp; --- ON COMMIT DROP -BEGIN; -CREATE TEMP TABLE concur_temp (f1 int, f2 text) - ON COMMIT DROP; -INSERT INTO concur_temp VALUES (1, 'foo'), (2, 'bar'); --- Fails when running in a transaction. -CREATE INDEX CONCURRENTLY concur_temp_ind ON concur_temp(f1); -ERROR: CREATE INDEX CONCURRENTLY cannot run inside a transaction block -COMMIT; --- ON COMMIT DELETE ROWS -CREATE TEMP TABLE concur_temp (f1 int, f2 text) - ON COMMIT DELETE ROWS; -INSERT INTO concur_temp VALUES (1, 'foo'), (2, 'bar'); -CREATE INDEX CONCURRENTLY concur_temp_ind ON concur_temp(f1); -DROP INDEX CONCURRENTLY concur_temp_ind; -DROP TABLE concur_temp; --- --- Try some concurrent index drops --- -DROP INDEX CONCURRENTLY "concur_index2"; -- works -DROP INDEX CONCURRENTLY IF EXISTS "concur_index2"; -- notice -NOTICE: index "concur_index2" does not exist, skipping --- failures -DROP INDEX CONCURRENTLY "concur_index2", "concur_index3"; -ERROR: DROP INDEX CONCURRENTLY does not support dropping multiple objects -BEGIN; -DROP INDEX CONCURRENTLY "concur_index5"; -ERROR: DROP INDEX CONCURRENTLY cannot run inside a transaction block -ROLLBACK; --- successes -DROP INDEX CONCURRENTLY IF EXISTS "concur_index3"; -DROP INDEX CONCURRENTLY "concur_index4"; -DROP INDEX CONCURRENTLY "concur_index5"; -DROP INDEX CONCURRENTLY "concur_index1"; -DROP INDEX CONCURRENTLY "concur_heap_expr_idx"; -\d concur_heap - Table "public.concur_heap" - Column | Type | Collation | Nullable | Default ---------+------+-----------+----------+--------- - f1 | text | | | - f2 | text | | | -Indexes: - "std_index" btree (f2) - -DROP TABLE concur_heap; --- --- Test ADD CONSTRAINT USING INDEX --- -CREATE TABLE cwi_test( a int , b varchar(10), c char); --- add some data so that all tests have something to work with. -INSERT INTO cwi_test VALUES(1, 2), (3, 4), (5, 6); -CREATE UNIQUE INDEX cwi_uniq_idx ON cwi_test(a , b); -ALTER TABLE cwi_test ADD primary key USING INDEX cwi_uniq_idx; -\d cwi_test - Table "public.cwi_test" - Column | Type | Collation | Nullable | Default ---------+-----------------------+-----------+----------+--------- - a | integer | | not null | - b | character varying(10) | | not null | - c | character(1) | | | -Indexes: - "cwi_uniq_idx" PRIMARY KEY, btree (a, b) - -\d cwi_uniq_idx - Index "public.cwi_uniq_idx" - Column | Type | Key? | Definition ---------+-----------------------+------+------------ - a | integer | yes | a - b | character varying(10) | yes | b -primary key, btree, for table "public.cwi_test" - -CREATE UNIQUE INDEX cwi_uniq2_idx ON cwi_test(b , a); -ALTER TABLE cwi_test DROP CONSTRAINT cwi_uniq_idx, - ADD CONSTRAINT cwi_replaced_pkey PRIMARY KEY - USING INDEX cwi_uniq2_idx; -NOTICE: ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index "cwi_uniq2_idx" to "cwi_replaced_pkey" -\d cwi_test - Table "public.cwi_test" - Column | Type | Collation | Nullable | Default ---------+-----------------------+-----------+----------+--------- - a | integer | | not null | - b | character varying(10) | | not null | - c | character(1) | | | -Indexes: - "cwi_replaced_pkey" PRIMARY KEY, btree (b, a) - -\d cwi_replaced_pkey - Index "public.cwi_replaced_pkey" - Column | Type | Key? | Definition ---------+-----------------------+------+------------ - b | character varying(10) | yes | b - a | integer | yes | a -primary key, btree, for table "public.cwi_test" - -DROP INDEX cwi_replaced_pkey; -- Should fail; a constraint depends on it -ERROR: cannot drop index cwi_replaced_pkey because constraint cwi_replaced_pkey on table cwi_test requires it -HINT: You can drop constraint cwi_replaced_pkey on table cwi_test instead. --- Check that non-default index options are rejected -CREATE UNIQUE INDEX cwi_uniq3_idx ON cwi_test(a desc); -ALTER TABLE cwi_test ADD UNIQUE USING INDEX cwi_uniq3_idx; -- fail -ERROR: index "cwi_uniq3_idx" column number 1 does not have default sorting behavior -LINE 1: ALTER TABLE cwi_test ADD UNIQUE USING INDEX cwi_uniq3_idx; - ^ -DETAIL: Cannot create a primary key or unique constraint using such an index. -CREATE UNIQUE INDEX cwi_uniq4_idx ON cwi_test(b collate "POSIX"); -ALTER TABLE cwi_test ADD UNIQUE USING INDEX cwi_uniq4_idx; -- fail -ERROR: index "cwi_uniq4_idx" column number 1 does not have default sorting behavior -LINE 1: ALTER TABLE cwi_test ADD UNIQUE USING INDEX cwi_uniq4_idx; - ^ -DETAIL: Cannot create a primary key or unique constraint using such an index. -DROP TABLE cwi_test; --- ADD CONSTRAINT USING INDEX is forbidden on partitioned tables -CREATE TABLE cwi_test(a int) PARTITION BY hash (a); -create unique index on cwi_test (a); -alter table cwi_test add primary key using index cwi_test_a_idx ; -ERROR: ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables -DROP TABLE cwi_test; --- PRIMARY KEY constraint cannot be backed by a NULLS NOT DISTINCT index -CREATE TABLE cwi_test(a int, b int); -CREATE UNIQUE INDEX cwi_a_nnd ON cwi_test (a) NULLS NOT DISTINCT; -ALTER TABLE cwi_test ADD PRIMARY KEY USING INDEX cwi_a_nnd; -ERROR: primary keys cannot use NULLS NOT DISTINCT indexes -DROP TABLE cwi_test; --- --- Check handling of indexes on system columns --- -CREATE TABLE syscol_table (a INT); --- System columns cannot be indexed -CREATE INDEX ON syscolcol_table (ctid); -ERROR: relation "syscolcol_table" does not exist --- nor used in expressions -CREATE INDEX ON syscol_table ((ctid >= '(1000,0)')); -ERROR: index creation on system columns is not supported --- nor used in predicates -CREATE INDEX ON syscol_table (a) WHERE ctid >= '(1000,0)'; -ERROR: index creation on system columns is not supported -DROP TABLE syscol_table; --- --- Tests for IS NULL/IS NOT NULL with b-tree indexes --- -CREATE TABLE onek_with_null AS SELECT unique1, unique2 FROM onek; -INSERT INTO onek_with_null (unique1,unique2) VALUES (NULL, -1), (NULL, NULL); -CREATE UNIQUE INDEX onek_nulltest ON onek_with_null (unique2,unique1); -SET enable_seqscan = OFF; -SET enable_indexscan = ON; -SET enable_bitmapscan = ON; -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL; - count -------- - 2 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NULL; - count -------- - 1 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL; - count -------- - 1000 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NOT NULL; - count -------- - 1 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL AND unique1 > 500; - count -------- - 499 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique1 > 500; - count -------- - 0 -(1 row) - -DROP INDEX onek_nulltest; -CREATE UNIQUE INDEX onek_nulltest ON onek_with_null (unique2 desc,unique1); -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL; - count -------- - 2 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NULL; - count -------- - 1 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL; - count -------- - 1000 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NOT NULL; - count -------- - 1 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL AND unique1 > 500; - count -------- - 499 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique1 > 500; - count -------- - 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; - count -------- - 2 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NULL; - count -------- - 1 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL; - count -------- - 1000 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NOT NULL; - count -------- - 1 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL AND unique1 > 500; - count -------- - 499 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique1 > 500; - count -------- - 0 -(1 row) - -DROP INDEX onek_nulltest; -CREATE UNIQUE INDEX onek_nulltest ON onek_with_null (unique2 nulls first,unique1); -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL; - count -------- - 2 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NULL; - count -------- - 1 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL; - count -------- - 1000 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NOT NULL; - count -------- - 1 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL AND unique1 > 500; - count -------- - 499 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique1 > 500; - count -------- - 0 -(1 row) - -DROP INDEX onek_nulltest; --- Check initial-positioning logic too -CREATE UNIQUE INDEX onek_nulltest ON onek_with_null (unique2); -SET enable_seqscan = OFF; -SET enable_indexscan = ON; -SET enable_bitmapscan = OFF; -SELECT unique1, unique2 FROM onek_with_null - ORDER BY unique2 LIMIT 2; - unique1 | unique2 ----------+--------- - | -1 - 147 | 0 -(2 rows) - -SELECT unique1, unique2 FROM onek_with_null WHERE unique2 >= -1 - ORDER BY unique2 LIMIT 2; - unique1 | unique2 ----------+--------- - | -1 - 147 | 0 -(2 rows) - -SELECT unique1, unique2 FROM onek_with_null WHERE unique2 >= 0 - ORDER BY unique2 LIMIT 2; - unique1 | unique2 ----------+--------- - 147 | 0 - 931 | 1 -(2 rows) - -SELECT unique1, unique2 FROM onek_with_null - ORDER BY unique2 DESC LIMIT 2; - unique1 | unique2 ----------+--------- - | - 278 | 999 -(2 rows) - -SELECT unique1, unique2 FROM onek_with_null WHERE unique2 >= -1 - ORDER BY unique2 DESC LIMIT 2; - unique1 | unique2 ----------+--------- - 278 | 999 - 0 | 998 -(2 rows) - -SELECT unique1, unique2 FROM onek_with_null WHERE unique2 < 999 - ORDER BY unique2 DESC LIMIT 2; - unique1 | unique2 ----------+--------- - 0 | 998 - 744 | 997 -(2 rows) - -RESET enable_seqscan; -RESET enable_indexscan; -RESET enable_bitmapscan; -DROP TABLE onek_with_null; --- --- Check bitmap index path planning --- -EXPLAIN (COSTS OFF) -SELECT * FROM tenk1 - WHERE thousand = 42 AND (tenthous = 1 OR tenthous = 3 OR tenthous = 42); - QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------ - Bitmap Heap Scan on tenk1 - Recheck Cond: (((thousand = 42) AND (tenthous = 1)) OR ((thousand = 42) AND (tenthous = 3)) OR ((thousand = 42) AND (tenthous = 42))) - -> BitmapOr - -> Bitmap Index Scan on tenk1_thous_tenthous - Index Cond: ((thousand = 42) AND (tenthous = 1)) - -> Bitmap Index Scan on tenk1_thous_tenthous - Index Cond: ((thousand = 42) AND (tenthous = 3)) - -> Bitmap Index Scan on tenk1_thous_tenthous - Index Cond: ((thousand = 42) AND (tenthous = 42)) -(9 rows) - -SELECT * FROM tenk1 - WHERE thousand = 42 AND (tenthous = 1 OR tenthous = 3 OR tenthous = 42); - unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 ----------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- - 42 | 5530 | 0 | 2 | 2 | 2 | 42 | 42 | 42 | 42 | 42 | 84 | 85 | QBAAAA | SEIAAA | OOOOxx -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM tenk1 - WHERE hundred = 42 AND (thousand = 42 OR thousand = 99); - QUERY PLAN ---------------------------------------------------------------------------------- - Aggregate - -> Bitmap Heap Scan on tenk1 - Recheck Cond: ((hundred = 42) AND ((thousand = 42) OR (thousand = 99))) - -> BitmapAnd - -> Bitmap Index Scan on tenk1_hundred - Index Cond: (hundred = 42) - -> BitmapOr - -> Bitmap Index Scan on tenk1_thous_tenthous - Index Cond: (thousand = 42) - -> Bitmap Index Scan on tenk1_thous_tenthous - Index Cond: (thousand = 99) -(11 rows) - -SELECT count(*) FROM tenk1 - WHERE hundred = 42 AND (thousand = 42 OR thousand = 99); - count -------- - 10 -(1 row) - --- --- Check behavior with duplicate index column contents --- -CREATE TABLE dupindexcols AS - SELECT unique1 as id, stringu2::text as f1 FROM tenk1; -CREATE INDEX dupindexcols_i ON dupindexcols (f1, id, f1 text_pattern_ops); -ANALYZE dupindexcols; -EXPLAIN (COSTS OFF) - SELECT count(*) FROM dupindexcols - WHERE f1 BETWEEN 'WA' AND 'ZZZ' and id < 1000 and f1 ~<~ 'YX'; - QUERY PLAN ----------------------------------------------------------------------------------------------------------------- - Aggregate - -> Bitmap Heap Scan on dupindexcols - Recheck Cond: ((f1 >= 'WA'::text) AND (f1 <= 'ZZZ'::text) AND (id < 1000) AND (f1 ~<~ 'YX'::text)) - -> Bitmap Index Scan on dupindexcols_i - Index Cond: ((f1 >= 'WA'::text) AND (f1 <= 'ZZZ'::text) AND (id < 1000) AND (f1 ~<~ 'YX'::text)) -(5 rows) - -SELECT count(*) FROM dupindexcols - WHERE f1 BETWEEN 'WA' AND 'ZZZ' and id < 1000 and f1 ~<~ 'YX'; - count -------- - 97 -(1 row) - --- --- Check that index scans with =ANY indexquals return rows in index order --- -explain (costs off) -SELECT unique1 FROM tenk1 -WHERE unique1 IN (1,42,7) -ORDER BY unique1; - QUERY PLAN -------------------------------------------------------- - Index Only Scan using tenk1_unique1 on tenk1 - Index Cond: (unique1 = ANY ('{1,42,7}'::integer[])) -(2 rows) - -SELECT unique1 FROM tenk1 -WHERE unique1 IN (1,42,7) -ORDER BY unique1; - unique1 ---------- - 1 - 7 - 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 --------------------------------------------------------------------------------- - Index Only Scan 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; - thousand | tenthous -----------+---------- - 0 | 3000 - 1 | 1001 -(2 rows) - --- 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 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 DESC, tenthous DESC; - thousand | tenthous -----------+---------- - 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) - -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 --- -explain (costs off) - select * from tenk1 where (thousand, tenthous) in ((1,1001), (null,null)); - QUERY PLAN ------------------------------------------------------- - Index Scan using tenk1_thous_tenthous on tenk1 - Index Cond: ((thousand = 1) AND (tenthous = 1001)) -(2 rows) - --- --- Check matching of boolean index columns to WHERE conditions and sort keys --- -create temp table boolindex (b bool, i int, unique(b, i), junk float); -explain (costs off) - select * from boolindex order by b, i limit 10; - QUERY PLAN -------------------------------------------------------- - Limit - -> Index Scan using boolindex_b_i_key on boolindex -(2 rows) - -explain (costs off) - select * from boolindex where b order by i limit 10; - QUERY PLAN -------------------------------------------------------- - Limit - -> Index Scan using boolindex_b_i_key on boolindex - Index Cond: (b = true) -(3 rows) - -explain (costs off) - select * from boolindex where b = true order by i desc limit 10; - QUERY PLAN ----------------------------------------------------------------- - Limit - -> Index Scan Backward using boolindex_b_i_key on boolindex - Index Cond: (b = true) -(3 rows) - -explain (costs off) - select * from boolindex where not b order by i limit 10; - QUERY PLAN -------------------------------------------------------- - Limit - -> Index Scan using boolindex_b_i_key on boolindex - Index Cond: (b = false) -(3 rows) - -explain (costs off) - select * from boolindex where b is true order by i desc limit 10; - QUERY PLAN ----------------------------------------------------------------- - Limit - -> Index Scan Backward using boolindex_b_i_key on boolindex - Index Cond: (b = true) -(3 rows) - -explain (costs off) - select * from boolindex where b is false order by i desc limit 10; - QUERY PLAN ----------------------------------------------------------------- - Limit - -> Index Scan Backward using boolindex_b_i_key on boolindex - Index Cond: (b = false) -(3 rows) - --- --- REINDEX (VERBOSE) --- -CREATE TABLE reindex_verbose(id integer primary key); -\set VERBOSITY terse \\ -- suppress machine-dependent details -REINDEX (VERBOSE) TABLE reindex_verbose; -INFO: index "reindex_verbose_pkey" was reindexed -\set VERBOSITY default -DROP TABLE reindex_verbose; --- --- REINDEX CONCURRENTLY --- -CREATE TABLE concur_reindex_tab (c1 int); --- REINDEX -REINDEX TABLE concur_reindex_tab; -- notice -NOTICE: table "concur_reindex_tab" has no indexes to reindex -REINDEX (CONCURRENTLY) TABLE concur_reindex_tab; -- notice -NOTICE: table "concur_reindex_tab" has no indexes that can be reindexed concurrently -ALTER TABLE concur_reindex_tab ADD COLUMN c2 text; -- add toast index --- Normal index with integer column -CREATE UNIQUE INDEX concur_reindex_ind1 ON concur_reindex_tab(c1); --- Normal index with text column -CREATE INDEX concur_reindex_ind2 ON concur_reindex_tab(c2); --- UNIQUE index with expression -CREATE UNIQUE INDEX concur_reindex_ind3 ON concur_reindex_tab(abs(c1)); --- Duplicate column names -CREATE INDEX concur_reindex_ind4 ON concur_reindex_tab(c1, c1, c2); --- Create table for check on foreign key dependence switch with indexes swapped -ALTER TABLE concur_reindex_tab ADD PRIMARY KEY USING INDEX concur_reindex_ind1; -CREATE TABLE concur_reindex_tab2 (c1 int REFERENCES concur_reindex_tab); -INSERT INTO concur_reindex_tab VALUES (1, 'a'); -INSERT INTO concur_reindex_tab VALUES (2, 'a'); --- Reindex concurrently of exclusion constraint currently not supported -CREATE TABLE concur_reindex_tab3 (c1 int, c2 int4range, EXCLUDE USING gist (c2 WITH &&)); -INSERT INTO concur_reindex_tab3 VALUES (3, '[1,2]'); -REINDEX INDEX CONCURRENTLY concur_reindex_tab3_c2_excl; -- error -ERROR: concurrent index creation for exclusion constraints is not supported -REINDEX TABLE CONCURRENTLY concur_reindex_tab3; -- succeeds with warning -WARNING: cannot reindex exclusion constraint index "public.concur_reindex_tab3_c2_excl" concurrently, skipping -INSERT INTO concur_reindex_tab3 VALUES (4, '[2,4]'); -ERROR: conflicting key value violates exclusion constraint "concur_reindex_tab3_c2_excl" -DETAIL: Key (c2)=([2,5)) conflicts with existing key (c2)=([1,3)). --- Check materialized views -CREATE MATERIALIZED VIEW concur_reindex_matview AS SELECT * FROM concur_reindex_tab; --- Dependency lookup before and after the follow-up REINDEX commands. --- These should remain consistent. -SELECT pg_describe_object(classid, objid, objsubid) as obj, - pg_describe_object(refclassid,refobjid,refobjsubid) as objref, - deptype -FROM pg_depend -WHERE classid = 'pg_class'::regclass AND - objid in ('concur_reindex_tab'::regclass, - 'concur_reindex_ind1'::regclass, - 'concur_reindex_ind2'::regclass, - 'concur_reindex_ind3'::regclass, - 'concur_reindex_ind4'::regclass, - 'concur_reindex_matview'::regclass) - ORDER BY 1, 2; - obj | objref | deptype -------------------------------------------+------------------------------------------------------------+--------- - index concur_reindex_ind1 | constraint concur_reindex_ind1 on table concur_reindex_tab | i - index concur_reindex_ind2 | column c2 of table concur_reindex_tab | a - index concur_reindex_ind3 | column c1 of table concur_reindex_tab | a - index concur_reindex_ind3 | table concur_reindex_tab | a - index concur_reindex_ind4 | column c1 of table concur_reindex_tab | a - index concur_reindex_ind4 | column c2 of table concur_reindex_tab | a - materialized view concur_reindex_matview | access method tde_heap | n - materialized view concur_reindex_matview | schema public | n - table concur_reindex_tab | access method tde_heap | n - table concur_reindex_tab | schema public | n -(10 rows) - -REINDEX INDEX CONCURRENTLY concur_reindex_ind1; -REINDEX TABLE CONCURRENTLY concur_reindex_tab; -REINDEX TABLE CONCURRENTLY concur_reindex_matview; -SELECT pg_describe_object(classid, objid, objsubid) as obj, - pg_describe_object(refclassid,refobjid,refobjsubid) as objref, - deptype -FROM pg_depend -WHERE classid = 'pg_class'::regclass AND - objid in ('concur_reindex_tab'::regclass, - 'concur_reindex_ind1'::regclass, - 'concur_reindex_ind2'::regclass, - 'concur_reindex_ind3'::regclass, - 'concur_reindex_ind4'::regclass, - 'concur_reindex_matview'::regclass) - ORDER BY 1, 2; - obj | objref | deptype -------------------------------------------+------------------------------------------------------------+--------- - index concur_reindex_ind1 | constraint concur_reindex_ind1 on table concur_reindex_tab | i - index concur_reindex_ind2 | column c2 of table concur_reindex_tab | a - index concur_reindex_ind3 | column c1 of table concur_reindex_tab | a - index concur_reindex_ind3 | table concur_reindex_tab | a - index concur_reindex_ind4 | column c1 of table concur_reindex_tab | a - index concur_reindex_ind4 | column c2 of table concur_reindex_tab | a - materialized view concur_reindex_matview | access method tde_heap | n - materialized view concur_reindex_matview | schema public | n - table concur_reindex_tab | access method tde_heap | n - table concur_reindex_tab | schema public | n -(10 rows) - --- Check that comments are preserved -CREATE TABLE testcomment (i int); -CREATE INDEX testcomment_idx1 ON testcomment (i); -COMMENT ON INDEX testcomment_idx1 IS 'test comment'; -SELECT obj_description('testcomment_idx1'::regclass, 'pg_class'); - obj_description ------------------ - test comment -(1 row) - -REINDEX TABLE testcomment; -SELECT obj_description('testcomment_idx1'::regclass, 'pg_class'); - obj_description ------------------ - test comment -(1 row) - -REINDEX TABLE CONCURRENTLY testcomment ; -SELECT obj_description('testcomment_idx1'::regclass, 'pg_class'); - obj_description ------------------ - test comment -(1 row) - -DROP TABLE testcomment; --- Check that indisclustered updates are preserved -CREATE TABLE concur_clustered(i int); -CREATE INDEX concur_clustered_i_idx ON concur_clustered(i); -ALTER TABLE concur_clustered CLUSTER ON concur_clustered_i_idx; -REINDEX TABLE CONCURRENTLY concur_clustered; -SELECT indexrelid::regclass, indisclustered FROM pg_index - WHERE indrelid = 'concur_clustered'::regclass; - indexrelid | indisclustered -------------------------+---------------- - concur_clustered_i_idx | t -(1 row) - -DROP TABLE concur_clustered; --- Check that indisreplident updates are preserved. -CREATE TABLE concur_replident(i int NOT NULL); -CREATE UNIQUE INDEX concur_replident_i_idx ON concur_replident(i); -ALTER TABLE concur_replident REPLICA IDENTITY - USING INDEX concur_replident_i_idx; -SELECT indexrelid::regclass, indisreplident FROM pg_index - WHERE indrelid = 'concur_replident'::regclass; - indexrelid | indisreplident -------------------------+---------------- - concur_replident_i_idx | t -(1 row) - -REINDEX TABLE CONCURRENTLY concur_replident; -SELECT indexrelid::regclass, indisreplident FROM pg_index - WHERE indrelid = 'concur_replident'::regclass; - indexrelid | indisreplident -------------------------+---------------- - concur_replident_i_idx | t -(1 row) - -DROP TABLE concur_replident; --- Check that opclass parameters are preserved -CREATE TABLE concur_appclass_tab(i tsvector, j tsvector, k tsvector); -CREATE INDEX concur_appclass_ind on concur_appclass_tab - USING gist (i tsvector_ops (siglen='1000'), j tsvector_ops (siglen='500')); -CREATE INDEX concur_appclass_ind_2 on concur_appclass_tab - USING gist (k tsvector_ops (siglen='300'), j tsvector_ops); -REINDEX TABLE CONCURRENTLY concur_appclass_tab; -\d concur_appclass_tab - Table "public.concur_appclass_tab" - Column | Type | Collation | Nullable | Default ---------+----------+-----------+----------+--------- - i | tsvector | | | - j | tsvector | | | - k | tsvector | | | -Indexes: - "concur_appclass_ind" gist (i tsvector_ops (siglen='1000'), j tsvector_ops (siglen='500')) - "concur_appclass_ind_2" gist (k tsvector_ops (siglen='300'), j) - -DROP TABLE concur_appclass_tab; --- Partitions --- Create some partitioned tables -CREATE TABLE concur_reindex_part (c1 int, c2 int) PARTITION BY RANGE (c1); -CREATE TABLE concur_reindex_part_0 PARTITION OF concur_reindex_part - FOR VALUES FROM (0) TO (10) PARTITION BY list (c2); -CREATE TABLE concur_reindex_part_0_1 PARTITION OF concur_reindex_part_0 - FOR VALUES IN (1); -CREATE TABLE concur_reindex_part_0_2 PARTITION OF concur_reindex_part_0 - FOR VALUES IN (2); --- This partitioned table will have no partitions. -CREATE TABLE concur_reindex_part_10 PARTITION OF concur_reindex_part - FOR VALUES FROM (10) TO (20) PARTITION BY list (c2); --- Create some partitioned indexes -CREATE INDEX concur_reindex_part_index ON ONLY concur_reindex_part (c1); -CREATE INDEX concur_reindex_part_index_0 ON ONLY concur_reindex_part_0 (c1); -ALTER INDEX concur_reindex_part_index ATTACH PARTITION concur_reindex_part_index_0; --- This partitioned index will have no partitions. -CREATE INDEX concur_reindex_part_index_10 ON ONLY concur_reindex_part_10 (c1); -ALTER INDEX concur_reindex_part_index ATTACH PARTITION concur_reindex_part_index_10; -CREATE INDEX concur_reindex_part_index_0_1 ON ONLY concur_reindex_part_0_1 (c1); -ALTER INDEX concur_reindex_part_index_0 ATTACH PARTITION concur_reindex_part_index_0_1; -CREATE INDEX concur_reindex_part_index_0_2 ON ONLY concur_reindex_part_0_2 (c1); -ALTER INDEX concur_reindex_part_index_0 ATTACH PARTITION concur_reindex_part_index_0_2; -SELECT relid, parentrelid, level FROM pg_partition_tree('concur_reindex_part_index') - ORDER BY relid, level; - relid | parentrelid | level --------------------------------+-----------------------------+------- - concur_reindex_part_index | | 0 - concur_reindex_part_index_0 | concur_reindex_part_index | 1 - concur_reindex_part_index_10 | concur_reindex_part_index | 1 - concur_reindex_part_index_0_1 | concur_reindex_part_index_0 | 2 - concur_reindex_part_index_0_2 | concur_reindex_part_index_0 | 2 -(5 rows) - -SELECT relid, parentrelid, level FROM pg_partition_tree('concur_reindex_part_index') - ORDER BY relid, level; - relid | parentrelid | level --------------------------------+-----------------------------+------- - concur_reindex_part_index | | 0 - concur_reindex_part_index_0 | concur_reindex_part_index | 1 - concur_reindex_part_index_10 | concur_reindex_part_index | 1 - concur_reindex_part_index_0_1 | concur_reindex_part_index_0 | 2 - concur_reindex_part_index_0_2 | concur_reindex_part_index_0 | 2 -(5 rows) - --- REINDEX should preserve dependencies of partition tree. -SELECT pg_describe_object(classid, objid, objsubid) as obj, - pg_describe_object(refclassid,refobjid,refobjsubid) as objref, - deptype -FROM pg_depend -WHERE classid = 'pg_class'::regclass AND - objid in ('concur_reindex_part'::regclass, - 'concur_reindex_part_0'::regclass, - 'concur_reindex_part_0_1'::regclass, - 'concur_reindex_part_0_2'::regclass, - 'concur_reindex_part_index'::regclass, - 'concur_reindex_part_index_0'::regclass, - 'concur_reindex_part_index_0_1'::regclass, - 'concur_reindex_part_index_0_2'::regclass) - ORDER BY 1, 2; - obj | objref | deptype -------------------------------------------+--------------------------------------------+--------- - column c1 of table concur_reindex_part | table concur_reindex_part | i - column c2 of table concur_reindex_part_0 | table concur_reindex_part_0 | i - index concur_reindex_part_index | column c1 of table concur_reindex_part | a - index concur_reindex_part_index_0 | column c1 of table concur_reindex_part_0 | a - index concur_reindex_part_index_0 | index concur_reindex_part_index | P - index concur_reindex_part_index_0 | table concur_reindex_part_0 | S - index concur_reindex_part_index_0_1 | column c1 of table concur_reindex_part_0_1 | a - index concur_reindex_part_index_0_1 | index concur_reindex_part_index_0 | P - index concur_reindex_part_index_0_1 | table concur_reindex_part_0_1 | S - index concur_reindex_part_index_0_2 | column c1 of table concur_reindex_part_0_2 | a - index concur_reindex_part_index_0_2 | index concur_reindex_part_index_0 | P - index concur_reindex_part_index_0_2 | table concur_reindex_part_0_2 | S - table concur_reindex_part | schema public | n - table concur_reindex_part_0 | schema public | n - table concur_reindex_part_0 | table concur_reindex_part | a - table concur_reindex_part_0_1 | access method tde_heap | n - table concur_reindex_part_0_1 | schema public | n - table concur_reindex_part_0_1 | table concur_reindex_part_0 | a - table concur_reindex_part_0_2 | access method tde_heap | n - table concur_reindex_part_0_2 | schema public | n - table concur_reindex_part_0_2 | table concur_reindex_part_0 | a -(21 rows) - -REINDEX INDEX CONCURRENTLY concur_reindex_part_index_0_1; -REINDEX INDEX CONCURRENTLY concur_reindex_part_index_0_2; -SELECT relid, parentrelid, level FROM pg_partition_tree('concur_reindex_part_index') - ORDER BY relid, level; - relid | parentrelid | level --------------------------------+-----------------------------+------- - concur_reindex_part_index | | 0 - concur_reindex_part_index_0 | concur_reindex_part_index | 1 - concur_reindex_part_index_10 | concur_reindex_part_index | 1 - concur_reindex_part_index_0_1 | concur_reindex_part_index_0 | 2 - concur_reindex_part_index_0_2 | concur_reindex_part_index_0 | 2 -(5 rows) - -REINDEX TABLE CONCURRENTLY concur_reindex_part_0_1; -REINDEX TABLE CONCURRENTLY concur_reindex_part_0_2; -SELECT pg_describe_object(classid, objid, objsubid) as obj, - pg_describe_object(refclassid,refobjid,refobjsubid) as objref, - deptype -FROM pg_depend -WHERE classid = 'pg_class'::regclass AND - objid in ('concur_reindex_part'::regclass, - 'concur_reindex_part_0'::regclass, - 'concur_reindex_part_0_1'::regclass, - 'concur_reindex_part_0_2'::regclass, - 'concur_reindex_part_index'::regclass, - 'concur_reindex_part_index_0'::regclass, - 'concur_reindex_part_index_0_1'::regclass, - 'concur_reindex_part_index_0_2'::regclass) - ORDER BY 1, 2; - obj | objref | deptype -------------------------------------------+--------------------------------------------+--------- - column c1 of table concur_reindex_part | table concur_reindex_part | i - column c2 of table concur_reindex_part_0 | table concur_reindex_part_0 | i - index concur_reindex_part_index | column c1 of table concur_reindex_part | a - index concur_reindex_part_index_0 | column c1 of table concur_reindex_part_0 | a - index concur_reindex_part_index_0 | index concur_reindex_part_index | P - index concur_reindex_part_index_0 | table concur_reindex_part_0 | S - index concur_reindex_part_index_0_1 | column c1 of table concur_reindex_part_0_1 | a - index concur_reindex_part_index_0_1 | index concur_reindex_part_index_0 | P - index concur_reindex_part_index_0_1 | table concur_reindex_part_0_1 | S - index concur_reindex_part_index_0_2 | column c1 of table concur_reindex_part_0_2 | a - index concur_reindex_part_index_0_2 | index concur_reindex_part_index_0 | P - index concur_reindex_part_index_0_2 | table concur_reindex_part_0_2 | S - table concur_reindex_part | schema public | n - table concur_reindex_part_0 | schema public | n - table concur_reindex_part_0 | table concur_reindex_part | a - table concur_reindex_part_0_1 | access method tde_heap | n - table concur_reindex_part_0_1 | schema public | n - table concur_reindex_part_0_1 | table concur_reindex_part_0 | a - table concur_reindex_part_0_2 | access method tde_heap | n - table concur_reindex_part_0_2 | schema public | n - table concur_reindex_part_0_2 | table concur_reindex_part_0 | a -(21 rows) - -SELECT relid, parentrelid, level FROM pg_partition_tree('concur_reindex_part_index') - ORDER BY relid, level; - relid | parentrelid | level --------------------------------+-----------------------------+------- - concur_reindex_part_index | | 0 - concur_reindex_part_index_0 | concur_reindex_part_index | 1 - concur_reindex_part_index_10 | concur_reindex_part_index | 1 - concur_reindex_part_index_0_1 | concur_reindex_part_index_0 | 2 - concur_reindex_part_index_0_2 | concur_reindex_part_index_0 | 2 -(5 rows) - --- REINDEX for partitioned indexes --- REINDEX TABLE fails for partitioned indexes --- Top-most parent index -REINDEX TABLE concur_reindex_part_index; -- error -ERROR: "concur_reindex_part_index" is not a table or materialized view -REINDEX TABLE CONCURRENTLY concur_reindex_part_index; -- error -ERROR: "concur_reindex_part_index" is not a table or materialized view --- Partitioned index with no leaves -REINDEX TABLE concur_reindex_part_index_10; -- error -ERROR: "concur_reindex_part_index_10" is not a table or materialized view -REINDEX TABLE CONCURRENTLY concur_reindex_part_index_10; -- error -ERROR: "concur_reindex_part_index_10" is not a table or materialized view --- Cannot run in a transaction block -BEGIN; -REINDEX INDEX concur_reindex_part_index; -ERROR: REINDEX INDEX cannot run inside a transaction block -CONTEXT: while reindexing partitioned index "public.concur_reindex_part_index" -ROLLBACK; --- Helper functions to track changes of relfilenodes in a partition tree. --- Create a table tracking the relfilenode state. -CREATE OR REPLACE FUNCTION create_relfilenode_part(relname text, indname text) - RETURNS VOID AS - $func$ - BEGIN - EXECUTE format(' - CREATE TABLE %I AS - SELECT oid, relname, relfilenode, relkind, reltoastrelid - FROM pg_class - WHERE oid IN - (SELECT relid FROM pg_partition_tree(''%I''));', - relname, indname); - END - $func$ LANGUAGE plpgsql; -CREATE OR REPLACE FUNCTION compare_relfilenode_part(tabname text) - RETURNS TABLE (relname name, relkind "char", state text) AS - $func$ - BEGIN - RETURN QUERY EXECUTE - format( - 'SELECT b.relname, - b.relkind, - CASE WHEN a.relfilenode = b.relfilenode THEN ''relfilenode is unchanged'' - ELSE ''relfilenode has changed'' END - -- Do not join with OID here as CONCURRENTLY changes it. - FROM %I b JOIN pg_class a ON b.relname = a.relname - ORDER BY 1;', tabname); - END - $func$ LANGUAGE plpgsql; --- Check that expected relfilenodes are changed, non-concurrent case. -SELECT create_relfilenode_part('reindex_index_status', 'concur_reindex_part_index'); - create_relfilenode_part -------------------------- - -(1 row) - -REINDEX INDEX concur_reindex_part_index; -SELECT * FROM compare_relfilenode_part('reindex_index_status'); - relname | relkind | state --------------------------------+---------+-------------------------- - concur_reindex_part_index | I | relfilenode is unchanged - concur_reindex_part_index_0 | I | relfilenode is unchanged - concur_reindex_part_index_0_1 | i | relfilenode has changed - concur_reindex_part_index_0_2 | i | relfilenode has changed - concur_reindex_part_index_10 | I | relfilenode is unchanged -(5 rows) - -DROP TABLE reindex_index_status; --- concurrent case. -SELECT create_relfilenode_part('reindex_index_status', 'concur_reindex_part_index'); - create_relfilenode_part -------------------------- - -(1 row) - -REINDEX INDEX CONCURRENTLY concur_reindex_part_index; -SELECT * FROM compare_relfilenode_part('reindex_index_status'); - relname | relkind | state --------------------------------+---------+-------------------------- - concur_reindex_part_index | I | relfilenode is unchanged - concur_reindex_part_index_0 | I | relfilenode is unchanged - concur_reindex_part_index_0_1 | i | relfilenode has changed - concur_reindex_part_index_0_2 | i | relfilenode has changed - concur_reindex_part_index_10 | I | relfilenode is unchanged -(5 rows) - -DROP TABLE reindex_index_status; --- REINDEX for partitioned tables --- REINDEX INDEX fails for partitioned tables --- Top-most parent -REINDEX INDEX concur_reindex_part; -- error -ERROR: "concur_reindex_part" is not an index -REINDEX INDEX CONCURRENTLY concur_reindex_part; -- error -ERROR: "concur_reindex_part" is not an index --- Partitioned with no leaves -REINDEX INDEX concur_reindex_part_10; -- error -ERROR: "concur_reindex_part_10" is not an index -REINDEX INDEX CONCURRENTLY concur_reindex_part_10; -- error -ERROR: "concur_reindex_part_10" is not an index --- Cannot run in a transaction block -BEGIN; -REINDEX TABLE concur_reindex_part; -ERROR: REINDEX TABLE cannot run inside a transaction block -CONTEXT: while reindexing partitioned table "public.concur_reindex_part" -ROLLBACK; --- Check that expected relfilenodes are changed, non-concurrent case. --- Note that the partition tree changes of the *indexes* need to be checked. -SELECT create_relfilenode_part('reindex_index_status', 'concur_reindex_part_index'); - create_relfilenode_part -------------------------- - -(1 row) - -REINDEX TABLE concur_reindex_part; -SELECT * FROM compare_relfilenode_part('reindex_index_status'); - relname | relkind | state --------------------------------+---------+-------------------------- - concur_reindex_part_index | I | relfilenode is unchanged - concur_reindex_part_index_0 | I | relfilenode is unchanged - concur_reindex_part_index_0_1 | i | relfilenode has changed - concur_reindex_part_index_0_2 | i | relfilenode has changed - concur_reindex_part_index_10 | I | relfilenode is unchanged -(5 rows) - -DROP TABLE reindex_index_status; --- concurrent case. -SELECT create_relfilenode_part('reindex_index_status', 'concur_reindex_part_index'); - create_relfilenode_part -------------------------- - -(1 row) - -REINDEX TABLE CONCURRENTLY concur_reindex_part; -SELECT * FROM compare_relfilenode_part('reindex_index_status'); - relname | relkind | state --------------------------------+---------+-------------------------- - concur_reindex_part_index | I | relfilenode is unchanged - concur_reindex_part_index_0 | I | relfilenode is unchanged - concur_reindex_part_index_0_1 | i | relfilenode has changed - concur_reindex_part_index_0_2 | i | relfilenode has changed - concur_reindex_part_index_10 | I | relfilenode is unchanged -(5 rows) - -DROP TABLE reindex_index_status; -DROP FUNCTION create_relfilenode_part; -DROP FUNCTION compare_relfilenode_part; --- Cleanup of partition tree used for REINDEX test. -DROP TABLE concur_reindex_part; --- Check errors --- Cannot run inside a transaction block -BEGIN; -REINDEX TABLE CONCURRENTLY concur_reindex_tab; -ERROR: REINDEX CONCURRENTLY cannot run inside a transaction block -COMMIT; -REINDEX TABLE CONCURRENTLY pg_class; -- no catalog relation -ERROR: cannot reindex system catalogs concurrently -REINDEX INDEX CONCURRENTLY pg_class_oid_index; -- no catalog index -ERROR: cannot reindex system catalogs concurrently --- These are the toast table and index of pg_authid. -REINDEX TABLE CONCURRENTLY pg_toast.pg_toast_1260; -- no catalog toast table -ERROR: cannot reindex system catalogs concurrently -REINDEX INDEX CONCURRENTLY pg_toast.pg_toast_1260_index; -- no catalog toast index -ERROR: cannot reindex system catalogs concurrently -REINDEX SYSTEM CONCURRENTLY postgres; -- not allowed for SYSTEM -ERROR: cannot reindex system catalogs concurrently -REINDEX (CONCURRENTLY) SYSTEM postgres; -- ditto -ERROR: cannot reindex system catalogs concurrently -REINDEX (CONCURRENTLY) SYSTEM; -- ditto -ERROR: cannot reindex system catalogs concurrently --- Warns about catalog relations -REINDEX SCHEMA CONCURRENTLY pg_catalog; -WARNING: cannot reindex system catalogs concurrently, skipping all --- Not the current database -REINDEX DATABASE not_current_database; -ERROR: can only reindex the currently open database --- Check the relation status, there should not be invalid indexes -\d concur_reindex_tab - Table "public.concur_reindex_tab" - Column | Type | Collation | Nullable | Default ---------+---------+-----------+----------+--------- - c1 | integer | | not null | - c2 | text | | | -Indexes: - "concur_reindex_ind1" PRIMARY KEY, btree (c1) - "concur_reindex_ind2" btree (c2) - "concur_reindex_ind3" UNIQUE, btree (abs(c1)) - "concur_reindex_ind4" btree (c1, c1, c2) -Referenced by: - TABLE "concur_reindex_tab2" CONSTRAINT "concur_reindex_tab2_c1_fkey" FOREIGN KEY (c1) REFERENCES concur_reindex_tab(c1) - -DROP MATERIALIZED VIEW concur_reindex_matview; -DROP TABLE concur_reindex_tab, concur_reindex_tab2, concur_reindex_tab3; --- Check handling of invalid indexes -CREATE TABLE concur_reindex_tab4 (c1 int); -INSERT INTO concur_reindex_tab4 VALUES (1), (1), (2); --- This trick creates an invalid index. -CREATE UNIQUE INDEX CONCURRENTLY concur_reindex_ind5 ON concur_reindex_tab4 (c1); -ERROR: could not create unique index "concur_reindex_ind5" -DETAIL: Key (c1)=(1) is duplicated. --- Reindexing concurrently this index fails with the same failure. --- The extra index created is itself invalid, and can be dropped. -REINDEX INDEX CONCURRENTLY concur_reindex_ind5; -ERROR: could not create unique index "concur_reindex_ind5_ccnew" -DETAIL: Key (c1)=(1) is duplicated. -\d concur_reindex_tab4 - Table "public.concur_reindex_tab4" - Column | Type | Collation | Nullable | Default ---------+---------+-----------+----------+--------- - c1 | integer | | | -Indexes: - "concur_reindex_ind5" UNIQUE, btree (c1) INVALID - "concur_reindex_ind5_ccnew" UNIQUE, btree (c1) INVALID - -DROP INDEX concur_reindex_ind5_ccnew; --- This makes the previous failure go away, so the index can become valid. -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: 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" - Column | Type | Collation | Nullable | Default ---------+---------+-----------+----------+--------- - c1 | integer | | | -Indexes: - "concur_reindex_ind5" UNIQUE, btree (c1) INVALID - --- But it is fixed with REINDEX INDEX. -REINDEX INDEX CONCURRENTLY concur_reindex_ind5; -\d concur_reindex_tab4 - Table "public.concur_reindex_tab4" - Column | Type | Collation | Nullable | Default ---------+---------+-----------+----------+--------- - c1 | integer | | | -Indexes: - "concur_reindex_ind5" UNIQUE, btree (c1) - -DROP TABLE concur_reindex_tab4; --- Check handling of indexes with expressions and predicates. The --- definitions of the rebuilt indexes should match the original --- definitions. -CREATE TABLE concur_exprs_tab (c1 int , c2 boolean); -INSERT INTO concur_exprs_tab (c1, c2) VALUES (1369652450, FALSE), - (414515746, TRUE), - (897778963, FALSE); -CREATE UNIQUE INDEX concur_exprs_index_expr - ON concur_exprs_tab ((c1::text COLLATE "C")); -CREATE UNIQUE INDEX concur_exprs_index_pred ON concur_exprs_tab (c1) - WHERE (c1::text > 500000000::text COLLATE "C"); -CREATE UNIQUE INDEX concur_exprs_index_pred_2 - ON concur_exprs_tab ((1 / c1)) - WHERE ('-H') >= (c2::TEXT) COLLATE "C"; -ALTER INDEX concur_exprs_index_expr ALTER COLUMN 1 SET STATISTICS 100; -ANALYZE concur_exprs_tab; -SELECT starelid::regclass, count(*) FROM pg_statistic WHERE starelid IN ( - 'concur_exprs_index_expr'::regclass, - 'concur_exprs_index_pred'::regclass, - 'concur_exprs_index_pred_2'::regclass) - GROUP BY starelid ORDER BY starelid::regclass::text; - starelid | count --------------------------+------- - concur_exprs_index_expr | 1 -(1 row) - -SELECT pg_get_indexdef('concur_exprs_index_expr'::regclass); - pg_get_indexdef ---------------------------------------------------------------------------------------------------------------- - CREATE UNIQUE INDEX concur_exprs_index_expr ON public.concur_exprs_tab USING btree (((c1)::text) COLLATE "C") -(1 row) - -SELECT pg_get_indexdef('concur_exprs_index_pred'::regclass); - pg_get_indexdef ----------------------------------------------------------------------------------------------------------------------------------------------- - CREATE UNIQUE INDEX concur_exprs_index_pred ON public.concur_exprs_tab USING btree (c1) WHERE ((c1)::text > ((500000000)::text COLLATE "C")) -(1 row) - -SELECT pg_get_indexdef('concur_exprs_index_pred_2'::regclass); - pg_get_indexdef --------------------------------------------------------------------------------------------------------------------------------------------------- - CREATE UNIQUE INDEX concur_exprs_index_pred_2 ON public.concur_exprs_tab USING btree (((1 / c1))) WHERE ('-H'::text >= ((c2)::text COLLATE "C")) -(1 row) - -REINDEX TABLE CONCURRENTLY concur_exprs_tab; -SELECT pg_get_indexdef('concur_exprs_index_expr'::regclass); - pg_get_indexdef ---------------------------------------------------------------------------------------------------------------- - CREATE UNIQUE INDEX concur_exprs_index_expr ON public.concur_exprs_tab USING btree (((c1)::text) COLLATE "C") -(1 row) - -SELECT pg_get_indexdef('concur_exprs_index_pred'::regclass); - pg_get_indexdef ----------------------------------------------------------------------------------------------------------------------------------------------- - CREATE UNIQUE INDEX concur_exprs_index_pred ON public.concur_exprs_tab USING btree (c1) WHERE ((c1)::text > ((500000000)::text COLLATE "C")) -(1 row) - -SELECT pg_get_indexdef('concur_exprs_index_pred_2'::regclass); - pg_get_indexdef --------------------------------------------------------------------------------------------------------------------------------------------------- - CREATE UNIQUE INDEX concur_exprs_index_pred_2 ON public.concur_exprs_tab USING btree (((1 / c1))) WHERE ('-H'::text >= ((c2)::text COLLATE "C")) -(1 row) - --- ALTER TABLE recreates the indexes, which should keep their collations. -ALTER TABLE concur_exprs_tab ALTER c2 TYPE TEXT; -SELECT pg_get_indexdef('concur_exprs_index_expr'::regclass); - pg_get_indexdef ---------------------------------------------------------------------------------------------------------------- - CREATE UNIQUE INDEX concur_exprs_index_expr ON public.concur_exprs_tab USING btree (((c1)::text) COLLATE "C") -(1 row) - -SELECT pg_get_indexdef('concur_exprs_index_pred'::regclass); - pg_get_indexdef ----------------------------------------------------------------------------------------------------------------------------------------------- - CREATE UNIQUE INDEX concur_exprs_index_pred ON public.concur_exprs_tab USING btree (c1) WHERE ((c1)::text > ((500000000)::text COLLATE "C")) -(1 row) - -SELECT pg_get_indexdef('concur_exprs_index_pred_2'::regclass); - pg_get_indexdef ------------------------------------------------------------------------------------------------------------------------------------------- - CREATE UNIQUE INDEX concur_exprs_index_pred_2 ON public.concur_exprs_tab USING btree (((1 / c1))) WHERE ('-H'::text >= (c2 COLLATE "C")) -(1 row) - --- Statistics should remain intact. -SELECT starelid::regclass, count(*) FROM pg_statistic WHERE starelid IN ( - 'concur_exprs_index_expr'::regclass, - 'concur_exprs_index_pred'::regclass, - 'concur_exprs_index_pred_2'::regclass) - GROUP BY starelid ORDER BY starelid::regclass::text; - starelid | count --------------------------+------- - concur_exprs_index_expr | 1 -(1 row) - --- attstattarget should remain intact -SELECT attrelid::regclass, attnum, attstattarget - FROM pg_attribute WHERE attrelid IN ( - 'concur_exprs_index_expr'::regclass, - 'concur_exprs_index_pred'::regclass, - 'concur_exprs_index_pred_2'::regclass) - ORDER BY attrelid::regclass::text, attnum; - attrelid | attnum | attstattarget ----------------------------+--------+--------------- - concur_exprs_index_expr | 1 | 100 - concur_exprs_index_pred | 1 | - concur_exprs_index_pred_2 | 1 | -(3 rows) - -DROP TABLE concur_exprs_tab; --- Temporary tables and on-commit actions, where CONCURRENTLY is ignored. --- ON COMMIT PRESERVE ROWS, the default. -CREATE TEMP TABLE concur_temp_tab_1 (c1 int, c2 text) - ON COMMIT PRESERVE ROWS; -INSERT INTO concur_temp_tab_1 VALUES (1, 'foo'), (2, 'bar'); -CREATE INDEX concur_temp_ind_1 ON concur_temp_tab_1(c2); -REINDEX TABLE CONCURRENTLY concur_temp_tab_1; -REINDEX INDEX CONCURRENTLY concur_temp_ind_1; --- Still fails in transaction blocks -BEGIN; -REINDEX INDEX CONCURRENTLY concur_temp_ind_1; -ERROR: REINDEX CONCURRENTLY cannot run inside a transaction block -COMMIT; --- ON COMMIT DELETE ROWS -CREATE TEMP TABLE concur_temp_tab_2 (c1 int, c2 text) - ON COMMIT DELETE ROWS; -CREATE INDEX concur_temp_ind_2 ON concur_temp_tab_2(c2); -REINDEX TABLE CONCURRENTLY concur_temp_tab_2; -REINDEX INDEX CONCURRENTLY concur_temp_ind_2; --- ON COMMIT DROP -BEGIN; -CREATE TEMP TABLE concur_temp_tab_3 (c1 int, c2 text) - ON COMMIT PRESERVE ROWS; -INSERT INTO concur_temp_tab_3 VALUES (1, 'foo'), (2, 'bar'); -CREATE INDEX concur_temp_ind_3 ON concur_temp_tab_3(c2); --- Fails when running in a transaction -REINDEX INDEX CONCURRENTLY concur_temp_ind_3; -ERROR: REINDEX CONCURRENTLY cannot run inside a transaction block -COMMIT; --- REINDEX SCHEMA processes all temporary relations -CREATE TABLE reindex_temp_before AS -SELECT oid, relname, relfilenode, relkind, reltoastrelid - FROM pg_class - WHERE relname IN ('concur_temp_ind_1', 'concur_temp_ind_2'); -SELECT pg_my_temp_schema()::regnamespace as temp_schema_name \gset -REINDEX SCHEMA CONCURRENTLY :temp_schema_name; -SELECT b.relname, - b.relkind, - CASE WHEN a.relfilenode = b.relfilenode THEN 'relfilenode is unchanged' - ELSE 'relfilenode has changed' END - FROM reindex_temp_before b JOIN pg_class a ON b.oid = a.oid - ORDER BY 1; - relname | relkind | case --------------------+---------+------------------------- - concur_temp_ind_1 | i | relfilenode has changed - concur_temp_ind_2 | i | relfilenode has changed -(2 rows) - -DROP TABLE concur_temp_tab_1, concur_temp_tab_2, reindex_temp_before; --- --- REINDEX SCHEMA --- -REINDEX SCHEMA schema_to_reindex; -- failure, schema does not exist -ERROR: schema "schema_to_reindex" does not exist -CREATE SCHEMA schema_to_reindex; -SET search_path = 'schema_to_reindex'; -CREATE TABLE table1(col1 SERIAL PRIMARY KEY); -INSERT INTO table1 SELECT generate_series(1,400); -CREATE TABLE table2(col1 SERIAL PRIMARY KEY, col2 TEXT NOT NULL); -INSERT INTO table2 SELECT generate_series(1,400), 'abc'; -CREATE INDEX ON table2(col2); -CREATE MATERIALIZED VIEW matview AS SELECT col1 FROM table2; -CREATE INDEX ON matview(col1); -CREATE VIEW view AS SELECT col2 FROM table2; -CREATE TABLE reindex_before AS -SELECT oid, relname, relfilenode, relkind, reltoastrelid - FROM pg_class - where relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'schema_to_reindex'); -INSERT INTO reindex_before -SELECT oid, 'pg_toast_TABLE', relfilenode, relkind, reltoastrelid -FROM pg_class WHERE oid IN - (SELECT reltoastrelid FROM reindex_before WHERE reltoastrelid > 0); -INSERT INTO reindex_before -SELECT oid, 'pg_toast_TABLE_index', relfilenode, relkind, reltoastrelid -FROM pg_class where oid in - (select indexrelid from pg_index where indrelid in - (select reltoastrelid from reindex_before where reltoastrelid > 0)); -REINDEX SCHEMA schema_to_reindex; -CREATE TABLE reindex_after AS SELECT oid, relname, relfilenode, relkind - FROM pg_class - where relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'schema_to_reindex'); -SELECT b.relname, - b.relkind, - CASE WHEN a.relfilenode = b.relfilenode THEN 'relfilenode is unchanged' - ELSE 'relfilenode has changed' END - FROM reindex_before b JOIN pg_class a ON b.oid = a.oid - ORDER BY 1; - relname | relkind | case -----------------------+---------+-------------------------- - matview | m | relfilenode is unchanged - matview_col1_idx | i | relfilenode has changed - pg_toast_TABLE | t | relfilenode is unchanged - pg_toast_TABLE_index | i | relfilenode has changed - table1 | r | relfilenode is unchanged - table1_col1_seq | S | relfilenode is unchanged - table1_pkey | i | relfilenode has changed - table2 | r | relfilenode is unchanged - table2_col1_seq | S | relfilenode is unchanged - table2_col2_idx | i | relfilenode has changed - table2_pkey | i | relfilenode has changed - view | v | relfilenode is unchanged -(12 rows) - -REINDEX SCHEMA schema_to_reindex; -BEGIN; -REINDEX SCHEMA schema_to_reindex; -- failure, cannot run in a transaction -ERROR: REINDEX SCHEMA cannot run inside a transaction block -END; --- concurrently -REINDEX SCHEMA CONCURRENTLY schema_to_reindex; --- Failure for unauthorized user -CREATE ROLE regress_reindexuser NOLOGIN; -SET SESSION ROLE regress_reindexuser; -REINDEX SCHEMA schema_to_reindex; -ERROR: must be owner of schema schema_to_reindex --- Permission failures with toast tables and indexes (pg_authid here) -RESET ROLE; -GRANT USAGE ON SCHEMA pg_toast TO regress_reindexuser; -SET SESSION ROLE regress_reindexuser; -REINDEX TABLE pg_toast.pg_toast_1260; -ERROR: permission denied for table pg_toast_1260 -REINDEX INDEX pg_toast.pg_toast_1260_index; -ERROR: permission denied for index pg_toast_1260_index --- Clean up -RESET ROLE; -REVOKE USAGE ON SCHEMA pg_toast FROM regress_reindexuser; -DROP ROLE regress_reindexuser; -DROP SCHEMA schema_to_reindex CASCADE; -NOTICE: drop cascades to 6 other objects -DETAIL: drop cascades to table table1 -drop cascades to table table2 -drop cascades to materialized view matview -drop cascades to view view -drop cascades to table reindex_before -drop cascades to table reindex_after diff --git a/src/test/regress/expected/create_index_2.out b/src/test/regress/expected/create_index_2.out deleted file mode 100644 index f29407adc69c9..0000000000000 --- a/src/test/regress/expected/create_index_2.out +++ /dev/null @@ -1,3000 +0,0 @@ --- --- CREATE_INDEX --- Create ancillary data structures (i.e. indices) --- --- directory paths are passed to us in environment variables -\getenv abs_srcdir PG_ABS_SRCDIR --- --- BTREE --- -CREATE INDEX onek_unique1 ON onek USING btree(unique1 int4_ops); -CREATE INDEX IF NOT EXISTS onek_unique1 ON onek USING btree(unique1 int4_ops); -NOTICE: relation "onek_unique1" already exists, skipping -CREATE INDEX IF NOT EXISTS ON onek USING btree(unique1 int4_ops); -ERROR: syntax error at or near "ON" -LINE 1: CREATE INDEX IF NOT EXISTS ON onek USING btree(unique1 int4_... - ^ -CREATE INDEX onek_unique2 ON onek USING btree(unique2 int4_ops); -CREATE INDEX onek_hundred ON onek USING btree(hundred int4_ops); -CREATE INDEX onek_stringu1 ON onek USING btree(stringu1 name_ops); -CREATE INDEX tenk1_unique1 ON tenk1 USING btree(unique1 int4_ops); -CREATE INDEX tenk1_unique2 ON tenk1 USING btree(unique2 int4_ops); -CREATE INDEX tenk1_hundred ON tenk1 USING btree(hundred int4_ops); -CREATE INDEX tenk1_thous_tenthous ON tenk1 (thousand, tenthous); -CREATE INDEX tenk2_unique1 ON tenk2 USING btree(unique1 int4_ops); -CREATE INDEX tenk2_unique2 ON tenk2 USING btree(unique2 int4_ops); -CREATE INDEX tenk2_hundred ON tenk2 USING btree(hundred int4_ops); -CREATE INDEX rix ON road USING btree (name text_ops); -CREATE INDEX iix ON ihighway USING btree (name text_ops); -CREATE INDEX six ON shighway USING btree (name text_ops); --- test comments -COMMENT ON INDEX six_wrong IS 'bad index'; -ERROR: relation "six_wrong" does not exist -COMMENT ON INDEX six IS 'good index'; -COMMENT ON INDEX six IS NULL; --- --- BTREE partial indices --- -CREATE INDEX onek2_u1_prtl ON onek2 USING btree(unique1 int4_ops) - where unique1 < 20 or unique1 > 980; -CREATE INDEX onek2_u2_prtl ON onek2 USING btree(unique2 int4_ops) - where stringu1 < 'B'; -CREATE INDEX onek2_stu1_prtl ON onek2 USING btree(stringu1 name_ops) - where onek2.stringu1 >= 'J' and onek2.stringu1 < 'K'; --- --- GiST (rtree-equivalent opclasses only) --- -CREATE TABLE slow_emp4000 ( - home_base box -); -CREATE TABLE fast_emp4000 ( - home_base box -); -\set filename :abs_srcdir '/data/rect.data' -COPY slow_emp4000 FROM :'filename'; -INSERT INTO fast_emp4000 SELECT * FROM slow_emp4000; -ANALYZE slow_emp4000; -ANALYZE fast_emp4000; -CREATE INDEX grect2ind ON fast_emp4000 USING gist (home_base); --- we want to work with a point_tbl that includes a null -CREATE TEMP TABLE point_tbl AS SELECT * FROM public.point_tbl; -INSERT INTO POINT_TBL(f1) VALUES (NULL); -CREATE INDEX gpointind ON point_tbl USING gist (f1); -CREATE TEMP TABLE gpolygon_tbl AS - SELECT polygon(home_base) AS f1 FROM slow_emp4000; -INSERT INTO gpolygon_tbl VALUES ( '(1000,0,0,1000)' ); -INSERT INTO gpolygon_tbl VALUES ( '(0,1000,1000,1000)' ); -CREATE TEMP TABLE gcircle_tbl AS - SELECT circle(home_base) AS f1 FROM slow_emp4000; -CREATE INDEX ggpolygonind ON gpolygon_tbl USING gist (f1); -CREATE INDEX ggcircleind ON gcircle_tbl USING gist (f1); --- --- Test GiST indexes --- --- get non-indexed results for comparison purposes -SET enable_seqscan = ON; -SET enable_indexscan = OFF; -SET enable_bitmapscan = OFF; -SELECT * FROM fast_emp4000 - WHERE home_base <@ '(200,200),(2000,1000)'::box - ORDER BY (home_base[0])[0]; - home_base ------------------------ - (337,455),(240,359) - (1444,403),(1346,344) -(2 rows) - -SELECT count(*) FROM fast_emp4000 WHERE home_base && '(1000,1000,0,0)'::box; - count -------- - 2 -(1 row) - -SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; - count -------- - 278 -(1 row) - -SELECT count(*) FROM gpolygon_tbl WHERE f1 && '(1000,1000,0,0)'::polygon; - count -------- - 2 -(1 row) - -SELECT count(*) FROM gcircle_tbl WHERE f1 && '<(500,500),500>'::circle; - count -------- - 2 -(1 row) - -SELECT count(*) FROM point_tbl WHERE f1 <@ box '(0,0,100,100)'; - count -------- - 3 -(1 row) - -SELECT count(*) FROM point_tbl WHERE box '(0,0,100,100)' @> f1; - count -------- - 3 -(1 row) - -SELECT count(*) FROM point_tbl WHERE f1 <@ polygon '(0,0),(0,100),(100,100),(50,50),(100,0),(0,0)'; - count -------- - 5 -(1 row) - -SELECT count(*) FROM point_tbl WHERE f1 <@ circle '<(50,50),50>'; - count -------- - 1 -(1 row) - -SELECT count(*) FROM point_tbl p WHERE p.f1 << '(0.0, 0.0)'; - count -------- - 3 -(1 row) - -SELECT count(*) FROM point_tbl p WHERE p.f1 >> '(0.0, 0.0)'; - count -------- - 4 -(1 row) - -SELECT count(*) FROM point_tbl p WHERE p.f1 <<| '(0.0, 0.0)'; - count -------- - 1 -(1 row) - -SELECT count(*) FROM point_tbl p WHERE p.f1 |>> '(0.0, 0.0)'; - count -------- - 5 -(1 row) - -SELECT count(*) FROM point_tbl p WHERE p.f1 ~= '(-5, -12)'; - count -------- - 1 -(1 row) - -SELECT * FROM point_tbl ORDER BY f1 <-> '0,1'; - f1 -------------------- - (0,0) - (1e-300,-1e-300) - (-3,4) - (-10,0) - (10,10) - (-5,-12) - (5.1,34.5) - (Infinity,1e+300) - (1e+300,Infinity) - (NaN,NaN) - -(11 rows) - -SELECT * FROM point_tbl WHERE f1 IS NULL; - f1 ----- - -(1 row) - -SELECT * FROM point_tbl WHERE f1 IS NOT NULL ORDER BY f1 <-> '0,1'; - f1 -------------------- - (0,0) - (1e-300,-1e-300) - (-3,4) - (-10,0) - (10,10) - (-5,-12) - (5.1,34.5) - (1e+300,Infinity) - (Infinity,1e+300) - (NaN,NaN) -(10 rows) - -SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; - f1 ------------------- - (0,0) - (1e-300,-1e-300) - (-3,4) - (-10,0) - (10,10) -(5 rows) - -SELECT * FROM gpolygon_tbl ORDER BY f1 <-> '(0,0)'::point LIMIT 10; - f1 -------------------------------------------------- - ((240,359),(240,455),(337,455),(337,359)) - ((662,163),(662,187),(759,187),(759,163)) - ((1000,0),(0,1000)) - ((0,1000),(1000,1000)) - ((1346,344),(1346,403),(1444,403),(1444,344)) - ((278,1409),(278,1457),(369,1457),(369,1409)) - ((907,1156),(907,1201),(948,1201),(948,1156)) - ((1517,971),(1517,1043),(1594,1043),(1594,971)) - ((175,1820),(175,1850),(259,1850),(259,1820)) - ((2424,81),(2424,160),(2424,160),(2424,81)) -(10 rows) - -SELECT circle_center(f1), round(radius(f1)) as radius FROM gcircle_tbl ORDER BY f1 <-> '(200,300)'::point LIMIT 10; - circle_center | radius -----------------+-------- - (288.5,407) | 68 - (710.5,175) | 50 - (323.5,1433) | 51 - (927.5,1178.5) | 30 - (1395,373.5) | 57 - (1555.5,1007) | 53 - (217,1835) | 45 - (489,2421.5) | 22 - (2424,120.5) | 40 - (751.5,2655) | 20 -(10 rows) - --- Now check the results from plain indexscan -SET enable_seqscan = OFF; -SET enable_indexscan = ON; -SET enable_bitmapscan = OFF; -EXPLAIN (COSTS OFF) -SELECT * FROM fast_emp4000 - WHERE home_base <@ '(200,200),(2000,1000)'::box - ORDER BY (home_base[0])[0]; - QUERY PLAN ------------------------------------------------------------------ - Sort - Sort Key: ((home_base[0])[0]) - -> Index Only Scan using grect2ind on fast_emp4000 - Index Cond: (home_base <@ '(2000,1000),(200,200)'::box) -(4 rows) - -SELECT * FROM fast_emp4000 - WHERE home_base <@ '(200,200),(2000,1000)'::box - ORDER BY (home_base[0])[0]; - home_base ------------------------ - (337,455),(240,359) - (1444,403),(1346,344) -(2 rows) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM fast_emp4000 WHERE home_base && '(1000,1000,0,0)'::box; - QUERY PLAN -------------------------------------------------------------- - Aggregate - -> Index Only Scan using grect2ind on fast_emp4000 - Index Cond: (home_base && '(1000,1000),(0,0)'::box) -(3 rows) - -SELECT count(*) FROM fast_emp4000 WHERE home_base && '(1000,1000,0,0)'::box; - count -------- - 2 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; - QUERY PLAN -------------------------------------------------------- - Aggregate - -> Index Only Scan using grect2ind on fast_emp4000 - Index Cond: (home_base IS NULL) -(3 rows) - -SELECT count(*) FROM fast_emp4000 WHERE home_base IS NULL; - count -------- - 278 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM gpolygon_tbl WHERE f1 && '(1000,1000,0,0)'::polygon; - QUERY PLAN ------------------------------------------------------------- - Aggregate - -> Index Scan using ggpolygonind on gpolygon_tbl - Index Cond: (f1 && '((1000,1000),(0,0))'::polygon) -(3 rows) - -SELECT count(*) FROM gpolygon_tbl WHERE f1 && '(1000,1000,0,0)'::polygon; - count -------- - 2 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM gcircle_tbl WHERE f1 && '<(500,500),500>'::circle; - QUERY PLAN -------------------------------------------------------- - Aggregate - -> Index Scan using ggcircleind on gcircle_tbl - Index Cond: (f1 && '<(500,500),500>'::circle) -(3 rows) - -SELECT count(*) FROM gcircle_tbl WHERE f1 && '<(500,500),500>'::circle; - count -------- - 2 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM point_tbl WHERE f1 <@ box '(0,0,100,100)'; - QUERY PLAN ----------------------------------------------------- - Aggregate - -> Index Only Scan using gpointind on point_tbl - Index Cond: (f1 <@ '(100,100),(0,0)'::box) -(3 rows) - -SELECT count(*) FROM point_tbl WHERE f1 <@ box '(0,0,100,100)'; - count -------- - 3 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM point_tbl WHERE box '(0,0,100,100)' @> f1; - QUERY PLAN ----------------------------------------------------- - Aggregate - -> Index Only Scan using gpointind on point_tbl - Index Cond: (f1 <@ '(100,100),(0,0)'::box) -(3 rows) - -SELECT count(*) FROM point_tbl WHERE box '(0,0,100,100)' @> f1; - count -------- - 3 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM point_tbl WHERE f1 <@ polygon '(0,0),(0,100),(100,100),(50,50),(100,0),(0,0)'; - QUERY PLAN ----------------------------------------------------------------------------------------- - Aggregate - -> Index Only Scan using gpointind on point_tbl - Index Cond: (f1 <@ '((0,0),(0,100),(100,100),(50,50),(100,0),(0,0))'::polygon) -(3 rows) - -SELECT count(*) FROM point_tbl WHERE f1 <@ polygon '(0,0),(0,100),(100,100),(50,50),(100,0),(0,0)'; - count -------- - 4 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM point_tbl WHERE f1 <@ circle '<(50,50),50>'; - QUERY PLAN ----------------------------------------------------- - Aggregate - -> Index Only Scan using gpointind on point_tbl - Index Cond: (f1 <@ '<(50,50),50>'::circle) -(3 rows) - -SELECT count(*) FROM point_tbl WHERE f1 <@ circle '<(50,50),50>'; - count -------- - 1 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM point_tbl p WHERE p.f1 << '(0.0, 0.0)'; - QUERY PLAN ------------------------------------------------------- - Aggregate - -> Index Only Scan using gpointind on point_tbl p - Index Cond: (f1 << '(0,0)'::point) -(3 rows) - -SELECT count(*) FROM point_tbl p WHERE p.f1 << '(0.0, 0.0)'; - count -------- - 3 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM point_tbl p WHERE p.f1 >> '(0.0, 0.0)'; - QUERY PLAN ------------------------------------------------------- - Aggregate - -> Index Only Scan using gpointind on point_tbl p - Index Cond: (f1 >> '(0,0)'::point) -(3 rows) - -SELECT count(*) FROM point_tbl p WHERE p.f1 >> '(0.0, 0.0)'; - count -------- - 4 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM point_tbl p WHERE p.f1 <<| '(0.0, 0.0)'; - QUERY PLAN ------------------------------------------------------- - Aggregate - -> Index Only Scan using gpointind on point_tbl p - Index Cond: (f1 <<| '(0,0)'::point) -(3 rows) - -SELECT count(*) FROM point_tbl p WHERE p.f1 <<| '(0.0, 0.0)'; - count -------- - 1 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM point_tbl p WHERE p.f1 |>> '(0.0, 0.0)'; - QUERY PLAN ------------------------------------------------------- - Aggregate - -> Index Only Scan using gpointind on point_tbl p - Index Cond: (f1 |>> '(0,0)'::point) -(3 rows) - -SELECT count(*) FROM point_tbl p WHERE p.f1 |>> '(0.0, 0.0)'; - count -------- - 5 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM point_tbl p WHERE p.f1 ~= '(-5, -12)'; - QUERY PLAN ------------------------------------------------------- - Aggregate - -> Index Only Scan using gpointind on point_tbl p - Index Cond: (f1 ~= '(-5,-12)'::point) -(3 rows) - -SELECT count(*) FROM point_tbl p WHERE p.f1 ~= '(-5, -12)'; - count -------- - 1 -(1 row) - -EXPLAIN (COSTS OFF) -SELECT * FROM point_tbl ORDER BY f1 <-> '0,1'; - QUERY PLAN ----------------------------------------------- - Index Only Scan using gpointind on point_tbl - Order By: (f1 <-> '(0,1)'::point) -(2 rows) - -SELECT * FROM point_tbl ORDER BY f1 <-> '0,1'; - f1 -------------------- - (1e-300,-1e-300) - (0,0) - (-3,4) - (-10,0) - (10,10) - (-5,-12) - (5.1,34.5) - (Infinity,1e+300) - (1e+300,Infinity) - (NaN,NaN) - -(11 rows) - -EXPLAIN (COSTS OFF) -SELECT * FROM point_tbl WHERE f1 IS NULL; - QUERY PLAN ----------------------------------------------- - Index Only Scan using gpointind on point_tbl - Index Cond: (f1 IS NULL) -(2 rows) - -SELECT * FROM point_tbl WHERE f1 IS NULL; - f1 ----- - -(1 row) - -EXPLAIN (COSTS OFF) -SELECT * FROM point_tbl WHERE f1 IS NOT NULL ORDER BY f1 <-> '0,1'; - QUERY PLAN ----------------------------------------------- - Index Only Scan using gpointind on point_tbl - Index Cond: (f1 IS NOT NULL) - Order By: (f1 <-> '(0,1)'::point) -(3 rows) - -SELECT * FROM point_tbl WHERE f1 IS NOT NULL ORDER BY f1 <-> '0,1'; - f1 -------------------- - (1e-300,-1e-300) - (0,0) - (-3,4) - (-10,0) - (10,10) - (-5,-12) - (5.1,34.5) - (Infinity,1e+300) - (1e+300,Infinity) - (NaN,NaN) -(10 rows) - -EXPLAIN (COSTS OFF) -SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; - QUERY PLAN ------------------------------------------------- - Index Only Scan using gpointind on point_tbl - Index Cond: (f1 <@ '(10,10),(-10,-10)'::box) - Order By: (f1 <-> '(0,1)'::point) -(3 rows) - -SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; - f1 ------------------- - (1e-300,-1e-300) - (0,0) - (-3,4) - (-10,0) - (10,10) -(5 rows) - -EXPLAIN (COSTS OFF) -SELECT * FROM gpolygon_tbl ORDER BY f1 <-> '(0,0)'::point LIMIT 10; - QUERY PLAN ------------------------------------------------------ - Limit - -> Index Scan using ggpolygonind on gpolygon_tbl - Order By: (f1 <-> '(0,0)'::point) -(3 rows) - -SELECT * FROM gpolygon_tbl ORDER BY f1 <-> '(0,0)'::point LIMIT 10; - f1 -------------------------------------------------- - ((240,359),(240,455),(337,455),(337,359)) - ((662,163),(662,187),(759,187),(759,163)) - ((1000,0),(0,1000)) - ((0,1000),(1000,1000)) - ((1346,344),(1346,403),(1444,403),(1444,344)) - ((278,1409),(278,1457),(369,1457),(369,1409)) - ((907,1156),(907,1201),(948,1201),(948,1156)) - ((1517,971),(1517,1043),(1594,1043),(1594,971)) - ((175,1820),(175,1850),(259,1850),(259,1820)) - ((2424,81),(2424,160),(2424,160),(2424,81)) -(10 rows) - -EXPLAIN (COSTS OFF) -SELECT circle_center(f1), round(radius(f1)) as radius FROM gcircle_tbl ORDER BY f1 <-> '(200,300)'::point LIMIT 10; - QUERY PLAN ---------------------------------------------------- - Limit - -> Index Scan using ggcircleind on gcircle_tbl - Order By: (f1 <-> '(200,300)'::point) -(3 rows) - -SELECT circle_center(f1), round(radius(f1)) as radius FROM gcircle_tbl ORDER BY f1 <-> '(200,300)'::point LIMIT 10; - circle_center | radius -----------------+-------- - (288.5,407) | 68 - (710.5,175) | 50 - (323.5,1433) | 51 - (927.5,1178.5) | 30 - (1395,373.5) | 57 - (1555.5,1007) | 53 - (217,1835) | 45 - (489,2421.5) | 22 - (2424,120.5) | 40 - (751.5,2655) | 20 -(10 rows) - -EXPLAIN (COSTS OFF) -SELECT point(x,x), (SELECT f1 FROM gpolygon_tbl ORDER BY f1 <-> point(x,x) LIMIT 1) as c FROM generate_series(0,10,1) x; - QUERY PLAN --------------------------------------------------------------------------------------------- - Function Scan on generate_series x - SubPlan 1 - -> Limit - -> Index Scan using ggpolygonind on gpolygon_tbl - Order By: (f1 <-> point((x.x)::double precision, (x.x)::double precision)) -(5 rows) - -SELECT point(x,x), (SELECT f1 FROM gpolygon_tbl ORDER BY f1 <-> point(x,x) LIMIT 1) as c FROM generate_series(0,10,1) x; - point | c ----------+------------------------------------------- - (0,0) | ((240,359),(240,455),(337,455),(337,359)) - (1,1) | ((240,359),(240,455),(337,455),(337,359)) - (2,2) | ((240,359),(240,455),(337,455),(337,359)) - (3,3) | ((240,359),(240,455),(337,455),(337,359)) - (4,4) | ((240,359),(240,455),(337,455),(337,359)) - (5,5) | ((240,359),(240,455),(337,455),(337,359)) - (6,6) | ((240,359),(240,455),(337,455),(337,359)) - (7,7) | ((240,359),(240,455),(337,455),(337,359)) - (8,8) | ((240,359),(240,455),(337,455),(337,359)) - (9,9) | ((240,359),(240,455),(337,455),(337,359)) - (10,10) | ((240,359),(240,455),(337,455),(337,359)) -(11 rows) - --- Now check the results from bitmap indexscan -SET enable_seqscan = OFF; -SET enable_indexscan = OFF; -SET enable_bitmapscan = ON; -EXPLAIN (COSTS OFF) -SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; - QUERY PLAN ------------------------------------------------------------- - Sort - Sort Key: ((f1 <-> '(0,1)'::point)) - -> Bitmap Heap Scan on point_tbl - Recheck Cond: (f1 <@ '(10,10),(-10,-10)'::box) - -> Bitmap Index Scan on gpointind - Index Cond: (f1 <@ '(10,10),(-10,-10)'::box) -(6 rows) - -SELECT * FROM point_tbl WHERE f1 <@ '(-10,-10),(10,10)':: box ORDER BY f1 <-> '0,1'; - f1 ------------------- - (0,0) - (1e-300,-1e-300) - (-3,4) - (-10,0) - (10,10) -(5 rows) - -RESET enable_seqscan; -RESET enable_indexscan; -RESET enable_bitmapscan; --- --- GIN over int[] and text[] --- --- Note: GIN currently supports only bitmap scans, not plain indexscans --- -CREATE TABLE array_index_op_test ( - seqno int4, - i int4[], - t text[] -); -\set filename :abs_srcdir '/data/array.data' -COPY array_index_op_test FROM :'filename'; -ANALYZE array_index_op_test; -SELECT * FROM array_index_op_test WHERE i = '{NULL}' ORDER BY seqno; - seqno | i | t --------+--------+-------- - 102 | {NULL} | {NULL} -(1 row) - -SELECT * FROM array_index_op_test WHERE i @> '{NULL}' ORDER BY seqno; - seqno | i | t --------+---+--- -(0 rows) - -SELECT * FROM array_index_op_test WHERE i && '{NULL}' ORDER BY seqno; - seqno | i | t --------+---+--- -(0 rows) - -SELECT * FROM array_index_op_test WHERE i <@ '{NULL}' ORDER BY seqno; - seqno | i | t --------+----+---- - 101 | {} | {} -(1 row) - -SET enable_seqscan = OFF; -SET enable_indexscan = OFF; -SET enable_bitmapscan = ON; -CREATE INDEX intarrayidx ON array_index_op_test USING gin (i); -explain (costs off) -SELECT * FROM array_index_op_test WHERE i @> '{32}' ORDER BY seqno; - QUERY PLAN ----------------------------------------------------- - Sort - Sort Key: seqno - -> Bitmap Heap Scan on array_index_op_test - Recheck Cond: (i @> '{32}'::integer[]) - -> Bitmap Index Scan on intarrayidx - Index Cond: (i @> '{32}'::integer[]) -(6 rows) - -SELECT * FROM array_index_op_test WHERE i @> '{32}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} - 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} -(6 rows) - -SELECT * FROM array_index_op_test WHERE i && '{32}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} - 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} -(6 rows) - -SELECT * FROM array_index_op_test WHERE i @> '{17}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} - 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} - 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} - 53 | {38,17} | {AAAAAAAAAAA21658} - 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} -(8 rows) - -SELECT * FROM array_index_op_test WHERE i && '{17}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} - 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} - 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} - 53 | {38,17} | {AAAAAAAAAAA21658} - 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} -(8 rows) - -SELECT * FROM array_index_op_test WHERE i @> '{32,17}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} -(3 rows) - -SELECT * FROM array_index_op_test WHERE i && '{32,17}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} - 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} - 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} - 53 | {38,17} | {AAAAAAAAAAA21658} - 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} - 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} - 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} -(11 rows) - -SELECT * FROM array_index_op_test WHERE i <@ '{38,34,32,89}' ORDER BY seqno; - seqno | i | t --------+---------------+---------------------------------------------------------------------------------------------------------------------------- - 40 | {34} | {AAAAAAAAAAAAAA10611,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAA31334,AAAAA70466,AAAAAAAA81587,AAAAAAA74623} - 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} - 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} - 101 | {} | {} -(4 rows) - -SELECT * FROM array_index_op_test WHERE i = '{47,77}' ORDER BY seqno; - seqno | i | t --------+---------+----------------------------------------------------------------------------------------------------------------- - 95 | {47,77} | {AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA74076,AAAAAAAAAA18107,AAAAA40681,AAAAAAAAAAAAAAA35875,AAAAA60038,AAAAAAA56483} -(1 row) - -SELECT * FROM array_index_op_test WHERE i = '{}' ORDER BY seqno; - seqno | i | t --------+----+---- - 101 | {} | {} -(1 row) - -SELECT * FROM array_index_op_test WHERE i @> '{}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - 1 | {92,75,71,52,64,83} | {AAAAAAAA44066,AAAAAA1059,AAAAAAAAAAA176,AAAAAAA48038} - 2 | {3,6} | {AAAAAA98232,AAAAAAAA79710,AAAAAAAAAAAAAAAAA69675,AAAAAAAAAAAAAAAA55798,AAAAAAAAA12793} - 3 | {37,64,95,43,3,41,13,30,11,43} | {AAAAAAAAAA48845,AAAAA75968,AAAAA95309,AAA54451,AAAAAAAAAA22292,AAAAAAA99836,A96617,AA17009,AAAAAAAAAAAAAA95246} - 4 | {71,39,99,55,33,75,45} | {AAAAAAAAA53663,AAAAAAAAAAAAAAA67062,AAAAAAAAAA64777,AAA99043,AAAAAAAAAAAAAAAAAAA91804,39557} - 5 | {50,42,77,50,4} | {AAAAAAAAAAAAAAAAA26540,AAAAAAA79710,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA176,AAAAA95309,AAAAAAAAAAA46154,AAAAAA66777,AAAAAAAAA27249,AAAAAAAAAA64777,AAAAAAAAAAAAAAAAAAA70104} - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 7 | {12,51,88,64,8} | {AAAAAAAAAAAAAAAAAA12591,AAAAAAAAAAAAAAAAA50407,AAAAAAAAAAAA67946} - 8 | {60,84} | {AAAAAAA81898,AAAAAA1059,AAAAAAAAAAAA81511,AAAAA961,AAAAAAAAAAAAAAAA31334,AAAAA64741,AA6416,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAAAA50407} - 9 | {56,52,35,27,80,44,81,22} | {AAAAAAAAAAAAAAA73034,AAAAAAAAAAAAA7929,AAAAAAA66161,AA88409,39557,A27153,AAAAAAAA9523,AAAAAAAAAAA99000} - 10 | {71,5,45} | {AAAAAAAAAAA21658,AAAAAAAAAAAA21089,AAA54451,AAAAAAAAAAAAAAAAAA54141,AAAAAAAAAAAAAA28620,AAAAAAAAAAA21658,AAAAAAAAAAA74076,AAAAAAAAA27249} - 11 | {41,86,74,48,22,74,47,50} | {AAAAAAAA9523,AAAAAAAAAAAA37562,AAAAAAAAAAAAAAAA14047,AAAAAAAAAAA46154,AAAA41702,AAAAAAAAAAAAAAAAA764,AAAAA62737,39557} - 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} - 13 | {3,52,34,23} | {AAAAAA98232,AAAA49534,AAAAAAAAAAA21658} - 14 | {78,57,19} | {AAAA8857,AAAAAAAAAAAAAAA73034,AAAAAAAA81587,AAAAAAAAAAAAAAA68526,AAAAA75968,AAAAAAAAAAAAAA65909,AAAAAAAAA10012,AAAAAAAAAAAAAA65909} - 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} - 16 | {14,63,85,11} | {AAAAAA66777} - 17 | {7,10,81,85} | {AAAAAA43678,AAAAAAA12144,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAAAAA15356} - 18 | {1} | {AAAAAAAAAAA33576,AAAAA95309,64261,AAA59323,AAAAAAAAAAAAAA95246,55847,AAAAAAAAAAAA67946,AAAAAAAAAAAAAAAAAA64374} - 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} - 20 | {72,89,70,51,54,37,8,49,79} | {AAAAAA58494} - 21 | {2,8,65,10,5,79,43} | {AAAAAAAAAAAAAAAAA88852,AAAAAAAAAAAAAAAAAAA91804,AAAAA64669,AAAAAAAAAAAAAAAA1443,AAAAAAAAAAAAAAAA23657,AAAAA12179,AAAAAAAAAAAAAAAAA88852,AAAAAAAAAAAAAAAA31334,AAAAAAAAAAAAAAAA41303,AAAAAAAAAAAAAAAAAAA85420} - 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} - 23 | {40,90,5,38,72,40,30,10,43,55} | {A6053,AAAAAAAAAAA6119,AA44673,AAAAAAAAAAAAAAAAA764,AA17009,AAAAA17383,AAAAA70514,AAAAA33250,AAAAA95309,AAAAAAAAAAAA37562} - 24 | {94,61,99,35,48} | {AAAAAAAAAAA50956,AAAAAAAAAAA15165,AAAA85070,AAAAAAAAAAAAAAA36627,AAAAA961,AAAAAAAAAA55219} - 25 | {31,1,10,11,27,79,38} | {AAAAAAAAAAAAAAAAAA59334,45449} - 26 | {71,10,9,69,75} | {47735,AAAAAAA21462,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAAAAA91804,AAAAAAAAA72121,AAAAAAAAAAAAAAAAAAA1205,AAAAA41597,AAAA8857,AAAAAAAAAAAAAAAAAAA15356,AA17009} - 27 | {94} | {AA6416,A6053,AAAAAAA21462,AAAAAAA57334,AAAAAAAAAAAAAAAAAA12591,AA88409,AAAAAAAAAAAAA70254} - 28 | {14,33,6,34,14} | {AAAAAAAAAAAAAAA13198,AAAAAAAA69452,AAAAAAAAAAA82945,AAAAAAA12144,AAAAAAAAA72121,AAAAAAAAAA18601} - 29 | {39,21} | {AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAAAAA38885,AAAA85070,AAAAAAAAAAAAAAAAAAA70104,AAAAA66674,AAAAAAAAAAAAA62007,AAAAAAAA69452,AAAAAAA1242,AAAAAAAAAAAAAAAA1729,AAAA35194} - 30 | {26,81,47,91,34} | {AAAAAAAAAAAAAAAAAAA70104,AAAAAAA80240} - 31 | {80,24,18,21,54} | {AAAAAAAAAAAAAAA13198,AAAAAAAAAAAAAAAAAAA70415,A27153,AAAAAAAAA53663,AAAAAAAAAAAAAAAAA50407,A68938} - 32 | {58,79,82,80,67,75,98,10,41} | {AAAAAAAAAAAAAAAAAA61286,AAA54451,AAAAAAAAAAAAAAAAAAA87527,A96617,51533} - 33 | {74,73} | {A85417,AAAAAAA56483,AAAAA17383,AAAAAAAAAAAAA62159,AAAAAAAAAAAA52814,AAAAAAAAAAAAA85723,AAAAAAAAAAAAAAAAAA55796} - 34 | {70,45} | {AAAAAAAAAAAAAAAAAA71621,AAAAAAAAAAAAAA28620,AAAAAAAAAA55219,AAAAAAAA23648,AAAAAAAAAA22292,AAAAAAA1242} - 35 | {23,40} | {AAAAAAAAAAAA52814,AAAA48949,AAAAAAAAA34727,AAAA8857,AAAAAAAAAAAAAAAAAAA62179,AAAAAAAAAAAAAAA68526,AAAAAAA99836,AAAAAAAA50094,AAAA91194,AAAAAAAAAAAAA73084} - 36 | {79,82,14,52,30,5,79} | {AAAAAAAAA53663,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA89194,AA88409,AAAAAAAAAAAAAAA81326,AAAAAAAAAAAAAAAAA63050,AAAAAAAAAAAAAAAA33598} - 37 | {53,11,81,39,3,78,58,64,74} | {AAAAAAAAAAAAAAAAAAA17075,AAAAAAA66161,AAAAAAAA23648,AAAAAAAAAAAAAA10611} - 38 | {59,5,4,95,28} | {AAAAAAAAAAA82945,A96617,47735,AAAAA12179,AAAAA64669,AAAAAA99807,AA74433,AAAAAAAAAAAAAAAAA59387} - 39 | {82,43,99,16,74} | {AAAAAAAAAAAAAAA67062,AAAAAAA57334,AAAAAAAAAAAAAA65909,A27153,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAA64777,AAAAAAAAAAAA81511,AAAAAAAAAAAAAA65909,AAAAAAAAAAAAAA28620} - 40 | {34} | {AAAAAAAAAAAAAA10611,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAA31334,AAAAA70466,AAAAAAAA81587,AAAAAAA74623} - 41 | {19,26,63,12,93,73,27,94} | {AAAAAAA79710,AAAAAAAAAA55219,AAAA41702,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA71621,AAAAAAAAAAAAAAAAA63050,AAAAAAA99836,AAAAAAAAAAAAAA8666} - 42 | {15,76,82,75,8,91} | {AAAAAAAAAAA176,AAAAAA38063,45449,AAAAAA54032,AAAAAAA81898,AA6416,AAAAAAAAAAAAAAAAAAA62179,45449,AAAAA60038,AAAAAAAA81587} - 43 | {39,87,91,97,79,28} | {AAAAAAAAAAA74076,A96617,AAAAAAAAAAAAAAAAAAA89194,AAAAAAAAAAAAAAAAAA55796,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAA67946} - 44 | {40,58,68,29,54} | {AAAAAAA81898,AAAAAA66777,AAAAAA98232} - 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} - 46 | {53,24} | {AAAAAAAAAAA53908,AAAAAA54032,AAAAA17383,AAAA48949,AAAAAAAAAA18601,AAAAA64669,45449,AAAAAAAAAAA98051,AAAAAAAAAAAAAAAAAA71621} - 47 | {98,23,64,12,75,61} | {AAA59323,AAAAA95309,AAAAAAAAAAAAAAAA31334,AAAAAAAAA27249,AAAAA17383,AAAAAAAAAAAA37562,AAAAAA1059,A84822,55847,AAAAA70466} - 48 | {76,14} | {AAAAAAAAAAAAA59671,AAAAAAAAAAAAAAAAAAA91804,AAAAAA66777,AAAAAAAAAAAAAAAAAAA89194,AAAAAAAAAAAAAAA36627,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAA73084,AAAAAAA79710,AAAAAAAAAAAAAAA40402,AAAAAAAAAAAAAAAAAAA65037} - 49 | {56,5,54,37,49} | {AA21643,AAAAAAAAAAA92631,AAAAAAAA81587} - 50 | {20,12,37,64,93} | {AAAAAAAAAA5483,AAAAAAAAAAAAAAAAAAA1205,AA6416,AAAAAAAAAAAAAAAAA63050,AAAAAAAAAAAAAAAAAA47955} - 51 | {47} | {AAAAAAAAAAAAAA96505,AAAAAAAAAAAAAAAAAA36842,AAAAA95309,AAAAAAAA81587,AA6416,AAAA91194,AAAAAA58494,AAAAAA1059,AAAAAAAA69452} - 52 | {89,0} | {AAAAAAAAAAAAAAAAAA47955,AAAAAAA48038,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAAAAA73084,AAAAA70466,AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA46154,AA66862} - 53 | {38,17} | {AAAAAAAAAAA21658} - 54 | {70,47} | {AAAAAAAAAAAAAAAAAA54141,AAAAA40681,AAAAAAA48038,AAAAAAAAAAAAAAAA29150,AAAAA41597,AAAAAAAAAAAAAAAAAA59334,AA15322} - 55 | {47,79,47,64,72,25,71,24,93} | {AAAAAAAAAAAAAAAAAA55796,AAAAA62737} - 56 | {33,7,60,54,93,90,77,85,39} | {AAAAAAAAAAAAAAAAAA32918,AA42406} - 57 | {23,45,10,42,36,21,9,96} | {AAAAAAAAAAAAAAAAAAA70415} - 58 | {92} | {AAAAAAAAAAAAAAAA98414,AAAAAAAA23648,AAAAAAAAAAAAAAAAAA55796,AA25381,AAAAAAAAAAA6119} - 59 | {9,69,46,77} | {39557,AAAAAAA89932,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAAAAAAAAA26540,AAA20874,AA6416,AAAAAAAAAAAAAAAAAA47955} - 60 | {62,2,59,38,89} | {AAAAAAA89932,AAAAAAAAAAAAAAAAAAA15356,AA99927,AA17009,AAAAAAAAAAAAAAA35875} - 61 | {72,2,44,95,54,54,13} | {AAAAAAAAAAAAAAAAAAA91804} - 62 | {83,72,29,73} | {AAAAAAAAAAAAA15097,AAAA8857,AAAAAAAAAAAA35809,AAAAAAAAAAAA52814,AAAAAAAAAAAAAAAAAAA38885,AAAAAAAAAAAAAAAAAA24183,AAAAAA43678,A96617} - 63 | {11,4,61,87} | {AAAAAAAAA27249,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAA13198,AAA20874,39557,51533,AAAAAAAAAAA53908,AAAAAAAAAAAAAA96505,AAAAAAAA78938} - 64 | {26,19,34,24,81,78} | {A96617,AAAAAAAAAAAAAAAAAAA70104,A68938,AAAAAAAAAAA53908,AAAAAAAAAAAAAAA453,AA17009,AAAAAAA80240} - 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} - 66 | {31,23,70,52,4,33,48,25} | {AAAAAAAAAAAAAAAAA69675,AAAAAAAA50094,AAAAAAAAAAA92631,AAAA35194,39557,AAAAAAA99836} - 67 | {31,94,7,10} | {AAAAAA38063,A96617,AAAA35194,AAAAAAAAAAAA67946} - 68 | {90,43,38} | {AA75092,AAAAAAAAAAAAAAAAA69675,AAAAAAAAAAA92631,AAAAAAAAA10012,AAAAAAAAAAAAA7929,AA21643} - 69 | {67,35,99,85,72,86,44} | {AAAAAAAAAAAAAAAAAAA1205,AAAAAAAA50094,AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAAAAAAA47955} - 70 | {56,70,83} | {AAAA41702,AAAAAAAAAAA82945,AA21643,AAAAAAAAAAA99000,A27153,AA25381,AAAAAAAAAAAAAA96505,AAAAAAA1242} - 71 | {74,26} | {AAAAAAAAAAA50956,AA74433,AAAAAAA21462,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAA36627,AAAAAAAAAAAAA70254,AAAAAAAAAA43419,39557} - 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} - 73 | {88,25,96,78,65,15,29,19} | {AAA54451,AAAAAAAAA27249,AAAAAAA9228,AAAAAAAAAAAAAAA67062,AAAAAAAAAAAAAAAAAAA70415,AAAAA17383,AAAAAAAAAAAAAAAA33598} - 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} - 75 | {12,96,83,24,71,89,55} | {AAAA48949,AAAAAAAA29716,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAAA67946,AAAAAAAAAAAAAAAA29150,AAA28075,AAAAAAAAAAAAAAAAA43052} - 76 | {92,55,10,7} | {AAAAAAAAAAAAAAA67062} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 78 | {55,89,44,84,34} | {AAAAAAAAAAA6119,AAAAAAAAAAAAAA8666,AA99927,AA42406,AAAAAAA81898,AAAAAAA9228,AAAAAAAAAAA92631,AA21643,AAAAAAAAAAAAAA28620} - 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} - 80 | {74,89,44,80,0} | {AAAA35194,AAAAAAAA79710,AAA20874,AAAAAAAAAAAAAAAAAAA70104,AAAAAAAAAAAAA73084,AAAAAAA57334,AAAAAAA9228,AAAAAAAAAAAAA62007} - 81 | {63,77,54,48,61,53,97} | {AAAAAAAAAAAAAAA81326,AAAAAAAAAA22292,AA25381,AAAAAAAAAAA74076,AAAAAAA81898,AAAAAAAAA72121} - 82 | {34,60,4,79,78,16,86,89,42,50} | {AAAAA40681,AAAAAAAAAAAAAAAAAA12591,AAAAAAA80240,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA70104} - 83 | {14,10} | {AAAAAAAAAA22292,AAAAAAAAAAAAA70254,AAAAAAAAAAA6119} - 84 | {11,83,35,13,96,94} | {AAAAA95309,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAAAAA24183} - 85 | {39,60} | {AAAAAAAAAAAAAAAA55798,AAAAAAAAAA22292,AAAAAAA66161,AAAAAAA21462,AAAAAAAAAAAAAAAAAA12591,55847,AAAAAA98232,AAAAAAAAAAA46154} - 86 | {33,81,72,74,45,36,82} | {AAAAAAAA81587,AAAAAAAAAAAAAA96505,45449,AAAA80176} - 87 | {57,27,50,12,97,68} | {AAAAAAAAAAAAAAAAA26540,AAAAAAAAA10012,AAAAAAAAAAAA35809,AAAAAAAAAAAAAAAA29150,AAAAAAAAAAA82945,AAAAAA66777,31228,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAA96505} - 88 | {41,90,77,24,6,24} | {AAAA35194,AAAA35194,AAAAAAA80240,AAAAAAAAAAA46154,AAAAAA58494,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA59334,AAAAAAAAAAAAAAAAAAA91804,AA74433} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} - 90 | {88,75} | {AAAAA60038,AAAAAAAA23648,AAAAAAAAAAA99000,AAAA41702,AAAAAAAAAAAAA22860,AAAAAAAAAAAAAAA68526} - 91 | {78} | {AAAAAAAAAAAAA62007,AAA99043} - 92 | {85,63,49,45} | {AAAAAAA89932,AAAAAAAAAAAAA22860,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAAA21089} - 93 | {11} | {AAAAAAAAAAA176,AAAAAAAAAAAAAA8666,AAAAAAAAAAAAAAA453,AAAAAAAAAAAAA85723,A68938,AAAAAAAAAAAAA9821,AAAAAAA48038,AAAAAAAAAAAAAAAAA59387,AA99927,AAAAA17383} - 94 | {98,9,85,62,88,91,60,61,38,86} | {AAAAAAAA81587,AAAAA17383,AAAAAAAA81587} - 95 | {47,77} | {AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA74076,AAAAAAAAAA18107,AAAAA40681,AAAAAAAAAAAAAAA35875,AAAAA60038,AAAAAAA56483} - 96 | {23,97,43} | {AAAAAAAAAA646,A87088} - 97 | {54,2,86,65} | {47735,AAAAAAA99836,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAA29150,AAAAAAA80240,AAAAAAAAAAAAAAAA98414,AAAAAAA56483,AAAAAAAAAAAAAAAA29150,AAAAAAA39692,AA21643} - 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} - 99 | {37,86} | {AAAAAAAAAAAAAAAAAA32918,AAAAA70514,AAAAAAAAA10012,AAAAAAAAAAAAAAAAA59387,AAAAAAAAAA64777,AAAAAAAAAAAAAAAAAAA15356} - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} - 101 | {} | {} - 102 | {NULL} | {NULL} -(102 rows) - -SELECT * FROM array_index_op_test WHERE i && '{}' ORDER BY seqno; - seqno | i | t --------+---+--- -(0 rows) - -SELECT * FROM array_index_op_test WHERE i <@ '{}' ORDER BY seqno; - seqno | i | t --------+----+---- - 101 | {} | {} -(1 row) - -CREATE INDEX textarrayidx ON array_index_op_test USING gin (t); -explain (costs off) -SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno; - QUERY PLAN ------------------------------------------------------------- - Sort - Sort Key: seqno - -> Bitmap Heap Scan on array_index_op_test - Recheck Cond: (t @> '{AAAAAAAA72908}'::text[]) - -> Bitmap Index Scan on textarrayidx - Index Cond: (t @> '{AAAAAAAA72908}'::text[]) -(6 rows) - -SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAAA72908}' ORDER BY seqno; - seqno | i | t --------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------- - 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} - 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} - 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} - 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} -(4 rows) - -SELECT * FROM array_index_op_test WHERE t && '{AAAAAAAA72908}' ORDER BY seqno; - seqno | i | t --------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------- - 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} - 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} - 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} - 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} -(4 rows) - -SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAAAAA646}' ORDER BY seqno; - seqno | i | t --------+------------------+-------------------------------------------------------------------- - 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} - 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} - 96 | {23,97,43} | {AAAAAAAAAA646,A87088} -(3 rows) - -SELECT * FROM array_index_op_test WHERE t && '{AAAAAAAAAA646}' ORDER BY seqno; - seqno | i | t --------+------------------+-------------------------------------------------------------------- - 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} - 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} - 96 | {23,97,43} | {AAAAAAAAAA646,A87088} -(3 rows) - -SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno; - seqno | i | t --------+------+-------------------------------------------------------------------- - 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} -(1 row) - -SELECT * FROM array_index_op_test WHERE t && '{AAAAAAAA72908,AAAAAAAAAA646}' ORDER BY seqno; - seqno | i | t --------+-----------------------+-------------------------------------------------------------------------------------------------------------------------------------------- - 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} - 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} - 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} - 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} - 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} - 96 | {23,97,43} | {AAAAAAAAAA646,A87088} -(6 rows) - -SELECT * FROM array_index_op_test WHERE t <@ '{AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611}' ORDER BY seqno; - seqno | i | t --------+--------------------+----------------------------------------------------------------------------------------------------------- - 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} - 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} - 101 | {} | {} -(3 rows) - -SELECT * FROM array_index_op_test WHERE t = '{AAAAAAAAAA646,A87088}' ORDER BY seqno; - seqno | i | t --------+------------+------------------------ - 96 | {23,97,43} | {AAAAAAAAAA646,A87088} -(1 row) - -SELECT * FROM array_index_op_test WHERE t = '{}' ORDER BY seqno; - seqno | i | t --------+----+---- - 101 | {} | {} -(1 row) - -SELECT * FROM array_index_op_test WHERE t @> '{}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- - 1 | {92,75,71,52,64,83} | {AAAAAAAA44066,AAAAAA1059,AAAAAAAAAAA176,AAAAAAA48038} - 2 | {3,6} | {AAAAAA98232,AAAAAAAA79710,AAAAAAAAAAAAAAAAA69675,AAAAAAAAAAAAAAAA55798,AAAAAAAAA12793} - 3 | {37,64,95,43,3,41,13,30,11,43} | {AAAAAAAAAA48845,AAAAA75968,AAAAA95309,AAA54451,AAAAAAAAAA22292,AAAAAAA99836,A96617,AA17009,AAAAAAAAAAAAAA95246} - 4 | {71,39,99,55,33,75,45} | {AAAAAAAAA53663,AAAAAAAAAAAAAAA67062,AAAAAAAAAA64777,AAA99043,AAAAAAAAAAAAAAAAAAA91804,39557} - 5 | {50,42,77,50,4} | {AAAAAAAAAAAAAAAAA26540,AAAAAAA79710,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA176,AAAAA95309,AAAAAAAAAAA46154,AAAAAA66777,AAAAAAAAA27249,AAAAAAAAAA64777,AAAAAAAAAAAAAAAAAAA70104} - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 7 | {12,51,88,64,8} | {AAAAAAAAAAAAAAAAAA12591,AAAAAAAAAAAAAAAAA50407,AAAAAAAAAAAA67946} - 8 | {60,84} | {AAAAAAA81898,AAAAAA1059,AAAAAAAAAAAA81511,AAAAA961,AAAAAAAAAAAAAAAA31334,AAAAA64741,AA6416,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAAAA50407} - 9 | {56,52,35,27,80,44,81,22} | {AAAAAAAAAAAAAAA73034,AAAAAAAAAAAAA7929,AAAAAAA66161,AA88409,39557,A27153,AAAAAAAA9523,AAAAAAAAAAA99000} - 10 | {71,5,45} | {AAAAAAAAAAA21658,AAAAAAAAAAAA21089,AAA54451,AAAAAAAAAAAAAAAAAA54141,AAAAAAAAAAAAAA28620,AAAAAAAAAAA21658,AAAAAAAAAAA74076,AAAAAAAAA27249} - 11 | {41,86,74,48,22,74,47,50} | {AAAAAAAA9523,AAAAAAAAAAAA37562,AAAAAAAAAAAAAAAA14047,AAAAAAAAAAA46154,AAAA41702,AAAAAAAAAAAAAAAAA764,AAAAA62737,39557} - 12 | {17,99,18,52,91,72,0,43,96,23} | {AAAAA33250,AAAAAAAAAAAAAAAAAAA85420,AAAAAAAAAAA33576} - 13 | {3,52,34,23} | {AAAAAA98232,AAAA49534,AAAAAAAAAAA21658} - 14 | {78,57,19} | {AAAA8857,AAAAAAAAAAAAAAA73034,AAAAAAAA81587,AAAAAAAAAAAAAAA68526,AAAAA75968,AAAAAAAAAAAAAA65909,AAAAAAAAA10012,AAAAAAAAAAAAAA65909} - 15 | {17,14,16,63,67} | {AA6416,AAAAAAAAAA646,AAAAA95309} - 16 | {14,63,85,11} | {AAAAAA66777} - 17 | {7,10,81,85} | {AAAAAA43678,AAAAAAA12144,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAAAAA15356} - 18 | {1} | {AAAAAAAAAAA33576,AAAAA95309,64261,AAA59323,AAAAAAAAAAAAAA95246,55847,AAAAAAAAAAAA67946,AAAAAAAAAAAAAAAAAA64374} - 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} - 20 | {72,89,70,51,54,37,8,49,79} | {AAAAAA58494} - 21 | {2,8,65,10,5,79,43} | {AAAAAAAAAAAAAAAAA88852,AAAAAAAAAAAAAAAAAAA91804,AAAAA64669,AAAAAAAAAAAAAAAA1443,AAAAAAAAAAAAAAAA23657,AAAAA12179,AAAAAAAAAAAAAAAAA88852,AAAAAAAAAAAAAAAA31334,AAAAAAAAAAAAAAAA41303,AAAAAAAAAAAAAAAAAAA85420} - 22 | {11,6,56,62,53,30} | {AAAAAAAA72908} - 23 | {40,90,5,38,72,40,30,10,43,55} | {A6053,AAAAAAAAAAA6119,AA44673,AAAAAAAAAAAAAAAAA764,AA17009,AAAAA17383,AAAAA70514,AAAAA33250,AAAAA95309,AAAAAAAAAAAA37562} - 24 | {94,61,99,35,48} | {AAAAAAAAAAA50956,AAAAAAAAAAA15165,AAAA85070,AAAAAAAAAAAAAAA36627,AAAAA961,AAAAAAAAAA55219} - 25 | {31,1,10,11,27,79,38} | {AAAAAAAAAAAAAAAAAA59334,45449} - 26 | {71,10,9,69,75} | {47735,AAAAAAA21462,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAAAAA91804,AAAAAAAAA72121,AAAAAAAAAAAAAAAAAAA1205,AAAAA41597,AAAA8857,AAAAAAAAAAAAAAAAAAA15356,AA17009} - 27 | {94} | {AA6416,A6053,AAAAAAA21462,AAAAAAA57334,AAAAAAAAAAAAAAAAAA12591,AA88409,AAAAAAAAAAAAA70254} - 28 | {14,33,6,34,14} | {AAAAAAAAAAAAAAA13198,AAAAAAAA69452,AAAAAAAAAAA82945,AAAAAAA12144,AAAAAAAAA72121,AAAAAAAAAA18601} - 29 | {39,21} | {AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAAAAA38885,AAAA85070,AAAAAAAAAAAAAAAAAAA70104,AAAAA66674,AAAAAAAAAAAAA62007,AAAAAAAA69452,AAAAAAA1242,AAAAAAAAAAAAAAAA1729,AAAA35194} - 30 | {26,81,47,91,34} | {AAAAAAAAAAAAAAAAAAA70104,AAAAAAA80240} - 31 | {80,24,18,21,54} | {AAAAAAAAAAAAAAA13198,AAAAAAAAAAAAAAAAAAA70415,A27153,AAAAAAAAA53663,AAAAAAAAAAAAAAAAA50407,A68938} - 32 | {58,79,82,80,67,75,98,10,41} | {AAAAAAAAAAAAAAAAAA61286,AAA54451,AAAAAAAAAAAAAAAAAAA87527,A96617,51533} - 33 | {74,73} | {A85417,AAAAAAA56483,AAAAA17383,AAAAAAAAAAAAA62159,AAAAAAAAAAAA52814,AAAAAAAAAAAAA85723,AAAAAAAAAAAAAAAAAA55796} - 34 | {70,45} | {AAAAAAAAAAAAAAAAAA71621,AAAAAAAAAAAAAA28620,AAAAAAAAAA55219,AAAAAAAA23648,AAAAAAAAAA22292,AAAAAAA1242} - 35 | {23,40} | {AAAAAAAAAAAA52814,AAAA48949,AAAAAAAAA34727,AAAA8857,AAAAAAAAAAAAAAAAAAA62179,AAAAAAAAAAAAAAA68526,AAAAAAA99836,AAAAAAAA50094,AAAA91194,AAAAAAAAAAAAA73084} - 36 | {79,82,14,52,30,5,79} | {AAAAAAAAA53663,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA89194,AA88409,AAAAAAAAAAAAAAA81326,AAAAAAAAAAAAAAAAA63050,AAAAAAAAAAAAAAAA33598} - 37 | {53,11,81,39,3,78,58,64,74} | {AAAAAAAAAAAAAAAAAAA17075,AAAAAAA66161,AAAAAAAA23648,AAAAAAAAAAAAAA10611} - 38 | {59,5,4,95,28} | {AAAAAAAAAAA82945,A96617,47735,AAAAA12179,AAAAA64669,AAAAAA99807,AA74433,AAAAAAAAAAAAAAAAA59387} - 39 | {82,43,99,16,74} | {AAAAAAAAAAAAAAA67062,AAAAAAA57334,AAAAAAAAAAAAAA65909,A27153,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAA64777,AAAAAAAAAAAA81511,AAAAAAAAAAAAAA65909,AAAAAAAAAAAAAA28620} - 40 | {34} | {AAAAAAAAAAAAAA10611,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAA50956,AAAAAAAAAAAAAAAA31334,AAAAA70466,AAAAAAAA81587,AAAAAAA74623} - 41 | {19,26,63,12,93,73,27,94} | {AAAAAAA79710,AAAAAAAAAA55219,AAAA41702,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA71621,AAAAAAAAAAAAAAAAA63050,AAAAAAA99836,AAAAAAAAAAAAAA8666} - 42 | {15,76,82,75,8,91} | {AAAAAAAAAAA176,AAAAAA38063,45449,AAAAAA54032,AAAAAAA81898,AA6416,AAAAAAAAAAAAAAAAAAA62179,45449,AAAAA60038,AAAAAAAA81587} - 43 | {39,87,91,97,79,28} | {AAAAAAAAAAA74076,A96617,AAAAAAAAAAAAAAAAAAA89194,AAAAAAAAAAAAAAAAAA55796,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAA67946} - 44 | {40,58,68,29,54} | {AAAAAAA81898,AAAAAA66777,AAAAAA98232} - 45 | {99,45} | {AAAAAAAA72908,AAAAAAAAAAAAAAAAAAA17075,AA88409,AAAAAAAAAAAAAAAAAA36842,AAAAAAA48038,AAAAAAAAAAAAAA10611} - 46 | {53,24} | {AAAAAAAAAAA53908,AAAAAA54032,AAAAA17383,AAAA48949,AAAAAAAAAA18601,AAAAA64669,45449,AAAAAAAAAAA98051,AAAAAAAAAAAAAAAAAA71621} - 47 | {98,23,64,12,75,61} | {AAA59323,AAAAA95309,AAAAAAAAAAAAAAAA31334,AAAAAAAAA27249,AAAAA17383,AAAAAAAAAAAA37562,AAAAAA1059,A84822,55847,AAAAA70466} - 48 | {76,14} | {AAAAAAAAAAAAA59671,AAAAAAAAAAAAAAAAAAA91804,AAAAAA66777,AAAAAAAAAAAAAAAAAAA89194,AAAAAAAAAAAAAAA36627,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAA73084,AAAAAAA79710,AAAAAAAAAAAAAAA40402,AAAAAAAAAAAAAAAAAAA65037} - 49 | {56,5,54,37,49} | {AA21643,AAAAAAAAAAA92631,AAAAAAAA81587} - 50 | {20,12,37,64,93} | {AAAAAAAAAA5483,AAAAAAAAAAAAAAAAAAA1205,AA6416,AAAAAAAAAAAAAAAAA63050,AAAAAAAAAAAAAAAAAA47955} - 51 | {47} | {AAAAAAAAAAAAAA96505,AAAAAAAAAAAAAAAAAA36842,AAAAA95309,AAAAAAAA81587,AA6416,AAAA91194,AAAAAA58494,AAAAAA1059,AAAAAAAA69452} - 52 | {89,0} | {AAAAAAAAAAAAAAAAAA47955,AAAAAAA48038,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAAAAA73084,AAAAA70466,AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA46154,AA66862} - 53 | {38,17} | {AAAAAAAAAAA21658} - 54 | {70,47} | {AAAAAAAAAAAAAAAAAA54141,AAAAA40681,AAAAAAA48038,AAAAAAAAAAAAAAAA29150,AAAAA41597,AAAAAAAAAAAAAAAAAA59334,AA15322} - 55 | {47,79,47,64,72,25,71,24,93} | {AAAAAAAAAAAAAAAAAA55796,AAAAA62737} - 56 | {33,7,60,54,93,90,77,85,39} | {AAAAAAAAAAAAAAAAAA32918,AA42406} - 57 | {23,45,10,42,36,21,9,96} | {AAAAAAAAAAAAAAAAAAA70415} - 58 | {92} | {AAAAAAAAAAAAAAAA98414,AAAAAAAA23648,AAAAAAAAAAAAAAAAAA55796,AA25381,AAAAAAAAAAA6119} - 59 | {9,69,46,77} | {39557,AAAAAAA89932,AAAAAAAAAAAAAAAAA43052,AAAAAAAAAAAAAAAAA26540,AAA20874,AA6416,AAAAAAAAAAAAAAAAAA47955} - 60 | {62,2,59,38,89} | {AAAAAAA89932,AAAAAAAAAAAAAAAAAAA15356,AA99927,AA17009,AAAAAAAAAAAAAAA35875} - 61 | {72,2,44,95,54,54,13} | {AAAAAAAAAAAAAAAAAAA91804} - 62 | {83,72,29,73} | {AAAAAAAAAAAAA15097,AAAA8857,AAAAAAAAAAAA35809,AAAAAAAAAAAA52814,AAAAAAAAAAAAAAAAAAA38885,AAAAAAAAAAAAAAAAAA24183,AAAAAA43678,A96617} - 63 | {11,4,61,87} | {AAAAAAAAA27249,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAA13198,AAA20874,39557,51533,AAAAAAAAAAA53908,AAAAAAAAAAAAAA96505,AAAAAAAA78938} - 64 | {26,19,34,24,81,78} | {A96617,AAAAAAAAAAAAAAAAAAA70104,A68938,AAAAAAAAAAA53908,AAAAAAAAAAAAAAA453,AA17009,AAAAAAA80240} - 65 | {61,5,76,59,17} | {AAAAAA99807,AAAAA64741,AAAAAAAAAAA53908,AA21643,AAAAAAAAA10012} - 66 | {31,23,70,52,4,33,48,25} | {AAAAAAAAAAAAAAAAA69675,AAAAAAAA50094,AAAAAAAAAAA92631,AAAA35194,39557,AAAAAAA99836} - 67 | {31,94,7,10} | {AAAAAA38063,A96617,AAAA35194,AAAAAAAAAAAA67946} - 68 | {90,43,38} | {AA75092,AAAAAAAAAAAAAAAAA69675,AAAAAAAAAAA92631,AAAAAAAAA10012,AAAAAAAAAAAAA7929,AA21643} - 69 | {67,35,99,85,72,86,44} | {AAAAAAAAAAAAAAAAAAA1205,AAAAAAAA50094,AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAAAAAAA47955} - 70 | {56,70,83} | {AAAA41702,AAAAAAAAAAA82945,AA21643,AAAAAAAAAAA99000,A27153,AA25381,AAAAAAAAAAAAAA96505,AAAAAAA1242} - 71 | {74,26} | {AAAAAAAAAAA50956,AA74433,AAAAAAA21462,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAA36627,AAAAAAAAAAAAA70254,AAAAAAAAAA43419,39557} - 72 | {22,1,16,78,20,91,83} | {47735,AAAAAAA56483,AAAAAAAAAAAAA93788,AA42406,AAAAAAAAAAAAA73084,AAAAAAAA72908,AAAAAAAAAAAAAAAAAA61286,AAAAA66674,AAAAAAAAAAAAAAAAA50407} - 73 | {88,25,96,78,65,15,29,19} | {AAA54451,AAAAAAAAA27249,AAAAAAA9228,AAAAAAAAAAAAAAA67062,AAAAAAAAAAAAAAAAAAA70415,AAAAA17383,AAAAAAAAAAAAAAAA33598} - 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} - 75 | {12,96,83,24,71,89,55} | {AAAA48949,AAAAAAAA29716,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAAA67946,AAAAAAAAAAAAAAAA29150,AAA28075,AAAAAAAAAAAAAAAAA43052} - 76 | {92,55,10,7} | {AAAAAAAAAAAAAAA67062} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 78 | {55,89,44,84,34} | {AAAAAAAAAAA6119,AAAAAAAAAAAAAA8666,AA99927,AA42406,AAAAAAA81898,AAAAAAA9228,AAAAAAAAAAA92631,AA21643,AAAAAAAAAAAAAA28620} - 79 | {45} | {AAAAAAAAAA646,AAAAAAAAAAAAAAAAAAA70415,AAAAAA43678,AAAAAAAA72908} - 80 | {74,89,44,80,0} | {AAAA35194,AAAAAAAA79710,AAA20874,AAAAAAAAAAAAAAAAAAA70104,AAAAAAAAAAAAA73084,AAAAAAA57334,AAAAAAA9228,AAAAAAAAAAAAA62007} - 81 | {63,77,54,48,61,53,97} | {AAAAAAAAAAAAAAA81326,AAAAAAAAAA22292,AA25381,AAAAAAAAAAA74076,AAAAAAA81898,AAAAAAAAA72121} - 82 | {34,60,4,79,78,16,86,89,42,50} | {AAAAA40681,AAAAAAAAAAAAAAAAAA12591,AAAAAAA80240,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA70104} - 83 | {14,10} | {AAAAAAAAAA22292,AAAAAAAAAAAAA70254,AAAAAAAAAAA6119} - 84 | {11,83,35,13,96,94} | {AAAAA95309,AAAAAAAAAAAAAAAAAA32918,AAAAAAAAAAAAAAAAAA24183} - 85 | {39,60} | {AAAAAAAAAAAAAAAA55798,AAAAAAAAAA22292,AAAAAAA66161,AAAAAAA21462,AAAAAAAAAAAAAAAAAA12591,55847,AAAAAA98232,AAAAAAAAAAA46154} - 86 | {33,81,72,74,45,36,82} | {AAAAAAAA81587,AAAAAAAAAAAAAA96505,45449,AAAA80176} - 87 | {57,27,50,12,97,68} | {AAAAAAAAAAAAAAAAA26540,AAAAAAAAA10012,AAAAAAAAAAAA35809,AAAAAAAAAAAAAAAA29150,AAAAAAAAAAA82945,AAAAAA66777,31228,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAA96505} - 88 | {41,90,77,24,6,24} | {AAAA35194,AAAA35194,AAAAAAA80240,AAAAAAAAAAA46154,AAAAAA58494,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA59334,AAAAAAAAAAAAAAAAAAA91804,AA74433} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} - 90 | {88,75} | {AAAAA60038,AAAAAAAA23648,AAAAAAAAAAA99000,AAAA41702,AAAAAAAAAAAAA22860,AAAAAAAAAAAAAAA68526} - 91 | {78} | {AAAAAAAAAAAAA62007,AAA99043} - 92 | {85,63,49,45} | {AAAAAAA89932,AAAAAAAAAAAAA22860,AAAAAAAAAAAAAAAAAAA1205,AAAAAAAAAAAA21089} - 93 | {11} | {AAAAAAAAAAA176,AAAAAAAAAAAAAA8666,AAAAAAAAAAAAAAA453,AAAAAAAAAAAAA85723,A68938,AAAAAAAAAAAAA9821,AAAAAAA48038,AAAAAAAAAAAAAAAAA59387,AA99927,AAAAA17383} - 94 | {98,9,85,62,88,91,60,61,38,86} | {AAAAAAAA81587,AAAAA17383,AAAAAAAA81587} - 95 | {47,77} | {AAAAAAAAAAAAAAAAA764,AAAAAAAAAAA74076,AAAAAAAAAA18107,AAAAA40681,AAAAAAAAAAAAAAA35875,AAAAA60038,AAAAAAA56483} - 96 | {23,97,43} | {AAAAAAAAAA646,A87088} - 97 | {54,2,86,65} | {47735,AAAAAAA99836,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAA29150,AAAAAAA80240,AAAAAAAAAAAAAAAA98414,AAAAAAA56483,AAAAAAAAAAAAAAAA29150,AAAAAAA39692,AA21643} - 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} - 99 | {37,86} | {AAAAAAAAAAAAAAAAAA32918,AAAAA70514,AAAAAAAAA10012,AAAAAAAAAAAAAAAAA59387,AAAAAAAAAA64777,AAAAAAAAAAAAAAAAAAA15356} - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} - 101 | {} | {} - 102 | {NULL} | {NULL} -(102 rows) - -SELECT * FROM array_index_op_test WHERE t && '{}' ORDER BY seqno; - seqno | i | t --------+---+--- -(0 rows) - -SELECT * FROM array_index_op_test WHERE t <@ '{}' ORDER BY seqno; - seqno | i | t --------+----+---- - 101 | {} | {} -(1 row) - --- And try it with a multicolumn GIN index -DROP INDEX intarrayidx, textarrayidx; -CREATE INDEX botharrayidx ON array_index_op_test USING gin (i, t); -SELECT * FROM array_index_op_test WHERE i @> '{32}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} - 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} -(6 rows) - -SELECT * FROM array_index_op_test WHERE i && '{32}' ORDER BY seqno; - seqno | i | t --------+---------------------------------+------------------------------------------------------------------------------------------------------------------------------------ - 6 | {39,35,5,94,17,92,60,32} | {AAAAAAAAAAAAAAA35875,AAAAAAAAAAAAAAAA23657} - 74 | {32} | {AAAAAAAAAAAAAAAA1729,AAAAAAAAAAAAA22860,AAAAAA99807,AAAAA17383,AAAAAAAAAAAAAAA67062,AAAAAAAAAAA15165,AAAAAAAAAAA50956} - 77 | {97,15,32,17,55,59,18,37,50,39} | {AAAAAAAAAAAA67946,AAAAAA54032,AAAAAAAA81587,55847,AAAAAAAAAAAAAA28620,AAAAAAAAAAAAAAAAA43052,AAAAAA75463,AAAA49534,AAAAAAAA44066} - 89 | {40,32,17,6,30,88} | {AA44673,AAAAAAAAAAA6119,AAAAAAAAAAAAAAAA23657,AAAAAAAAAAAAAAAAAA47955,AAAAAAAAAAAAAAAA33598,AAAAAAAAAAA33576,AA44673} - 98 | {38,34,32,89} | {AAAAAAAAAAAAAAAAAA71621,AAAA8857,AAAAAAAAAAAAAAAAAAA65037,AAAAAAAAAAAAAAAA31334,AAAAAAAAAA48845} - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} -(6 rows) - -SELECT * FROM array_index_op_test WHERE t @> '{AAAAAAA80240}' ORDER BY seqno; - seqno | i | t --------+--------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------- - 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} - 30 | {26,81,47,91,34} | {AAAAAAAAAAAAAAAAAAA70104,AAAAAAA80240} - 64 | {26,19,34,24,81,78} | {A96617,AAAAAAAAAAAAAAAAAAA70104,A68938,AAAAAAAAAAA53908,AAAAAAAAAAAAAAA453,AA17009,AAAAAAA80240} - 82 | {34,60,4,79,78,16,86,89,42,50} | {AAAAA40681,AAAAAAAAAAAAAAAAAA12591,AAAAAAA80240,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA70104} - 88 | {41,90,77,24,6,24} | {AAAA35194,AAAA35194,AAAAAAA80240,AAAAAAAAAAA46154,AAAAAA58494,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA59334,AAAAAAAAAAAAAAAAAAA91804,AA74433} - 97 | {54,2,86,65} | {47735,AAAAAAA99836,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAA29150,AAAAAAA80240,AAAAAAAAAAAAAAAA98414,AAAAAAA56483,AAAAAAAAAAAAAAAA29150,AAAAAAA39692,AA21643} - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} -(7 rows) - -SELECT * FROM array_index_op_test WHERE t && '{AAAAAAA80240}' ORDER BY seqno; - seqno | i | t --------+--------------------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------- - 19 | {52,82,17,74,23,46,69,51,75} | {AAAAAAAAAAAAA73084,AAAAA75968,AAAAAAAAAAAAAAAA14047,AAAAAAA80240,AAAAAAAAAAAAAAAAAAA1205,A68938} - 30 | {26,81,47,91,34} | {AAAAAAAAAAAAAAAAAAA70104,AAAAAAA80240} - 64 | {26,19,34,24,81,78} | {A96617,AAAAAAAAAAAAAAAAAAA70104,A68938,AAAAAAAAAAA53908,AAAAAAAAAAAAAAA453,AA17009,AAAAAAA80240} - 82 | {34,60,4,79,78,16,86,89,42,50} | {AAAAA40681,AAAAAAAAAAAAAAAAAA12591,AAAAAAA80240,AAAAAAAAAAAAAAAA55798,AAAAAAAAAAAAAAAAAAA70104} - 88 | {41,90,77,24,6,24} | {AAAA35194,AAAA35194,AAAAAAA80240,AAAAAAAAAAA46154,AAAAAA58494,AAAAAAAAAAAAAAAAAAA17075,AAAAAAAAAAAAAAAAAA59334,AAAAAAAAAAAAAAAAAAA91804,AA74433} - 97 | {54,2,86,65} | {47735,AAAAAAA99836,AAAAAAAAAAAAAAAAA6897,AAAAAAAAAAAAAAAA29150,AAAAAAA80240,AAAAAAAAAAAAAAAA98414,AAAAAAA56483,AAAAAAAAAAAAAAAA29150,AAAAAAA39692,AA21643} - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} -(7 rows) - -SELECT * FROM array_index_op_test WHERE i @> '{32}' AND t && '{AAAAAAA80240}' ORDER BY seqno; - seqno | i | t --------+-----------------------------+------------------------------------------------------------------------------ - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} -(1 row) - -SELECT * FROM array_index_op_test WHERE i && '{32}' AND t @> '{AAAAAAA80240}' ORDER BY seqno; - seqno | i | t --------+-----------------------------+------------------------------------------------------------------------------ - 100 | {85,32,57,39,49,84,32,3,30} | {AAAAAAA80240,AAAAAAAAAAAAAAAA1729,AAAAA60038,AAAAAAAAAAA92631,AAAAAAAA9523} -(1 row) - -SELECT * FROM array_index_op_test WHERE t = '{}' ORDER BY seqno; - seqno | i | t --------+----+---- - 101 | {} | {} -(1 row) - -RESET enable_seqscan; -RESET enable_indexscan; -RESET enable_bitmapscan; --- --- Try a GIN index with a lot of items with same key. (GIN creates a posting --- tree when there are enough duplicates) --- -CREATE TABLE array_gin_test (a int[]); -INSERT INTO array_gin_test SELECT ARRAY[1, g%5, g] FROM generate_series(1, 10000) g; -CREATE INDEX array_gin_test_idx ON array_gin_test USING gin (a); -SELECT COUNT(*) FROM array_gin_test WHERE a @> '{2}'; - count -------- - 2000 -(1 row) - -DROP TABLE array_gin_test; --- --- Test GIN index's reloptions --- -CREATE INDEX gin_relopts_test ON array_index_op_test USING gin (i) - WITH (FASTUPDATE=on, GIN_PENDING_LIST_LIMIT=128); -\d+ gin_relopts_test - Index "public.gin_relopts_test" - Column | Type | Key? | Definition | Storage | Stats target ---------+---------+------+------------+---------+-------------- - i | integer | yes | i | plain | -gin, for table "public.array_index_op_test" -Options: fastupdate=on, gin_pending_list_limit=128 - --- --- HASH --- -CREATE UNLOGGED TABLE unlogged_hash_table (id int4); -CREATE INDEX unlogged_hash_index ON unlogged_hash_table USING hash (id int4_ops); -DROP TABLE unlogged_hash_table; --- CREATE INDEX hash_ovfl_index ON hash_ovfl_heap USING hash (x int4_ops); --- Test hash index build tuplesorting. Force hash tuplesort using low --- maintenance_work_mem setting and fillfactor: -SET maintenance_work_mem = '1MB'; -CREATE INDEX hash_tuplesort_idx ON tenk1 USING hash (stringu1 name_ops) WITH (fillfactor = 10); -EXPLAIN (COSTS OFF) -SELECT count(*) FROM tenk1 WHERE stringu1 = 'TVAAAA'; - QUERY PLAN -------------------------------------------------------- - Aggregate - -> Bitmap Heap Scan on tenk1 - Recheck Cond: (stringu1 = 'TVAAAA'::name) - -> Bitmap Index Scan on hash_tuplesort_idx - Index Cond: (stringu1 = 'TVAAAA'::name) -(5 rows) - -SELECT count(*) FROM tenk1 WHERE stringu1 = 'TVAAAA'; - count -------- - 14 -(1 row) - -DROP INDEX hash_tuplesort_idx; -RESET maintenance_work_mem; --- --- Test unique null behavior --- -CREATE TABLE unique_tbl (i int, t text); -CREATE UNIQUE INDEX unique_idx1 ON unique_tbl (i) NULLS DISTINCT; -CREATE UNIQUE INDEX unique_idx2 ON unique_tbl (i) NULLS NOT DISTINCT; -INSERT INTO unique_tbl VALUES (1, 'one'); -INSERT INTO unique_tbl VALUES (2, 'two'); -INSERT INTO unique_tbl VALUES (3, 'three'); -INSERT INTO unique_tbl VALUES (4, 'four'); -INSERT INTO unique_tbl VALUES (5, 'one'); -INSERT INTO unique_tbl (t) VALUES ('six'); -INSERT INTO unique_tbl (t) VALUES ('seven'); -- error from unique_idx2 -ERROR: duplicate key value violates unique constraint "unique_idx2" -DETAIL: Key (i)=(null) already exists. -DROP INDEX unique_idx1, unique_idx2; -INSERT INTO unique_tbl (t) VALUES ('seven'); --- build indexes on filled table -CREATE UNIQUE INDEX unique_idx3 ON unique_tbl (i) NULLS DISTINCT; -- ok -CREATE UNIQUE INDEX unique_idx4 ON unique_tbl (i) NULLS NOT DISTINCT; -- error -ERROR: could not create unique index "unique_idx4" -DETAIL: Key (i)=(null) is duplicated. -DELETE FROM unique_tbl WHERE t = 'seven'; -CREATE UNIQUE INDEX unique_idx4 ON unique_tbl (i) NULLS NOT DISTINCT; -- ok now -\d unique_tbl - Table "public.unique_tbl" - Column | Type | Collation | Nullable | Default ---------+---------+-----------+----------+--------- - i | integer | | | - t | text | | | -Indexes: - "unique_idx3" UNIQUE, btree (i) - "unique_idx4" UNIQUE, btree (i) NULLS NOT DISTINCT - -\d unique_idx3 - Index "public.unique_idx3" - Column | Type | Key? | Definition ---------+---------+------+------------ - i | integer | yes | i -unique, btree, for table "public.unique_tbl" - -\d unique_idx4 - Index "public.unique_idx4" - Column | Type | Key? | Definition ---------+---------+------+------------ - i | integer | yes | i -unique nulls not distinct, btree, for table "public.unique_tbl" - -SELECT pg_get_indexdef('unique_idx3'::regclass); - pg_get_indexdef ----------------------------------------------------------------------- - CREATE UNIQUE INDEX unique_idx3 ON public.unique_tbl USING btree (i) -(1 row) - -SELECT pg_get_indexdef('unique_idx4'::regclass); - pg_get_indexdef ------------------------------------------------------------------------------------------ - CREATE UNIQUE INDEX unique_idx4 ON public.unique_tbl USING btree (i) NULLS NOT DISTINCT -(1 row) - -DROP TABLE unique_tbl; --- --- Test functional index --- -CREATE TABLE func_index_heap (f1 text, f2 text); -CREATE UNIQUE INDEX func_index_index on func_index_heap (textcat(f1,f2)); -INSERT INTO func_index_heap VALUES('ABC','DEF'); -INSERT INTO func_index_heap VALUES('AB','CDEFG'); -INSERT INTO func_index_heap VALUES('QWE','RTY'); --- this should fail because of unique index: -INSERT INTO func_index_heap VALUES('ABCD', 'EF'); -ERROR: duplicate key value violates unique constraint "func_index_index" -DETAIL: Key (textcat(f1, f2))=(ABCDEF) already exists. --- but this shouldn't: -INSERT INTO func_index_heap VALUES('QWERTY'); --- while we're here, see that the metadata looks sane -\d func_index_heap - Table "public.func_index_heap" - Column | Type | Collation | Nullable | Default ---------+------+-----------+----------+--------- - f1 | text | | | - f2 | text | | | -Indexes: - "func_index_index" UNIQUE, btree (textcat(f1, f2)) - -\d func_index_index - Index "public.func_index_index" - Column | Type | Key? | Definition ----------+------+------+----------------- - textcat | text | yes | textcat(f1, f2) -unique, btree, for table "public.func_index_heap" - --- --- Same test, expressional index --- -DROP TABLE func_index_heap; -CREATE TABLE func_index_heap (f1 text, f2 text); -CREATE UNIQUE INDEX func_index_index on func_index_heap ((f1 || f2) text_ops); -INSERT INTO func_index_heap VALUES('ABC','DEF'); -INSERT INTO func_index_heap VALUES('AB','CDEFG'); -INSERT INTO func_index_heap VALUES('QWE','RTY'); --- this should fail because of unique index: -INSERT INTO func_index_heap VALUES('ABCD', 'EF'); -ERROR: duplicate key value violates unique constraint "func_index_index" -DETAIL: Key ((f1 || f2))=(ABCDEF) already exists. --- but this shouldn't: -INSERT INTO func_index_heap VALUES('QWERTY'); --- while we're here, see that the metadata looks sane -\d func_index_heap - Table "public.func_index_heap" - Column | Type | Collation | Nullable | Default ---------+------+-----------+----------+--------- - f1 | text | | | - f2 | text | | | -Indexes: - "func_index_index" UNIQUE, btree ((f1 || f2)) - -\d func_index_index - Index "public.func_index_index" - Column | Type | Key? | Definition ---------+------+------+------------ - expr | text | yes | (f1 || f2) -unique, btree, for table "public.func_index_heap" - --- this should fail because of unsafe column type (anonymous record) -create index on func_index_heap ((f1 || f2), (row(f1, f2))); -ERROR: column "row" has pseudo-type record --- --- Test unique index with included columns --- -CREATE TABLE covering_index_heap (f1 int, f2 int, f3 text); -CREATE UNIQUE INDEX covering_index_index on covering_index_heap (f1,f2) INCLUDE(f3); -INSERT INTO covering_index_heap VALUES(1,1,'AAA'); -INSERT INTO covering_index_heap VALUES(1,2,'AAA'); --- this should fail because of unique index on f1,f2: -INSERT INTO covering_index_heap VALUES(1,2,'BBB'); -ERROR: duplicate key value violates unique constraint "covering_index_index" -DETAIL: Key (f1, f2)=(1, 2) already exists. --- and this shouldn't: -INSERT INTO covering_index_heap VALUES(1,4,'AAA'); --- Try to build index on table that already contains data -CREATE UNIQUE INDEX covering_pkey on covering_index_heap (f1,f2) INCLUDE(f3); --- Try to use existing covering index as primary key -ALTER TABLE covering_index_heap ADD CONSTRAINT covering_pkey PRIMARY KEY USING INDEX -covering_pkey; -DROP TABLE covering_index_heap; --- --- Try some concurrent index builds --- --- Unfortunately this only tests about half the code paths because there are --- no concurrent updates happening to the table at the same time. -CREATE TABLE concur_heap (f1 text, f2 text); --- empty table -CREATE INDEX CONCURRENTLY concur_index1 ON concur_heap(f2,f1); -CREATE INDEX CONCURRENTLY IF NOT EXISTS concur_index1 ON concur_heap(f2,f1); -NOTICE: relation "concur_index1" already exists, skipping -INSERT INTO concur_heap VALUES ('a','b'); -INSERT INTO concur_heap VALUES ('b','b'); --- unique index -CREATE UNIQUE INDEX CONCURRENTLY concur_index2 ON concur_heap(f1); -CREATE UNIQUE INDEX CONCURRENTLY IF NOT EXISTS concur_index2 ON concur_heap(f1); -NOTICE: relation "concur_index2" already exists, skipping --- check if constraint is set up properly to be enforced -INSERT INTO concur_heap VALUES ('b','x'); -ERROR: duplicate key value violates unique constraint "concur_index2" -DETAIL: Key (f1)=(b) already exists. --- check if constraint is enforced properly at build time -CREATE UNIQUE INDEX CONCURRENTLY concur_index3 ON concur_heap(f2); -ERROR: could not create unique index "concur_index3" -DETAIL: Key (f2)=(b) is duplicated. --- test that expression indexes and partial indexes work concurrently -CREATE INDEX CONCURRENTLY concur_index4 on concur_heap(f2) WHERE f1='a'; -CREATE INDEX CONCURRENTLY concur_index5 on concur_heap(f2) WHERE f1='x'; --- here we also check that you can default the index name -CREATE INDEX CONCURRENTLY on concur_heap((f2||f1)); --- You can't do a concurrent index build in a transaction -BEGIN; -CREATE INDEX CONCURRENTLY concur_index7 ON concur_heap(f1); -ERROR: CREATE INDEX CONCURRENTLY cannot run inside a transaction block -COMMIT; --- test where predicate is able to do a transactional update during --- a concurrent build before switching pg_index state flags. -CREATE FUNCTION predicate_stable() RETURNS bool IMMUTABLE -LANGUAGE plpgsql AS $$ -BEGIN - EXECUTE 'SELECT txid_current()'; - RETURN true; -END; $$; -CREATE INDEX CONCURRENTLY concur_index8 ON concur_heap (f1) - WHERE predicate_stable(); -DROP INDEX concur_index8; -DROP FUNCTION predicate_stable(); --- But you can do a regular index build in a transaction -BEGIN; -CREATE INDEX std_index on concur_heap(f2); -COMMIT; --- Failed builds are left invalid by VACUUM FULL, fixed by REINDEX -VACUUM FULL concur_heap; -REINDEX TABLE concur_heap; -ERROR: could not create unique index "concur_index3" -DETAIL: Key (f2)=(b) is duplicated. -DELETE FROM concur_heap WHERE f1 = 'b'; -VACUUM FULL concur_heap; -\d concur_heap - Table "public.concur_heap" - Column | Type | Collation | Nullable | Default ---------+------+-----------+----------+--------- - f1 | text | | | - f2 | text | | | -Indexes: - "concur_heap_expr_idx" btree ((f2 || f1)) - "concur_index1" btree (f2, f1) - "concur_index2" UNIQUE, btree (f1) - "concur_index3" UNIQUE, btree (f2) INVALID - "concur_index4" btree (f2) WHERE f1 = 'a'::text - "concur_index5" btree (f2) WHERE f1 = 'x'::text - "std_index" btree (f2) - -REINDEX TABLE concur_heap; -\d concur_heap - Table "public.concur_heap" - Column | Type | Collation | Nullable | Default ---------+------+-----------+----------+--------- - f1 | text | | | - f2 | text | | | -Indexes: - "concur_heap_expr_idx" btree ((f2 || f1)) - "concur_index1" btree (f2, f1) - "concur_index2" UNIQUE, btree (f1) - "concur_index3" UNIQUE, btree (f2) - "concur_index4" btree (f2) WHERE f1 = 'a'::text - "concur_index5" btree (f2) WHERE f1 = 'x'::text - "std_index" btree (f2) - --- Temporary tables with concurrent builds and on-commit actions --- CONCURRENTLY used with CREATE INDEX and DROP INDEX is ignored. --- PRESERVE ROWS, the default. -CREATE TEMP TABLE concur_temp (f1 int, f2 text) - ON COMMIT PRESERVE ROWS; -INSERT INTO concur_temp VALUES (1, 'foo'), (2, 'bar'); -CREATE INDEX CONCURRENTLY concur_temp_ind ON concur_temp(f1); -DROP INDEX CONCURRENTLY concur_temp_ind; -DROP TABLE concur_temp; --- ON COMMIT DROP -BEGIN; -CREATE TEMP TABLE concur_temp (f1 int, f2 text) - ON COMMIT DROP; -INSERT INTO concur_temp VALUES (1, 'foo'), (2, 'bar'); --- Fails when running in a transaction. -CREATE INDEX CONCURRENTLY concur_temp_ind ON concur_temp(f1); -ERROR: CREATE INDEX CONCURRENTLY cannot run inside a transaction block -COMMIT; --- ON COMMIT DELETE ROWS -CREATE TEMP TABLE concur_temp (f1 int, f2 text) - ON COMMIT DELETE ROWS; -INSERT INTO concur_temp VALUES (1, 'foo'), (2, 'bar'); -CREATE INDEX CONCURRENTLY concur_temp_ind ON concur_temp(f1); -DROP INDEX CONCURRENTLY concur_temp_ind; -DROP TABLE concur_temp; --- --- Try some concurrent index drops --- -DROP INDEX CONCURRENTLY "concur_index2"; -- works -DROP INDEX CONCURRENTLY IF EXISTS "concur_index2"; -- notice -NOTICE: index "concur_index2" does not exist, skipping --- failures -DROP INDEX CONCURRENTLY "concur_index2", "concur_index3"; -ERROR: DROP INDEX CONCURRENTLY does not support dropping multiple objects -BEGIN; -DROP INDEX CONCURRENTLY "concur_index5"; -ERROR: DROP INDEX CONCURRENTLY cannot run inside a transaction block -ROLLBACK; --- successes -DROP INDEX CONCURRENTLY IF EXISTS "concur_index3"; -DROP INDEX CONCURRENTLY "concur_index4"; -DROP INDEX CONCURRENTLY "concur_index5"; -DROP INDEX CONCURRENTLY "concur_index1"; -DROP INDEX CONCURRENTLY "concur_heap_expr_idx"; -\d concur_heap - Table "public.concur_heap" - Column | Type | Collation | Nullable | Default ---------+------+-----------+----------+--------- - f1 | text | | | - f2 | text | | | -Indexes: - "std_index" btree (f2) - -DROP TABLE concur_heap; --- --- Test ADD CONSTRAINT USING INDEX --- -CREATE TABLE cwi_test( a int , b varchar(10), c char); --- add some data so that all tests have something to work with. -INSERT INTO cwi_test VALUES(1, 2), (3, 4), (5, 6); -CREATE UNIQUE INDEX cwi_uniq_idx ON cwi_test(a , b); -ALTER TABLE cwi_test ADD primary key USING INDEX cwi_uniq_idx; -\d cwi_test - Table "public.cwi_test" - Column | Type | Collation | Nullable | Default ---------+-----------------------+-----------+----------+--------- - a | integer | | not null | - b | character varying(10) | | not null | - c | character(1) | | | -Indexes: - "cwi_uniq_idx" PRIMARY KEY, btree (a, b) - -\d cwi_uniq_idx - Index "public.cwi_uniq_idx" - Column | Type | Key? | Definition ---------+-----------------------+------+------------ - a | integer | yes | a - b | character varying(10) | yes | b -primary key, btree, for table "public.cwi_test" - -CREATE UNIQUE INDEX cwi_uniq2_idx ON cwi_test(b , a); -ALTER TABLE cwi_test DROP CONSTRAINT cwi_uniq_idx, - ADD CONSTRAINT cwi_replaced_pkey PRIMARY KEY - USING INDEX cwi_uniq2_idx; -NOTICE: ALTER TABLE / ADD CONSTRAINT USING INDEX will rename index "cwi_uniq2_idx" to "cwi_replaced_pkey" -\d cwi_test - Table "public.cwi_test" - Column | Type | Collation | Nullable | Default ---------+-----------------------+-----------+----------+--------- - a | integer | | not null | - b | character varying(10) | | not null | - c | character(1) | | | -Indexes: - "cwi_replaced_pkey" PRIMARY KEY, btree (b, a) - -\d cwi_replaced_pkey - Index "public.cwi_replaced_pkey" - Column | Type | Key? | Definition ---------+-----------------------+------+------------ - b | character varying(10) | yes | b - a | integer | yes | a -primary key, btree, for table "public.cwi_test" - -DROP INDEX cwi_replaced_pkey; -- Should fail; a constraint depends on it -ERROR: cannot drop index cwi_replaced_pkey because constraint cwi_replaced_pkey on table cwi_test requires it -HINT: You can drop constraint cwi_replaced_pkey on table cwi_test instead. --- Check that non-default index options are rejected -CREATE UNIQUE INDEX cwi_uniq3_idx ON cwi_test(a desc); -ALTER TABLE cwi_test ADD UNIQUE USING INDEX cwi_uniq3_idx; -- fail -ERROR: index "cwi_uniq3_idx" column number 1 does not have default sorting behavior -LINE 1: ALTER TABLE cwi_test ADD UNIQUE USING INDEX cwi_uniq3_idx; - ^ -DETAIL: Cannot create a primary key or unique constraint using such an index. -CREATE UNIQUE INDEX cwi_uniq4_idx ON cwi_test(b collate "POSIX"); -ALTER TABLE cwi_test ADD UNIQUE USING INDEX cwi_uniq4_idx; -- fail -ERROR: index "cwi_uniq4_idx" column number 1 does not have default sorting behavior -LINE 1: ALTER TABLE cwi_test ADD UNIQUE USING INDEX cwi_uniq4_idx; - ^ -DETAIL: Cannot create a primary key or unique constraint using such an index. -DROP TABLE cwi_test; --- ADD CONSTRAINT USING INDEX is forbidden on partitioned tables -CREATE TABLE cwi_test(a int) PARTITION BY hash (a); -create unique index on cwi_test (a); -alter table cwi_test add primary key using index cwi_test_a_idx ; -ERROR: ALTER TABLE / ADD CONSTRAINT USING INDEX is not supported on partitioned tables -DROP TABLE cwi_test; --- PRIMARY KEY constraint cannot be backed by a NULLS NOT DISTINCT index -CREATE TABLE cwi_test(a int, b int); -CREATE UNIQUE INDEX cwi_a_nnd ON cwi_test (a) NULLS NOT DISTINCT; -ALTER TABLE cwi_test ADD PRIMARY KEY USING INDEX cwi_a_nnd; -ERROR: primary keys cannot use NULLS NOT DISTINCT indexes -DROP TABLE cwi_test; --- --- Check handling of indexes on system columns --- -CREATE TABLE syscol_table (a INT); --- System columns cannot be indexed -CREATE INDEX ON syscolcol_table (ctid); -ERROR: relation "syscolcol_table" does not exist --- nor used in expressions -CREATE INDEX ON syscol_table ((ctid >= '(1000,0)')); -ERROR: index creation on system columns is not supported --- nor used in predicates -CREATE INDEX ON syscol_table (a) WHERE ctid >= '(1000,0)'; -ERROR: index creation on system columns is not supported -DROP TABLE syscol_table; --- --- Tests for IS NULL/IS NOT NULL with b-tree indexes --- -CREATE TABLE onek_with_null AS SELECT unique1, unique2 FROM onek; -INSERT INTO onek_with_null (unique1,unique2) VALUES (NULL, -1), (NULL, NULL); -CREATE UNIQUE INDEX onek_nulltest ON onek_with_null (unique2,unique1); -SET enable_seqscan = OFF; -SET enable_indexscan = ON; -SET enable_bitmapscan = ON; -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL; - count -------- - 2 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NULL; - count -------- - 1 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL; - count -------- - 1000 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NOT NULL; - count -------- - 1 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL AND unique1 > 500; - count -------- - 499 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique1 > 500; - count -------- - 0 -(1 row) - -DROP INDEX onek_nulltest; -CREATE UNIQUE INDEX onek_nulltest ON onek_with_null (unique2 desc,unique1); -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL; - count -------- - 2 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NULL; - count -------- - 1 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL; - count -------- - 1000 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NOT NULL; - count -------- - 1 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL AND unique1 > 500; - count -------- - 499 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique1 > 500; - count -------- - 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; - count -------- - 2 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NULL; - count -------- - 1 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL; - count -------- - 1000 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NOT NULL; - count -------- - 1 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL AND unique1 > 500; - count -------- - 499 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique1 > 500; - count -------- - 0 -(1 row) - -DROP INDEX onek_nulltest; -CREATE UNIQUE INDEX onek_nulltest ON onek_with_null (unique2 nulls first,unique1); -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL; - count -------- - 2 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NULL; - count -------- - 1 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL; - count -------- - 1000 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique2 IS NOT NULL; - count -------- - 1 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NOT NULL AND unique1 > 500; - count -------- - 499 -(1 row) - -SELECT count(*) FROM onek_with_null WHERE unique1 IS NULL AND unique1 > 500; - count -------- - 0 -(1 row) - -DROP INDEX onek_nulltest; --- Check initial-positioning logic too -CREATE UNIQUE INDEX onek_nulltest ON onek_with_null (unique2); -SET enable_seqscan = OFF; -SET enable_indexscan = ON; -SET enable_bitmapscan = OFF; -SELECT unique1, unique2 FROM onek_with_null - ORDER BY unique2 LIMIT 2; - unique1 | unique2 ----------+--------- - | -1 - 147 | 0 -(2 rows) - -SELECT unique1, unique2 FROM onek_with_null WHERE unique2 >= -1 - ORDER BY unique2 LIMIT 2; - unique1 | unique2 ----------+--------- - | -1 - 147 | 0 -(2 rows) - -SELECT unique1, unique2 FROM onek_with_null WHERE unique2 >= 0 - ORDER BY unique2 LIMIT 2; - unique1 | unique2 ----------+--------- - 147 | 0 - 931 | 1 -(2 rows) - -SELECT unique1, unique2 FROM onek_with_null - ORDER BY unique2 DESC LIMIT 2; - unique1 | unique2 ----------+--------- - | - 278 | 999 -(2 rows) - -SELECT unique1, unique2 FROM onek_with_null WHERE unique2 >= -1 - ORDER BY unique2 DESC LIMIT 2; - unique1 | unique2 ----------+--------- - 278 | 999 - 0 | 998 -(2 rows) - -SELECT unique1, unique2 FROM onek_with_null WHERE unique2 < 999 - ORDER BY unique2 DESC LIMIT 2; - unique1 | unique2 ----------+--------- - 0 | 998 - 744 | 997 -(2 rows) - -RESET enable_seqscan; -RESET enable_indexscan; -RESET enable_bitmapscan; -DROP TABLE onek_with_null; --- --- Check bitmap index path planning --- -EXPLAIN (COSTS OFF) -SELECT * FROM tenk1 - WHERE thousand = 42 AND (tenthous = 1 OR tenthous = 3 OR tenthous = 42); - QUERY PLAN ------------------------------------------------------------------------------------------------------------------------------------------ - Bitmap Heap Scan on tenk1 - Recheck Cond: (((thousand = 42) AND (tenthous = 1)) OR ((thousand = 42) AND (tenthous = 3)) OR ((thousand = 42) AND (tenthous = 42))) - -> BitmapOr - -> Bitmap Index Scan on tenk1_thous_tenthous - Index Cond: ((thousand = 42) AND (tenthous = 1)) - -> Bitmap Index Scan on tenk1_thous_tenthous - Index Cond: ((thousand = 42) AND (tenthous = 3)) - -> Bitmap Index Scan on tenk1_thous_tenthous - Index Cond: ((thousand = 42) AND (tenthous = 42)) -(9 rows) - -SELECT * FROM tenk1 - WHERE thousand = 42 AND (tenthous = 1 OR tenthous = 3 OR tenthous = 42); - unique1 | unique2 | two | four | ten | twenty | hundred | thousand | twothousand | fivethous | tenthous | odd | even | stringu1 | stringu2 | string4 ----------+---------+-----+------+-----+--------+---------+----------+-------------+-----------+----------+-----+------+----------+----------+--------- - 42 | 5530 | 0 | 2 | 2 | 2 | 42 | 42 | 42 | 42 | 42 | 84 | 85 | QBAAAA | SEIAAA | OOOOxx -(1 row) - -EXPLAIN (COSTS OFF) -SELECT count(*) FROM tenk1 - WHERE hundred = 42 AND (thousand = 42 OR thousand = 99); - QUERY PLAN ---------------------------------------------------------------------------------- - Aggregate - -> Bitmap Heap Scan on tenk1 - Recheck Cond: ((hundred = 42) AND ((thousand = 42) OR (thousand = 99))) - -> BitmapAnd - -> Bitmap Index Scan on tenk1_hundred - Index Cond: (hundred = 42) - -> BitmapOr - -> Bitmap Index Scan on tenk1_thous_tenthous - Index Cond: (thousand = 42) - -> Bitmap Index Scan on tenk1_thous_tenthous - Index Cond: (thousand = 99) -(11 rows) - -SELECT count(*) FROM tenk1 - WHERE hundred = 42 AND (thousand = 42 OR thousand = 99); - count -------- - 10 -(1 row) - --- --- Check behavior with duplicate index column contents --- -CREATE TABLE dupindexcols AS - SELECT unique1 as id, stringu2::text as f1 FROM tenk1; -CREATE INDEX dupindexcols_i ON dupindexcols (f1, id, f1 text_pattern_ops); -ANALYZE dupindexcols; -EXPLAIN (COSTS OFF) - SELECT count(*) FROM dupindexcols - WHERE f1 BETWEEN 'WA' AND 'ZZZ' and id < 1000 and f1 ~<~ 'YX'; - QUERY PLAN ----------------------------------------------------------------------------------------------------------------- - Aggregate - -> Bitmap Heap Scan on dupindexcols - Recheck Cond: ((f1 >= 'WA'::text) AND (f1 <= 'ZZZ'::text) AND (id < 1000) AND (f1 ~<~ 'YX'::text)) - -> Bitmap Index Scan on dupindexcols_i - Index Cond: ((f1 >= 'WA'::text) AND (f1 <= 'ZZZ'::text) AND (id < 1000) AND (f1 ~<~ 'YX'::text)) -(5 rows) - -SELECT count(*) FROM dupindexcols - WHERE f1 BETWEEN 'WA' AND 'ZZZ' and id < 1000 and f1 ~<~ 'YX'; - count -------- - 97 -(1 row) - --- --- Check that index scans with =ANY indexquals return rows in index order --- -explain (costs off) -SELECT unique1 FROM tenk1 -WHERE unique1 IN (1,42,7) -ORDER BY unique1; - QUERY PLAN -------------------------------------------------------- - Index Only Scan using tenk1_unique1 on tenk1 - Index Cond: (unique1 = ANY ('{1,42,7}'::integer[])) -(2 rows) - -SELECT unique1 FROM tenk1 -WHERE unique1 IN (1,42,7) -ORDER BY unique1; - unique1 ---------- - 1 - 7 - 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 --------------------------------------------------------------------------------- - Index Only Scan 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; - thousand | tenthous -----------+---------- - 0 | 3000 - 1 | 1001 -(2 rows) - --- 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 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 DESC, tenthous DESC; - thousand | tenthous -----------+---------- - 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) - -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 --- -explain (costs off) - select * from tenk1 where (thousand, tenthous) in ((1,1001), (null,null)); - QUERY PLAN ------------------------------------------------------- - Index Scan using tenk1_thous_tenthous on tenk1 - Index Cond: ((thousand = 1) AND (tenthous = 1001)) -(2 rows) - --- --- Check matching of boolean index columns to WHERE conditions and sort keys --- -create temp table boolindex (b bool, i int, unique(b, i), junk float); -explain (costs off) - select * from boolindex order by b, i limit 10; - QUERY PLAN -------------------------------------------------------- - Limit - -> Index Scan using boolindex_b_i_key on boolindex -(2 rows) - -explain (costs off) - select * from boolindex where b order by i limit 10; - QUERY PLAN -------------------------------------------------------- - Limit - -> Index Scan using boolindex_b_i_key on boolindex - Index Cond: (b = true) -(3 rows) - -explain (costs off) - select * from boolindex where b = true order by i desc limit 10; - QUERY PLAN ----------------------------------------------------------------- - Limit - -> Index Scan Backward using boolindex_b_i_key on boolindex - Index Cond: (b = true) -(3 rows) - -explain (costs off) - select * from boolindex where not b order by i limit 10; - QUERY PLAN -------------------------------------------------------- - Limit - -> Index Scan using boolindex_b_i_key on boolindex - Index Cond: (b = false) -(3 rows) - -explain (costs off) - select * from boolindex where b is true order by i desc limit 10; - QUERY PLAN ----------------------------------------------------------------- - Limit - -> Index Scan Backward using boolindex_b_i_key on boolindex - Index Cond: (b = true) -(3 rows) - -explain (costs off) - select * from boolindex where b is false order by i desc limit 10; - QUERY PLAN ----------------------------------------------------------------- - Limit - -> Index Scan Backward using boolindex_b_i_key on boolindex - Index Cond: (b = false) -(3 rows) - --- --- REINDEX (VERBOSE) --- -CREATE TABLE reindex_verbose(id integer primary key); -\set VERBOSITY terse \\ -- suppress machine-dependent details -REINDEX (VERBOSE) TABLE reindex_verbose; -INFO: index "reindex_verbose_pkey" was reindexed -\set VERBOSITY default -DROP TABLE reindex_verbose; --- --- REINDEX CONCURRENTLY --- -CREATE TABLE concur_reindex_tab (c1 int); --- REINDEX -REINDEX TABLE concur_reindex_tab; -- notice -NOTICE: table "concur_reindex_tab" has no indexes to reindex -REINDEX (CONCURRENTLY) TABLE concur_reindex_tab; -- notice -NOTICE: table "concur_reindex_tab" has no indexes that can be reindexed concurrently -ALTER TABLE concur_reindex_tab ADD COLUMN c2 text; -- add toast index --- Normal index with integer column -CREATE UNIQUE INDEX concur_reindex_ind1 ON concur_reindex_tab(c1); --- Normal index with text column -CREATE INDEX concur_reindex_ind2 ON concur_reindex_tab(c2); --- UNIQUE index with expression -CREATE UNIQUE INDEX concur_reindex_ind3 ON concur_reindex_tab(abs(c1)); --- Duplicate column names -CREATE INDEX concur_reindex_ind4 ON concur_reindex_tab(c1, c1, c2); --- Create table for check on foreign key dependence switch with indexes swapped -ALTER TABLE concur_reindex_tab ADD PRIMARY KEY USING INDEX concur_reindex_ind1; -CREATE TABLE concur_reindex_tab2 (c1 int REFERENCES concur_reindex_tab); -INSERT INTO concur_reindex_tab VALUES (1, 'a'); -INSERT INTO concur_reindex_tab VALUES (2, 'a'); --- Reindex concurrently of exclusion constraint currently not supported -CREATE TABLE concur_reindex_tab3 (c1 int, c2 int4range, EXCLUDE USING gist (c2 WITH &&)); -INSERT INTO concur_reindex_tab3 VALUES (3, '[1,2]'); -REINDEX INDEX CONCURRENTLY concur_reindex_tab3_c2_excl; -- error -ERROR: concurrent index creation for exclusion constraints is not supported -REINDEX TABLE CONCURRENTLY concur_reindex_tab3; -- succeeds with warning -WARNING: cannot reindex exclusion constraint index "public.concur_reindex_tab3_c2_excl" concurrently, skipping -INSERT INTO concur_reindex_tab3 VALUES (4, '[2,4]'); -ERROR: conflicting key value violates exclusion constraint "concur_reindex_tab3_c2_excl" -DETAIL: Key (c2)=([2,5)) conflicts with existing key (c2)=([1,3)). --- Check materialized views -CREATE MATERIALIZED VIEW concur_reindex_matview AS SELECT * FROM concur_reindex_tab; --- Dependency lookup before and after the follow-up REINDEX commands. --- These should remain consistent. -SELECT pg_describe_object(classid, objid, objsubid) as obj, - pg_describe_object(refclassid,refobjid,refobjsubid) as objref, - deptype -FROM pg_depend -WHERE classid = 'pg_class'::regclass AND - objid in ('concur_reindex_tab'::regclass, - 'concur_reindex_ind1'::regclass, - 'concur_reindex_ind2'::regclass, - 'concur_reindex_ind3'::regclass, - 'concur_reindex_ind4'::regclass, - 'concur_reindex_matview'::regclass) - ORDER BY 1, 2; - obj | objref | deptype -------------------------------------------+------------------------------------------------------------+--------- - index concur_reindex_ind1 | constraint concur_reindex_ind1 on table concur_reindex_tab | i - index concur_reindex_ind2 | column c2 of table concur_reindex_tab | a - index concur_reindex_ind3 | column c1 of table concur_reindex_tab | a - index concur_reindex_ind3 | table concur_reindex_tab | a - index concur_reindex_ind4 | column c1 of table concur_reindex_tab | a - index concur_reindex_ind4 | column c2 of table concur_reindex_tab | a - materialized view concur_reindex_matview | access method tde_heap | n - materialized view concur_reindex_matview | schema public | n - table concur_reindex_tab | access method tde_heap | n - table concur_reindex_tab | schema public | n -(10 rows) - -REINDEX INDEX CONCURRENTLY concur_reindex_ind1; -REINDEX TABLE CONCURRENTLY concur_reindex_tab; -REINDEX TABLE CONCURRENTLY concur_reindex_matview; -SELECT pg_describe_object(classid, objid, objsubid) as obj, - pg_describe_object(refclassid,refobjid,refobjsubid) as objref, - deptype -FROM pg_depend -WHERE classid = 'pg_class'::regclass AND - objid in ('concur_reindex_tab'::regclass, - 'concur_reindex_ind1'::regclass, - 'concur_reindex_ind2'::regclass, - 'concur_reindex_ind3'::regclass, - 'concur_reindex_ind4'::regclass, - 'concur_reindex_matview'::regclass) - ORDER BY 1, 2; - obj | objref | deptype -------------------------------------------+------------------------------------------------------------+--------- - index concur_reindex_ind1 | constraint concur_reindex_ind1 on table concur_reindex_tab | i - index concur_reindex_ind2 | column c2 of table concur_reindex_tab | a - index concur_reindex_ind3 | column c1 of table concur_reindex_tab | a - index concur_reindex_ind3 | table concur_reindex_tab | a - index concur_reindex_ind4 | column c1 of table concur_reindex_tab | a - index concur_reindex_ind4 | column c2 of table concur_reindex_tab | a - materialized view concur_reindex_matview | access method tde_heap | n - materialized view concur_reindex_matview | schema public | n - table concur_reindex_tab | access method tde_heap | n - table concur_reindex_tab | schema public | n -(10 rows) - --- Check that comments are preserved -CREATE TABLE testcomment (i int); -CREATE INDEX testcomment_idx1 ON testcomment (i); -COMMENT ON INDEX testcomment_idx1 IS 'test comment'; -SELECT obj_description('testcomment_idx1'::regclass, 'pg_class'); - obj_description ------------------ - test comment -(1 row) - -REINDEX TABLE testcomment; -SELECT obj_description('testcomment_idx1'::regclass, 'pg_class'); - obj_description ------------------ - test comment -(1 row) - -REINDEX TABLE CONCURRENTLY testcomment ; -SELECT obj_description('testcomment_idx1'::regclass, 'pg_class'); - obj_description ------------------ - test comment -(1 row) - -DROP TABLE testcomment; --- Check that indisclustered updates are preserved -CREATE TABLE concur_clustered(i int); -CREATE INDEX concur_clustered_i_idx ON concur_clustered(i); -ALTER TABLE concur_clustered CLUSTER ON concur_clustered_i_idx; -REINDEX TABLE CONCURRENTLY concur_clustered; -SELECT indexrelid::regclass, indisclustered FROM pg_index - WHERE indrelid = 'concur_clustered'::regclass; - indexrelid | indisclustered -------------------------+---------------- - concur_clustered_i_idx | t -(1 row) - -DROP TABLE concur_clustered; --- Check that indisreplident updates are preserved. -CREATE TABLE concur_replident(i int NOT NULL); -CREATE UNIQUE INDEX concur_replident_i_idx ON concur_replident(i); -ALTER TABLE concur_replident REPLICA IDENTITY - USING INDEX concur_replident_i_idx; -SELECT indexrelid::regclass, indisreplident FROM pg_index - WHERE indrelid = 'concur_replident'::regclass; - indexrelid | indisreplident -------------------------+---------------- - concur_replident_i_idx | t -(1 row) - -REINDEX TABLE CONCURRENTLY concur_replident; -SELECT indexrelid::regclass, indisreplident FROM pg_index - WHERE indrelid = 'concur_replident'::regclass; - indexrelid | indisreplident -------------------------+---------------- - concur_replident_i_idx | t -(1 row) - -DROP TABLE concur_replident; --- Check that opclass parameters are preserved -CREATE TABLE concur_appclass_tab(i tsvector, j tsvector, k tsvector); -CREATE INDEX concur_appclass_ind on concur_appclass_tab - USING gist (i tsvector_ops (siglen='1000'), j tsvector_ops (siglen='500')); -CREATE INDEX concur_appclass_ind_2 on concur_appclass_tab - USING gist (k tsvector_ops (siglen='300'), j tsvector_ops); -REINDEX TABLE CONCURRENTLY concur_appclass_tab; -\d concur_appclass_tab - Table "public.concur_appclass_tab" - Column | Type | Collation | Nullable | Default ---------+----------+-----------+----------+--------- - i | tsvector | | | - j | tsvector | | | - k | tsvector | | | -Indexes: - "concur_appclass_ind" gist (i tsvector_ops (siglen='1000'), j tsvector_ops (siglen='500')) - "concur_appclass_ind_2" gist (k tsvector_ops (siglen='300'), j) - -DROP TABLE concur_appclass_tab; --- Partitions --- Create some partitioned tables -CREATE TABLE concur_reindex_part (c1 int, c2 int) PARTITION BY RANGE (c1); -CREATE TABLE concur_reindex_part_0 PARTITION OF concur_reindex_part - FOR VALUES FROM (0) TO (10) PARTITION BY list (c2); -CREATE TABLE concur_reindex_part_0_1 PARTITION OF concur_reindex_part_0 - FOR VALUES IN (1); -CREATE TABLE concur_reindex_part_0_2 PARTITION OF concur_reindex_part_0 - FOR VALUES IN (2); --- This partitioned table will have no partitions. -CREATE TABLE concur_reindex_part_10 PARTITION OF concur_reindex_part - FOR VALUES FROM (10) TO (20) PARTITION BY list (c2); --- Create some partitioned indexes -CREATE INDEX concur_reindex_part_index ON ONLY concur_reindex_part (c1); -CREATE INDEX concur_reindex_part_index_0 ON ONLY concur_reindex_part_0 (c1); -ALTER INDEX concur_reindex_part_index ATTACH PARTITION concur_reindex_part_index_0; --- This partitioned index will have no partitions. -CREATE INDEX concur_reindex_part_index_10 ON ONLY concur_reindex_part_10 (c1); -ALTER INDEX concur_reindex_part_index ATTACH PARTITION concur_reindex_part_index_10; -CREATE INDEX concur_reindex_part_index_0_1 ON ONLY concur_reindex_part_0_1 (c1); -ALTER INDEX concur_reindex_part_index_0 ATTACH PARTITION concur_reindex_part_index_0_1; -CREATE INDEX concur_reindex_part_index_0_2 ON ONLY concur_reindex_part_0_2 (c1); -ALTER INDEX concur_reindex_part_index_0 ATTACH PARTITION concur_reindex_part_index_0_2; -SELECT relid, parentrelid, level FROM pg_partition_tree('concur_reindex_part_index') - ORDER BY relid, level; - relid | parentrelid | level --------------------------------+-----------------------------+------- - concur_reindex_part_index | | 0 - concur_reindex_part_index_0 | concur_reindex_part_index | 1 - concur_reindex_part_index_10 | concur_reindex_part_index | 1 - concur_reindex_part_index_0_1 | concur_reindex_part_index_0 | 2 - concur_reindex_part_index_0_2 | concur_reindex_part_index_0 | 2 -(5 rows) - -SELECT relid, parentrelid, level FROM pg_partition_tree('concur_reindex_part_index') - ORDER BY relid, level; - relid | parentrelid | level --------------------------------+-----------------------------+------- - concur_reindex_part_index | | 0 - concur_reindex_part_index_0 | concur_reindex_part_index | 1 - concur_reindex_part_index_10 | concur_reindex_part_index | 1 - concur_reindex_part_index_0_1 | concur_reindex_part_index_0 | 2 - concur_reindex_part_index_0_2 | concur_reindex_part_index_0 | 2 -(5 rows) - --- REINDEX should preserve dependencies of partition tree. -SELECT pg_describe_object(classid, objid, objsubid) as obj, - pg_describe_object(refclassid,refobjid,refobjsubid) as objref, - deptype -FROM pg_depend -WHERE classid = 'pg_class'::regclass AND - objid in ('concur_reindex_part'::regclass, - 'concur_reindex_part_0'::regclass, - 'concur_reindex_part_0_1'::regclass, - 'concur_reindex_part_0_2'::regclass, - 'concur_reindex_part_index'::regclass, - 'concur_reindex_part_index_0'::regclass, - 'concur_reindex_part_index_0_1'::regclass, - 'concur_reindex_part_index_0_2'::regclass) - ORDER BY 1, 2; - obj | objref | deptype -------------------------------------------+--------------------------------------------+--------- - column c1 of table concur_reindex_part | table concur_reindex_part | i - column c2 of table concur_reindex_part_0 | table concur_reindex_part_0 | i - index concur_reindex_part_index | column c1 of table concur_reindex_part | a - index concur_reindex_part_index_0 | column c1 of table concur_reindex_part_0 | a - index concur_reindex_part_index_0 | index concur_reindex_part_index | P - index concur_reindex_part_index_0 | table concur_reindex_part_0 | S - index concur_reindex_part_index_0_1 | column c1 of table concur_reindex_part_0_1 | a - index concur_reindex_part_index_0_1 | index concur_reindex_part_index_0 | P - index concur_reindex_part_index_0_1 | table concur_reindex_part_0_1 | S - index concur_reindex_part_index_0_2 | column c1 of table concur_reindex_part_0_2 | a - index concur_reindex_part_index_0_2 | index concur_reindex_part_index_0 | P - index concur_reindex_part_index_0_2 | table concur_reindex_part_0_2 | S - table concur_reindex_part | schema public | n - table concur_reindex_part_0 | schema public | n - table concur_reindex_part_0 | table concur_reindex_part | a - table concur_reindex_part_0_1 | access method tde_heap | n - table concur_reindex_part_0_1 | schema public | n - table concur_reindex_part_0_1 | table concur_reindex_part_0 | a - table concur_reindex_part_0_2 | access method tde_heap | n - table concur_reindex_part_0_2 | schema public | n - table concur_reindex_part_0_2 | table concur_reindex_part_0 | a -(21 rows) - -REINDEX INDEX CONCURRENTLY concur_reindex_part_index_0_1; -REINDEX INDEX CONCURRENTLY concur_reindex_part_index_0_2; -SELECT relid, parentrelid, level FROM pg_partition_tree('concur_reindex_part_index') - ORDER BY relid, level; - relid | parentrelid | level --------------------------------+-----------------------------+------- - concur_reindex_part_index | | 0 - concur_reindex_part_index_0 | concur_reindex_part_index | 1 - concur_reindex_part_index_10 | concur_reindex_part_index | 1 - concur_reindex_part_index_0_1 | concur_reindex_part_index_0 | 2 - concur_reindex_part_index_0_2 | concur_reindex_part_index_0 | 2 -(5 rows) - -REINDEX TABLE CONCURRENTLY concur_reindex_part_0_1; -REINDEX TABLE CONCURRENTLY concur_reindex_part_0_2; -SELECT pg_describe_object(classid, objid, objsubid) as obj, - pg_describe_object(refclassid,refobjid,refobjsubid) as objref, - deptype -FROM pg_depend -WHERE classid = 'pg_class'::regclass AND - objid in ('concur_reindex_part'::regclass, - 'concur_reindex_part_0'::regclass, - 'concur_reindex_part_0_1'::regclass, - 'concur_reindex_part_0_2'::regclass, - 'concur_reindex_part_index'::regclass, - 'concur_reindex_part_index_0'::regclass, - 'concur_reindex_part_index_0_1'::regclass, - 'concur_reindex_part_index_0_2'::regclass) - ORDER BY 1, 2; - obj | objref | deptype -------------------------------------------+--------------------------------------------+--------- - column c1 of table concur_reindex_part | table concur_reindex_part | i - column c2 of table concur_reindex_part_0 | table concur_reindex_part_0 | i - index concur_reindex_part_index | column c1 of table concur_reindex_part | a - index concur_reindex_part_index_0 | column c1 of table concur_reindex_part_0 | a - index concur_reindex_part_index_0 | index concur_reindex_part_index | P - index concur_reindex_part_index_0 | table concur_reindex_part_0 | S - index concur_reindex_part_index_0_1 | column c1 of table concur_reindex_part_0_1 | a - index concur_reindex_part_index_0_1 | index concur_reindex_part_index_0 | P - index concur_reindex_part_index_0_1 | table concur_reindex_part_0_1 | S - index concur_reindex_part_index_0_2 | column c1 of table concur_reindex_part_0_2 | a - index concur_reindex_part_index_0_2 | index concur_reindex_part_index_0 | P - index concur_reindex_part_index_0_2 | table concur_reindex_part_0_2 | S - table concur_reindex_part | schema public | n - table concur_reindex_part_0 | schema public | n - table concur_reindex_part_0 | table concur_reindex_part | a - table concur_reindex_part_0_1 | access method tde_heap | n - table concur_reindex_part_0_1 | schema public | n - table concur_reindex_part_0_1 | table concur_reindex_part_0 | a - table concur_reindex_part_0_2 | access method tde_heap | n - table concur_reindex_part_0_2 | schema public | n - table concur_reindex_part_0_2 | table concur_reindex_part_0 | a -(21 rows) - -SELECT relid, parentrelid, level FROM pg_partition_tree('concur_reindex_part_index') - ORDER BY relid, level; - relid | parentrelid | level --------------------------------+-----------------------------+------- - concur_reindex_part_index | | 0 - concur_reindex_part_index_0 | concur_reindex_part_index | 1 - concur_reindex_part_index_10 | concur_reindex_part_index | 1 - concur_reindex_part_index_0_1 | concur_reindex_part_index_0 | 2 - concur_reindex_part_index_0_2 | concur_reindex_part_index_0 | 2 -(5 rows) - --- REINDEX for partitioned indexes --- REINDEX TABLE fails for partitioned indexes --- Top-most parent index -REINDEX TABLE concur_reindex_part_index; -- error -ERROR: "concur_reindex_part_index" is not a table or materialized view -REINDEX TABLE CONCURRENTLY concur_reindex_part_index; -- error -ERROR: "concur_reindex_part_index" is not a table or materialized view --- Partitioned index with no leaves -REINDEX TABLE concur_reindex_part_index_10; -- error -ERROR: "concur_reindex_part_index_10" is not a table or materialized view -REINDEX TABLE CONCURRENTLY concur_reindex_part_index_10; -- error -ERROR: "concur_reindex_part_index_10" is not a table or materialized view --- Cannot run in a transaction block -BEGIN; -REINDEX INDEX concur_reindex_part_index; -ERROR: REINDEX INDEX cannot run inside a transaction block -CONTEXT: while reindexing partitioned index "public.concur_reindex_part_index" -ROLLBACK; --- Helper functions to track changes of relfilenodes in a partition tree. --- Create a table tracking the relfilenode state. -CREATE OR REPLACE FUNCTION create_relfilenode_part(relname text, indname text) - RETURNS VOID AS - $func$ - BEGIN - EXECUTE format(' - CREATE TABLE %I AS - SELECT oid, relname, relfilenode, relkind, reltoastrelid - FROM pg_class - WHERE oid IN - (SELECT relid FROM pg_partition_tree(''%I''));', - relname, indname); - END - $func$ LANGUAGE plpgsql; -CREATE OR REPLACE FUNCTION compare_relfilenode_part(tabname text) - RETURNS TABLE (relname name, relkind "char", state text) AS - $func$ - BEGIN - RETURN QUERY EXECUTE - format( - 'SELECT b.relname, - b.relkind, - CASE WHEN a.relfilenode = b.relfilenode THEN ''relfilenode is unchanged'' - ELSE ''relfilenode has changed'' END - -- Do not join with OID here as CONCURRENTLY changes it. - FROM %I b JOIN pg_class a ON b.relname = a.relname - ORDER BY 1;', tabname); - END - $func$ LANGUAGE plpgsql; --- Check that expected relfilenodes are changed, non-concurrent case. -SELECT create_relfilenode_part('reindex_index_status', 'concur_reindex_part_index'); - create_relfilenode_part -------------------------- - -(1 row) - -REINDEX INDEX concur_reindex_part_index; -SELECT * FROM compare_relfilenode_part('reindex_index_status'); - relname | relkind | state --------------------------------+---------+-------------------------- - concur_reindex_part_index | I | relfilenode is unchanged - concur_reindex_part_index_0 | I | relfilenode is unchanged - concur_reindex_part_index_0_1 | i | relfilenode has changed - concur_reindex_part_index_0_2 | i | relfilenode has changed - concur_reindex_part_index_10 | I | relfilenode is unchanged -(5 rows) - -DROP TABLE reindex_index_status; --- concurrent case. -SELECT create_relfilenode_part('reindex_index_status', 'concur_reindex_part_index'); - create_relfilenode_part -------------------------- - -(1 row) - -REINDEX INDEX CONCURRENTLY concur_reindex_part_index; -SELECT * FROM compare_relfilenode_part('reindex_index_status'); - relname | relkind | state --------------------------------+---------+-------------------------- - concur_reindex_part_index | I | relfilenode is unchanged - concur_reindex_part_index_0 | I | relfilenode is unchanged - concur_reindex_part_index_0_1 | i | relfilenode has changed - concur_reindex_part_index_0_2 | i | relfilenode has changed - concur_reindex_part_index_10 | I | relfilenode is unchanged -(5 rows) - -DROP TABLE reindex_index_status; --- REINDEX for partitioned tables --- REINDEX INDEX fails for partitioned tables --- Top-most parent -REINDEX INDEX concur_reindex_part; -- error -ERROR: "concur_reindex_part" is not an index -REINDEX INDEX CONCURRENTLY concur_reindex_part; -- error -ERROR: "concur_reindex_part" is not an index --- Partitioned with no leaves -REINDEX INDEX concur_reindex_part_10; -- error -ERROR: "concur_reindex_part_10" is not an index -REINDEX INDEX CONCURRENTLY concur_reindex_part_10; -- error -ERROR: "concur_reindex_part_10" is not an index --- Cannot run in a transaction block -BEGIN; -REINDEX TABLE concur_reindex_part; -ERROR: REINDEX TABLE cannot run inside a transaction block -CONTEXT: while reindexing partitioned table "public.concur_reindex_part" -ROLLBACK; --- Check that expected relfilenodes are changed, non-concurrent case. --- Note that the partition tree changes of the *indexes* need to be checked. -SELECT create_relfilenode_part('reindex_index_status', 'concur_reindex_part_index'); - create_relfilenode_part -------------------------- - -(1 row) - -REINDEX TABLE concur_reindex_part; -SELECT * FROM compare_relfilenode_part('reindex_index_status'); - relname | relkind | state --------------------------------+---------+-------------------------- - concur_reindex_part_index | I | relfilenode is unchanged - concur_reindex_part_index_0 | I | relfilenode is unchanged - concur_reindex_part_index_0_1 | i | relfilenode has changed - concur_reindex_part_index_0_2 | i | relfilenode has changed - concur_reindex_part_index_10 | I | relfilenode is unchanged -(5 rows) - -DROP TABLE reindex_index_status; --- concurrent case. -SELECT create_relfilenode_part('reindex_index_status', 'concur_reindex_part_index'); - create_relfilenode_part -------------------------- - -(1 row) - -REINDEX TABLE CONCURRENTLY concur_reindex_part; -SELECT * FROM compare_relfilenode_part('reindex_index_status'); - relname | relkind | state --------------------------------+---------+-------------------------- - concur_reindex_part_index | I | relfilenode is unchanged - concur_reindex_part_index_0 | I | relfilenode is unchanged - concur_reindex_part_index_0_1 | i | relfilenode has changed - concur_reindex_part_index_0_2 | i | relfilenode has changed - concur_reindex_part_index_10 | I | relfilenode is unchanged -(5 rows) - -DROP TABLE reindex_index_status; -DROP FUNCTION create_relfilenode_part; -DROP FUNCTION compare_relfilenode_part; --- Cleanup of partition tree used for REINDEX test. -DROP TABLE concur_reindex_part; --- Check errors --- Cannot run inside a transaction block -BEGIN; -REINDEX TABLE CONCURRENTLY concur_reindex_tab; -ERROR: REINDEX CONCURRENTLY cannot run inside a transaction block -COMMIT; -REINDEX TABLE CONCURRENTLY pg_class; -- no catalog relation -ERROR: cannot reindex system catalogs concurrently -REINDEX INDEX CONCURRENTLY pg_class_oid_index; -- no catalog index -ERROR: cannot reindex system catalogs concurrently --- These are the toast table and index of pg_authid. -REINDEX TABLE CONCURRENTLY pg_toast.pg_toast_1260; -- no catalog toast table -ERROR: cannot reindex system catalogs concurrently -REINDEX INDEX CONCURRENTLY pg_toast.pg_toast_1260_index; -- no catalog toast index -ERROR: cannot reindex system catalogs concurrently -REINDEX SYSTEM CONCURRENTLY postgres; -- not allowed for SYSTEM -ERROR: cannot reindex system catalogs concurrently -REINDEX (CONCURRENTLY) SYSTEM postgres; -- ditto -ERROR: cannot reindex system catalogs concurrently -REINDEX (CONCURRENTLY) SYSTEM; -- ditto -ERROR: cannot reindex system catalogs concurrently --- Warns about catalog relations -REINDEX SCHEMA CONCURRENTLY pg_catalog; -WARNING: cannot reindex system catalogs concurrently, skipping all --- Not the current database -REINDEX DATABASE not_current_database; -ERROR: can only reindex the currently open database --- Check the relation status, there should not be invalid indexes -\d concur_reindex_tab - Table "public.concur_reindex_tab" - Column | Type | Collation | Nullable | Default ---------+---------+-----------+----------+--------- - c1 | integer | | not null | - c2 | text | | | -Indexes: - "concur_reindex_ind1" PRIMARY KEY, btree (c1) - "concur_reindex_ind2" btree (c2) - "concur_reindex_ind3" UNIQUE, btree (abs(c1)) - "concur_reindex_ind4" btree (c1, c1, c2) -Referenced by: - TABLE "concur_reindex_tab2" CONSTRAINT "concur_reindex_tab2_c1_fkey" FOREIGN KEY (c1) REFERENCES concur_reindex_tab(c1) - -DROP MATERIALIZED VIEW concur_reindex_matview; -DROP TABLE concur_reindex_tab, concur_reindex_tab2, concur_reindex_tab3; --- Check handling of invalid indexes -CREATE TABLE concur_reindex_tab4 (c1 int); -INSERT INTO concur_reindex_tab4 VALUES (1), (1), (2); --- This trick creates an invalid index. -CREATE UNIQUE INDEX CONCURRENTLY concur_reindex_ind5 ON concur_reindex_tab4 (c1); -ERROR: could not create unique index "concur_reindex_ind5" -DETAIL: Key (c1)=(1) is duplicated. --- Reindexing concurrently this index fails with the same failure. --- The extra index created is itself invalid, and can be dropped. -REINDEX INDEX CONCURRENTLY concur_reindex_ind5; -ERROR: could not create unique index "concur_reindex_ind5_ccnew" -DETAIL: Key (c1)=(1) is duplicated. -\d concur_reindex_tab4 - Table "public.concur_reindex_tab4" - Column | Type | Collation | Nullable | Default ---------+---------+-----------+----------+--------- - c1 | integer | | | -Indexes: - "concur_reindex_ind5" UNIQUE, btree (c1) INVALID - "concur_reindex_ind5_ccnew" UNIQUE, btree (c1) INVALID - -DROP INDEX concur_reindex_ind5_ccnew; --- This makes the previous failure go away, so the index can become valid. -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: 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" - Column | Type | Collation | Nullable | Default ---------+---------+-----------+----------+--------- - c1 | integer | | | -Indexes: - "concur_reindex_ind5" UNIQUE, btree (c1) INVALID - --- But it is fixed with REINDEX INDEX. -REINDEX INDEX CONCURRENTLY concur_reindex_ind5; -\d concur_reindex_tab4 - Table "public.concur_reindex_tab4" - Column | Type | Collation | Nullable | Default ---------+---------+-----------+----------+--------- - c1 | integer | | | -Indexes: - "concur_reindex_ind5" UNIQUE, btree (c1) - -DROP TABLE concur_reindex_tab4; --- Check handling of indexes with expressions and predicates. The --- definitions of the rebuilt indexes should match the original --- definitions. -CREATE TABLE concur_exprs_tab (c1 int , c2 boolean); -INSERT INTO concur_exprs_tab (c1, c2) VALUES (1369652450, FALSE), - (414515746, TRUE), - (897778963, FALSE); -CREATE UNIQUE INDEX concur_exprs_index_expr - ON concur_exprs_tab ((c1::text COLLATE "C")); -CREATE UNIQUE INDEX concur_exprs_index_pred ON concur_exprs_tab (c1) - WHERE (c1::text > 500000000::text COLLATE "C"); -CREATE UNIQUE INDEX concur_exprs_index_pred_2 - ON concur_exprs_tab ((1 / c1)) - WHERE ('-H') >= (c2::TEXT) COLLATE "C"; -ALTER INDEX concur_exprs_index_expr ALTER COLUMN 1 SET STATISTICS 100; -ANALYZE concur_exprs_tab; -SELECT starelid::regclass, count(*) FROM pg_statistic WHERE starelid IN ( - 'concur_exprs_index_expr'::regclass, - 'concur_exprs_index_pred'::regclass, - 'concur_exprs_index_pred_2'::regclass) - GROUP BY starelid ORDER BY starelid::regclass::text; - starelid | count --------------------------+------- - concur_exprs_index_expr | 1 -(1 row) - -SELECT pg_get_indexdef('concur_exprs_index_expr'::regclass); - pg_get_indexdef ---------------------------------------------------------------------------------------------------------------- - CREATE UNIQUE INDEX concur_exprs_index_expr ON public.concur_exprs_tab USING btree (((c1)::text) COLLATE "C") -(1 row) - -SELECT pg_get_indexdef('concur_exprs_index_pred'::regclass); - pg_get_indexdef ----------------------------------------------------------------------------------------------------------------------------------------------- - CREATE UNIQUE INDEX concur_exprs_index_pred ON public.concur_exprs_tab USING btree (c1) WHERE ((c1)::text > ((500000000)::text COLLATE "C")) -(1 row) - -SELECT pg_get_indexdef('concur_exprs_index_pred_2'::regclass); - pg_get_indexdef --------------------------------------------------------------------------------------------------------------------------------------------------- - CREATE UNIQUE INDEX concur_exprs_index_pred_2 ON public.concur_exprs_tab USING btree (((1 / c1))) WHERE ('-H'::text >= ((c2)::text COLLATE "C")) -(1 row) - -REINDEX TABLE CONCURRENTLY concur_exprs_tab; -SELECT pg_get_indexdef('concur_exprs_index_expr'::regclass); - pg_get_indexdef ---------------------------------------------------------------------------------------------------------------- - CREATE UNIQUE INDEX concur_exprs_index_expr ON public.concur_exprs_tab USING btree (((c1)::text) COLLATE "C") -(1 row) - -SELECT pg_get_indexdef('concur_exprs_index_pred'::regclass); - pg_get_indexdef ----------------------------------------------------------------------------------------------------------------------------------------------- - CREATE UNIQUE INDEX concur_exprs_index_pred ON public.concur_exprs_tab USING btree (c1) WHERE ((c1)::text > ((500000000)::text COLLATE "C")) -(1 row) - -SELECT pg_get_indexdef('concur_exprs_index_pred_2'::regclass); - pg_get_indexdef --------------------------------------------------------------------------------------------------------------------------------------------------- - CREATE UNIQUE INDEX concur_exprs_index_pred_2 ON public.concur_exprs_tab USING btree (((1 / c1))) WHERE ('-H'::text >= ((c2)::text COLLATE "C")) -(1 row) - --- ALTER TABLE recreates the indexes, which should keep their collations. -ALTER TABLE concur_exprs_tab ALTER c2 TYPE TEXT; -SELECT pg_get_indexdef('concur_exprs_index_expr'::regclass); - pg_get_indexdef ---------------------------------------------------------------------------------------------------------------- - CREATE UNIQUE INDEX concur_exprs_index_expr ON public.concur_exprs_tab USING btree (((c1)::text) COLLATE "C") -(1 row) - -SELECT pg_get_indexdef('concur_exprs_index_pred'::regclass); - pg_get_indexdef ----------------------------------------------------------------------------------------------------------------------------------------------- - CREATE UNIQUE INDEX concur_exprs_index_pred ON public.concur_exprs_tab USING btree (c1) WHERE ((c1)::text > ((500000000)::text COLLATE "C")) -(1 row) - -SELECT pg_get_indexdef('concur_exprs_index_pred_2'::regclass); - pg_get_indexdef ------------------------------------------------------------------------------------------------------------------------------------------- - CREATE UNIQUE INDEX concur_exprs_index_pred_2 ON public.concur_exprs_tab USING btree (((1 / c1))) WHERE ('-H'::text >= (c2 COLLATE "C")) -(1 row) - --- Statistics should remain intact. -SELECT starelid::regclass, count(*) FROM pg_statistic WHERE starelid IN ( - 'concur_exprs_index_expr'::regclass, - 'concur_exprs_index_pred'::regclass, - 'concur_exprs_index_pred_2'::regclass) - GROUP BY starelid ORDER BY starelid::regclass::text; - starelid | count --------------------------+------- - concur_exprs_index_expr | 1 -(1 row) - --- attstattarget should remain intact -SELECT attrelid::regclass, attnum, attstattarget - FROM pg_attribute WHERE attrelid IN ( - 'concur_exprs_index_expr'::regclass, - 'concur_exprs_index_pred'::regclass, - 'concur_exprs_index_pred_2'::regclass) - ORDER BY attrelid::regclass::text, attnum; - attrelid | attnum | attstattarget ----------------------------+--------+--------------- - concur_exprs_index_expr | 1 | 100 - concur_exprs_index_pred | 1 | - concur_exprs_index_pred_2 | 1 | -(3 rows) - -DROP TABLE concur_exprs_tab; --- Temporary tables and on-commit actions, where CONCURRENTLY is ignored. --- ON COMMIT PRESERVE ROWS, the default. -CREATE TEMP TABLE concur_temp_tab_1 (c1 int, c2 text) - ON COMMIT PRESERVE ROWS; -INSERT INTO concur_temp_tab_1 VALUES (1, 'foo'), (2, 'bar'); -CREATE INDEX concur_temp_ind_1 ON concur_temp_tab_1(c2); -REINDEX TABLE CONCURRENTLY concur_temp_tab_1; -REINDEX INDEX CONCURRENTLY concur_temp_ind_1; --- Still fails in transaction blocks -BEGIN; -REINDEX INDEX CONCURRENTLY concur_temp_ind_1; -ERROR: REINDEX CONCURRENTLY cannot run inside a transaction block -COMMIT; --- ON COMMIT DELETE ROWS -CREATE TEMP TABLE concur_temp_tab_2 (c1 int, c2 text) - ON COMMIT DELETE ROWS; -CREATE INDEX concur_temp_ind_2 ON concur_temp_tab_2(c2); -REINDEX TABLE CONCURRENTLY concur_temp_tab_2; -REINDEX INDEX CONCURRENTLY concur_temp_ind_2; --- ON COMMIT DROP -BEGIN; -CREATE TEMP TABLE concur_temp_tab_3 (c1 int, c2 text) - ON COMMIT PRESERVE ROWS; -INSERT INTO concur_temp_tab_3 VALUES (1, 'foo'), (2, 'bar'); -CREATE INDEX concur_temp_ind_3 ON concur_temp_tab_3(c2); --- Fails when running in a transaction -REINDEX INDEX CONCURRENTLY concur_temp_ind_3; -ERROR: REINDEX CONCURRENTLY cannot run inside a transaction block -COMMIT; --- REINDEX SCHEMA processes all temporary relations -CREATE TABLE reindex_temp_before AS -SELECT oid, relname, relfilenode, relkind, reltoastrelid - FROM pg_class - WHERE relname IN ('concur_temp_ind_1', 'concur_temp_ind_2'); -SELECT pg_my_temp_schema()::regnamespace as temp_schema_name \gset -REINDEX SCHEMA CONCURRENTLY :temp_schema_name; -SELECT b.relname, - b.relkind, - CASE WHEN a.relfilenode = b.relfilenode THEN 'relfilenode is unchanged' - ELSE 'relfilenode has changed' END - FROM reindex_temp_before b JOIN pg_class a ON b.oid = a.oid - ORDER BY 1; - relname | relkind | case --------------------+---------+------------------------- - concur_temp_ind_1 | i | relfilenode has changed - concur_temp_ind_2 | i | relfilenode has changed -(2 rows) - -DROP TABLE concur_temp_tab_1, concur_temp_tab_2, reindex_temp_before; --- --- REINDEX SCHEMA --- -REINDEX SCHEMA schema_to_reindex; -- failure, schema does not exist -ERROR: schema "schema_to_reindex" does not exist -CREATE SCHEMA schema_to_reindex; -SET search_path = 'schema_to_reindex'; -CREATE TABLE table1(col1 SERIAL PRIMARY KEY); -INSERT INTO table1 SELECT generate_series(1,400); -CREATE TABLE table2(col1 SERIAL PRIMARY KEY, col2 TEXT NOT NULL); -INSERT INTO table2 SELECT generate_series(1,400), 'abc'; -CREATE INDEX ON table2(col2); -CREATE MATERIALIZED VIEW matview AS SELECT col1 FROM table2; -CREATE INDEX ON matview(col1); -CREATE VIEW view AS SELECT col2 FROM table2; -CREATE TABLE reindex_before AS -SELECT oid, relname, relfilenode, relkind, reltoastrelid - FROM pg_class - where relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'schema_to_reindex'); -INSERT INTO reindex_before -SELECT oid, 'pg_toast_TABLE', relfilenode, relkind, reltoastrelid -FROM pg_class WHERE oid IN - (SELECT reltoastrelid FROM reindex_before WHERE reltoastrelid > 0); -INSERT INTO reindex_before -SELECT oid, 'pg_toast_TABLE_index', relfilenode, relkind, reltoastrelid -FROM pg_class where oid in - (select indexrelid from pg_index where indrelid in - (select reltoastrelid from reindex_before where reltoastrelid > 0)); -REINDEX SCHEMA schema_to_reindex; -CREATE TABLE reindex_after AS SELECT oid, relname, relfilenode, relkind - FROM pg_class - where relnamespace = (SELECT oid FROM pg_namespace WHERE nspname = 'schema_to_reindex'); -SELECT b.relname, - b.relkind, - CASE WHEN a.relfilenode = b.relfilenode THEN 'relfilenode is unchanged' - ELSE 'relfilenode has changed' END - FROM reindex_before b JOIN pg_class a ON b.oid = a.oid - ORDER BY 1; - relname | relkind | case -----------------------+---------+-------------------------- - matview | m | relfilenode is unchanged - matview_col1_idx | i | relfilenode has changed - pg_toast_TABLE | t | relfilenode is unchanged - pg_toast_TABLE_index | i | relfilenode has changed - table1 | r | relfilenode is unchanged - table1_col1_seq | S | relfilenode is unchanged - table1_pkey | i | relfilenode has changed - table2 | r | relfilenode is unchanged - table2_col1_seq | S | relfilenode is unchanged - table2_col2_idx | i | relfilenode has changed - table2_pkey | i | relfilenode has changed - view | v | relfilenode is unchanged -(12 rows) - -REINDEX SCHEMA schema_to_reindex; -BEGIN; -REINDEX SCHEMA schema_to_reindex; -- failure, cannot run in a transaction -ERROR: REINDEX SCHEMA cannot run inside a transaction block -END; --- concurrently -REINDEX SCHEMA CONCURRENTLY schema_to_reindex; --- Failure for unauthorized user -CREATE ROLE regress_reindexuser NOLOGIN; -SET SESSION ROLE regress_reindexuser; -REINDEX SCHEMA schema_to_reindex; -ERROR: must be owner of schema schema_to_reindex --- Permission failures with toast tables and indexes (pg_authid here) -RESET ROLE; -GRANT USAGE ON SCHEMA pg_toast TO regress_reindexuser; -SET SESSION ROLE regress_reindexuser; -REINDEX TABLE pg_toast.pg_toast_1260; -ERROR: permission denied for table pg_toast_1260 -REINDEX INDEX pg_toast.pg_toast_1260_index; -ERROR: permission denied for index pg_toast_1260_index --- Clean up -RESET ROLE; -REVOKE USAGE ON SCHEMA pg_toast FROM regress_reindexuser; -DROP ROLE regress_reindexuser; -DROP SCHEMA schema_to_reindex CASCADE; -NOTICE: drop cascades to 6 other objects -DETAIL: drop cascades to table table1 -drop cascades to table table2 -drop cascades to materialized view matview -drop cascades to view view -drop cascades to table reindex_before -drop cascades to table reindex_after diff --git a/src/test/regress/expected/event_trigger_1.out b/src/test/regress/expected/event_trigger_1.out deleted file mode 100644 index 9786bc0a00ac4..0000000000000 --- a/src/test/regress/expected/event_trigger_1.out +++ /dev/null @@ -1,744 +0,0 @@ --- should fail, return type mismatch -create event trigger regress_event_trigger - on ddl_command_start - execute procedure pg_backend_pid(); -ERROR: function pg_backend_pid must return type event_trigger --- OK -create function test_event_trigger() returns event_trigger as $$ -BEGIN - RAISE NOTICE 'test_event_trigger: % %', tg_event, tg_tag; -END -$$ language plpgsql; --- should fail, can't call it as a plain function -SELECT test_event_trigger(); -ERROR: trigger functions can only be called as triggers -CONTEXT: compilation of PL/pgSQL function "test_event_trigger" near line 1 --- should fail, event triggers cannot have declared arguments -create function test_event_trigger_arg(name text) -returns event_trigger as $$ BEGIN RETURN 1; END $$ language plpgsql; -ERROR: event trigger functions cannot have declared arguments -CONTEXT: compilation of PL/pgSQL function "test_event_trigger_arg" near line 1 --- should fail, SQL functions cannot be event triggers -create function test_event_trigger_sql() returns event_trigger as $$ -SELECT 1 $$ language sql; -ERROR: SQL functions cannot return type event_trigger --- should fail, no elephant_bootstrap entry point -create event trigger regress_event_trigger on elephant_bootstrap - execute procedure test_event_trigger(); -ERROR: unrecognized event name "elephant_bootstrap" --- OK -create event trigger regress_event_trigger on ddl_command_start - execute procedure test_event_trigger(); --- OK -create event trigger regress_event_trigger_end on ddl_command_end - execute function test_event_trigger(); --- should fail, food is not a valid filter variable -create event trigger regress_event_trigger2 on ddl_command_start - when food in ('sandwich') - execute procedure test_event_trigger(); -ERROR: unrecognized filter variable "food" --- should fail, sandwich is not a valid command tag -create event trigger regress_event_trigger2 on ddl_command_start - when tag in ('sandwich') - execute procedure test_event_trigger(); -ERROR: filter value "sandwich" not recognized for filter variable "tag" --- should fail, create skunkcabbage is not a valid command tag -create event trigger regress_event_trigger2 on ddl_command_start - when tag in ('create table', 'create skunkcabbage') - execute procedure test_event_trigger(); -ERROR: filter value "create skunkcabbage" not recognized for filter variable "tag" --- should fail, can't have event triggers on event triggers -create event trigger regress_event_trigger2 on ddl_command_start - when tag in ('DROP EVENT TRIGGER') - execute procedure test_event_trigger(); -ERROR: event triggers are not supported for DROP EVENT TRIGGER --- should fail, can't have event triggers on global objects -create event trigger regress_event_trigger2 on ddl_command_start - when tag in ('CREATE ROLE') - execute procedure test_event_trigger(); -ERROR: event triggers are not supported for CREATE ROLE --- should fail, can't have event triggers on global objects -create event trigger regress_event_trigger2 on ddl_command_start - when tag in ('CREATE DATABASE') - execute procedure test_event_trigger(); -ERROR: event triggers are not supported for CREATE DATABASE --- should fail, can't have event triggers on global objects -create event trigger regress_event_trigger2 on ddl_command_start - when tag in ('CREATE TABLESPACE') - execute procedure test_event_trigger(); -ERROR: event triggers are not supported for CREATE TABLESPACE --- should fail, can't have same filter variable twice -create event trigger regress_event_trigger2 on ddl_command_start - when tag in ('create table') and tag in ('CREATE FUNCTION') - execute procedure test_event_trigger(); -ERROR: filter variable "tag" specified more than once --- should fail, can't have arguments -create event trigger regress_event_trigger2 on ddl_command_start - execute procedure test_event_trigger('argument not allowed'); -ERROR: syntax error at or near "'argument not allowed'" -LINE 2: execute procedure test_event_trigger('argument not allowe... - ^ --- OK -create event trigger regress_event_trigger2 on ddl_command_start - when tag in ('create table', 'CREATE FUNCTION') - execute procedure test_event_trigger(); --- OK -comment on event trigger regress_event_trigger is 'test comment'; --- drop as non-superuser should fail -create role regress_evt_user; -set role regress_evt_user; -create event trigger regress_event_trigger_noperms on ddl_command_start - execute procedure test_event_trigger(); -ERROR: permission denied to create event trigger "regress_event_trigger_noperms" -HINT: Must be superuser to create an event trigger. -reset role; --- test enabling and disabling -alter event trigger regress_event_trigger disable; --- fires _trigger2 and _trigger_end should fire, but not _trigger -create table event_trigger_fire1 (a int); -NOTICE: test_event_trigger: ddl_command_start CREATE TABLE -NOTICE: test_event_trigger: ddl_command_end CREATE TABLE -alter event trigger regress_event_trigger enable; -set session_replication_role = replica; --- fires nothing -create table event_trigger_fire2 (a int); -alter event trigger regress_event_trigger enable replica; --- fires only _trigger -create table event_trigger_fire3 (a int); -NOTICE: test_event_trigger: ddl_command_start CREATE TABLE -alter event trigger regress_event_trigger enable always; --- fires only _trigger -create table event_trigger_fire4 (a int); -NOTICE: test_event_trigger: ddl_command_start CREATE TABLE -reset session_replication_role; --- fires all three -create table event_trigger_fire5 (a int); -NOTICE: test_event_trigger: ddl_command_start CREATE TABLE -NOTICE: test_event_trigger: ddl_command_start CREATE TABLE -NOTICE: test_event_trigger: ddl_command_end CREATE TABLE --- non-top-level command -create function f1() returns int -language plpgsql -as $$ -begin - create table event_trigger_fire6 (a int); - return 0; -end $$; -NOTICE: test_event_trigger: ddl_command_start CREATE FUNCTION -NOTICE: test_event_trigger: ddl_command_start CREATE FUNCTION -NOTICE: test_event_trigger: ddl_command_end CREATE FUNCTION -select f1(); -NOTICE: test_event_trigger: ddl_command_start CREATE TABLE -NOTICE: test_event_trigger: ddl_command_start CREATE TABLE -NOTICE: test_event_trigger: ddl_command_end CREATE TABLE - f1 ----- - 0 -(1 row) - --- non-top-level command -create procedure p1() -language plpgsql -as $$ -begin - create table event_trigger_fire7 (a int); -end $$; -NOTICE: test_event_trigger: ddl_command_start CREATE PROCEDURE -NOTICE: test_event_trigger: ddl_command_end CREATE PROCEDURE -call p1(); -NOTICE: test_event_trigger: ddl_command_start CREATE TABLE -NOTICE: test_event_trigger: ddl_command_start CREATE TABLE -NOTICE: test_event_trigger: ddl_command_end CREATE TABLE --- clean up -alter event trigger regress_event_trigger disable; -drop table event_trigger_fire2, event_trigger_fire3, event_trigger_fire4, event_trigger_fire5, event_trigger_fire6, event_trigger_fire7; -NOTICE: test_event_trigger: ddl_command_end DROP TABLE -drop routine f1(), p1(); -NOTICE: test_event_trigger: ddl_command_end DROP ROUTINE --- regress_event_trigger_end should fire on these commands -grant all on table event_trigger_fire1 to public; -NOTICE: test_event_trigger: ddl_command_end GRANT -comment on table event_trigger_fire1 is 'here is a comment'; -NOTICE: test_event_trigger: ddl_command_end COMMENT -revoke all on table event_trigger_fire1 from public; -NOTICE: test_event_trigger: ddl_command_end REVOKE -drop table event_trigger_fire1; -NOTICE: test_event_trigger: ddl_command_end DROP TABLE -create foreign data wrapper useless; -NOTICE: test_event_trigger: ddl_command_end CREATE FOREIGN DATA WRAPPER -create server useless_server foreign data wrapper useless; -NOTICE: test_event_trigger: ddl_command_end CREATE SERVER -create user mapping for regress_evt_user server useless_server; -NOTICE: test_event_trigger: ddl_command_end CREATE USER MAPPING -alter default privileges for role regress_evt_user - revoke delete on tables from regress_evt_user; -NOTICE: test_event_trigger: ddl_command_end ALTER DEFAULT PRIVILEGES --- alter owner to non-superuser should fail -alter event trigger regress_event_trigger owner to regress_evt_user; -ERROR: permission denied to change owner of event trigger "regress_event_trigger" -HINT: The owner of an event trigger must be a superuser. --- alter owner to superuser should work -alter role regress_evt_user superuser; -alter event trigger regress_event_trigger owner to regress_evt_user; --- should fail, name collision -alter event trigger regress_event_trigger rename to regress_event_trigger2; -ERROR: event trigger "regress_event_trigger2" already exists --- OK -alter event trigger regress_event_trigger rename to regress_event_trigger3; --- should fail, doesn't exist any more -drop event trigger regress_event_trigger; -ERROR: event trigger "regress_event_trigger" does not exist --- should fail, regress_evt_user owns some objects -drop role regress_evt_user; -ERROR: role "regress_evt_user" cannot be dropped because some objects depend on it -DETAIL: owner of event trigger regress_event_trigger3 -owner of user mapping for regress_evt_user on server useless_server -owner of default privileges on new relations belonging to role regress_evt_user --- cleanup before next test --- these are all OK; the second one should emit a NOTICE -drop event trigger if exists regress_event_trigger2; -drop event trigger if exists regress_event_trigger2; -NOTICE: event trigger "regress_event_trigger2" does not exist, skipping -drop event trigger regress_event_trigger3; -drop event trigger regress_event_trigger_end; --- test support for dropped objects -CREATE SCHEMA schema_one authorization regress_evt_user; -CREATE SCHEMA schema_two authorization regress_evt_user; -CREATE SCHEMA audit_tbls authorization regress_evt_user; -CREATE TEMP TABLE a_temp_tbl (); -SET SESSION AUTHORIZATION regress_evt_user; -CREATE TABLE schema_one.table_one(a int); -CREATE TABLE schema_one."table two"(a int); -CREATE TABLE schema_one.table_three(a int); -CREATE TABLE audit_tbls.schema_one_table_two(the_value text); -CREATE TABLE schema_two.table_two(a int); -CREATE TABLE schema_two.table_three(a int, b text); -CREATE TABLE audit_tbls.schema_two_table_three(the_value text); -CREATE OR REPLACE FUNCTION schema_two.add(int, int) RETURNS int LANGUAGE plpgsql - CALLED ON NULL INPUT - AS $$ BEGIN RETURN coalesce($1,0) + coalesce($2,0); END; $$; -CREATE AGGREGATE schema_two.newton - (BASETYPE = int, SFUNC = schema_two.add, STYPE = int); -RESET SESSION AUTHORIZATION; -CREATE TABLE undroppable_objs ( - object_type text, - object_identity text -); -INSERT INTO undroppable_objs VALUES -('table', 'schema_one.table_three'), -('table', 'audit_tbls.schema_two_table_three'); -CREATE TABLE dropped_objects ( - type text, - schema text, - object text -); --- This tests errors raised within event triggers; the one in audit_tbls --- uses 2nd-level recursive invocation via test_evtrig_dropped_objects(). -CREATE OR REPLACE FUNCTION undroppable() RETURNS event_trigger -LANGUAGE plpgsql AS $$ -DECLARE - obj record; -BEGIN - PERFORM 1 FROM pg_tables WHERE tablename = 'undroppable_objs'; - IF NOT FOUND THEN - RAISE NOTICE 'table undroppable_objs not found, skipping'; - RETURN; - END IF; - FOR obj IN - SELECT * FROM pg_event_trigger_dropped_objects() JOIN - undroppable_objs USING (object_type, object_identity) - LOOP - RAISE EXCEPTION 'object % of type % cannot be dropped', - obj.object_identity, obj.object_type; - END LOOP; -END; -$$; -CREATE EVENT TRIGGER undroppable ON sql_drop - EXECUTE PROCEDURE undroppable(); -CREATE OR REPLACE FUNCTION test_evtrig_dropped_objects() RETURNS event_trigger -LANGUAGE plpgsql AS $$ -DECLARE - obj record; -BEGIN - FOR obj IN SELECT * FROM pg_event_trigger_dropped_objects() - LOOP - IF obj.object_type = 'table' THEN - EXECUTE format('DROP TABLE IF EXISTS audit_tbls.%I', - format('%s_%s', obj.schema_name, obj.object_name)); - END IF; - - INSERT INTO dropped_objects - (type, schema, object) VALUES - (obj.object_type, obj.schema_name, obj.object_identity); - END LOOP; -END -$$; -CREATE EVENT TRIGGER regress_event_trigger_drop_objects ON sql_drop - WHEN TAG IN ('drop table', 'drop function', 'drop view', - 'drop owned', 'drop schema', 'alter table') - EXECUTE PROCEDURE test_evtrig_dropped_objects(); -ALTER TABLE schema_one.table_one DROP COLUMN a; -DROP SCHEMA schema_one, schema_two CASCADE; -NOTICE: drop cascades to 7 other objects -DETAIL: drop cascades to table schema_two.table_two -drop cascades to table schema_two.table_three -drop cascades to function schema_two.add(integer,integer) -drop cascades to function schema_two.newton(integer) -drop cascades to table schema_one.table_one -drop cascades to table schema_one."table two" -drop cascades to table schema_one.table_three -NOTICE: table "schema_two_table_two" does not exist, skipping -NOTICE: table "audit_tbls_schema_two_table_three" does not exist, skipping -ERROR: object audit_tbls.schema_two_table_three of type table cannot be dropped -CONTEXT: PL/pgSQL function undroppable() line 14 at RAISE -SQL statement "DROP TABLE IF EXISTS audit_tbls.schema_two_table_three" -PL/pgSQL function test_evtrig_dropped_objects() line 8 at EXECUTE -DELETE FROM undroppable_objs WHERE object_identity = 'audit_tbls.schema_two_table_three'; -DROP SCHEMA schema_one, schema_two CASCADE; -NOTICE: drop cascades to 7 other objects -DETAIL: drop cascades to table schema_two.table_two -drop cascades to table schema_two.table_three -drop cascades to function schema_two.add(integer,integer) -drop cascades to function schema_two.newton(integer) -drop cascades to table schema_one.table_one -drop cascades to table schema_one."table two" -drop cascades to table schema_one.table_three -NOTICE: table "schema_two_table_two" does not exist, skipping -NOTICE: table "audit_tbls_schema_two_table_three" does not exist, skipping -NOTICE: table "schema_one_table_one" does not exist, skipping -NOTICE: table "schema_one_table two" does not exist, skipping -NOTICE: table "schema_one_table_three" does not exist, skipping -ERROR: object schema_one.table_three of type table cannot be dropped -CONTEXT: PL/pgSQL function undroppable() line 14 at RAISE -DELETE FROM undroppable_objs WHERE object_identity = 'schema_one.table_three'; -DROP SCHEMA schema_one, schema_two CASCADE; -NOTICE: drop cascades to 7 other objects -DETAIL: drop cascades to table schema_two.table_two -drop cascades to table schema_two.table_three -drop cascades to function schema_two.add(integer,integer) -drop cascades to function schema_two.newton(integer) -drop cascades to table schema_one.table_one -drop cascades to table schema_one."table two" -drop cascades to table schema_one.table_three -NOTICE: table "schema_two_table_two" does not exist, skipping -NOTICE: table "audit_tbls_schema_two_table_three" does not exist, skipping -NOTICE: table "schema_one_table_one" does not exist, skipping -NOTICE: table "schema_one_table two" does not exist, skipping -NOTICE: table "schema_one_table_three" does not exist, skipping -SELECT * FROM dropped_objects WHERE schema IS NULL OR schema <> 'pg_toast'; - type | schema | object ---------------+------------+------------------------------------- - table column | schema_one | schema_one.table_one.a - schema | | schema_two - table | schema_two | schema_two.table_two - type | schema_two | schema_two.table_two - type | schema_two | schema_two.table_two[] - table | audit_tbls | audit_tbls.schema_two_table_three - type | audit_tbls | audit_tbls.schema_two_table_three - type | audit_tbls | audit_tbls.schema_two_table_three[] - table | schema_two | schema_two.table_three - type | schema_two | schema_two.table_three - type | schema_two | schema_two.table_three[] - function | schema_two | schema_two.add(integer,integer) - aggregate | schema_two | schema_two.newton(integer) - schema | | schema_one - table | schema_one | schema_one.table_one - type | schema_one | schema_one.table_one - type | schema_one | schema_one.table_one[] - table | schema_one | schema_one."table two" - type | schema_one | schema_one."table two" - type | schema_one | schema_one."table two"[] - table | schema_one | schema_one.table_three - type | schema_one | schema_one.table_three - type | schema_one | schema_one.table_three[] -(23 rows) - -DROP OWNED BY regress_evt_user; -NOTICE: schema "audit_tbls" does not exist, skipping -SELECT * FROM dropped_objects WHERE type = 'schema'; - type | schema | object ---------+--------+------------ - schema | | schema_two - schema | | schema_one - schema | | audit_tbls -(3 rows) - -DROP ROLE regress_evt_user; -DROP EVENT TRIGGER regress_event_trigger_drop_objects; -DROP EVENT TRIGGER undroppable; --- Event triggers on relations. -CREATE OR REPLACE FUNCTION event_trigger_report_dropped() - RETURNS event_trigger - LANGUAGE plpgsql -AS $$ -DECLARE r record; -BEGIN - FOR r IN SELECT * from pg_event_trigger_dropped_objects() - LOOP - IF NOT r.normal AND NOT r.original THEN - CONTINUE; - END IF; - RAISE NOTICE 'NORMAL: orig=% normal=% istemp=% type=% identity=% name=% args=%', - r.original, r.normal, r.is_temporary, r.object_type, - r.object_identity, r.address_names, r.address_args; - END LOOP; -END; $$; -CREATE EVENT TRIGGER regress_event_trigger_report_dropped ON sql_drop - EXECUTE PROCEDURE event_trigger_report_dropped(); -CREATE OR REPLACE FUNCTION event_trigger_report_end() - RETURNS event_trigger - LANGUAGE plpgsql -AS $$ -DECLARE r RECORD; -BEGIN - FOR r IN SELECT * FROM pg_event_trigger_ddl_commands() - LOOP - RAISE NOTICE 'END: command_tag=% type=% identity=%', - r.command_tag, r.object_type, r.object_identity; - END LOOP; -END; $$; -CREATE EVENT TRIGGER regress_event_trigger_report_end ON ddl_command_end - EXECUTE PROCEDURE event_trigger_report_end(); -CREATE SCHEMA evttrig - CREATE TABLE one (col_a SERIAL PRIMARY KEY, col_b text DEFAULT 'forty two', col_c SERIAL) - CREATE INDEX one_idx ON one (col_b) - CREATE TABLE two (col_c INTEGER CHECK (col_c > 0) REFERENCES one DEFAULT 42) - CREATE TABLE id (col_d int NOT NULL GENERATED ALWAYS AS IDENTITY); -NOTICE: END: command_tag=CREATE SCHEMA type=schema identity=evttrig -NOTICE: END: command_tag=CREATE SEQUENCE type=sequence identity=evttrig.one_col_a_seq -NOTICE: END: command_tag=CREATE SEQUENCE type=sequence identity=evttrig.one_col_c_seq -NOTICE: END: command_tag=CREATE TABLE type=table identity=evttrig.one -NOTICE: END: command_tag=CREATE INDEX type=index identity=evttrig.one_pkey -NOTICE: END: command_tag=ALTER SEQUENCE type=sequence identity=evttrig.one_col_a_seq -NOTICE: END: command_tag=ALTER SEQUENCE type=sequence identity=evttrig.one_col_c_seq -NOTICE: END: command_tag=CREATE TABLE type=table identity=evttrig.two -NOTICE: END: command_tag=ALTER TABLE type=table identity=evttrig.two -NOTICE: END: command_tag=CREATE SEQUENCE type=sequence identity=evttrig.id_col_d_seq -NOTICE: END: command_tag=CREATE TABLE type=table identity=evttrig.id -NOTICE: END: command_tag=ALTER SEQUENCE type=sequence identity=evttrig.id_col_d_seq -NOTICE: END: command_tag=CREATE INDEX type=index identity=evttrig.one_idx --- Partitioned tables with a partitioned index -CREATE TABLE evttrig.parted ( - id int PRIMARY KEY) - PARTITION BY RANGE (id); -NOTICE: END: command_tag=CREATE TABLE type=table identity=evttrig.parted -NOTICE: END: command_tag=CREATE INDEX type=index identity=evttrig.parted_pkey -CREATE TABLE evttrig.part_1_10 PARTITION OF evttrig.parted (id) - FOR VALUES FROM (1) TO (10); -NOTICE: END: command_tag=CREATE TABLE type=table identity=evttrig.part_1_10 -CREATE TABLE evttrig.part_10_20 PARTITION OF evttrig.parted (id) - FOR VALUES FROM (10) TO (20) PARTITION BY RANGE (id); -NOTICE: END: command_tag=CREATE TABLE type=table identity=evttrig.part_10_20 -CREATE TABLE evttrig.part_10_15 PARTITION OF evttrig.part_10_20 (id) - FOR VALUES FROM (10) TO (15); -NOTICE: END: command_tag=CREATE TABLE type=table identity=evttrig.part_10_15 -CREATE TABLE evttrig.part_15_20 PARTITION OF evttrig.part_10_20 (id) - FOR VALUES FROM (15) TO (20); -NOTICE: END: command_tag=CREATE TABLE type=table identity=evttrig.part_15_20 -ALTER TABLE evttrig.two DROP COLUMN col_c; -NOTICE: NORMAL: orig=t normal=f istemp=f type=table column identity=evttrig.two.col_c name={evttrig,two,col_c} args={} -NOTICE: NORMAL: orig=f normal=t istemp=f type=table constraint identity=two_col_c_check on evttrig.two name={evttrig,two,two_col_c_check} args={} -NOTICE: END: command_tag=ALTER TABLE type=table identity=evttrig.two -ALTER TABLE evttrig.one ALTER COLUMN col_b DROP DEFAULT; -NOTICE: NORMAL: orig=t normal=f istemp=f type=default value identity=for evttrig.one.col_b name={evttrig,one,col_b} args={} -NOTICE: END: command_tag=ALTER TABLE type=table identity=evttrig.one -ALTER TABLE evttrig.one DROP CONSTRAINT one_pkey; -NOTICE: NORMAL: orig=t normal=f istemp=f type=table constraint identity=one_pkey on evttrig.one name={evttrig,one,one_pkey} args={} -NOTICE: END: command_tag=ALTER TABLE type=table identity=evttrig.one -ALTER TABLE evttrig.one DROP COLUMN col_c; -NOTICE: NORMAL: orig=t normal=f istemp=f type=table column identity=evttrig.one.col_c name={evttrig,one,col_c} args={} -NOTICE: NORMAL: orig=f normal=t istemp=f type=default value identity=for evttrig.one.col_c name={evttrig,one,col_c} args={} -NOTICE: END: command_tag=ALTER TABLE type=table identity=evttrig.one -ALTER TABLE evttrig.id ALTER COLUMN col_d SET DATA TYPE bigint; -NOTICE: END: command_tag=ALTER SEQUENCE type=sequence identity=evttrig.id_col_d_seq -NOTICE: END: command_tag=ALTER TABLE type=table identity=evttrig.id -ALTER TABLE evttrig.id ALTER COLUMN col_d DROP IDENTITY, - ALTER COLUMN col_d SET DATA TYPE int; -NOTICE: END: command_tag=ALTER TABLE type=table identity=evttrig.id -DROP INDEX evttrig.one_idx; -NOTICE: NORMAL: orig=t normal=f istemp=f type=index identity=evttrig.one_idx name={evttrig,one_idx} args={} -DROP SCHEMA evttrig CASCADE; -NOTICE: drop cascades to 4 other objects -DETAIL: drop cascades to table evttrig.one -drop cascades to table evttrig.two -drop cascades to table evttrig.id -drop cascades to table evttrig.parted -NOTICE: NORMAL: orig=t normal=f istemp=f type=schema identity=evttrig name={evttrig} args={} -NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.one name={evttrig,one} args={} -NOTICE: NORMAL: orig=f normal=t istemp=f type=sequence identity=evttrig.one_col_a_seq name={evttrig,one_col_a_seq} args={} -NOTICE: NORMAL: orig=f normal=t istemp=f type=default value identity=for evttrig.one.col_a name={evttrig,one,col_a} args={} -NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.two name={evttrig,two} args={} -NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.id name={evttrig,id} args={} -NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.parted name={evttrig,parted} args={} -NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.part_1_10 name={evttrig,part_1_10} args={} -NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.part_10_20 name={evttrig,part_10_20} args={} -NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.part_10_15 name={evttrig,part_10_15} args={} -NOTICE: NORMAL: orig=f normal=t istemp=f type=table identity=evttrig.part_15_20 name={evttrig,part_15_20} args={} -DROP TABLE a_temp_tbl; -NOTICE: NORMAL: orig=t normal=f istemp=t type=table identity=pg_temp.a_temp_tbl name={pg_temp,a_temp_tbl} args={} --- CREATE OPERATOR CLASS without FAMILY clause should report --- both CREATE OPERATOR FAMILY and CREATE OPERATOR CLASS -CREATE OPERATOR CLASS evttrigopclass FOR TYPE int USING btree AS STORAGE int; -NOTICE: END: command_tag=CREATE OPERATOR FAMILY type=operator family identity=public.evttrigopclass USING btree -NOTICE: END: command_tag=CREATE OPERATOR CLASS type=operator class identity=public.evttrigopclass USING btree -DROP EVENT TRIGGER regress_event_trigger_report_dropped; -DROP EVENT TRIGGER regress_event_trigger_report_end; --- only allowed from within an event trigger function, should fail -select pg_event_trigger_table_rewrite_oid(); -ERROR: pg_event_trigger_table_rewrite_oid() can only be called in a table_rewrite event trigger function --- test Table Rewrite Event Trigger -CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger -LANGUAGE plpgsql AS $$ -BEGIN - RAISE EXCEPTION 'rewrites not allowed'; -END; -$$; -create event trigger no_rewrite_allowed on table_rewrite - execute procedure test_evtrig_no_rewrite(); -create table rewriteme (id serial primary key, foo float, bar timestamptz); -insert into rewriteme - select x * 1.001 from generate_series(1, 500) as t(x); -alter table rewriteme alter column foo type numeric; -ERROR: rewrites not allowed -CONTEXT: PL/pgSQL function test_evtrig_no_rewrite() line 3 at RAISE -alter table rewriteme add column baz int default 0; --- test with more than one reason to rewrite a single table -CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger -LANGUAGE plpgsql AS $$ -BEGIN - RAISE NOTICE 'Table ''%'' is being rewritten (reason = %)', - pg_event_trigger_table_rewrite_oid()::regclass, - pg_event_trigger_table_rewrite_reason(); -END; -$$; -alter table rewriteme - add column onemore int default 0, - add column another int default -1, - alter column foo type numeric(10,4); -NOTICE: Table 'rewriteme' is being rewritten (reason = 4) --- matview rewrite when changing access method -CREATE MATERIALIZED VIEW heapmv USING heap AS SELECT 1 AS a; -ALTER MATERIALIZED VIEW heapmv SET ACCESS METHOD heap2; -NOTICE: Table 'heapmv' is being rewritten (reason = 8) -DROP MATERIALIZED VIEW heapmv; --- shouldn't trigger a table_rewrite event -alter table rewriteme alter column foo type numeric(12,4); -begin; -set timezone to 'UTC'; -alter table rewriteme alter column bar type timestamp; -set timezone to '0'; -alter table rewriteme alter column bar type timestamptz; -set timezone to 'Europe/London'; -alter table rewriteme alter column bar type timestamp; -- does rewrite -NOTICE: Table 'rewriteme' is being rewritten (reason = 4) -rollback; --- typed tables are rewritten when their type changes. Don't emit table --- name, because firing order is not stable. -CREATE OR REPLACE FUNCTION test_evtrig_no_rewrite() RETURNS event_trigger -LANGUAGE plpgsql AS $$ -BEGIN - RAISE NOTICE 'Table is being rewritten (reason = %)', - pg_event_trigger_table_rewrite_reason(); -END; -$$; -create type rewritetype as (a int); -create table rewritemetoo1 of rewritetype; -create table rewritemetoo2 of rewritetype; -alter type rewritetype alter attribute a type text cascade; -NOTICE: Table is being rewritten (reason = 4) -NOTICE: Table is being rewritten (reason = 4) --- but this doesn't work -create table rewritemetoo3 (a rewritetype); -alter type rewritetype alter attribute a type varchar cascade; -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); -CREATE OR REPLACE FUNCTION start_command() -RETURNS event_trigger AS $$ -BEGIN -RAISE NOTICE '% - ddl_command_start', tg_tag; -END; -$$ LANGUAGE plpgsql; -CREATE OR REPLACE FUNCTION end_command() -RETURNS event_trigger AS $$ -BEGIN -RAISE NOTICE '% - ddl_command_end', tg_tag; -END; -$$ LANGUAGE plpgsql; -CREATE OR REPLACE FUNCTION drop_sql_command() -RETURNS event_trigger AS $$ -BEGIN -RAISE NOTICE '% - sql_drop', tg_tag; -END; -$$ LANGUAGE plpgsql; -CREATE EVENT TRIGGER start_rls_command ON ddl_command_start - WHEN TAG IN ('CREATE POLICY', 'ALTER POLICY', 'DROP POLICY') EXECUTE PROCEDURE start_command(); -CREATE EVENT TRIGGER end_rls_command ON ddl_command_end - WHEN TAG IN ('CREATE POLICY', 'ALTER POLICY', 'DROP POLICY') EXECUTE PROCEDURE end_command(); -CREATE EVENT TRIGGER sql_drop_command ON sql_drop - WHEN TAG IN ('DROP POLICY') EXECUTE PROCEDURE drop_sql_command(); -CREATE POLICY p1 ON event_trigger_test USING (FALSE); -NOTICE: CREATE POLICY - ddl_command_start -NOTICE: CREATE POLICY - ddl_command_end -ALTER POLICY p1 ON event_trigger_test USING (TRUE); -NOTICE: ALTER POLICY - ddl_command_start -NOTICE: ALTER POLICY - ddl_command_end -ALTER POLICY p1 ON event_trigger_test RENAME TO p2; -NOTICE: ALTER POLICY - ddl_command_start -NOTICE: ALTER POLICY - ddl_command_end -DROP POLICY p2 ON event_trigger_test; -NOTICE: DROP POLICY - ddl_command_start -NOTICE: DROP POLICY - sql_drop -NOTICE: DROP POLICY - ddl_command_end --- Check the object addresses of all the event triggers. -SELECT - e.evtname, - pg_describe_object('pg_event_trigger'::regclass, e.oid, 0) as descr, - b.type, b.object_names, b.object_args, - pg_identify_object(a.classid, a.objid, a.objsubid) as ident - FROM pg_event_trigger as e, - LATERAL pg_identify_object_as_address('pg_event_trigger'::regclass, e.oid, 0) as b, - LATERAL pg_get_object_address(b.type, b.object_names, b.object_args) as a - ORDER BY e.evtname; - evtname | descr | type | object_names | object_args | ident --------------------------------+---------------------------------------------+---------------+---------------------------------+-------------+-------------------------------------------------------------------------------- - end_rls_command | event trigger end_rls_command | event trigger | {end_rls_command} | {} | ("event trigger",,end_rls_command,end_rls_command) - pg_tde_trigger_create_index | event trigger pg_tde_trigger_create_index | event trigger | {pg_tde_trigger_create_index} | {} | ("event trigger",,pg_tde_trigger_create_index,pg_tde_trigger_create_index) - pg_tde_trigger_create_index_2 | event trigger pg_tde_trigger_create_index_2 | event trigger | {pg_tde_trigger_create_index_2} | {} | ("event trigger",,pg_tde_trigger_create_index_2,pg_tde_trigger_create_index_2) - sql_drop_command | event trigger sql_drop_command | event trigger | {sql_drop_command} | {} | ("event trigger",,sql_drop_command,sql_drop_command) - start_rls_command | event trigger start_rls_command | event trigger | {start_rls_command} | {} | ("event trigger",,start_rls_command,start_rls_command) -(5 rows) - -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/fast_default.out b/src/test/regress/expected/fast_default.out index 59365dad964a9..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); diff --git a/src/test/regress/expected/foreign_key.out b/src/test/regress/expected/foreign_key.out index fe6a1015f21bf..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. @@ -2037,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. diff --git a/src/test/regress/expected/generated.out b/src/test/regress/expected/generated.out index 499072e14ca87..f7c867e054c14 100644 --- a/src/test/regress/expected/generated.out +++ b/src/test/regress/expected/generated.out @@ -759,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); @@ -1185,6 +1190,30 @@ Inherits: gtest30 ALTER TABLE gtest30_1 ALTER COLUMN b DROP EXPRESSION; -- error ERROR: cannot drop generation expression from inherited column +-- composite type dependencies +CREATE TABLE gtest31_1 (a int, b text GENERATED ALWAYS AS ('hello') STORED, c text); +CREATE TABLE gtest31_2 (x int, y gtest31_1); +ALTER TABLE gtest31_1 ALTER COLUMN b TYPE varchar; -- fails +ERROR: cannot alter table "gtest31_1" because column "gtest31_2.y" uses its row type +-- bug #18970: these cases are unsupported, but make sure they fail cleanly +ALTER TABLE gtest31_2 ADD CONSTRAINT cc CHECK ((y).b IS NOT NULL); +ALTER TABLE gtest31_1 ALTER COLUMN b SET EXPRESSION AS ('hello1'); +ERROR: cannot alter table "gtest31_1" because column "gtest31_2.y" uses its row type +ALTER TABLE gtest31_2 DROP CONSTRAINT cc; +CREATE STATISTICS gtest31_2_stat ON ((y).b is not null) FROM gtest31_2; +ALTER TABLE gtest31_1 ALTER COLUMN b SET EXPRESSION AS ('hello2'); +ERROR: cannot alter table "gtest31_1" because column "gtest31_2.y" uses its row type +DROP STATISTICS gtest31_2_stat; +CREATE INDEX gtest31_2_y_idx ON gtest31_2(((y).b)); +ALTER TABLE gtest31_1 ALTER COLUMN b SET EXPRESSION AS ('hello3'); +ERROR: cannot alter table "gtest31_1" because column "gtest31_2.y" uses its row type +DROP TABLE gtest31_1, gtest31_2; +-- Check it for a partitioned table, too +CREATE TABLE gtest31_1 (a int, b text GENERATED ALWAYS AS ('hello') STORED, c text) PARTITION BY LIST (a); +CREATE TABLE gtest31_2 (x int, y gtest31_1); +ALTER TABLE gtest31_1 ALTER COLUMN b TYPE varchar; -- fails +ERROR: cannot alter table "gtest31_1" because column "gtest31_2.y" uses its row type +DROP TABLE gtest31_1, gtest31_2; -- triggers CREATE TABLE gtest26 ( a int PRIMARY KEY, diff --git a/src/test/regress/expected/inherit.out b/src/test/regress/expected/inherit.out index 85240a9b0bbf2..689f4242a1ff6 100644 --- a/src/test/regress/expected/inherit.out +++ b/src/test/regress/expected/inherit.out @@ -1093,17 +1093,30 @@ 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; +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); diff --git a/src/test/regress/expected/limit.out b/src/test/regress/expected/limit.out index a2cd0f9f5b89e..d45427ac03952 100644 --- a/src/test/regress/expected/limit.out +++ b/src/test/regress/expected/limit.out @@ -643,7 +643,7 @@ View definition: WHERE thousand < 995 ORDER BY thousand OFFSET 10 - FETCH FIRST 5 ROWS WITH TIES; + FETCH FIRST (5) ROWS WITH TIES; CREATE VIEW limit_thousand_v_2 AS SELECT thousand FROM onek WHERE thousand < 995 ORDER BY thousand OFFSET 10 FETCH FIRST 5 ROWS ONLY; @@ -675,15 +675,29 @@ View definition: FROM onek WHERE thousand < 995 ORDER BY thousand - FETCH FIRST (NULL::integer + 1) ROWS WITH TIES; + FETCH FIRST ((NULL::integer + 1)) ROWS WITH TIES; CREATE VIEW limit_thousand_v_4 AS SELECT thousand FROM onek WHERE thousand < 995 - ORDER BY thousand FETCH FIRST NULL ROWS ONLY; + ORDER BY thousand FETCH FIRST (5::bigint) ROWS WITH TIES; \d+ limit_thousand_v_4 View "public.limit_thousand_v_4" Column | Type | Collation | Nullable | Default | Storage | Description ----------+---------+-----------+----------+---------+---------+------------- thousand | integer | | | | plain | +View definition: + SELECT thousand + FROM onek + WHERE thousand < 995 + ORDER BY thousand + FETCH FIRST (5::bigint) ROWS WITH TIES; + +CREATE VIEW limit_thousand_v_5 AS SELECT thousand FROM onek WHERE thousand < 995 + ORDER BY thousand FETCH FIRST NULL ROWS ONLY; +\d+ limit_thousand_v_5 + View "public.limit_thousand_v_5" + Column | Type | Collation | Nullable | Default | Storage | Description +----------+---------+-----------+----------+---------+---------+------------- + thousand | integer | | | | plain | View definition: SELECT thousand FROM onek 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/merge.out b/src/test/regress/expected/merge.out index 521d70a891986..f9ad47f978fac 100644 --- a/src/test/regress/expected/merge.out +++ b/src/test/regress/expected/merge.out @@ -2058,6 +2058,23 @@ SELECT * FROM pa_target ORDER BY tid; 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; -- The target table is partitioned in the same way, but this time by attaching @@ -2683,6 +2700,76 @@ SELECT * FROM new_measurement ORDER BY city_id, logdate; 1 | 01-17-2007 | | (2 rows) +-- MERGE into inheritance root table +DROP TRIGGER insert_measurement_trigger ON measurement; +ALTER TABLE measurement ADD CONSTRAINT mcheck CHECK (city_id = 0) NO INHERIT; +EXPLAIN (COSTS OFF) +MERGE INTO measurement m + USING (VALUES (1, '01-17-2007'::date)) nm(city_id, logdate) ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id - 1, logdate, 25, 100); + QUERY PLAN +-------------------------------------------------------------------------- + Merge on measurement m + Merge on measurement_y2007m01 m_1 + -> Nested Loop Left Join + -> Result + -> Seq Scan on measurement_y2007m01 m_1 + Filter: ((city_id = 1) AND (logdate = '01-17-2007'::date)) +(6 rows) + +BEGIN; +MERGE INTO measurement m + USING (VALUES (1, '01-17-2007'::date)) nm(city_id, logdate) ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id - 1, logdate, 25, 100); +SELECT * FROM ONLY measurement ORDER BY city_id, logdate; + city_id | logdate | peaktemp | unitsales +---------+------------+----------+----------- + 0 | 07-21-2005 | 25 | 35 + 0 | 01-17-2007 | 25 | 100 +(2 rows) + +ROLLBACK; +ALTER TABLE measurement ENABLE ROW LEVEL SECURITY; +ALTER TABLE measurement FORCE ROW LEVEL SECURITY; +CREATE POLICY measurement_p ON measurement USING (peaktemp IS NOT NULL); +MERGE INTO measurement m + USING (VALUES (1, '01-17-2007'::date)) nm(city_id, logdate) ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id - 1, logdate, NULL, 100); -- should fail +ERROR: new row violates row-level security policy for table "measurement" +MERGE INTO measurement m + USING (VALUES (1, '01-17-2007'::date)) nm(city_id, logdate) ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id - 1, logdate, 25, 100); -- ok +SELECT * FROM ONLY measurement ORDER BY city_id, logdate; + city_id | logdate | peaktemp | unitsales +---------+------------+----------+----------- + 0 | 07-21-2005 | 25 | 35 + 0 | 01-17-2007 | 25 | 100 +(2 rows) + +MERGE INTO measurement m + USING (VALUES (1, '01-18-2007'::date)) nm(city_id, logdate) ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id - 1, logdate, 25, 200) +RETURNING merge_action(), m.*; + merge_action | city_id | logdate | peaktemp | unitsales +--------------+---------+------------+----------+----------- + INSERT | 0 | 01-18-2007 | 25 | 200 +(1 row) + DROP TABLE measurement, new_measurement CASCADE; NOTICE: drop cascades to 3 other objects DETAIL: drop cascades to table measurement_y2006m02 diff --git a/src/test/regress/expected/partition_join.out b/src/test/regress/expected/partition_join.out index 6d07f86b9bc07..b9b41340663e1 100644 --- a/src/test/regress/expected/partition_join.out +++ b/src/test/regress/expected/partition_join.out @@ -674,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 -- diff --git a/src/test/regress/expected/predicate.out b/src/test/regress/expected/predicate.out index 6f1cc0d54cd3f..b79037748b7e6 100644 --- a/src/test/regress/expected/predicate.out +++ b/src/test/regress/expected/predicate.out @@ -97,55 +97,50 @@ SELECT * FROM pred_tab t WHERE t.b IS NULL OR t.c IS NULL; -- 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 TRUE - LEFT JOIN pred_tab t3 ON t2.a IS NOT NULL; - QUERY PLAN -------------------------------------------------- + LEFT JOIN pred_tab t2 ON t1.a IS NOT NULL; + QUERY PLAN +------------------------------------- Nested Loop Left Join -> Seq Scan on pred_tab t1 -> Materialize - -> Nested Loop Left Join - -> Seq Scan on pred_tab t2 - -> Materialize - -> Seq Scan on pred_tab t3 -(7 rows) + -> 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 - LEFT JOIN pred_tab t2 ON t1.a = 1 + 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) - -> Nested Loop Left Join - Join Filter: (t1.a = 1) - -> Seq Scan on pred_tab t1 - -> Materialize + -> 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 -(9 rows) +(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 TRUE - LEFT JOIN pred_tab t3 ON t2.a IS NULL AND t2.b = 1; - QUERY PLAN ---------------------------------------------------- + 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 - -> Materialize - -> Nested Loop Left Join - Join Filter: (false AND (t2.b = 1)) - -> Seq Scan on pred_tab t2 - -> Result - One-Time Filter: false -(8 rows) + -> 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 @@ -172,55 +167,50 @@ SELECT * FROM pred_tab t1 -- 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 TRUE - LEFT JOIN pred_tab t3 ON t2.a IS NOT NULL OR t2.b = 1; - QUERY PLAN -------------------------------------------------- + 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 - -> Nested Loop Left Join - -> Seq Scan on pred_tab t2 - -> Materialize - -> Seq Scan on pred_tab t3 -(7 rows) + -> 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 - LEFT JOIN pred_tab t2 ON t1.a = 1 + 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)) - -> Nested Loop Left Join - Join Filter: (t1.a = 1) - -> Seq Scan on pred_tab t1 - -> Materialize + -> 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 -(9 rows) +(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 TRUE - LEFT JOIN pred_tab t3 ON (t2.a IS NULL OR t2.c IS NULL) AND t2.b = 1; - QUERY PLAN ---------------------------------------------------- + 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 - -> Materialize - -> Nested Loop Left Join - Join Filter: (false AND (t2.b = 1)) - -> Seq Scan on pred_tab t2 - -> Result - One-Time Filter: false -(8 rows) + -> 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 @@ -290,3 +280,84 @@ SELECT * FROM pred_parent WHERE 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/privileges.out b/src/test/regress/expected/privileges.out index e8c668e0a11f7..cf5f9fd6aa14f 100644 --- a/src/test/regress/expected/privileges.out +++ b/src/test/regress/expected/privileges.out @@ -454,8 +454,6 @@ CREATE VIEW atest12v AS SELECT * FROM atest12 WHERE b <<< 5; CREATE VIEW atest12sbv WITH (security_barrier=true) AS SELECT * FROM atest12 WHERE b <<< 5; -GRANT SELECT ON atest12v TO PUBLIC; -GRANT SELECT ON atest12sbv TO PUBLIC; -- This plan should use nestloop, knowing that few rows will be selected. EXPLAIN (COSTS OFF) SELECT * FROM atest12v x, atest12v y WHERE x.a = y.b; QUERY PLAN @@ -501,9 +499,18 @@ CREATE FUNCTION leak2(integer,integer) RETURNS boolean LANGUAGE plpgsql immutable; CREATE OPERATOR >>> (procedure = leak2, leftarg = integer, rightarg = integer, restrict = scalargtsel); --- This should not show any "leak" notices before failing. +-- These should not show any "leak" notices before failing. EXPLAIN (COSTS OFF) SELECT * FROM atest12 WHERE a >>> 0; ERROR: permission denied for table atest12 +EXPLAIN (COSTS OFF) SELECT * FROM atest12v WHERE a >>> 0; +ERROR: permission denied for view atest12v +EXPLAIN (COSTS OFF) SELECT * FROM atest12sbv WHERE a >>> 0; +ERROR: permission denied for view atest12sbv +-- Now regress_priv_user1 grants access to regress_priv_user2 via the views. +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT SELECT ON atest12v TO PUBLIC; +GRANT SELECT ON atest12sbv TO PUBLIC; +SET SESSION AUTHORIZATION regress_priv_user2; -- These plans should continue to use a nestloop, since they execute with the -- privileges of the view owner. EXPLAIN (COSTS OFF) SELECT * FROM atest12v x, atest12v y WHERE x.a = y.b; @@ -2332,6 +2339,26 @@ SELECT makeaclitem('regress_priv_user1'::regrole, 'regress_priv_user2'::regrole, SELECT makeaclitem('regress_priv_user1'::regrole, 'regress_priv_user2'::regrole, 'SELECT, fake_privilege', FALSE); -- error ERROR: unrecognized privilege type: "fake_privilege" +-- Test quoting and dequoting of user names in ACLs +CREATE ROLE "regress_""quoted"; +SELECT makeaclitem('regress_"quoted'::regrole, 'regress_"quoted'::regrole, + 'SELECT', TRUE); + makeaclitem +------------------------------------------ + "regress_""quoted"=r*/"regress_""quoted" +(1 row) + +SELECT '"regress_""quoted"=r*/"regress_""quoted"'::aclitem; + aclitem +------------------------------------------ + "regress_""quoted"=r*/"regress_""quoted" +(1 row) + +SELECT '""=r*/""'::aclitem; -- used to be misparsed as """" +ERROR: a name must follow the "/" sign +LINE 1: SELECT '""=r*/""'::aclitem; + ^ +DROP ROLE "regress_""quoted"; -- Test non-throwing aclitem I/O SELECT pg_input_is_valid('regress_priv_user1=r/regress_priv_user2', 'aclitem'); pg_input_is_valid diff --git a/src/test/regress/expected/psql.out b/src/test/regress/expected/psql.out index 3bbe4c5f974d6..7e39eef6ec0e5 100644 --- a/src/test/regress/expected/psql.out +++ b/src/test/regress/expected/psql.out @@ -4543,6 +4543,7 @@ invalid command \lo \pset arg1 arg2 \q \reset + \restrict test \s arg1 \set arg1 arg2 arg3 arg4 arg5 arg6 arg7 \setenv arg1 arg2 @@ -4551,6 +4552,7 @@ invalid command \lo \t arg1 \T arg1 \timing arg1 + \unrestrict not_valid \unset arg1 \w arg1 \watch arg1 arg2 diff --git a/src/test/regress/expected/psql_1.out b/src/test/regress/expected/psql_1.out deleted file mode 100644 index 5ad2e9d6e4f4b..0000000000000 --- a/src/test/regress/expected/psql_1.out +++ /dev/null @@ -1,6732 +0,0 @@ --- --- Tests for psql features that aren't closely connected to any --- specific server features --- --- \set --- fail: invalid name -\set invalid/name foo -invalid variable name: "invalid/name" --- fail: invalid value for special variable -\set AUTOCOMMIT foo -unrecognized value "foo" for "AUTOCOMMIT": Boolean expected -\set FETCH_COUNT foo -invalid value "foo" for "FETCH_COUNT": integer expected --- check handling of built-in boolean variable -\echo :ON_ERROR_ROLLBACK -off -\set ON_ERROR_ROLLBACK -\echo :ON_ERROR_ROLLBACK -on -\set ON_ERROR_ROLLBACK foo -unrecognized value "foo" for "ON_ERROR_ROLLBACK" -Available values are: on, off, interactive. -\echo :ON_ERROR_ROLLBACK -on -\set ON_ERROR_ROLLBACK on -\echo :ON_ERROR_ROLLBACK -on -\unset ON_ERROR_ROLLBACK -\echo :ON_ERROR_ROLLBACK -off --- \g and \gx -SELECT 1 as one, 2 as two \g - one | two ------+----- - 1 | 2 -(1 row) - -\gx --[ RECORD 1 ] -one | 1 -two | 2 - -SELECT 3 as three, 4 as four \gx --[ RECORD 1 ] -three | 3 -four | 4 - -\g - three | four --------+------ - 3 | 4 -(1 row) - --- \gx should work in FETCH_COUNT mode too -\set FETCH_COUNT 1 -SELECT 1 as one, 2 as two \g - one | two ------+----- - 1 | 2 -(1 row) - -\gx --[ RECORD 1 ] -one | 1 -two | 2 - -SELECT 3 as three, 4 as four \gx --[ RECORD 1 ] -three | 3 -four | 4 - -\g - three | four --------+------ - 3 | 4 -(1 row) - -\unset FETCH_COUNT --- \g/\gx with pset options -SELECT 1 as one, 2 as two \g (format=csv csv_fieldsep='\t') -one two -1 2 -\g - one | two ------+----- - 1 | 2 -(1 row) - -SELECT 1 as one, 2 as two \gx (title='foo bar') -foo bar --[ RECORD 1 ] -one | 1 -two | 2 - -\g - one | two ------+----- - 1 | 2 -(1 row) - --- \bind (extended query protocol) -SELECT 1 \bind \g - ?column? ----------- - 1 -(1 row) - -SELECT $1 \bind 'foo' \g - ?column? ----------- - foo -(1 row) - -SELECT $1, $2 \bind 'foo' 'bar' \g - ?column? | ?column? -----------+---------- - foo | bar -(1 row) - --- errors --- parse error -SELECT foo \bind \g -ERROR: column "foo" does not exist -LINE 1: SELECT foo - ^ --- tcop error -SELECT 1 \; SELECT 2 \bind \g -ERROR: cannot insert multiple commands into a prepared statement --- bind error -SELECT $1, $2 \bind 'foo' \g -ERROR: bind message supplies 1 parameters, but prepared statement "" requires 2 --- \gset -select 10 as test01, 20 as test02, 'Hello' as test03 \gset pref01_ -\echo :pref01_test01 :pref01_test02 :pref01_test03 -10 20 Hello --- should fail: bad variable name -select 10 as "bad name" -\gset -invalid variable name: "bad name" -select 97 as "EOF", 'ok' as _foo \gset IGNORE -attempt to \gset into specially treated variable "IGNOREEOF" ignored -\echo :IGNORE_foo :IGNOREEOF -ok 0 --- multiple backslash commands in one line -select 1 as x, 2 as y \gset pref01_ \\ \echo :pref01_x -1 -select 3 as x, 4 as y \gset pref01_ \echo :pref01_x \echo :pref01_y -3 -4 -select 5 as x, 6 as y \gset pref01_ \\ \g \echo :pref01_x :pref01_y - x | y ----+--- - 5 | 6 -(1 row) - -5 6 -select 7 as x, 8 as y \g \gset pref01_ \echo :pref01_x :pref01_y - x | y ----+--- - 7 | 8 -(1 row) - -7 8 --- NULL should unset the variable -\set var2 xyz -select 1 as var1, NULL as var2, 3 as var3 \gset -\echo :var1 :var2 :var3 -1 :var2 3 --- \gset requires just one tuple -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 -1 -select 3 as x, 4 as y \gset pref01_ \echo :pref01_x \echo :pref01_y -3 -4 -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 -\unset FETCH_COUNT --- \gdesc -SELECT - NULL AS zero, - 1 AS one, - 2.0 AS two, - 'three' AS three, - $1 AS four, - sin($2) as five, - 'foo'::varchar(4) as six, - CURRENT_DATE AS now -\gdesc - Column | Type ---------+---------------------- - zero | text - one | integer - two | numeric - three | text - four | text - five | double precision - six | character varying(4) - now | date -(8 rows) - --- should work with tuple-returning utilities, such as EXECUTE -PREPARE test AS SELECT 1 AS first, 2 AS second; -EXECUTE test \gdesc - Column | Type ---------+--------- - first | integer - second | integer -(2 rows) - -EXPLAIN EXECUTE test \gdesc - Column | Type -------------+------ - QUERY PLAN | text -(1 row) - --- should fail cleanly - syntax error -SELECT 1 + \gdesc -ERROR: syntax error at end of input -LINE 1: SELECT 1 + - ^ --- check behavior with empty results -SELECT \gdesc -The command has no result, or the result has no columns. -CREATE TABLE bububu(a int) \gdesc -The command has no result, or the result has no columns. --- subject command should not have executed -TABLE bububu; -- fail -ERROR: relation "bububu" does not exist -LINE 1: TABLE bububu; - ^ --- query buffer should remain unchanged -SELECT 1 AS x, 'Hello', 2 AS y, true AS "dirty\name" -\gdesc - Column | Type -------------+--------- - x | integer - ?column? | text - y | integer - dirty\name | boolean -(4 rows) - -\g - x | ?column? | y | dirty\name ----+----------+---+------------ - 1 | Hello | 2 | t -(1 row) - --- all on one line -SELECT 3 AS x, 'Hello', 4 AS y, true AS "dirty\name" \gdesc \g - Column | Type -------------+--------- - x | integer - ?column? | text - y | integer - dirty\name | boolean -(4 rows) - - x | ?column? | y | dirty\name ----+----------+---+------------ - 3 | Hello | 4 | t -(1 row) - --- test for server bug #17983 with empty statement in aborted transaction -set search_path = default; -begin; -bogus; -ERROR: syntax error at or near "bogus" -LINE 1: bogus; - ^ -; -\gdesc -The command has no result, or the result has no columns. -rollback; --- \gexec -create temporary table gexec_test(a int, b text, c date, d float); -select format('create index on gexec_test(%I)', attname) -from pg_attribute -where attrelid = 'gexec_test'::regclass and attnum > 0 -order by attnum -\gexec -create index on gexec_test(a) -create index on gexec_test(b) -create index on gexec_test(c) -create index on gexec_test(d) --- \gexec should work in FETCH_COUNT mode too --- (though the fetch limit applies to the executed queries not the meta query) -\set FETCH_COUNT 1 -select 'select 1 as ones', 'select x.y, x.y*2 as double from generate_series(1,4) as x(y)' -union all -select 'drop table gexec_test', NULL -union all -select 'drop table gexec_test', 'select ''2000-01-01''::date as party_over' -\gexec -select 1 as ones - ones ------- - 1 -(1 row) - -select x.y, x.y*2 as double from generate_series(1,4) as x(y) - y | double ----+-------- - 1 | 2 - 2 | 4 - 3 | 6 - 4 | 8 -(4 rows) - -drop table gexec_test -drop table gexec_test -ERROR: table "gexec_test" does not exist -select '2000-01-01'::date as party_over - party_over ------------- - 01-01-2000 -(1 row) - -\unset FETCH_COUNT --- \setenv, \getenv --- ensure MYVAR isn't set -\setenv MYVAR --- in which case, reading it doesn't change the target -\getenv res MYVAR -\echo :res -:res --- now set it -\setenv MYVAR 'environment value' -\getenv res MYVAR -\echo :res -environment value --- show all pset options -\pset -border 1 -columns 0 -csv_fieldsep ',' -expanded off -fieldsep '|' -fieldsep_zero off -footer on -format aligned -linestyle ascii -null '' -numericlocale off -pager 1 -pager_min_lines 0 -recordsep '\n' -recordsep_zero off -tableattr -title -tuples_only off -unicode_border_linestyle single -unicode_column_linestyle single -unicode_header_linestyle single -xheader_width full --- test multi-line headers, wrapping, and newline indicators --- in aligned, unaligned, and wrapped formats -prepare q as select array_to_string(array_agg(repeat('x',2*n)),E'\n') as "ab - -c", array_to_string(array_agg(repeat('y',20-2*n)),E'\n') as "a -bc" from generate_series(1,10) as n(n) group by n>1 order by n>1; -\pset linestyle ascii -\pset expanded off -\pset columns 40 -\pset border 0 -\pset format unaligned -execute q; -ab - -c|a -bc -xx|yyyyyyyyyyyyyyyyyy -xxxx -xxxxxx -xxxxxxxx -xxxxxxxxxx -xxxxxxxxxxxx -xxxxxxxxxxxxxx -xxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy -yyyyyyyyyyyyyy -yyyyyyyyyyyy -yyyyyyyyyy -yyyyyyyy -yyyyyy -yyyy -yy - -(2 rows) -\pset format aligned -execute q; - ab + a + - + bc - c --------------------- ------------------ -xx yyyyyyyyyyyyyyyyyy -xxxx +yyyyyyyyyyyyyyyy + -xxxxxx +yyyyyyyyyyyyyy + -xxxxxxxx +yyyyyyyyyyyy + -xxxxxxxxxx +yyyyyyyyyy + -xxxxxxxxxxxx +yyyyyyyy + -xxxxxxxxxxxxxx +yyyyyy + -xxxxxxxxxxxxxxxx +yyyy + -xxxxxxxxxxxxxxxxxx +yy + -xxxxxxxxxxxxxxxxxxxx -(2 rows) - -\pset format wrapped -execute q; - ab + a + - + bc - c --------------------- ------------------ -xx yyyyyyyyyyyyyyyyyy -xxxx +yyyyyyyyyyyyyyyy + -xxxxxx +yyyyyyyyyyyyyy + -xxxxxxxx +yyyyyyyyyyyy + -xxxxxxxxxx +yyyyyyyyyy + -xxxxxxxxxxxx +yyyyyyyy + -xxxxxxxxxxxxxx +yyyyyy + -xxxxxxxxxxxxxxxx +yyyy + -xxxxxxxxxxxxxxxxxx +yy + -xxxxxxxxxxxxxxxxxxxx -(2 rows) - -\pset border 1 -\pset format unaligned -execute q; -ab - -c|a -bc -xx|yyyyyyyyyyyyyyyyyy -xxxx -xxxxxx -xxxxxxxx -xxxxxxxxxx -xxxxxxxxxxxx -xxxxxxxxxxxxxx -xxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy -yyyyyyyyyyyyyy -yyyyyyyyyyyy -yyyyyyyyyy -yyyyyyyy -yyyyyy -yyyy -yy - -(2 rows) -\pset format aligned -execute q; - ab +| a + - +| bc - c | -----------------------+-------------------- - xx | yyyyyyyyyyyyyyyyyy - xxxx +| yyyyyyyyyyyyyyyy + - xxxxxx +| yyyyyyyyyyyyyy + - xxxxxxxx +| yyyyyyyyyyyy + - xxxxxxxxxx +| yyyyyyyyyy + - xxxxxxxxxxxx +| yyyyyyyy + - xxxxxxxxxxxxxx +| yyyyyy + - xxxxxxxxxxxxxxxx +| yyyy + - xxxxxxxxxxxxxxxxxx +| yy + - xxxxxxxxxxxxxxxxxxxx | -(2 rows) - -\pset format wrapped -execute q; - ab +| a + - +| bc - c | --------------------+-------------------- - xx | yyyyyyyyyyyyyyyyyy - xxxx +| yyyyyyyyyyyyyyyy + - xxxxxx +| yyyyyyyyyyyyyy + - xxxxxxxx +| yyyyyyyyyyyy + - xxxxxxxxxx +| yyyyyyyyyy + - xxxxxxxxxxxx +| yyyyyyyy + - xxxxxxxxxxxxxx +| yyyyyy + - xxxxxxxxxxxxxxxx +| yyyy + - xxxxxxxxxxxxxxxxx.| yy + -.x +| - xxxxxxxxxxxxxxxxx.| -.xxx | -(2 rows) - -\pset border 2 -\pset format unaligned -execute q; -ab - -c|a -bc -xx|yyyyyyyyyyyyyyyyyy -xxxx -xxxxxx -xxxxxxxx -xxxxxxxxxx -xxxxxxxxxxxx -xxxxxxxxxxxxxx -xxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy -yyyyyyyyyyyyyy -yyyyyyyyyyyy -yyyyyyyyyy -yyyyyyyy -yyyyyy -yyyy -yy - -(2 rows) -\pset format aligned -execute q; -+----------------------+--------------------+ -| ab +| a +| -| +| bc | -| c | | -+----------------------+--------------------+ -| xx | yyyyyyyyyyyyyyyyyy | -| xxxx +| yyyyyyyyyyyyyyyy +| -| xxxxxx +| yyyyyyyyyyyyyy +| -| xxxxxxxx +| yyyyyyyyyyyy +| -| xxxxxxxxxx +| yyyyyyyyyy +| -| xxxxxxxxxxxx +| yyyyyyyy +| -| xxxxxxxxxxxxxx +| yyyyyy +| -| xxxxxxxxxxxxxxxx +| yyyy +| -| xxxxxxxxxxxxxxxxxx +| yy +| -| xxxxxxxxxxxxxxxxxxxx | | -+----------------------+--------------------+ -(2 rows) - -\pset format wrapped -execute q; -+-----------------+--------------------+ -| ab +| a +| -| +| bc | -| c | | -+-----------------+--------------------+ -| xx | yyyyyyyyyyyyyyyyyy | -| xxxx +| yyyyyyyyyyyyyyyy +| -| xxxxxx +| yyyyyyyyyyyyyy +| -| xxxxxxxx +| yyyyyyyyyyyy +| -| xxxxxxxxxx +| yyyyyyyyyy +| -| xxxxxxxxxxxx +| yyyyyyyy +| -| xxxxxxxxxxxxxx +| yyyyyy +| -| xxxxxxxxxxxxxxx.| yyyy +| -|.x +| yy +| -| xxxxxxxxxxxxxxx.| | -|.xxx +| | -| xxxxxxxxxxxxxxx.| | -|.xxxxx | | -+-----------------+--------------------+ -(2 rows) - -\pset expanded on -\pset columns 20 -\pset border 0 -\pset format unaligned -execute q; -ab - -c|xx -a -bc|yyyyyyyyyyyyyyyyyy - -ab - -c|xxxx -xxxxxx -xxxxxxxx -xxxxxxxxxx -xxxxxxxxxxxx -xxxxxxxxxxxxxx -xxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxx -a -bc|yyyyyyyyyyyyyyyy -yyyyyyyyyyyyyy -yyyyyyyyyyyy -yyyyyyyyyy -yyyyyyyy -yyyyyy -yyyy -yy - -\pset format aligned -execute q; -* Record 1 -ab+ xx - + -c -a + yyyyyyyyyyyyyyyyyy -bc -* Record 2 -ab+ xxxx + - + xxxxxx + -c xxxxxxxx + - xxxxxxxxxx + - xxxxxxxxxxxx + - xxxxxxxxxxxxxx + - xxxxxxxxxxxxxxxx + - xxxxxxxxxxxxxxxxxx + - xxxxxxxxxxxxxxxxxxxx -a + yyyyyyyyyyyyyyyy + -bc yyyyyyyyyyyyyy + - yyyyyyyyyyyy + - yyyyyyyyyy + - yyyyyyyy + - yyyyyy + - yyyy + - yy + - - -\pset format wrapped -execute q; -* Record 1 -ab+ xx - + -c -a + yyyyyyyyyyyyyyy. -bc .yyy -* Record 2 -ab+ xxxx + - + xxxxxx + -c xxxxxxxx + - xxxxxxxxxx + - xxxxxxxxxxxx + - xxxxxxxxxxxxxx + - xxxxxxxxxxxxxxx. - .x + - xxxxxxxxxxxxxxx. - .xxx + - xxxxxxxxxxxxxxx. - .xxxxx -a + yyyyyyyyyyyyyyy. -bc .y + - yyyyyyyyyyyyyy + - yyyyyyyyyyyy + - yyyyyyyyyy + - yyyyyyyy + - yyyyyy + - yyyy + - yy + - - -\pset border 1 -\pset format unaligned -execute q; -ab - -c|xx -a -bc|yyyyyyyyyyyyyyyyyy - -ab - -c|xxxx -xxxxxx -xxxxxxxx -xxxxxxxxxx -xxxxxxxxxxxx -xxxxxxxxxxxxxx -xxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxx -a -bc|yyyyyyyyyyyyyyyy -yyyyyyyyyyyyyy -yyyyyyyyyyyy -yyyyyyyyyy -yyyyyyyy -yyyyyy -yyyy -yy - -\pset format aligned -execute q; --[ RECORD 1 ]------------ -ab+| xx - +| -c | -a +| yyyyyyyyyyyyyyyyyy -bc | --[ RECORD 2 ]------------ -ab+| xxxx + - +| xxxxxx + -c | xxxxxxxx + - | xxxxxxxxxx + - | xxxxxxxxxxxx + - | xxxxxxxxxxxxxx + - | xxxxxxxxxxxxxxxx + - | xxxxxxxxxxxxxxxxxx + - | xxxxxxxxxxxxxxxxxxxx -a +| yyyyyyyyyyyyyyyy + -bc | yyyyyyyyyyyyyy + - | yyyyyyyyyyyy + - | yyyyyyyyyy + - | yyyyyyyy + - | yyyyyy + - | yyyy + - | yy + - | - -\pset format wrapped -execute q; --[ RECORD 1 ]------ -ab+| xx - +| -c | -a +| yyyyyyyyyyyyyy. -bc |.yyyy --[ RECORD 2 ]------ -ab+| xxxx + - +| xxxxxx + -c | xxxxxxxx + - | xxxxxxxxxx + - | xxxxxxxxxxxx + - | xxxxxxxxxxxxxx+ - | xxxxxxxxxxxxxx. - |.xx + - | xxxxxxxxxxxxxx. - |.xxxx + - | xxxxxxxxxxxxxx. - |.xxxxxx -a +| yyyyyyyyyyyyyy. -bc |.yy + - | yyyyyyyyyyyyyy+ - | yyyyyyyyyyyy + - | yyyyyyyyyy + - | yyyyyyyy + - | yyyyyy + - | yyyy + - | yy + - | - -\pset border 2 -\pset format unaligned -execute q; -ab - -c|xx -a -bc|yyyyyyyyyyyyyyyyyy - -ab - -c|xxxx -xxxxxx -xxxxxxxx -xxxxxxxxxx -xxxxxxxxxxxx -xxxxxxxxxxxxxx -xxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxx -a -bc|yyyyyyyyyyyyyyyy -yyyyyyyyyyyyyy -yyyyyyyyyyyy -yyyyyyyyyy -yyyyyyyy -yyyyyy -yyyy -yy - -\pset format aligned -execute q; -+-[ RECORD 1 ]--------------+ -| ab+| xx | -| +| | -| c | | -| a +| yyyyyyyyyyyyyyyyyy | -| bc | | -+-[ RECORD 2 ]--------------+ -| ab+| xxxx +| -| +| xxxxxx +| -| c | xxxxxxxx +| -| | xxxxxxxxxx +| -| | xxxxxxxxxxxx +| -| | xxxxxxxxxxxxxx +| -| | xxxxxxxxxxxxxxxx +| -| | xxxxxxxxxxxxxxxxxx +| -| | xxxxxxxxxxxxxxxxxxxx | -| a +| yyyyyyyyyyyyyyyy +| -| bc | yyyyyyyyyyyyyy +| -| | yyyyyyyyyyyy +| -| | yyyyyyyyyy +| -| | yyyyyyyy +| -| | yyyyyy +| -| | yyyy +| -| | yy +| -| | | -+----+----------------------+ - -\pset format wrapped -execute q; -+-[ RECORD 1 ]-----+ -| ab+| xx | -| +| | -| c | | -| a +| yyyyyyyyyyy.| -| bc |.yyyyyyy | -+-[ RECORD 2 ]-----+ -| ab+| xxxx +| -| +| xxxxxx +| -| c | xxxxxxxx +| -| | xxxxxxxxxx +| -| | xxxxxxxxxxx.| -| |.x +| -| | xxxxxxxxxxx.| -| |.xxx +| -| | xxxxxxxxxxx.| -| |.xxxxx +| -| | xxxxxxxxxxx.| -| |.xxxxxxx +| -| | xxxxxxxxxxx.| -| |.xxxxxxxxx | -| a +| yyyyyyyyyyy.| -| bc |.yyyyy +| -| | yyyyyyyyyyy.| -| |.yyy +| -| | yyyyyyyyyyy.| -| |.y +| -| | yyyyyyyyyy +| -| | yyyyyyyy +| -| | yyyyyy +| -| | yyyy +| -| | yy +| -| | | -+----+-------------+ - -\pset linestyle old-ascii -\pset expanded off -\pset columns 40 -\pset border 0 -\pset format unaligned -execute q; -ab - -c|a -bc -xx|yyyyyyyyyyyyyyyyyy -xxxx -xxxxxx -xxxxxxxx -xxxxxxxxxx -xxxxxxxxxxxx -xxxxxxxxxxxxxx -xxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy -yyyyyyyyyyyyyy -yyyyyyyyyyyy -yyyyyyyyyy -yyyyyyyy -yyyyyy -yyyy -yy - -(2 rows) -\pset format aligned -execute q; - ab a - + bc - c + --------------------- ------------------ -xx yyyyyyyyyyyyyyyyyy -xxxx yyyyyyyyyyyyyyyy -xxxxxx yyyyyyyyyyyyyy -xxxxxxxx yyyyyyyyyyyy -xxxxxxxxxx yyyyyyyyyy -xxxxxxxxxxxx yyyyyyyy -xxxxxxxxxxxxxx yyyyyy -xxxxxxxxxxxxxxxx yyyy -xxxxxxxxxxxxxxxxxx yy -xxxxxxxxxxxxxxxxxxxx -(2 rows) - -\pset format wrapped -execute q; - ab a - + bc - c + --------------------- ------------------ -xx yyyyyyyyyyyyyyyyyy -xxxx yyyyyyyyyyyyyyyy -xxxxxx yyyyyyyyyyyyyy -xxxxxxxx yyyyyyyyyyyy -xxxxxxxxxx yyyyyyyyyy -xxxxxxxxxxxx yyyyyyyy -xxxxxxxxxxxxxx yyyyyy -xxxxxxxxxxxxxxxx yyyy -xxxxxxxxxxxxxxxxxx yy -xxxxxxxxxxxxxxxxxxxx -(2 rows) - -\pset border 1 -\pset format unaligned -execute q; -ab - -c|a -bc -xx|yyyyyyyyyyyyyyyyyy -xxxx -xxxxxx -xxxxxxxx -xxxxxxxxxx -xxxxxxxxxxxx -xxxxxxxxxxxxxx -xxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy -yyyyyyyyyyyyyy -yyyyyyyyyyyy -yyyyyyyyyy -yyyyyyyy -yyyyyy -yyyy -yy - -(2 rows) -\pset format aligned -execute q; - ab | a -+ |+ bc -+ c |+ -----------------------+-------------------- - xx | yyyyyyyyyyyyyyyyyy - xxxx | yyyyyyyyyyyyyyyy - xxxxxx : yyyyyyyyyyyyyy - xxxxxxxx : yyyyyyyyyyyy - xxxxxxxxxx : yyyyyyyyyy - xxxxxxxxxxxx : yyyyyyyy - xxxxxxxxxxxxxx : yyyyyy - xxxxxxxxxxxxxxxx : yyyy - xxxxxxxxxxxxxxxxxx : yy - xxxxxxxxxxxxxxxxxxxx : -(2 rows) - -\pset format wrapped -execute q; - ab | a -+ |+ bc -+ c |+ --------------------+-------------------- - xx | yyyyyyyyyyyyyyyyyy - xxxx | yyyyyyyyyyyyyyyy - xxxxxx : yyyyyyyyyyyyyy - xxxxxxxx : yyyyyyyyyyyy - xxxxxxxxxx : yyyyyyyyyy - xxxxxxxxxxxx : yyyyyyyy - xxxxxxxxxxxxxx : yyyyyy - xxxxxxxxxxxxxxxx : yyyy - xxxxxxxxxxxxxxxxx : yy - x : - xxxxxxxxxxxxxxxxx - xxx -(2 rows) - -\pset border 2 -\pset format unaligned -execute q; -ab - -c|a -bc -xx|yyyyyyyyyyyyyyyyyy -xxxx -xxxxxx -xxxxxxxx -xxxxxxxxxx -xxxxxxxxxxxx -xxxxxxxxxxxxxx -xxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxx|yyyyyyyyyyyyyyyy -yyyyyyyyyyyyyy -yyyyyyyyyyyy -yyyyyyyyyy -yyyyyyyy -yyyyyy -yyyy -yy - -(2 rows) -\pset format aligned -execute q; -+----------------------+--------------------+ -| ab | a | -|+ |+ bc | -|+ c |+ | -+----------------------+--------------------+ -| xx | yyyyyyyyyyyyyyyyyy | -| xxxx | yyyyyyyyyyyyyyyy | -| xxxxxx : yyyyyyyyyyyyyy | -| xxxxxxxx : yyyyyyyyyyyy | -| xxxxxxxxxx : yyyyyyyyyy | -| xxxxxxxxxxxx : yyyyyyyy | -| xxxxxxxxxxxxxx : yyyyyy | -| xxxxxxxxxxxxxxxx : yyyy | -| xxxxxxxxxxxxxxxxxx : yy | -| xxxxxxxxxxxxxxxxxxxx : | -+----------------------+--------------------+ -(2 rows) - -\pset format wrapped -execute q; -+-----------------+--------------------+ -| ab | a | -|+ |+ bc | -|+ c |+ | -+-----------------+--------------------+ -| xx | yyyyyyyyyyyyyyyyyy | -| xxxx | yyyyyyyyyyyyyyyy | -| xxxxxx : yyyyyyyyyyyyyy | -| xxxxxxxx : yyyyyyyyyyyy | -| xxxxxxxxxx : yyyyyyyyyy | -| xxxxxxxxxxxx : yyyyyyyy | -| xxxxxxxxxxxxxx : yyyyyy | -| xxxxxxxxxxxxxxx : yyyy | -| x : yy | -| xxxxxxxxxxxxxxx : | -| xxx | -| xxxxxxxxxxxxxxx | -| xxxxx | -+-----------------+--------------------+ -(2 rows) - -\pset expanded on -\pset columns 20 -\pset border 0 -\pset format unaligned -execute q; -ab - -c|xx -a -bc|yyyyyyyyyyyyyyyyyy - -ab - -c|xxxx -xxxxxx -xxxxxxxx -xxxxxxxxxx -xxxxxxxxxxxx -xxxxxxxxxxxxxx -xxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxx -a -bc|yyyyyyyyyyyyyyyy -yyyyyyyyyyyyyy -yyyyyyyyyyyy -yyyyyyyyyy -yyyyyyyy -yyyyyy -yyyy -yy - -\pset format aligned -execute q; -* Record 1 - ab xx -+ -+c - a yyyyyyyyyyyyyyyyyy -+bc -* Record 2 - ab xxxx -+ xxxxxx -+c xxxxxxxx - xxxxxxxxxx - xxxxxxxxxxxx - xxxxxxxxxxxxxx - xxxxxxxxxxxxxxxx - xxxxxxxxxxxxxxxxxx - xxxxxxxxxxxxxxxxxxxx - a yyyyyyyyyyyyyyyy -+bc yyyyyyyyyyyyyy - yyyyyyyyyyyy - yyyyyyyyyy - yyyyyyyy - yyyyyy - yyyy - yy - - -\pset format wrapped -execute q; -* Record 1 - ab xx -+ -+c - a yyyyyyyyyyyyyyyy -+bc yy -* Record 2 - ab xxxx -+ xxxxxx -+c xxxxxxxx - xxxxxxxxxx - xxxxxxxxxxxx - xxxxxxxxxxxxxx - xxxxxxxxxxxxxxxx - xxxxxxxxxxxxxxxx - xx - xxxxxxxxxxxxxxxx - xxxx - a yyyyyyyyyyyyyyyy -+bc yyyyyyyyyyyyyy - yyyyyyyyyyyy - yyyyyyyyyy - yyyyyyyy - yyyyyy - yyyy - yy - - -\pset border 1 -\pset format unaligned -execute q; -ab - -c|xx -a -bc|yyyyyyyyyyyyyyyyyy - -ab - -c|xxxx -xxxxxx -xxxxxxxx -xxxxxxxxxx -xxxxxxxxxxxx -xxxxxxxxxxxxxx -xxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxx -a -bc|yyyyyyyyyyyyyyyy -yyyyyyyyyyyyyy -yyyyyyyyyyyy -yyyyyyyyyy -yyyyyyyy -yyyyyy -yyyy -yy - -\pset format aligned -execute q; --[ RECORD 1 ]------------- - ab | xx -+ ; -+c ; - a | yyyyyyyyyyyyyyyyyy -+bc ; --[ RECORD 2 ]------------- - ab | xxxx -+ : xxxxxx -+c : xxxxxxxx - : xxxxxxxxxx - : xxxxxxxxxxxx - : xxxxxxxxxxxxxx - : xxxxxxxxxxxxxxxx - : xxxxxxxxxxxxxxxxxx - : xxxxxxxxxxxxxxxxxxxx - a | yyyyyyyyyyyyyyyy -+bc : yyyyyyyyyyyyyy - : yyyyyyyyyyyy - : yyyyyyyyyy - : yyyyyyyy - : yyyyyy - : yyyy - : yy - : - -\pset format wrapped -execute q; --[ RECORD 1 ]------- - ab | xx -+ ; -+c ; - a | yyyyyyyyyyyyyy -+bc ; yyyy --[ RECORD 2 ]------- - ab | xxxx -+ : xxxxxx -+c : xxxxxxxx - : xxxxxxxxxx - : xxxxxxxxxxxx - : xxxxxxxxxxxxxx - : xxxxxxxxxxxxxx - ; xx - : xxxxxxxxxxxxxx - ; xxxx - : xxxxxxxxxxxxxx - ; xxxxxx - a | yyyyyyyyyyyyyy -+bc ; yy - : yyyyyyyyyyyyyy - : yyyyyyyyyyyy - : yyyyyyyyyy - : yyyyyyyy - : yyyyyy - : yyyy - : yy - : - -\pset border 2 -\pset format unaligned -execute q; -ab - -c|xx -a -bc|yyyyyyyyyyyyyyyyyy - -ab - -c|xxxx -xxxxxx -xxxxxxxx -xxxxxxxxxx -xxxxxxxxxxxx -xxxxxxxxxxxxxx -xxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxx -xxxxxxxxxxxxxxxxxxxx -a -bc|yyyyyyyyyyyyyyyy -yyyyyyyyyyyyyy -yyyyyyyyyyyy -yyyyyyyyyy -yyyyyyyy -yyyyyy -yyyy -yy - -\pset format aligned -execute q; -+-[ RECORD 1 ]--------------+ -| ab | xx | -|+ ; | -|+c ; | -| a | yyyyyyyyyyyyyyyyyy | -|+bc ; | -+-[ RECORD 2 ]--------------+ -| ab | xxxx | -|+ : xxxxxx | -|+c : xxxxxxxx | -| : xxxxxxxxxx | -| : xxxxxxxxxxxx | -| : xxxxxxxxxxxxxx | -| : xxxxxxxxxxxxxxxx | -| : xxxxxxxxxxxxxxxxxx | -| : xxxxxxxxxxxxxxxxxxxx | -| a | yyyyyyyyyyyyyyyy | -|+bc : yyyyyyyyyyyyyy | -| : yyyyyyyyyyyy | -| : yyyyyyyyyy | -| : yyyyyyyy | -| : yyyyyy | -| : yyyy | -| : yy | -| : | -+----+----------------------+ - -\pset format wrapped -execute q; -+-[ RECORD 1 ]-----+ -| ab | xx | -|+ ; | -|+c ; | -| a | yyyyyyyyyyy | -|+bc ; yyyyyyy | -+-[ RECORD 2 ]-----+ -| ab | xxxx | -|+ : xxxxxx | -|+c : xxxxxxxx | -| : xxxxxxxxxx | -| : xxxxxxxxxxx | -| ; x | -| : xxxxxxxxxxx | -| ; xxx | -| : xxxxxxxxxxx | -| ; xxxxx | -| : xxxxxxxxxxx | -| ; xxxxxxx | -| : xxxxxxxxxxx | -| ; xxxxxxxxx | -| a | yyyyyyyyyyy | -|+bc ; yyyyy | -| : yyyyyyyyyyy | -| ; yyy | -| : yyyyyyyyyyy | -| ; y | -| : yyyyyyyyyy | -| : yyyyyyyy | -| : yyyyyy | -| : yyyy | -| : yy | -| : | -+----+-------------+ - -deallocate q; --- test single-line header and data -prepare q as select repeat('x',2*n) as "0123456789abcdef", repeat('y',20-2*n) as "0123456789" from generate_series(1,10) as n; -\pset linestyle ascii -\pset expanded off -\pset columns 40 -\pset border 0 -\pset format unaligned -execute q; -0123456789abcdef|0123456789 -xx|yyyyyyyyyyyyyyyyyy -xxxx|yyyyyyyyyyyyyyyy -xxxxxx|yyyyyyyyyyyyyy -xxxxxxxx|yyyyyyyyyyyy -xxxxxxxxxx|yyyyyyyyyy -xxxxxxxxxxxx|yyyyyyyy -xxxxxxxxxxxxxx|yyyyyy -xxxxxxxxxxxxxxxx|yyyy -xxxxxxxxxxxxxxxxxx|yy -xxxxxxxxxxxxxxxxxxxx| -(10 rows) -\pset format aligned -execute q; - 0123456789abcdef 0123456789 --------------------- ------------------ -xx yyyyyyyyyyyyyyyyyy -xxxx yyyyyyyyyyyyyyyy -xxxxxx yyyyyyyyyyyyyy -xxxxxxxx yyyyyyyyyyyy -xxxxxxxxxx yyyyyyyyyy -xxxxxxxxxxxx yyyyyyyy -xxxxxxxxxxxxxx yyyyyy -xxxxxxxxxxxxxxxx yyyy -xxxxxxxxxxxxxxxxxx yy -xxxxxxxxxxxxxxxxxxxx -(10 rows) - -\pset format wrapped -execute q; - 0123456789abcdef 0123456789 --------------------- ------------------ -xx yyyyyyyyyyyyyyyyyy -xxxx yyyyyyyyyyyyyyyy -xxxxxx yyyyyyyyyyyyyy -xxxxxxxx yyyyyyyyyyyy -xxxxxxxxxx yyyyyyyyyy -xxxxxxxxxxxx yyyyyyyy -xxxxxxxxxxxxxx yyyyyy -xxxxxxxxxxxxxxxx yyyy -xxxxxxxxxxxxxxxxxx yy -xxxxxxxxxxxxxxxxxxxx -(10 rows) - -\pset border 1 -\pset format unaligned -execute q; -0123456789abcdef|0123456789 -xx|yyyyyyyyyyyyyyyyyy -xxxx|yyyyyyyyyyyyyyyy -xxxxxx|yyyyyyyyyyyyyy -xxxxxxxx|yyyyyyyyyyyy -xxxxxxxxxx|yyyyyyyyyy -xxxxxxxxxxxx|yyyyyyyy -xxxxxxxxxxxxxx|yyyyyy -xxxxxxxxxxxxxxxx|yyyy -xxxxxxxxxxxxxxxxxx|yy -xxxxxxxxxxxxxxxxxxxx| -(10 rows) -\pset format aligned -execute q; - 0123456789abcdef | 0123456789 -----------------------+-------------------- - xx | yyyyyyyyyyyyyyyyyy - xxxx | yyyyyyyyyyyyyyyy - xxxxxx | yyyyyyyyyyyyyy - xxxxxxxx | yyyyyyyyyyyy - xxxxxxxxxx | yyyyyyyyyy - xxxxxxxxxxxx | yyyyyyyy - xxxxxxxxxxxxxx | yyyyyy - xxxxxxxxxxxxxxxx | yyyy - xxxxxxxxxxxxxxxxxx | yy - xxxxxxxxxxxxxxxxxxxx | -(10 rows) - -\pset format wrapped -execute q; - 0123456789abcdef | 0123456789 ----------------------+------------------ - xx | yyyyyyyyyyyyyyyy. - |.yy - xxxx | yyyyyyyyyyyyyyyy - xxxxxx | yyyyyyyyyyyyyy - xxxxxxxx | yyyyyyyyyyyy - xxxxxxxxxx | yyyyyyyyyy - xxxxxxxxxxxx | yyyyyyyy - xxxxxxxxxxxxxx | yyyyyy - xxxxxxxxxxxxxxxx | yyyy - xxxxxxxxxxxxxxxxxx | yy - xxxxxxxxxxxxxxxxxxx.| -.x | -(10 rows) - -\pset border 2 -\pset format unaligned -execute q; -0123456789abcdef|0123456789 -xx|yyyyyyyyyyyyyyyyyy -xxxx|yyyyyyyyyyyyyyyy -xxxxxx|yyyyyyyyyyyyyy -xxxxxxxx|yyyyyyyyyyyy -xxxxxxxxxx|yyyyyyyyyy -xxxxxxxxxxxx|yyyyyyyy -xxxxxxxxxxxxxx|yyyyyy -xxxxxxxxxxxxxxxx|yyyy -xxxxxxxxxxxxxxxxxx|yy -xxxxxxxxxxxxxxxxxxxx| -(10 rows) -\pset format aligned -execute q; -+----------------------+--------------------+ -| 0123456789abcdef | 0123456789 | -+----------------------+--------------------+ -| xx | yyyyyyyyyyyyyyyyyy | -| xxxx | yyyyyyyyyyyyyyyy | -| xxxxxx | yyyyyyyyyyyyyy | -| xxxxxxxx | yyyyyyyyyyyy | -| xxxxxxxxxx | yyyyyyyyyy | -| xxxxxxxxxxxx | yyyyyyyy | -| xxxxxxxxxxxxxx | yyyyyy | -| xxxxxxxxxxxxxxxx | yyyy | -| xxxxxxxxxxxxxxxxxx | yy | -| xxxxxxxxxxxxxxxxxxxx | | -+----------------------+--------------------+ -(10 rows) - -\pset format wrapped -execute q; -+--------------------+-----------------+ -| 0123456789abcdef | 0123456789 | -+--------------------+-----------------+ -| xx | yyyyyyyyyyyyyyy.| -| |.yyy | -| xxxx | yyyyyyyyyyyyyyy.| -| |.y | -| xxxxxx | yyyyyyyyyyyyyy | -| xxxxxxxx | yyyyyyyyyyyy | -| xxxxxxxxxx | yyyyyyyyyy | -| xxxxxxxxxxxx | yyyyyyyy | -| xxxxxxxxxxxxxx | yyyyyy | -| xxxxxxxxxxxxxxxx | yyyy | -| xxxxxxxxxxxxxxxxxx | yy | -| xxxxxxxxxxxxxxxxxx.| | -|.xx | | -+--------------------+-----------------+ -(10 rows) - -\pset expanded on -\pset columns 30 -\pset border 0 -\pset format unaligned -execute q; -0123456789abcdef|xx -0123456789|yyyyyyyyyyyyyyyyyy - -0123456789abcdef|xxxx -0123456789|yyyyyyyyyyyyyyyy - -0123456789abcdef|xxxxxx -0123456789|yyyyyyyyyyyyyy - -0123456789abcdef|xxxxxxxx -0123456789|yyyyyyyyyyyy - -0123456789abcdef|xxxxxxxxxx -0123456789|yyyyyyyyyy - -0123456789abcdef|xxxxxxxxxxxx -0123456789|yyyyyyyy - -0123456789abcdef|xxxxxxxxxxxxxx -0123456789|yyyyyy - -0123456789abcdef|xxxxxxxxxxxxxxxx -0123456789|yyyy - -0123456789abcdef|xxxxxxxxxxxxxxxxxx -0123456789|yy - -0123456789abcdef|xxxxxxxxxxxxxxxxxxxx -0123456789| -\pset format aligned -execute q; -* Record 1 -0123456789abcdef xx -0123456789 yyyyyyyyyyyyyyyyyy -* Record 2 -0123456789abcdef xxxx -0123456789 yyyyyyyyyyyyyyyy -* Record 3 -0123456789abcdef xxxxxx -0123456789 yyyyyyyyyyyyyy -* Record 4 -0123456789abcdef xxxxxxxx -0123456789 yyyyyyyyyyyy -* Record 5 -0123456789abcdef xxxxxxxxxx -0123456789 yyyyyyyyyy -* Record 6 -0123456789abcdef xxxxxxxxxxxx -0123456789 yyyyyyyy -* Record 7 -0123456789abcdef xxxxxxxxxxxxxx -0123456789 yyyyyy -* Record 8 -0123456789abcdef xxxxxxxxxxxxxxxx -0123456789 yyyy -* Record 9 -0123456789abcdef xxxxxxxxxxxxxxxxxx -0123456789 yy -* Record 10 -0123456789abcdef xxxxxxxxxxxxxxxxxxxx -0123456789 - -\pset format wrapped -execute q; -* Record 1 -0123456789abcdef xx -0123456789 yyyyyyyyyyyy. - .yyyyyy -* Record 2 -0123456789abcdef xxxx -0123456789 yyyyyyyyyyyy. - .yyyy -* Record 3 -0123456789abcdef xxxxxx -0123456789 yyyyyyyyyyyy. - .yy -* Record 4 -0123456789abcdef xxxxxxxx -0123456789 yyyyyyyyyyyy -* Record 5 -0123456789abcdef xxxxxxxxxx -0123456789 yyyyyyyyyy -* Record 6 -0123456789abcdef xxxxxxxxxxxx -0123456789 yyyyyyyy -* Record 7 -0123456789abcdef xxxxxxxxxxxx. - .xx -0123456789 yyyyyy -* Record 8 -0123456789abcdef xxxxxxxxxxxx. - .xxxx -0123456789 yyyy -* Record 9 -0123456789abcdef xxxxxxxxxxxx. - .xxxxxx -0123456789 yy -* Record 10 -0123456789abcdef xxxxxxxxxxxx. - .xxxxxxxx -0123456789 - -\pset border 1 -\pset format unaligned -execute q; -0123456789abcdef|xx -0123456789|yyyyyyyyyyyyyyyyyy - -0123456789abcdef|xxxx -0123456789|yyyyyyyyyyyyyyyy - -0123456789abcdef|xxxxxx -0123456789|yyyyyyyyyyyyyy - -0123456789abcdef|xxxxxxxx -0123456789|yyyyyyyyyyyy - -0123456789abcdef|xxxxxxxxxx -0123456789|yyyyyyyyyy - -0123456789abcdef|xxxxxxxxxxxx -0123456789|yyyyyyyy - -0123456789abcdef|xxxxxxxxxxxxxx -0123456789|yyyyyy - -0123456789abcdef|xxxxxxxxxxxxxxxx -0123456789|yyyy - -0123456789abcdef|xxxxxxxxxxxxxxxxxx -0123456789|yy - -0123456789abcdef|xxxxxxxxxxxxxxxxxxxx -0123456789| -\pset format aligned -execute q; --[ RECORD 1 ]----+--------------------- -0123456789abcdef | xx -0123456789 | yyyyyyyyyyyyyyyyyy --[ RECORD 2 ]----+--------------------- -0123456789abcdef | xxxx -0123456789 | yyyyyyyyyyyyyyyy --[ RECORD 3 ]----+--------------------- -0123456789abcdef | xxxxxx -0123456789 | yyyyyyyyyyyyyy --[ RECORD 4 ]----+--------------------- -0123456789abcdef | xxxxxxxx -0123456789 | yyyyyyyyyyyy --[ RECORD 5 ]----+--------------------- -0123456789abcdef | xxxxxxxxxx -0123456789 | yyyyyyyyyy --[ RECORD 6 ]----+--------------------- -0123456789abcdef | xxxxxxxxxxxx -0123456789 | yyyyyyyy --[ RECORD 7 ]----+--------------------- -0123456789abcdef | xxxxxxxxxxxxxx -0123456789 | yyyyyy --[ RECORD 8 ]----+--------------------- -0123456789abcdef | xxxxxxxxxxxxxxxx -0123456789 | yyyy --[ RECORD 9 ]----+--------------------- -0123456789abcdef | xxxxxxxxxxxxxxxxxx -0123456789 | yy --[ RECORD 10 ]---+--------------------- -0123456789abcdef | xxxxxxxxxxxxxxxxxxxx -0123456789 | - -\pset format wrapped -execute q; --[ RECORD 1 ]----+----------- -0123456789abcdef | xx -0123456789 | yyyyyyyyyy. - |.yyyyyyyy --[ RECORD 2 ]----+----------- -0123456789abcdef | xxxx -0123456789 | yyyyyyyyyy. - |.yyyyyy --[ RECORD 3 ]----+----------- -0123456789abcdef | xxxxxx -0123456789 | yyyyyyyyyy. - |.yyyy --[ RECORD 4 ]----+----------- -0123456789abcdef | xxxxxxxx -0123456789 | yyyyyyyyyy. - |.yy --[ RECORD 5 ]----+----------- -0123456789abcdef | xxxxxxxxxx -0123456789 | yyyyyyyyyy --[ RECORD 6 ]----+----------- -0123456789abcdef | xxxxxxxxxx. - |.xx -0123456789 | yyyyyyyy --[ RECORD 7 ]----+----------- -0123456789abcdef | xxxxxxxxxx. - |.xxxx -0123456789 | yyyyyy --[ RECORD 8 ]----+----------- -0123456789abcdef | xxxxxxxxxx. - |.xxxxxx -0123456789 | yyyy --[ RECORD 9 ]----+----------- -0123456789abcdef | xxxxxxxxxx. - |.xxxxxxxx -0123456789 | yy --[ RECORD 10 ]---+----------- -0123456789abcdef | xxxxxxxxxx. - |.xxxxxxxxxx -0123456789 | - -\pset border 2 -\pset format unaligned -execute q; -0123456789abcdef|xx -0123456789|yyyyyyyyyyyyyyyyyy - -0123456789abcdef|xxxx -0123456789|yyyyyyyyyyyyyyyy - -0123456789abcdef|xxxxxx -0123456789|yyyyyyyyyyyyyy - -0123456789abcdef|xxxxxxxx -0123456789|yyyyyyyyyyyy - -0123456789abcdef|xxxxxxxxxx -0123456789|yyyyyyyyyy - -0123456789abcdef|xxxxxxxxxxxx -0123456789|yyyyyyyy - -0123456789abcdef|xxxxxxxxxxxxxx -0123456789|yyyyyy - -0123456789abcdef|xxxxxxxxxxxxxxxx -0123456789|yyyy - -0123456789abcdef|xxxxxxxxxxxxxxxxxx -0123456789|yy - -0123456789abcdef|xxxxxxxxxxxxxxxxxxxx -0123456789| -\pset format aligned -execute q; -+-[ RECORD 1 ]-----+----------------------+ -| 0123456789abcdef | xx | -| 0123456789 | yyyyyyyyyyyyyyyyyy | -+-[ RECORD 2 ]-----+----------------------+ -| 0123456789abcdef | xxxx | -| 0123456789 | yyyyyyyyyyyyyyyy | -+-[ RECORD 3 ]-----+----------------------+ -| 0123456789abcdef | xxxxxx | -| 0123456789 | yyyyyyyyyyyyyy | -+-[ RECORD 4 ]-----+----------------------+ -| 0123456789abcdef | xxxxxxxx | -| 0123456789 | yyyyyyyyyyyy | -+-[ RECORD 5 ]-----+----------------------+ -| 0123456789abcdef | xxxxxxxxxx | -| 0123456789 | yyyyyyyyyy | -+-[ RECORD 6 ]-----+----------------------+ -| 0123456789abcdef | xxxxxxxxxxxx | -| 0123456789 | yyyyyyyy | -+-[ RECORD 7 ]-----+----------------------+ -| 0123456789abcdef | xxxxxxxxxxxxxx | -| 0123456789 | yyyyyy | -+-[ RECORD 8 ]-----+----------------------+ -| 0123456789abcdef | xxxxxxxxxxxxxxxx | -| 0123456789 | yyyy | -+-[ RECORD 9 ]-----+----------------------+ -| 0123456789abcdef | xxxxxxxxxxxxxxxxxx | -| 0123456789 | yy | -+-[ RECORD 10 ]----+----------------------+ -| 0123456789abcdef | xxxxxxxxxxxxxxxxxxxx | -| 0123456789 | | -+------------------+----------------------+ - -\pset format wrapped -execute q; -+-[ RECORD 1 ]-----+---------+ -| 0123456789abcdef | xx | -| 0123456789 | yyyyyyy.| -| |.yyyyyyy.| -| |.yyyy | -+-[ RECORD 2 ]-----+---------+ -| 0123456789abcdef | xxxx | -| 0123456789 | yyyyyyy.| -| |.yyyyyyy.| -| |.yy | -+-[ RECORD 3 ]-----+---------+ -| 0123456789abcdef | xxxxxx | -| 0123456789 | yyyyyyy.| -| |.yyyyyyy | -+-[ RECORD 4 ]-----+---------+ -| 0123456789abcdef | xxxxxxx.| -| |.x | -| 0123456789 | yyyyyyy.| -| |.yyyyy | -+-[ RECORD 5 ]-----+---------+ -| 0123456789abcdef | xxxxxxx.| -| |.xxx | -| 0123456789 | yyyyyyy.| -| |.yyy | -+-[ RECORD 6 ]-----+---------+ -| 0123456789abcdef | xxxxxxx.| -| |.xxxxx | -| 0123456789 | yyyyyyy.| -| |.y | -+-[ RECORD 7 ]-----+---------+ -| 0123456789abcdef | xxxxxxx.| -| |.xxxxxxx | -| 0123456789 | yyyyyy | -+-[ RECORD 8 ]-----+---------+ -| 0123456789abcdef | xxxxxxx.| -| |.xxxxxxx.| -| |.xx | -| 0123456789 | yyyy | -+-[ RECORD 9 ]-----+---------+ -| 0123456789abcdef | xxxxxxx.| -| |.xxxxxxx.| -| |.xxxx | -| 0123456789 | yy | -+-[ RECORD 10 ]----+---------+ -| 0123456789abcdef | xxxxxxx.| -| |.xxxxxxx.| -| |.xxxxxx | -| 0123456789 | | -+------------------+---------+ - -\pset expanded on -\pset columns 20 -\pset border 0 -\pset format unaligned -execute q; -0123456789abcdef|xx -0123456789|yyyyyyyyyyyyyyyyyy - -0123456789abcdef|xxxx -0123456789|yyyyyyyyyyyyyyyy - -0123456789abcdef|xxxxxx -0123456789|yyyyyyyyyyyyyy - -0123456789abcdef|xxxxxxxx -0123456789|yyyyyyyyyyyy - -0123456789abcdef|xxxxxxxxxx -0123456789|yyyyyyyyyy - -0123456789abcdef|xxxxxxxxxxxx -0123456789|yyyyyyyy - -0123456789abcdef|xxxxxxxxxxxxxx -0123456789|yyyyyy - -0123456789abcdef|xxxxxxxxxxxxxxxx -0123456789|yyyy - -0123456789abcdef|xxxxxxxxxxxxxxxxxx -0123456789|yy - -0123456789abcdef|xxxxxxxxxxxxxxxxxxxx -0123456789| -\pset format aligned -execute q; -* Record 1 -0123456789abcdef xx -0123456789 yyyyyyyyyyyyyyyyyy -* Record 2 -0123456789abcdef xxxx -0123456789 yyyyyyyyyyyyyyyy -* Record 3 -0123456789abcdef xxxxxx -0123456789 yyyyyyyyyyyyyy -* Record 4 -0123456789abcdef xxxxxxxx -0123456789 yyyyyyyyyyyy -* Record 5 -0123456789abcdef xxxxxxxxxx -0123456789 yyyyyyyyyy -* Record 6 -0123456789abcdef xxxxxxxxxxxx -0123456789 yyyyyyyy -* Record 7 -0123456789abcdef xxxxxxxxxxxxxx -0123456789 yyyyyy -* Record 8 -0123456789abcdef xxxxxxxxxxxxxxxx -0123456789 yyyy -* Record 9 -0123456789abcdef xxxxxxxxxxxxxxxxxx -0123456789 yy -* Record 10 -0123456789abcdef xxxxxxxxxxxxxxxxxxxx -0123456789 - -\pset format wrapped -execute q; -* Record 1 -0123456789abcdef xx -0123456789 yyy. - .yyy. - .yyy. - .yyy. - .yyy. - .yyy -* Record 2 -0123456789abcdef xxx. - .x -0123456789 yyy. - .yyy. - .yyy. - .yyy. - .yyy. - .y -* Record 3 -0123456789abcdef xxx. - .xxx -0123456789 yyy. - .yyy. - .yyy. - .yyy. - .yy -* Record 4 -0123456789abcdef xxx. - .xxx. - .xx -0123456789 yyy. - .yyy. - .yyy. - .yyy -* Record 5 -0123456789abcdef xxx. - .xxx. - .xxx. - .x -0123456789 yyy. - .yyy. - .yyy. - .y -* Record 6 -0123456789abcdef xxx. - .xxx. - .xxx. - .xxx -0123456789 yyy. - .yyy. - .yy -* Record 7 -0123456789abcdef xxx. - .xxx. - .xxx. - .xxx. - .xx -0123456789 yyy. - .yyy -* Record 8 -0123456789abcdef xxx. - .xxx. - .xxx. - .xxx. - .xxx. - .x -0123456789 yyy. - .y -* Record 9 -0123456789abcdef xxx. - .xxx. - .xxx. - .xxx. - .xxx. - .xxx -0123456789 yy -* Record 10 -0123456789abcdef xxx. - .xxx. - .xxx. - .xxx. - .xxx. - .xxx. - .xx -0123456789 - -\pset border 1 -\pset format unaligned -execute q; -0123456789abcdef|xx -0123456789|yyyyyyyyyyyyyyyyyy - -0123456789abcdef|xxxx -0123456789|yyyyyyyyyyyyyyyy - -0123456789abcdef|xxxxxx -0123456789|yyyyyyyyyyyyyy - -0123456789abcdef|xxxxxxxx -0123456789|yyyyyyyyyyyy - -0123456789abcdef|xxxxxxxxxx -0123456789|yyyyyyyyyy - -0123456789abcdef|xxxxxxxxxxxx -0123456789|yyyyyyyy - -0123456789abcdef|xxxxxxxxxxxxxx -0123456789|yyyyyy - -0123456789abcdef|xxxxxxxxxxxxxxxx -0123456789|yyyy - -0123456789abcdef|xxxxxxxxxxxxxxxxxx -0123456789|yy - -0123456789abcdef|xxxxxxxxxxxxxxxxxxxx -0123456789| -\pset format aligned -execute q; --[ RECORD 1 ]----+--------------------- -0123456789abcdef | xx -0123456789 | yyyyyyyyyyyyyyyyyy --[ RECORD 2 ]----+--------------------- -0123456789abcdef | xxxx -0123456789 | yyyyyyyyyyyyyyyy --[ RECORD 3 ]----+--------------------- -0123456789abcdef | xxxxxx -0123456789 | yyyyyyyyyyyyyy --[ RECORD 4 ]----+--------------------- -0123456789abcdef | xxxxxxxx -0123456789 | yyyyyyyyyyyy --[ RECORD 5 ]----+--------------------- -0123456789abcdef | xxxxxxxxxx -0123456789 | yyyyyyyyyy --[ RECORD 6 ]----+--------------------- -0123456789abcdef | xxxxxxxxxxxx -0123456789 | yyyyyyyy --[ RECORD 7 ]----+--------------------- -0123456789abcdef | xxxxxxxxxxxxxx -0123456789 | yyyyyy --[ RECORD 8 ]----+--------------------- -0123456789abcdef | xxxxxxxxxxxxxxxx -0123456789 | yyyy --[ RECORD 9 ]----+--------------------- -0123456789abcdef | xxxxxxxxxxxxxxxxxx -0123456789 | yy --[ RECORD 10 ]---+--------------------- -0123456789abcdef | xxxxxxxxxxxxxxxxxxxx -0123456789 | - -\pset format wrapped -execute q; --[ RECORD 1 ]----+---- -0123456789abcdef | xx -0123456789 | yyy. - |.yyy. - |.yyy. - |.yyy. - |.yyy. - |.yyy --[ RECORD 2 ]----+---- -0123456789abcdef | xxx. - |.x -0123456789 | yyy. - |.yyy. - |.yyy. - |.yyy. - |.yyy. - |.y --[ RECORD 3 ]----+---- -0123456789abcdef | xxx. - |.xxx -0123456789 | yyy. - |.yyy. - |.yyy. - |.yyy. - |.yy --[ RECORD 4 ]----+---- -0123456789abcdef | xxx. - |.xxx. - |.xx -0123456789 | yyy. - |.yyy. - |.yyy. - |.yyy --[ RECORD 5 ]----+---- -0123456789abcdef | xxx. - |.xxx. - |.xxx. - |.x -0123456789 | yyy. - |.yyy. - |.yyy. - |.y --[ RECORD 6 ]----+---- -0123456789abcdef | xxx. - |.xxx. - |.xxx. - |.xxx -0123456789 | yyy. - |.yyy. - |.yy --[ RECORD 7 ]----+---- -0123456789abcdef | xxx. - |.xxx. - |.xxx. - |.xxx. - |.xx -0123456789 | yyy. - |.yyy --[ RECORD 8 ]----+---- -0123456789abcdef | xxx. - |.xxx. - |.xxx. - |.xxx. - |.xxx. - |.x -0123456789 | yyy. - |.y --[ RECORD 9 ]----+---- -0123456789abcdef | xxx. - |.xxx. - |.xxx. - |.xxx. - |.xxx. - |.xxx -0123456789 | yy --[ RECORD 10 ]---+---- -0123456789abcdef | xxx. - |.xxx. - |.xxx. - |.xxx. - |.xxx. - |.xxx. - |.xx -0123456789 | - -\pset border 2 -\pset format unaligned -execute q; -0123456789abcdef|xx -0123456789|yyyyyyyyyyyyyyyyyy - -0123456789abcdef|xxxx -0123456789|yyyyyyyyyyyyyyyy - -0123456789abcdef|xxxxxx -0123456789|yyyyyyyyyyyyyy - -0123456789abcdef|xxxxxxxx -0123456789|yyyyyyyyyyyy - -0123456789abcdef|xxxxxxxxxx -0123456789|yyyyyyyyyy - -0123456789abcdef|xxxxxxxxxxxx -0123456789|yyyyyyyy - -0123456789abcdef|xxxxxxxxxxxxxx -0123456789|yyyyyy - -0123456789abcdef|xxxxxxxxxxxxxxxx -0123456789|yyyy - -0123456789abcdef|xxxxxxxxxxxxxxxxxx -0123456789|yy - -0123456789abcdef|xxxxxxxxxxxxxxxxxxxx -0123456789| -\pset format aligned -execute q; -+-[ RECORD 1 ]-----+----------------------+ -| 0123456789abcdef | xx | -| 0123456789 | yyyyyyyyyyyyyyyyyy | -+-[ RECORD 2 ]-----+----------------------+ -| 0123456789abcdef | xxxx | -| 0123456789 | yyyyyyyyyyyyyyyy | -+-[ RECORD 3 ]-----+----------------------+ -| 0123456789abcdef | xxxxxx | -| 0123456789 | yyyyyyyyyyyyyy | -+-[ RECORD 4 ]-----+----------------------+ -| 0123456789abcdef | xxxxxxxx | -| 0123456789 | yyyyyyyyyyyy | -+-[ RECORD 5 ]-----+----------------------+ -| 0123456789abcdef | xxxxxxxxxx | -| 0123456789 | yyyyyyyyyy | -+-[ RECORD 6 ]-----+----------------------+ -| 0123456789abcdef | xxxxxxxxxxxx | -| 0123456789 | yyyyyyyy | -+-[ RECORD 7 ]-----+----------------------+ -| 0123456789abcdef | xxxxxxxxxxxxxx | -| 0123456789 | yyyyyy | -+-[ RECORD 8 ]-----+----------------------+ -| 0123456789abcdef | xxxxxxxxxxxxxxxx | -| 0123456789 | yyyy | -+-[ RECORD 9 ]-----+----------------------+ -| 0123456789abcdef | xxxxxxxxxxxxxxxxxx | -| 0123456789 | yy | -+-[ RECORD 10 ]----+----------------------+ -| 0123456789abcdef | xxxxxxxxxxxxxxxxxxxx | -| 0123456789 | | -+------------------+----------------------+ - -\pset format wrapped -execute q; -+-[ RECORD 1 ]-----+-----+ -| 0123456789abcdef | xx | -| 0123456789 | yyy.| -| |.yyy.| -| |.yyy.| -| |.yyy.| -| |.yyy.| -| |.yyy | -+-[ RECORD 2 ]-----+-----+ -| 0123456789abcdef | xxx.| -| |.x | -| 0123456789 | yyy.| -| |.yyy.| -| |.yyy.| -| |.yyy.| -| |.yyy.| -| |.y | -+-[ RECORD 3 ]-----+-----+ -| 0123456789abcdef | xxx.| -| |.xxx | -| 0123456789 | yyy.| -| |.yyy.| -| |.yyy.| -| |.yyy.| -| |.yy | -+-[ RECORD 4 ]-----+-----+ -| 0123456789abcdef | xxx.| -| |.xxx.| -| |.xx | -| 0123456789 | yyy.| -| |.yyy.| -| |.yyy.| -| |.yyy | -+-[ RECORD 5 ]-----+-----+ -| 0123456789abcdef | xxx.| -| |.xxx.| -| |.xxx.| -| |.x | -| 0123456789 | yyy.| -| |.yyy.| -| |.yyy.| -| |.y | -+-[ RECORD 6 ]-----+-----+ -| 0123456789abcdef | xxx.| -| |.xxx.| -| |.xxx.| -| |.xxx | -| 0123456789 | yyy.| -| |.yyy.| -| |.yy | -+-[ RECORD 7 ]-----+-----+ -| 0123456789abcdef | xxx.| -| |.xxx.| -| |.xxx.| -| |.xxx.| -| |.xx | -| 0123456789 | yyy.| -| |.yyy | -+-[ RECORD 8 ]-----+-----+ -| 0123456789abcdef | xxx.| -| |.xxx.| -| |.xxx.| -| |.xxx.| -| |.xxx.| -| |.x | -| 0123456789 | yyy.| -| |.y | -+-[ RECORD 9 ]-----+-----+ -| 0123456789abcdef | xxx.| -| |.xxx.| -| |.xxx.| -| |.xxx.| -| |.xxx.| -| |.xxx | -| 0123456789 | yy | -+-[ RECORD 10 ]----+-----+ -| 0123456789abcdef | xxx.| -| |.xxx.| -| |.xxx.| -| |.xxx.| -| |.xxx.| -| |.xxx.| -| |.xx | -| 0123456789 | | -+------------------+-----+ - -\pset linestyle old-ascii -\pset expanded off -\pset columns 40 -\pset border 0 -\pset format unaligned -execute q; -0123456789abcdef|0123456789 -xx|yyyyyyyyyyyyyyyyyy -xxxx|yyyyyyyyyyyyyyyy -xxxxxx|yyyyyyyyyyyyyy -xxxxxxxx|yyyyyyyyyyyy -xxxxxxxxxx|yyyyyyyyyy -xxxxxxxxxxxx|yyyyyyyy -xxxxxxxxxxxxxx|yyyyyy -xxxxxxxxxxxxxxxx|yyyy -xxxxxxxxxxxxxxxxxx|yy -xxxxxxxxxxxxxxxxxxxx| -(10 rows) -\pset format aligned -execute q; - 0123456789abcdef 0123456789 --------------------- ------------------ -xx yyyyyyyyyyyyyyyyyy -xxxx yyyyyyyyyyyyyyyy -xxxxxx yyyyyyyyyyyyyy -xxxxxxxx yyyyyyyyyyyy -xxxxxxxxxx yyyyyyyyyy -xxxxxxxxxxxx yyyyyyyy -xxxxxxxxxxxxxx yyyyyy -xxxxxxxxxxxxxxxx yyyy -xxxxxxxxxxxxxxxxxx yy -xxxxxxxxxxxxxxxxxxxx -(10 rows) - -\pset format wrapped -execute q; - 0123456789abcdef 0123456789 --------------------- ------------------ -xx yyyyyyyyyyyyyyyyyy -xxxx yyyyyyyyyyyyyyyy -xxxxxx yyyyyyyyyyyyyy -xxxxxxxx yyyyyyyyyyyy -xxxxxxxxxx yyyyyyyyyy -xxxxxxxxxxxx yyyyyyyy -xxxxxxxxxxxxxx yyyyyy -xxxxxxxxxxxxxxxx yyyy -xxxxxxxxxxxxxxxxxx yy -xxxxxxxxxxxxxxxxxxxx -(10 rows) - -\pset border 1 -\pset format unaligned -execute q; -0123456789abcdef|0123456789 -xx|yyyyyyyyyyyyyyyyyy -xxxx|yyyyyyyyyyyyyyyy -xxxxxx|yyyyyyyyyyyyyy -xxxxxxxx|yyyyyyyyyyyy -xxxxxxxxxx|yyyyyyyyyy -xxxxxxxxxxxx|yyyyyyyy -xxxxxxxxxxxxxx|yyyyyy -xxxxxxxxxxxxxxxx|yyyy -xxxxxxxxxxxxxxxxxx|yy -xxxxxxxxxxxxxxxxxxxx| -(10 rows) -\pset format aligned -execute q; - 0123456789abcdef | 0123456789 -----------------------+-------------------- - xx | yyyyyyyyyyyyyyyyyy - xxxx | yyyyyyyyyyyyyyyy - xxxxxx | yyyyyyyyyyyyyy - xxxxxxxx | yyyyyyyyyyyy - xxxxxxxxxx | yyyyyyyyyy - xxxxxxxxxxxx | yyyyyyyy - xxxxxxxxxxxxxx | yyyyyy - xxxxxxxxxxxxxxxx | yyyy - xxxxxxxxxxxxxxxxxx | yy - xxxxxxxxxxxxxxxxxxxx | -(10 rows) - -\pset format wrapped -execute q; - 0123456789abcdef | 0123456789 ----------------------+------------------ - xx | yyyyyyyyyyyyyyyy - ; yy - xxxx | yyyyyyyyyyyyyyyy - xxxxxx | yyyyyyyyyyyyyy - xxxxxxxx | yyyyyyyyyyyy - xxxxxxxxxx | yyyyyyyyyy - xxxxxxxxxxxx | yyyyyyyy - xxxxxxxxxxxxxx | yyyyyy - xxxxxxxxxxxxxxxx | yyyy - xxxxxxxxxxxxxxxxxx | yy - xxxxxxxxxxxxxxxxxxx | - x -(10 rows) - -\pset border 2 -\pset format unaligned -execute q; -0123456789abcdef|0123456789 -xx|yyyyyyyyyyyyyyyyyy -xxxx|yyyyyyyyyyyyyyyy -xxxxxx|yyyyyyyyyyyyyy -xxxxxxxx|yyyyyyyyyyyy -xxxxxxxxxx|yyyyyyyyyy -xxxxxxxxxxxx|yyyyyyyy -xxxxxxxxxxxxxx|yyyyyy -xxxxxxxxxxxxxxxx|yyyy -xxxxxxxxxxxxxxxxxx|yy -xxxxxxxxxxxxxxxxxxxx| -(10 rows) -\pset format aligned -execute q; -+----------------------+--------------------+ -| 0123456789abcdef | 0123456789 | -+----------------------+--------------------+ -| xx | yyyyyyyyyyyyyyyyyy | -| xxxx | yyyyyyyyyyyyyyyy | -| xxxxxx | yyyyyyyyyyyyyy | -| xxxxxxxx | yyyyyyyyyyyy | -| xxxxxxxxxx | yyyyyyyyyy | -| xxxxxxxxxxxx | yyyyyyyy | -| xxxxxxxxxxxxxx | yyyyyy | -| xxxxxxxxxxxxxxxx | yyyy | -| xxxxxxxxxxxxxxxxxx | yy | -| xxxxxxxxxxxxxxxxxxxx | | -+----------------------+--------------------+ -(10 rows) - -\pset format wrapped -execute q; -+--------------------+-----------------+ -| 0123456789abcdef | 0123456789 | -+--------------------+-----------------+ -| xx | yyyyyyyyyyyyyyy | -| ; yyy | -| xxxx | yyyyyyyyyyyyyyy | -| ; y | -| xxxxxx | yyyyyyyyyyyyyy | -| xxxxxxxx | yyyyyyyyyyyy | -| xxxxxxxxxx | yyyyyyyyyy | -| xxxxxxxxxxxx | yyyyyyyy | -| xxxxxxxxxxxxxx | yyyyyy | -| xxxxxxxxxxxxxxxx | yyyy | -| xxxxxxxxxxxxxxxxxx | yy | -| xxxxxxxxxxxxxxxxxx | | -| xx | -+--------------------+-----------------+ -(10 rows) - -\pset expanded on -\pset border 0 -\pset format unaligned -execute q; -0123456789abcdef|xx -0123456789|yyyyyyyyyyyyyyyyyy - -0123456789abcdef|xxxx -0123456789|yyyyyyyyyyyyyyyy - -0123456789abcdef|xxxxxx -0123456789|yyyyyyyyyyyyyy - -0123456789abcdef|xxxxxxxx -0123456789|yyyyyyyyyyyy - -0123456789abcdef|xxxxxxxxxx -0123456789|yyyyyyyyyy - -0123456789abcdef|xxxxxxxxxxxx -0123456789|yyyyyyyy - -0123456789abcdef|xxxxxxxxxxxxxx -0123456789|yyyyyy - -0123456789abcdef|xxxxxxxxxxxxxxxx -0123456789|yyyy - -0123456789abcdef|xxxxxxxxxxxxxxxxxx -0123456789|yy - -0123456789abcdef|xxxxxxxxxxxxxxxxxxxx -0123456789| -\pset format aligned -execute q; -* Record 1 -0123456789abcdef xx -0123456789 yyyyyyyyyyyyyyyyyy -* Record 2 -0123456789abcdef xxxx -0123456789 yyyyyyyyyyyyyyyy -* Record 3 -0123456789abcdef xxxxxx -0123456789 yyyyyyyyyyyyyy -* Record 4 -0123456789abcdef xxxxxxxx -0123456789 yyyyyyyyyyyy -* Record 5 -0123456789abcdef xxxxxxxxxx -0123456789 yyyyyyyyyy -* Record 6 -0123456789abcdef xxxxxxxxxxxx -0123456789 yyyyyyyy -* Record 7 -0123456789abcdef xxxxxxxxxxxxxx -0123456789 yyyyyy -* Record 8 -0123456789abcdef xxxxxxxxxxxxxxxx -0123456789 yyyy -* Record 9 -0123456789abcdef xxxxxxxxxxxxxxxxxx -0123456789 yy -* Record 10 -0123456789abcdef xxxxxxxxxxxxxxxxxxxx -0123456789 - -\pset format wrapped -execute q; -* Record 1 -0123456789abcdef xx -0123456789 yyyyyyyyyyyyyyyyyy -* Record 2 -0123456789abcdef xxxx -0123456789 yyyyyyyyyyyyyyyy -* Record 3 -0123456789abcdef xxxxxx -0123456789 yyyyyyyyyyyyyy -* Record 4 -0123456789abcdef xxxxxxxx -0123456789 yyyyyyyyyyyy -* Record 5 -0123456789abcdef xxxxxxxxxx -0123456789 yyyyyyyyyy -* Record 6 -0123456789abcdef xxxxxxxxxxxx -0123456789 yyyyyyyy -* Record 7 -0123456789abcdef xxxxxxxxxxxxxx -0123456789 yyyyyy -* Record 8 -0123456789abcdef xxxxxxxxxxxxxxxx -0123456789 yyyy -* Record 9 -0123456789abcdef xxxxxxxxxxxxxxxxxx -0123456789 yy -* Record 10 -0123456789abcdef xxxxxxxxxxxxxxxxxxxx -0123456789 - -\pset border 1 -\pset format unaligned -execute q; -0123456789abcdef|xx -0123456789|yyyyyyyyyyyyyyyyyy - -0123456789abcdef|xxxx -0123456789|yyyyyyyyyyyyyyyy - -0123456789abcdef|xxxxxx -0123456789|yyyyyyyyyyyyyy - -0123456789abcdef|xxxxxxxx -0123456789|yyyyyyyyyyyy - -0123456789abcdef|xxxxxxxxxx -0123456789|yyyyyyyyyy - -0123456789abcdef|xxxxxxxxxxxx -0123456789|yyyyyyyy - -0123456789abcdef|xxxxxxxxxxxxxx -0123456789|yyyyyy - -0123456789abcdef|xxxxxxxxxxxxxxxx -0123456789|yyyy - -0123456789abcdef|xxxxxxxxxxxxxxxxxx -0123456789|yy - -0123456789abcdef|xxxxxxxxxxxxxxxxxxxx -0123456789| -\pset format aligned -execute q; --[ RECORD 1 ]----+--------------------- -0123456789abcdef | xx -0123456789 | yyyyyyyyyyyyyyyyyy --[ RECORD 2 ]----+--------------------- -0123456789abcdef | xxxx -0123456789 | yyyyyyyyyyyyyyyy --[ RECORD 3 ]----+--------------------- -0123456789abcdef | xxxxxx -0123456789 | yyyyyyyyyyyyyy --[ RECORD 4 ]----+--------------------- -0123456789abcdef | xxxxxxxx -0123456789 | yyyyyyyyyyyy --[ RECORD 5 ]----+--------------------- -0123456789abcdef | xxxxxxxxxx -0123456789 | yyyyyyyyyy --[ RECORD 6 ]----+--------------------- -0123456789abcdef | xxxxxxxxxxxx -0123456789 | yyyyyyyy --[ RECORD 7 ]----+--------------------- -0123456789abcdef | xxxxxxxxxxxxxx -0123456789 | yyyyyy --[ RECORD 8 ]----+--------------------- -0123456789abcdef | xxxxxxxxxxxxxxxx -0123456789 | yyyy --[ RECORD 9 ]----+--------------------- -0123456789abcdef | xxxxxxxxxxxxxxxxxx -0123456789 | yy --[ RECORD 10 ]---+--------------------- -0123456789abcdef | xxxxxxxxxxxxxxxxxxxx -0123456789 | - -\pset format wrapped -execute q; --[ RECORD 1 ]----+--------------------- -0123456789abcdef | xx -0123456789 | yyyyyyyyyyyyyyyyyy --[ RECORD 2 ]----+--------------------- -0123456789abcdef | xxxx -0123456789 | yyyyyyyyyyyyyyyy --[ RECORD 3 ]----+--------------------- -0123456789abcdef | xxxxxx -0123456789 | yyyyyyyyyyyyyy --[ RECORD 4 ]----+--------------------- -0123456789abcdef | xxxxxxxx -0123456789 | yyyyyyyyyyyy --[ RECORD 5 ]----+--------------------- -0123456789abcdef | xxxxxxxxxx -0123456789 | yyyyyyyyyy --[ RECORD 6 ]----+--------------------- -0123456789abcdef | xxxxxxxxxxxx -0123456789 | yyyyyyyy --[ RECORD 7 ]----+--------------------- -0123456789abcdef | xxxxxxxxxxxxxx -0123456789 | yyyyyy --[ RECORD 8 ]----+--------------------- -0123456789abcdef | xxxxxxxxxxxxxxxx -0123456789 | yyyy --[ RECORD 9 ]----+--------------------- -0123456789abcdef | xxxxxxxxxxxxxxxxxx -0123456789 | yy --[ RECORD 10 ]---+--------------------- -0123456789abcdef | xxxxxxxxxxxxxxxxxxxx -0123456789 | - -\pset border 2 -\pset format unaligned -execute q; -0123456789abcdef|xx -0123456789|yyyyyyyyyyyyyyyyyy - -0123456789abcdef|xxxx -0123456789|yyyyyyyyyyyyyyyy - -0123456789abcdef|xxxxxx -0123456789|yyyyyyyyyyyyyy - -0123456789abcdef|xxxxxxxx -0123456789|yyyyyyyyyyyy - -0123456789abcdef|xxxxxxxxxx -0123456789|yyyyyyyyyy - -0123456789abcdef|xxxxxxxxxxxx -0123456789|yyyyyyyy - -0123456789abcdef|xxxxxxxxxxxxxx -0123456789|yyyyyy - -0123456789abcdef|xxxxxxxxxxxxxxxx -0123456789|yyyy - -0123456789abcdef|xxxxxxxxxxxxxxxxxx -0123456789|yy - -0123456789abcdef|xxxxxxxxxxxxxxxxxxxx -0123456789| -\pset format aligned -execute q; -+-[ RECORD 1 ]-----+----------------------+ -| 0123456789abcdef | xx | -| 0123456789 | yyyyyyyyyyyyyyyyyy | -+-[ RECORD 2 ]-----+----------------------+ -| 0123456789abcdef | xxxx | -| 0123456789 | yyyyyyyyyyyyyyyy | -+-[ RECORD 3 ]-----+----------------------+ -| 0123456789abcdef | xxxxxx | -| 0123456789 | yyyyyyyyyyyyyy | -+-[ RECORD 4 ]-----+----------------------+ -| 0123456789abcdef | xxxxxxxx | -| 0123456789 | yyyyyyyyyyyy | -+-[ RECORD 5 ]-----+----------------------+ -| 0123456789abcdef | xxxxxxxxxx | -| 0123456789 | yyyyyyyyyy | -+-[ RECORD 6 ]-----+----------------------+ -| 0123456789abcdef | xxxxxxxxxxxx | -| 0123456789 | yyyyyyyy | -+-[ RECORD 7 ]-----+----------------------+ -| 0123456789abcdef | xxxxxxxxxxxxxx | -| 0123456789 | yyyyyy | -+-[ RECORD 8 ]-----+----------------------+ -| 0123456789abcdef | xxxxxxxxxxxxxxxx | -| 0123456789 | yyyy | -+-[ RECORD 9 ]-----+----------------------+ -| 0123456789abcdef | xxxxxxxxxxxxxxxxxx | -| 0123456789 | yy | -+-[ RECORD 10 ]----+----------------------+ -| 0123456789abcdef | xxxxxxxxxxxxxxxxxxxx | -| 0123456789 | | -+------------------+----------------------+ - -\pset format wrapped -execute q; -+-[ RECORD 1 ]-----+-------------------+ -| 0123456789abcdef | xx | -| 0123456789 | yyyyyyyyyyyyyyyyy | -| ; y | -+-[ RECORD 2 ]-----+-------------------+ -| 0123456789abcdef | xxxx | -| 0123456789 | yyyyyyyyyyyyyyyy | -+-[ RECORD 3 ]-----+-------------------+ -| 0123456789abcdef | xxxxxx | -| 0123456789 | yyyyyyyyyyyyyy | -+-[ RECORD 4 ]-----+-------------------+ -| 0123456789abcdef | xxxxxxxx | -| 0123456789 | yyyyyyyyyyyy | -+-[ RECORD 5 ]-----+-------------------+ -| 0123456789abcdef | xxxxxxxxxx | -| 0123456789 | yyyyyyyyyy | -+-[ RECORD 6 ]-----+-------------------+ -| 0123456789abcdef | xxxxxxxxxxxx | -| 0123456789 | yyyyyyyy | -+-[ RECORD 7 ]-----+-------------------+ -| 0123456789abcdef | xxxxxxxxxxxxxx | -| 0123456789 | yyyyyy | -+-[ RECORD 8 ]-----+-------------------+ -| 0123456789abcdef | xxxxxxxxxxxxxxxx | -| 0123456789 | yyyy | -+-[ RECORD 9 ]-----+-------------------+ -| 0123456789abcdef | xxxxxxxxxxxxxxxxx | -| ; x | -| 0123456789 | yy | -+-[ RECORD 10 ]----+-------------------+ -| 0123456789abcdef | xxxxxxxxxxxxxxxxx | -| ; xxx | -| 0123456789 | | -+------------------+-------------------+ - -deallocate q; -\pset linestyle ascii -\pset border 1 --- support table for output-format tests (useful to create a footer) -create table psql_serial_tab (id serial); --- test header/footer/tuples_only behavior in aligned/unaligned/wrapped cases -\pset format aligned -\pset expanded off -\d psql_serial_tab_id_seq - Sequence "public.psql_serial_tab_id_seq" - Type | Start | Minimum | Maximum | Increment | Cycles? | Cache ----------+-------+---------+------------+-----------+---------+------- - integer | 1 | 1 | 2147483647 | 1 | no | 1 -Owned by: public.psql_serial_tab.id - -\pset tuples_only true -\df exp - pg_catalog | exp | double precision | double precision | func - pg_catalog | exp | numeric | numeric | func - -\pset tuples_only false -\pset expanded on -\d psql_serial_tab_id_seq -Sequence "public.psql_serial_tab_id_seq" --[ RECORD 1 ]--------- -Type | integer -Start | 1 -Minimum | 1 -Maximum | 2147483647 -Increment | 1 -Cycles? | no -Cache | 1 - -Owned by: public.psql_serial_tab.id - -\pset tuples_only true -\df exp -Schema | pg_catalog -Name | exp -Result data type | double precision -Argument data types | double precision -Type | func ---------------------+----------------- -Schema | pg_catalog -Name | exp -Result data type | numeric -Argument data types | numeric -Type | func - -\pset tuples_only false --- empty table is a special case for this format -select 1 where false; -(0 rows) - -\pset format unaligned -\pset expanded off -\d psql_serial_tab_id_seq -Sequence "public.psql_serial_tab_id_seq" -Type|Start|Minimum|Maximum|Increment|Cycles?|Cache -integer|1|1|2147483647|1|no|1 -Owned by: public.psql_serial_tab.id -\pset tuples_only true -\df exp -pg_catalog|exp|double precision|double precision|func -pg_catalog|exp|numeric|numeric|func -\pset tuples_only false -\pset expanded on -\d psql_serial_tab_id_seq -Sequence "public.psql_serial_tab_id_seq" - -Type|integer -Start|1 -Minimum|1 -Maximum|2147483647 -Increment|1 -Cycles?|no -Cache|1 - -Owned by: public.psql_serial_tab.id -\pset tuples_only true -\df exp -Schema|pg_catalog -Name|exp -Result data type|double precision -Argument data types|double precision -Type|func - -Schema|pg_catalog -Name|exp -Result data type|numeric -Argument data types|numeric -Type|func -\pset tuples_only false -\pset format wrapped -\pset expanded off -\d psql_serial_tab_id_seq - Sequence "public.psql_serial_tab_id_seq" - Type | Start | Minimum | Maximum | Increment | Cycles? | Cache ----------+-------+---------+------------+-----------+---------+------- - integer | 1 | 1 | 2147483647 | 1 | no | 1 -Owned by: public.psql_serial_tab.id - -\pset tuples_only true -\df exp - pg_catalog | exp | double precision | double precision | func - pg_catalog | exp | numeric | numeric | func - -\pset tuples_only false -\pset expanded on -\d psql_serial_tab_id_seq -Sequence "public.psql_serial_tab_id_seq" --[ RECORD 1 ]--------- -Type | integer -Start | 1 -Minimum | 1 -Maximum | 2147483647 -Increment | 1 -Cycles? | no -Cache | 1 - -Owned by: public.psql_serial_tab.id - -\pset tuples_only true -\df exp -Schema | pg_catalog -Name | exp -Result data type | double precision -Argument data types | double precision -Type | func ---------------------+----------------- -Schema | pg_catalog -Name | exp -Result data type | numeric -Argument data types | numeric -Type | func - -\pset tuples_only false --- check conditional am display -\pset expanded off -CREATE SCHEMA tableam_display; -CREATE ROLE regress_display_role; -ALTER SCHEMA tableam_display OWNER TO regress_display_role; -SET search_path TO tableam_display; -CREATE ACCESS METHOD heap_psql TYPE TABLE HANDLER heap_tableam_handler; -SET ROLE TO regress_display_role; --- Use only relations with a physical size of zero. -CREATE TABLE tbl_heap_psql(f1 int, f2 char(100)) using heap_psql; -CREATE TABLE tbl_heap(f1 int, f2 char(100)) using heap; -CREATE VIEW view_heap_psql AS SELECT f1 from tbl_heap_psql; -CREATE MATERIALIZED VIEW mat_view_heap_psql USING heap_psql AS SELECT f1 from tbl_heap_psql; -\d+ tbl_heap_psql - Table "tableam_display.tbl_heap_psql" - Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ---------+----------------+-----------+----------+---------+----------+--------------+------------- - f1 | integer | | | | plain | | - f2 | character(100) | | | | extended | | - -\d+ tbl_heap - Table "tableam_display.tbl_heap" - Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ---------+----------------+-----------+----------+---------+----------+--------------+------------- - f1 | integer | | | | plain | | - f2 | character(100) | | | | extended | | - -\set HIDE_TABLEAM off -\d+ tbl_heap_psql - Table "tableam_display.tbl_heap_psql" - Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ---------+----------------+-----------+----------+---------+----------+--------------+------------- - f1 | integer | | | | plain | | - f2 | character(100) | | | | extended | | -Access method: heap_psql - -\d+ tbl_heap - Table "tableam_display.tbl_heap" - Column | Type | Collation | Nullable | Default | Storage | Stats target | Description ---------+----------------+-----------+----------+---------+----------+--------------+------------- - f1 | integer | | | | plain | | - f2 | character(100) | | | | extended | | -Access method: heap - --- AM is displayed for tables, indexes and materialized views. -\d+ - List of relations - Schema | Name | Type | Owner | Persistence | Access method | Size | Description ------------------+--------------------+-------------------+----------------------+-------------+---------------+---------+------------- - tableam_display | mat_view_heap_psql | materialized view | regress_display_role | permanent | heap_psql | 0 bytes | - tableam_display | tbl_heap | table | regress_display_role | permanent | heap | 0 bytes | - tableam_display | tbl_heap_psql | table | regress_display_role | permanent | heap_psql | 0 bytes | - tableam_display | view_heap_psql | view | regress_display_role | permanent | | 0 bytes | -(4 rows) - -\dt+ - List of relations - Schema | Name | Type | Owner | Persistence | Access method | Size | Description ------------------+---------------+-------+----------------------+-------------+---------------+---------+------------- - tableam_display | tbl_heap | table | regress_display_role | permanent | heap | 0 bytes | - tableam_display | tbl_heap_psql | table | regress_display_role | permanent | heap_psql | 0 bytes | -(2 rows) - -\dm+ - List of relations - Schema | Name | Type | Owner | Persistence | Access method | Size | Description ------------------+--------------------+-------------------+----------------------+-------------+---------------+---------+------------- - tableam_display | mat_view_heap_psql | materialized view | regress_display_role | permanent | heap_psql | 0 bytes | -(1 row) - --- But not for views and sequences. -\dv+ - List of relations - Schema | Name | Type | Owner | Persistence | Size | Description ------------------+----------------+------+----------------------+-------------+---------+------------- - tableam_display | view_heap_psql | view | regress_display_role | permanent | 0 bytes | -(1 row) - -\set HIDE_TABLEAM on -\d+ - List of relations - Schema | Name | Type | Owner | Persistence | Size | Description ------------------+--------------------+-------------------+----------------------+-------------+---------+------------- - tableam_display | mat_view_heap_psql | materialized view | regress_display_role | permanent | 0 bytes | - tableam_display | tbl_heap | table | regress_display_role | permanent | 0 bytes | - tableam_display | tbl_heap_psql | table | regress_display_role | permanent | 0 bytes | - tableam_display | view_heap_psql | view | regress_display_role | permanent | 0 bytes | -(4 rows) - -RESET ROLE; -RESET search_path; -DROP SCHEMA tableam_display CASCADE; -NOTICE: drop cascades to 4 other objects -DETAIL: drop cascades to table tableam_display.tbl_heap_psql -drop cascades to table tableam_display.tbl_heap -drop cascades to view tableam_display.view_heap_psql -drop cascades to materialized view tableam_display.mat_view_heap_psql -DROP ACCESS METHOD heap_psql; -DROP ROLE regress_display_role; --- test numericlocale (as best we can without control of psql's locale) -\pset format aligned -\pset expanded off -\pset numericlocale true -select n, -n as m, n * 111 as x, '1e90'::float8 as f -from generate_series(0,3) n; - n | m | x | f ----+----+-----+------- - 0 | 0 | 0 | 1e+90 - 1 | -1 | 111 | 1e+90 - 2 | -2 | 222 | 1e+90 - 3 | -3 | 333 | 1e+90 -(4 rows) - -\pset numericlocale false --- test asciidoc output format -\pset format asciidoc -\pset border 1 -\pset expanded off -\d psql_serial_tab_id_seq - -.Sequence "public.psql_serial_tab_id_seq" -[options="header",cols="l,>l,>l,>l,l",frame="none"] -|==== -^l|Type ^l|Start ^l|Minimum ^l|Maximum ^l|Increment ^l|Cycles? ^l|Cache -|integer |1 |1 |2147483647 |1 |no |1 -|==== - -.... -Owned by: public.psql_serial_tab.id -.... -\pset tuples_only true -\df exp - -[cols="l|1 -l|1 -l|2147483647 -l|1 -l|1 -|==== - -.... -Owned by: public.psql_serial_tab.id -.... -\pset tuples_only true -\df exp - -[cols="h,l",frame="none"] -|==== -2+| -l|1 -2+^|Record 2 -l|2 -|==== -\pset border 1 -execute q; - -[cols="h,l",frame="none"] -|==== -2+^|Record 1 -l|1 -2+^|Record 2 -l|2 -|==== -\pset border 2 -execute q; - -[cols="h,l",frame="all",grid="all"] -|==== -2+^|Record 1 -l|1 -2+^|Record 2 -l|2 -|==== -deallocate q; --- test csv output format -\pset format csv -\pset border 1 -\pset expanded off -\d psql_serial_tab_id_seq -Type,Start,Minimum,Maximum,Increment,Cycles?,Cache -integer,1,1,2147483647,1,no,1 -\pset tuples_only true -\df exp -pg_catalog,exp,double precision,double precision,func -pg_catalog,exp,numeric,numeric,func -\pset tuples_only false -\pset expanded on -\d psql_serial_tab_id_seq -Type,integer -Start,1 -Minimum,1 -Maximum,2147483647 -Increment,1 -Cycles?,no -Cache,1 -\pset tuples_only true -\df exp -Schema,pg_catalog -Name,exp -Result data type,double precision -Argument data types,double precision -Type,func -Schema,pg_catalog -Name,exp -Result data type,numeric -Argument data types,numeric -Type,func -\pset tuples_only false -prepare q as - select 'some"text' as "a""title", E' \n' as "junk", - ' ' as "empty", n as int - from generate_series(1,2) as n; -\pset expanded off -execute q; -"a""title",junk,empty,int -"some""text"," -", ,1 -"some""text"," -", ,2 -\pset expanded on -execute q; -"a""title","some""text" -junk," -" -empty, -int,1 -"a""title","some""text" -junk," -" -empty, -int,2 -deallocate q; --- special cases -\pset expanded off -select 'comma,comma' as comma, 'semi;semi' as semi; -comma,semi -"comma,comma",semi;semi -\pset csv_fieldsep ';' -select 'comma,comma' as comma, 'semi;semi' as semi; -comma;semi -comma,comma;"semi;semi" -select '\.' as data; -data -"\." -\pset csv_fieldsep '.' -select '\' as d1, '' as d2; -"d1"."d2" -"\"."" --- illegal csv separators -\pset csv_fieldsep '' -\pset: csv_fieldsep must be a single one-byte character -\pset csv_fieldsep '\0' -\pset: csv_fieldsep must be a single one-byte character -\pset csv_fieldsep '\n' -\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return -\pset csv_fieldsep '\r' -\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return -\pset csv_fieldsep '"' -\pset: csv_fieldsep cannot be a double quote, a newline, or a carriage return -\pset csv_fieldsep ',,' -\pset: csv_fieldsep must be a single one-byte character -\pset csv_fieldsep ',' --- test html output format -\pset format html -\pset border 1 -\pset expanded off -\d psql_serial_tab_id_seq -
- - - - - - - - - - - - - - - - - - - -
Sequence "public.psql_serial_tab_id_seq"
TypeStartMinimumMaximumIncrementCycles?Cache
integer1121474836471no1
-

Owned by: public.psql_serial_tab.id
-

-\pset tuples_only true -\df exp - - - - - - - - - - - - - - - -
pg_catalogexpdouble precisiondouble precisionfunc
pg_catalogexpnumericnumericfunc
- -\pset tuples_only false -\pset expanded on -\d psql_serial_tab_id_seq - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sequence "public.psql_serial_tab_id_seq"
Record 1
Typeinteger
Start1
Minimum1
Maximum2147483647
Increment1
Cycles?no
Cache1
-

Owned by: public.psql_serial_tab.id
-

-\pset tuples_only true -\df exp - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
 
Schemapg_catalog
Nameexp
Result data typedouble precision
Argument data typesdouble precision
Typefunc
 
Schemapg_catalog
Nameexp
Result data typenumeric
Argument data typesnumeric
Typefunc
- -\pset tuples_only false -prepare q as - select 'some"text' as "a&title", E' \n' as "junk", - ' ' as "empty", n as int - from generate_series(1,2) as n; -\pset expanded off -\pset border 0 -execute q; - - - - - - - - - - - - - - - - - - - -
a&titlejunkemptyint
some"text  <foo>
-<bar>
  1
some"text  <foo>
-<bar>
  2
-

(2 rows)
-

-\pset border 1 -execute q; - - - - - - - - - - - - - - - - - - - -
a&titlejunkemptyint
some"text  <foo>
-<bar>
  1
some"text  <foo>
-<bar>
  2
-

(2 rows)
-

-\pset tableattr foobar -execute q; - - - - - - - - - - - - - - - - - - - -
a&titlejunkemptyint
some"text  <foo>
-<bar>
  1
some"text  <foo>
-<bar>
  2
-

(2 rows)
-

-\pset tableattr -\pset expanded on -\pset border 0 -execute q; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Record 1
a&titlesome"text
junk  <foo>
-<bar>
empty 
int1
Record 2
a&titlesome"text
junk  <foo>
-<bar>
empty 
int2
- -\pset border 1 -execute q; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Record 1
a&titlesome"text
junk  <foo>
-<bar>
empty 
int1
Record 2
a&titlesome"text
junk  <foo>
-<bar>
empty 
int2
- -\pset tableattr foobar -execute q; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Record 1
a&titlesome"text
junk  <foo>
-<bar>
empty 
int1
Record 2
a&titlesome"text
junk  <foo>
-<bar>
empty 
int2
- -\pset tableattr -deallocate q; --- test latex output format -\pset format latex -\pset border 1 -\pset expanded off -\d psql_serial_tab_id_seq -\begin{center} -Sequence "public.psql\_serial\_tab\_id\_seq" -\end{center} - -\begin{tabular}{l | r | r | r | r | l | r} -\textit{Type} & \textit{Start} & \textit{Minimum} & \textit{Maximum} & \textit{Increment} & \textit{Cycles?} & \textit{Cache} \\ -\hline -integer & 1 & 1 & 2147483647 & 1 & no & 1 \\ -\end{tabular} - -\noindent Owned by: public.psql\_serial\_tab.id \\ - -\pset tuples_only true -\df exp -\begin{tabular}{l | l | l | l | l} -pg\_catalog & exp & double precision & double precision & func \\ -pg\_catalog & exp & numeric & numeric & func \\ -\end{tabular} - -\noindent -\pset tuples_only false -\pset expanded on -\d psql_serial_tab_id_seq -\begin{center} -Sequence "public.psql\_serial\_tab\_id\_seq" -\end{center} - -\begin{tabular}{c|l} -\multicolumn{2}{c}{\textit{Record 1}} \\ -\hline -Type & integer \\ -Start & 1 \\ -Minimum & 1 \\ -Maximum & 2147483647 \\ -Increment & 1 \\ -Cycles? & no \\ -Cache & 1 \\ -\end{tabular} - -\noindent Owned by: public.psql\_serial\_tab.id \\ - -\pset tuples_only true -\df exp -\begin{tabular}{c|l} -\hline -Schema & pg\_catalog \\ -Name & exp \\ -Result data type & double precision \\ -Argument data types & double precision \\ -Type & func \\ -\hline -Schema & pg\_catalog \\ -Name & exp \\ -Result data type & numeric \\ -Argument data types & numeric \\ -Type & func \\ -\end{tabular} - -\noindent -\pset tuples_only false -prepare q as - select 'some\more_text' as "a$title", E' #%&^~|\n{bar}' as "junk", - ' ' as "empty", n as int - from generate_series(1,2) as n; -\pset expanded off -\pset border 0 -execute q; -\begin{tabular}{lllr} -\textit{a\$title} & \textit{junk} & \textit{empty} & \textit{int} \\ -\hline -some\textbackslash{}more\_text & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} & & 1 \\ -some\textbackslash{}more\_text & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} & & 2 \\ -\end{tabular} - -\noindent (2 rows) \\ - -\pset border 1 -execute q; -\begin{tabular}{l | l | l | r} -\textit{a\$title} & \textit{junk} & \textit{empty} & \textit{int} \\ -\hline -some\textbackslash{}more\_text & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} & & 1 \\ -some\textbackslash{}more\_text & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} & & 2 \\ -\end{tabular} - -\noindent (2 rows) \\ - -\pset border 2 -execute q; -\begin{tabular}{| l | l | l | r |} -\hline -\textit{a\$title} & \textit{junk} & \textit{empty} & \textit{int} \\ -\hline -some\textbackslash{}more\_text & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} & & 1 \\ -some\textbackslash{}more\_text & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} & & 2 \\ -\hline -\end{tabular} - -\noindent (2 rows) \\ - -\pset border 3 -execute q; -\begin{tabular}{| l | l | l | r |} -\hline -\textit{a\$title} & \textit{junk} & \textit{empty} & \textit{int} \\ -\hline -some\textbackslash{}more\_text & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} & & 1 \\ -\hline -some\textbackslash{}more\_text & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} & & 2 \\ -\hline -\end{tabular} - -\noindent (2 rows) \\ - -\pset expanded on -\pset border 0 -execute q; -\begin{tabular}{cl} -\multicolumn{2}{c}{\textit{Record 1}} \\ -a\$title & some\textbackslash{}more\_text \\ -junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ -empty & \\ -int & 1 \\ -\multicolumn{2}{c}{\textit{Record 2}} \\ -a\$title & some\textbackslash{}more\_text \\ -junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ -empty & \\ -int & 2 \\ -\end{tabular} - -\noindent -\pset border 1 -execute q; -\begin{tabular}{c|l} -\multicolumn{2}{c}{\textit{Record 1}} \\ -\hline -a\$title & some\textbackslash{}more\_text \\ -junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ -empty & \\ -int & 1 \\ -\multicolumn{2}{c}{\textit{Record 2}} \\ -\hline -a\$title & some\textbackslash{}more\_text \\ -junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ -empty & \\ -int & 2 \\ -\end{tabular} - -\noindent -\pset border 2 -execute q; -\begin{tabular}{|c|l|} -\hline -\multicolumn{2}{|c|}{\textit{Record 1}} \\ -\hline -a\$title & some\textbackslash{}more\_text \\ -junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ -empty & \\ -int & 1 \\ -\hline -\multicolumn{2}{|c|}{\textit{Record 2}} \\ -\hline -a\$title & some\textbackslash{}more\_text \\ -junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ -empty & \\ -int & 2 \\ -\hline -\end{tabular} - -\noindent -\pset border 3 -execute q; -\begin{tabular}{|c|l|} -\hline -\multicolumn{2}{|c|}{\textit{Record 1}} \\ -\hline -a\$title & some\textbackslash{}more\_text \\ -junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ -empty & \\ -int & 1 \\ -\hline -\multicolumn{2}{|c|}{\textit{Record 2}} \\ -\hline -a\$title & some\textbackslash{}more\_text \\ -junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ -empty & \\ -int & 2 \\ -\hline -\end{tabular} - -\noindent -deallocate q; --- test latex-longtable output format -\pset format latex-longtable -\pset border 1 -\pset expanded off -\d psql_serial_tab_id_seq -\begin{longtable}{l | r | r | r | r | l | r} -\small\textbf{\textit{Type}} & \small\textbf{\textit{Start}} & \small\textbf{\textit{Minimum}} & \small\textbf{\textit{Maximum}} & \small\textbf{\textit{Increment}} & \small\textbf{\textit{Cycles?}} & \small\textbf{\textit{Cache}} \\ -\midrule -\endfirsthead -\small\textbf{\textit{Type}} & \small\textbf{\textit{Start}} & \small\textbf{\textit{Minimum}} & \small\textbf{\textit{Maximum}} & \small\textbf{\textit{Increment}} & \small\textbf{\textit{Cycles?}} & \small\textbf{\textit{Cache}} \\ -\midrule -\endhead -\caption[Sequence "public.psql\_serial\_tab\_id\_seq" (Continued)]{Sequence "public.psql\_serial\_tab\_id\_seq"} -\endfoot -\caption[Sequence "public.psql\_serial\_tab\_id\_seq"]{Sequence "public.psql\_serial\_tab\_id\_seq"} -\endlastfoot -\raggedright{integer} -& -\raggedright{1} -& -\raggedright{1} -& -\raggedright{2147483647} -& -\raggedright{1} -& -\raggedright{no} -& -\raggedright{1} \tabularnewline -\end{longtable} -\pset tuples_only true -\df exp -\begin{longtable}{l | l | l | l | l} -\raggedright{pg\_catalog} -& -\raggedright{exp} -& -\raggedright{double precision} -& -\raggedright{double precision} -& -\raggedright{func} \tabularnewline -\raggedright{pg\_catalog} -& -\raggedright{exp} -& -\raggedright{numeric} -& -\raggedright{numeric} -& -\raggedright{func} \tabularnewline -\end{longtable} -\pset tuples_only false -\pset expanded on -\d psql_serial_tab_id_seq -\begin{center} -Sequence "public.psql\_serial\_tab\_id\_seq" -\end{center} - -\begin{tabular}{c|l} -\multicolumn{2}{c}{\textit{Record 1}} \\ -\hline -Type & integer \\ -Start & 1 \\ -Minimum & 1 \\ -Maximum & 2147483647 \\ -Increment & 1 \\ -Cycles? & no \\ -Cache & 1 \\ -\end{tabular} - -\noindent Owned by: public.psql\_serial\_tab.id \\ - -\pset tuples_only true -\df exp -\begin{tabular}{c|l} -\hline -Schema & pg\_catalog \\ -Name & exp \\ -Result data type & double precision \\ -Argument data types & double precision \\ -Type & func \\ -\hline -Schema & pg\_catalog \\ -Name & exp \\ -Result data type & numeric \\ -Argument data types & numeric \\ -Type & func \\ -\end{tabular} - -\noindent -\pset tuples_only false -prepare q as - select 'some\more_text' as "a$title", E' #%&^~|\n{bar}' as "junk", - ' ' as "empty", n as int - from generate_series(1,2) as n; -\pset expanded off -\pset border 0 -execute q; -\begin{longtable}{lllr} -\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ -\midrule -\endfirsthead -\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ -\midrule -\endhead -\raggedright{some\textbackslash{}more\_text} -& -\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} -& -\raggedright{ } -& -\raggedright{1} \tabularnewline -\raggedright{some\textbackslash{}more\_text} -& -\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} -& -\raggedright{ } -& -\raggedright{2} \tabularnewline -\end{longtable} -\pset border 1 -execute q; -\begin{longtable}{l | l | l | r} -\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ -\midrule -\endfirsthead -\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ -\midrule -\endhead -\raggedright{some\textbackslash{}more\_text} -& -\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} -& -\raggedright{ } -& -\raggedright{1} \tabularnewline -\raggedright{some\textbackslash{}more\_text} -& -\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} -& -\raggedright{ } -& -\raggedright{2} \tabularnewline -\end{longtable} -\pset border 2 -execute q; -\begin{longtable}{| l | l | l | r |} -\toprule -\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ -\midrule -\endfirsthead -\toprule -\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ -\midrule -\endhead -\bottomrule -\endfoot -\bottomrule -\endlastfoot -\raggedright{some\textbackslash{}more\_text} -& -\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} -& -\raggedright{ } -& -\raggedright{1} \tabularnewline -\raggedright{some\textbackslash{}more\_text} -& -\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} -& -\raggedright{ } -& -\raggedright{2} \tabularnewline -\end{longtable} -\pset border 3 -execute q; -\begin{longtable}{| l | l | l | r |} -\toprule -\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ -\midrule -\endfirsthead -\toprule -\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ -\endhead -\bottomrule -\endfoot -\bottomrule -\endlastfoot -\raggedright{some\textbackslash{}more\_text} -& -\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} -& -\raggedright{ } -& -\raggedright{1} \tabularnewline - \hline -\raggedright{some\textbackslash{}more\_text} -& -\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} -& -\raggedright{ } -& -\raggedright{2} \tabularnewline - \hline -\end{longtable} -\pset tableattr lr -execute q; -\begin{longtable}{| p{lr\textwidth} | p{lr\textwidth} | p{lr\textwidth} | r |} -\toprule -\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ -\midrule -\endfirsthead -\toprule -\small\textbf{\textit{a\$title}} & \small\textbf{\textit{junk}} & \small\textbf{\textit{empty}} & \small\textbf{\textit{int}} \\ -\endhead -\bottomrule -\endfoot -\bottomrule -\endlastfoot -\raggedright{some\textbackslash{}more\_text} -& -\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} -& -\raggedright{ } -& -\raggedright{1} \tabularnewline - \hline -\raggedright{some\textbackslash{}more\_text} -& -\raggedright{ \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\}} -& -\raggedright{ } -& -\raggedright{2} \tabularnewline - \hline -\end{longtable} -\pset tableattr -\pset expanded on -\pset border 0 -execute q; -\begin{tabular}{cl} -\multicolumn{2}{c}{\textit{Record 1}} \\ -a\$title & some\textbackslash{}more\_text \\ -junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ -empty & \\ -int & 1 \\ -\multicolumn{2}{c}{\textit{Record 2}} \\ -a\$title & some\textbackslash{}more\_text \\ -junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ -empty & \\ -int & 2 \\ -\end{tabular} - -\noindent -\pset border 1 -execute q; -\begin{tabular}{c|l} -\multicolumn{2}{c}{\textit{Record 1}} \\ -\hline -a\$title & some\textbackslash{}more\_text \\ -junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ -empty & \\ -int & 1 \\ -\multicolumn{2}{c}{\textit{Record 2}} \\ -\hline -a\$title & some\textbackslash{}more\_text \\ -junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ -empty & \\ -int & 2 \\ -\end{tabular} - -\noindent -\pset border 2 -execute q; -\begin{tabular}{|c|l|} -\hline -\multicolumn{2}{|c|}{\textit{Record 1}} \\ -\hline -a\$title & some\textbackslash{}more\_text \\ -junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ -empty & \\ -int & 1 \\ -\hline -\multicolumn{2}{|c|}{\textit{Record 2}} \\ -\hline -a\$title & some\textbackslash{}more\_text \\ -junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ -empty & \\ -int & 2 \\ -\hline -\end{tabular} - -\noindent -\pset border 3 -execute q; -\begin{tabular}{|c|l|} -\hline -\multicolumn{2}{|c|}{\textit{Record 1}} \\ -\hline -a\$title & some\textbackslash{}more\_text \\ -junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ -empty & \\ -int & 1 \\ -\hline -\multicolumn{2}{|c|}{\textit{Record 2}} \\ -\hline -a\$title & some\textbackslash{}more\_text \\ -junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ -empty & \\ -int & 2 \\ -\hline -\end{tabular} - -\noindent -\pset tableattr lr -execute q; -\begin{tabular}{|c|l|} -\hline -\multicolumn{2}{|c|}{\textit{Record 1}} \\ -\hline -a\$title & some\textbackslash{}more\_text \\ -junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ -empty & \\ -int & 1 \\ -\hline -\multicolumn{2}{|c|}{\textit{Record 2}} \\ -\hline -a\$title & some\textbackslash{}more\_text \\ -junk & \#\textless{}foo\textgreater{}\%\&\^{}\~{}\textbar{}\\\{bar\} \\ -empty & \\ -int & 2 \\ -\hline -\end{tabular} - -\noindent -\pset tableattr -deallocate q; --- test troff-ms output format -\pset format troff-ms -\pset border 1 -\pset expanded off -\d psql_serial_tab_id_seq -.LP -.DS C -Sequence "public.psql_serial_tab_id_seq" -.DE -.LP -.TS -center; -l | r | r | r | r | l | r. -\fIType\fP \fIStart\fP \fIMinimum\fP \fIMaximum\fP \fIIncrement\fP \fICycles?\fP \fICache\fP -_ -integer 1 1 2147483647 1 no 1 -.TE -.DS L -Owned by: public.psql_serial_tab.id -.DE -\pset tuples_only true -\df exp -.LP -.TS -center; -l | l | l | l | l. -pg_catalog exp double precision double precision func -pg_catalog exp numeric numeric func -.TE -.DS L -.DE -\pset tuples_only false -\pset expanded on -\d psql_serial_tab_id_seq -.LP -.DS C -Sequence "public.psql_serial_tab_id_seq" -.DE -.LP -.TS -center; -c s. -\fIRecord 1\fP -_ -.T& -c | l. -Type integer -Start 1 -Minimum 1 -Maximum 2147483647 -Increment 1 -Cycles? no -Cache 1 -.TE -.DS L -Owned by: public.psql_serial_tab.id -.DE -\pset tuples_only true -\df exp -.LP -.TS -center; -c l; -_ -Schema pg_catalog -Name exp -Result data type double precision -Argument data types double precision -Type func -_ -Schema pg_catalog -Name exp -Result data type numeric -Argument data types numeric -Type func -.TE -.DS L -.DE -\pset tuples_only false -prepare q as - select 'some\text' as "a\title", E' \n' as "junk", - ' ' as "empty", n as int - from generate_series(1,2) as n; -\pset expanded off -\pset border 0 -execute q; -.LP -.TS -center; -lllr. -\fIa\(rstitle\fP \fIjunk\fP \fIempty\fP \fIint\fP -_ -some\(rstext - 1 -some\(rstext - 2 -.TE -.DS L -(2 rows) -.DE -\pset border 1 -execute q; -.LP -.TS -center; -l | l | l | r. -\fIa\(rstitle\fP \fIjunk\fP \fIempty\fP \fIint\fP -_ -some\(rstext - 1 -some\(rstext - 2 -.TE -.DS L -(2 rows) -.DE -\pset border 2 -execute q; -.LP -.TS -center box; -l | l | l | r. -\fIa\(rstitle\fP \fIjunk\fP \fIempty\fP \fIint\fP -_ -some\(rstext - 1 -some\(rstext - 2 -.TE -.DS L -(2 rows) -.DE -\pset expanded on -\pset border 0 -execute q; -.LP -.TS -center; -c s. -\fIRecord 1\fP -.T& -c l. -a\(rstitle some\(rstext -junk - -empty -int 1 -.T& -c s. -\fIRecord 2\fP -.T& -c l. -a\(rstitle some\(rstext -junk - -empty -int 2 -.TE -.DS L -.DE -\pset border 1 -execute q; -.LP -.TS -center; -c s. -\fIRecord 1\fP -_ -.T& -c | l. -a\(rstitle some\(rstext -junk - -empty -int 1 -.T& -c s. -\fIRecord 2\fP -_ -.T& -c | l. -a\(rstitle some\(rstext -junk - -empty -int 2 -.TE -.DS L -.DE -\pset border 2 -execute q; -.LP -.TS -center box; -c s. -\fIRecord 1\fP -_ -.T& -c l. -a\(rstitle some\(rstext -junk - -empty -int 1 -_ -.T& -c s. -\fIRecord 2\fP -_ -.T& -c l. -a\(rstitle some\(rstext -junk - -empty -int 2 -.TE -.DS L -.DE -deallocate q; --- check ambiguous format requests -\pset format a -\pset: ambiguous abbreviation "a" matches both "aligned" and "asciidoc" -\pset format l --- clean up after output format tests -drop table psql_serial_tab; -\pset format aligned -\pset expanded off -\pset border 1 --- \echo and allied features -\echo this is a test -this is a test -\echo -n without newline -without newline\echo with -n newline -with -n newline -\echo '-n' with newline --n with newline -\set foo bar -\echo foo = :foo -foo = bar -\qecho this is a test -this is a test -\qecho foo = :foo -foo = bar -\warn this is a test -this is a test -\warn foo = :foo -foo = bar --- tests for \if ... \endif -\if true - select 'okay'; - ?column? ----------- - okay -(1 row) - - select 'still okay'; - ?column? ------------- - still okay -(1 row) - -\else - not okay; - still not okay -\endif --- at this point query buffer should still have last valid line -\g - ?column? ------------- - still okay -(1 row) - --- \if should work okay on part of a query -select - \if true - 42 - \else - (bogus - \endif - forty_two; - forty_two ------------ - 42 -(1 row) - -select \if false \\ (bogus \else \\ 42 \endif \\ forty_two; - forty_two ------------ - 42 -(1 row) - --- test a large nested if using a variety of true-equivalents -\if true - \if 1 - \if yes - \if on - \echo 'all true' -all true - \else - \echo 'should not print #1-1' - \endif - \else - \echo 'should not print #1-2' - \endif - \else - \echo 'should not print #1-3' - \endif -\else - \echo 'should not print #1-4' -\endif --- test a variety of false-equivalents in an if/elif/else structure -\if false - \echo 'should not print #2-1' -\elif 0 - \echo 'should not print #2-2' -\elif no - \echo 'should not print #2-3' -\elif off - \echo 'should not print #2-4' -\else - \echo 'all false' -all false -\endif --- test true-false elif after initial true branch -\if true - \echo 'should print #2-5' -should print #2-5 -\elif true - \echo 'should not print #2-6' -\elif false - \echo 'should not print #2-7' -\else - \echo 'should not print #2-8' -\endif --- test simple true-then-else -\if true - \echo 'first thing true' -first thing true -\else - \echo 'should not print #3-1' -\endif --- test simple false-true-else -\if false - \echo 'should not print #4-1' -\elif true - \echo 'second thing true' -second thing true -\else - \echo 'should not print #5-1' -\endif --- invalid boolean expressions are false -\if invalid boolean expression -unrecognized value "invalid boolean expression" for "\if expression": Boolean expected - \echo 'will not print #6-1' -\else - \echo 'will print anyway #6-2' -will print anyway #6-2 -\endif --- test un-matched endif -\endif -\endif: no matching \if --- test un-matched else -\else -\else: no matching \if --- test un-matched elif -\elif -\elif: no matching \if --- test double-else error -\if true -\else -\else -\else: cannot occur after \else -\endif --- test elif out-of-order -\if false -\else -\elif -\elif: cannot occur after \else -\endif --- test if-endif matching in a false branch -\if false - \if false - \echo 'should not print #7-1' - \else - \echo 'should not print #7-2' - \endif - \echo 'should not print #7-3' -\else - \echo 'should print #7-4' -should print #7-4 -\endif --- show that vars and backticks are not expanded when ignoring extra args -\set foo bar -\echo :foo :'foo' :"foo" -bar 'bar' "bar" -\pset fieldsep | `nosuchcommand` :foo :'foo' :"foo" -\pset: extra argument "nosuchcommand" ignored -\pset: extra argument ":foo" ignored -\pset: extra argument ":'foo'" ignored -\pset: extra argument ":"foo"" ignored --- show that vars and backticks are not expanded and commands are ignored --- when in a false if-branch -\set try_to_quit '\\q' -\if false - :try_to_quit - \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 - \conninfo - \copy arg1 arg2 arg3 arg4 arg5 arg6 - \copyright - SELECT 1 as one, 2, 3 \crosstabview - \dt arg1 - \e arg1 arg2 - \ef whole_line - \ev whole_line - \echo arg1 arg2 arg3 arg4 arg5 - \echo arg1 - \encoding arg1 - \errverbose - \f arg1 - \g arg1 - \gx arg1 - \gexec - SELECT 1 AS one \gset - \h - \? - \html - \i arg1 - \ir arg1 - \l arg1 - \lo arg1 arg2 -invalid command \lo - \lo_list - \o arg1 - \p - \password arg1 - \prompt arg1 arg2 - \pset arg1 arg2 - \q - \reset - \s arg1 - \set arg1 arg2 arg3 arg4 arg5 arg6 arg7 - \setenv arg1 arg2 - \sf whole_line - \sv whole_line - \t arg1 - \T arg1 - \timing arg1 - \unset arg1 - \w arg1 - \watch arg1 arg2 - \x arg1 - -- \else here is eaten as part of OT_FILEPIPE argument - \w |/no/such/file \else - -- \endif here is eaten as part of whole-line argument - \! whole_line \endif - \z -\else - \echo 'should print #8-1' -should print #8-1 -\endif --- :{?...} defined variable test -\set i 1 -\if :{?i} - \echo '#9-1 ok, variable i is defined' -#9-1 ok, variable i is defined -\else - \echo 'should not print #9-2' -\endif -\if :{?no_such_variable} - \echo 'should not print #10-1' -\else - \echo '#10-2 ok, variable no_such_variable is not defined' -#10-2 ok, variable no_such_variable is not defined -\endif -SELECT :{?i} AS i_is_defined; - i_is_defined --------------- - t -(1 row) - -SELECT NOT :{?no_such_var} AS no_such_var_is_not_defined; - no_such_var_is_not_defined ----------------------------- - t -(1 row) - --- SHOW_CONTEXT -\set SHOW_CONTEXT never -do $$ -begin - raise notice 'foo'; - raise exception 'bar'; -end $$; -NOTICE: foo -ERROR: bar -\set SHOW_CONTEXT errors -do $$ -begin - raise notice 'foo'; - raise exception 'bar'; -end $$; -NOTICE: foo -ERROR: bar -CONTEXT: PL/pgSQL function inline_code_block line 4 at RAISE -\set SHOW_CONTEXT always -do $$ -begin - raise notice 'foo'; - raise exception 'bar'; -end $$; -NOTICE: foo -CONTEXT: PL/pgSQL function inline_code_block line 3 at RAISE -ERROR: bar -CONTEXT: PL/pgSQL function inline_code_block line 4 at RAISE --- test printing and clearing the query buffer -SELECT 1; - ?column? ----------- - 1 -(1 row) - -\p -SELECT 1; -SELECT 2 \r -\p -SELECT 1; -SELECT 3 \p -SELECT 3 -UNION SELECT 4 \p -SELECT 3 -UNION SELECT 4 -UNION SELECT 5 -ORDER BY 1; - ?column? ----------- - 3 - 4 - 5 -(3 rows) - -\r -\p -SELECT 3 -UNION SELECT 4 -UNION SELECT 5 -ORDER BY 1; --- tests for special result variables --- working query, 2 rows selected -SELECT 1 AS stuff UNION SELECT 2; - stuff -------- - 1 - 2 -(2 rows) - -\echo 'error:' :ERROR -error: false -\echo 'error code:' :SQLSTATE -error code: 00000 -\echo 'number of rows:' :ROW_COUNT -number of rows: 2 --- syntax error -SELECT 1 UNION; -ERROR: syntax error at or near ";" -LINE 1: SELECT 1 UNION; - ^ -\echo 'error:' :ERROR -error: true -\echo 'error code:' :SQLSTATE -error code: 42601 -\echo 'number of rows:' :ROW_COUNT -number of rows: 0 -\echo 'last error message:' :LAST_ERROR_MESSAGE -last error message: syntax error at or near ";" -\echo 'last error code:' :LAST_ERROR_SQLSTATE -last error code: 42601 --- empty query -; -\echo 'error:' :ERROR -error: false -\echo 'error code:' :SQLSTATE -error code: 00000 -\echo 'number of rows:' :ROW_COUNT -number of rows: 0 --- must have kept previous values -\echo 'last error message:' :LAST_ERROR_MESSAGE -last error message: syntax error at or near ";" -\echo 'last error code:' :LAST_ERROR_SQLSTATE -last error code: 42601 --- other query error -DROP TABLE this_table_does_not_exist; -ERROR: table "this_table_does_not_exist" does not exist -\echo 'error:' :ERROR -error: true -\echo 'error code:' :SQLSTATE -error code: 42P01 -\echo 'number of rows:' :ROW_COUNT -number of rows: 0 -\echo 'last error message:' :LAST_ERROR_MESSAGE -last error message: table "this_table_does_not_exist" does not exist -\echo 'last error code:' :LAST_ERROR_SQLSTATE -last error code: 42P01 --- nondefault verbosity error settings (except verbose, which is too unstable) -\set VERBOSITY terse -SELECT 1 UNION; -ERROR: syntax error at or near ";" at character 15 -\echo 'error:' :ERROR -error: true -\echo 'error code:' :SQLSTATE -error code: 42601 -\echo 'last error message:' :LAST_ERROR_MESSAGE -last error message: syntax error at or near ";" -\set VERBOSITY sqlstate -SELECT 1/0; -ERROR: 22012 -\echo 'error:' :ERROR -error: true -\echo 'error code:' :SQLSTATE -error code: 22012 -\echo 'last error message:' :LAST_ERROR_MESSAGE -last error message: division by zero -\set VERBOSITY default --- working \gdesc -SELECT 3 AS three, 4 AS four \gdesc - Column | Type ---------+--------- - three | integer - four | integer -(2 rows) - -\echo 'error:' :ERROR -error: false -\echo 'error code:' :SQLSTATE -error code: 00000 -\echo 'number of rows:' :ROW_COUNT -number of rows: 2 --- \gdesc with an error -SELECT 4 AS \gdesc -ERROR: syntax error at end of input -LINE 1: SELECT 4 AS - ^ -\echo 'error:' :ERROR -error: true -\echo 'error code:' :SQLSTATE -error code: 42601 -\echo 'number of rows:' :ROW_COUNT -number of rows: 0 -\echo 'last error message:' :LAST_ERROR_MESSAGE -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 query with chunked results -\set FETCH_COUNT 10 -select unique2 from tenk1 order by unique2 limit 19; - unique2 ---------- - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 10 - 11 - 12 - 13 - 14 - 15 - 16 - 17 - 18 -(19 rows) - -\echo 'error:' :ERROR -error: false -\echo 'error code:' :SQLSTATE -error code: 00000 -\echo 'number of rows:' :ROW_COUNT -number of rows: 19 --- 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? ----------- - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 -ERROR: division by zero -\echo 'error:' :ERROR -error: true -\echo 'error code:' :SQLSTATE -error code: 22012 -\echo 'number of rows:' :ROW_COUNT -number of rows: 0 -\echo 'last error message:' :LAST_ERROR_MESSAGE -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; -alter schema testpart owner to regress_partitioning_role; -set role to regress_partitioning_role; --- run test inside own schema and hide other partitions -set search_path to testpart; -create table testtable_apple(logdate date); -create table testtable_orange(logdate date); -create index testtable_apple_index on testtable_apple(logdate); -create index testtable_orange_index on testtable_orange(logdate); -create table testpart_apple(logdate date) partition by range(logdate); -create table testpart_orange(logdate date) partition by range(logdate); -create index testpart_apple_index on testpart_apple(logdate); -create index testpart_orange_index on testpart_orange(logdate); --- only partition related object should be displayed -\dP test*apple* - List of partitioned relations - Schema | Name | Owner | Type | Parent name | Table -----------+----------------------+---------------------------+-------------------+-------------+---------------- - testpart | testpart_apple | regress_partitioning_role | partitioned table | | - testpart | testpart_apple_index | regress_partitioning_role | partitioned index | | testpart_apple -(2 rows) - -\dPt test*apple* - List of partitioned tables - Schema | Name | Owner | Parent name -----------+----------------+---------------------------+------------- - testpart | testpart_apple | regress_partitioning_role | -(1 row) - -\dPi test*apple* - List of partitioned indexes - Schema | Name | Owner | Parent name | Table -----------+----------------------+---------------------------+-------------+---------------- - testpart | testpart_apple_index | regress_partitioning_role | | testpart_apple -(1 row) - -drop table testtable_apple; -drop table testtable_orange; -drop table testpart_apple; -drop table testpart_orange; -create table parent_tab (id int) partition by range (id); -create index parent_index on parent_tab (id); -create table child_0_10 partition of parent_tab - for values from (0) to (10); -create table child_10_20 partition of parent_tab - for values from (10) to (20); -create table child_20_30 partition of parent_tab - for values from (20) to (30); -insert into parent_tab values (generate_series(0,29)); -create table child_30_40 partition of parent_tab -for values from (30) to (40) - partition by range(id); -create table child_30_35 partition of child_30_40 - for values from (30) to (35); -create table child_35_40 partition of child_30_40 - for values from (35) to (40); -insert into parent_tab values (generate_series(30,39)); -\dPt - List of partitioned tables - Schema | Name | Owner -----------+------------+--------------------------- - testpart | parent_tab | regress_partitioning_role -(1 row) - -\dPi - List of partitioned indexes - Schema | Name | Owner | Table -----------+--------------+---------------------------+------------ - testpart | parent_index | regress_partitioning_role | parent_tab -(1 row) - -\dP testpart.* - List of partitioned relations - Schema | Name | Owner | Type | Parent name | Table -----------+--------------------+---------------------------+-------------------+--------------+------------- - testpart | parent_tab | regress_partitioning_role | partitioned table | | - testpart | child_30_40 | regress_partitioning_role | partitioned table | parent_tab | - testpart | parent_index | regress_partitioning_role | partitioned index | | parent_tab - testpart | child_30_40_id_idx | regress_partitioning_role | partitioned index | parent_index | child_30_40 -(4 rows) - -\dP - List of partitioned relations - Schema | Name | Owner | Type | Table -----------+--------------+---------------------------+-------------------+------------ - testpart | parent_tab | regress_partitioning_role | partitioned table | - testpart | parent_index | regress_partitioning_role | partitioned index | parent_tab -(2 rows) - -\dPtn - List of partitioned tables - Schema | Name | Owner | Parent name -----------+-------------+---------------------------+------------- - testpart | parent_tab | regress_partitioning_role | - testpart | child_30_40 | regress_partitioning_role | parent_tab -(2 rows) - -\dPin - List of partitioned indexes - Schema | Name | Owner | Parent name | Table -----------+--------------------+---------------------------+--------------+------------- - testpart | parent_index | regress_partitioning_role | | parent_tab - testpart | child_30_40_id_idx | regress_partitioning_role | parent_index | child_30_40 -(2 rows) - -\dPn - List of partitioned relations - Schema | Name | Owner | Type | Parent name | Table -----------+--------------------+---------------------------+-------------------+--------------+------------- - testpart | parent_tab | regress_partitioning_role | partitioned table | | - testpart | child_30_40 | regress_partitioning_role | partitioned table | parent_tab | - testpart | parent_index | regress_partitioning_role | partitioned index | | parent_tab - testpart | child_30_40_id_idx | regress_partitioning_role | partitioned index | parent_index | child_30_40 -(4 rows) - -\dPn testpart.* - List of partitioned relations - Schema | Name | Owner | Type | Parent name | Table -----------+--------------------+---------------------------+-------------------+--------------+------------- - testpart | parent_tab | regress_partitioning_role | partitioned table | | - testpart | child_30_40 | regress_partitioning_role | partitioned table | parent_tab | - testpart | parent_index | regress_partitioning_role | partitioned index | | parent_tab - testpart | child_30_40_id_idx | regress_partitioning_role | partitioned index | parent_index | child_30_40 -(4 rows) - -drop table parent_tab cascade; -drop schema testpart; -set search_path to default; -set role to default; -drop role regress_partitioning_role; --- \d on toast table (use pg_statistic's toast table, which has a known name) -\d pg_toast.pg_toast_2619 -TOAST table "pg_toast.pg_toast_2619" - Column | Type -------------+--------- - chunk_id | oid - chunk_seq | integer - chunk_data | bytea -Owning table: "pg_catalog.pg_statistic" -Indexes: - "pg_toast_2619_index" PRIMARY KEY, btree (chunk_id, chunk_seq) - --- check printing info about access methods -\dA -List of access methods - Name | Type -----------+------- - brin | Index - btree | Index - gin | Index - gist | Index - hash | Index - heap | Table - heap2 | Table - spgist | Index - tde_heap | Table -(9 rows) - -\dA * -List of access methods - Name | Type -----------+------- - brin | Index - btree | Index - gin | Index - gist | Index - hash | Index - heap | Table - heap2 | Table - spgist | Index - tde_heap | Table -(9 rows) - -\dA h* -List of access methods - Name | Type --------+------- - hash | Index - heap | Table - heap2 | Table -(3 rows) - -\dA foo -List of access methods - Name | Type -------+------ -(0 rows) - -\dA foo bar -List of access methods - Name | Type -------+------ -(0 rows) - -\dA: extra argument "bar" ignored -\dA+ - List of access methods - Name | Type | Handler | Description -----------+-------+----------------------+---------------------------------------- - brin | Index | brinhandler | block range index (BRIN) access method - btree | Index | bthandler | b-tree index access method - gin | Index | ginhandler | GIN index access method - gist | Index | gisthandler | GiST index access method - hash | Index | hashhandler | hash index access method - heap | Table | heap_tableam_handler | heap table access method - heap2 | Table | heap_tableam_handler | - spgist | Index | spghandler | SP-GiST index access method - tde_heap | Table | pg_tdeam_handler | tde_heap table access method -(9 rows) - -\dA+ * - List of access methods - Name | Type | Handler | Description -----------+-------+----------------------+---------------------------------------- - brin | Index | brinhandler | block range index (BRIN) access method - btree | Index | bthandler | b-tree index access method - gin | Index | ginhandler | GIN index access method - gist | Index | gisthandler | GiST index access method - hash | Index | hashhandler | hash index access method - heap | Table | heap_tableam_handler | heap table access method - heap2 | Table | heap_tableam_handler | - spgist | Index | spghandler | SP-GiST index access method - tde_heap | Table | pg_tdeam_handler | tde_heap table access method -(9 rows) - -\dA+ h* - List of access methods - Name | Type | Handler | Description --------+-------+----------------------+-------------------------- - hash | Index | hashhandler | hash index access method - heap | Table | heap_tableam_handler | heap table access method - heap2 | Table | heap_tableam_handler | -(3 rows) - -\dA+ foo - List of access methods - Name | Type | Handler | Description -------+------+---------+------------- -(0 rows) - -\dAc brin pg*.oid* - List of operator classes - AM | Input type | Storage type | Operator class | Default? -------+------------+--------------+----------------------+---------- - brin | oid | | oid_bloom_ops | no - brin | oid | | oid_minmax_multi_ops | no - brin | oid | | oid_minmax_ops | yes -(3 rows) - -\dAf spgist - List of operator families - AM | Operator family | Applicable types ---------+-----------------+------------------ - spgist | box_ops | box - spgist | kd_point_ops | point - spgist | network_ops | inet - spgist | poly_ops | polygon - spgist | quad_point_ops | point - spgist | range_ops | anyrange - spgist | text_ops | text -(7 rows) - -\dAf btree int4 - List of operator families - AM | Operator family | Applicable types --------+-----------------+--------------------------- - btree | integer_ops | smallint, integer, bigint -(1 row) - -\dAo+ btree float_ops - List of operators of operator families - AM | Operator family | Operator | Strategy | Purpose | Sort opfamily --------+-----------------+---------------------------------------+----------+---------+--------------- - btree | float_ops | <(double precision,double precision) | 1 | search | - btree | float_ops | <=(double precision,double precision) | 2 | search | - btree | float_ops | =(double precision,double precision) | 3 | search | - btree | float_ops | >=(double precision,double precision) | 4 | search | - btree | float_ops | >(double precision,double precision) | 5 | search | - btree | float_ops | <(real,real) | 1 | search | - btree | float_ops | <=(real,real) | 2 | search | - btree | float_ops | =(real,real) | 3 | search | - btree | float_ops | >=(real,real) | 4 | search | - btree | float_ops | >(real,real) | 5 | search | - btree | float_ops | <(double precision,real) | 1 | search | - btree | float_ops | <=(double precision,real) | 2 | search | - btree | float_ops | =(double precision,real) | 3 | search | - btree | float_ops | >=(double precision,real) | 4 | search | - btree | float_ops | >(double precision,real) | 5 | search | - btree | float_ops | <(real,double precision) | 1 | search | - btree | float_ops | <=(real,double precision) | 2 | search | - btree | float_ops | =(real,double precision) | 3 | search | - btree | float_ops | >=(real,double precision) | 4 | search | - btree | float_ops | >(real,double precision) | 5 | search | -(20 rows) - -\dAo * pg_catalog.jsonb_path_ops - List of operators of operator families - AM | Operator family | Operator | Strategy | Purpose ------+-----------------+--------------------+----------+--------- - gin | jsonb_path_ops | @>(jsonb,jsonb) | 7 | search - gin | jsonb_path_ops | @?(jsonb,jsonpath) | 15 | search - gin | jsonb_path_ops | @@(jsonb,jsonpath) | 16 | search -(3 rows) - -\dAp+ btree float_ops - List of support functions of operator families - AM | Operator family | Registered left type | Registered right type | Number | Function --------+-----------------+----------------------+-----------------------+--------+------------------------------------------------------------------------------ - btree | float_ops | double precision | double precision | 1 | btfloat8cmp(double precision,double precision) - btree | float_ops | double precision | double precision | 2 | btfloat8sortsupport(internal) - btree | float_ops | double precision | double precision | 3 | in_range(double precision,double precision,double precision,boolean,boolean) - btree | float_ops | real | real | 1 | btfloat4cmp(real,real) - btree | float_ops | real | real | 2 | btfloat4sortsupport(internal) - btree | float_ops | double precision | real | 1 | btfloat84cmp(double precision,real) - btree | float_ops | real | double precision | 1 | btfloat48cmp(real,double precision) - btree | float_ops | real | double precision | 3 | in_range(real,real,double precision,boolean,boolean) -(8 rows) - -\dAp * pg_catalog.uuid_ops - List of support functions of operator families - AM | Operator family | Registered left type | Registered right type | Number | Function --------+-----------------+----------------------+-----------------------+--------+-------------------- - btree | uuid_ops | uuid | uuid | 1 | uuid_cmp - btree | uuid_ops | uuid | uuid | 2 | uuid_sortsupport - btree | uuid_ops | uuid | uuid | 4 | btequalimage - hash | uuid_ops | uuid | uuid | 1 | uuid_hash - hash | uuid_ops | uuid | uuid | 2 | uuid_hash_extended -(5 rows) - --- check \dconfig -set work_mem = 10240; -\dconfig work_mem -List of configuration parameters - Parameter | Value ------------+------- - work_mem | 10MB -(1 row) - -\dconfig+ work* - List of configuration parameters - Parameter | Value | Type | Context | Access privileges ------------+-------+---------+---------+------------------- - work_mem | 10MB | integer | user | -(1 row) - -reset work_mem; --- check \df, \do with argument specifications -\df *sqrt - List of functions - Schema | Name | Result data type | Argument data types | Type -------------+--------------+------------------+---------------------+------ - pg_catalog | dsqrt | double precision | double precision | func - pg_catalog | numeric_sqrt | numeric | numeric | func - pg_catalog | sqrt | double precision | double precision | func - pg_catalog | sqrt | numeric | numeric | func -(4 rows) - -\df *sqrt num* - List of functions - Schema | Name | Result data type | Argument data types | Type -------------+--------------+------------------+---------------------+------ - pg_catalog | numeric_sqrt | numeric | numeric | func - pg_catalog | sqrt | numeric | numeric | func -(2 rows) - -\df int*pl - List of functions - Schema | Name | Result data type | Argument data types | Type -------------+-------------+------------------+---------------------+------ - pg_catalog | int24pl | integer | smallint, integer | func - pg_catalog | int28pl | bigint | smallint, bigint | func - pg_catalog | int2pl | smallint | smallint, smallint | func - pg_catalog | int42pl | integer | integer, smallint | func - pg_catalog | int48pl | bigint | integer, bigint | func - pg_catalog | int4pl | integer | integer, integer | func - pg_catalog | int82pl | bigint | bigint, smallint | func - pg_catalog | int84pl | bigint | bigint, integer | func - pg_catalog | int8pl | bigint | bigint, bigint | func - pg_catalog | interval_pl | interval | interval, interval | func -(10 rows) - -\df int*pl int4 - List of functions - Schema | Name | Result data type | Argument data types | Type -------------+---------+------------------+---------------------+------ - pg_catalog | int42pl | integer | integer, smallint | func - pg_catalog | int48pl | bigint | integer, bigint | func - pg_catalog | int4pl | integer | integer, integer | func -(3 rows) - -\df int*pl * pg_catalog.int8 - List of functions - Schema | Name | Result data type | Argument data types | Type -------------+---------+------------------+---------------------+------ - pg_catalog | int28pl | bigint | smallint, bigint | func - pg_catalog | int48pl | bigint | integer, bigint | func - pg_catalog | int8pl | bigint | bigint, bigint | func -(3 rows) - -\df acl* aclitem[] - List of functions - Schema | Name | Result data type | Argument data types | Type -------------+-------------+------------------+----------------------------------------------------------------------------------------------------+------ - pg_catalog | aclcontains | boolean | aclitem[], aclitem | func - pg_catalog | aclexplode | SETOF record | acl aclitem[], OUT grantor oid, OUT grantee oid, OUT privilege_type text, OUT is_grantable boolean | func - pg_catalog | aclinsert | aclitem[] | aclitem[], aclitem | func - pg_catalog | aclremove | aclitem[] | aclitem[], aclitem | func -(4 rows) - -\df has_database_privilege oid text - List of functions - Schema | Name | Result data type | Argument data types | Type -------------+------------------------+------------------+---------------------+------ - pg_catalog | has_database_privilege | boolean | oid, text | func - pg_catalog | has_database_privilege | boolean | oid, text, text | func -(2 rows) - -\df has_database_privilege oid text - - List of functions - Schema | Name | Result data type | Argument data types | Type -------------+------------------------+------------------+---------------------+------ - pg_catalog | has_database_privilege | boolean | oid, text | func -(1 row) - -\dfa bit* small* - List of functions - Schema | Name | Result data type | Argument data types | Type -------------+---------+------------------+---------------------+------ - pg_catalog | bit_and | smallint | smallint | agg - pg_catalog | bit_or | smallint | smallint | agg - pg_catalog | bit_xor | smallint | smallint | agg -(3 rows) - -\df *._pg_expandarray - List of functions - Schema | Name | Result data type | Argument data types | Type ---------------------+-----------------+------------------+-------------------------------------------+------ - information_schema | _pg_expandarray | SETOF record | anyarray, OUT x anyelement, OUT n integer | func -(1 row) - -\do - pg_catalog.int4 - List of operators - Schema | Name | Left arg type | Right arg type | Result type | Description -------------+------+---------------+----------------+-------------+------------- - pg_catalog | - | | integer | integer | negate -(1 row) - -\do && anyarray * - List of operators - Schema | Name | Left arg type | Right arg type | Result type | Description -------------+------+---------------+----------------+-------------+------------- - pg_catalog | && | anyarray | anyarray | boolean | overlaps -(1 row) - --- check \df+ --- we have to use functions with a predictable owner name, so make a role -create role regress_psql_user superuser; -begin; -set session authorization regress_psql_user; -create function psql_df_internal (float8) - returns float8 - language internal immutable parallel safe strict - as 'dsin'; -create function psql_df_sql (x integer) - returns integer - security definer - begin atomic select x + 1; end; -create function psql_df_plpgsql () - returns void - language plpgsql - as $$ begin return; end; $$; -comment on function psql_df_plpgsql () is 'some comment'; -\df+ psql_df_* - List of functions - Schema | Name | Result data type | Argument data types | Type | Volatility | Parallel | Owner | Security | Access privileges | Language | Internal name | Description ---------+------------------+------------------+---------------------+------+------------+----------+-------------------+----------+-------------------+----------+---------------+-------------- - public | psql_df_internal | double precision | double precision | func | immutable | safe | regress_psql_user | invoker | | internal | dsin | - public | psql_df_plpgsql | void | | func | volatile | unsafe | regress_psql_user | invoker | | plpgsql | | some comment - public | psql_df_sql | integer | x integer | func | volatile | unsafe | regress_psql_user | definer | | sql | | -(3 rows) - -rollback; -drop role regress_psql_user; --- check \sf -\sf information_schema._pg_index_position -CREATE OR REPLACE FUNCTION information_schema._pg_index_position(oid, smallint) - RETURNS integer - LANGUAGE sql - 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 - 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); -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 - STABLE PARALLEL SAFE STRICT -BEGIN ATOMIC - SELECT ts_debug.alias, - ts_debug.description, - ts_debug.token, - ts_debug.dictionaries, - ts_debug.dictionary, - ts_debug.lexemes - FROM ts_debug(get_current_ts_config(), ts_debug.document) ts_debug(alias, description, token, dictionaries, dictionary, lexemes); -END -\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 - STABLE PARALLEL SAFE STRICT -1 BEGIN ATOMIC -2 SELECT ts_debug.alias, -3 ts_debug.description, -4 ts_debug.token, -5 ts_debug.dictionaries, -6 ts_debug.dictionary, -7 ts_debug.lexemes -8 FROM ts_debug(get_current_ts_config(), ts_debug.document) ts_debug(alias, description, token, dictionaries, dictionary, lexemes); -9 END --- AUTOCOMMIT -CREATE TABLE ac_test (a int); -\set AUTOCOMMIT off -INSERT INTO ac_test VALUES (1); -COMMIT; -SELECT * FROM ac_test; - a ---- - 1 -(1 row) - -COMMIT; -INSERT INTO ac_test VALUES (2); -ROLLBACK; -SELECT * FROM ac_test; - a ---- - 1 -(1 row) - -COMMIT; -BEGIN; -INSERT INTO ac_test VALUES (3); -COMMIT; -SELECT * FROM ac_test; - a ---- - 1 - 3 -(2 rows) - -COMMIT; -BEGIN; -INSERT INTO ac_test VALUES (4); -ROLLBACK; -SELECT * FROM ac_test; - a ---- - 1 - 3 -(2 rows) - -COMMIT; -\set AUTOCOMMIT on -DROP TABLE ac_test; -SELECT * FROM ac_test; -- should be gone now -ERROR: relation "ac_test" does not exist -LINE 1: SELECT * FROM ac_test; - ^ --- ON_ERROR_ROLLBACK -\set ON_ERROR_ROLLBACK on -CREATE TABLE oer_test (a int); -BEGIN; -INSERT INTO oer_test VALUES (1); -INSERT INTO oer_test VALUES ('foo'); -ERROR: invalid input syntax for type integer: "foo" -LINE 1: INSERT INTO oer_test VALUES ('foo'); - ^ -INSERT INTO oer_test VALUES (3); -COMMIT; -SELECT * FROM oer_test; - a ---- - 1 - 3 -(2 rows) - -BEGIN; -INSERT INTO oer_test VALUES (4); -ROLLBACK; -SELECT * FROM oer_test; - a ---- - 1 - 3 -(2 rows) - -BEGIN; -INSERT INTO oer_test VALUES (5); -COMMIT AND CHAIN; -INSERT INTO oer_test VALUES (6); -COMMIT; -SELECT * FROM oer_test; - a ---- - 1 - 3 - 5 - 6 -(4 rows) - -DROP TABLE oer_test; -\set ON_ERROR_ROLLBACK off --- ECHO errors -\set ECHO errors -ERROR: relation "notexists" does not exist -LINE 1: SELECT * FROM notexists; - ^ -STATEMENT: SELECT * FROM notexists; --- --- combined queries --- -CREATE FUNCTION warn(msg TEXT) RETURNS BOOLEAN LANGUAGE plpgsql -AS $$ - BEGIN RAISE NOTICE 'warn %', msg ; RETURN TRUE ; END -$$; --- show both -SELECT 1 AS one \; SELECT warn('1.5') \; SELECT 2 AS two ; -NOTICE: warn 1.5 -CONTEXT: PL/pgSQL function warn(text) line 2 at RAISE - one ------ - 1 -(1 row) - - warn ------- - t -(1 row) - - two ------ - 2 -(1 row) - --- \gset applies to last query only -SELECT 3 AS three \; SELECT warn('3.5') \; SELECT 4 AS four \gset -NOTICE: warn 3.5 -CONTEXT: PL/pgSQL function warn(text) line 2 at RAISE - three -------- - 3 -(1 row) - - warn ------- - t -(1 row) - -\echo :three :four -:three 4 --- syntax error stops all processing -SELECT 5 \; SELECT 6 + \; SELECT warn('6.5') \; SELECT 7 ; -ERROR: syntax error at or near ";" -LINE 1: SELECT 5 ; SELECT 6 + ; SELECT warn('6.5') ; SELECT 7 ; - ^ --- with aborted transaction, stop on first error -BEGIN \; SELECT 8 AS eight \; SELECT 9/0 AS nine \; ROLLBACK \; SELECT 10 AS ten ; - eight -------- - 8 -(1 row) - -ERROR: division by zero --- close previously aborted transaction -ROLLBACK; --- miscellaneous SQL commands --- (non SELECT output is sent to stderr, thus is not shown in expected results) -SELECT 'ok' AS "begin" \; -CREATE TABLE psql_comics(s TEXT) \; -INSERT INTO psql_comics VALUES ('Calvin'), ('hobbes') \; -COPY psql_comics FROM STDIN \; -UPDATE psql_comics SET s = 'Hobbes' WHERE s = 'hobbes' \; -DELETE FROM psql_comics WHERE s = 'Moe' \; -COPY psql_comics TO STDOUT \; -TRUNCATE psql_comics \; -DROP TABLE psql_comics \; -SELECT 'ok' AS "done" ; - begin -------- - ok -(1 row) - -Calvin -Susie -Hobbes - done ------- - ok -(1 row) - -\set SHOW_ALL_RESULTS off -SELECT 1 AS one \; SELECT warn('1.5') \; SELECT 2 AS two ; -NOTICE: warn 1.5 -CONTEXT: PL/pgSQL function warn(text) line 2 at RAISE - two ------ - 2 -(1 row) - -\set SHOW_ALL_RESULTS on -DROP FUNCTION warn(TEXT); --- --- \g with file --- -\getenv abs_builddir PG_ABS_BUILDDIR -\set g_out_file :abs_builddir '/results/psql-output1' -CREATE TEMPORARY TABLE reload_output( - lineno int NOT NULL GENERATED ALWAYS AS IDENTITY, - line text -); -SELECT 1 AS a \g :g_out_file -COPY reload_output(line) FROM :'g_out_file'; -SELECT 2 AS b\; SELECT 3 AS c\; SELECT 4 AS d \g :g_out_file -COPY reload_output(line) FROM :'g_out_file'; -COPY (SELECT 'foo') TO STDOUT \; COPY (SELECT 'bar') TO STDOUT \g :g_out_file -COPY reload_output(line) FROM :'g_out_file'; -SELECT line FROM reload_output ORDER BY lineno; - line ---------- - a - --- - 1 - (1 row) - - b - --- - 2 - (1 row) - - c - --- - 3 - (1 row) - - d - --- - 4 - (1 row) - - foo - bar -(22 rows) - -TRUNCATE TABLE reload_output; --- --- \o with file --- -\set o_out_file :abs_builddir '/results/psql-output2' -\o :o_out_file -SELECT max(unique1) FROM onek; -SELECT 1 AS a\; SELECT 2 AS b\; SELECT 3 AS c; --- COPY TO file --- The data goes to :g_out_file and the status to :o_out_file -\set QUIET false -COPY (SELECT unique1 FROM onek ORDER BY unique1 LIMIT 10) TO :'g_out_file'; --- DML command status -UPDATE onek SET unique1 = unique1 WHERE false; -\set QUIET true -\o --- Check the contents of the files generated. -COPY reload_output(line) FROM :'g_out_file'; -SELECT line FROM reload_output ORDER BY lineno; - line ------- - 0 - 1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 -(10 rows) - -TRUNCATE TABLE reload_output; -COPY reload_output(line) FROM :'o_out_file'; -SELECT line FROM reload_output ORDER BY lineno; - line ----------- - max - ----- - 999 - (1 row) - - a - --- - 1 - (1 row) - - b - --- - 2 - (1 row) - - c - --- - 3 - (1 row) - - COPY 10 - UPDATE 0 -(22 rows) - -TRUNCATE TABLE reload_output; --- Multiple COPY TO STDOUT with output file -\o :o_out_file --- The data goes to :o_out_file with no status generated. -COPY (SELECT 'foo1') TO STDOUT \; COPY (SELECT 'bar1') TO STDOUT; --- Combination of \o and \g file with multiple COPY queries. -COPY (SELECT 'foo2') TO STDOUT \; COPY (SELECT 'bar2') TO STDOUT \g :g_out_file -\o --- Check the contents of the files generated. -COPY reload_output(line) FROM :'g_out_file'; -SELECT line FROM reload_output ORDER BY lineno; - line ------- - foo2 - bar2 -(2 rows) - -TRUNCATE TABLE reload_output; -COPY reload_output(line) FROM :'o_out_file'; -SELECT line FROM reload_output ORDER BY lineno; - line ------- - foo1 - bar1 -(2 rows) - -DROP TABLE reload_output; --- --- AUTOCOMMIT and combined queries --- -\set AUTOCOMMIT off -\echo '# AUTOCOMMIT:' :AUTOCOMMIT -# AUTOCOMMIT: off --- BEGIN is now implicit -CREATE TABLE foo(s TEXT) \; -ROLLBACK; -CREATE TABLE foo(s TEXT) \; -INSERT INTO foo(s) VALUES ('hello'), ('world') \; -COMMIT; -DROP TABLE foo \; -ROLLBACK; --- table foo is still there -SELECT * FROM foo ORDER BY 1 \; -DROP TABLE foo \; -COMMIT; - s -------- - hello - world -(2 rows) - -\set AUTOCOMMIT on -\echo '# AUTOCOMMIT:' :AUTOCOMMIT -# AUTOCOMMIT: on --- BEGIN now explicit for multi-statement transactions -BEGIN \; -CREATE TABLE foo(s TEXT) \; -INSERT INTO foo(s) VALUES ('hello'), ('world') \; -COMMIT; -BEGIN \; -DROP TABLE foo \; -ROLLBACK \; --- implicit transactions -SELECT * FROM foo ORDER BY 1 \; -DROP TABLE foo; - s -------- - hello - world -(2 rows) - --- --- test ON_ERROR_ROLLBACK and combined queries --- -CREATE FUNCTION psql_error(msg TEXT) RETURNS BOOLEAN AS $$ - BEGIN - RAISE EXCEPTION 'error %', msg; - END; -$$ LANGUAGE plpgsql; -\set ON_ERROR_ROLLBACK on -\echo '# ON_ERROR_ROLLBACK:' :ON_ERROR_ROLLBACK -# ON_ERROR_ROLLBACK: on -\echo '# AUTOCOMMIT:' :AUTOCOMMIT -# AUTOCOMMIT: on -BEGIN; -CREATE TABLE bla(s NO_SUCH_TYPE); -- fails -ERROR: type "no_such_type" does not exist -LINE 1: CREATE TABLE bla(s NO_SUCH_TYPE); - ^ -CREATE TABLE bla(s TEXT); -- succeeds -SELECT psql_error('oops!'); -- fails -ERROR: error oops! -CONTEXT: PL/pgSQL function psql_error(text) line 3 at RAISE -INSERT INTO bla VALUES ('Calvin'), ('Hobbes'); -COMMIT; -SELECT * FROM bla ORDER BY 1; - s --------- - Calvin - Hobbes -(2 rows) - -BEGIN; -INSERT INTO bla VALUES ('Susie'); -- succeeds --- now with combined queries -INSERT INTO bla VALUES ('Rosalyn') \; -- will rollback -SELECT 'before error' AS show \; -- will show nevertheless! - SELECT psql_error('boum!') \; -- failure - SELECT 'after error' AS noshow; -- hidden by preceding error - show --------------- - before error -(1 row) - -ERROR: error boum! -CONTEXT: PL/pgSQL function psql_error(text) line 3 at RAISE -INSERT INTO bla(s) VALUES ('Moe') \; -- will rollback - SELECT psql_error('bam!'); -ERROR: error bam! -CONTEXT: PL/pgSQL function psql_error(text) line 3 at RAISE -INSERT INTO bla VALUES ('Miss Wormwood'); -- succeeds -COMMIT; -SELECT * FROM bla ORDER BY 1; - s ---------------- - Calvin - Hobbes - Miss Wormwood - Susie -(4 rows) - --- some with autocommit off -\set AUTOCOMMIT off -\echo '# AUTOCOMMIT:' :AUTOCOMMIT -# AUTOCOMMIT: off --- implicit BEGIN -INSERT INTO bla VALUES ('Dad'); -- succeeds -SELECT psql_error('bad!'); -- implicit partial rollback -ERROR: error bad! -CONTEXT: PL/pgSQL function psql_error(text) line 3 at RAISE -INSERT INTO bla VALUES ('Mum') \; -- will rollback -SELECT COUNT(*) AS "#mum" -FROM bla WHERE s = 'Mum' \; -- but be counted here -SELECT psql_error('bad!'); -- implicit partial rollback - #mum ------- - 1 -(1 row) - -ERROR: error bad! -CONTEXT: PL/pgSQL function psql_error(text) line 3 at RAISE -COMMIT; -SELECT COUNT(*) AS "#mum" -FROM bla WHERE s = 'Mum' \; -- no mum here -SELECT * FROM bla ORDER BY 1; - #mum ------- - 0 -(1 row) - - s ---------------- - Calvin - Dad - Hobbes - Miss Wormwood - Susie -(5 rows) - -COMMIT; --- reset all -\set AUTOCOMMIT on -\set ON_ERROR_ROLLBACK off -\echo '# final ON_ERROR_ROLLBACK:' :ON_ERROR_ROLLBACK -# final ON_ERROR_ROLLBACK: off -DROP TABLE bla; -DROP FUNCTION psql_error; --- check describing invalid multipart names -\dA regression.heap -improper qualified name (too many dotted names): regression.heap -\dA nonesuch.heap -improper qualified name (too many dotted names): nonesuch.heap -\dt host.regression.pg_catalog.pg_class -improper qualified name (too many dotted names): host.regression.pg_catalog.pg_class -\dt |.pg_catalog.pg_class -cross-database references are not implemented: |.pg_catalog.pg_class -\dt nonesuch.pg_catalog.pg_class -cross-database references are not implemented: nonesuch.pg_catalog.pg_class -\da host.regression.pg_catalog.sum -improper qualified name (too many dotted names): host.regression.pg_catalog.sum -\da +.pg_catalog.sum -cross-database references are not implemented: +.pg_catalog.sum -\da nonesuch.pg_catalog.sum -cross-database references are not implemented: nonesuch.pg_catalog.sum -\dAc nonesuch.brin -improper qualified name (too many dotted names): nonesuch.brin -\dAc regression.brin -improper qualified name (too many dotted names): regression.brin -\dAf nonesuch.brin -improper qualified name (too many dotted names): nonesuch.brin -\dAf regression.brin -improper qualified name (too many dotted names): regression.brin -\dAo nonesuch.brin -improper qualified name (too many dotted names): nonesuch.brin -\dAo regression.brin -improper qualified name (too many dotted names): regression.brin -\dAp nonesuch.brin -improper qualified name (too many dotted names): nonesuch.brin -\dAp regression.brin -improper qualified name (too many dotted names): regression.brin -\db nonesuch.pg_default -improper qualified name (too many dotted names): nonesuch.pg_default -\db regression.pg_default -improper qualified name (too many dotted names): regression.pg_default -\dc host.regression.public.conversion -improper qualified name (too many dotted names): host.regression.public.conversion -\dc (.public.conversion -cross-database references are not implemented: (.public.conversion -\dc nonesuch.public.conversion -cross-database references are not implemented: nonesuch.public.conversion -\dC host.regression.pg_catalog.int8 -improper qualified name (too many dotted names): host.regression.pg_catalog.int8 -\dC ).pg_catalog.int8 -cross-database references are not implemented: ).pg_catalog.int8 -\dC nonesuch.pg_catalog.int8 -cross-database references are not implemented: nonesuch.pg_catalog.int8 -\dd host.regression.pg_catalog.pg_class -improper qualified name (too many dotted names): host.regression.pg_catalog.pg_class -\dd [.pg_catalog.pg_class -cross-database references are not implemented: [.pg_catalog.pg_class -\dd nonesuch.pg_catalog.pg_class -cross-database references are not implemented: nonesuch.pg_catalog.pg_class -\dD host.regression.public.gtestdomain1 -improper qualified name (too many dotted names): host.regression.public.gtestdomain1 -\dD ].public.gtestdomain1 -cross-database references are not implemented: ].public.gtestdomain1 -\dD nonesuch.public.gtestdomain1 -cross-database references are not implemented: nonesuch.public.gtestdomain1 -\ddp host.regression.pg_catalog.pg_class -improper qualified name (too many dotted names): host.regression.pg_catalog.pg_class -\ddp {.pg_catalog.pg_class -cross-database references are not implemented: {.pg_catalog.pg_class -\ddp nonesuch.pg_catalog.pg_class -cross-database references are not implemented: nonesuch.pg_catalog.pg_class -\dE host.regression.public.ft -improper qualified name (too many dotted names): host.regression.public.ft -\dE }.public.ft -cross-database references are not implemented: }.public.ft -\dE nonesuch.public.ft -cross-database references are not implemented: nonesuch.public.ft -\di host.regression.public.tenk1_hundred -improper qualified name (too many dotted names): host.regression.public.tenk1_hundred -\di ..public.tenk1_hundred -improper qualified name (too many dotted names): ..public.tenk1_hundred -\di nonesuch.public.tenk1_hundred -cross-database references are not implemented: nonesuch.public.tenk1_hundred -\dm host.regression.public.mvtest_bb -improper qualified name (too many dotted names): host.regression.public.mvtest_bb -\dm ^.public.mvtest_bb -cross-database references are not implemented: ^.public.mvtest_bb -\dm nonesuch.public.mvtest_bb -cross-database references are not implemented: nonesuch.public.mvtest_bb -\ds host.regression.public.check_seq -improper qualified name (too many dotted names): host.regression.public.check_seq -\ds regression|mydb.public.check_seq -cross-database references are not implemented: regression|mydb.public.check_seq -\ds nonesuch.public.check_seq -cross-database references are not implemented: nonesuch.public.check_seq -\dt host.regression.public.b_star -improper qualified name (too many dotted names): host.regression.public.b_star -\dt regres+ion.public.b_star -cross-database references are not implemented: regres+ion.public.b_star -\dt nonesuch.public.b_star -cross-database references are not implemented: nonesuch.public.b_star -\dv host.regression.public.shoe -improper qualified name (too many dotted names): host.regression.public.shoe -\dv regress(ion).public.shoe -cross-database references are not implemented: regress(ion).public.shoe -\dv nonesuch.public.shoe -cross-database references are not implemented: nonesuch.public.shoe -\des nonesuch.server -improper qualified name (too many dotted names): nonesuch.server -\des regression.server -improper qualified name (too many dotted names): regression.server -\des nonesuch.server -improper qualified name (too many dotted names): nonesuch.server -\des regression.server -improper qualified name (too many dotted names): regression.server -\des nonesuch.username -improper qualified name (too many dotted names): nonesuch.username -\des regression.username -improper qualified name (too many dotted names): regression.username -\dew nonesuch.fdw -improper qualified name (too many dotted names): nonesuch.fdw -\dew regression.fdw -improper qualified name (too many dotted names): regression.fdw -\df host.regression.public.namelen -improper qualified name (too many dotted names): host.regression.public.namelen -\df regres[qrstuv]ion.public.namelen -cross-database references are not implemented: regres[qrstuv]ion.public.namelen -\df nonesuch.public.namelen -cross-database references are not implemented: nonesuch.public.namelen -\dF host.regression.pg_catalog.arabic -improper qualified name (too many dotted names): host.regression.pg_catalog.arabic -\dF regres{1,2}ion.pg_catalog.arabic -cross-database references are not implemented: regres{1,2}ion.pg_catalog.arabic -\dF nonesuch.pg_catalog.arabic -cross-database references are not implemented: nonesuch.pg_catalog.arabic -\dFd host.regression.pg_catalog.arabic_stem -improper qualified name (too many dotted names): host.regression.pg_catalog.arabic_stem -\dFd regres?ion.pg_catalog.arabic_stem -cross-database references are not implemented: regres?ion.pg_catalog.arabic_stem -\dFd nonesuch.pg_catalog.arabic_stem -cross-database references are not implemented: nonesuch.pg_catalog.arabic_stem -\dFp host.regression.pg_catalog.default -improper qualified name (too many dotted names): host.regression.pg_catalog.default -\dFp ^regression.pg_catalog.default -cross-database references are not implemented: ^regression.pg_catalog.default -\dFp nonesuch.pg_catalog.default -cross-database references are not implemented: nonesuch.pg_catalog.default -\dFt host.regression.pg_catalog.ispell -improper qualified name (too many dotted names): host.regression.pg_catalog.ispell -\dFt regression$.pg_catalog.ispell -cross-database references are not implemented: regression$.pg_catalog.ispell -\dFt nonesuch.pg_catalog.ispell -cross-database references are not implemented: nonesuch.pg_catalog.ispell -\dg nonesuch.pg_database_owner -improper qualified name (too many dotted names): nonesuch.pg_database_owner -\dg regression.pg_database_owner -improper qualified name (too many dotted names): regression.pg_database_owner -\dL host.regression.plpgsql -improper qualified name (too many dotted names): host.regression.plpgsql -\dL *.plpgsql -cross-database references are not implemented: *.plpgsql -\dL nonesuch.plpgsql -cross-database references are not implemented: nonesuch.plpgsql -\dn host.regression.public -improper qualified name (too many dotted names): host.regression.public -\dn """".public -cross-database references are not implemented: """".public -\dn nonesuch.public -cross-database references are not implemented: nonesuch.public -\do host.regression.public.!=- -improper qualified name (too many dotted names): host.regression.public.!=- -\do "regression|mydb".public.!=- -cross-database references are not implemented: "regression|mydb".public.!=- -\do nonesuch.public.!=- -cross-database references are not implemented: nonesuch.public.!=- -\dO host.regression.pg_catalog.POSIX -improper qualified name (too many dotted names): host.regression.pg_catalog.POSIX -\dO .pg_catalog.POSIX -cross-database references are not implemented: .pg_catalog.POSIX -\dO nonesuch.pg_catalog.POSIX -cross-database references are not implemented: nonesuch.pg_catalog.POSIX -\dp host.regression.public.a_star -improper qualified name (too many dotted names): host.regression.public.a_star -\dp "regres+ion".public.a_star -cross-database references are not implemented: "regres+ion".public.a_star -\dp nonesuch.public.a_star -cross-database references are not implemented: nonesuch.public.a_star -\dP host.regression.public.mlparted -improper qualified name (too many dotted names): host.regression.public.mlparted -\dP "regres(sion)".public.mlparted -cross-database references are not implemented: "regres(sion)".public.mlparted -\dP nonesuch.public.mlparted -cross-database references are not implemented: nonesuch.public.mlparted -\drds nonesuch.lc_messages -improper qualified name (too many dotted names): nonesuch.lc_messages -\drds regression.lc_messages -improper qualified name (too many dotted names): regression.lc_messages -\dRp public.mypub -improper qualified name (too many dotted names): public.mypub -\dRp regression.mypub -improper qualified name (too many dotted names): regression.mypub -\dRs public.mysub -improper qualified name (too many dotted names): public.mysub -\dRs regression.mysub -improper qualified name (too many dotted names): regression.mysub -\dT host.regression.public.widget -improper qualified name (too many dotted names): host.regression.public.widget -\dT "regression{1,2}".public.widget -cross-database references are not implemented: "regression{1,2}".public.widget -\dT nonesuch.public.widget -cross-database references are not implemented: nonesuch.public.widget -\dx regression.plpgsql -improper qualified name (too many dotted names): regression.plpgsql -\dx nonesuch.plpgsql -improper qualified name (too many dotted names): nonesuch.plpgsql -\dX host.regression.public.func_deps_stat -improper qualified name (too many dotted names): host.regression.public.func_deps_stat -\dX "^regression$".public.func_deps_stat -cross-database references are not implemented: "^regression$".public.func_deps_stat -\dX nonesuch.public.func_deps_stat -cross-database references are not implemented: nonesuch.public.func_deps_stat -\dy regression.myevt -improper qualified name (too many dotted names): regression.myevt -\dy nonesuch.myevt -improper qualified name (too many dotted names): nonesuch.myevt --- check that dots within quoted name segments are not counted -\dA "no.such.access.method" -List of access methods - Name | Type -------+------ -(0 rows) - -\dt "no.such.table.relation" - List of relations - Schema | Name | Type | Owner ---------+------+------+------- -(0 rows) - -\da "no.such.aggregate.function" - List of aggregate functions - Schema | Name | Result data type | Argument data types | Description ---------+------+------------------+---------------------+------------- -(0 rows) - -\dAc "no.such.operator.class" - List of operator classes - AM | Input type | Storage type | Operator class | Default? -----+------------+--------------+----------------+---------- -(0 rows) - -\dAf "no.such.operator.family" - List of operator families - AM | Operator family | Applicable types -----+-----------------+------------------ -(0 rows) - -\dAo "no.such.operator.of.operator.family" - List of operators of operator families - AM | Operator family | Operator | Strategy | Purpose -----+-----------------+----------+----------+--------- -(0 rows) - -\dAp "no.such.operator.support.function.of.operator.family" - List of support functions of operator families - AM | Operator family | Registered left type | Registered right type | Number | Function -----+-----------------+----------------------+-----------------------+--------+---------- -(0 rows) - -\db "no.such.tablespace" - List of tablespaces - Name | Owner | Location -------+-------+---------- -(0 rows) - -\dc "no.such.conversion" - List of conversions - Schema | Name | Source | Destination | Default? ---------+------+--------+-------------+---------- -(0 rows) - -\dC "no.such.cast" - List of casts - Source type | Target type | Function | Implicit? --------------+-------------+----------+----------- -(0 rows) - -\dd "no.such.object.description" - Object descriptions - Schema | Name | Object | Description ---------+------+--------+------------- -(0 rows) - -\dD "no.such.domain" - List of domains - Schema | Name | Type | Collation | Nullable | Default | Check ---------+------+------+-----------+----------+---------+------- -(0 rows) - -\ddp "no.such.default.access.privilege" - Default access privileges - Owner | Schema | Type | Access privileges --------+--------+------+------------------- -(0 rows) - -\di "no.such.index.relation" - List of relations - Schema | Name | Type | Owner | Table ---------+------+------+-------+------- -(0 rows) - -\dm "no.such.materialized.view" - List of relations - Schema | Name | Type | Owner ---------+------+------+------- -(0 rows) - -\ds "no.such.relation" - List of relations - Schema | Name | Type | Owner ---------+------+------+------- -(0 rows) - -\dt "no.such.relation" - List of relations - Schema | Name | Type | Owner ---------+------+------+------- -(0 rows) - -\dv "no.such.relation" - List of relations - Schema | Name | Type | Owner ---------+------+------+------- -(0 rows) - -\des "no.such.foreign.server" - List of foreign servers - Name | Owner | Foreign-data wrapper -------+-------+---------------------- -(0 rows) - -\dew "no.such.foreign.data.wrapper" - List of foreign-data wrappers - Name | Owner | Handler | Validator -------+-------+---------+----------- -(0 rows) - -\df "no.such.function" - List of functions - Schema | Name | Result data type | Argument data types | Type ---------+------+------------------+---------------------+------ -(0 rows) - -\dF "no.such.text.search.configuration" -List of text search configurations - Schema | Name | Description ---------+------+------------- -(0 rows) - -\dFd "no.such.text.search.dictionary" -List of text search dictionaries - Schema | Name | Description ---------+------+------------- -(0 rows) - -\dFp "no.such.text.search.parser" - List of text search parsers - Schema | Name | Description ---------+------+------------- -(0 rows) - -\dFt "no.such.text.search.template" -List of text search templates - Schema | Name | Description ---------+------+------------- -(0 rows) - -\dg "no.such.role" - List of roles - Role name | Attributes ------------+------------ - -\dL "no.such.language" - List of languages - Name | Owner | Trusted | Description -------+-------+---------+------------- -(0 rows) - -\dn "no.such.schema" -List of schemas - Name | Owner -------+------- -(0 rows) - -\do "no.such.operator" - List of operators - Schema | Name | Left arg type | Right arg type | Result type | Description ---------+------+---------------+----------------+-------------+------------- -(0 rows) - -\dO "no.such.collation" - List of collations - Schema | Name | Provider | Collate | Ctype | Locale | ICU Rules | Deterministic? ---------+------+----------+---------+-------+--------+-----------+---------------- -(0 rows) - -\dp "no.such.access.privilege" - Access privileges - Schema | Name | Type | Access privileges | Column privileges | Policies ---------+------+------+-------------------+-------------------+---------- -(0 rows) - -\dP "no.such.partitioned.relation" - List of partitioned relations - Schema | Name | Owner | Type | Parent name | Table ---------+------+-------+------+-------------+------- -(0 rows) - -\drds "no.such.setting" - List of settings - Role | Database | Settings -------+----------+---------- -(0 rows) - -\dRp "no.such.publication" - List of publications - Name | Owner | All tables | Inserts | Updates | Deletes | Truncates | Via root -------+-------+------------+---------+---------+---------+-----------+---------- -(0 rows) - -\dRs "no.such.subscription" - List of subscriptions - Name | Owner | Enabled | Publication -------+-------+---------+------------- -(0 rows) - -\dT "no.such.data.type" - List of data types - Schema | Name | Description ---------+------+------------- -(0 rows) - -\dx "no.such.installed.extension" - List of installed extensions - Name | Version | Schema | Description -------+---------+--------+------------- -(0 rows) - -\dX "no.such.extended.statistics" - List of extended statistics - Schema | Name | Definition | Ndistinct | Dependencies | MCV ---------+------+------------+-----------+--------------+----- -(0 rows) - -\dy "no.such.event.trigger" - List of event triggers - Name | Event | Owner | Enabled | Function | Tags -------+-------+-------+---------+----------+------ -(0 rows) - --- again, but with dotted schema qualifications. -\dA "no.such.schema"."no.such.access.method" -improper qualified name (too many dotted names): "no.such.schema"."no.such.access.method" -\dt "no.such.schema"."no.such.table.relation" - List of relations - Schema | Name | Type | Owner ---------+------+------+------- -(0 rows) - -\da "no.such.schema"."no.such.aggregate.function" - List of aggregate functions - Schema | Name | Result data type | Argument data types | Description ---------+------+------------------+---------------------+------------- -(0 rows) - -\dAc "no.such.schema"."no.such.operator.class" -improper qualified name (too many dotted names): "no.such.schema"."no.such.operator.class" -\dAf "no.such.schema"."no.such.operator.family" -improper qualified name (too many dotted names): "no.such.schema"."no.such.operator.family" -\dAo "no.such.schema"."no.such.operator.of.operator.family" -improper qualified name (too many dotted names): "no.such.schema"."no.such.operator.of.operator.family" -\dAp "no.such.schema"."no.such.operator.support.function.of.operator.family" -improper qualified name (too many dotted names): "no.such.schema"."no.such.operator.support.function.of.operator.family" -\db "no.such.schema"."no.such.tablespace" -improper qualified name (too many dotted names): "no.such.schema"."no.such.tablespace" -\dc "no.such.schema"."no.such.conversion" - List of conversions - Schema | Name | Source | Destination | Default? ---------+------+--------+-------------+---------- -(0 rows) - -\dC "no.such.schema"."no.such.cast" - List of casts - Source type | Target type | Function | Implicit? --------------+-------------+----------+----------- -(0 rows) - -\dd "no.such.schema"."no.such.object.description" - Object descriptions - Schema | Name | Object | Description ---------+------+--------+------------- -(0 rows) - -\dD "no.such.schema"."no.such.domain" - List of domains - Schema | Name | Type | Collation | Nullable | Default | Check ---------+------+------+-----------+----------+---------+------- -(0 rows) - -\ddp "no.such.schema"."no.such.default.access.privilege" - Default access privileges - Owner | Schema | Type | Access privileges --------+--------+------+------------------- -(0 rows) - -\di "no.such.schema"."no.such.index.relation" - List of relations - Schema | Name | Type | Owner | Table ---------+------+------+-------+------- -(0 rows) - -\dm "no.such.schema"."no.such.materialized.view" - List of relations - Schema | Name | Type | Owner ---------+------+------+------- -(0 rows) - -\ds "no.such.schema"."no.such.relation" - List of relations - Schema | Name | Type | Owner ---------+------+------+------- -(0 rows) - -\dt "no.such.schema"."no.such.relation" - List of relations - Schema | Name | Type | Owner ---------+------+------+------- -(0 rows) - -\dv "no.such.schema"."no.such.relation" - List of relations - Schema | Name | Type | Owner ---------+------+------+------- -(0 rows) - -\des "no.such.schema"."no.such.foreign.server" -improper qualified name (too many dotted names): "no.such.schema"."no.such.foreign.server" -\dew "no.such.schema"."no.such.foreign.data.wrapper" -improper qualified name (too many dotted names): "no.such.schema"."no.such.foreign.data.wrapper" -\df "no.such.schema"."no.such.function" - List of functions - Schema | Name | Result data type | Argument data types | Type ---------+------+------------------+---------------------+------ -(0 rows) - -\dF "no.such.schema"."no.such.text.search.configuration" -List of text search configurations - Schema | Name | Description ---------+------+------------- -(0 rows) - -\dFd "no.such.schema"."no.such.text.search.dictionary" -List of text search dictionaries - Schema | Name | Description ---------+------+------------- -(0 rows) - -\dFp "no.such.schema"."no.such.text.search.parser" - List of text search parsers - Schema | Name | Description ---------+------+------------- -(0 rows) - -\dFt "no.such.schema"."no.such.text.search.template" -List of text search templates - Schema | Name | Description ---------+------+------------- -(0 rows) - -\dg "no.such.schema"."no.such.role" -improper qualified name (too many dotted names): "no.such.schema"."no.such.role" -\dL "no.such.schema"."no.such.language" -cross-database references are not implemented: "no.such.schema"."no.such.language" -\do "no.such.schema"."no.such.operator" - List of operators - Schema | Name | Left arg type | Right arg type | Result type | Description ---------+------+---------------+----------------+-------------+------------- -(0 rows) - -\dO "no.such.schema"."no.such.collation" - List of collations - Schema | Name | Provider | Collate | Ctype | Locale | ICU Rules | Deterministic? ---------+------+----------+---------+-------+--------+-----------+---------------- -(0 rows) - -\dp "no.such.schema"."no.such.access.privilege" - Access privileges - Schema | Name | Type | Access privileges | Column privileges | Policies ---------+------+------+-------------------+-------------------+---------- -(0 rows) - -\dP "no.such.schema"."no.such.partitioned.relation" - List of partitioned relations - Schema | Name | Owner | Type | Parent name | Table ---------+------+-------+------+-------------+------- -(0 rows) - -\drds "no.such.schema"."no.such.setting" -improper qualified name (too many dotted names): "no.such.schema"."no.such.setting" -\dRp "no.such.schema"."no.such.publication" -improper qualified name (too many dotted names): "no.such.schema"."no.such.publication" -\dRs "no.such.schema"."no.such.subscription" -improper qualified name (too many dotted names): "no.such.schema"."no.such.subscription" -\dT "no.such.schema"."no.such.data.type" - List of data types - Schema | Name | Description ---------+------+------------- -(0 rows) - -\dx "no.such.schema"."no.such.installed.extension" -improper qualified name (too many dotted names): "no.such.schema"."no.such.installed.extension" -\dX "no.such.schema"."no.such.extended.statistics" - List of extended statistics - Schema | Name | Definition | Ndistinct | Dependencies | MCV ---------+------+------------+-----------+--------------+----- -(0 rows) - -\dy "no.such.schema"."no.such.event.trigger" -improper qualified name (too many dotted names): "no.such.schema"."no.such.event.trigger" --- again, but with current database and dotted schema qualifications. -\dt regression."no.such.schema"."no.such.table.relation" - List of relations - Schema | Name | Type | Owner ---------+------+------+------- -(0 rows) - -\da regression."no.such.schema"."no.such.aggregate.function" - List of aggregate functions - Schema | Name | Result data type | Argument data types | Description ---------+------+------------------+---------------------+------------- -(0 rows) - -\dc regression."no.such.schema"."no.such.conversion" - List of conversions - Schema | Name | Source | Destination | Default? ---------+------+--------+-------------+---------- -(0 rows) - -\dC regression."no.such.schema"."no.such.cast" - List of casts - Source type | Target type | Function | Implicit? --------------+-------------+----------+----------- -(0 rows) - -\dd regression."no.such.schema"."no.such.object.description" - Object descriptions - Schema | Name | Object | Description ---------+------+--------+------------- -(0 rows) - -\dD regression."no.such.schema"."no.such.domain" - List of domains - Schema | Name | Type | Collation | Nullable | Default | Check ---------+------+------+-----------+----------+---------+------- -(0 rows) - -\di regression."no.such.schema"."no.such.index.relation" - List of relations - Schema | Name | Type | Owner | Table ---------+------+------+-------+------- -(0 rows) - -\dm regression."no.such.schema"."no.such.materialized.view" - List of relations - Schema | Name | Type | Owner ---------+------+------+------- -(0 rows) - -\ds regression."no.such.schema"."no.such.relation" - List of relations - Schema | Name | Type | Owner ---------+------+------+------- -(0 rows) - -\dt regression."no.such.schema"."no.such.relation" - List of relations - Schema | Name | Type | Owner ---------+------+------+------- -(0 rows) - -\dv regression."no.such.schema"."no.such.relation" - List of relations - Schema | Name | Type | Owner ---------+------+------+------- -(0 rows) - -\df regression."no.such.schema"."no.such.function" - List of functions - Schema | Name | Result data type | Argument data types | Type ---------+------+------------------+---------------------+------ -(0 rows) - -\dF regression."no.such.schema"."no.such.text.search.configuration" -List of text search configurations - Schema | Name | Description ---------+------+------------- -(0 rows) - -\dFd regression."no.such.schema"."no.such.text.search.dictionary" -List of text search dictionaries - Schema | Name | Description ---------+------+------------- -(0 rows) - -\dFp regression."no.such.schema"."no.such.text.search.parser" - List of text search parsers - Schema | Name | Description ---------+------+------------- -(0 rows) - -\dFt regression."no.such.schema"."no.such.text.search.template" -List of text search templates - Schema | Name | Description ---------+------+------------- -(0 rows) - -\do regression."no.such.schema"."no.such.operator" - List of operators - Schema | Name | Left arg type | Right arg type | Result type | Description ---------+------+---------------+----------------+-------------+------------- -(0 rows) - -\dO regression."no.such.schema"."no.such.collation" - List of collations - Schema | Name | Provider | Collate | Ctype | Locale | ICU Rules | Deterministic? ---------+------+----------+---------+-------+--------+-----------+---------------- -(0 rows) - -\dp regression."no.such.schema"."no.such.access.privilege" - Access privileges - Schema | Name | Type | Access privileges | Column privileges | Policies ---------+------+------+-------------------+-------------------+---------- -(0 rows) - -\dP regression."no.such.schema"."no.such.partitioned.relation" - List of partitioned relations - Schema | Name | Owner | Type | Parent name | Table ---------+------+-------+------+-------------+------- -(0 rows) - -\dT regression."no.such.schema"."no.such.data.type" - List of data types - Schema | Name | Description ---------+------+------------- -(0 rows) - -\dX regression."no.such.schema"."no.such.extended.statistics" - List of extended statistics - Schema | Name | Definition | Ndistinct | Dependencies | MCV ---------+------+------------+-----------+--------------+----- -(0 rows) - --- again, but with dotted database and dotted schema qualifications. -\dt "no.such.database"."no.such.schema"."no.such.table.relation" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.table.relation" -\da "no.such.database"."no.such.schema"."no.such.aggregate.function" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.aggregate.function" -\dc "no.such.database"."no.such.schema"."no.such.conversion" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.conversion" -\dC "no.such.database"."no.such.schema"."no.such.cast" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.cast" -\dd "no.such.database"."no.such.schema"."no.such.object.description" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.object.description" -\dD "no.such.database"."no.such.schema"."no.such.domain" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.domain" -\ddp "no.such.database"."no.such.schema"."no.such.default.access.privilege" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.default.access.privilege" -\di "no.such.database"."no.such.schema"."no.such.index.relation" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.index.relation" -\dm "no.such.database"."no.such.schema"."no.such.materialized.view" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.materialized.view" -\ds "no.such.database"."no.such.schema"."no.such.relation" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.relation" -\dt "no.such.database"."no.such.schema"."no.such.relation" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.relation" -\dv "no.such.database"."no.such.schema"."no.such.relation" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.relation" -\df "no.such.database"."no.such.schema"."no.such.function" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.function" -\dF "no.such.database"."no.such.schema"."no.such.text.search.configuration" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.text.search.configuration" -\dFd "no.such.database"."no.such.schema"."no.such.text.search.dictionary" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.text.search.dictionary" -\dFp "no.such.database"."no.such.schema"."no.such.text.search.parser" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.text.search.parser" -\dFt "no.such.database"."no.such.schema"."no.such.text.search.template" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.text.search.template" -\do "no.such.database"."no.such.schema"."no.such.operator" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.operator" -\dO "no.such.database"."no.such.schema"."no.such.collation" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.collation" -\dp "no.such.database"."no.such.schema"."no.such.access.privilege" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.access.privilege" -\dP "no.such.database"."no.such.schema"."no.such.partitioned.relation" -cross-database references are not implemented: "no.such.database"."no.such.schema"."no.such.partitioned.relation" -\dT "no.such.database"."no.such.schema"."no.such.data.type" -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 30b637113404f..3edf0bed510d7 100644 --- a/src/test/regress/expected/publication.out +++ b/src/test/regress/expected/publication.out @@ -1745,3 +1745,24 @@ DROP SCHEMA sch2 cascade; RESET SESSION AUTHORIZATION; DROP ROLE regress_publication_user, regress_publication_user2; DROP ROLE regress_publication_user_dummy; +-- stage objects for pg_dump tests +CREATE SCHEMA pubme CREATE TABLE t0 (c int, d int) CREATE TABLE t1 (c int); +CREATE SCHEMA pubme2 CREATE TABLE t0 (c int, d int); +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION dump_pub_qual_1ct FOR + TABLE ONLY pubme.t0 (c, d) WHERE (c > 0); +CREATE PUBLICATION dump_pub_qual_2ct FOR + TABLE ONLY pubme.t0 (c) WHERE (c > 0), + TABLE ONLY pubme.t1 (c); +CREATE PUBLICATION dump_pub_nsp_1ct FOR + TABLES IN SCHEMA pubme; +CREATE PUBLICATION dump_pub_nsp_2ct FOR + TABLES IN SCHEMA pubme, + TABLES IN SCHEMA pubme2; +CREATE PUBLICATION dump_pub_all FOR + TABLE ONLY pubme.t0, + TABLE ONLY pubme.t1 WHERE (c < 0), + TABLES IN SCHEMA pubme, + TABLES IN SCHEMA pubme2 + WITH (publish_via_partition_root = true); +RESET client_min_messages; 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 51bba175ec027..2e23dcee6dac2 100644 --- a/src/test/regress/expected/rowsecurity.out +++ b/src/test/regress/expected/rowsecurity.out @@ -4475,7 +4475,7 @@ RESET SESSION AUTHORIZATION; DROP VIEW rls_view; DROP TABLE rls_tbl; DROP TABLE ref_tbl; --- Leaky operator test +-- Leaky operator tests CREATE TABLE rls_tbl (a int); INSERT INTO rls_tbl SELECT x/10 FROM generate_series(1, 100) x; ANALYZE rls_tbl; @@ -4492,9 +4492,80 @@ SELECT * FROM rls_tbl WHERE a <<< 1000; --- (0 rows) +RESET SESSION AUTHORIZATION; +CREATE TABLE rls_child_tbl () INHERITS (rls_tbl); +INSERT INTO rls_child_tbl SELECT x/10 FROM generate_series(1, 100) x; +ANALYZE rls_child_tbl; +CREATE TABLE rls_ptbl (a int) PARTITION BY RANGE (a); +CREATE TABLE rls_part PARTITION OF rls_ptbl FOR VALUES FROM (-100) TO (100); +INSERT INTO rls_ptbl SELECT x/10 FROM generate_series(1, 100) x; +ANALYZE rls_ptbl, rls_part; +ALTER TABLE rls_ptbl ENABLE ROW LEVEL SECURITY; +ALTER TABLE rls_part ENABLE ROW LEVEL SECURITY; +GRANT SELECT ON rls_ptbl TO regress_rls_alice; +GRANT SELECT ON rls_part TO regress_rls_alice; +CREATE POLICY p1 ON rls_tbl USING (a < 0); +CREATE POLICY p2 ON rls_ptbl USING (a < 0); +CREATE POLICY p3 ON rls_part USING (a < 0); +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM rls_tbl WHERE a <<< 1000; + a +--- +(0 rows) + +SELECT * FROM rls_child_tbl WHERE a <<< 1000; +ERROR: permission denied for table rls_child_tbl +SELECT * FROM rls_ptbl WHERE a <<< 1000; + a +--- +(0 rows) + +SELECT * FROM rls_part WHERE a <<< 1000; + a +--- +(0 rows) + +SELECT * FROM (SELECT * FROM rls_tbl UNION ALL + SELECT * FROM rls_tbl) t WHERE a <<< 1000; + a +--- +(0 rows) + +SELECT * FROM (SELECT * FROM rls_child_tbl UNION ALL + SELECT * FROM rls_child_tbl) t WHERE a <<< 1000; +ERROR: permission denied for table rls_child_tbl +RESET SESSION AUTHORIZATION; +REVOKE SELECT ON rls_tbl FROM regress_rls_alice; +CREATE VIEW rls_tbl_view AS SELECT * FROM rls_tbl; +ALTER TABLE rls_child_tbl ENABLE ROW LEVEL SECURITY; +GRANT SELECT ON rls_child_tbl TO regress_rls_alice; +CREATE POLICY p4 ON rls_child_tbl USING (a < 0); +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM rls_tbl WHERE a <<< 1000; +ERROR: permission denied for table rls_tbl +SELECT * FROM rls_tbl_view WHERE a <<< 1000; +ERROR: permission denied for view rls_tbl_view +SELECT * FROM rls_child_tbl WHERE a <<< 1000; + a +--- +(0 rows) + +SELECT * FROM (SELECT * FROM rls_tbl UNION ALL + SELECT * FROM rls_tbl) t WHERE a <<< 1000; +ERROR: permission denied for table rls_tbl +SELECT * FROM (SELECT * FROM rls_child_tbl UNION ALL + SELECT * FROM rls_child_tbl) t WHERE a <<< 1000; + a +--- +(0 rows) + DROP OPERATOR <<< (int, int); DROP FUNCTION op_leak(int, int); RESET SESSION AUTHORIZATION; +DROP TABLE rls_part; +DROP TABLE rls_ptbl; +DROP TABLE rls_child_tbl; +DROP VIEW rls_tbl_view; DROP TABLE rls_tbl; -- Bug #16006: whole-row Vars in a policy don't play nice with sub-selects SET SESSION AUTHORIZATION regress_rls_alice; diff --git a/src/test/regress/expected/sqljson.out b/src/test/regress/expected/sqljson.out index e25a49928bcac..9e52914a18263 100644 --- a/src/test/regress/expected/sqljson.out +++ b/src/test/regress/expected/sqljson.out @@ -571,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 @@ -735,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 @@ -817,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}] diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out index 6e08898b18306..43b7873c62b18 100644 --- a/src/test/regress/expected/stats.out +++ b/src/test/regress/expected/stats.out @@ -1646,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 8c4da95508408..43539dfe27fae 100644 --- a/src/test/regress/expected/stats_ext.out +++ b/src/test/regress/expected/stats_ext.out @@ -3252,8 +3252,16 @@ CREATE FUNCTION op_leak(int, int) RETURNS bool LANGUAGE plpgsql; CREATE OPERATOR <<< (procedure = op_leak, leftarg = int, rightarg = int, restrict = scalarltsel); +CREATE FUNCTION op_leak(record, record) RETURNS bool + AS 'BEGIN RAISE NOTICE ''op_leak => %, %'', $1, $2; RETURN $1 < $2; END' + LANGUAGE plpgsql; +CREATE OPERATOR <<< (procedure = op_leak, leftarg = record, rightarg = record, + restrict = scalarltsel); SELECT * FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied ERROR: permission denied for table priv_test_tbl +SELECT * FROM tststats.priv_test_tbl t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Permission denied +ERROR: permission denied for table priv_test_tbl DELETE FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied ERROR: permission denied for table priv_test_tbl -- Grant access via a security barrier view, but hide all data @@ -3268,10 +3276,17 @@ SELECT * FROM tststats.priv_test_view WHERE a <<< 0 AND b <<< 0; -- Should not l ---+--- (0 rows) +SELECT * FROM tststats.priv_test_view t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Should not leak + a | b +---+--- +(0 rows) + DELETE FROM tststats.priv_test_view WHERE a <<< 0 AND b <<< 0; -- Should not leak -- Grant table access, but hide all data with RLS RESET SESSION AUTHORIZATION; ALTER TABLE tststats.priv_test_tbl ENABLE ROW LEVEL SECURITY; +CREATE POLICY priv_test_tbl_pol ON tststats.priv_test_tbl USING (2 * a < 0); GRANT SELECT, DELETE ON tststats.priv_test_tbl TO regress_stats_user1; -- Should now have direct table access, but see nothing and leak nothing SET SESSION AUTHORIZATION regress_stats_user1; @@ -3280,7 +3295,45 @@ SELECT * FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Should not le ---+--- (0 rows) +SELECT * FROM tststats.priv_test_tbl t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Should not leak + a | b +---+--- +(0 rows) + DELETE FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Should not leak +-- Create plain inheritance parent table with no access permissions +RESET SESSION AUTHORIZATION; +CREATE TABLE tststats.priv_test_parent_tbl (a int, b int); +ALTER TABLE tststats.priv_test_tbl INHERIT tststats.priv_test_parent_tbl; +-- Should not have access to parent, and should leak nothing +SET SESSION AUTHORIZATION regress_stats_user1; +SELECT * FROM tststats.priv_test_parent_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied +ERROR: permission denied for table priv_test_parent_tbl +SELECT * FROM tststats.priv_test_parent_tbl t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Permission denied +ERROR: permission denied for table priv_test_parent_tbl +DELETE FROM tststats.priv_test_parent_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied +ERROR: permission denied for table priv_test_parent_tbl +-- Grant table access to parent, but hide all data with RLS +RESET SESSION AUTHORIZATION; +ALTER TABLE tststats.priv_test_parent_tbl ENABLE ROW LEVEL SECURITY; +CREATE POLICY priv_test_parent_tbl_pol ON tststats.priv_test_parent_tbl USING (2 * a < 0); +GRANT SELECT, DELETE ON tststats.priv_test_parent_tbl TO regress_stats_user1; +-- Should now have direct table access to parent, but see nothing and leak nothing +SET SESSION AUTHORIZATION regress_stats_user1; +SELECT * FROM tststats.priv_test_parent_tbl WHERE a <<< 0 AND b <<< 0; -- Should not leak + a | b +---+--- +(0 rows) + +SELECT * FROM tststats.priv_test_parent_tbl t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Should not leak + a | b +---+--- +(0 rows) + +DELETE FROM tststats.priv_test_parent_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); @@ -3326,10 +3379,13 @@ SELECT statistics_name, most_common_vals FROM pg_stats_ext_exprs x -- Tidy up DROP OPERATOR <<< (int, int); DROP FUNCTION op_leak(int, int); +DROP OPERATOR <<< (record, record); +DROP FUNCTION op_leak(record, record); 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 +NOTICE: drop cascades to 3 other objects +DETAIL: drop cascades to table tststats.priv_test_parent_tbl +drop cascades to table tststats.priv_test_tbl drop cascades to view tststats.priv_test_view DROP USER regress_stats_user1; diff --git a/src/test/regress/expected/strings.out b/src/test/regress/expected/strings.out index 52b69a107fb7a..45f9a14a9571e 100644 --- a/src/test/regress/expected/strings.out +++ b/src/test/regress/expected/strings.out @@ -596,6 +596,73 @@ SELECT 'abcdefg' SIMILAR TO '_bcd%' ESCAPE NULL AS null; SELECT 'abcdefg' SIMILAR TO '_bcd#%' ESCAPE '##' AS error; ERROR: invalid escape string HINT: Escape string must be empty or one character. +-- Characters that should be left alone in character classes when a +-- SIMILAR TO regexp pattern is converted to POSIX style. +-- Underscore "_" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '_[_[:alpha:]_]_'; + QUERY PLAN +------------------------------------------------ + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:.[_[:alpha:]_].)$'::text) +(2 rows) + +-- Percentage "%" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '%[%[:alnum:]%]%'; + QUERY PLAN +-------------------------------------------------- + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:.*[%[:alnum:]%].*)$'::text) +(2 rows) + +-- Dot "." +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '.[.[:alnum:].].'; + QUERY PLAN +-------------------------------------------------- + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:\.[.[:alnum:].]\.)$'::text) +(2 rows) + +-- Dollar "$" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '$[$[:alnum:]$]$'; + QUERY PLAN +-------------------------------------------------- + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:\$[$[:alnum:]$]\$)$'::text) +(2 rows) + +-- Opening parenthesis "(" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '()[([:alnum:](]()'; + QUERY PLAN +------------------------------------------------------ + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:(?:)[([:alnum:](](?:))$'::text) +(2 rows) + +-- Caret "^" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '^[^[:alnum:]^[^^][[^^]][\^][[\^]]\^]^'; + QUERY PLAN +------------------------------------------------------------------------ + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:\^[^[:alnum:]^[^^][[^^]][\^][[\^]]\^]\^)$'::text) +(2 rows) + +-- Closing square bracket "]" at the beginning of character class +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '[]%][^]%][^%]%'; + QUERY PLAN +------------------------------------------------ + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:[]%][^]%][^%].*)$'::text) +(2 rows) + +-- Closing square bracket effective after two carets at the beginning +-- of character class. +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '[^^]^'; + QUERY PLAN +--------------------------------------- + Seq Scan on text_tbl + Filter: (f1 ~ '^(?:[^^]\^)$'::text) +(2 rows) + -- Test backslash escapes in regexp_replace's replacement string SELECT regexp_replace('1112223333', E'(\\d{3})(\\d{3})(\\d{4})', E'(\\1) \\2-\\3'); regexp_replace diff --git a/src/test/regress/expected/triggers.out b/src/test/regress/expected/triggers.out index ada0ae743a36a..a6786e204a3da 100644 --- a/src/test/regress/expected/triggers.out +++ b/src/test/regress/expected/triggers.out @@ -2796,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, @@ -2811,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 @@ -3012,6 +3016,10 @@ NOTICE: trigger = child3_delete_trig, old table = (42,CCC) -- copy into parent sees parent-format tuples copy parent (a, b) from stdin; NOTICE: trigger = parent_insert_trig, new table = (AAA,42), (BBB,42), (CCC,42) +-- check detach/reattach behavior; statement triggers with transition tables +-- should not prevent a table from becoming a partition again +alter table parent detach partition child1; +alter table parent attach partition child1 for values in ('AAA'); -- DML affecting parent sees tuples collected from children even if -- there is no transition table trigger on the children drop trigger child1_insert_trig on child1; @@ -3209,6 +3217,10 @@ NOTICE: trigger = parent_insert_trig, new table = (AAA,42), (BBB,42), (CCC,42) create index on parent(b); copy parent (a, b) from stdin; NOTICE: trigger = parent_insert_trig, new table = (DDD,42) +-- check disinherit/reinherit behavior; statement triggers with transition +-- tables should not prevent a table from becoming an inheritance child again +alter table child1 no inherit parent; +alter table child1 inherit parent; -- DML affecting parent sees tuples collected from children even if -- there is no transition table trigger on the children drop trigger child1_insert_trig on child1; diff --git a/src/test/regress/expected/vacuum.out b/src/test/regress/expected/vacuum.out index 2eba7128876f2..7518806e61f42 100644 --- a/src/test/regress/expected/vacuum.out +++ b/src/test/regress/expected/vacuum.out @@ -148,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; @@ -167,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); @@ -175,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/with.out b/src/test/regress/expected/with.out index 460d0ea2b1c47..0a8b48d5e93b0 100644 --- a/src/test/regress/expected/with.out +++ b/src/test/regress/expected/with.out @@ -2084,6 +2084,14 @@ WITH RECURSIVE x(n) AS ( 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 diff --git a/src/test/regress/expected/xml.out b/src/test/regress/expected/xml.out index bd548f2bc5ba0..21677b609a6ca 100644 --- a/src/test/regress/expected/xml.out +++ b/src/test/regress/expected/xml.out @@ -822,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; @@ -1369,6 +1373,10 @@ EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; -- errors SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); ERROR: XMLTABLE function has 1 columns available but 2 columns specified +SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp __pg__is_not_null 1) AS f (v1); +ERROR: option name "__pg__is_not_null" cannot be used in XMLTABLE +LINE 1: ...MLTABLE (ROW () PASSING null COLUMNS v1 timestamp __pg__is_n... + ^ -- XMLNAMESPACES tests SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), '/zz:rows/zz:row' diff --git a/src/test/regress/expected/xml_1.out b/src/test/regress/expected/xml_1.out index 5e48a67b8e2c7..852444cb0527b 100644 --- a/src/test/regress/expected/xml_1.out +++ b/src/test/regress/expected/xml_1.out @@ -583,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 '', 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,6 +1359,10 @@ EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; -- errors SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); ERROR: XMLTABLE function has 1 columns available but 2 columns specified +SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp __pg__is_not_null 1) AS f (v1); +ERROR: option name "__pg__is_not_null" cannot be used in XMLTABLE +LINE 1: ...MLTABLE (ROW () PASSING null COLUMNS v1 timestamp __pg__is_n... + ^ -- XMLNAMESPACES tests SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), '/zz:rows/zz:row' diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index f53a526f7cd94..36aeea6bd3d56 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -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 diff --git a/src/test/regress/pg_regress.c b/src/test/regress/pg_regress.c index 4cc0c35418fc7..62c5b84a7f31b 100644 --- a/src/test/regress/pg_regress.c +++ b/src/test/regress/pg_regress.c @@ -1997,8 +1997,8 @@ create_database(const char *dbname) sql_file = fopen(exec_sql, "r"); if (sql_file == NULL) { - bail("could not open \"%s\" to read extra setup file: %s", - exec_sql, strerror(errno)); + bail("could not open \"%s\" to read extra setup file: %m", + exec_sql); } while (fgets(line_buf, sizeof(line_buf), sql_file) != NULL) psql_command(dbname, "%s", line_buf); diff --git a/src/test/regress/sql/aggregates.sql b/src/test/regress/sql/aggregates.sql index 1a18ca3d8fe20..fe4d89aec6abe 100644 --- a/src/test/regress/sql/aggregates.sql +++ b/src/test/regress/sql/aggregates.sql @@ -595,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 -- @@ -805,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; diff --git a/src/test/regress/sql/alter_table.sql b/src/test/regress/sql/alter_table.sql index da1272447304f..16ed0782fa173 100644 --- a/src/test/regress/sql/alter_table.sql +++ b/src/test/regress/sql/alter_table.sql @@ -3027,6 +3027,23 @@ drop table attbl, atref; /* End test case for bug #17409 */ +/* Test case for bug #18970 */ + +create table attbl(a int); +create table atref(b attbl check ((b).a is not null)); +alter table attbl alter column a type numeric; -- someday this should work +alter table atref drop constraint atref_b_check; + +create statistics atref_stat on ((b).a is not null) from atref; +alter table attbl alter column a type numeric; -- someday this should work +drop statistics atref_stat; + +create index atref_idx on atref (((b).a)); +alter table attbl alter column a type numeric; -- someday this should work +drop table attbl, atref; + +/* End test case for bug #18970 */ + -- Test that ALTER TABLE rewrite preserves a clustered index -- for normal indexes and indexes on constraints. create table alttype_cluster (a int); diff --git a/src/test/regress/sql/arrays.sql b/src/test/regress/sql/arrays.sql index 47058dfde5092..305371debae3b 100644 --- a/src/test/regress/sql/arrays.sql +++ b/src/test/regress/sql/arrays.sql @@ -713,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/constraints.sql b/src/test/regress/sql/constraints.sql index e3e3bea70911b..c47db9469f5dc 100644 --- a/src/test/regress/sql/constraints.sql +++ b/src/test/regress/sql/constraints.sql @@ -632,3 +632,9 @@ DROP DOMAIN constraint_comments_dom; DROP ROLE regress_constraint_comments; DROP ROLE regress_constraint_comments_noaccess; + +-- Leave some constraints for the pg_upgrade test to pick up +CREATE DOMAIN constraint_comments_dom AS int; + +ALTER DOMAIN constraint_comments_dom ADD CONSTRAINT inv_ck CHECK (value > 0) NOT VALID; +COMMENT ON CONSTRAINT inv_ck ON DOMAIN constraint_comments_dom IS 'comment on invalid constraint'; diff --git a/src/test/regress/sql/conversion.sql b/src/test/regress/sql/conversion.sql index b567a1a57219b..a80d62367a20a 100644 --- a/src/test/regress/sql/conversion.sql +++ b/src/test/regress/sql/conversion.sql @@ -300,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/create_index.sql b/src/test/regress/sql/create_index.sql index e296891cab806..0c292cd660b06 100644 --- a/src/test/regress/sql/create_index.sql +++ b/src/test/regress/sql/create_index.sql @@ -629,7 +629,7 @@ DROP TABLE cwi_test; CREATE TABLE syscol_table (a INT); -- System columns cannot be indexed -CREATE INDEX ON syscolcol_table (ctid); +CREATE INDEX ON syscol_table (ctid); -- nor used in expressions CREATE INDEX ON syscol_table ((ctid >= '(1000,0)')); diff --git a/src/test/regress/sql/fast_default.sql b/src/test/regress/sql/fast_default.sql index dc9df78a35d5d..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 diff --git a/src/test/regress/sql/foreign_key.sql b/src/test/regress/sql/foreign_key.sql index 8c4e4c7c83358..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 @@ -1487,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 diff --git a/src/test/regress/sql/generated.sql b/src/test/regress/sql/generated.sql index cb55d77821f21..2816ac4a74ab4 100644 --- a/src/test/regress/sql/generated.sql +++ b/src/test/regress/sql/generated.sql @@ -387,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); @@ -545,6 +550,31 @@ ALTER TABLE ONLY gtest30 ALTER COLUMN b DROP EXPRESSION; -- error \d gtest30_1 ALTER TABLE gtest30_1 ALTER COLUMN b DROP EXPRESSION; -- error +-- composite type dependencies +CREATE TABLE gtest31_1 (a int, b text GENERATED ALWAYS AS ('hello') STORED, c text); +CREATE TABLE gtest31_2 (x int, y gtest31_1); +ALTER TABLE gtest31_1 ALTER COLUMN b TYPE varchar; -- fails + +-- bug #18970: these cases are unsupported, but make sure they fail cleanly +ALTER TABLE gtest31_2 ADD CONSTRAINT cc CHECK ((y).b IS NOT NULL); +ALTER TABLE gtest31_1 ALTER COLUMN b SET EXPRESSION AS ('hello1'); +ALTER TABLE gtest31_2 DROP CONSTRAINT cc; + +CREATE STATISTICS gtest31_2_stat ON ((y).b is not null) FROM gtest31_2; +ALTER TABLE gtest31_1 ALTER COLUMN b SET EXPRESSION AS ('hello2'); +DROP STATISTICS gtest31_2_stat; + +CREATE INDEX gtest31_2_y_idx ON gtest31_2(((y).b)); +ALTER TABLE gtest31_1 ALTER COLUMN b SET EXPRESSION AS ('hello3'); + +DROP TABLE gtest31_1, gtest31_2; + +-- Check it for a partitioned table, too +CREATE TABLE gtest31_1 (a int, b text GENERATED ALWAYS AS ('hello') STORED, c text) PARTITION BY LIST (a); +CREATE TABLE gtest31_2 (x int, y gtest31_1); +ALTER TABLE gtest31_1 ALTER COLUMN b TYPE varchar; -- fails +DROP TABLE gtest31_1, gtest31_2; + -- triggers CREATE TABLE gtest26 ( a int PRIMARY KEY, diff --git a/src/test/regress/sql/inherit.sql b/src/test/regress/sql/inherit.sql index 51251b0e5116e..572512cba011d 100644 --- a/src/test/regress/sql/inherit.sql +++ b/src/test/regress/sql/inherit.sql @@ -377,8 +377,9 @@ 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; +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 diff --git a/src/test/regress/sql/limit.sql b/src/test/regress/sql/limit.sql index 6f0cda9870155..603910fe6d11c 100644 --- a/src/test/regress/sql/limit.sql +++ b/src/test/regress/sql/limit.sql @@ -196,6 +196,9 @@ CREATE VIEW limit_thousand_v_3 AS SELECT thousand FROM onek WHERE thousand < 995 ORDER BY thousand FETCH FIRST (NULL+1) ROWS WITH TIES; \d+ limit_thousand_v_3 CREATE VIEW limit_thousand_v_4 AS SELECT thousand FROM onek WHERE thousand < 995 - ORDER BY thousand FETCH FIRST NULL ROWS ONLY; + ORDER BY thousand FETCH FIRST (5::bigint) ROWS WITH TIES; \d+ limit_thousand_v_4 +CREATE VIEW limit_thousand_v_5 AS SELECT thousand FROM onek WHERE thousand < 995 + ORDER BY thousand FETCH FIRST NULL ROWS ONLY; +\d+ limit_thousand_v_5 -- leave these views 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/merge.sql b/src/test/regress/sql/merge.sql index 5ddcca84f8292..d8ac0a4dd45fc 100644 --- a/src/test/regress/sql/merge.sql +++ b/src/test/regress/sql/merge.sql @@ -1269,6 +1269,19 @@ MERGE INTO pa_target 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 @@ -1707,6 +1720,55 @@ WHEN MATCHED THEN DELETE; SELECT * FROM new_measurement ORDER BY city_id, logdate; +-- MERGE into inheritance root table +DROP TRIGGER insert_measurement_trigger ON measurement; +ALTER TABLE measurement ADD CONSTRAINT mcheck CHECK (city_id = 0) NO INHERIT; + +EXPLAIN (COSTS OFF) +MERGE INTO measurement m + USING (VALUES (1, '01-17-2007'::date)) nm(city_id, logdate) ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id - 1, logdate, 25, 100); + +BEGIN; +MERGE INTO measurement m + USING (VALUES (1, '01-17-2007'::date)) nm(city_id, logdate) ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id - 1, logdate, 25, 100); +SELECT * FROM ONLY measurement ORDER BY city_id, logdate; +ROLLBACK; + +ALTER TABLE measurement ENABLE ROW LEVEL SECURITY; +ALTER TABLE measurement FORCE ROW LEVEL SECURITY; +CREATE POLICY measurement_p ON measurement USING (peaktemp IS NOT NULL); + +MERGE INTO measurement m + USING (VALUES (1, '01-17-2007'::date)) nm(city_id, logdate) ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id - 1, logdate, NULL, 100); -- should fail + +MERGE INTO measurement m + USING (VALUES (1, '01-17-2007'::date)) nm(city_id, logdate) ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id - 1, logdate, 25, 100); -- ok +SELECT * FROM ONLY measurement ORDER BY city_id, logdate; + +MERGE INTO measurement m + USING (VALUES (1, '01-18-2007'::date)) nm(city_id, logdate) ON + (m.city_id = nm.city_id and m.logdate=nm.logdate) +WHEN NOT MATCHED THEN INSERT + (city_id, logdate, peaktemp, unitsales) + VALUES (city_id - 1, logdate, 25, 200) +RETURNING merge_action(), m.*; + DROP TABLE measurement, new_measurement CASCADE; DROP FUNCTION measurement_insert_trigger(); diff --git a/src/test/regress/sql/partition_join.sql b/src/test/regress/sql/partition_join.sql index 128ce8376e609..afadefd50fd20 100644 --- a/src/test/regress/sql/partition_join.sql +++ b/src/test/regress/sql/partition_join.sql @@ -138,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 -- diff --git a/src/test/regress/sql/predicate.sql b/src/test/regress/sql/predicate.sql index 63f6a7786f369..9dcb81b1bc52f 100644 --- a/src/test/regress/sql/predicate.sql +++ b/src/test/regress/sql/predicate.sql @@ -64,22 +64,20 @@ SELECT * FROM pred_tab t WHERE t.b IS NULL OR t.c IS NULL; -- 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 TRUE - LEFT JOIN pred_tab t3 ON t2.a IS NOT NULL; + 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 - LEFT JOIN pred_tab t2 ON t1.a = 1 + 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 TRUE - LEFT JOIN pred_tab t3 ON t2.a IS NULL AND t2.b = 1; + 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 @@ -95,22 +93,20 @@ SELECT * FROM pred_tab t1 -- 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 TRUE - LEFT JOIN pred_tab t3 ON t2.a IS NOT NULL OR t2.b = 1; + 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 - LEFT JOIN pred_tab t2 ON t1.a = 1 + 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 TRUE - LEFT JOIN pred_tab t3 ON (t2.a IS NULL OR t2.c IS NULL) AND t2.b = 1; + 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 @@ -147,3 +143,43 @@ 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/privileges.sql b/src/test/regress/sql/privileges.sql index b7e1cb6cdde9f..e93b179b42957 100644 --- a/src/test/regress/sql/privileges.sql +++ b/src/test/regress/sql/privileges.sql @@ -325,8 +325,6 @@ CREATE VIEW atest12v AS SELECT * FROM atest12 WHERE b <<< 5; CREATE VIEW atest12sbv WITH (security_barrier=true) AS SELECT * FROM atest12 WHERE b <<< 5; -GRANT SELECT ON atest12v TO PUBLIC; -GRANT SELECT ON atest12sbv TO PUBLIC; -- This plan should use nestloop, knowing that few rows will be selected. EXPLAIN (COSTS OFF) SELECT * FROM atest12v x, atest12v y WHERE x.a = y.b; @@ -348,8 +346,16 @@ CREATE FUNCTION leak2(integer,integer) RETURNS boolean CREATE OPERATOR >>> (procedure = leak2, leftarg = integer, rightarg = integer, restrict = scalargtsel); --- This should not show any "leak" notices before failing. +-- These should not show any "leak" notices before failing. EXPLAIN (COSTS OFF) SELECT * FROM atest12 WHERE a >>> 0; +EXPLAIN (COSTS OFF) SELECT * FROM atest12v WHERE a >>> 0; +EXPLAIN (COSTS OFF) SELECT * FROM atest12sbv WHERE a >>> 0; + +-- Now regress_priv_user1 grants access to regress_priv_user2 via the views. +SET SESSION AUTHORIZATION regress_priv_user1; +GRANT SELECT ON atest12v TO PUBLIC; +GRANT SELECT ON atest12sbv TO PUBLIC; +SET SESSION AUTHORIZATION regress_priv_user2; -- These plans should continue to use a nestloop, since they execute with the -- privileges of the view owner. @@ -1481,6 +1487,14 @@ SELECT makeaclitem('regress_priv_user1'::regrole, 'regress_priv_user2'::regrole, SELECT makeaclitem('regress_priv_user1'::regrole, 'regress_priv_user2'::regrole, 'SELECT, fake_privilege', FALSE); -- error +-- Test quoting and dequoting of user names in ACLs +CREATE ROLE "regress_""quoted"; +SELECT makeaclitem('regress_"quoted'::regrole, 'regress_"quoted'::regrole, + 'SELECT', TRUE); +SELECT '"regress_""quoted"=r*/"regress_""quoted"'::aclitem; +SELECT '""=r*/""'::aclitem; -- used to be misparsed as """" +DROP ROLE "regress_""quoted"; + -- Test non-throwing aclitem I/O SELECT pg_input_is_valid('regress_priv_user1=r/regress_priv_user2', 'aclitem'); SELECT pg_input_is_valid('regress_priv_user1=r/', 'aclitem'); diff --git a/src/test/regress/sql/psql.sql b/src/test/regress/sql/psql.sql index 3b3c6f6e2944d..f8ad7af5a3a84 100644 --- a/src/test/regress/sql/psql.sql +++ b/src/test/regress/sql/psql.sql @@ -1025,6 +1025,7 @@ select \if false \\ (bogus \else \\ 42 \endif \\ forty_two; \pset arg1 arg2 \q \reset + \restrict test \s arg1 \set arg1 arg2 arg3 arg4 arg5 arg6 arg7 \setenv arg1 arg2 @@ -1033,6 +1034,7 @@ select \if false \\ (bogus \else \\ 42 \endif \\ forty_two; \t arg1 \T arg1 \timing arg1 + \unrestrict not_valid \unset arg1 \w arg1 \watch arg1 arg2 diff --git a/src/test/regress/sql/publication.sql b/src/test/regress/sql/publication.sql index 479d4f3264472..c4f12d4e0a39c 100644 --- a/src/test/regress/sql/publication.sql +++ b/src/test/regress/sql/publication.sql @@ -1109,3 +1109,25 @@ DROP SCHEMA sch2 cascade; RESET SESSION AUTHORIZATION; DROP ROLE regress_publication_user, regress_publication_user2; DROP ROLE regress_publication_user_dummy; + +-- stage objects for pg_dump tests +CREATE SCHEMA pubme CREATE TABLE t0 (c int, d int) CREATE TABLE t1 (c int); +CREATE SCHEMA pubme2 CREATE TABLE t0 (c int, d int); +SET client_min_messages = 'ERROR'; +CREATE PUBLICATION dump_pub_qual_1ct FOR + TABLE ONLY pubme.t0 (c, d) WHERE (c > 0); +CREATE PUBLICATION dump_pub_qual_2ct FOR + TABLE ONLY pubme.t0 (c) WHERE (c > 0), + TABLE ONLY pubme.t1 (c); +CREATE PUBLICATION dump_pub_nsp_1ct FOR + TABLES IN SCHEMA pubme; +CREATE PUBLICATION dump_pub_nsp_2ct FOR + TABLES IN SCHEMA pubme, + TABLES IN SCHEMA pubme2; +CREATE PUBLICATION dump_pub_all FOR + TABLE ONLY pubme.t0, + TABLE ONLY pubme.t1 WHERE (c < 0), + TABLES IN SCHEMA pubme, + TABLES IN SCHEMA pubme2 + WITH (publish_via_partition_root = true); +RESET client_min_messages; 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 eab7d99003eec..6e71dc7236b98 100644 --- a/src/test/regress/sql/rowsecurity.sql +++ b/src/test/regress/sql/rowsecurity.sql @@ -2162,7 +2162,7 @@ DROP VIEW rls_view; DROP TABLE rls_tbl; DROP TABLE ref_tbl; --- Leaky operator test +-- Leaky operator tests CREATE TABLE rls_tbl (a int); INSERT INTO rls_tbl SELECT x/10 FROM generate_series(1, 100) x; ANALYZE rls_tbl; @@ -2177,9 +2177,58 @@ CREATE FUNCTION op_leak(int, int) RETURNS bool CREATE OPERATOR <<< (procedure = op_leak, leftarg = int, rightarg = int, restrict = scalarltsel); SELECT * FROM rls_tbl WHERE a <<< 1000; +RESET SESSION AUTHORIZATION; + +CREATE TABLE rls_child_tbl () INHERITS (rls_tbl); +INSERT INTO rls_child_tbl SELECT x/10 FROM generate_series(1, 100) x; +ANALYZE rls_child_tbl; + +CREATE TABLE rls_ptbl (a int) PARTITION BY RANGE (a); +CREATE TABLE rls_part PARTITION OF rls_ptbl FOR VALUES FROM (-100) TO (100); +INSERT INTO rls_ptbl SELECT x/10 FROM generate_series(1, 100) x; +ANALYZE rls_ptbl, rls_part; + +ALTER TABLE rls_ptbl ENABLE ROW LEVEL SECURITY; +ALTER TABLE rls_part ENABLE ROW LEVEL SECURITY; +GRANT SELECT ON rls_ptbl TO regress_rls_alice; +GRANT SELECT ON rls_part TO regress_rls_alice; +CREATE POLICY p1 ON rls_tbl USING (a < 0); +CREATE POLICY p2 ON rls_ptbl USING (a < 0); +CREATE POLICY p3 ON rls_part USING (a < 0); + +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM rls_tbl WHERE a <<< 1000; +SELECT * FROM rls_child_tbl WHERE a <<< 1000; +SELECT * FROM rls_ptbl WHERE a <<< 1000; +SELECT * FROM rls_part WHERE a <<< 1000; +SELECT * FROM (SELECT * FROM rls_tbl UNION ALL + SELECT * FROM rls_tbl) t WHERE a <<< 1000; +SELECT * FROM (SELECT * FROM rls_child_tbl UNION ALL + SELECT * FROM rls_child_tbl) t WHERE a <<< 1000; +RESET SESSION AUTHORIZATION; + +REVOKE SELECT ON rls_tbl FROM regress_rls_alice; +CREATE VIEW rls_tbl_view AS SELECT * FROM rls_tbl; + +ALTER TABLE rls_child_tbl ENABLE ROW LEVEL SECURITY; +GRANT SELECT ON rls_child_tbl TO regress_rls_alice; +CREATE POLICY p4 ON rls_child_tbl USING (a < 0); + +SET SESSION AUTHORIZATION regress_rls_alice; +SELECT * FROM rls_tbl WHERE a <<< 1000; +SELECT * FROM rls_tbl_view WHERE a <<< 1000; +SELECT * FROM rls_child_tbl WHERE a <<< 1000; +SELECT * FROM (SELECT * FROM rls_tbl UNION ALL + SELECT * FROM rls_tbl) t WHERE a <<< 1000; +SELECT * FROM (SELECT * FROM rls_child_tbl UNION ALL + SELECT * FROM rls_child_tbl) t WHERE a <<< 1000; DROP OPERATOR <<< (int, int); DROP FUNCTION op_leak(int, int); RESET SESSION AUTHORIZATION; +DROP TABLE rls_part; +DROP TABLE rls_ptbl; +DROP TABLE rls_child_tbl; +DROP VIEW rls_tbl_view; DROP TABLE rls_tbl; -- Bug #16006: whole-row Vars in a policy don't play nice with sub-selects diff --git a/src/test/regress/sql/sqljson.sql b/src/test/regress/sql/sqljson.sql index 9b5d82602d071..343d344d2707f 100644 --- a/src/test/regress/sql/sqljson.sql +++ b/src/test/regress/sql/sqljson.sql @@ -152,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(); @@ -188,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)); diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql index d8ac0d06f484d..ed0bc1ef0745b 100644 --- a/src/test/regress/sql/stats.sql +++ b/src/test/regress/sql/stats.sql @@ -849,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 0c08a6cc42e89..8f54c363b1ff6 100644 --- a/src/test/regress/sql/stats_ext.sql +++ b/src/test/regress/sql/stats_ext.sql @@ -1633,7 +1633,14 @@ CREATE FUNCTION op_leak(int, int) RETURNS bool LANGUAGE plpgsql; CREATE OPERATOR <<< (procedure = op_leak, leftarg = int, rightarg = int, restrict = scalarltsel); +CREATE FUNCTION op_leak(record, record) RETURNS bool + AS 'BEGIN RAISE NOTICE ''op_leak => %, %'', $1, $2; RETURN $1 < $2; END' + LANGUAGE plpgsql; +CREATE OPERATOR <<< (procedure = op_leak, leftarg = record, rightarg = record, + restrict = scalarltsel); SELECT * FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied +SELECT * FROM tststats.priv_test_tbl t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Permission denied DELETE FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied -- Grant access via a security barrier view, but hide all data @@ -1645,18 +1652,48 @@ GRANT SELECT, DELETE ON tststats.priv_test_view TO regress_stats_user1; -- Should now have access via the view, but see nothing and leak nothing SET SESSION AUTHORIZATION regress_stats_user1; SELECT * FROM tststats.priv_test_view WHERE a <<< 0 AND b <<< 0; -- Should not leak +SELECT * FROM tststats.priv_test_view t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Should not leak DELETE FROM tststats.priv_test_view WHERE a <<< 0 AND b <<< 0; -- Should not leak -- Grant table access, but hide all data with RLS RESET SESSION AUTHORIZATION; ALTER TABLE tststats.priv_test_tbl ENABLE ROW LEVEL SECURITY; +CREATE POLICY priv_test_tbl_pol ON tststats.priv_test_tbl USING (2 * a < 0); GRANT SELECT, DELETE ON tststats.priv_test_tbl TO regress_stats_user1; -- Should now have direct table access, but see nothing and leak nothing SET SESSION AUTHORIZATION regress_stats_user1; SELECT * FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Should not leak +SELECT * FROM tststats.priv_test_tbl t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Should not leak DELETE FROM tststats.priv_test_tbl WHERE a <<< 0 AND b <<< 0; -- Should not leak +-- Create plain inheritance parent table with no access permissions +RESET SESSION AUTHORIZATION; +CREATE TABLE tststats.priv_test_parent_tbl (a int, b int); +ALTER TABLE tststats.priv_test_tbl INHERIT tststats.priv_test_parent_tbl; + +-- Should not have access to parent, and should leak nothing +SET SESSION AUTHORIZATION regress_stats_user1; +SELECT * FROM tststats.priv_test_parent_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied +SELECT * FROM tststats.priv_test_parent_tbl t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Permission denied +DELETE FROM tststats.priv_test_parent_tbl WHERE a <<< 0 AND b <<< 0; -- Permission denied + +-- Grant table access to parent, but hide all data with RLS +RESET SESSION AUTHORIZATION; +ALTER TABLE tststats.priv_test_parent_tbl ENABLE ROW LEVEL SECURITY; +CREATE POLICY priv_test_parent_tbl_pol ON tststats.priv_test_parent_tbl USING (2 * a < 0); +GRANT SELECT, DELETE ON tststats.priv_test_parent_tbl TO regress_stats_user1; + +-- Should now have direct table access to parent, but see nothing and leak nothing +SET SESSION AUTHORIZATION regress_stats_user1; +SELECT * FROM tststats.priv_test_parent_tbl WHERE a <<< 0 AND b <<< 0; -- Should not leak +SELECT * FROM tststats.priv_test_parent_tbl t + WHERE a <<< 0 AND (b <<< 0 OR t.* <<< (1, 1) IS NOT NULL); -- Should not leak +DELETE FROM tststats.priv_test_parent_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); @@ -1686,6 +1723,8 @@ SELECT statistics_name, most_common_vals FROM pg_stats_ext_exprs x -- Tidy up DROP OPERATOR <<< (int, int); DROP FUNCTION op_leak(int, int); +DROP OPERATOR <<< (record, record); +DROP FUNCTION op_leak(record, record); RESET SESSION AUTHORIZATION; DROP TABLE stats_ext_tbl; DROP SCHEMA tststats CASCADE; diff --git a/src/test/regress/sql/strings.sql b/src/test/regress/sql/strings.sql index 395967899290b..faa43caee2e22 100644 --- a/src/test/regress/sql/strings.sql +++ b/src/test/regress/sql/strings.sql @@ -193,6 +193,26 @@ SELECT 'abcd\efg' SIMILAR TO '_bcd\%' ESCAPE '' AS true; SELECT 'abcdefg' SIMILAR TO '_bcd%' ESCAPE NULL AS null; SELECT 'abcdefg' SIMILAR TO '_bcd#%' ESCAPE '##' AS error; +-- Characters that should be left alone in character classes when a +-- SIMILAR TO regexp pattern is converted to POSIX style. +-- Underscore "_" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '_[_[:alpha:]_]_'; +-- Percentage "%" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '%[%[:alnum:]%]%'; +-- Dot "." +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '.[.[:alnum:].].'; +-- Dollar "$" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '$[$[:alnum:]$]$'; +-- Opening parenthesis "(" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '()[([:alnum:](]()'; +-- Caret "^" +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '^[^[:alnum:]^[^^][[^^]][\^][[\^]]\^]^'; +-- Closing square bracket "]" at the beginning of character class +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '[]%][^]%][^%]%'; +-- Closing square bracket effective after two carets at the beginning +-- of character class. +EXPLAIN (COSTS OFF) SELECT * FROM TEXT_TBL WHERE f1 SIMILAR TO '[^^]^'; + -- Test backslash escapes in regexp_replace's replacement string SELECT regexp_replace('1112223333', E'(\\d{3})(\\d{3})(\\d{4})', E'(\\1) \\2-\\3'); SELECT regexp_replace('foobarrbazz', E'(.)\\1', E'X\\&Y', 'g'); diff --git a/src/test/regress/sql/triggers.sql b/src/test/regress/sql/triggers.sql index a3c3115a6e721..5a0fa012f1fbc 100644 --- a/src/test/regress/sql/triggers.sql +++ b/src/test/regress/sql/triggers.sql @@ -2110,6 +2110,11 @@ BBB 42 CCC 42 \. +-- check detach/reattach behavior; statement triggers with transition tables +-- should not prevent a table from becoming a partition again +alter table parent detach partition child1; +alter table parent attach partition child1 for values in ('AAA'); + -- DML affecting parent sees tuples collected from children even if -- there is no transition table trigger on the children drop trigger child1_insert_trig on child1; @@ -2329,6 +2334,11 @@ copy parent (a, b) from stdin; DDD 42 \. +-- check disinherit/reinherit behavior; statement triggers with transition +-- tables should not prevent a table from becoming an inheritance child again +alter table child1 no inherit parent; +alter table child1 inherit parent; + -- DML affecting parent sees tuples collected from children even if -- there is no transition table trigger on the children drop trigger child1_insert_trig on child1; diff --git a/src/test/regress/sql/vacuum.sql b/src/test/regress/sql/vacuum.sql index 548cd7accace4..d272dd064eb55 100644 --- a/src/test/regress/sql/vacuum.sql +++ b/src/test/regress/sql/vacuum.sql @@ -113,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; @@ -130,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); @@ -137,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/with.sql b/src/test/regress/sql/with.sql index bcf0242fa4064..6d55c7731a9f4 100644 --- a/src/test/regress/sql/with.sql +++ b/src/test/regress/sql/with.sql @@ -949,6 +949,13 @@ WITH RECURSIVE x(n) AS ( 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); diff --git a/src/test/regress/sql/xml.sql b/src/test/regress/sql/xml.sql index bac0388ac11c2..0ea4f508837cf 100644 --- a/src/test/regress/sql/xml.sql +++ b/src/test/regress/sql/xml.sql @@ -219,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; @@ -433,6 +435,8 @@ EXPLAIN (COSTS OFF, VERBOSE) SELECT * FROM xmltableview1; -- errors SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp) AS f (v1, v2); +SELECT * FROM XMLTABLE (ROW () PASSING null COLUMNS v1 timestamp __pg__is_not_null 1) AS f (v1); + -- XMLNAMESPACES tests SELECT * FROM XMLTABLE(XMLNAMESPACES('http://x.y' AS zz), '/zz:rows/zz:row' diff --git a/src/test/ssl/t/001_ssltests.pl b/src/test/ssl/t/001_ssltests.pl index b8773270235ae..02353120f6b5b 100644 --- a/src/test/ssl/t/001_ssltests.pl +++ b/src/test/ssl/t/001_ssltests.pl @@ -35,10 +35,8 @@ sub switch_server_cert $ssl_server->switch_server_cert(@_); } -# Determine whether this build uses OpenSSL or LibreSSL. As a heuristic, the -# HAVE_SSL_CTX_SET_CERT_CB macro isn't defined for LibreSSL. (Nor for OpenSSL -# 1.0.1, but that's old enough that accommodating it isn't worth the cost.) -my $libressl = not check_pg_config("#define HAVE_SSL_CTX_SET_CERT_CB 1"); +# Determine whether this build uses OpenSSL or LibreSSL. +my $libressl = $ssl_server->is_libressl; #### Some configuration diff --git a/src/test/ssl/t/002_scram.pl b/src/test/ssl/t/002_scram.pl index dd9322412434f..23827ec5aeef5 100644 --- a/src/test/ssl/t/002_scram.pl +++ b/src/test/ssl/t/002_scram.pl @@ -44,11 +44,17 @@ 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 this build uses OpenSSL or LibreSSL. +my $libressl = $ssl_server->is_libressl; + # Determine whether build supports detection of hash algorithms for # RSA-PSS certificates. my $supports_rsapss_certs = check_pg_config("#define HAVE_X509_GET_SIGNATURE_INFO 1"); +# As of 5/2025, LibreSSL doesn't actually work for RSA-PSS certificates. +$supports_rsapss_certs = 0 if $libressl; + # Allocation of base connection string shared among multiple tests. my $common_connstr; diff --git a/src/test/ssl/t/SSL/Backend/OpenSSL.pm b/src/test/ssl/t/SSL/Backend/OpenSSL.pm index 410b4b1a3f5a8..f28125d2b6e69 100644 --- a/src/test/ssl/t/SSL/Backend/OpenSSL.pm +++ b/src/test/ssl/t/SSL/Backend/OpenSSL.pm @@ -26,6 +26,7 @@ package SSL::Backend::OpenSSL; use strict; use warnings FATAL => 'all'; +use PostgreSQL::Test::Utils; use File::Basename; use File::Copy; @@ -205,6 +206,25 @@ sub get_library return $self->{_library}; } +=pod + +=item $backend->library_is_libressl() + +Detect whether the SSL library is LibreSSL. + +=cut + +sub library_is_libressl +{ + my ($self) = @_; + + # The HAVE_SSL_CTX_SET_CERT_CB macro isn't defined for LibreSSL. + # (Nor for OpenSSL 1.0.1, but that's old enough that accommodating it + # isn't worth the cost.) + # We may eventually need a less-bogus heuristic. + return not check_pg_config("#define HAVE_SSL_CTX_SET_CERT_CB 1"); +} + # Internal method for copying a set of files, taking into account wildcards sub _copy_files { diff --git a/src/test/ssl/t/SSL/Server.pm b/src/test/ssl/t/SSL/Server.pm index 021eec74abff0..88bf9ab63172a 100644 --- a/src/test/ssl/t/SSL/Server.pm +++ b/src/test/ssl/t/SSL/Server.pm @@ -243,6 +243,23 @@ sub ssl_library =pod +=item $server->is_libressl() + +Detect whether the currently used SSL backend is LibreSSL. +(Ideally we'd not need this hack, but presently we do.) + +=cut + +sub is_libressl +{ + my $self = shift; + my $backend = $self->{backend}; + + return $backend->library_is_libressl(); +} + +=pod + =item switch_server_cert(params) Change the configuration to use the given set of certificate, key, ca and diff --git a/src/test/subscription/t/013_partition.pl b/src/test/subscription/t/013_partition.pl index 29580525a97d8..db7a1604643b7 100644 --- a/src/test/subscription/t/013_partition.pl +++ b/src/test/subscription/t/013_partition.pl @@ -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/021_twophase.pl b/src/test/subscription/t/021_twophase.pl index e635be74c63f3..94a6d53794e96 100644 --- a/src/test/subscription/t/021_twophase.pl +++ b/src/test/subscription/t/021_twophase.pl @@ -373,7 +373,14 @@ $node_publisher->safe_psql('postgres', "SELECT count(*) FROM tab_copy;"); is($result, qq(6), 'publisher inserted data'); +# Wait for both subscribers to catchup $node_publisher->wait_for_catchup($appname_copy); +$node_publisher->wait_for_catchup($appname); + +# Make sure there are no prepared transactions on the subscriber +$result = $node_subscriber->safe_psql('postgres', + "SELECT count(*) FROM pg_prepared_xacts;"); +is($result, qq(0), 'should be no prepared transactions on subscriber'); $result = $node_subscriber->safe_psql('postgres', "SELECT count(*) FROM tab_copy;"); diff --git a/src/test/subscription/t/030_origin.pl b/src/test/subscription/t/030_origin.pl index 056561f00841c..c0c627ee83a99 100644 --- a/src/test/subscription/t/030_origin.pl +++ b/src/test/subscription/t/030_origin.pl @@ -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/100_bugs.pl b/src/test/subscription/t/100_bugs.pl index cb36ca7b16b62..3498a90e74160 100644 --- a/src/test/subscription/t/100_bugs.pl +++ b/src/test/subscription/t/100_bugs.pl @@ -490,4 +490,81 @@ $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/data/tzdata.zi b/src/timezone/data/tzdata.zi index db6ba4af2b013..a7fb52f1968f3 100644 --- a/src/timezone/data/tzdata.zi +++ b/src/timezone/data/tzdata.zi @@ -1,4 +1,4 @@ -# version 2025a +# 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 - @@ -2432,6 +2432,20 @@ Z America/Ciudad_Juarez -7:5:56 - LMT 1922 Ja 1 7u 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 @@ -3420,7 +3434,7 @@ Z Asia/Tbilisi 2:59:11 - LMT 1880 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 1979 +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 diff --git a/src/tools/pgindent/exclude_file_patterns b/src/tools/pgindent/exclude_file_patterns index 0746df4737200..76fd671dc95eb 100644 --- a/src/tools/pgindent/exclude_file_patterns +++ b/src/tools/pgindent/exclude_file_patterns @@ -64,7 +64,4 @@ src/tools/pg_bsd_indent/.* # ... and for paranoia's sake, don't touch git stuff. /\.git/ # Percona excludes -contrib/pg_tde/src16/.* -contrib/pg_tde/src17.* contrib/pg_tde/src/libkmip/.* -src/backend/nodes/nodetags.h diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 72e6d3a9865ab..2114d560ceda0 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -1607,6 +1607,7 @@ ManyTestResourceKind Material MaterialPath MaterialState +MdSMgrRelationData MdfdVec Memoize MemoizeEntry @@ -3206,6 +3207,7 @@ XLogRecordBuffer XLogRecoveryCtlData XLogRedoAction XLogSegNo +XLogSmgr XLogSource XLogStats XLogwrtResult diff --git a/src/tools/testwrap b/src/tools/testwrap index 9a270beb72d2a..9d4a878354034 100755 --- a/src/tools/testwrap +++ b/src/tools/testwrap @@ -51,6 +51,7 @@ 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: