PG Bug reporting form <noreply@postgresql.org> writes:
> When the input parameter path of the function is
> /tmp/root_hack4_test_tablespace/./../../test, the expected result after
> processing by canonicalize_path is /test, but the actual result remains
> /tmp/root_hack4_test_tablespace/./../../test.
AFAICT it does what you're expecting in v15 and later. The previous
implementation did not promise to clean up '.' and '..' everywhere;
it only said
* o remove trailing '.'
* o process trailing '..' ourselves
> The implementation of this function differs significantly between version
> 14, version 15, and later versions.
See commit c10f830c511f0ba3e6f4c9d99f444d39e30440c8, particularly
the commit message's explanation of why not back-patch it.
regards, tom lane