@@ -17,25 +17,60 @@ vector<string> ListCompressionTypes(void) {
1717 return compression_types;
1818}
1919
20- bool CompressionTypeIsDeprecated (CompressionType compression_type, optional_ptr<StorageManager> storage_manager) {
21- vector<CompressionType> types ({CompressionType::COMPRESSION_PATAS, CompressionType::COMPRESSION_CHIMP});
22- if (storage_manager) {
23- if (storage_manager->GetStorageVersion () >= 5 ) {
24- // ! NOTE: storage_manager is an optional_ptr because it's called from ForceCompressionSetting, which doesn't
25- // ! have guaranteed access to a StorageManager The introduction of DICT_FSST deprecates Dictionary and FSST
26- // ! compression methods
27- types.emplace_back (CompressionType::COMPRESSION_DICTIONARY);
28- types.emplace_back (CompressionType::COMPRESSION_FSST);
29- } else {
30- types.emplace_back (CompressionType::COMPRESSION_DICT_FSST);
31- }
20+ namespace {
21+ struct CompressionMethodRequirements {
22+ CompressionType type;
23+ optional_idx minimum_storage_version;
24+ optional_idx maximum_storage_version;
25+ };
26+ } // namespace
27+
28+ CompressionAvailabilityResult CompressionTypeIsAvailable (CompressionType compression_type,
29+ optional_ptr<StorageManager> storage_manager) {
30+ // ! Max storage compatibility
31+ vector<CompressionMethodRequirements> candidates ({{CompressionType::COMPRESSION_PATAS, optional_idx (), 0 },
32+ {CompressionType::COMPRESSION_CHIMP, optional_idx (), 0 },
33+ {CompressionType::COMPRESSION_DICTIONARY, 0 , 4 },
34+ {CompressionType::COMPRESSION_FSST, 0 , 4 },
35+ {CompressionType::COMPRESSION_DICT_FSST, 5 , optional_idx ()}});
36+
37+ optional_idx current_storage_version;
38+ if (storage_manager && storage_manager->HasStorageVersion ()) {
39+ current_storage_version = storage_manager->GetStorageVersion ();
3240 }
33- for (auto &type : types) {
34- if (type == compression_type) {
35- return true ;
41+ for (auto &candidate : candidates) {
42+ auto &type = candidate.type ;
43+ if (type != compression_type) {
44+ continue ;
45+ }
46+ auto &min = candidate.minimum_storage_version ;
47+ auto &max = candidate.maximum_storage_version ;
48+
49+ if (!min.IsValid ()) {
50+ // ! Used to signal: always deprecated
51+ return CompressionAvailabilityResult::Deprecated ();
52+ }
53+
54+ if (!current_storage_version.IsValid ()) {
55+ // ! Can't determine in this call whether it's available or not, default to available
56+ return CompressionAvailabilityResult ();
57+ }
58+
59+ auto current_version = current_storage_version.GetIndex ();
60+ D_ASSERT (min.IsValid ());
61+ if (min.GetIndex () > current_version) {
62+ // ! Minimum required storage version is higher than the current storage version, this method isn't available
63+ // ! yet
64+ return CompressionAvailabilityResult::NotAvailableYet ();
65+ }
66+ if (max.IsValid () && max.GetIndex () < current_version) {
67+ // ! Maximum supported storage version is lower than the current storage version, this method is no longer
68+ // ! available
69+ return CompressionAvailabilityResult::Deprecated ();
3670 }
71+ return CompressionAvailabilityResult ();
3772 }
38- return false ;
73+ return CompressionAvailabilityResult () ;
3974}
4075
4176CompressionType CompressionTypeFromString (const string &str) {
0 commit comments