Skip to content

Conversation

hopebo
Copy link
Contributor

@hopebo hopebo commented Aug 16, 2025

Description

There are multiple conflicts in this merge.

  1. postgres/postgres@fe29b2a
unmerged   src/backend/parser/gram.y
@@@ -14162,7 -14091,14 +14162,18 @@@ xmltable_column_option_list

  xmltable_column_option_el:
              IDENT b_expr
++<<<<<<< HEAD
 +                { $$ = makeDefElem(downcaseIfTsqlAndCaseInsensitive($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);
+                 }
++>>>>>>> 2f48b4f075f (Fix Assert failure in XMLTABLE parser)
              | DEFAULT b_expr
                  { $$ = makeDefElem("default", $2, @1); }
              | NOT NULL_P

Solution Adapt Babelfish changes to new community codes.
2. postgres/postgres@91ad1bd

unmerged   src/include/commands/trigger.h
@@@ -224,9 -206,15 +224,21 @@@ extern void ExecBSDeleteTriggers(EStat
  extern void ExecASDeleteTriggers(EState *estate,
                                   ResultRelInfo *relinfo,
                                   TransitionCaptureState *transition_capture);
++<<<<<<< HEAD
 +extern IOTState ExecISDeleteTriggers(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);
++>>>>>>> 91ad1bdef8e (Fix concurrent update trigger issues with MERGE in a CTE.)
  extern bool ExecBRDeleteTriggers(EState *estate,
                                   EPQState *epqstate,
                                   ResultRelInfo *relinfo,
@@@ -249,9 -237,15 +261,21 @@@ extern void ExecBSUpdateTriggers(EStat
  extern void ExecASUpdateTriggers(EState *estate,
                                   ResultRelInfo *relinfo,
                                   TransitionCaptureState *transition_capture);
++<<<<<<< HEAD
 +extern IOTState ExecISUpdateTriggers(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);
++>>>>>>> 91ad1bdef8e (Fix concurrent update trigger issues with MERGE in a CTE.)
  extern bool ExecBRUpdateTriggers(EState *estate,
                                   EPQState *epqstate,
                                   ResultRelInfo *relinfo,

Solution Keep both declarations. Additionally, modify the parameter of function call GetTupleForTrigger by ExecIRDeleteTriggersTSQL and ExecIRUpdateTriggersTSQL to adapt to the parameter declaration changes for GetTupleForTrigger.
3. postgres/postgres@a85edda

unmerged src/include/executor/executor.h
@@ -227,7 +227,12 @@ extern void standard_ExecutorEnd(QueryDesc *queryDesc);
 extern void ExecutorRewind(QueryDesc *queryDesc);
 extern bool ExecCheckPermissions(List *rangeTable,
                                  List *rteperminfos, bool ereport_on_violation);
+<<<<<<< HEAD
+/* Wrapper around ExecCheckOneRelPerms */
+extern bool ExecCheckOneRelPerms_wrapper(RTEPermissionInfo *perminfo);
+=======
 extern bool ExecCheckOneRelPerms(RTEPermissionInfo *perminfo);
+>>>>>>> a85eddab23f (Fix security checks in selectivity estimation functions.)
 extern void CheckValidResultRel(ResultRelInfo *resultRelInfo, CmdType operation,
                                 List *mergeActions);

Solution Remove the original function ExecCheckOneRelPerms_wrapper, which is now useless. Also make changes to Babelfish extension to call the new function. babelfish-for-postgresql/babelfish_extensions#4023
4. postgres/postgres@575f54d

unmerged   src/bin/pg_dump/pg_backup.h
@@@ -157,7 -157,8 +157,12 @@@ typedef struct _restoreOption
      int           enable_row_security;
      int           sequence_data;  /* dump sequence data even in schema-only mode */
      int           binary_upgrade;
++<<<<<<< HEAD
 +    bool      babelfish_db; /* is this a Babelfish database? */
++=======
+
+     char     *restrict_key;
++>>>>>>> 575f54d4cee (Restrict psql meta-commands in plain-text dumps.)
  } RestoreOptions;

  typedef struct _dumpOptions
unmerged   src/bin/pg_dump/pg_backup.h
@@@ -157,7 -157,8 +157,12 @@@ typedef struct _restoreOption
      int           enable_row_security;
      int           sequence_data;  /* dump sequence data even in schema-only mode */
      int           binary_upgrade;
++<<<<<<< HEAD
 +    bool      babelfish_db; /* is this a Babelfish database? */
++=======
+
+     char     *restrict_key;
++>>>>>>> 575f54d4cee (Restrict psql meta-commands in plain-text dumps.)
  } RestoreOptions;

  typedef struct _dumpOptions
  unmerged   src/bin/pg_dump/pg_dump.c
@@@ -453,7 -450,8 +453,12 @@@ main(int argc, char **argv
          {"sync-method", required_argument, NULL, 15},
          {"filter", required_argument, NULL, 16},
          {"exclude-extension", required_argument, NULL, 17},
++<<<<<<< HEAD
 +        {"bbf-database-name", required_argument, NULL, 30},
++=======
+         {"restrict-key", required_argument, NULL, 25},
+
++>>>>>>> 575f54d4cee (Restrict psql meta-commands in plain-text dumps.)
          {NULL, 0, NULL, 0}
      };
@@@ -1067,7 -1072,7 +1090,11 @@@
      ropt->enable_row_security = dopt.enable_row_security;
      ropt->sequence_data = dopt.sequence_data;
      ropt->binary_upgrade = dopt.binary_upgrade;
++<<<<<<< HEAD
 +    ropt->babelfish_db = isBabelfishDatabase(fout);
++=======
+     ropt->restrict_key = dopt.restrict_key ? pg_strdup(dopt.restrict_key) : NULL;
++>>>>>>> 575f54d4cee (Restrict psql meta-commands in plain-text dumps.)
unmerged   src/bin/pg_dump/pg_dumpall.c
@@@ -179,7 -180,7 +181,11 @@@ 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},
++<<<<<<< HEAD
 +        {"bbf-database-name", required_argument, NULL, 30},
++=======
+         {"restrict-key", required_argument, NULL, 9},
++>>>>>>> 575f54d4cee (Restrict psql meta-commands in plain-text dumps.)

          {NULL, 0, NULL, 0}
      };
  @@@ -367,8 -368,10 +373,15 @@@
                  read_dumpall_filters(optarg, &database_exclude_patterns);
                  break;

++<<<<<<< HEAD
 +            case 30:          /* Babelfish virtual database name */
 +                bbf_db_name = pg_strdup(optarg);
++=======
+             case 9:
+                 restrict_key = pg_strdup(optarg);
+                 appendPQExpBufferStr(pgdumpopts, " --restrict-key ");
+                 appendShellString(pgdumpopts, optarg);
++>>>>>>> 575f54d4cee (Restrict psql meta-commands in plain-text dumps.)
                  break;

              default:
  unmerged   src/bin/psql/command.c
@@@ -132,7 -134,8 +134,12 @@@ static backslashResult exec_command_sf_
  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);
++<<<<<<< HEAD
 +static backslashResult exec_command_tsql(PsqlScanState scan_state, bool active_branch);
++=======
+ static backslashResult exec_command_unrestrict(PsqlScanState scan_state, bool active_branch,
+                                                const char *cmd);
++>>>>>>> 575f54d4cee (Restrict psql meta-commands in plain-text dumps.)
  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,
@@@ -406,8 -424,8 +428,13 @@@ 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);
++<<<<<<< HEAD
 +    else if (strcmp(cmd, "tsql") == 0)
 +        status = exec_command_tsql(scan_state, active_branch);
++=======
+     else if (strcmp(cmd, "unrestrict") == 0)
+         status = exec_command_unrestrict(scan_state, active_branch, cmd);
++>>>>>>> 575f54d4cee (Restrict psql meta-commands in plain-text dumps.)
      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)
@@@ -2628,37 -2675,43 +2684,76 @@@ exec_command_timing(PsqlScanState scan_
  }

  /*
++<<<<<<< HEAD
 + * \tsql - enable/disable TSQL features (currently changes
 + * end-of-batch indicator from ';' to GO)
 + */
 +static backslashResult
 +exec_command_tsql(PsqlScanState scan_state, bool active_branch)
 +{
 +    bool      success = true;
 +
 +    if (active_branch)
 +    {
 +        char     *opt = psql_scan_slash_option(scan_state,
 +                                                 OT_NORMAL, NULL, false);
 +
 +        if (opt)
 +            success = ParseVariableBool(opt, "\\tsql", &pset.tsql);
 +        else
 +            pset.tsql = !pset.tsql;
 +
 +        if (!pset.quiet)
 +        {
 +            if (pset.tsql)
 +                puts(_("TSQL features are enabled."));
 +            else
 +                puts(_("TSQL features are disabled."));
 +        }
 +        free(opt);
++=======
+  * \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;
+         }
++>>>>>>> 575f54d4cee (Restrict psql meta-commands in plain-text dumps.)
      }
      else
          ignore_slash_options(scan_state);

++<<<<<<< HEAD
 +    return success ? PSQL_CMD_SKIP_LINE : PSQL_CMD_ERROR;
++=======
+     return PSQL_CMD_SKIP_LINE;
+ ++>>>>>>> 575f54d4cee (Restrict psql meta-commands in plain-text dumps.)
  }

Solution Keep both variables and functions.

Check List

  • Commits are signed per the DCO using --signoff

By submitting this pull request, I confirm that my contribution is under the terms of the PostgreSQL license, and grant any person obtaining a copy of the contribution permission to relicense all or a portion of my contribution to the PostgreSQL License solely to contribute all or a portion of my contribution to the PostgreSQL open source project.

For more information on following Developer Certificate of Origin and signing off your commits, please check here.

danielgustafsson and others added 30 commits August 15, 2025 11:37
The title for AT TIME ZONE and AT LOCAL was accidentally wrapping the
"and" in the <literal> tag.  Backpatch to v17 where it was introduced
in 97957fdbaa42.

Author: Noboru Saito <[email protected]>
Reviewed-by: Daniel Gustafsson <[email protected]>
Reviewed-by: Tatsuo Ishii <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/CAAM3qn+7QUWW9R6_YwPKXmky0xGE4n63U3EsxZeWE_QtogeU8g@mail.gmail.com
Backpatch-through: 17
(cherry picked from commit f2d5b571f352bd57e5d7f14ae9386e1ec1be19df)
Right now there's only one caller, so that this is merely
an exercise in shoving code from one module to another,
but there will shortly be another one.  It seems better to
avoid having two copies of this highly-subject-to-change test.

Back-patch to v15, where we first introduced some tests that
don't work with LibreSSL.

Reported-by: Thomas Munro <[email protected]>
Author: Tom Lane <[email protected]>
Reviewed-by: Daniel Gustafsson <[email protected]>
Discussion: https://postgr.es/m/CA+hUKG+fLqyweHqFSBcErueUVT0vDuSNWui-ySz3+d_APmq7dw@mail.gmail.com
Backpatch-through: 15
(cherry picked from commit 976a8c2170f11bdb574a68d009d353057377528e)
Presently, LibreSSL does not have working support for RSA-PSS,
so disable that test.  Per discussion at
https://marc.info/?l=libressl&m=174664225002441&w=2
they do intend to fix this, but it's a ways off yet.

Reported-by: Thomas Munro <[email protected]>
Author: Tom Lane <[email protected]>
Reviewed-by: Daniel Gustafsson <[email protected]>
Discussion: https://postgr.es/m/CA+hUKG+fLqyweHqFSBcErueUVT0vDuSNWui-ySz3+d_APmq7dw@mail.gmail.com
Backpatch-through: 15
(cherry picked from commit 3007fee7f2924e76748e81d7fd86cdf24a98a520)
This must be "return MemoryContextAllocationFailure(context, size, flags)"
instead.  The effect of this oversight is that if we got a malloc
failure right here, the code would act as though MCXT_ALLOC_NO_OOM
had been specified, whether it was or not.  That would likely lead
to a null-pointer-dereference crash at the unsuspecting call site.

Noted while messing with a patch to improve our Valgrind leak
detection support.  Back-patch to v17 where this code came in.

(cherry picked from commit a05cf22e0540e55fb34e26e6e98a8a76b76d1cbd)
The comment describes the order in which fields are sent, and it had one
of the fields in the wrong place.

This has been wrong since e6dbcb7 (2008), so backpatch all the way
back.

Author: Emre Hasegeli <[email protected]>
Discussion: https://postgr.es/m/CAE2gYzzf38bR_R=izhpMxAmqHXKeM5ajkmukh4mNs_oXfxcMCA@mail.gmail.com
(cherry picked from commit e65d8be042f743a7a839ec8df5c9005b8811d06f)
The documentation for log_check() had the parameters in the wrong
order.  Also while there, rename %parameters to %params to better
documentation for similar functions which use %params.  Backpatch
down to v14 where this was introduced.

Author: Daniel Gustafsson <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/[email protected]
Backpatch-through: 14
(cherry picked from commit c5639196caf7f65e0f1a57124e2412ebc923ab3c)
BABELFISH-CONFLICT: see Postgres community repo for original commit

In an XMLTABLE expression, columns can be marked NOT NULL, and the
parser internally fabricates an option named "is_not_null" to
represent this.  However, the parser also allows users to specify
arbitrary option names.  This creates a conflict: a user can
explicitly use "is_not_null" as an option name and assign it a
non-Boolean value, which violates internal assumptions and triggers an
assertion failure.

To fix, this patch checks whether a user-supplied name collides with
the internally reserved option name and raises an error if so.
Additionally, the internal name is renamed to "__pg__is_not_null" to
further reduce the risk of collision with user-defined names.

Reported-by: Евгений Горбанев <[email protected]>
Author: Richard Guo <[email protected]>
Reviewed-by: Alvaro Herrera <[email protected]>
Discussion: https://postgr.es/m/[email protected]
Backpatch-through: 15
(cherry picked from commit 2f48b4f075fb6672e1acbc3707cb0ef82030f2bf)
This aligns the copyright and legal notice wordig with commit
a233a603bab8 and pgweb commit 2d764dbc083ab8.  Backpatch down
to all supported versions.

Author: Daniel Gustafsson <[email protected]>
Reviewed-by: Dave Page <[email protected]>
Reviewed-by: Tom Lane <[email protected]>
Discussion: https://postgr.es/m/[email protected]
Backpatch-through: 13
(cherry picked from commit 83dbe8aacdbdb3d297b113d0ccb5c0ab1e699802)
Per the letter of the C11 standard, one must #define
__STDC_WANT_LIB_EXT1__ as 1 before including <string.h> in order to
have access to memset_s().  It appears that many platforms are lenient
about this, because we weren't doing it and yet the code appeared to
work anyway.  But we now find that with -std=c11, macOS is strict and
doesn't declare memset_s, leading to compile failures since we try to
use it anyway.  (Given the lack of prior reports, perhaps this is new
behavior in the latest SDK?  No matter, we're clearly in the wrong.)

In addition to the immediate problem, which could be fixed merely by
adding the needed #define to explicit_bzero.c, it seems possible that
our configure-time probe for memset_s() could fail in case a platform
implements the function in some odd way due to this spec requirement.
This concern can be fixed in largely the same way that we dealt with
strchrnul() in 6da2ba1d8: switch to using a declaration-based
configure probe instead of a does-it-link probe.

Back-patch to v13 where we started using memset_s().

Reported-by: Lakshmi Narayana Velayudam <[email protected]>
Author: Tom Lane <[email protected]>
Discussion: https://postgr.es/m/CAA4pTnLcKGG78xeOjiBr5yS7ZeE-Rh=FaFQQGOO=nPzA1L8yEA@mail.gmail.com
Backpatch-through: 13
(cherry picked from commit 5355a2400e847b1a7e7a3d9eea9516588d0fad91)
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 to avoid retreating
confirm_flush LSN.

Diagnosed-by: Zhijie Hou <[email protected]>
Author: shveta malik <[email protected]>
Reviewed-by: Amit Kapila <[email protected]>
Reviewed-by: Dilip Kumar <[email protected]>
Tested-by: Nisha Moond <[email protected]>
Backpatch-through: 13
Discussion: https://postgr.es/m/CAJpy0uDZ29P=BYB1JDWMCh-6wXaNqMwG1u1mB4=10Ly0x7HhwQ@mail.gmail.com
Discussion: https://postgr.es/m/OS0PR01MB57164AB5716AF2E477D53F6F9489A@OS0PR01MB5716.jpnprd01.prod.outlook.com
(cherry picked from commit 7318f241d29c0b90e0b8b7e39ebd1914f68fd37a)
In the grammar, <expr> is a c_expr, which accepts only a limited set
of integer literals and simple expressions without parens. The
deparsing logic didn't quite match the grammar rule, and failed to use
parens e.g. for "5::bigint".

To fix, always surround the expression with parens. Would be nice to
omit the parens in simple cases, but unfortunately it's non-trivial to
detect such simple cases. Even if the expression is a simple literal
123 in the original query, after parse analysis it becomes a FuncExpr
with COERCE_IMPLICIT_CAST rather than a simple Const.

Reported-by: yonghao lee
Backpatch-through: 13
Discussion: https://www.postgresql.org/message-id/[email protected]
(cherry picked from commit 54c05292b1ffc8d7ad9305d224225161e4d3d412)
Invalid indexes are suffixed with "_ccnew" or "_ccold".  The
documentation missed to mention the initial underscore.
ChooseRelationName() may also append an extra number if indexes with a
similar name already exist; let's add a note about that too.

Author: Alec Cozens <[email protected]>
Discussion: https://postgr.es/m/174733277404.1455388.11471370288789479593@wrigleys.postgresql.org
Backpatch-through: 13
(cherry picked from commit b648a3369bccc12fd99eda27bc55798ffa3ab9bc)
Commit 29f7ce6fe7 added another view that needs adjustment in the
cross-version upgrade test. This should fix the XversionUpgrade
failures in the buildfarm.

Backpatch-through: 16
Discussion: https://www.postgresql.org/message-id/[email protected]
(cherry picked from commit a4da7b0cfabd1c72d2efb0148d9a41f34a9e2b78)
Since commit 8b1dccd, the PREPARE TRANSACTION WAL record includes
information about dropped statistics entries. However, the WAL resource
manager description function for PREPARE TRANSACTION record failed to
parse this information correctly and always assumed there were
no such entries.

As a result, for example, pg_waldump could not display the dropped
statistics entries stored in PREPARE TRANSACTION records.

The root cause was that ParsePrepareRecord() did not set the number of
statistics entries to drop on commit or abort. These values remained
zero-initialized and were never updated from the parsed record.

This commit fixes the issue by properly setting those values during parsing.
With this fix, pg_waldump can now correctly report dropped statistics
entries in PREPARE TRANSACTION records.

Back-patch to v15, where commit 8b1dccd was introduced.

Author: Daniil Davydov <[email protected]>
Reviewed-by: Fujii Masao <[email protected]>
Discussion: https://postgr.es/m/CAJDiXgh-6Epb2XiJe4uL0zF-cf0_s_7Lw1TfEHDMLzYjEmfGOw@mail.gmail.com
Backpatch-through: 15
(cherry picked from commit 11efaaffac87e7ba4aedbbb612d2eddc37fabfc4)
xmltotext_with_options sometimes tries to replace the existing
root node of a libxml2 document.  In that case xmlDocSetRootElement
will unlink and return the old root node; if we fail to free it,
it's leaked for the remainder of the session.  The amount of memory
at stake is not large, a couple hundred bytes per occurrence, but
that could still become annoying in heavy usage.

Our only other xmlDocSetRootElement call is not at risk because
it's working on a just-created document, but let's modify that
code too to make it clear that it's dependent on that.

Author: Tom Lane <[email protected]>
Reviewed-by: Jim Jones <[email protected]>
Discussion: https://postgr.es/m/[email protected]
Backpatch-through: 16
(cherry picked from commit 20bae0690322a00402b84119ddf2f959d24a211a)
If the inner allocation call returns NULL, we should restore the
previous state and return NULL.  Previously this code pfree'd
the old chunk anyway, which is surely wrong.

Also, make it call MemoryContextAllocationFailure rather than
summarily returning NULL.  The fact that we got control back from the
inner call proves that MCXT_ALLOC_NO_OOM was passed, so this change
is just cosmetic, but someday it might be less so.

This is just a latent bug at present: AFAICT no in-core callers use
this function at all, let alone call it with MCXT_ALLOC_NO_OOM.
Still, it's the kind of bug that might bite back-patched code pretty
hard someday, so let's back-patch to v17 where the bug was introduced
(by commit 743112a2e).

Author: Tom Lane <[email protected]>
Reviewed-by: Andres Freund <[email protected]>
Discussion: https://postgr.es/m/[email protected]
Backpatch-through: 17
(cherry picked from commit ac3afd1d00795656dc08431d2bbebf7eccfb5823)
PgStat_StatTabEntry and AutoVacOpts structs were leaked until
the end of the autovacuum worker's run, which is bad news if
there are a lot of relations in the database.

Note: pfree'ing the PgStat_StatTabEntry structs here seems a bit
risky, because pgstat_fetch_stat_tabentry_ext does not guarantee
anything about whether its result is long-lived.  It appears okay
so long as autovacuum forces PGSTAT_FETCH_CONSISTENCY_NONE, but
I think that API could use a re-think.

Also ensure that the VacuumRelation structure passed to
vacuum() is in recoverable storage.

Back-patch to v15 where we started to manage table statistics
this way.  (The AutoVacOpts leakage is probably older, but
I'm not excited enough to worry about just that part.)

Author: Tom Lane <[email protected]>
Reviewed-by: Andres Freund <[email protected]>
Discussion: https://postgr.es/m/[email protected]
Backpatch-through: 15
(cherry picked from commit cd3064f9898c8753bc50983b47dbdc7390cdfb83)
The documentation for exported snapshots in logical decoding previously
stated that snapshot creation may fail on a hot standby. This is no longer
accurate, as snapshot exporting on standbys has been supported since
PostgreSQL 10. This commit removes the outdated description.

Additionally, the docs referred to the NOEXPORT_SNAPSHOT option to
suppress snapshot exporting in CREATE_REPLICATION_SLOT. However,
since PostgreSQL 15, NOEXPORT_SNAPSHOT is considered legacy syntax
and retained only for backward compatibility. This commit updates
the documentation for v15 and later to use the modern equivalent:
SNAPSHOT 'nothing'. The older syntax is preserved in documentation for
v14 and earlier.

Back-patched to all supported branches.

Reported-by: Kevin K Biju <[email protected]>
Author: Fujii Masao <[email protected]>
Reviewed-by: Kevin K Biju <[email protected]>
Discussion: https://postgr.es/m/[email protected]
Backpatch-through: 13
(cherry picked from commit 90558dbf54830aa632ff880f65c7eb13f0ca7ec6)
The test did not wait for all the subscriptions to have caught up when
dropping the subscription "tab_copy".  In a slow environment, it could
be possible for the replay of the COMMIT PREPARED transaction "mygid"
to not be confirmed yet, causing one prepared transaction to be left
around before moving to the next steps of the test.

One failure noticed is a transaction found in pg_prepared_xacts for the
cases where copy_data = false and two_phase = true, but there should be
none after dropping the subscription.

As an extra safety measure, a check is added before dropping the
subscription, scanning pg_prepared_xacts to make sure that no prepared
transactions are left once both subscriptions have caught up.

Issue introduced by a8fd13c, fixing a problem similar to
eaf5321.

Per buildfarm member kestrel.

Author: Vignesh C <[email protected]>
Reviewed-by: Amit Kapila <[email protected]>
Discussion: https://postgr.es/m/CALDaNm329QaZ+bwU--bW6GjbNSZ8-38cDE8QWofafub7NV67oA@mail.gmail.com
Backpatch-through: 15
(cherry picked from commit 6ea812f4dc634af01feb06fc3da45d53f5a1ec83)
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 an expression like [[:alpha:]%_], the
logic replaced the placeholders '_' and '%' but it should not.

This commit fixes the conversion logic by tracking the nesting level of
square brackets marking character class areas, while considering that
in expressions like []] or [^]] the first closing square bracket is a
regular character.  Multiple tests are added to show how the conversions
should or should not apply applied while in a character class area, with
specific cases added for all the characters converted outside character
classes like an opening parenthesis '(', dollar sign '$', etc.

Author: Laurenz Albe <[email protected]>
Reviewed-by: Tom Lane <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/[email protected]
Backpatch-through: 13
(cherry picked from commit e3ffc3e91d04579240fb54a96f9059b246488dce)
As written, the test was throwing an error because of an unbalanced
parenthesis.  The regex used in the test is adjusted to not fail and to
test the case of an opening parenthesis in a character class after some
nested square brackets.

Oversight in d46911e584d4.

Discussion: https://postgr.es/m/[email protected]
(cherry picked from commit a3c6d92f3cb3e49bde59e52268e2d74db05d7789)
pg_stat_statements anticipates that certain constant locations may be
recorded multiple times and attempts to avoid calculating a length for
these locations in fill_in_constant_lengths().

However, during generate_normalized_query() where normalized query
strings are generated, these locations are not excluded from
consideration.  This could increment the parameter number counter for
every recorded occurrence at such a location, leading to an incorrect
normalization in certain cases with gaps in the numbers reported.

For example, take this query:
SELECT WHERE '1' IN ('2'::int, '3'::int::text)
Before this commit, it would be normalized like that, with gaps in the
parameter numbers:
SELECT WHERE $1 IN ($3::int, $4::int::text)
However the correct, less confusing one should be like that:
SELECT WHERE $1 IN ($2::int, $3::int::text)

This commit fixes the computation of the parameter numbers to track the
number of constants replaced with an $n by a separate counter instead of
the iterator used to loop through the list of locations.

The underlying query IDs are not changed, neither are the normalized
strings for existing PGSS hash entries.  New entries with fresh
normalized queries would automatically get reshaped based on the new
parameter numbering.

Issue discovered while discussing a separate problem for HEAD, but this
affects all the stable branches.

Author: Sami Imseih <[email protected]>
Discussion: https://postgr.es/m/CAA5RZ0tzxvWXsacGyxrixdhy3tTTDfJQqxyFBRFh31nNHBQ5qA@mail.gmail.com
Backpatch-through: 13
(cherry picked from commit 290e8ab32ac55a27cd3bc14cb80c8e2f3d023901)
An assertion test added in commit 049ef33 could fail when pg_prewarm()
was called on objects without storage, such as partitioned tables.
This resulted in the following failure in assert-enabled builds:

    Failed Assert("RelFileNumberIsValid(rlocator.relNumber)")

Note that, in non-assert builds, pg_prewarm() just failed with an error
in that case, so there was no ill effect in practice.

This commit fixes the issue by having pg_prewarm() raise an error early
if the specified object has no storage. This approach is similar to
the fix in commit 4623d7144 for pg_freespacemap.

Back-patched to v17, where the issue was introduced.

Author: Masahiro Ikeda <[email protected]>
Reviewed-by: Dilip Kumar <[email protected]>
Reviewed-by: Richard Guo <[email protected]>
Reviewed-by: Fujii Masao <[email protected]>
Discussion: https://postgr.es/m/[email protected]
Backpatch-through: 17
(cherry picked from commit b64c585fde77206ee54747f31035dde56eee6bf9)
If we hit out-of-memory between creating the PGconn and inserting
it into dblink's hashtable, we'd lose track of the PGconn, which
is quite bad since it represents a live connection to a remote DB.
Fix by rearranging things so that we create the hashtable entry
first.

Also reduce the number of states we have to deal with by getting rid
of the separately-allocated remoteConn object, instead allocating it
in-line in the hashtable entries.  (That incidentally removes a
session-lifespan memory leak observed in the regression tests.)

There is an apparently-irreducible remaining OOM hazard, which
is that if the connection fails at the libpq level (ie it's
CONNECTION_BAD) then we have to pstrdup the PGconn's error message
before we can release it, and theoretically that could fail.  However,
in such cases we're only leaking memory not a live remote connection,
so I'm not convinced that it's worth sweating over.

This is a pretty low-probability failure mode of course, but losing
a live connection seems bad enough to justify back-patching.

Author: Tom Lane <[email protected]>
Reviewed-by: Matheus Alcantara <[email protected]>
Discussion: https://postgr.es/m/[email protected]
Backpatch-through: 13
(cherry picked from commit e20b3256ae468cb5979e861a1d6886baa4c4d42e)
Commits 53af9491a043 and 2d5fe514052a fixed a number of problems with
foreign keys that reference partitioned tables, and a query to detect
already broken FKs was supplied with the release notes for 17.1, 16.5,
15.9, 14.14, 13.17.  However, that query has a bug that causes it to
wrongly report self-referential foreign keys even when they are correct,
so if the user was to drop and rebuild the FKs as indicated, the query
would continue to report them as needing to be repaired.  Here we fix
the query to not have that problem.

Reported-by: Paul Foerster <[email protected]>
Discussion: https://postgr.es/m/[email protected]
Backpatch-through: 13-17
(cherry picked from commit 50a8959cd50bb346b2479ac66bb4f0f474409c51)
…able more.

Previously, XactLockTableWait() and ConditionalXactLockTableWait() could enter
a non-interruptible loop when they successfully acquired a lock on a transaction
but the transaction still appeared to be running. Since this loop continued
until the transaction completed, it could result in long, uninterruptible waits.

Although this scenario is generally unlikely since XactLockTableWait() and
ConditionalXactLockTableWait() can basically acquire a transaction lock
only when the transaction is not running, it can occur in a hot standby.
In such cases, the transaction may still appear active due to
the KnownAssignedXids list, even while no lock on the transaction exists.
For example, this situation can happen when creating a logical replication
slot on a standby.

The cause of the non-interruptible loop was the absence of CHECK_FOR_INTERRUPTS()
within it. This commit adds CHECK_FOR_INTERRUPTS() to the loop in both functions,
ensuring they can be interrupted safely.

Back-patch to all supported branches.

Author: Kevin K Biju <[email protected]>
Reviewed-by: Fujii Masao <[email protected]>
Discussion: https://postgr.es/m/CAM45KeELdjhS-rGuvN=ZLJ_asvZACucZ9LZWVzH7bGcD12DDwg@mail.gmail.com
Backpatch-through: 13
(cherry picked from commit 24c5ad5be46dcaa1ba573f520cf366939a6cae77)
Our GSSAPI code only allows packet sizes up to 16kB.  However it
emerges that during authentication, larger packets might be needed;
various authorities suggest 48kB or 64kB as the maximum packet size.
This limitation caused login failure for AD users who belong to many
AD groups.  To add insult to injury, we gave an unintelligible error
message, typically "GSSAPI context establishment error: The routine
must be called again to complete its function: Unknown error".

As noted in code comments, the 16kB packet limit is effectively a
protocol constant once we are doing normal data transmission: the
GSSAPI code splits the data stream at those points, and if we change
the limit then we will have cross-version compatibility problems
due to the receiver's buffer being too small in some combinations.
However, during the authentication exchange the packet sizes are
not determined by us, but by the underlying GSSAPI library.  So we
might as well just try to send what the library tells us to.
An unpatched recipient will fail on a packet larger than 16kB,
but that's not worse than the sender failing without even trying.
So this doesn't introduce any meaningful compatibility problem.

We still need a buffer size limit, but we can easily make it be
64kB rather than 16kB until transport negotiation is complete.
(Larger values were discussed, but don't seem likely to add
anything.)

Reported-by: Chris Gooch <[email protected]>
Fix-suggested-by: Jacob Champion <[email protected]>
Author: Tom Lane <[email protected]>
Reviewed-by: Jacob Champion <[email protected]>
Discussion: https://postgr.es/m/DS0PR22MB5971A9C8A3F44BCC6293C4DABE99A@DS0PR22MB5971.namprd22.prod.outlook.com
Backpatch-through: 13
(cherry picked from commit 8b0aa7a6b723174cfa6f1a5e2a03217dba9f6e6e)
postgres_fdw tries to use PG_TRY blocks to ensure that it will
eventually free the PGresult created by the remote modify command.
However, it's fundamentally impossible for this scheme to work
reliably when there's RETURNING data, because the query could fail
in between invocations of postgres_fdw's DirectModify methods.
There is at least one instance of exactly this situation in the
regression tests, and the ensuing session-lifespan leak is visible
under Valgrind.

We can improve matters by using a memory context reset callback
attached to the ExecutorState context.  That ensures that the
PGresult will be freed when the ExecutorState context is torn
down, even if control never reaches postgresEndDirectModify.

I have little faith that there aren't other potential PGresult
leakages in the backend modules that use libpq.  So I think it'd
be a good idea to apply this concept universally by creating
infrastructure that attaches a reset callback to every PGresult
generated in the backend.  However, that seems too invasive for
v18 at this point, let alone the back branches.  So for the
moment, apply this narrow fix that just makes DirectModify safe.
I have a patch in the queue for the more general idea, but it
will have to wait for v19.

Author: Tom Lane <[email protected]>
Reviewed-by: Matheus Alcantara <[email protected]>
Discussion: https://postgr.es/m/[email protected]
Backpatch-through: 13
(cherry picked from commit 9339c85afc913752884858b28cca99b8f42a389c)
A few places that access system catalogs don't set up an active
snapshot before potentially accessing their TOAST tables.  To fix,
push an active snapshot just before each section of code that might
require accessing one of these TOAST tables, and pop it shortly
afterwards.  While at it, this commit adds some rather strict
assertions in an attempt to prevent such issues in the future.

Commit 16bf24e0e4 recently removed pg_replication_origin's TOAST
table in order to fix the same problem for that catalog.  On the
back-branches, those bugs are left in place.  We cannot easily
remove a catalog's TOAST table on released major versions, and only
replication origins with extremely long names are affected.  Given
the low severity of the issue, fixing older versions doesn't seem
worth the trouble of significantly modifying the patch.

Also, on v13 and v14, the aforementioned strict assertions have
been omitted because commit 2776922, which added
HaveRegisteredOrActiveSnapshot(), was not back-patched.  While we
could probably back-patch it now, I've opted against it because it
seems unlikely that new TOAST snapshot issues will be introduced in
the oldest supported versions.

Reported-by: Alexander Lakhin <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Discussion: https://postgr.es/m/18127-fe54b6a667f29658%40postgresql.org
Discussion: https://postgr.es/m/18309-c0bf914950c46692%40postgresql.org
Discussion: https://postgr.es/m/ZvMSUPOqUU-VNADN%40nathan
Backpatch-through: 13
(cherry picked from commit fe8ea7a2a89342ecc36a054b2f328c4d8e56f9ae)
When a MERGE's target table is the parent of an inheritance tree, any
INSERT actions insert into the parent table using ModifyTableState's
rootResultRelInfo. However, there are two bugs in the way this is
initialized:

1. ExecInitMerge() incorrectly uses a different ResultRelInfo entry
from ModifyTableState's resultRelInfo array to build the insert
projection, which may not be compatible with rootResultRelInfo.

2. ExecInitModifyTable() does not fully initialize rootResultRelInfo.
Specifically, ri_WithCheckOptions, ri_WithCheckOptionExprs,
ri_returningList, and ri_projectReturning are not initialized.

This can lead to crashes, or incorrect query results due to failing to
check WCO's or process the RETURNING list for INSERT actions.

Fix both these bugs in ExecInitMerge(), noting that it is only
necessary to fully initialize rootResultRelInfo if the MERGE has
INSERT actions and the target table is a plain inheritance parent.

Backpatch to v15, where MERGE was introduced.

Reported-by: Andres Freund <[email protected]>
Author: Dean Rasheed <[email protected]>
Reviewed-by: Jian He <[email protected]>
Reviewed-by: Tender Wang <[email protected]>
Discussion: https://postgr.es/m/4rlmjfniiyffp6b3kv4pfy4jw3pciy6mq72rdgnedsnbsx7qe5@j5hlpiwdguvc
Backpatch-through: 15
(cherry picked from commit ab52f6b5bf4d6aef4a4412bbefb7a3e9ca65017b)
petere and others added 21 commits August 15, 2025 14:04
Fix commit f295494d338 to use consistent four-space indentation for
verbose messages.

(cherry picked from commit 930e1faec54e9ca63d9d325167ef09fa09b658ff)
Recent ICU versions have added U_SHOW_CPLUSPLUS_HEADER_API, and we need
to set this to zero as well to hide the ICU C++ APIs from pg_locale.h

Per discussion, we want cpluspluscheck to work cleanly in backbranches,
so backpatch both this and its predecessor commit ed26c4e25a4 to all
supported versions.

Reported-by: Tom Lane <[email protected]>
Discussion: https://postgr.es/m/1115793.1754414782%40sss.pgh.pa.us
Backpatch-through: 13
(cherry picked from commit 21ae8fc5fd8698fc47ac1aa9c82e32713d6669be)
This reverts commit 1fe9e3822c4e574aa526b99af723e61e03f36d4f.  That commit
was a documentation improvement, not a bug fix.  We don't normally backpatch
such changes.

Discussion: https://postgr.es/m/d8eacbeb8194c578a98317b86d7eb2ef0b6eb0e0.camel%40j-davis.com
(cherry picked from commit 3b3aa1f651c713f1c17ec9c2f0216b8e4b62dba4)
Backpatch of the relevant parts of commit 50fd428b2b9 for consistency.

(cherry picked from commit be26c77ef9b8613a2583853b9dd7097c5d373f48)
Use Min(NBuffers, MAX_CHECKPOINT_REQUESTS) instead of NBuffers in
CheckpointerShmemSize() to match the actual array size limit set in
CheckpointerShmemInit().  This prevents wasting shared memory when
NBuffers > MAX_CHECKPOINT_REQUESTS.  Also, fix the comment.

Reported-by: Tom Lane <[email protected]>
Discussion: https://postgr.es/m/1439188.1754506714%40sss.pgh.pa.us
Author: Xuneng Zhou <[email protected]>
Co-authored-by: Alexander Korotkov <[email protected]>
(cherry picked from commit 6058900348059255a8a8da6df46ff8606ca1c612)
Small touch-up on commits 25505082f0e and 50fd428b2b9.  Fix the
formatting of the example messages in the documentation and adjust the
wording to match the code.

(cherry picked from commit 45e7ad980e3fac26e642dc49097751d23072d520)
Although the "Floating-Point Types" section says that "float" data
type is taken to mean "double precision", this information was not
reflected in the data type table that lists all data type aliases.

Reported-by: [email protected]
Author: Euler Taveira <[email protected]>
Reviewed-by: Tom Lane <[email protected]>
Discussion: https://postgr.es/m/[email protected]
Backpatch-through: 13
(cherry picked from commit 13244ba1032573bf1a220aa4b8fb0ff395f7815a)
Dropping twice a pgstats entry should not happen, and the error report
generated was missing the "generation" counter (tracking when an entry
is reused) that has been added in 818119afccd3.

Like d92573adcb02, backpatch down to v15 where this information is
useful to have, to gather more information from instances where the
problem shows up.  A report has shown that this error path has been
reached on a standby based on 17.3, for a relation stats entry and an
OID close to wraparound.

Author: Bertrand Drouvot <[email protected]>
Discussion: https://postgr.es/m/CAN4RuQvYth942J2+FcLmJKgdpq6fE5eqyFvb_PuskxF2eL=Wzg@mail.gmail.com
Backpatch-through: 15
(cherry picked from commit bdda6ba30cbef00a6eddbe9f956a7b82bb2c7720)
Commit 9e6104c disallowed transition tables on foreign tables, but
failed to account for cases where a foreign table is a child table of a
partitioned/inherited table on which transition tables exist, leading to
incorrect transition tuples collected from such foreign tables for
queries on the parent table triggering transition capture.  This
occurred not only for inherited UPDATE/DELETE but for partitioned INSERT
later supported by commit 3d956d9, which should have handled it at
least for the INSERT case, but didn't.

To fix, modify ExecAR*Triggers to throw an error if the given relation
is a foreign table requesting transition capture.  Also, this commit
fixes make_modifytable so that in case of an inherited UPDATE/DELETE
triggering transition capture, FDWs choose normal operations to modify
child foreign tables, not DirectModify; which is needed because they
would otherwise skip the calls to ExecAR*Triggers at execution, causing
unexpected behavior.

Author: Etsuro Fujita <[email protected]>
Reviewed-by: Amit Langote <[email protected]>
Discussion: https://postgr.es/m/CAPmGK14QJYikKzBDCe3jMbpGENnQ7popFmbEgm-XTNuk55oyHg%40mail.gmail.com
Backpatch-through: 13
(cherry picked from commit 9048a83c7a2d099304dca3d2e1f41f1b26926f72)
Previously, pg_dump --filter could misinterpret invalid object types
in the filter file as valid ones. For example, the invalid object type
"table-data" (likely a typo for the valid "table_data") could be
mistakenly recognized as "table", causing pg_dump to succeed
when it should have failed.

This happened because pg_dump identified keywords as sequences of
ASCII alphabetic characters, treating non-alphabetic characters
(like hyphens) as keyword boundaries. As a result, "table-data" was
parsed as "table".

To fix this, pg_dump --filter now treats keywords as strings of
non-whitespace characters, ensuring invalid types like "table-data"
are correctly rejected.

Back-patch to v17, where the --filter option was introduced.

Author: Fujii Masao <[email protected]>
Reviewed-by: Xuneng Zhou <[email protected]>
Reviewed-by: Srinath Reddy <[email protected]>
Reviewed-by: Daniel Gustafsson <[email protected]>
Discussion: https://postgr.es/m/CAHGQGwFzPKUwiV5C-NLBqz1oK1+z9K8cgrF+LcxFem-p3_Ftug@mail.gmail.com
Backpatch-through: 17
(cherry picked from commit 7dafc4a413f42a6c0e13c91e50e05329f91e954f)
This function is called from ATExecAttachPartition/ATExecAddInherit,
which prevent tables with row-level triggers with transition tables from
becoming partitions or inheritance children, to check if there is such a
trigger on the given table, but failed to check if a found trigger is
row-level, causing the caller functions to needlessly prevent a table
with only a statement-level trigger with transition tables from becoming
a partition or inheritance child.  Repair.

Oversight in commit 501ed02.

Author: Etsuro Fujita <[email protected]>
Discussion: https://postgr.es/m/CAPmGK167mXzwzzmJ_0YZ3EZrbwiCxtM1vogH_8drqsE6PtxRYw%40mail.gmail.com
Backpatch-through: 13
(cherry picked from commit e028ce911ad21e23ca39555e01a2d6c41c76aa79)
The code used

    return (Selectivity) 0.0;

where

    PG_RETURN_FLOAT8(0.0);

would be correct.

On 64-bit systems, these are pretty much equivalent, but on 32-bit
systems, PG_RETURN_FLOAT8() correctly produces a pointer, but the old
wrong code would return a null pointer, possibly leading to a crash
elsewhere.

We think this code is actually not reachable because bqarr_in won't
accept an empty query, and there is no other function that will
create query_int values.  But better be safe and not let such
incorrect code lie around.

Reviewed-by: Tom Lane <[email protected]>
Discussion: https://www.postgresql.org/message-id/flat/8246d7ff-f4b7-4363-913e-827dadfeb145%40eisentraut.org
(cherry picked from commit 276cdd4cc37845b31fb9048c4f32eeb33ae60e1a)
As usual, the release notes for other branches will be made by cutting
these down, but put them up for community review first.

(cherry picked from commit b70d9de77f337828ca3a0a3064a6827b1ce68977)
Commit 0decd5e89db9f5edb9b27351082f0d74aae7a9b6 recently added the
assertion to confirm dump order remains independent of OID values.  The
assertion remained reachable via DO_DEFAULT_ACL.  Given the release wrap
tomorrow, make the assertion master-only.

Reported-by: Alexander Lakhin <[email protected]>
Reviewed-by: Robert Haas <[email protected]>
Reviewed-by: Tom Lane <[email protected]>
Discussion: https://postgr.es/m/[email protected]
Backpatch-through: 13-18
(cherry picked from commit 28e7252e450aa710a438a34c3a4470a494e9001b)
(cherry picked from commit 024123a0d38e3f3fdcbab411eb01cba4b36adc86)
BABELFISH-CONFLICT: see Postgres community repo for original commit

Commit e2d4ef8 (the fix for CVE-2017-7484) added security checks
to the selectivity estimation functions to prevent them from running
user-supplied operators on data obtained from pg_statistic if the user
lacks privileges to select from the underlying table. In cases
involving inheritance/partitioning, those checks were originally
performed against the child RTE (which for plain inheritance might
actually refer to the parent table). Commit 553d2ec then extended
that to also check the parent RTE, allowing access if the user had
permissions on either the parent or the child. It turns out, however,
that doing any checks using the child RTE is incorrect, since
securityQuals is set to NULL when creating an RTE for an inheritance
child (whether it refers to the parent table or the child table), and
therefore such checks do not correctly account for any RLS policies or
security barrier views. Therefore, do the security checks using only
the parent RTE. This is consistent with how RLS policies are applied,
and the executor's ACL checks, both of which use only the parent
table's permissions/policies. Similar checks are performed in the
extended stats code, so update that in the same way, centralizing all
the checks in a new function.

In addition, note that these checks by themselves are insufficient to
ensure that the user has access to the table's data because, in a
query that goes via a view, they only check that the view owner has
permissions on the underlying table, not that the current user has
permissions on the view itself. In the selectivity estimation
functions, there is no easy way to navigate from underlying tables to
views, so add permissions checks for all views mentioned in the query
to the planner startup code. If the user lacks permissions on a view,
a permissions error will now be reported at planner-startup, and the
selectivity estimation functions will not be run.

Checking view permissions at planner-startup in this way is a little
ugly, since the same checks will be repeated at executor-startup.
Longer-term, it might be better to move all the permissions checks
from the executor to the planner so that permissions errors can be
reported sooner, instead of creating a plan that won't ever be run.
However, such a change seems too far-reaching to be back-patched.

Back-patch to all supported versions. In v13, there is the added
complication that UPDATEs and DELETEs on inherited target tables are
planned using inheritance_planner(), which plans each inheritance
child table separately, so that the selectivity estimation functions
do not know that they are dealing with a child table accessed via its
parent. Handle that by checking access permissions on the top parent
table at planner-startup, in the same way as we do for views. Any
securityQuals on the top parent table are moved down to the child
tables by inheritance_planner(), so they continue to be checked by the
selectivity estimation functions.

Author: Dean Rasheed <[email protected]>
Reviewed-by: Tom Lane <[email protected]>
Reviewed-by: Noah Misch <[email protected]>
Backpatch-through: 13
Security: CVE-2025-8713
(cherry picked from commit a85eddab23f17bce333d7d9481f528d7ba78285e)
Source-Git-URL: https://git.postgresql.org/git/pgtranslation/messages.git
Source-Git-Hash: 4f9af069289c30fc32337b844fb1db25d7b11e9b
(cherry picked from commit ac4c0d3451093d339327aeca4e5b8f89622c6265)
Maliciously-crafted object names could achieve SQL injection during
restore.  CVE-2012-0868 fixed this class of problem at the time, but
later work reintroduced three cases.  Commit
bc8cd50fefd369b217f80078585c486505aafb62 (back-patched to v11+ in
2023-05 releases) introduced the pg_dump case.  Commit
6cbdbd9 (v12+) introduced the two
pg_dumpall cases.  Move sanitize_line(), unchanged, to dumputils.c so
pg_dumpall has access to it in all supported versions.  Back-patch to
v13 (all supported versions).

Reviewed-by: Robert Haas <[email protected]>
Reviewed-by: Nathan Bossart <[email protected]>
Backpatch-through: 13
Security: CVE-2025-8715
(cherry picked from commit 9b92f115bdf9f21e9a8c4dcd80207c0723e81c3b)
BABELFISH-CONFLICT: see Postgres community repo for original commit

A malicious server could inject psql meta-commands into plain-text
dump output (i.e., scripts created with pg_dump --format=plain,
pg_dumpall, or pg_restore --file) that are run at restore time on
the machine running psql.  To fix, introduce a new "restricted"
mode in psql that blocks all meta-commands (except for \unrestrict
to exit the mode), and teach pg_dump, pg_dumpall, and pg_restore to
use this mode in plain-text dumps.

While at it, encourage users to only restore dumps generated from
trusted servers or to inspect it beforehand, since restoring causes
the destination to execute arbitrary code of the source superusers'
choice.  However, the client running the dump and restore needn't
trust the source or destination superusers.

Reported-by: Martin Rakhmanov
Reported-by: Matthieu Denais <[email protected]>
Reported-by: RyotaK <[email protected]>
Suggested-by: Tom Lane <[email protected]>
Reviewed-by: Noah Misch <[email protected]>
Reviewed-by: Michael Paquier <[email protected]>
Reviewed-by: Peter Eisentraut <[email protected]>
Security: CVE-2025-8714
Backpatch-through: 13
(cherry picked from commit 575f54d4cee8b141a91b3e5c3d7d65372c0f5219)
Security: CVE-2025-8713, CVE-2025-8714, CVE-2025-8715
(cherry picked from commit 86ad5a84c76b0ed1cf9ddb1d88f7204a9a076051)
(cherry picked from commit 7885b94dd81b98bbab9ed878680d156df7bf857f)
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.