@@ -847,7 +847,8 @@ const Validation::MSG_ENTRY Validation::vdr_msg_table[VAL_MAX_ERROR] =
847847 {true , fb_info_pip_errors, " Data page %" ULONGFORMAT" marked as free in PIP (%" ULONGFORMAT" :%" ULONGFORMAT" )" },
848848 {true , isc_info_ppage_errors, " Data page %" ULONGFORMAT" is not in PP (%" ULONGFORMAT" ). Slot (%d) is not found" },
849849 {true , isc_info_ppage_errors, " Data page %" ULONGFORMAT" is not in PP (%" ULONGFORMAT" ). Slot (%d) has value %" ULONGFORMAT},
850- {true , isc_info_ppage_errors, " Pointer page is not found for data page %" ULONGFORMAT" . dpg_sequence (%" ULONGFORMAT" ) is invalid" }
850+ {true , isc_info_ppage_errors, " Pointer page is not found for data page %" ULONGFORMAT" . dpg_sequence (%" ULONGFORMAT" ) is invalid" },
851+ {true , isc_info_dpage_errors, " Data page %" ULONGFORMAT" {sequence %" ULONGFORMAT" } marked as secondary but contains primary record versions" }
851852};
852853
853854Validation::Validation (thread_db* tdbb, UtilSvc* uSvc) :
@@ -1751,6 +1752,8 @@ Validation::RTN Validation::walk_data_page(jrd_rel* relation, ULONG page_number,
17511752 const UCHAR* const end_page = (UCHAR*) page + dbb->dbb_page_size ;
17521753 const data_page::dpg_repeat* const end = page->dpg_rpt + page->dpg_count ;
17531754 RecordNumber number ((SINT64)sequence * dbb->dbb_max_records );
1755+ int primary_versions = 0 ;
1756+ bool marked = false ;
17541757
17551758 for (const data_page::dpg_repeat* line = page->dpg_rpt ; line < end; line++, number.increment ())
17561759 {
@@ -1798,6 +1801,8 @@ Validation::RTN Validation::walk_data_page(jrd_rel* relation, ULONG page_number,
17981801 if (state == tra_committed || state == tra_limbo)
17991802 RBM_SET (vdr_tdbb->getDefaultPool (), &vdr_rel_records, number.getValue ());
18001803 }
1804+
1805+ primary_versions++;
18011806 }
18021807
18031808#ifdef DEBUG_VAL_VERBOSE
@@ -1820,7 +1825,11 @@ Validation::RTN Validation::walk_data_page(jrd_rel* relation, ULONG page_number,
18201825
18211826 if ((result == rtn_corrupt) && (vdr_flags & VDR_repair))
18221827 {
1823- CCH_MARK (vdr_tdbb, &window);
1828+ if (!marked)
1829+ {
1830+ CCH_MARK (vdr_tdbb, &window);
1831+ marked = true ;
1832+ }
18241833 header->rhd_flags |= rhd_damaged;
18251834 vdr_fixed++;
18261835 }
@@ -1832,6 +1841,22 @@ Validation::RTN Validation::walk_data_page(jrd_rel* relation, ULONG page_number,
18321841#endif
18331842 }
18341843
1844+ if (primary_versions && (dp_flags & dpg_secondary))
1845+ {
1846+ corrupt (VAL_DATA_PAGE_SEC_PRI, relation, page_number, sequence);
1847+ if (vdr_flags & VDR_update)
1848+ {
1849+ if (!marked)
1850+ {
1851+ CCH_MARK (vdr_tdbb, &window);
1852+ marked = true ;
1853+ }
1854+ page->dpg_header .pag_flags &= ~dpg_secondary;
1855+ pp_bits &= ~ppg_dp_secondary;
1856+ vdr_fixed++;
1857+ }
1858+ }
1859+
18351860 release_page (&window);
18361861
18371862#ifdef DEBUG_VAL_VERBOSE
0 commit comments