mirror of
https://github.com/postgres/postgres.git
synced 2025-09-02 04:21:28 +03:00
Rework the pg_statistic_ext catalog
Since extended statistic got introduced in PostgreSQL 10, there was a single catalog pg_statistic_ext storing both the definitions and built statistic. That's however problematic when a user is supposed to have access only to the definitions, but not to user data. Consider for example pg_dump on a database with RLS enabled - if the pg_statistic_ext catalog respects RLS (which it should, if it contains user data), pg_dump would not see any records and the result would not define any extended statistics. That would be a surprising behavior. Until now this was not a pressing issue, because the existing types of extended statistic (functional dependencies and ndistinct coefficients) do not include any user data directly. This changed with introduction of MCV lists, which do include most common combinations of values. The easiest way to fix this is to split the pg_statistic_ext catalog into two - one for definitions, one for the built statistic values. The new catalog is called pg_statistic_ext_data, and we're maintaining a 1:1 relationship with the old catalog - either there are matching records in both catalogs, or neither of them. Bumped CATVERSION due to changing system catalog definitions. Author: Dean Rasheed, with improvements by me Reviewed-by: Dean Rasheed, John Naylor Discussion: https://postgr.es/m/CAEZATCUhT9rt7Ui%3DVdx4N%3D%3DVV5XOK5dsXfnGgVOz_JhAicB%3DZA%40mail.gmail.com
This commit is contained in:
@@ -53,6 +53,6 @@
|
||||
*/
|
||||
|
||||
/* yyyymmddN */
|
||||
#define CATALOG_VERSION_NO 201906041
|
||||
#define CATALOG_VERSION_NO 201906151
|
||||
|
||||
#endif
|
||||
|
@@ -186,13 +186,6 @@ DECLARE_UNIQUE_INDEX(pg_largeobject_loid_pn_index, 2683, on pg_largeobject using
|
||||
DECLARE_UNIQUE_INDEX(pg_largeobject_metadata_oid_index, 2996, on pg_largeobject_metadata using btree(oid oid_ops));
|
||||
#define LargeObjectMetadataOidIndexId 2996
|
||||
|
||||
DECLARE_UNIQUE_INDEX(pg_statistic_ext_oid_index, 3380, on pg_statistic_ext using btree(oid oid_ops));
|
||||
#define StatisticExtOidIndexId 3380
|
||||
DECLARE_UNIQUE_INDEX(pg_statistic_ext_name_index, 3997, on pg_statistic_ext using btree(stxname name_ops, stxnamespace oid_ops));
|
||||
#define StatisticExtNameIndexId 3997
|
||||
DECLARE_INDEX(pg_statistic_ext_relid_index, 3379, on pg_statistic_ext using btree(stxrelid oid_ops));
|
||||
#define StatisticExtRelidIndexId 3379
|
||||
|
||||
DECLARE_UNIQUE_INDEX(pg_namespace_nspname_index, 2684, on pg_namespace using btree(nspname name_ops));
|
||||
#define NamespaceNameIndexId 2684
|
||||
DECLARE_UNIQUE_INDEX(pg_namespace_oid_index, 2685, on pg_namespace using btree(oid oid_ops));
|
||||
@@ -237,6 +230,16 @@ DECLARE_INDEX(pg_shdepend_reference_index, 1233, on pg_shdepend using btree(refc
|
||||
DECLARE_UNIQUE_INDEX(pg_statistic_relid_att_inh_index, 2696, on pg_statistic using btree(starelid oid_ops, staattnum int2_ops, stainherit bool_ops));
|
||||
#define StatisticRelidAttnumInhIndexId 2696
|
||||
|
||||
DECLARE_UNIQUE_INDEX(pg_statistic_ext_oid_index, 3380, on pg_statistic_ext using btree(oid oid_ops));
|
||||
#define StatisticExtOidIndexId 3380
|
||||
DECLARE_UNIQUE_INDEX(pg_statistic_ext_name_index, 3997, on pg_statistic_ext using btree(stxname name_ops, stxnamespace oid_ops));
|
||||
#define StatisticExtNameIndexId 3997
|
||||
DECLARE_INDEX(pg_statistic_ext_relid_index, 3379, on pg_statistic_ext using btree(stxrelid oid_ops));
|
||||
#define StatisticExtRelidIndexId 3379
|
||||
|
||||
DECLARE_UNIQUE_INDEX(pg_statistic_ext_data_stxoid_index, 3433, on pg_statistic_ext_data using btree(stxoid oid_ops));
|
||||
#define StatisticExtDataStxoidIndexId 3433
|
||||
|
||||
DECLARE_UNIQUE_INDEX(pg_tablespace_oid_index, 2697, on pg_tablespace using btree(oid oid_ops));
|
||||
#define TablespaceOidIndexId 2697
|
||||
DECLARE_UNIQUE_INDEX(pg_tablespace_spcname_index, 2698, on pg_tablespace using btree(spcname name_ops));
|
||||
|
@@ -1,8 +1,12 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* pg_statistic_ext.h
|
||||
* definition of the "extended statistics" system catalog (pg_statistic_ext)
|
||||
* definition of the "extended statistics" system catalog
|
||||
* (pg_statistic_ext)
|
||||
*
|
||||
* Note that pg_statistic_ext contains the definitions of extended statistics
|
||||
* objects, created by CREATE STATISTICS, but not the actual statistical data,
|
||||
* created by running ANALYZE.
|
||||
*
|
||||
* Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
@@ -47,9 +51,6 @@ CATALOG(pg_statistic_ext,3381,StatisticExtRelationId)
|
||||
#ifdef CATALOG_VARLEN
|
||||
char stxkind[1] BKI_FORCE_NOT_NULL; /* statistics kinds requested
|
||||
* to build */
|
||||
pg_ndistinct stxndistinct; /* ndistinct coefficients (serialized) */
|
||||
pg_dependencies stxdependencies; /* dependencies (serialized) */
|
||||
pg_mcv_list stxmcv; /* MCV (serialized) */
|
||||
#endif
|
||||
|
||||
} FormData_pg_statistic_ext;
|
||||
|
52
src/include/catalog/pg_statistic_ext_data.h
Normal file
52
src/include/catalog/pg_statistic_ext_data.h
Normal file
@@ -0,0 +1,52 @@
|
||||
/*-------------------------------------------------------------------------
|
||||
*
|
||||
* pg_statistic_ext_data.h
|
||||
* definition of the "extended statistics data" system catalog
|
||||
* (pg_statistic_ext_data)
|
||||
*
|
||||
* This catalog stores the statistical data for extended statistics objects.
|
||||
*
|
||||
* Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* src/include/catalog/pg_statistic_ext_data.h
|
||||
*
|
||||
* NOTES
|
||||
* The Catalog.pm module reads this file and derives schema
|
||||
* information.
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef PG_STATISTIC_EXT_DATA_H
|
||||
#define PG_STATISTIC_EXT_DATA_H
|
||||
|
||||
#include "catalog/genbki.h"
|
||||
#include "catalog/pg_statistic_ext_data_d.h"
|
||||
|
||||
/* ----------------
|
||||
* pg_statistic_ext_data definition. cpp turns this into
|
||||
* typedef struct FormData_pg_statistic_ext_data
|
||||
* ----------------
|
||||
*/
|
||||
CATALOG(pg_statistic_ext_data,3429,StatisticExtDataRelationId)
|
||||
{
|
||||
Oid stxoid; /* statistics object this data is for */
|
||||
|
||||
#ifdef CATALOG_VARLEN /* variable-length fields start here */
|
||||
|
||||
pg_ndistinct stxdndistinct; /* ndistinct coefficients (serialized) */
|
||||
pg_dependencies stxddependencies; /* dependencies (serialized) */
|
||||
pg_mcv_list stxdmcv; /* MCV (serialized) */
|
||||
|
||||
#endif
|
||||
|
||||
} FormData_pg_statistic_ext_data;
|
||||
|
||||
/* ----------------
|
||||
* Form_pg_statistic_ext_data corresponds to a pointer to a tuple with
|
||||
* the format of pg_statistic_ext_data relation.
|
||||
* ----------------
|
||||
*/
|
||||
typedef FormData_pg_statistic_ext_data *Form_pg_statistic_ext_data;
|
||||
|
||||
#endif /* PG_STATISTIC_EXT_DATA_H */
|
@@ -70,6 +70,7 @@ DECLARE_TOAST(pg_rewrite, 2838, 2839);
|
||||
DECLARE_TOAST(pg_seclabel, 3598, 3599);
|
||||
DECLARE_TOAST(pg_statistic, 2840, 2841);
|
||||
DECLARE_TOAST(pg_statistic_ext, 3439, 3440);
|
||||
DECLARE_TOAST(pg_statistic_ext_data, 3430, 3431);
|
||||
DECLARE_TOAST(pg_trigger, 2336, 2337);
|
||||
DECLARE_TOAST(pg_ts_dict, 4169, 4170);
|
||||
DECLARE_TOAST(pg_type, 4171, 4172);
|
||||
|
@@ -86,6 +86,7 @@ enum SysCacheIdentifier
|
||||
REPLORIGNAME,
|
||||
RULERELNAME,
|
||||
SEQRELID,
|
||||
STATEXTDATASTXOID,
|
||||
STATEXTNAMENSP,
|
||||
STATEXTOID,
|
||||
STATRELATTINH,
|
||||
|
Reference in New Issue
Block a user