mirror of
https://github.com/postgres/postgres.git
synced 2026-06-21 06:29:06 -04:00
Fix inconsistencies with pg_restore --statistics[-only]
Attempting to restore a schema, a table or an index with --only-statistics skipped all the statistics of the objects wanted. Like for pg_dump, statistics should be included, so this created an assymetry between dump and restore. A second set of problems existed for --table and --index, where the presence of --statistics skipped the restore of the stats of the object(s) targetted. This issue has been reported originally as related to an inconsistency with the way extended stats restore is handled in Postgres v19, but the issue is related to the restore of relation and attribute statistics in v18. Some TAP tests are added to cover all these cases. Reported-by: Chao Li <li.evan.chao@gmail.com> Author: Chao Li <li.evan.chao@gmail.com> Author: Michael Paquier <michael@paquier.xyz> Reviewed-by: Corey Huinker <corey.huinker@gmail.com> Discussion: https://postgr.es/m/66E80CAB-527C-42B1-BB65-3F82CF4AD998@gmail.com Backpatch-through: 18
This commit is contained in:
parent
a75bd485b5
commit
0dd93de69e
2 changed files with 87 additions and 9 deletions
|
|
@ -3175,7 +3175,6 @@ _tocEntryRequired(TocEntry *te, teSection curSection, ArchiveHandle *AH)
|
|||
*/
|
||||
if (strcmp(te->desc, "ACL") == 0 ||
|
||||
strcmp(te->desc, "COMMENT") == 0 ||
|
||||
strcmp(te->desc, "STATISTICS DATA") == 0 ||
|
||||
strcmp(te->desc, "SECURITY LABEL") == 0)
|
||||
{
|
||||
/* Database properties react to createDB, not selectivity options. */
|
||||
|
|
@ -3246,14 +3245,33 @@ _tocEntryRequired(TocEntry *te, teSection curSection, ArchiveHandle *AH)
|
|||
|
||||
if (ropt->selTypes)
|
||||
{
|
||||
if (strcmp(te->desc, "TABLE") == 0 ||
|
||||
strcmp(te->desc, "TABLE DATA") == 0 ||
|
||||
strcmp(te->desc, "VIEW") == 0 ||
|
||||
strcmp(te->desc, "FOREIGN TABLE") == 0 ||
|
||||
strcmp(te->desc, "MATERIALIZED VIEW") == 0 ||
|
||||
strcmp(te->desc, "MATERIALIZED VIEW DATA") == 0 ||
|
||||
strcmp(te->desc, "SEQUENCE") == 0 ||
|
||||
strcmp(te->desc, "SEQUENCE SET") == 0)
|
||||
if (strcmp(te->desc, "STATISTICS DATA") == 0)
|
||||
{
|
||||
bool dumpthis = false;
|
||||
|
||||
/*
|
||||
* Statistics data can be assigned for tables or indexes, so
|
||||
* check both.
|
||||
*/
|
||||
if (ropt->selTable &&
|
||||
(ropt->tableNames.head == NULL ||
|
||||
simple_string_list_member(&ropt->tableNames, te->tag)))
|
||||
dumpthis = true;
|
||||
if (ropt->selIndex &&
|
||||
(ropt->indexNames.head == NULL ||
|
||||
simple_string_list_member(&ropt->indexNames, te->tag)))
|
||||
dumpthis = true;
|
||||
if (!dumpthis)
|
||||
return 0;
|
||||
}
|
||||
else if (strcmp(te->desc, "TABLE") == 0 ||
|
||||
strcmp(te->desc, "TABLE DATA") == 0 ||
|
||||
strcmp(te->desc, "VIEW") == 0 ||
|
||||
strcmp(te->desc, "FOREIGN TABLE") == 0 ||
|
||||
strcmp(te->desc, "MATERIALIZED VIEW") == 0 ||
|
||||
strcmp(te->desc, "MATERIALIZED VIEW DATA") == 0 ||
|
||||
strcmp(te->desc, "SEQUENCE") == 0 ||
|
||||
strcmp(te->desc, "SEQUENCE SET") == 0)
|
||||
{
|
||||
if (!ropt->selTable)
|
||||
return 0;
|
||||
|
|
|
|||
|
|
@ -587,6 +587,60 @@ my %pgdump_runs = (
|
|||
'postgres',
|
||||
],
|
||||
},
|
||||
statistics_only_with_schema => {
|
||||
dump_cmd => [
|
||||
'pg_dump', '--no-sync',
|
||||
'--format' => 'custom',
|
||||
'--file' => "$tempdir/statistics_only_with_schema.dump",
|
||||
'--statistics-only',
|
||||
'--schema' => 'dump_test',
|
||||
'postgres',
|
||||
],
|
||||
restore_cmd => [
|
||||
'pg_restore',
|
||||
'--format' => 'custom',
|
||||
'--file' => "$tempdir/statistics_only_with_schema.sql",
|
||||
'--statistics-only',
|
||||
'--schema' => 'dump_test',
|
||||
"$tempdir/statistics_only_with_schema.dump",
|
||||
],
|
||||
},
|
||||
statistics_only_with_table => {
|
||||
dump_cmd => [
|
||||
'pg_dump', '--no-sync',
|
||||
'--format' => 'custom',
|
||||
'--file' => "$tempdir/statistics_only_with_table.dump",
|
||||
'--statistics',
|
||||
'postgres',
|
||||
],
|
||||
restore_cmd => [
|
||||
'pg_restore',
|
||||
'--format' => 'custom',
|
||||
'--file' => "$tempdir/statistics_only_with_table.sql",
|
||||
'--statistics-only',
|
||||
'--table' => 'test_table',
|
||||
'--schema' => 'dump_test',
|
||||
"$tempdir/statistics_only_with_table.dump",
|
||||
],
|
||||
},
|
||||
statistics_only_with_index => {
|
||||
dump_cmd => [
|
||||
'pg_dump', '--no-sync',
|
||||
'--format' => 'custom',
|
||||
'--file' => "$tempdir/statistics_only_with_index.dump",
|
||||
'--statistics',
|
||||
'postgres',
|
||||
],
|
||||
restore_cmd => [
|
||||
'pg_restore',
|
||||
'--format' => 'custom',
|
||||
'--file' => "$tempdir/statistics_only_with_index.sql",
|
||||
'--statistics-only',
|
||||
'--index' => '"dump_test"\'s post-data index',
|
||||
'--schema' => 'dump_test',
|
||||
"$tempdir/statistics_only_with_index.dump",
|
||||
],
|
||||
},
|
||||
no_schema => {
|
||||
dump_cmd => [
|
||||
'pg_dump', '--no-sync',
|
||||
|
|
@ -4850,6 +4904,8 @@ my %tests = (
|
|||
no_schema => 1,
|
||||
section_post_data => 1,
|
||||
statistics_only => 1,
|
||||
statistics_only_with_schema => 1,
|
||||
statistics_only_with_index => 1,
|
||||
schema_only_with_statistics => 1,
|
||||
},
|
||||
unlike => {
|
||||
|
|
@ -4878,6 +4934,7 @@ my %tests = (
|
|||
no_schema => 1,
|
||||
section_post_data => 1,
|
||||
statistics_only => 1,
|
||||
statistics_only_with_schema => 1,
|
||||
schema_only_with_statistics => 1,
|
||||
},
|
||||
unlike => {
|
||||
|
|
@ -4907,6 +4964,9 @@ my %tests = (
|
|||
section_data => 1,
|
||||
section_post_data => 1,
|
||||
statistics_only => 1,
|
||||
statistics_only_with_schema => 1,
|
||||
statistics_only_with_index => 1,
|
||||
statistics_only_with_table => 1,
|
||||
schema_only_with_statistics => 1,
|
||||
},
|
||||
unlike => {
|
||||
|
|
|
|||
Loading…
Reference in a new issue