Skip to content

Sync IvorySQL v5.3 with PostgreSQL 18.3#1199

Merged
gaoxueyu merged 27 commits into
IvorySQL:IVORY_REL_5_STABLEfrom
hs-liuxh:IVORY_REL_5_STABLE
Mar 3, 2026
Merged

Sync IvorySQL v5.3 with PostgreSQL 18.3#1199
gaoxueyu merged 27 commits into
IvorySQL:IVORY_REL_5_STABLEfrom
hs-liuxh:IVORY_REL_5_STABLE

Conversation

@hs-liuxh
Copy link
Copy Markdown
Collaborator

@hs-liuxh hs-liuxh commented Feb 28, 2026

This PR synchronizes IvorySQL v5.3 with upstream PostgreSQL 18.3 release

This pull request synchronizes IvorySQL IVORY_REL_5_STABLE with PostgreSQL REL_18_STABLE branch over the period 2026-02-11 to 2026-02-26, incorporating a total of 25 commits:

  • 25 commits are direct upstream changes from the official PostgreSQL repository, ranging from the initial commit "doc: Mention all SELECT privileges required by INSERT ... ON CONFLICT." to the latest included commit "Stamp 18.3"
  • The remaining commits are IvorySQL-specific patches that maintain and enhance Oracle compatibility while integrating upstream changes.

All integrated code has been thoroughly validated and successfully passes four core regression test suites(check-world; oracle-check-world; oracle-pg-check; oracle-check), ensuring functional correctness and stability after the sync.

Summary by CodeRabbit

  • Bug Fixes

    • Fixed encoding and substring issues with toasted text and multibyte slices
    • Prevented NOT NULL constraint name collisions with user-named constraints
    • Ensured deterministic ordering for certain remote UPDATE/DELETE paths
    • Improved wait-event reporting to include auxiliary backend processes
    • Fixed WAL replay behavior for multixact truncation
    • Clarified an encryption-related error message ("Session key too big")
  • Documentation

    • Clarified SELECT privilege rules for INSERT ... ON CONFLICT
    • Added comprehensive 18.3 release notes
  • Tests

    • Added regression tests covering NOT NULL naming, encoding, and varnullingrels
  • Localization

    • Updated many translation catalogs and message texts across languages

deanrasheed and others added 26 commits February 28, 2026 15:24
On the CREATE POLICY page, the description of per-command policies
stated that SELECT policies are applied when an INSERT has an ON
CONFLICT DO NOTHING clause. However, that is only the case if it
includes an arbiter clause, so clarify that.

While at it, also clarify the comment in the regression tests that
cover this.

Author: Dean Rasheed <dean.a.rasheed@gmail.com>
Reviewed-by: Viktor Holmberg <v@viktorh.net>
Discussion: https://postgr.es/m/CAEZATCXGwMQ+x00YY9XYG46T0kCajH=21QaYL9Xatz0dLKii+g@mail.gmail.com
Backpatch-through: 14
On the INSERT page, mention that SELECT privileges are also required
for any columns mentioned in the arbiter clause, including those
referred to by the constraint, and clarify that this applies to all
forms of ON CONFLICT, not just ON CONFLICT DO UPDATE.

Author: Dean Rasheed <dean.a.rasheed@gmail.com>
Reviewed-by: Viktor Holmberg <v@viktorh.net>
Discussion: https://postgr.es/m/CAEZATCXGwMQ+x00YY9XYG46T0kCajH=21QaYL9Xatz0dLKii+g@mail.gmail.com
Backpatch-through: 14
The buildfarm occasionally shows a variant row order in the output
of this UPDATE ... RETURNING, implying that the preceding INSERT
dropped one of the rows into some free space within the table rather
than appending them all at the end.  It's not entirely clear why that
happens some times and not other times, but we have established that
it's affected by concurrent activity in other databases of the
cluster.  In any case, the behavior is not wrong; the test is at fault
for presuming that a seqscan will give deterministic row ordering.
Add an ORDER BY atop the update to stop the buildfarm noise.

The buildfarm seems to have shown this only in v18 and master
branches, but just in case the cause is older, back-patch to
all supported branches.

Discussion: https://postgr.es/m/3866274.1770743162@sss.pgh.pa.us
Backpatch-through: 14
The pg_stat_activity view shows information for aux processes, but the
pg_stat_get_backend_wait_event() and
pg_stat_get_backend_wait_event_type() functions did not. To fix, call
AuxiliaryPidGetProc(pid) if BackendPidGetProc(pid) returns NULL, like
we do in pg_stat_get_activity().

In version 17 and above, it's a little silly to use those functions
when we already have the ProcNumber at hand, but it was necessary
before v17 because the backend ID was different from ProcNumber. I
have other plans for wait_event_info on master, so it doesn't seem
worth applying a different fix on different versions now.

Reviewed-by: Sami Imseih <samimseih@gmail.com>
Reviewed-by: Chao Li <li.evan.chao@gmail.com>
Reviewed-by: Kyotaro Horiguchi <horikyota.ntt@gmail.com>
Discussion: https://www.postgresql.org/message-id/c0320e04-6e85-4c49-80c5-27cfb3a58108@iki.fi
Backpatch-through: 14
If the variable's value is null, exec_stmt_return() missed filling
in estate->rettype.  This is a pretty old bug, but we'd managed not
to notice because that value isn't consulted for a null result ...
unless we have to cast it to a domain.  That case led to a failure
with "cache lookup failed for type 0".

The correct way to assign the data type is known by exec_eval_datum.
While we could copy-and-paste that logic, it seems like a better
idea to just invoke exec_eval_datum, as the ROW case already does.

Reported-by: Pavel Stehule <pavel.stehule@gmail.com>
Author: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/CAFj8pRBT_ahexDf-zT-cyH8bMR_qcySKM8D5nv5MvTWPiatYGA@mail.gmail.com
Backpatch-through: 14
It's currently only used in the server, but it was placed in src/port
with the idea that it might be useful in client programs too. However,
it will currently fail to link if used in a client program, because
CHECK_FOR_INTERRUPTS() is not usable in client programs. Fix that by
wrapping it in "#ifndef FRONTEND".

Reviewed-by: Álvaro Herrera <alvherre@kurilemu.de>
Discussion: https://www.postgresql.org/message-id/21cc7a48-99d9-4f69-9a3f-2c2de61ac8e5%40iki.fi
Backpatch-through: 18
This log message was referring to conflicts, but it is about checksum
failures.  The log message improved in this commit should never show up,
due to the fact that pgstat_prepare_report_checksum_failure() should
always be called before pgstat_report_checksum_failures_in_db(), with a
stats entry already created in the pgstats shared hash table.  The three
code paths able to report database-level checksum failures follow
already this requirement.

Oversight in b96d3c389755.

Author: Wang Peng <215722532@qq.com>
Discussion: https://postgr.es/m/tencent_9B6CD6D9D34AE28CDEADEC6188DB3BA1FE07@qq.com
Backpatch-through: 18
The prior order caused spurious Valgrind errors.  They're spurious
because the ereport(ERROR) non-local exit discards the pointer in
question.  pg_mblen_cstr() ordered the checks correctly, but these other
two did not.  Back-patch to v14, like commit
1e7fe06c10c0a8da9dd6261a6be8d405dc17c728.

Reviewed-by: Thomas Munro <thomas.munro@gmail.com>
Discussion: https://postgr.es/m/20260214053821.fa.noahmisch@microsoft.com
Backpatch-through: 14
Commit 1e7fe06c10c0a8da9dd6261a6be8d405dc17c728 changed
pg_mbstrlen_with_len() to ereport(ERROR) if the input ends in an
incomplete character.  Most callers want that.  text_substring() does
not.  It detoasts the most bytes it could possibly need to get the
requested number of characters.  For example, to extract up to 2 chars
from UTF8, it needs to detoast 8 bytes.  In a string of 3-byte UTF8
chars, 8 bytes spans 2 complete chars and 1 partial char.

Fix this by replacing this pg_mbstrlen_with_len() call with a string
traversal that differs by stopping upon finding as many chars as the
substring could need.  This also makes SUBSTRING() stop raising an
encoding error if the incomplete char is past the end of the substring.
This is consistent with the general philosophy of the above commit,
which was to raise errors on a just-in-time basis.  Before the above
commit, SUBSTRING() never raised an encoding error.

SUBSTRING() has long been detoasting enough for one more char than
needed, because it did not distinguish exclusive and inclusive end
position.  For avoidance of doubt, stop detoasting extra.

Back-patch to v14, like the above commit.  For applications using
SUBSTRING() on non-ASCII column values, consider applying this to your
copy of any of the February 12, 2026 releases.

Reported-by: SATŌ Kentarō <ranvis@gmail.com>
Reviewed-by: Thomas Munro <thomas.munro@gmail.com>
Bug: #19406
Discussion: https://postgr.es/m/19406-9867fddddd724fca@postgresql.org
Backpatch-through: 14
The error message added in 379695d3cc70 referred to the public key being
too long.  This is confusing as it is in fact the session key included
in a PGP message which is too long.  This is harmless, but let's be
precise about what is wrong.

Per offline report.

Reported-by: Zsolt Parragi <zsolt.parragi@percona.com>
Backpatch-through: 14
'latest_page_number' is set to the correct value, according to
nextOffset, early at system startup. Contrary to the comment, it hence
should be set up correctly by the time we get to WAL replay.

This fixes a failure to replay WAL generated on older minor versions,
before commit 789d65364c (18.2, 17.8, 16.12, 15.16, 14.21). The
failure occurs after a truncation record has been replayed and looks
like this:

    FATAL:  could not access status of transaction 858112
    DETAIL:  Could not read from file "pg_multixact/offsets/000D" at offset 24576: read too few bytes.
    CONTEXT:  WAL redo at 3/2A3AB408 for MultiXact/CREATE_ID: 858111 offset 6695072 nmembers 5: 1048228 (sh) 1048271 (keysh) 1048316 (sh) 1048344 (keysh) 1048370 (sh)

Reported-by: Sebastian Webber <sebastian@swebber.me>
Reviewed-by: Andrey Borodin <x4mmm@yandex-team.ru>
Reviewed-by: Kirill Reshke <reshkekirill@gmail.com>
Discussion: https://www.postgresql.org/message-id/20260214090150.GC2297@p46.dedyn.io;lightning.p46.dedyn.io
Backpatch-through: 14-18
The receive function of hstore was not able to handle correctly
duplicate key values when a new duplicate links to a NULL value, where a
pfree() could be attempted on a NULL pointer, crashing due to a pointer
dereference.

This problem would happen for a COPY BINARY, when stacking values like
that:
aa => 5
aa => null

The second key/value pair is discarded and pfree() calls are attempted
on its key and its value, leading to a pointer dereference for the value
part as the value is NULL.  The first key/value pair takes priority when
a duplicate is found.

Per offline report.

Reported-by: "Anemone" <vergissmeinnichtzh@gmail.com>
Reported-by: "A1ex" <alex000young@gmail.com>
Backpatch-through: 14
Various buildfarm members, having compilers like gcc 8.5 and 6.3, fail
to deduce that text_substring() variable "E" is initialized if
slice_size!=-1.  This suppression approach quiets gcc 8.5; I did not
reproduce the warning elsewhere.  Back-patch to v14, like commit
9f4fd119b2cbb9a41ec0c19a8d6ec9b59b92c125.

Reported-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/1157953.1771266105@sss.pgh.pa.us
Backpatch-through: 14
Commit c67bef3f325 introduced this test helper function for use by
src/test/regress/sql/encoding.sql, but its logic was incorrect.  It
confused an encoding ID for a boolean so it gave the wrong results for
some inputs, and also forgot the usual return macro.  The mistake didn't
affect values actually used in the test, so there is no change in
behavior.

Also drop it and another missed function at the end of the test, for
consistency.

Backpatch-through: 14
Author: Zsolt Parragi <zsolt.parragi@percona.com>
Commit 4603903d294 unfortunately reset the volatility of these functions
to STABLE whereas they had previously been set to IMMUTABLE. We can't
force a catalog update in the stable release, although a pg_update would
probably do the trick. A simpler fix, though, for affected users is
probably a simple catalog surgery along the lines of:

   UPDATE pg_proc SET provolatile = 'i' WHERE oid in (3261,3262);

Applied to 18 only. In master we are planning to get rid of the separate
redeclarations for defaults in system_functions.sql.

Bug: #19409
Reported-By: Lucio Chiessi <lucio.chiessi@trustly.com>
Discussion: https://postgr.es/m/19409-e16cd2605e59a4af@postgresql.org
table_tuple_update's update_indexes argument hasn't been a boolean since
commit 19d8e2308bc5.

Backpatch-through: 16
Otherwise the message is not very clear.

Backpatch-through: 18
When adjust_appendrel_attrs translates a Var referencing a parent
relation into a Var referencing a child relation, it propagates
varnullingrels from the parent Var to the translated Var.  Previously,
the code simply overwrote the translated Var's varnullingrels with
those of the parent.

This was incorrect because the translated Var might already possess
nonempty varnullingrels.  This happens, for example, when a LATERAL
subquery within a UNION ALL references a Var from the nullable side of
an outer join.  In such cases, the translated Var correctly carries
the outer join's relid in its varnullingrels.  Overwriting these bits
with the parent Var's set caused the planner to lose track of the fact
that the Var could be nulled by that outer join.

In the reported case, because the underlying column had a NOT NULL
constraint, the planner incorrectly deduced that the Var could never
be NULL and discarded essential IS NOT NULL filters.  This led to
incorrect query results where NULL rows were returned instead of being
filtered out.

To fix, use bms_add_members to merge the parent Var's varnullingrels
into the translated Var's existing set, preserving both sources of
nullability.

Back-patch to v16.  Although the reported case does not seem to cause
problems in v16, leaving incorrect varnullingrels in the tree seems
like a trap for the unwary.

Bug: #19412
Reported-by: Sergey Shinderuk <s.shinderuk@postgrespro.ru>
Author: Richard Guo <guofenglinux@gmail.com>
Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us>
Discussion: https://postgr.es/m/19412-1d0318089b86859e@postgresql.org
Backpatch-through: 16
If the 'bounds' array needs to be expanded, because the input contains
more trigrams than the initial guess, the code didn't return the
reallocated array correctly to the caller. That could lead to a crash
in the rare case that the input string becomes longer when it's
lower-cased. The only known instance of that is when an ICU locale is
used with certain single-byte encodings. This was an oversight in
commit 00896ddaf41f.

Author: Zsolt Parragi <zsolt.parragi@percona.com>
Backpatch-through: 18
As usual, the release notes for other branches will be made by cutting
these down, but put them up for community review first.
If a CREATE TABLE statement defined a constraint whose name is identical
to the name generated for a NOT NULL constraint, we'd throw an
(unnecessary) unique key violation error on
pg_constraint_conrelid_contypid_conname_index: this can easily be
avoided by choosing a different name for the NOT NULL constraint.

Fix by passing the constraint names already created by
AddRelationNewConstraints() to AddRelationNotNullConstraints(), so that
the latter can avoid name collisions with them.

Bug: #19393
Author: Laurenz Albe <laurenz.albe@cybertec.at>
Reported-by: Hüseyin Demir <huseyin.d3r@gmail.com>
Backpatch-through: 18
Discussion: https://postgr.es/m/19393-6a82427485a744cf@postgresql.org
Commit 8d9a97e0bb6d anticipated this change:

1 function with incompatible sub-type changes:

  [C] 'function List* AddRelationNotNullConstraints(Relation, List*, List*)' has some sub-type changes:
    parameter 4 of type 'List*' was added

Discussion: https://postgr.es/m/19393-6a82427485a744cf@postgresql.org
Report: https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=crake&dt=2026-02-21%2011%3A27%3A03
Backpatch-through: 18 only
Source-Git-URL: https://git.postgresql.org/git/pgtranslation/messages.git
Source-Git-Hash: 8edd578f1856e2ac142bb3bb7090ec0a58cd8ac6
Follow upstream commits to update test files and fix bugs.

Modified 12 files across oracle_test, contrib/postgres_fdw, and pl_isql directories:

- 8d9a97e0bb6 "Avoid name collision with NOT NULL constraints"
    * src/oracle_test/regress/sql/create_table.sql
    * src/oracle_test/regress/expected/create_table.out

- 6e045e1a6e3 "Fix SUBSTRING() for toasted multibyte characters"
    * src/oracle_test/regress/sql/encoding.sql
    * src/oracle_test/regress/expected/encoding.out

- ccc9be800dd "Fix test_valid_server_encoding helper function"
    * src/oracle_test/regress/sql/encoding.sql
    * src/oracle_test/regress/expected/encoding.out
    * src/oracle_test/regress/regress.c

- ed57c207c39 "Fix computation of varnullingrels when translating appendrel Var"
    * src/oracle_test/regress/sql/join.sql
    * src/oracle_test/regress/expected/join.out

- 946b653b7ab "Further stabilize a postgres_fdw test case"
    * contrib/postgres_fdw/sql/ivy_postgres_fdw.sql
    * contrib/postgres_fdw/expected/ivy_postgres_fdw.out

- ce4b7e3a105 "Fix plpgsql's handling of return simple_record_variable"
    * src/pl/plisql/src/pl_exec.c
    * src/pl/plisql/src/sql/plisql_domain.sql
    * src/pl/plisql/src/expected/plisql_domain.out
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented Feb 28, 2026

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between d556126 and 5237a70.

📒 Files selected for processing (3)
  • configure
  • configure.ac
  • meson.build
👮 Files not reviewed due to content moderation or server errors (1)
  • configure

📝 Walkthrough

Walkthrough

Updated project version to 18.3 and IvorySQL to 5.3; added Release 18.3 notes; fixed constraint-name collision handling for NOT NULL constraints (API change), adjusted multixact replay behavior, refined encoding/substring logic, merged nulling-rel bits in appendrel translation, assorted contrib fixes, many translation updates, and added/updated tests.

Changes

Cohort / File(s) Summary
Version & Build Metadata
configure, configure.ac, meson.build
Bump PostgreSQL version to 18.3 and IvorySQL package version to 5.3; update generated configure/status strings.
Release Documentation
doc/src/sgml/release-18.sgml
Add comprehensive Release 18.3 notes enumerating fixes, CVE mentions, and behavioral clarifications.
ABI Compliance History
.abi-compliance-history
Add entry documenting NOT NULL constraint naming change and requirement to provide existing constraint names.
NOT NULL Constraint Naming (API change)
src/backend/catalog/heap.c, src/include/catalog/heap.h, src/backend/commands/tablecmds.c
Add new parameter existing_constraints to AddRelationNotNullConstraints; propagate existing CHECK constraint names to avoid name collisions when generating NOT NULL constraints.
Multixact & SLRU docs
src/backend/access/transam/multixact.c, src/include/access/slru.h
Stop updating latest_page_number during multixact truncation WAL replay; document latest_page_number accuracy requirement for older minor-version replay.
Appendrel Var nulling-rel merge
src/backend/optimizer/util/appendinfo.c
Merge varnullingrels using bms_add_members instead of overwriting, preserving pre-existing nulling-rel bits during Var translation.
Encoding / Substring & MB utils
src/backend/utils/adt/varlena.c, src/backend/utils/mb/mbutils.c
Add pg_mbcharcliplen_chars; refactor multi-byte substring end-exclusive semantics and boundary checks; move/remove redundant mb-length checks.
Contrib fixes
contrib/hstore/hstore_io.c, contrib/pg_trgm/trgm_op.c, contrib/pgcrypto/px.c
Guard pfree on NULL in hstore; update caller pointer after repalloc in pg_trgm; rename an error string in pgcrypto.
postgres_fdw remote UPDATE ordering
contrib/postgres_fdw/sql/...
Wrap remote UPDATEs in CTE with RETURNING and SELECT ... ORDER BY to enforce deterministic ordering for pushdown scenarios.
Function volatility
src/backend/catalog/system_functions.sql
Mark json_strip_nulls/jsonb_strip_nulls IMMUTABLE instead of STABLE.
Stats / wait-event reporting
src/backend/utils/activity/pgstat_database.c, src/backend/utils/adt/pgstatfuncs.c
Clarify checksum-failure log message; include AuxiliaryPidGetProc fallback so auxiliary backends report wait events.
PL/pgSQL / PL/ISQL return handling
src/pl/plpgsql/src/pl_exec.c, src/pl/plisql/src/pl_exec.c
Unify REC and ROW return handling to use exec_eval_datum, removing REC-specific code path.
Tests — regress & oracle_test
src/test/regress/sql/create_table.sql, src/test/regress/sql/encoding.sql, src/test/regress/sql/join.sql, src/oracle_test/...
Add tests for NOT NULL constraint-name collisions, extended UTF-8/toast substring tests, and appendrel varnullingrels behavior; adjust related test helpers.
Header/docs minor edits
src/include/access/tableam.h, src/include/access/slru.h
Minor doc rewording for update_indexes and latest_page_number notes.
Portability / frontend guard
src/port/pg_numa.c
Wrap CHECK_FOR_INTERRUPTS() in pg_numa_query_pages with #ifndef FRONTEND to omit interrupts in frontend builds.
Localization / PO updates
src/backend/po/de.po, src/backend/po/ru.po, src/bin/.../po/*, src/interfaces/libpq/po/fr.po, etc.
Large-scale translation updates across many PO files: metadata bumps, refined translations, message generalizations, added/removed entries and reference adjustments.
Misc small changes
src/backend/access/transam/..., src/test/regress/regress.c, src/oracle_test/regress/regress.c, src/include/catalog/heap.h, src/bin/.../po/*
Minor logic/comment tweaks, test helper return-type fixes (test_valid_server_encoding → boolean), and prototype adjustments reflecting API change.

Sequence Diagram(s)

sequenceDiagram
    participant DefineRelation as DefineRelation
    participant AddNewCons as AddRelationNewConstraints
    participant AddNNCons as AddRelationNotNullConstraints
    participant HeapCatalog as CatalogHeap

    DefineRelation->>AddNewCons: create/check constraints, collect connames
    AddNewCons->>AddNNCons: pass constraints, old_notnulls, connames (existing_constraints)
    AddNNCons->>HeapCatalog: generate not-null constraint names avoiding existing_constraints
    AddNNCons-->>AddNewCons: return new not-null constraints
    AddNewCons-->>DefineRelation: finalize constraint definitions
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Suggested reviewers

  • OreoYang
  • NotHimmel
  • jiaoshuntian
  • c2main

Poem

🐰 I hopped through headers, docs, and tests so spry,
I nudged constraint names so collisions pass by,
I clipped multibyte edges with a careful paw,
Translations polished while I munched on straw,
A tiny rabbit cheers this eighteen-point-three sky! ✨

🚥 Pre-merge checks | ✅ 2 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 72.22% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title accurately reflects the main objective: synchronizing IvorySQL v5.3 with PostgreSQL 18.3. It is concise, specific, and clearly communicates the primary change without noise.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment

Tip

Try Coding Plans. Let us write the prompt for your AI agent so you can ship faster (with fewer bugs).
Share your feedback on Discord.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 13

🧹 Nitpick comments (3)
src/interfaces/libpq/po/fr.po (2)

13-16: Project-Id-Version may need update.

The Project-Id-Version header still references "PostgreSQL 17" while this PR synchronizes with PostgreSQL 18.3. Consider updating this to reflect the current version.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/interfaces/libpq/po/fr.po` around lines 13 - 16, Update the PO file
header so the Project-Id-Version reflects the synchronized PostgreSQL release;
change the "Project-Id-Version: PostgreSQL 17" header to "Project-Id-Version:
PostgreSQL 18.3" (edit the Project-Id-Version header line in
src/interfaces/libpq/po/fr.po).

200-427: Multiple new OAuth messages lack French translations.

Several new OAuth/OpenID-related message strings have empty msgstr values, meaning they will display in English for French users. Key untranslated messages include:

  • "failed to parse OpenID discovery document" (line 201)
  • "failed to fetch OpenID discovery document" (line 279)
  • "failed to obtain access token" (line 295)
  • OAuth discovery URI validation messages (lines 312, 317, 322, 327)
  • "server's error message contained an embedded NULL" (line 332)
  • OAuth flow error messages (lines 372, 383, 400, 405, 410, 415)

While the application will gracefully fall back to English, completing these translations would maintain a consistent French user experience. Consider tracking this as a follow-up task if translations cannot be completed in this PR.

Would you like me to open an issue to track the completion of these French translations?

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/interfaces/libpq/po/fr.po` around lines 200 - 427, Several new
OAuth/OpenID msgid entries in src/interfaces/libpq/po/fr.po are missing French
msgstr translations (e.g. "failed to parse OpenID discovery document", "failed
to fetch OpenID discovery document", "failed to obtain access token", the
various "OAuth discovery URI \"%s\" ..." validation messages, "server's error
message contained an embedded NULL, and was discarded", and other OAuth flow
messages). Locate those msgid entries in fr.po and supply appropriate French
translations in the corresponding msgstr fields (preserve any %s/%m format
specifiers and punctuation/quoting), ensure translations are not marked fuzzy
unless provisional, and keep gettext syntax intact; if you cannot complete all
translations in this PR, add a follow-up issue referencing these specific msgid
strings so they can be translated later.
doc/src/sgml/release-18.sgml (1)

152-154: Correct function signatures when using regprocedure names

Line 153 hard-codes pg_proc OIDs. The OIDs 3261 and 3262 are verified as correct in the catalog, but using symbolic function names is safer. However, the suggested refactoring omits the bool parameter from the function signatures—both functions actually take (json, bool) and (jsonb, bool) respectively:

♻️ Corrected SQL snippet
-UPDATE pg_catalog.pg_proc SET provolatile = 'i' WHERE oid IN ('3261','3262');
+UPDATE pg_catalog.pg_proc
+SET provolatile = 'i'
+WHERE oid IN (
+  'pg_catalog.json_strip_nulls(json, bool)'::regprocedure,
+  'pg_catalog.jsonb_strip_nulls(jsonb, bool)'::regprocedure
+);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@doc/src/sgml/release-18.sgml` around lines 152 - 154, Replace the hard-coded
pg_proc OIDs in the UPDATE with regprocedure-style function names including
their full signatures so the correct rows are matched; specifically, change the
WHERE clause that uses oid IN ('3261','3262') to reference the functions by name
with explicit parameter types (e.g., function_name(json, boolean) and
other_function_name(jsonb, boolean) as regprocedure literals) so the signatures
include the required bool parameter and avoid relying on OID values.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/backend/utils/mb/mbutils.c`:
- Around line 1088-1089: The check "if (unlikely(mbstr + length > end))
report_invalid_encoding_db(...)" performs pointer arithmetic with a potentially
out-of-range pointer; change it to compute available bytes and compare the
untrusted length against that: compute ssize_t avail = end - mbstr (or use the
same pattern as pg_mblen_with_len), then replace the condition with "if
(unlikely((size_t)length > (size_t)avail))" and call
report_invalid_encoding_db(mbstr, length, avail) accordingly; update any
variable names to match mbstr, length, end and keep the behavior of
report_invalid_encoding_db the same.

In `@src/bin/pg_basebackup/po/fr.po`:
- Around line 1965-1966: The French translation for msgid "no subscriber data
directory specified" is incorrect; update the msgstr to accurately reflect "data
directory" rather than "connection string" by replacing the current msgstr with
a correct French phrase such as "aucun répertoire de données de l'abonné
spécifié" (or "aucun répertoire de données d'abonné spécifié") for the msgid "no
subscriber data directory specified".

In `@src/bin/pg_dump/po/fr.po`:
- Around line 2045-2046: The French translation mistakenly changes the CLI flag
name: update the msgstr that corresponds to msgid "  --statistics               
dump the statistics\n" to use the exact flag "--statistics" (e.g., " 
--statistics                 sauvegarde les statistiques\n") instead of
"--with-statistics", and make the same correction for the other identical
translation instance; ensure you only change the option token while keeping the
French description text "sauvegarde les statistiques" intact so the msgid/msgstr
flag names match exactly.
- Around line 2659-2660: The French translation for the msgid "You might not be
able to restore the dump without using --disable-triggers or temporarily
dropping the constraints." is inverted; update the msgstr for that exact msgid
to reflect the warning (e.g., start with "Il se peut que vous ne puissiez pas
restaurer la sauvegarde sans utiliser --disable-triggers ou sans supprimer
temporairement les contraintes." or equivalent) so the French conveys the
possibility of being unable to restore without those steps.
- Around line 1871-1872: The translated string for msgid " 
--exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
incorrectly drops the “data” scope by translating it as "ne sauvegarde pas les
tables indiquées"; update the msgstr to explicitly indicate excluding table data
(e.g., mention "les données" or "les données des tables") so it matches the
original intent — change the current msgstr to a French phrase that conveys "do
NOT dump data for the specified table(s)" rather than "do not dump the tables."
- Around line 2765-2766: The translated msgstr for the msgid " 
--filter=FILENAME            exclude databases based on expressions in
FILENAME\n" is incorrect — it references "-f, --file" instead of the original
"--filter=FILENAME"; update the msgstr to mirror the source option token and
meaning (e.g. use "--filter=FICHIER" and a French translation like "exclut les
bases de données selon des expressions dans FICHIER") so the help text matches
the original msgid.
- Around line 2594-2598: Add a French translation for the non-obsolete message
by filling msgstr for the msgid "failed to get data for sequence \"%s\"; user
may lack SELECT privilege on the sequence or the sequence may have been
concurrently dropped" (preserve the c-format %s and escaped quotes), ensuring
the translated string is non-empty and correctly localized in French while
keeping formatting and punctuation consistent with similar entries.

In `@src/bin/pg_dump/po/ja.po`:
- Around line 1361-1364: The Japanese translation for the msgid "unexpected
extra results during COPY of table \"%s\"" incorrectly uses "ファイル" (file);
update the msgstr to use "テーブル" (table) and preserve the %s placeholder and
surrounding quotes/escaping, e.g. replace the current msgstr for that msgid so
it reads something equivalent to "テーブル\"%s\"をCOPY中に想定していない余分な結果がありました", ensuring
encoding and quoting match the PO file conventions.
- Around line 663-666: The Japanese translation in the PO entry for msgid
"directory \"%s\" is not empty" is inverted and incorrectly quoted; update the
msgstr for that entry (the one currently set to "ディレクトリ\"%s\"は空です") to correctly
convey "is not empty", e.g. change it to "ディレクトリ \"%s\" は空ではありません" and ensure
the internal quotes and spacing/escaping around %s match the PO file style.
- Around line 2430-2438: The Japanese translations for the two diagnostic
messages incorrectly reference pg_cast.castmethod; update the msgstr strings
corresponding to the msgid "bogus value in pg_transform.trffromsql field" and
"bogus value in pg_transform.trftosql field" to mention the correct catalog
field names pg_transform.trffromsql and pg_transform.trftosql respectively
(replace the current "pg_cast.castmethod フィールド..." with "pg_transform.trffromsql
フィールド..." and "pg_transform.trftosql フィールド..." in the two msgstr entries).

In `@src/bin/pg_resetwal/po/fr.po`:
- Around line 676-679: The French translation's help string mistakenly changes
the option from "-f, --force" to "-i, --interactive"; update the msgstr to use
the correct flag text "-f, --force" and the matching French description (e.g.,
"force la mise à jour, y compris un arrêt pas propre ou si les valeurs de
pg_control doivent être devinées") so the translated help matches the original
option names; locate the incorrect text referencing "-i, --interactive" and
replace it with "-f, --force" in the msgstr.
- Around line 767-770: The translated msgstr contains an escaped
backslash-newline sequence ("\\n") that will render a literal "\n" instead of a
line break; edit the msgstr for the msgid shown so that the sequence is a proper
newline escape (i.e. replace the double-escaped "\\n" with a single "\n" or
split into separate quoted lines) in the msgstr entry to restore the intended
line break.

In `@src/interfaces/libpq/po/fr.po`:
- Around line 46-70: Update the fuzzy French translations so their meanings
match the English msgids: replace msgstr for msgid "field \"%s\" must be a
string" (currently "le champ « %s » est manquant") with a French string meaning
"must be a string" (e.g., "le champ « %s » doit être une chaîne"), change msgstr
for msgid "field \"%s\" must be an array of strings" (currently "...tableau
d'objets") to indicate "array of strings" (e.g., "le champ « %s » doit être un
tableau de chaînes"), and fix msgstr for msgid "field \"%s\" has unexpected
type" (currently "le champ « %s » est dupliqué") to convey unexpected type
(e.g., "le champ « %s » a un type inattendu"); ensure to remove the fuzzy flag
after correcting the translations.

---

Nitpick comments:
In `@doc/src/sgml/release-18.sgml`:
- Around line 152-154: Replace the hard-coded pg_proc OIDs in the UPDATE with
regprocedure-style function names including their full signatures so the correct
rows are matched; specifically, change the WHERE clause that uses oid IN
('3261','3262') to reference the functions by name with explicit parameter types
(e.g., function_name(json, boolean) and other_function_name(jsonb, boolean) as
regprocedure literals) so the signatures include the required bool parameter and
avoid relying on OID values.

In `@src/interfaces/libpq/po/fr.po`:
- Around line 13-16: Update the PO file header so the Project-Id-Version
reflects the synchronized PostgreSQL release; change the "Project-Id-Version:
PostgreSQL 17" header to "Project-Id-Version: PostgreSQL 18.3" (edit the
Project-Id-Version header line in src/interfaces/libpq/po/fr.po).
- Around line 200-427: Several new OAuth/OpenID msgid entries in
src/interfaces/libpq/po/fr.po are missing French msgstr translations (e.g.
"failed to parse OpenID discovery document", "failed to fetch OpenID discovery
document", "failed to obtain access token", the various "OAuth discovery URI
\"%s\" ..." validation messages, "server's error message contained an embedded
NULL, and was discarded", and other OAuth flow messages). Locate those msgid
entries in fr.po and supply appropriate French translations in the corresponding
msgstr fields (preserve any %s/%m format specifiers and punctuation/quoting),
ensure translations are not marked fuzzy unless provisional, and keep gettext
syntax intact; if you cannot complete all translations in this PR, add a
follow-up issue referencing these specific msgid strings so they can be
translated later.

ℹ️ Review info

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 4a226f7 and d556126.

⛔ Files ignored due to path filters (11)
  • contrib/pgcrypto/expected/pgp-pubkey-session.out is excluded by !**/*.out
  • contrib/postgres_fdw/expected/ivy_postgres_fdw.out is excluded by !**/*.out
  • contrib/postgres_fdw/expected/postgres_fdw.out is excluded by !**/*.out
  • src/oracle_test/regress/expected/create_table.out is excluded by !**/*.out
  • src/oracle_test/regress/expected/encoding.out is excluded by !**/*.out
  • src/oracle_test/regress/expected/join.out is excluded by !**/*.out
  • src/pl/plisql/src/expected/plisql_domain.out is excluded by !**/*.out
  • src/pl/plpgsql/src/expected/plpgsql_domain.out is excluded by !**/*.out
  • src/test/regress/expected/create_table.out is excluded by !**/*.out
  • src/test/regress/expected/encoding.out is excluded by !**/*.out
  • src/test/regress/expected/join.out is excluded by !**/*.out
📒 Files selected for processing (52)
  • .abi-compliance-history
  • configure
  • configure.ac
  • contrib/hstore/hstore_io.c
  • contrib/pg_trgm/trgm_op.c
  • contrib/pgcrypto/px.c
  • contrib/postgres_fdw/sql/ivy_postgres_fdw.sql
  • contrib/postgres_fdw/sql/postgres_fdw.sql
  • doc/src/sgml/ref/create_policy.sgml
  • doc/src/sgml/ref/insert.sgml
  • doc/src/sgml/release-18.sgml
  • meson.build
  • src/backend/access/transam/multixact.c
  • src/backend/catalog/heap.c
  • src/backend/catalog/system_functions.sql
  • src/backend/commands/tablecmds.c
  • src/backend/optimizer/util/appendinfo.c
  • src/backend/po/de.po
  • src/backend/po/ja.po
  • src/backend/po/ka.po
  • src/backend/po/ru.po
  • src/backend/replication/syncrep.c
  • src/backend/utils/activity/pgstat_database.c
  • src/backend/utils/adt/pgstatfuncs.c
  • src/backend/utils/adt/varlena.c
  • src/backend/utils/mb/mbutils.c
  • src/bin/pg_basebackup/po/fr.po
  • src/bin/pg_combinebackup/po/fr.po
  • src/bin/pg_combinebackup/po/ka.po
  • src/bin/pg_dump/po/fr.po
  • src/bin/pg_dump/po/ja.po
  • src/bin/pg_resetwal/po/fr.po
  • src/bin/pg_rewind/po/ru.po
  • src/bin/psql/po/fr.po
  • src/include/access/slru.h
  • src/include/access/tableam.h
  • src/include/catalog/heap.h
  • src/interfaces/libpq/po/fr.po
  • src/oracle_test/regress/regress.c
  • src/oracle_test/regress/sql/create_table.sql
  • src/oracle_test/regress/sql/encoding.sql
  • src/oracle_test/regress/sql/join.sql
  • src/pl/plisql/src/pl_exec.c
  • src/pl/plisql/src/sql/plisql_domain.sql
  • src/pl/plpgsql/src/pl_exec.c
  • src/pl/plpgsql/src/po/ru.po
  • src/pl/plpgsql/src/sql/plpgsql_domain.sql
  • src/port/pg_numa.c
  • src/test/regress/regress.c
  • src/test/regress/sql/create_table.sql
  • src/test/regress/sql/encoding.sql
  • src/test/regress/sql/join.sql
💤 Files with no reviewable changes (1)
  • src/backend/access/transam/multixact.c
👮 Files not reviewed due to content moderation or server errors (1)
  • configure

Comment on lines +1088 to +1089
if (unlikely(mbstr + length > end))
report_invalid_encoding_db(mbstr, length, end - mbstr);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

cat -n src/backend/utils/mb/mbutils.c | sed -n '1080,1100p'

Repository: IvorySQL/IvorySQL

Length of output: 646


🏁 Script executed:

rg -n 'mbstr.*\+.*length.*>' src/backend/utils/mb/mbutils.c | head -20

Repository: IvorySQL/IvorySQL

Length of output: 102


🏁 Script executed:

rg -n '\+.*length.*>' src/backend/utils/mb/ --type c | grep -v mbutils.c

Repository: IvorySQL/IvorySQL

Length of output: 43


🏁 Script executed:

rg -n 'mbstr.*>' src/backend/utils/mb/mbutils.c | head -20

Repository: IvorySQL/IvorySQL

Length of output: 175


🏁 Script executed:

# Check the report_invalid_encoding_db function signature to understand type expectations
rg -n 'report_invalid_encoding_db' src/backend/utils/mb/mbutils.c -A5 | head -30

Repository: IvorySQL/IvorySQL

Length of output: 1132


🏁 Script executed:

# Check the function definition to understand the implementation and context
sed -n '1857,1880p' src/backend/utils/mb/mbutils.c

Repository: IvorySQL/IvorySQL

Length of output: 748


🏁 Script executed:

# Check how end - mbstr is used elsewhere in the file
rg -n 'end - mbstr' src/backend/utils/mb/mbutils.c

Repository: IvorySQL/IvorySQL

Length of output: 180


🏁 Script executed:

# Let's check what types are involved and how the suggested fix compares
rg -n 'ptrdiff_t' src/backend/utils/mb/mbutils.c | head -10

Repository: IvorySQL/IvorySQL

Length of output: 43


🏁 Script executed:

# Check if there are other patterns in the file that use ptr+offset comparisons
rg -n 'str.*\+.*>|ptr.*\+.*>' src/backend/utils/mb/mbutils.c

Repository: IvorySQL/IvorySQL

Length of output: 102


🏁 Script executed:

# Let's look at the complete pg_mblen_range function and related functions to understand the full context
sed -n '1070,1120p' src/backend/utils/mb/mbutils.c

Repository: IvorySQL/IvorySQL

Length of output: 1357


🏁 Script executed:

# Let's verify how other similar functions handle this pattern
rg -n 'pg_mblen|length.*limit|length.*>' src/backend/utils/mb/mbutils.c | head -30

Repository: IvorySQL/IvorySQL

Length of output: 1078


🏁 Script executed:

# Let's check the C standard implications by looking at how length is obtained
# and verify the safety of the comparison
rg -n 'mblen\(' src/backend/utils/mb/mbutils.c | head -5

Repository: IvorySQL/IvorySQL

Length of output: 320


Compare length against available bytes instead of adding to pointer.

Line 1088 compares mbstr + length > end; if length exceeds remaining bytes, that pointer arithmetic violates the C standard by computing a pointer outside the valid range of the object. The related function pg_mblen_with_len (line 1112) already demonstrates the safer pattern: comparing length > limit directly. Rewrite to compute available bytes first (end - mbstr) and compare the untrusted length value against it, avoiding the problematic pointer arithmetic.

Suggested fix
 int
 pg_mblen_range(const char *mbstr, const char *end)
 {
 	int			length = pg_wchar_table[DatabaseEncoding->encoding].mblen((const unsigned char *) mbstr);
+	ptrdiff_t	avail = end - mbstr;
 
 	Assert(end > mbstr);
 
-	if (unlikely(mbstr + length > end))
-		report_invalid_encoding_db(mbstr, length, end - mbstr);
+	if (unlikely((ptrdiff_t) length > avail))
+		report_invalid_encoding_db(mbstr, length, (int) avail);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/backend/utils/mb/mbutils.c` around lines 1088 - 1089, The check "if
(unlikely(mbstr + length > end)) report_invalid_encoding_db(...)" performs
pointer arithmetic with a potentially out-of-range pointer; change it to compute
available bytes and compare the untrusted length against that: compute ssize_t
avail = end - mbstr (or use the same pattern as pg_mblen_with_len), then replace
the condition with "if (unlikely((size_t)length > (size_t)avail))" and call
report_invalid_encoding_db(mbstr, length, avail) accordingly; update any
variable names to match mbstr, length, end and keep the behavior of
report_invalid_encoding_db the same.

Comment on lines 1965 to 1966
msgid "no subscriber data directory specified"
msgstr "aucune chaîne de connexion de l'abonné indiquée"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fix incorrect French meaning for subscriber data directory message.

At Line 1966, the translation refers to a connection string, but the source message is about a missing data directory.

Suggested translation fix
 msgid "no subscriber data directory specified"
-msgstr "aucune chaîne de connexion de l'abonné indiquée"
+msgstr "aucun répertoire de données de l'abonné indiqué"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
msgid "no subscriber data directory specified"
msgstr "aucune chaîne de connexion de l'abonné indiquée"
msgid "no subscriber data directory specified"
msgstr "aucun répertoire de données de l'abonné indiqué"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/bin/pg_basebackup/po/fr.po` around lines 1965 - 1966, The French
translation for msgid "no subscriber data directory specified" is incorrect;
update the msgstr to accurately reflect "data directory" rather than "connection
string" by replacing the current msgstr with a correct French phrase such as
"aucun répertoire de données de l'abonné spécifié" (or "aucun répertoire de
données d'abonné spécifié") for the msgid "no subscriber data directory
specified".

Comment thread src/bin/pg_dump/po/fr.po
Comment on lines 1871 to 1872
msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
msgstr " --exclude-table-data=MOTIF ne sauvegarde pas les tables indiquées\n"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

--exclude-table-data translation drops the “data” scope.

The source says to exclude data for specified tables; current French text says to exclude the tables themselves.

Suggested fix
-msgstr "  --exclude-table-data=MOTIF   ne sauvegarde pas les tables indiquées\n"
+msgstr "  --exclude-table-data=MOTIF   ne sauvegarde pas les données des tables indiquées\n"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
msgstr " --exclude-table-data=MOTIF ne sauvegarde pas les tables indiquées\n"
msgid " --exclude-table-data=PATTERN do NOT dump data for the specified table(s)\n"
msgstr " --exclude-table-data=MOTIF ne sauvegarde pas les données des tables indiquées\n"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/bin/pg_dump/po/fr.po` around lines 1871 - 1872, The translated string for
msgid "  --exclude-table-data=PATTERN do NOT dump data for the specified
table(s)\n" incorrectly drops the “data” scope by translating it as "ne
sauvegarde pas les tables indiquées"; update the msgstr to explicitly indicate
excluding table data (e.g., mention "les données" or "les données des tables")
so it matches the original intent — change the current msgstr to a French phrase
that conveys "do NOT dump data for the specified table(s)" rather than "do not
dump the tables."

Comment thread src/bin/pg_dump/po/fr.po
Comment on lines 2045 to 2046
msgid " --statistics dump the statistics\n"
msgstr " --with-statistics sauvegarde les statistiques\n"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

--statistics was mistranslated as a different option name.

The French help now shows --with-statistics, which does not match the actual CLI flag in msgid and can mislead users.

Suggested fix
-msgstr "  --with-statistics            sauvegarde les statistiques\n"
+msgstr "  --statistics                 sauvegarde les statistiques\n"
...
-msgstr "  --with-statistics            restaure les statistiques\n"
+msgstr "  --statistics                 restaure les statistiques\n"

Also applies to: 3106-3107

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/bin/pg_dump/po/fr.po` around lines 2045 - 2046, The French translation
mistakenly changes the CLI flag name: update the msgstr that corresponds to
msgid "  --statistics                 dump the statistics\n" to use the exact
flag "--statistics" (e.g., "  --statistics                 sauvegarde les
statistiques\n") instead of "--with-statistics", and make the same correction
for the other identical translation instance; ensure you only change the option
token while keeping the French description text "sauvegarde les statistiques"
intact so the msgid/msgstr flag names match exactly.

Comment thread src/bin/pg_dump/po/fr.po
Comment on lines +2594 to +2598
#: pg_dump.c:19109
#, c-format
msgid "failed to get data for sequence \"%s\"; user may lack SELECT privilege on the sequence or the sequence may have been concurrently dropped"
msgstr ""

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

New active message has an empty translation.

msgstr is empty for a non-obsolete entry, so users will see fallback English in French locale.

Suggested fix
 msgid "failed to get data for sequence \"%s\"; user may lack SELECT privilege on the sequence or the sequence may have been concurrently dropped"
-msgstr ""
+msgstr "échec de la récupération des données de la séquence « %s » ; l'utilisateur peut ne pas avoir le privilège SELECT sur la séquence, ou la séquence a pu être supprimée concurremment"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
#: pg_dump.c:19109
#, c-format
msgid "failed to get data for sequence \"%s\"; user may lack SELECT privilege on the sequence or the sequence may have been concurrently dropped"
msgstr ""
#: pg_dump.c:19109
#, c-format
msgid "failed to get data for sequence \"%s\"; user may lack SELECT privilege on the sequence or the sequence may have been concurrently dropped"
msgstr "échec de la récupération des données de la séquence « %s » ; l'utilisateur peut ne pas avoir le privilège SELECT sur la séquence, ou la séquence a pu être supprimée concurremment"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/bin/pg_dump/po/fr.po` around lines 2594 - 2598, Add a French translation
for the non-obsolete message by filling msgstr for the msgid "failed to get data
for sequence \"%s\"; user may lack SELECT privilege on the sequence or the
sequence may have been concurrently dropped" (preserve the c-format %s and
escaped quotes), ensuring the translated string is non-empty and correctly
localized in French while keeping formatting and punctuation consistent with
similar entries.

Comment thread src/bin/pg_dump/po/ja.po
Comment on lines +1361 to 1364
#: pg_backup_db.c:460 pg_dump.c:2473
#, c-format
msgid "unexpected extra results during COPY of table \"%s\""
msgstr "ファイル\"%s\"をCOPY中に想定していない余分な結果がありました"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Use “table” instead of “file” in COPY error translation.

Line 1364 translates a table COPY error as a file COPY error, which is misleading.

Suggested fix
 msgid "unexpected extra results during COPY of table \"%s\""
-msgstr "ファイル\"%s\"をCOPY中に想定していない余分な結果がありました"
+msgstr "テーブル\"%s\"のCOPY中に想定していない余分な結果がありました"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
#: pg_backup_db.c:460 pg_dump.c:2473
#, c-format
msgid "unexpected extra results during COPY of table \"%s\""
msgstr "ファイル\"%s\"をCOPY中に想定していない余分な結果がありました"
#: pg_backup_db.c:460 pg_dump.c:2473
#, c-format
msgid "unexpected extra results during COPY of table \"%s\""
msgstr "テーブル\"%s\"のCOPY中に想定していない余分な結果がありました"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/bin/pg_dump/po/ja.po` around lines 1361 - 1364, The Japanese translation
for the msgid "unexpected extra results during COPY of table \"%s\"" incorrectly
uses "ファイル" (file); update the msgstr to use "テーブル" (table) and preserve the %s
placeholder and surrounding quotes/escaping, e.g. replace the current msgstr for
that msgid so it reads something equivalent to
"テーブル\"%s\"をCOPY中に想定していない余分な結果がありました", ensuring encoding and quoting match the
PO file conventions.

Comment thread src/bin/pg_dump/po/ja.po
Comment on lines +2430 to 2438
#: pg_dump.c:13867
#, c-format
msgid "bogus value in pg_transform.trffromsql field"
msgstr "pg_cast.castmethod フィールドの値がおかしいです"

#: pg_dump.c:13887
#: pg_dump.c:13888
#, c-format
msgid "bogus value in pg_transform.trftosql field"
msgstr "pg_cast.castmethod フィールドの値がおかしいです"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Correct catalog field names in pg_transform diagnostic translations.

Lines 2433 and 2438 currently mention pg_cast.castmethod, but the source messages are for pg_transform.trffromsql and pg_transform.trftosql.

Suggested fix
 msgid "bogus value in pg_transform.trffromsql field"
-msgstr "pg_cast.castmethod フィールドの値がおかしいです"
+msgstr "pg_transform.trffromsql フィールドの値がおかしいです"

 msgid "bogus value in pg_transform.trftosql field"
-msgstr "pg_cast.castmethod フィールドの値がおかしいです"
+msgstr "pg_transform.trftosql フィールドの値がおかしいです"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
#: pg_dump.c:13867
#, c-format
msgid "bogus value in pg_transform.trffromsql field"
msgstr "pg_cast.castmethod フィールドの値がおかしいです"
#: pg_dump.c:13887
#: pg_dump.c:13888
#, c-format
msgid "bogus value in pg_transform.trftosql field"
msgstr "pg_cast.castmethod フィールドの値がおかしいです"
#: pg_dump.c:13867
#, c-format
msgid "bogus value in pg_transform.trffromsql field"
msgstr "pg_transform.trffromsql フィールドの値がおかしいです"
#: pg_dump.c:13888
#, c-format
msgid "bogus value in pg_transform.trftosql field"
msgstr "pg_transform.trftosql フィールドの値がおかしいです"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/bin/pg_dump/po/ja.po` around lines 2430 - 2438, The Japanese translations
for the two diagnostic messages incorrectly reference pg_cast.castmethod; update
the msgstr strings corresponding to the msgid "bogus value in
pg_transform.trffromsql field" and "bogus value in pg_transform.trftosql field"
to mention the correct catalog field names pg_transform.trffromsql and
pg_transform.trftosql respectively (replace the current "pg_cast.castmethod
フィールド..." with "pg_transform.trffromsql フィールド..." and "pg_transform.trftosql
フィールド..." in the two msgstr entries).

Comment on lines 676 to 679
" -f, --force force update to be done even after unclean shutdown or\n"
" if pg_control values had to be guessed\n"
msgstr " -i, --interactive force la mise à jour, y compris un arrêt pas propre ou si les valeurs de pg_control doivent être devinées\n"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Incorrect flag in translated help text (--force translated as --interactive).

Line 678 changes the French help to -i, --interactive, which does not match the source option -f, --force and can misdirect users.

💡 Suggested fix
 msgid ""
 "  -f, --force            force update to be done even after unclean shutdown or\n"
 "                         if pg_control values had to be guessed\n"
-msgstr "  -i, --interactive                force la mise à jour, y compris un arrêt pas propre ou si les valeurs de pg_control doivent être devinées\n"
+msgstr ""
+"  -f, --force            force la mise à jour même après un arrêt non propre\n"
+"                         ou si les valeurs de pg_control ont dû être devinées\n"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
" -f, --force force update to be done even after unclean shutdown or\n"
" if pg_control values had to be guessed\n"
msgstr " -i, --interactive force la mise à jour, y compris un arrêt pas propre ou si les valeurs de pg_control doivent être devinées\n"
msgid ""
" -f, --force force update to be done even after unclean shutdown or\n"
" if pg_control values had to be guessed\n"
msgstr ""
" -f, --force force la mise à jour même après un arrêt non propre\n"
" ou si les valeurs de pg_control ont dû être devinées\n"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/bin/pg_resetwal/po/fr.po` around lines 676 - 679, The French
translation's help string mistakenly changes the option from "-f, --force" to
"-i, --interactive"; update the msgstr to use the correct flag text "-f,
--force" and the matching French description (e.g., "force la mise à jour, y
compris un arrêt pas propre ou si les valeurs de pg_control doivent être
devinées") so the translated help matches the original option names; locate the
incorrect text referencing "-i, --interactive" and replace it with "-f, --force"
in the msgstr.

Comment on lines 767 to 770
msgid " --char-signedness=OPTION set char signedness to \"signed\" or \"unsigned\"\n"
msgstr ""
" --char-signedness=OPTION configure la propriété signedness d'un\\n\n"
" caractère à \"signed\" ou \"unsigned\"\n"
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Accidental escaped newline sequence in translated string.

Line 769 includes \\n in the msgstr body, which will print a literal \n instead of a line break.

💡 Suggested fix
 msgid "      --char-signedness=OPTION     set char signedness to \"signed\" or \"unsigned\"\n"
 msgstr ""
-"      --char-signedness=OPTION     configure la propriété signedness d'un\\n\n"
+"      --char-signedness=OPTION     configure la propriété signedness d'un\n"
 "                                   caractère à \"signed\" ou \"unsigned\"\n"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
msgid " --char-signedness=OPTION set char signedness to \"signed\" or \"unsigned\"\n"
msgstr ""
" --char-signedness=OPTION configure la propriété signedness d'un\\n\n"
" caractère à \"signed\" ou \"unsigned\"\n"
msgid " --char-signedness=OPTION set char signedness to \"signed\" or \"unsigned\"\n"
msgstr ""
" --char-signedness=OPTION configure la propriété signedness d'un\n"
" caractère à \"signed\" ou \"unsigned\"\n"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/bin/pg_resetwal/po/fr.po` around lines 767 - 770, The translated msgstr
contains an escaped backslash-newline sequence ("\\n") that will render a
literal "\n" instead of a line break; edit the msgstr for the msgid shown so
that the sequence is a proper newline escape (i.e. replace the double-escaped
"\\n" with a single "\n" or split into separate quoted lines) in the msgstr
entry to restore the intended line break.

Comment on lines +46 to +70
#: ../libpq-oauth/oauth-curl.c:485 fe-auth-oauth.c:209 fe-auth-oauth.c:271
#: fe-auth-oauth.c:333
#, fuzzy, c-format
#| msgid "field \"%s\" is missing"
msgid "field \"%s\" must be a string"
msgstr "le champ « %s » est manquant"

#: ../libpq-oauth/oauth-curl.c:489
#, fuzzy, c-format
#| msgid "\"%s\" is not a number"
msgid "field \"%s\" must be a number"
msgstr "« %s » n'est pas un nombre"

#: ../libpq-oauth/oauth-curl.c:493
#, fuzzy, c-format
#| msgid "argument of %s must be an array of objects"
msgid "field \"%s\" must be an array of strings"
msgstr "l'argument de %s doit être un tableau d'objets"

#: ../libpq-oauth/oauth-curl.c:498
#, fuzzy, c-format
#| msgid "field \"%s\" is duplicated"
msgid "field \"%s\" has unexpected type"
msgstr "le champ « %s » est dupliqué"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

Fuzzy translations have incorrect meanings.

These fuzzy-marked translations have semantically incorrect French text that doesn't match the English source:

Line English Current French Issue
50-51 "field "%s" must be a string" "le champ « %s » est manquant" Says "is missing" instead of "must be a string"
62-63 "field "%s" must be an array of strings" "...tableau d'objets" Says "array of objects" instead of "array of strings"
68-69 "field "%s" has unexpected type" "le champ « %s » est dupliqué" Says "is duplicated" instead of "has unexpected type"

These should be corrected before release to avoid confusing French-speaking users when debugging OAuth-related issues.

Suggested corrections
 #: ../libpq-oauth/oauth-curl.c:485 fe-auth-oauth.c:209 fe-auth-oauth.c:271
 #: fe-auth-oauth.c:333
-#, fuzzy, c-format
-#| msgid "field \"%s\" is missing"
+#, c-format
 msgid "field \"%s\" must be a string"
-msgstr "le champ « %s » est manquant"
+msgstr "le champ « %s » doit être une chaîne"

 #: ../libpq-oauth/oauth-curl.c:493
-#, fuzzy, c-format
-#| msgid "argument of %s must be an array of objects"
+#, c-format
 msgid "field \"%s\" must be an array of strings"
-msgstr "l'argument de %s doit être un tableau d'objets"
+msgstr "le champ « %s » doit être un tableau de chaînes"

 #: ../libpq-oauth/oauth-curl.c:498
-#, fuzzy, c-format
-#| msgid "field \"%s\" is duplicated"
+#, c-format
 msgid "field \"%s\" has unexpected type"
-msgstr "le champ « %s » est dupliqué"
+msgstr "le champ « %s » a un type inattendu"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
#: ../libpq-oauth/oauth-curl.c:485 fe-auth-oauth.c:209 fe-auth-oauth.c:271
#: fe-auth-oauth.c:333
#, fuzzy, c-format
#| msgid "field \"%s\" is missing"
msgid "field \"%s\" must be a string"
msgstr "le champ « %s » est manquant"
#: ../libpq-oauth/oauth-curl.c:489
#, fuzzy, c-format
#| msgid "\"%s\" is not a number"
msgid "field \"%s\" must be a number"
msgstr "« %s » n'est pas un nombre"
#: ../libpq-oauth/oauth-curl.c:493
#, fuzzy, c-format
#| msgid "argument of %s must be an array of objects"
msgid "field \"%s\" must be an array of strings"
msgstr "l'argument de %s doit être un tableau d'objets"
#: ../libpq-oauth/oauth-curl.c:498
#, fuzzy, c-format
#| msgid "field \"%s\" is duplicated"
msgid "field \"%s\" has unexpected type"
msgstr "le champ « %s » est dupliqué"
#: ../libpq-oauth/oauth-curl.c:485 fe-auth-oauth.c:209 fe-auth-oauth.c:271
#: fe-auth-oauth.c:333
#, c-format
msgid "field \"%s\" must be a string"
msgstr "le champ « %s » doit être une chaîne"
#: ../libpq-oauth/oauth-curl.c:489
#, fuzzy, c-format
#| msgid "\"%s\" is not a number"
msgid "field \"%s\" must be a number"
msgstr "« %s » n'est pas un nombre"
#: ../libpq-oauth/oauth-curl.c:493
#, c-format
msgid "field \"%s\" must be an array of strings"
msgstr "le champ « %s » doit être un tableau de chaînes"
#: ../libpq-oauth/oauth-curl.c:498
#, c-format
msgid "field \"%s\" has unexpected type"
msgstr "le champ « %s » a un type inattendu"
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/interfaces/libpq/po/fr.po` around lines 46 - 70, Update the fuzzy French
translations so their meanings match the English msgids: replace msgstr for
msgid "field \"%s\" must be a string" (currently "le champ « %s » est manquant")
with a French string meaning "must be a string" (e.g., "le champ « %s » doit
être une chaîne"), change msgstr for msgid "field \"%s\" must be an array of
strings" (currently "...tableau d'objets") to indicate "array of strings" (e.g.,
"le champ « %s » doit être un tableau de chaînes"), and fix msgstr for msgid
"field \"%s\" has unexpected type" (currently "le champ « %s » est dupliqué") to
convey unexpected type (e.g., "le champ « %s » a un type inattendu"); ensure to
remove the fuzzy flag after correcting the translations.

Copy link
Copy Markdown
Contributor

@OreoYang OreoYang left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please synchronize and update the PACKAGE_IVORYSQL_VERSION='5.3' and ivorysql_version = '5.3', referring to commit messages e56c656 and 8907d96.

@hs-liuxh
Copy link
Copy Markdown
Collaborator Author

hs-liuxh commented Mar 3, 2026

Please synchronize and update the PACKAGE_IVORYSQL_VERSION='5.3' and ivorysql_version = '5.3', referring to commit messages e56c656 and 8907d96.

Thanks for your review. I have updated the IvorySQL version to 5.3 in the configure, configure.ac and meson.build files.

@jiaoshuntian jiaoshuntian self-requested a review March 3, 2026 02:44
@gaoxueyu gaoxueyu merged commit 4dfba1d into IvorySQL:IVORY_REL_5_STABLE Mar 3, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.