diff options
Diffstat (limited to 'src/backend/commands/statscmds.c')
-rw-r--r-- | src/backend/commands/statscmds.c | 72 |
1 files changed, 34 insertions, 38 deletions
diff --git a/src/backend/commands/statscmds.c b/src/backend/commands/statscmds.c index f9d3f9c7b88..f7419b8f562 100644 --- a/src/backend/commands/statscmds.c +++ b/src/backend/commands/statscmds.c @@ -75,13 +75,10 @@ CreateStatistics(CreateStatsStmt *stmt) HeapTuple htup; Datum values[Natts_pg_statistic_ext]; bool nulls[Natts_pg_statistic_ext]; - Datum datavalues[Natts_pg_statistic_ext_data]; - bool datanulls[Natts_pg_statistic_ext_data]; int2vector *stxkeys; List *stxexprs = NIL; Datum exprsDatum; Relation statrel; - Relation datarel; Relation rel = NULL; Oid relid; ObjectAddress parentobject, @@ -514,28 +511,10 @@ CreateStatistics(CreateStatsStmt *stmt) relation_close(statrel, RowExclusiveLock); /* - * Also build the pg_statistic_ext_data tuple, to hold the actual - * statistics data. + * We used to create the pg_statistic_ext_data tuple too, but it's not clear + * what value should the stxdinherit flag have (it depends on whether the rel + * is partitioned, contains data, etc.) */ - datarel = table_open(StatisticExtDataRelationId, RowExclusiveLock); - - memset(datavalues, 0, sizeof(datavalues)); - memset(datanulls, false, sizeof(datanulls)); - - datavalues[Anum_pg_statistic_ext_data_stxoid - 1] = ObjectIdGetDatum(statoid); - - /* no statistics built yet */ - datanulls[Anum_pg_statistic_ext_data_stxdndistinct - 1] = true; - datanulls[Anum_pg_statistic_ext_data_stxddependencies - 1] = true; - datanulls[Anum_pg_statistic_ext_data_stxdmcv - 1] = true; - datanulls[Anum_pg_statistic_ext_data_stxdexpr - 1] = true; - - /* insert it into pg_statistic_ext_data */ - htup = heap_form_tuple(datarel->rd_att, datavalues, datanulls); - CatalogTupleInsert(datarel, htup); - heap_freetuple(htup); - - relation_close(datarel, RowExclusiveLock); InvokeObjectPostCreateHook(StatisticExtRelationId, statoid, 0); @@ -717,32 +696,49 @@ AlterStatistics(AlterStatsStmt *stmt) } /* - * Guts of statistics object deletion. + * Delete entry in pg_statistic_ext_data catalog. We don't know if the row + * exists, so don't error out. */ void -RemoveStatisticsById(Oid statsOid) +RemoveStatisticsDataById(Oid statsOid, bool inh) { Relation relation; HeapTuple tup; - Form_pg_statistic_ext statext; - Oid relid; - /* - * First delete the pg_statistic_ext_data tuple holding the actual - * statistical data. - */ relation = table_open(StatisticExtDataRelationId, RowExclusiveLock); - tup = SearchSysCache1(STATEXTDATASTXOID, ObjectIdGetDatum(statsOid)); - - if (!HeapTupleIsValid(tup)) /* should not happen */ - elog(ERROR, "cache lookup failed for statistics data %u", statsOid); + tup = SearchSysCache2(STATEXTDATASTXOID, ObjectIdGetDatum(statsOid), + BoolGetDatum(inh)); - CatalogTupleDelete(relation, &tup->t_self); + /* We don't know if the data row for inh value exists. */ + if (HeapTupleIsValid(tup)) + { + CatalogTupleDelete(relation, &tup->t_self); - ReleaseSysCache(tup); + ReleaseSysCache(tup); + } table_close(relation, RowExclusiveLock); +} + +/* + * Guts of statistics object deletion. + */ +void +RemoveStatisticsById(Oid statsOid) +{ + Relation relation; + HeapTuple tup; + Form_pg_statistic_ext statext; + Oid relid; + + /* + * First delete the pg_statistic_ext_data tuples holding the actual + * statistical data. There might be data with/without inheritance, so + * attempt deleting both. + */ + RemoveStatisticsDataById(statsOid, true); + RemoveStatisticsDataById(statsOid, false); /* * Delete the pg_statistic_ext tuple. Also send out a cache inval on the |