diff --git a/doc/src/sgml/catalogs.sgml b/doc/src/sgml/catalogs.sgml index 5883673..10ab169 100644 --- a/doc/src/sgml/catalogs.sgml +++ b/doc/src/sgml/catalogs.sgml @@ -4321,12 +4321,13 @@ - staenabled + stakind char[] - An array with the modes of the enabled statistic types, encoded as - d for ndistinct coefficients. + An array with the an element for each statistic kind set in the statistics. + d for ndistinct coefficients, f + for functional dependencies. diff --git a/src/backend/commands/statscmds.c b/src/backend/commands/statscmds.c index 46abadc..84f5c3f 100644 --- a/src/backend/commands/statscmds.c +++ b/src/backend/commands/statscmds.c @@ -62,12 +62,12 @@ CreateStatistics(CreateStatsStmt *stmt) Oid relid; ObjectAddress parentobject, childobject; - Datum types[2]; /* one for each possible type of statistics */ - int ntypes; - ArrayType *staenabled; + Datum kinds[2]; /* one for each possible kind of statistics */ + int nkinds; + ArrayType *stakind; bool build_ndistinct; bool build_dependencies; - bool requested_type = false; + bool requested_kind = false; Assert(IsA(stmt, CreateStatsStmt)); @@ -185,7 +185,7 @@ CreateStatistics(CreateStatsStmt *stmt) stakeys = buildint2vector(attnums, numcols); /* - * Parse the statistics options. Currently only statistics types are + * Parse the statistics options. Currently only statistics kinds are * recognized. */ build_ndistinct = false; @@ -197,12 +197,12 @@ CreateStatistics(CreateStatsStmt *stmt) if (strcmp(opt->defname, "ndistinct") == 0) { build_ndistinct = defGetBoolean(opt); - requested_type = true; + requested_kind = true; } else if (strcmp(opt->defname, "dependencies") == 0) { build_dependencies = defGetBoolean(opt); - requested_type = true; + requested_kind = true; } else ereport(ERROR, @@ -210,21 +210,21 @@ CreateStatistics(CreateStatsStmt *stmt) errmsg("unrecognized STATISTICS option \"%s\"", opt->defname))); } - /* If no statistic type was specified, build them all. */ - if (!requested_type) + /* If no statistic kind was specified, build them all. */ + if (!requested_kind) { build_ndistinct = true; build_dependencies = true; } - /* construct the char array of enabled statistic types */ - ntypes = 0; + /* construct the char array of statistics kinds */ + nkinds = 0; if (build_ndistinct) - types[ntypes++] = CharGetDatum(STATS_EXT_NDISTINCT); + kinds[nkinds++] = CharGetDatum(STATS_EXT_NDISTINCT); if (build_dependencies) - types[ntypes++] = CharGetDatum(STATS_EXT_DEPENDENCIES); - Assert(ntypes > 0); - staenabled = construct_array(types, ntypes, CHAROID, 1, true, 'c'); + kinds[nkinds++] = CharGetDatum(STATS_EXT_DEPENDENCIES); + Assert(nkinds > 0); + stakind = construct_array(kinds, nkinds, CHAROID, 1, true, 'c'); /* * Everything seems fine, so let's build the pg_statistic_ext tuple. @@ -236,7 +236,7 @@ CreateStatistics(CreateStatsStmt *stmt) values[Anum_pg_statistic_ext_stanamespace - 1] = ObjectIdGetDatum(namespaceId); values[Anum_pg_statistic_ext_staowner - 1] = ObjectIdGetDatum(GetUserId()); values[Anum_pg_statistic_ext_stakeys - 1] = PointerGetDatum(stakeys); - values[Anum_pg_statistic_ext_staenabled - 1] = PointerGetDatum(staenabled); + values[Anum_pg_statistic_ext_stakind - 1] = PointerGetDatum(stakind); /* no statistics build yet */ nulls[Anum_pg_statistic_ext_standistinct - 1] = true; diff --git a/src/backend/statistics/extended_stats.c b/src/backend/statistics/extended_stats.c index 4b3aa77..b2bb8d3 100644 --- a/src/backend/statistics/extended_stats.c +++ b/src/backend/statistics/extended_stats.c @@ -162,7 +162,7 @@ fetch_statentries_for_relation(Relation pg_statext, Oid relid) bool isnull; int i; ArrayType *arr; - char *enabled; + char *kind; Form_pg_statistic_ext staForm; entry = palloc0(sizeof(StatExtEntry)); @@ -174,21 +174,21 @@ fetch_statentries_for_relation(Relation pg_statext, Oid relid) staForm->stakeys.values[i]); } - /* decode the staenabled char array into a list of chars */ + /* decode the stakind char array into a list of chars */ datum = SysCacheGetAttr(STATEXTOID, htup, - Anum_pg_statistic_ext_staenabled, &isnull); + Anum_pg_statistic_ext_stakind, &isnull); Assert(!isnull); arr = DatumGetArrayTypeP(datum); if (ARR_NDIM(arr) != 1 || ARR_HASNULL(arr) || ARR_ELEMTYPE(arr) != CHAROID) - elog(ERROR, "staenabled is not a 1-D char array"); - enabled = (char *) ARR_DATA_PTR(arr); + elog(ERROR, "stakind is not a 1-D char array"); + kind = (char *) ARR_DATA_PTR(arr); for (i = 0; i < ARR_DIMS(arr)[0]; i++) { - Assert((enabled[i] == STATS_EXT_NDISTINCT) || - (enabled[i] == STATS_EXT_DEPENDENCIES)); - entry->types = lappend_int(entry->types, (int) enabled[i]); + Assert((kind[i] == STATS_EXT_NDISTINCT) || + (kind[i] == STATS_EXT_DEPENDENCIES)); + entry->types = lappend_int(entry->types, (int) kind[i]); } result = lappend(result, entry); diff --git a/src/backend/utils/adt/ruleutils.c b/src/backend/utils/adt/ruleutils.c index 5f11af2..19f3c8f 100644 --- a/src/backend/utils/adt/ruleutils.c +++ b/src/backend/utils/adt/ruleutils.c @@ -1453,11 +1453,11 @@ pg_get_statisticsext_worker(Oid statextid, bool missing_ok) int colno; char *nsp; ArrayType *arr; - char *enabled; + char *kind; Datum datum; bool isnull; - bool ndistinct_enabled; - bool dependencies_enabled; + bool has_ndistinct; + bool has_dependencies; int i; statexttup = SearchSysCache1(STATEXTOID, ObjectIdGetDatum(statextid)); @@ -1479,43 +1479,43 @@ pg_get_statisticsext_worker(Oid statextid, bool missing_ok) NameStr(statextrec->staname))); /* - * Lookup the staenabled column so that we know how to handle the WITH + * Lookup the stakind column so that we know how to handle the WITH * clause. */ datum = SysCacheGetAttr(STATEXTOID, statexttup, - Anum_pg_statistic_ext_staenabled, &isnull); + Anum_pg_statistic_ext_stakind, &isnull); Assert(!isnull); arr = DatumGetArrayTypeP(datum); if (ARR_NDIM(arr) != 1 || ARR_HASNULL(arr) || ARR_ELEMTYPE(arr) != CHAROID) - elog(ERROR, "staenabled is not a 1-D char array"); - enabled = (char *) ARR_DATA_PTR(arr); + elog(ERROR, "stakind is not a 1-D char array"); + kind = (char *) ARR_DATA_PTR(arr); - ndistinct_enabled = false; - dependencies_enabled = false; + has_ndistinct = false; + has_dependencies = false; for (i = 0; i < ARR_DIMS(arr)[0]; i++) { - if (enabled[i] == STATS_EXT_NDISTINCT) - ndistinct_enabled = true; - if (enabled[i] == STATS_EXT_DEPENDENCIES) - dependencies_enabled = true; + if (kind[i] == STATS_EXT_NDISTINCT) + has_ndistinct = true; + if (kind[i] == STATS_EXT_DEPENDENCIES) + has_dependencies = true; } /* - * If any option is disabled, then we'll need to append a WITH clause to - * show which options are enabled. We omit the WITH clause on purpose - * when all options are enabled, so a pg_dump/pg_restore will create all - * statistics types on a newer postgres version, if the statistics had all - * options enabled on the original version. + * If any of the supported statistic kinds were not specified then we'll + * need to append a WITH clause to show which ones were specified. We + * omit the WITH clause on purpose when all statistic kinds were + * specified, so a pg_dump/pg_restore will create all statistic kinds when + * performing the restore on a newer PostgreSQL version. */ - if (!ndistinct_enabled || !dependencies_enabled) + if (!has_ndistinct || !has_dependencies) { appendStringInfoString(&buf, " WITH ("); - if (ndistinct_enabled) + if (has_ndistinct) appendStringInfoString(&buf, "ndistinct"); - else if (dependencies_enabled) + else if (has_dependencies) appendStringInfoString(&buf, "dependencies"); appendStringInfoChar(&buf, ')'); diff --git a/src/bin/psql/describe.c b/src/bin/psql/describe.c index e7c3d73..86a02fc 100644 --- a/src/bin/psql/describe.c +++ b/src/bin/psql/describe.c @@ -2350,8 +2350,8 @@ describeOneTableDetails(const char *schemaname, " FROM pg_catalog.unnest(stakeys) s(attnum)\n" " JOIN pg_catalog.pg_attribute a ON (starelid = a.attrelid AND\n" " a.attnum = s.attnum AND NOT attisdropped)) AS columns,\n" - " (staenabled @> '{d}') AS ndist_enabled,\n" - " (staenabled @> '{f}') AS deps_enabled\n" + " (stakind @> '{d}') AS has_ndistinct,\n" + " (stakind @> '{f}') AS has_funcdeps\n" "FROM pg_catalog.pg_statistic_ext stat " "WHERE starelid = '%s'\n" "ORDER BY 1;", diff --git a/src/include/catalog/pg_statistic_ext.h b/src/include/catalog/pg_statistic_ext.h index 0a1cc04..1130c32 100644 --- a/src/include/catalog/pg_statistic_ext.h +++ b/src/include/catalog/pg_statistic_ext.h @@ -43,7 +43,7 @@ CATALOG(pg_statistic_ext,3381) int2vector stakeys; /* array of column keys */ #ifdef CATALOG_VARLEN - char staenabled[1] BKI_FORCE_NOT_NULL; /* statistic types + char stakind[1] BKI_FORCE_NOT_NULL; /* statistic kinds * requested to build */ pg_ndistinct standistinct; /* ndistinct coefficients (serialized) */ pg_dependencies stadependencies; /* dependencies (serialized) */ @@ -68,7 +68,7 @@ typedef FormData_pg_statistic_ext *Form_pg_statistic_ext; #define Anum_pg_statistic_ext_stanamespace 3 #define Anum_pg_statistic_ext_staowner 4 #define Anum_pg_statistic_ext_stakeys 5 -#define Anum_pg_statistic_ext_staenabled 6 +#define Anum_pg_statistic_ext_stakind 6 #define Anum_pg_statistic_ext_standistinct 7 #define Anum_pg_statistic_ext_stadependencies 8 diff --git a/src/test/regress/expected/stats_ext.out b/src/test/regress/expected/stats_ext.out index b43208d..1bfde66 100644 --- a/src/test/regress/expected/stats_ext.out +++ b/src/test/regress/expected/stats_ext.out @@ -131,11 +131,11 @@ ERROR: duplicate column name in statistics definition -- correct command CREATE STATISTICS s10 ON (a, b, c) FROM ndistinct; ANALYZE ndistinct; -SELECT staenabled, standistinct +SELECT stakind, standistinct FROM pg_statistic_ext WHERE starelid = 'ndistinct'::regclass; - staenabled | standistinct -------------+------------------------------------------------------------------------------------------------ - {d,f} | [{(b 3 4), 301.000000}, {(b 3 6), 301.000000}, {(b 4 6), 301.000000}, {(b 3 4 6), 301.000000}] + stakind | standistinct +---------+------------------------------------------------------------------------------------------------ + {d,f} | [{(b 3 4), 301.000000}, {(b 3 6), 301.000000}, {(b 4 6), 301.000000}, {(b 3 4 6), 301.000000}] (1 row) -- Hash Aggregate, thanks to estimates improved by the statistic @@ -197,11 +197,11 @@ INSERT INTO ndistinct (a, b, c, filler1) cash_words(mod(i,33)::int::money) FROM generate_series(1,10000) s(i); ANALYZE ndistinct; -SELECT staenabled, standistinct +SELECT stakind, standistinct FROM pg_statistic_ext WHERE starelid = 'ndistinct'::regclass; - staenabled | standistinct -------------+---------------------------------------------------------------------------------------------------- - {d,f} | [{(b 3 4), 2550.000000}, {(b 3 6), 800.000000}, {(b 4 6), 1632.000000}, {(b 3 4 6), 10000.000000}] + stakind | standistinct +---------+---------------------------------------------------------------------------------------------------- + {d,f} | [{(b 3 4), 2550.000000}, {(b 3 6), 800.000000}, {(b 4 6), 1632.000000}, {(b 3 4 6), 10000.000000}] (1 row) -- plans using Group Aggregate, thanks to using correct esimates @@ -257,10 +257,10 @@ EXPLAIN (COSTS off) (3 rows) DROP STATISTICS s10; -SELECT staenabled, standistinct +SELECT stakind, standistinct FROM pg_statistic_ext WHERE starelid = 'ndistinct'::regclass; - staenabled | standistinct -------------+-------------- + stakind | standistinct +---------+-------------- (0 rows) -- dropping the statistics switches the plans to Hash Aggregate, diff --git a/src/test/regress/sql/stats_ext.sql b/src/test/regress/sql/stats_ext.sql index 1b0018d..e12c433 100644 --- a/src/test/regress/sql/stats_ext.sql +++ b/src/test/regress/sql/stats_ext.sql @@ -90,7 +90,7 @@ CREATE STATISTICS s10 ON (a, b, c) FROM ndistinct; ANALYZE ndistinct; -SELECT staenabled, standistinct +SELECT stakind, standistinct FROM pg_statistic_ext WHERE starelid = 'ndistinct'::regclass; -- Hash Aggregate, thanks to estimates improved by the statistic @@ -121,7 +121,7 @@ INSERT INTO ndistinct (a, b, c, filler1) ANALYZE ndistinct; -SELECT staenabled, standistinct +SELECT stakind, standistinct FROM pg_statistic_ext WHERE starelid = 'ndistinct'::regclass; -- plans using Group Aggregate, thanks to using correct esimates @@ -142,7 +142,7 @@ EXPLAIN (COSTS off) DROP STATISTICS s10; -SELECT staenabled, standistinct +SELECT stakind, standistinct FROM pg_statistic_ext WHERE starelid = 'ndistinct'::regclass; -- dropping the statistics switches the plans to Hash Aggregate,