On Wed, Jul 9, 2025 at 9:22 AM Tom Lane <t...@sss.pgh.pa.us> wrote:

> "David G. Johnston" <david.g.johns...@gmail.com> writes:
> > On Wed, Jul 9, 2025 at 7:56 AM PG Doc comments form <
> nore...@postgresql.org>
> > wrote:
> >> Pls. let me suggest the correction for the
> >> https://www.postgresql.org/docs/17/auth-username-maps.html page.
> >> It has the following sentence:
>
> The existing sentence is pretty mangled English, though.
>

Agreed.


>   When the database-username field is a regular expression, it is
>   not possible to use \1 within it to refer to a capture from
>   the system-username field.
>
> Thoughts?
>

Its good as far a narrow fix goes.

But how about the attached?  More invasive but covers the salient points
better, IMO, and less repetitive than having the two fields have their own
basically copy-pasted paragraphs.

I didn't add an example but felt the point "be referenced a single time
within" to be needed since, usefulness not withstanding, writing \1\1 for
database-username works but only the first instance of \1 is replaced.

Also, should we attempt to align this documentation and
pg_ident.conf.sample as pertains to pg-username vs. database-username?

David J.
From 093ba8ec49060501c3930c45d9b3c1ba0669a536 Mon Sep 17 00:00:00 2001
From: "David G. Johnston" <david.g.johns...@gmail.com>
Date: Wed, 9 Jul 2025 11:30:07 -0700
Subject: [PATCH] doc: Reword pg_ident.conf explanation surrounding regexp

Remove redundancy introduced by giving system-username and
database-username their own paragraphs.  This also allows a clean
way to state that our behavior pertaining to capturing the first
group in system-username regexp and referring to it in a non-regexp
database-username.  Emphasize this later requirement with an example
and a warning.
---
 doc/src/sgml/client-auth.sgml | 44 ++++++++++++++++++-----------------
 1 file changed, 23 insertions(+), 21 deletions(-)

diff --git a/doc/src/sgml/client-auth.sgml b/doc/src/sgml/client-auth.sgml
index 832b616a7bb..53bb2ef7ed3 100644
--- a/doc/src/sgml/client-auth.sgml
+++ b/doc/src/sgml/client-auth.sgml
@@ -999,37 +999,39 @@ local   db1,db2,@demodbs  all                                   md5
    <literal>+</literal> lose its special meaning.
   </para>
   <para>
-   If the <replaceable>system-username</replaceable> field starts with a slash (<literal>/</literal>),
-   the remainder of the field is treated as a regular expression.
-   (See <xref linkend="posix-syntax-details"/> for details of
-   <productname>PostgreSQL</productname>'s regular expression syntax.)  The regular
-   expression can include a single capture, or parenthesized subexpression,
-   which can then be referenced in the <replaceable>database-username</replaceable>
-   field as <literal>\1</literal> (backslash-one).  This allows the mapping of
-   multiple user names in a single line, which is particularly useful for
-   simple syntax substitutions.  For example, these entries
+   Both <replaceable>system-username</replaceable> and <replaceable>database-username</replaceable>
+   can be specified using regular expressions by beginning the value with a slash
+   <literal>/</literal> (See <xref linkend="posix-syntax-details"/> for details of
+   <productname>PostgreSQL</productname>'s regular expression syntax).
+   Of particular note is the capturing group and back reference feature; where
+   parentheses capture actual matched text and can be referred to using \m.
+   In the special case where the <replaceable>system-username</replaceable>
+   field is a regular expression with at least one capturing group, and, importantly,
+   the <replaceable>database-username</replaceable> field is not a regular expression,
+   the first capturing group in <replaceable>system-username</replaceable> can
+   be referenced a single time within the <replaceable>database-username</replaceable>
+   field using <literal>\1</literal>. For example, these first two entries
 <programlisting>
 mymap   /^(.*)@mydomain\.com$      \1
 mymap   /^(.*)@otherdomain\.com$   guest
+# mymap /^(.*)@example\.com$       /^\1-(example|other)$  # Invalid RegExp!
 </programlisting>
    will remove the domain part for users with system user names that end with
    <literal>@mydomain.com</literal>, and allow any user whose system name ends with
    <literal>@otherdomain.com</literal> to log in as <literal>guest</literal>.
-   Quoting a <replaceable>database-username</replaceable> containing
+   Note that quoting a <replaceable>database-username</replaceable> containing
    <literal>\1</literal> <emphasis>does not</emphasis> make
    <literal>\1</literal> lose its special meaning.
   </para>
-  <para>
-   If the <replaceable>database-username</replaceable> field starts with
-   a slash (<literal>/</literal>), the remainder of the field is treated
-   as a regular expression (see <xref linkend="posix-syntax-details"/>
-   for details of <productname>PostgreSQL</productname>'s regular
-   expression syntax). It is not possible to use <literal>\1</literal>
-   to use a capture from regular expression on
-   <replaceable>system-username</replaceable> for a regular expression
-   on <replaceable>database-username</replaceable>.
-  </para>
-
+  <warning>
+   <para>
+    The commented-out third example above has an invalid regular expression which
+    will cause the pg_ident.conf file to fail to load.  The problem is that within
+    a regular expression the <literal>\1</literal> reference will always refer to
+    the context of the expression itself, and in this case at the point
+    <literal>\1</literal> is used no capturing groups have been matched.
+   </para>
+  </warning>
   <tip>
    <para>
     Keep in mind that by default, a regular expression can match just part of
-- 
2.34.1

Reply via email to