mirror of
https://github.com/postgres/postgres.git
synced 2025-10-16 17:07:43 +03:00
Fix StatisticsObjIsVisibleExt() for pg_temp.
Neighbor get_statistics_object_oid() ignores objects in pg_temp, as has
been the standard for non-relation, non-type namespace searches since
CVE-2007-2138. Hence, most operations that name a statistics object
correctly decline to map an unqualified name to a statistics object in
pg_temp. StatisticsObjIsVisibleExt() did not. Consequently,
pg_statistics_obj_is_visible() wrongly returned true for such objects,
psql \dX wrongly listed them, and getObjectDescription()-based ereport()
and pg_describe_object() wrongly omitted namespace qualification. Any
malfunction beyond that would depend on how a human or application acts
on those wrong indications. Commit
d99d58cdc8
introduced this. Back-patch to
v13 (all supported versions).
Reviewed-by: Nathan Bossart <nathandbossart@gmail.com>
Discussion: https://postgr.es/m/20250920162116.2e.nmisch@google.com
Backpatch-through: 13
This commit is contained in:
@@ -2753,6 +2753,9 @@ StatisticsObjIsVisibleExt(Oid stxid, bool *is_missing)
|
|||||||
{
|
{
|
||||||
Oid namespaceId = lfirst_oid(l);
|
Oid namespaceId = lfirst_oid(l);
|
||||||
|
|
||||||
|
if (namespaceId == myTempNamespace)
|
||||||
|
continue; /* do not look in temp namespace */
|
||||||
|
|
||||||
if (namespaceId == stxnamespace)
|
if (namespaceId == stxnamespace)
|
||||||
{
|
{
|
||||||
/* Found it first in path */
|
/* Found it first in path */
|
||||||
|
@@ -122,6 +122,20 @@ ALTER STATISTICS ab1_a_b_stats RENAME TO ab1_a_b_stats_new;
|
|||||||
ERROR: must be owner of statistics object ab1_a_b_stats
|
ERROR: must be owner of statistics object ab1_a_b_stats
|
||||||
RESET SESSION AUTHORIZATION;
|
RESET SESSION AUTHORIZATION;
|
||||||
DROP ROLE regress_stats_ext;
|
DROP ROLE regress_stats_ext;
|
||||||
|
CREATE STATISTICS pg_temp.stats_ext_temp ON a, b FROM ab1;
|
||||||
|
SELECT regexp_replace(pg_describe_object(tableoid, oid, 0),
|
||||||
|
'pg_temp_[0-9]*', 'pg_temp_REDACTED') AS descr,
|
||||||
|
pg_statistics_obj_is_visible(oid) AS visible
|
||||||
|
FROM pg_statistic_ext
|
||||||
|
WHERE stxname = 'stats_ext_temp';
|
||||||
|
descr | visible
|
||||||
|
---------------------------------------------------+---------
|
||||||
|
statistics object pg_temp_REDACTED.stats_ext_temp | f
|
||||||
|
(1 row)
|
||||||
|
|
||||||
|
DROP STATISTICS stats_ext_temp; -- shall fail
|
||||||
|
ERROR: statistics object "stats_ext_temp" does not exist
|
||||||
|
DROP STATISTICS pg_temp.stats_ext_temp;
|
||||||
CREATE STATISTICS IF NOT EXISTS ab1_a_b_stats ON a, b FROM ab1;
|
CREATE STATISTICS IF NOT EXISTS ab1_a_b_stats ON a, b FROM ab1;
|
||||||
NOTICE: statistics object "ab1_a_b_stats" already exists, skipping
|
NOTICE: statistics object "ab1_a_b_stats" already exists, skipping
|
||||||
DROP STATISTICS ab1_a_b_stats;
|
DROP STATISTICS ab1_a_b_stats;
|
||||||
|
@@ -83,6 +83,14 @@ DROP STATISTICS ab1_a_b_stats;
|
|||||||
ALTER STATISTICS ab1_a_b_stats RENAME TO ab1_a_b_stats_new;
|
ALTER STATISTICS ab1_a_b_stats RENAME TO ab1_a_b_stats_new;
|
||||||
RESET SESSION AUTHORIZATION;
|
RESET SESSION AUTHORIZATION;
|
||||||
DROP ROLE regress_stats_ext;
|
DROP ROLE regress_stats_ext;
|
||||||
|
CREATE STATISTICS pg_temp.stats_ext_temp ON a, b FROM ab1;
|
||||||
|
SELECT regexp_replace(pg_describe_object(tableoid, oid, 0),
|
||||||
|
'pg_temp_[0-9]*', 'pg_temp_REDACTED') AS descr,
|
||||||
|
pg_statistics_obj_is_visible(oid) AS visible
|
||||||
|
FROM pg_statistic_ext
|
||||||
|
WHERE stxname = 'stats_ext_temp';
|
||||||
|
DROP STATISTICS stats_ext_temp; -- shall fail
|
||||||
|
DROP STATISTICS pg_temp.stats_ext_temp;
|
||||||
|
|
||||||
CREATE STATISTICS IF NOT EXISTS ab1_a_b_stats ON a, b FROM ab1;
|
CREATE STATISTICS IF NOT EXISTS ab1_a_b_stats ON a, b FROM ab1;
|
||||||
DROP STATISTICS ab1_a_b_stats;
|
DROP STATISTICS ab1_a_b_stats;
|
||||||
|
Reference in New Issue
Block a user