@@ -469,7 +469,18 @@ impl Protocol {
469
469
match & self . writer_features {
470
470
Some ( writer_features) if self . min_writer_version == 7 => {
471
471
// if we're on version 7, make sure we support all the specified features
472
- ensure_supported_features ( writer_features, & SUPPORTED_WRITER_FEATURES )
472
+ ensure_supported_features ( writer_features, & SUPPORTED_WRITER_FEATURES ) ?;
473
+
474
+ // ensure that there is no illegal combination of features
475
+ if writer_features. contains ( & WriterFeature :: RowTracking )
476
+ && !writer_features. contains ( & WriterFeature :: DomainMetadata )
477
+ {
478
+ Err ( Error :: invalid_protocol (
479
+ "rowTracking feature requires domainMetadata to also be enabled" ,
480
+ ) )
481
+ } else {
482
+ Ok ( ( ) )
483
+ }
473
484
}
474
485
Some ( _) => {
475
486
// there are features, but we're not on 7, so the protocol is actually broken
@@ -914,15 +925,17 @@ impl DomainMetadata {
914
925
mod tests {
915
926
use super :: * ;
916
927
use crate :: {
917
- arrow:: array:: {
918
- Array , BooleanArray , Int32Array , Int64Array , ListArray , ListBuilder , MapBuilder ,
919
- MapFieldNames , RecordBatch , StringArray , StringBuilder , StructArray ,
928
+ arrow:: {
929
+ array:: {
930
+ Array , BooleanArray , Int32Array , Int64Array , ListArray , ListBuilder , MapBuilder ,
931
+ MapFieldNames , RecordBatch , StringArray , StringBuilder , StructArray ,
932
+ } ,
933
+ datatypes:: { DataType as ArrowDataType , Field , Schema } ,
934
+ json:: ReaderBuilder ,
920
935
} ,
921
- arrow:: datatypes:: { DataType as ArrowDataType , Field , Schema } ,
922
- arrow:: json:: ReaderBuilder ,
923
- engine:: arrow_data:: ArrowEngineData ,
924
- engine:: arrow_expression:: ArrowEvaluationHandler ,
936
+ engine:: { arrow_data:: ArrowEngineData , arrow_expression:: ArrowEvaluationHandler } ,
925
937
schema:: { ArrayType , DataType , MapType , StructField } ,
938
+ utils:: test_utils:: assert_result_error_with_message,
926
939
Engine , EvaluationHandler , JsonHandler , ParquetHandler , StorageHandler ,
927
940
} ;
928
941
use serde_json:: json;
@@ -1315,6 +1328,7 @@ mod tests {
1315
1328
Some ( vec ! [
1316
1329
WriterFeature :: AppendOnly ,
1317
1330
WriterFeature :: DeletionVectors ,
1331
+ WriterFeature :: DomainMetadata ,
1318
1332
WriterFeature :: Invariants ,
1319
1333
WriterFeature :: RowTracking ,
1320
1334
] ) ,
@@ -1323,6 +1337,25 @@ mod tests {
1323
1337
assert ! ( protocol. ensure_write_supported( ) . is_ok( ) ) ;
1324
1338
}
1325
1339
1340
+ #[ test]
1341
+ fn test_illegal_writer_feature_combination ( ) {
1342
+ let protocol = Protocol :: try_new (
1343
+ 3 ,
1344
+ 7 ,
1345
+ Some :: < Vec < String > > ( vec ! [ ] ) ,
1346
+ Some ( vec ! [
1347
+ // No domain metadata even though that is required
1348
+ WriterFeature :: RowTracking ,
1349
+ ] ) ,
1350
+ )
1351
+ . unwrap ( ) ;
1352
+
1353
+ assert_result_error_with_message (
1354
+ protocol. ensure_write_supported ( ) ,
1355
+ "rowTracking feature requires domainMetadata to also be enabled" ,
1356
+ ) ;
1357
+ }
1358
+
1326
1359
#[ test]
1327
1360
fn test_ensure_supported_features ( ) {
1328
1361
let supported_features = [ ReaderFeature :: ColumnMapping , ReaderFeature :: DeletionVectors ] ;
0 commit comments