Thread

Commits

  1. Fix accidentally cast away qualifiers

  1. Fix accidentally cast away qualifiers

    Peter Eisentraut <peter@eisentraut.org> — 2026-01-20T07:54:18Z

    This patch fixes cases where a qualifier (const, in all cases here) was 
    dropped by a cast, but the cast was otherwise necessary or desirable, so 
    the straightforward fix is to add the qualifier into the cast.
    
    This was checked with gcc -Wcast-qual, but it doesn't fix all such 
    warnings, only the trivially fixable ones.
  2. Re: Fix accidentally cast away qualifiers

    Chao Li <li.evan.chao@gmail.com> — 2026-01-20T08:16:26Z

    
    > On Jan 20, 2026, at 15:54, Peter Eisentraut <peter@eisentraut.org> wrote:
    > 
    > This patch fixes cases where a qualifier (const, in all cases here) was dropped by a cast, but the cast was otherwise necessary or desirable, so the straightforward fix is to add the qualifier into the cast.
    > 
    > This was checked with gcc -Wcast-qual, but it doesn't fix all such warnings, only the trivially fixable ones.<0001-Fix-accidentally-cast-away-qualifiers.patch>
    
    Looks good to me. All changes are const-correctness fixes without semantic changes.
    
    Best regards,
    --
    Chao Li (Evan)
    HighGo Software Co., Ltd.
    https://www.highgo.com/
    
    
    
    
    
    
    
    
  3. Re: Fix accidentally cast away qualifiers

    Bertrand Drouvot <bertranddrouvot.pg@gmail.com> — 2026-01-20T12:10:57Z

    Hi,
    
    On Tue, Jan 20, 2026 at 08:54:18AM +0100, Peter Eisentraut wrote:
    > This patch fixes cases where a qualifier (const, in all cases here) was
    > dropped by a cast, but the cast was otherwise necessary or desirable, so the
    > straightforward fix is to add the qualifier into the cast.
    > 
    > This was checked with gcc -Wcast-qual, but it doesn't fix all such warnings,
    > only the trivially fixable ones.
    
    diff --git a/src/include/varatt.h b/src/include/varatt.h
    index eccd3ca04d6..03e9d1869aa 100644
    --- a/src/include/varatt.h
    +++ b/src/include/varatt.h
    
    It looks like those changes produce:
    
    ../../../src/include/varatt.h: In function ‘VARDATA’:
    ../../../src/include/varatt.h:261:33: warning: return discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
      261 | #define VARDATA_4B(PTR)         (((const varattrib_4b *) (PTR))->va_4byte.va_data)
          |                                 ^
    ../../../src/include/varatt.h:307:16: note: in expansion of macro ‘VARDATA_4B’
      307 |         return VARDATA_4B(PTR);
          |                ^~~~~~~~~~
    ../../../src/include/varatt.h: In function ‘VARDATA_SHORT’:
    ../../../src/include/varatt.h:263:33: warning: return discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
      263 | #define VARDATA_1B(PTR)         (((const varattrib_1b *) (PTR))->va_data)
          |                                 ^
    ../../../src/include/varatt.h:321:16: note: in expansion of macro ‘VARDATA_1B’
      321 |         return VARDATA_1B(PTR);
          |                ^~~~~~~~~~
    ../../../src/include/varatt.h: In function ‘VARDATA_EXTERNAL’:
    ../../../src/include/varatt.h:264:33: warning: return discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
      264 | #define VARDATA_1B_E(PTR)       (((const varattrib_1b_e *) (PTR))->va_data)
          |                                 ^
    ../../../src/include/varatt.h:342:16: note: in expansion of macro ‘VARDATA_1B_E’
      342 |         return VARDATA_1B_E(PTR);
          |                ^~~~~~~~~~~~
    ../../../src/include/varatt.h: In function ‘VARDATA_ANY’:
    ../../../src/include/varatt.h:488:52: warning: return discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
      488 |         return VARATT_IS_1B(PTR) ? VARDATA_1B(PTR) : VARDATA_4B(PTR);
    
    as they are still used by functions that return non const:
    
    "
    static inline char *
    VARDATA(const void *PTR)
    {
        return VARDATA_4B(PTR);
    }
    "
    
    > -	RangeType  *r1 = *(RangeType **) key1;
    > -	RangeType  *r2 = *(RangeType **) key2;
    > +	RangeType  *r1 = *(RangeType *const *) key1;
    > +	RangeType  *r2 = *(RangeType *const *) key2;
    
    That's correct. My improved cocci script [1] would incorrectly produce:
    
    -       RangeType  *r1 = *(RangeType **) key1;
    -       RangeType  *r2 = *(RangeType **) key2;
    +       RangeType  *r1 = *(const RangeType **)key1;
    +       RangeType  *r2 = *(const RangeType **)key2;
    
    Same for:
    
    > -	file_entry_t *fa = *((file_entry_t **) a);
    > -	file_entry_t *fb = *((file_entry_t **) b);
    > +	file_entry_t *fa = *((file_entry_t *const *) a);
    > +	file_entry_t *fb = *((file_entry_t *const *) b);
    >  
    >  
    
    Same for:
    
    > -	Step	   *stepa = *((Step **) a);
    > -	Step	   *stepb = *((Step **) b);
    > +	Step	   *stepa = *((Step *const *) a);
    > +	Step	   *stepb = *((Step *const *) b);
    >  
    > -	Step	   *step = *((Step **) b);
    > +	Step	   *step = *((Step *const *) b);
    >  
    > diff --git a/src/test/modules/libpq_pipeline/libpq_pipeline.c b/src/test/modules/libpq_pipeline/libpq_pipeline.c
    > index 03371721460..4a9bb65b9bb 100644
    > --- a/src/test/modules/libpq_pipeline/libpq_pipeline.c
    > +++ b/src/test/modules/libpq_pipeline/libpq_pipeline.c
    > @@ -1576,7 +1576,7 @@ test_singlerowmode(PGconn *conn)
    >  							  "SELECT generate_series(42, $1)",
    >  							  1,
    >  							  NULL,
    > -							  (const char **) param,
    > +							  (const char *const *) param,
    >  							  NULL,
    >  							  NULL,
    >  							  0) != 1)
    
    Correct, also according to:
    
    "
    int
    PQsendQueryParams(PGconn *conn,
                      const char *command,
                      int nParams,
                      const Oid *paramTypes,
                      const char *const *paramValues,
                      const int *paramLengths,
                      const int *paramFormats,
                      int resultFormat)
    {
    "
    
    Also [1], detected a few more trivially fixable ones (see attached).
    
    [1]: https://github.com/bdrouvot/coccinelle_on_pg/blob/main/misc/search_const_away.cocci
    
    Regards,
    
    -- 
    Bertrand Drouvot
    PostgreSQL Contributors Team
    RDS Open Source Databases
    Amazon Web Services: https://aws.amazon.com
    
  4. Re: Fix accidentally cast away qualifiers

    Peter Eisentraut <peter@eisentraut.org> — 2026-01-21T11:31:27Z

    On 20.01.26 13:10, Bertrand Drouvot wrote:
    > On Tue, Jan 20, 2026 at 08:54:18AM +0100, Peter Eisentraut wrote:
    >> This patch fixes cases where a qualifier (const, in all cases here) was
    >> dropped by a cast, but the cast was otherwise necessary or desirable, so the
    >> straightforward fix is to add the qualifier into the cast.
    >>
    >> This was checked with gcc -Wcast-qual, but it doesn't fix all such warnings,
    >> only the trivially fixable ones.
    > 
    > diff --git a/src/include/varatt.h b/src/include/varatt.h
    > index eccd3ca04d6..03e9d1869aa 100644
    > --- a/src/include/varatt.h
    > +++ b/src/include/varatt.h
    > 
    > It looks like those changes produce:
    > 
    > ../../../src/include/varatt.h: In function ‘VARDATA’:
    > ../../../src/include/varatt.h:261:33: warning: return discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
    >    261 | #define VARDATA_4B(PTR)         (((const varattrib_4b *) (PTR))->va_4byte.va_data)
    
    Strange, I don't see that.  What compiler is this, and do you use any 
    special options?
    
    > Also [1], detected a few more trivially fixable ones (see attached).
    
    Yes, these should be included.
    
    The one in spgquadtreeproc.c was #ifdef'ed out, so my testing didn't see 
    it.  I suppose the other one is only compiled when you run the unicode 
    tests.
    
    
    
    
    
  5. Re: Fix accidentally cast away qualifiers

    Bertrand Drouvot <bertranddrouvot.pg@gmail.com> — 2026-01-21T14:24:58Z

    Hi,
    
    On Wed, Jan 21, 2026 at 12:31:27PM +0100, Peter Eisentraut wrote:
    > On 20.01.26 13:10, Bertrand Drouvot wrote:
    > > On Tue, Jan 20, 2026 at 08:54:18AM +0100, Peter Eisentraut wrote:
    > > > This patch fixes cases where a qualifier (const, in all cases here) was
    > > > dropped by a cast, but the cast was otherwise necessary or desirable, so the
    > > > straightforward fix is to add the qualifier into the cast.
    > > > 
    > > > This was checked with gcc -Wcast-qual, but it doesn't fix all such warnings,
    > > > only the trivially fixable ones.
    > > 
    > > diff --git a/src/include/varatt.h b/src/include/varatt.h
    > > index eccd3ca04d6..03e9d1869aa 100644
    > > --- a/src/include/varatt.h
    > > +++ b/src/include/varatt.h
    > > 
    > > It looks like those changes produce:
    > > 
    > > ../../../src/include/varatt.h: In function ‘VARDATA’:
    > > ../../../src/include/varatt.h:261:33: warning: return discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
    > >    261 | #define VARDATA_4B(PTR)         (((const varattrib_4b *) (PTR))->va_4byte.va_data)
    > 
    > Strange, I don't see that.  What compiler is this, and do you use any
    > special options?
    
    It's gcc 14.1.0 with "CFLAGS=-O0 -ggdb3 -fno-omit-frame-pointer -gdwarf-2 -g3
    -Wdiscarded-qualifiers -Wunused-value -Werror=maybe-uninitialized
    -Werror=format -Wreturn-type"
    
    But I just tested with a simple test case, some compilers and some options and I've
    always seen the warning (see [1]), so I'm not sure why you don't.
    
    > 
    > > Also [1], detected a few more trivially fixable ones (see attached).
    > 
    > Yes, these should be included.
    > 
    > The one in spgquadtreeproc.c was #ifdef'ed out, so my testing didn't see it.
    > I suppose the other one is only compiled when you run the unicode tests.
    
    Yeah, that could lead to the same "concern" that Tom had in [2] (and using 
    a tool like Coccinelle could be an answer).
    
    [1]: https://godbolt.org/z/T9hffKaPW
    [2]: https://postgr.es/m/aVJCoNqO6ybov7eW%40ip-10-97-1-34.eu-west-3.compute.internal
    
    Regards,
    
    -- 
    Bertrand Drouvot
    PostgreSQL Contributors Team
    RDS Open Source Databases
    Amazon Web Services: https://aws.amazon.com
    
    
    
    
  6. Re: Fix accidentally cast away qualifiers

    Bertrand Drouvot <bertranddrouvot.pg@gmail.com> — 2026-01-21T14:56:37Z

    Hi,
    
    On Wed, Jan 21, 2026 at 02:24:58PM +0000, Bertrand Drouvot wrote:
    > Hi,
    > 
    > On Wed, Jan 21, 2026 at 12:31:27PM +0100, Peter Eisentraut wrote:
    > > Strange, I don't see that.  What compiler is this, and do you use any
    > > special options?
    > 
    > It's gcc 14.1.0 with "CFLAGS=-O0 -ggdb3 -fno-omit-frame-pointer -gdwarf-2 -g3
    > -Wdiscarded-qualifiers -Wunused-value -Werror=maybe-uninitialized
    > -Werror=format -Wreturn-type"
    > 
    > But I just tested with a simple test case, some compilers and some options and I've
    > always seen the warning (see [1])
    
    FWIW, and so does the CI: https://github.com/bdrouvot/postgres/runs/61028037498
    
    Regards,
    
    -- 
    Bertrand Drouvot
    PostgreSQL Contributors Team
    RDS Open Source Databases
    Amazon Web Services: https://aws.amazon.com
    
    
    
    
  7. Re: Fix accidentally cast away qualifiers

    Chao Li <li.evan.chao@gmail.com> — 2026-01-22T08:22:24Z

    
    > On Jan 21, 2026, at 22:56, Bertrand Drouvot <bertranddrouvot.pg@gmail.com> wrote:
    > 
    > Hi,
    > 
    > On Wed, Jan 21, 2026 at 02:24:58PM +0000, Bertrand Drouvot wrote:
    >> Hi,
    >> 
    >> On Wed, Jan 21, 2026 at 12:31:27PM +0100, Peter Eisentraut wrote:
    >>> Strange, I don't see that.  What compiler is this, and do you use any
    >>> special options?
    >> 
    >> It's gcc 14.1.0 with "CFLAGS=-O0 -ggdb3 -fno-omit-frame-pointer -gdwarf-2 -g3
    >> -Wdiscarded-qualifiers -Wunused-value -Werror=maybe-uninitialized
    >> -Werror=format -Wreturn-type"
    >> 
    >> But I just tested with a simple test case, some compilers and some options and I've
    >> always seen the warning (see [1])
    > 
    > FWIW, and so does the CI: https://github.com/bdrouvot/postgres/runs/61028037498
    > 
    > Regards,
    > 
    > -- 
    > Bertrand Drouvot
    > PostgreSQL Contributors Team
    > RDS Open Source Databases
    > Amazon Web Services: https://aws.amazon.com
    > 
    
    Yeah, I confirm I can see the same warnings:
    ```
    In file included from xlogdesc.c:21:
    In file included from ../../../src/include/utils/guc.h:17:
    In file included from ../../../src/include/utils/array.h:65:
    In file included from ../../../src/include/utils/expandeddatum.h:47:
    ../../../src/include/varatt.h:307:9: warning: returning 'const char[]' from a function with result type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers]
      307 |         return VARDATA_4B(PTR);
          |                ^~~~~~~~~~~~~~~
    ../../../src/include/varatt.h:261:26: note: expanded from macro 'VARDATA_4B'
      261 | #define VARDATA_4B(PTR)         (((const varattrib_4b *) (PTR))->va_4byte.va_data)
          |                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ../../../src/include/varatt.h:321:9: warning: returning 'const char[]' from a function with result type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers]
      321 |         return VARDATA_1B(PTR);
          |                ^~~~~~~~~~~~~~~
    ../../../src/include/varatt.h:263:26: note: expanded from macro 'VARDATA_1B'
      263 | #define VARDATA_1B(PTR)         (((const varattrib_1b *) (PTR))->va_data)
          |                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ../../../src/include/varatt.h:342:9: warning: returning 'const char[]' from a function with result type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers]
      342 |         return VARDATA_1B_E(PTR);
          |                ^~~~~~~~~~~~~~~~~
    ../../../src/include/varatt.h:264:27: note: expanded from macro 'VARDATA_1B_E'
      264 | #define VARDATA_1B_E(PTR)       (((const varattrib_1b_e *) (PTR))->va_data)
          |                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ../../../src/include/varatt.h:488:9: warning: returning 'const char *' from a function with result type 'char *' discards qualifiers [-Wincompatible-pointer-types-discards-qualifiers]
      488 |         return VARATT_IS_1B(PTR) ? VARDATA_1B(PTR) : VARDATA_4B(PTR);
          |                ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    ../../../src/include/varatt.h:235:2: note: expanded from macro 'VARATT_IS_1B'
      235 |         ((((const varattrib_1b *) (PTR))->va_header & 0x01) == 0x01)
          |         ^
    4 warnings generated.
    ```
    
    I didn’t use any special compiler option, just ran “make”.
    
    My configure is:
    ```
    ./configure --enable-debug --enable-cassert --enable-tap-tests --enable-depend
    ```
    
    Sorry, I didn’t notice the warnings in my first review. I guess I left my desktop while building at the time.
    
    Best regards,
    --
    Chao Li (Evan)
    HighGo Software Co., Ltd.
    https://www.highgo.com/
    
    
    
    
    
    
    
    
  8. Re: Fix accidentally cast away qualifiers

    Peter Eisentraut <peter@eisentraut.org> — 2026-01-26T15:09:00Z

    On 21.01.26 15:56, Bertrand Drouvot wrote:
    > Hi,
    > 
    > On Wed, Jan 21, 2026 at 02:24:58PM +0000, Bertrand Drouvot wrote:
    >> Hi,
    >>
    >> On Wed, Jan 21, 2026 at 12:31:27PM +0100, Peter Eisentraut wrote:
    >>> Strange, I don't see that.  What compiler is this, and do you use any
    >>> special options?
    >>
    >> It's gcc 14.1.0 with "CFLAGS=-O0 -ggdb3 -fno-omit-frame-pointer -gdwarf-2 -g3
    >> -Wdiscarded-qualifiers -Wunused-value -Werror=maybe-uninitialized
    >> -Werror=format -Wreturn-type"
    >>
    >> But I just tested with a simple test case, some compilers and some options and I've
    >> always seen the warning (see [1])
    > 
    > FWIW, and so does the CI: https://github.com/bdrouvot/postgres/runs/61028037498
    
    I must have done something wrong on my side.  I have committed it with 
    your corrections.