Skip to content

Commit 2a3154d

Browse files
committed
Enable using column identifiers with special characters when deleting table column statistics.
1 parent 4347490 commit 2a3154d

File tree

2 files changed

+37
-20
lines changed

2 files changed

+37
-20
lines changed

standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java

Lines changed: 30 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@
133133
*/
134134
class MetaStoreDirectSql {
135135
private static final int NO_BATCHING = -1, DETECT_BATCHING = 0;
136+
private static final Set<String> ALLOWED_TABLES_TO_LOCK = Set.of("NOTIFICATION_SEQUENCE");
136137

137138
private static final Logger LOG = LoggerFactory.getLogger(MetaStoreDirectSql.class);
138139
private final PersistenceManager pm;
@@ -3203,6 +3204,10 @@ private void getStatsTableListResult(
32033204
}
32043205

32053206
public void lockDbTable(String tableName) throws MetaException {
3207+
if (!ALLOWED_TABLES_TO_LOCK.contains(tableName)) {
3208+
throw new MetaException("Error while locking table " + tableName);
3209+
}
3210+
32063211
String lockCommand = "lock table \"" + tableName + "\" in exclusive mode";
32073212
try {
32083213
executeNoResult(lockCommand);
@@ -3243,19 +3248,26 @@ public void deleteColumnStatsState(long tbl_id) throws MetaException {
32433248
}
32443249

32453250
public boolean deleteTableColumnStatistics(long tableId, List<String> colNames, String engine) {
3246-
String deleteSql = "delete from " + TAB_COL_STATS + " where \"TBL_ID\" = " + tableId;
3251+
String deleteSql = "delete from " + TAB_COL_STATS + " where \"TBL_ID\" = ?";
3252+
List<Object> params = new ArrayList<>(colNames == null ? 2 : colNames.size() + 2);
3253+
params.add(tableId);
3254+
32473255
if (colNames != null && !colNames.isEmpty()) {
3248-
deleteSql += " and \"COLUMN_NAME\" in (" + colNames.stream().map(col -> "'" + col + "'").collect(Collectors.joining(",")) + ")";
3256+
deleteSql += " and \"COLUMN_NAME\" in (" + makeParams(colNames.size()) + ")";
3257+
params.addAll(colNames);
32493258
}
3259+
32503260
if (engine != null) {
3251-
deleteSql += " and \"ENGINE\" = '" + engine + "'";
3261+
deleteSql += " and \"ENGINE\" = ?";
3262+
params.add(engine);
32523263
}
3253-
try {
3254-
executeNoResult(deleteSql);
3255-
} catch (SQLException e) {
3256-
LOG.warn("Error removing table column stats. ", e);
3264+
3265+
try (QueryWrapper queryParams = new QueryWrapper(pm.newQuery("javax.jdo.query.SQL", deleteSql))) {
3266+
executeWithArray(queryParams.getInnerQuery(), params.toArray(), deleteSql);
3267+
} catch (MetaException e) {
32573268
return false;
32583269
}
3270+
32593271
return true;
32603272
}
32613273

@@ -3269,16 +3281,21 @@ public List<Void> run(List<String> input) throws Exception {
32693281
input, Collections.emptyList(), -1);
32703282
if (!partitionIds.isEmpty()) {
32713283
String deleteSql = "delete from " + PART_COL_STATS + " where \"PART_ID\" in ( " + getIdListForIn(partitionIds) + ")";
3284+
List<Object> params = new ArrayList<>(colNames == null ? 1 : colNames.size() + 1);
3285+
32723286
if (colNames != null && !colNames.isEmpty()) {
3273-
deleteSql += " and \"COLUMN_NAME\" in (" + colNames.stream().map(col -> "'" + col + "'").collect(Collectors.joining(",")) + ")";
3287+
deleteSql += " and \"COLUMN_NAME\" in (" + makeParams(colNames.size()) + ")";
3288+
params.addAll(colNames);
32743289
}
3290+
32753291
if (engine != null) {
3276-
deleteSql += " and \"ENGINE\" = '" + engine + "'";
3292+
deleteSql += " and \"ENGINE\" = ?";
3293+
params.add(engine);
32773294
}
3278-
try {
3279-
executeNoResult(deleteSql);
3280-
} catch (SQLException e) {
3281-
LOG.warn("Error removing partition column stats. ", e);
3295+
3296+
try (QueryWrapper queryParams = new QueryWrapper(pm.newQuery("javax.jdo.query.SQL", deleteSql))) {
3297+
executeWithArray(queryParams.getInnerQuery(), params.toArray(), deleteSql);
3298+
} catch (MetaException e) {
32823299
throw new MetaException("Error removing partition column stats: " + e.getMessage());
32833300
}
32843301
}

standalone-metastore/metastore-server/src/test/java/org/apache/hadoop/hive/metastore/TestObjectStore.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -919,38 +919,38 @@ public void testTableStatisticsOps() throws Exception {
919919
List<ColumnStatistics> tabColStats;
920920
try (AutoCloseable c = deadline()) {
921921
tabColStats = objectStore.getTableColumnStatistics(DEFAULT_CATALOG_NAME, DB1, TABLE1,
922-
Arrays.asList("test_col1", "test_col2"));
922+
Arrays.asList("test_col1", "test_col' 2"));
923923
}
924924
Assert.assertEquals(0, tabColStats.size());
925925

926926
ColumnStatisticsDesc statsDesc = new ColumnStatisticsDesc(true, DB1, TABLE1);
927927
ColumnStatisticsObj statsObj1 = new ColumnStatisticsObj("test_col1", "int",
928928
new ColumnStatisticsData(ColumnStatisticsData._Fields.DECIMAL_STATS, new DecimalColumnStatsData(100, 1000)));
929-
ColumnStatisticsObj statsObj2 = new ColumnStatisticsObj("test_col2", "int",
929+
ColumnStatisticsObj statsObj2 = new ColumnStatisticsObj("test_col' 2", "int",
930930
new ColumnStatisticsData(ColumnStatisticsData._Fields.DECIMAL_STATS, new DecimalColumnStatsData(200, 2000)));
931931
ColumnStatistics colStats = new ColumnStatistics(statsDesc, Arrays.asList(statsObj1, statsObj2));
932932
colStats.setEngine(ENGINE);
933933
objectStore.updateTableColumnStatistics(colStats, null, 0);
934934

935935
try (AutoCloseable c = deadline()) {
936936
tabColStats = objectStore.getTableColumnStatistics(DEFAULT_CATALOG_NAME, DB1, TABLE1,
937-
Arrays.asList("test_col1", "test_col2"));
937+
Arrays.asList("test_col1", "test_col' 2"));
938938
}
939939
Assert.assertEquals(1, tabColStats.size());
940940
Assert.assertEquals(2, tabColStats.get(0).getStatsObjSize());
941941

942942
objectStore.deleteTableColumnStatistics(DEFAULT_CATALOG_NAME, DB1, TABLE1, "test_col1", ENGINE);
943943
try (AutoCloseable c = deadline()) {
944944
tabColStats = objectStore.getTableColumnStatistics(DEFAULT_CATALOG_NAME, DB1, TABLE1,
945-
Arrays.asList("test_col1", "test_col2"));
945+
Arrays.asList("test_col1", "test_col' 2"));
946946
}
947947
Assert.assertEquals(1, tabColStats.size());
948948
Assert.assertEquals(1, tabColStats.get(0).getStatsObjSize());
949949

950-
objectStore.deleteTableColumnStatistics(DEFAULT_CATALOG_NAME, DB1, TABLE1, "test_col2", ENGINE);
950+
objectStore.deleteTableColumnStatistics(DEFAULT_CATALOG_NAME, DB1, TABLE1, "test_col' 2", ENGINE);
951951
try (AutoCloseable c = deadline()) {
952952
tabColStats = objectStore.getTableColumnStatistics(DEFAULT_CATALOG_NAME, DB1, TABLE1,
953-
Arrays.asList("test_col1", "test_col2"));
953+
Arrays.asList("test_col1", "test_col' 2"));
954954
}
955955
Assert.assertEquals(0, tabColStats.size());
956956
}
@@ -1051,7 +1051,7 @@ private void createPartitionedTable(boolean withPrivileges, boolean withStatisti
10511051
.setDbName(DB1)
10521052
.setTableName(TABLE1)
10531053
.addCol("test_col1", "int")
1054-
.addCol("test_col2", "int")
1054+
.addCol("test_col' 2", "int")
10551055
.addPartCol("test_part_col", "int")
10561056
.addCol("test_bucket_col", "int", "test bucket col comment")
10571057
.addCol("test_skewed_col", "int", "test skewed col comment")

0 commit comments

Comments
 (0)