@@ -894,6 +894,177 @@ public Object[][] columnMappingWithTrueAndFalseDataProvider()
894
894
return cartesianProduct (supportedColumnMappingForDmlDataProvider (), trueFalse ());
895
895
}
896
896
897
+ @ Test (groups = {DELTA_LAKE_DATABRICKS , DELTA_LAKE_OSS , DELTA_LAKE_EXCLUDE_73 , DELTA_LAKE_EXCLUDE_91 , DELTA_LAKE_EXCLUDE_104 , PROFILE_SPECIFIC_TESTS }, dataProvider = "columnMappingDataProvider" )
898
+ @ Flaky (issue = DATABRICKS_COMMUNICATION_FAILURE_ISSUE , match = DATABRICKS_COMMUNICATION_FAILURE_MATCH )
899
+ public void testTrinoRenameColumnWithColumnMappingMode (String mode )
900
+ {
901
+ String tableName = "test_rename_column_" + randomNameSuffix ();
902
+
903
+ onDelta ().executeQuery ("" +
904
+ "CREATE TABLE default." + tableName +
905
+ " (id INT, data INT, part STRING)" +
906
+ " USING delta " +
907
+ " PARTITIONED BY (part) " +
908
+ " LOCATION 's3://" + bucketName + "/databricks-compatibility-test-" + tableName + "'" +
909
+ " TBLPROPERTIES ('delta.columnMapping.mode' = '" + mode + "')" );
910
+
911
+ try {
912
+ onDelta ().executeQuery ("INSERT INTO default." + tableName + " VALUES (1, 10, 'part#1')" );
913
+
914
+ onTrino ().executeQuery ("ALTER TABLE delta.default." + tableName + " RENAME COLUMN data TO new_data" );
915
+ onTrino ().executeQuery ("ALTER TABLE delta.default." + tableName + " RENAME COLUMN part TO new_part" );
916
+
917
+ assertThat (onTrino ().executeQuery ("DESCRIBE delta.default." + tableName ))
918
+ .containsOnly (
919
+ row ("id" , "integer" , "" , "" ),
920
+ row ("new_data" , "integer" , "" , "" ),
921
+ row ("new_part" , "varchar" , "" , "" ));
922
+
923
+ assertThat (onTrino ().executeQuery ("SELECT * FROM delta.default." + tableName ))
924
+ .containsOnly (row (1 , 10 , "part#1" ));
925
+ assertThat (onDelta ().executeQuery ("SELECT * FROM default." + tableName ))
926
+ .containsOnly (row (1 , 10 , "part#1" ));
927
+
928
+ // Ensure renaming to the dropped column doesn't restore the old data
929
+ // TODO: Drop a column in Trino once the connector supports the syntax
930
+ assertQueryFailure (() -> onTrino ().executeQuery ("ALTER TABLE delta.default." + tableName + " DROP COLUMN id" ))
931
+ .hasMessageContaining ("This connector does not support dropping columns" );
932
+ onDelta ().executeQuery ("ALTER TABLE default." + tableName + " DROP COLUMN id" );
933
+ onDelta ().executeQuery ("ALTER TABLE default." + tableName + " RENAME COLUMN new_data TO id" );
934
+
935
+ assertThat (onTrino ().executeQuery ("SELECT id, new_part FROM delta.default." + tableName ))
936
+ .containsOnly (row (10 , "part#1" ));
937
+ assertThat (onDelta ().executeQuery ("SELECT id, new_part FROM default." + tableName ))
938
+ .containsOnly (row (10 , "part#1" ));
939
+ }
940
+ finally {
941
+ onDelta ().executeQuery ("DROP TABLE default." + tableName );
942
+ }
943
+ }
944
+
945
+ @ Test (groups = {DELTA_LAKE_DATABRICKS , DELTA_LAKE_OSS , DELTA_LAKE_EXCLUDE_73 , DELTA_LAKE_EXCLUDE_91 , DELTA_LAKE_EXCLUDE_104 , PROFILE_SPECIFIC_TESTS }, dataProvider = "columnMappingDataProvider" )
946
+ @ Flaky (issue = DATABRICKS_COMMUNICATION_FAILURE_ISSUE , match = DATABRICKS_COMMUNICATION_FAILURE_MATCH )
947
+ public void testSparkRenameColumnWithColumnMappingMode (String mode )
948
+ {
949
+ String tableName = "test_spark_rename_column_" + randomNameSuffix ();
950
+
951
+ onDelta ().executeQuery ("" +
952
+ "CREATE TABLE default." + tableName +
953
+ " (id INT, data INT, part STRING)" +
954
+ " USING delta " +
955
+ " PARTITIONED BY (part) " +
956
+ " LOCATION 's3://" + bucketName + "/databricks-compatibility-test-" + tableName + "'" +
957
+ " TBLPROPERTIES ('delta.columnMapping.mode' = '" + mode + "')" );
958
+
959
+ try {
960
+ onDelta ().executeQuery ("INSERT INTO default." + tableName + " VALUES (1, 10, 'part#1')" );
961
+
962
+ onDelta ().executeQuery ("ALTER TABLE default." + tableName + " RENAME COLUMN data TO new_data" );
963
+ onDelta ().executeQuery ("ALTER TABLE default." + tableName + " RENAME COLUMN part TO new_part" );
964
+
965
+ assertThat (onTrino ().executeQuery ("DESCRIBE delta.default." + tableName ))
966
+ .containsOnly (
967
+ row ("id" , "integer" , "" , "" ),
968
+ row ("new_data" , "integer" , "" , "" ),
969
+ row ("new_part" , "varchar" , "" , "" ));
970
+
971
+ assertThat (onTrino ().executeQuery ("SELECT * FROM delta.default." + tableName ))
972
+ .containsOnly (row (1 , 10 , "part#1" ));
973
+ assertThat (onDelta ().executeQuery ("SELECT * FROM default." + tableName ))
974
+ .containsOnly (row (1 , 10 , "part#1" ));
975
+
976
+ // Ensure renaming to the dropped column doesn't restore the old data
977
+ onDelta ().executeQuery ("ALTER TABLE default." + tableName + " DROP COLUMN id" );
978
+ onDelta ().executeQuery ("ALTER TABLE default." + tableName + " RENAME COLUMN new_data TO id" );
979
+
980
+ assertThat (onTrino ().executeQuery ("SELECT id, new_part FROM delta.default." + tableName ))
981
+ .containsOnly (row (10 , "part#1" ));
982
+ assertThat (onDelta ().executeQuery ("SELECT id, new_part FROM default." + tableName ))
983
+ .containsOnly (row (10 , "part#1" ));
984
+ }
985
+ finally {
986
+ onDelta ().executeQuery ("DROP TABLE default." + tableName );
987
+ }
988
+ }
989
+
990
+ @ Test (groups = {DELTA_LAKE_DATABRICKS , DELTA_LAKE_OSS , DELTA_LAKE_EXCLUDE_73 , DELTA_LAKE_EXCLUDE_91 , DELTA_LAKE_EXCLUDE_104 , PROFILE_SPECIFIC_TESTS }, dataProvider = "columnMappingDataProvider" )
991
+ @ Flaky (issue = DATABRICKS_COMMUNICATION_FAILURE_ISSUE , match = DATABRICKS_COMMUNICATION_FAILURE_MATCH )
992
+ public void testTrinoExtendedStatisticsRenameColumnWithColumnMappingMode (String mode )
993
+ {
994
+ String tableName = "test_rename_column_" + randomNameSuffix ();
995
+
996
+ onDelta ().executeQuery ("" +
997
+ "CREATE TABLE default." + tableName +
998
+ " (a INT, b INT)" +
999
+ " USING delta " +
1000
+ " LOCATION 's3://" + bucketName + "/databricks-compatibility-test-" + tableName + "'" +
1001
+ " TBLPROPERTIES ('delta.columnMapping.mode' = '" + mode + "')" );
1002
+
1003
+ try {
1004
+ onDelta ().executeQuery ("INSERT INTO default." + tableName + " VALUES (1, 2)" );
1005
+ onTrino ().executeQuery ("ANALYZE delta.default." + tableName );
1006
+ assertThat (onTrino ().executeQuery ("SHOW STATS FOR delta.default." + tableName ))
1007
+ .containsOnly (
1008
+ row ("a" , null , 1.0 , 0.0 , null , "1" , "1" ),
1009
+ row ("b" , null , 1.0 , 0.0 , null , "2" , "2" ),
1010
+ row (null , null , null , null , 1.0 , null , null ));
1011
+
1012
+ onTrino ().executeQuery ("ALTER TABLE delta.default." + tableName + " RENAME COLUMN b TO new_b" );
1013
+ assertThat (onTrino ().executeQuery ("SHOW STATS FOR delta.default." + tableName ))
1014
+ .containsOnly (
1015
+ row ("a" , null , 1.0 , 0.0 , null , "1" , "1" ),
1016
+ row ("new_b" , null , 1.0 , 0.0 , null , "2" , "2" ),
1017
+ row (null , null , null , null , 1.0 , null , null ));
1018
+
1019
+ // Re-analyzing should work
1020
+ onTrino ().executeQuery ("ANALYZE delta.default." + tableName );
1021
+ assertThat (onTrino ().executeQuery ("SHOW STATS FOR delta.default." + tableName ))
1022
+ .containsOnly (
1023
+ row ("a" , null , 1.0 , 0.0 , null , "1" , "1" ),
1024
+ row ("new_b" , null , 1.0 , 0.0 , null , "2" , "2" ),
1025
+ row (null , null , null , null , 1.0 , null , null ));
1026
+ }
1027
+ finally {
1028
+ onDelta ().executeQuery ("DROP TABLE default." + tableName );
1029
+ }
1030
+ }
1031
+
1032
+ @ Test (groups = {DELTA_LAKE_DATABRICKS , DELTA_LAKE_OSS , DELTA_LAKE_EXCLUDE_73 , DELTA_LAKE_EXCLUDE_91 , DELTA_LAKE_EXCLUDE_104 , PROFILE_SPECIFIC_TESTS })
1033
+ @ Flaky (issue = DATABRICKS_COMMUNICATION_FAILURE_ISSUE , match = DATABRICKS_COMMUNICATION_FAILURE_MATCH )
1034
+ public void testUnsupportedRenameColumnWithColumnMappingModeNone ()
1035
+ {
1036
+ String tableName = "test_unsupported_rename_column_" + randomNameSuffix ();
1037
+
1038
+ onDelta ().executeQuery ("" +
1039
+ "CREATE TABLE default." + tableName +
1040
+ " (id INT, data INT)" +
1041
+ " USING delta " +
1042
+ " LOCATION 's3://" + bucketName + "/databricks-compatibility-test-" + tableName + "'" +
1043
+ " TBLPROPERTIES ('delta.columnMapping.mode' = 'none')" );
1044
+
1045
+ try {
1046
+ onDelta ().executeQuery ("INSERT INTO default." + tableName + " VALUES (1, 10)" );
1047
+
1048
+ assertQueryFailure (() -> onTrino ().executeQuery ("ALTER TABLE delta.default." + tableName + " RENAME COLUMN data TO new_data" ))
1049
+ .hasMessageContaining ("Cannot rename column with the column mapping: NONE" );
1050
+ assertQueryFailure (() -> onDelta ().executeQuery ("ALTER TABLE default." + tableName + " RENAME COLUMN data TO new_data" ))
1051
+ .hasMessageContaining (" Column rename is not supported for your Delta table" );
1052
+
1053
+ assertThat (onTrino ().executeQuery ("DESCRIBE delta.default." + tableName ))
1054
+ .containsOnly (
1055
+ row ("id" , "integer" , "" , "" ),
1056
+ row ("data" , "integer" , "" , "" ));
1057
+
1058
+ assertThat (onTrino ().executeQuery ("SELECT * FROM delta.default." + tableName ))
1059
+ .containsOnly (row (1 , 10 ));
1060
+ assertThat (onDelta ().executeQuery ("SELECT * FROM default." + tableName ))
1061
+ .containsOnly (row (1 , 10 ));
1062
+ }
1063
+ finally {
1064
+ onDelta ().executeQuery ("DROP TABLE default." + tableName );
1065
+ }
1066
+ }
1067
+
897
1068
@ DataProvider
898
1069
public Object [][] columnMappingDataProvider ()
899
1070
{
0 commit comments