From ff22059d5dbb1147dec9b5b75ea7b388198bbf74 Mon Sep 17 00:00:00 2001 From: Vallish Pai Date: Fri, 20 Sep 2024 21:13:33 +0530 Subject: [PATCH] [cherry-pick](branch-2.1)[fix](sys_table) fix potential NPE when query table_properties and partitions sys table (#41081) ## Proposed changes Issue Number: close #xxx bp #40972 --- .../tablefunction/MetadataGenerator.java | 132 ++++++++++-------- 1 file changed, 72 insertions(+), 60 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java index 89afa498d1..746519082a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/tablefunction/MetadataGenerator.java @@ -1212,29 +1212,34 @@ public class MetadataGenerator { continue; } OlapTable olapTable = (OlapTable) table; - TableProperty property = olapTable.getTableProperty(); - if (property == null) { - // if there is no properties, then write empty properties and check next table. - TRow trow = new TRow(); - trow.addToColumnValue(new TCell().setStringVal(catalog.getName())); // TABLE_CATALOG - trow.addToColumnValue(new TCell().setStringVal(database.getFullName())); // TABLE_SCHEMA - trow.addToColumnValue(new TCell().setStringVal(table.getName())); // TABLE_NAME - trow.addToColumnValue(new TCell().setStringVal("")); // PROPERTIES_NAME - trow.addToColumnValue(new TCell().setStringVal("")); // PROPERTIES_VALUE - dataBatch.add(trow); - continue; - } + olapTable.readLock(); + try { + TableProperty property = olapTable.getTableProperty(); + if (property == null) { + // if there is no properties, then write empty properties and check next table. + TRow trow = new TRow(); + trow.addToColumnValue(new TCell().setStringVal(catalog.getName())); // TABLE_CATALOG + trow.addToColumnValue(new TCell().setStringVal(database.getFullName())); // TABLE_SCHEMA + trow.addToColumnValue(new TCell().setStringVal(table.getName())); // TABLE_NAME + trow.addToColumnValue(new TCell().setStringVal("")); // PROPERTIES_NAME + trow.addToColumnValue(new TCell().setStringVal("")); // PROPERTIES_VALUE + dataBatch.add(trow); + continue; + } - Map propertiesMap = property.getProperties(); - propertiesMap.forEach((key, value) -> { - TRow trow = new TRow(); - trow.addToColumnValue(new TCell().setStringVal(catalog.getName())); // TABLE_CATALOG - trow.addToColumnValue(new TCell().setStringVal(database.getFullName())); // TABLE_SCHEMA - trow.addToColumnValue(new TCell().setStringVal(table.getName())); // TABLE_NAME - trow.addToColumnValue(new TCell().setStringVal(key)); // PROPERTIES_NAME - trow.addToColumnValue(new TCell().setStringVal(value)); // PROPERTIES_VALUE - dataBatch.add(trow); - }); + Map propertiesMap = property.getProperties(); + propertiesMap.forEach((key, value) -> { + TRow trow = new TRow(); + trow.addToColumnValue(new TCell().setStringVal(catalog.getName())); // TABLE_CATALOG + trow.addToColumnValue(new TCell().setStringVal(database.getFullName())); // TABLE_SCHEMA + trow.addToColumnValue(new TCell().setStringVal(table.getName())); // TABLE_NAME + trow.addToColumnValue(new TCell().setStringVal(key)); // PROPERTIES_NAME + trow.addToColumnValue(new TCell().setStringVal(value)); // PROPERTIES_VALUE + dataBatch.add(trow); + }); + } finally { + olapTable.readUnlock(); + } } // for table } @@ -1342,49 +1347,56 @@ public class MetadataGenerator { } OlapTable olapTable = (OlapTable) table; - Collection allPartitions = olapTable.getAllPartitions(); + olapTable.readLock(); + try { + Collection allPartitions = olapTable.getAllPartitions(); - for (Partition partition : allPartitions) { - TRow trow = new TRow(); - trow.addToColumnValue(new TCell().setStringVal(catalog.getName())); // TABLE_CATALOG - trow.addToColumnValue(new TCell().setStringVal(database.getFullName())); // TABLE_SCHEMA - trow.addToColumnValue(new TCell().setStringVal(table.getName())); // TABLE_NAME - trow.addToColumnValue(new TCell().setStringVal(partition.getName())); // PARTITION_NAME - trow.addToColumnValue(new TCell().setStringVal("NULL")); // SUBPARTITION_NAME (always null) + for (Partition partition : allPartitions) { + TRow trow = new TRow(); + trow.addToColumnValue(new TCell().setStringVal(catalog.getName())); // TABLE_CATALOG + trow.addToColumnValue(new TCell().setStringVal(database.getFullName())); // TABLE_SCHEMA + trow.addToColumnValue(new TCell().setStringVal(table.getName())); // TABLE_NAME + trow.addToColumnValue(new TCell().setStringVal(partition.getName())); // PARTITION_NAME + trow.addToColumnValue(new TCell().setStringVal("NULL")); // SUBPARTITION_NAME (always null) - trow.addToColumnValue(new TCell().setIntVal(0)); //PARTITION_ORDINAL_POSITION (not available) - trow.addToColumnValue(new TCell().setIntVal(0)); //SUBPARTITION_ORDINAL_POSITION (not available) - trow.addToColumnValue(new TCell().setStringVal( - olapTable.getPartitionInfo().getType().toString())); // PARTITION_METHOD - trow.addToColumnValue(new TCell().setStringVal("NULL")); // SUBPARTITION_METHOD(always null) - PartitionItem item = olapTable.getPartitionInfo().getItem(partition.getId()); - if ((olapTable.getPartitionInfo().getType() == PartitionType.UNPARTITIONED) || (item == null)) { - trow.addToColumnValue(new TCell().setStringVal("NULL")); // if unpartitioned, its null - trow.addToColumnValue(new TCell().setStringVal("NULL")); // SUBPARTITION_EXPRESSION (always null) - trow.addToColumnValue(new TCell().setStringVal("NULL")); // PARITION DESC, its null - } else { + trow.addToColumnValue(new TCell().setIntVal(0)); //PARTITION_ORDINAL_POSITION (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //SUBPARTITION_ORDINAL_POSITION (not available) trow.addToColumnValue(new TCell().setStringVal( - olapTable.getPartitionInfo() - .getDisplayPartitionColumns().toString())); // PARTITION_EXPRESSION - trow.addToColumnValue(new TCell().setStringVal("NULL")); // SUBPARTITION_EXPRESSION (always null) + olapTable.getPartitionInfo().getType().toString())); // PARTITION_METHOD + trow.addToColumnValue(new TCell().setStringVal("NULL")); // SUBPARTITION_METHOD(always null) + PartitionItem item = olapTable.getPartitionInfo().getItem(partition.getId()); + if ((olapTable.getPartitionInfo().getType() == PartitionType.UNPARTITIONED) || (item == null)) { + trow.addToColumnValue(new TCell().setStringVal("NULL")); // if unpartitioned, its null + trow.addToColumnValue( + new TCell().setStringVal("NULL")); // SUBPARTITION_EXPRESSION (always null) + trow.addToColumnValue(new TCell().setStringVal("NULL")); // PARITION DESC, its null + } else { + trow.addToColumnValue(new TCell().setStringVal( + olapTable.getPartitionInfo() + .getDisplayPartitionColumns().toString())); // PARTITION_EXPRESSION + trow.addToColumnValue( + new TCell().setStringVal("NULL")); // SUBPARTITION_EXPRESSION (always null) + trow.addToColumnValue(new TCell().setStringVal( + item.getItemsSql())); // PARITION DESC + } + trow.addToColumnValue(new TCell().setLongVal(partition.getRowCount())); //TABLE_ROWS (PARTITION row) + trow.addToColumnValue(new TCell().setLongVal(partition.getAvgRowLength())); //AVG_ROW_LENGTH + trow.addToColumnValue(new TCell().setLongVal(partition.getDataLength())); //DATA_LENGTH + trow.addToColumnValue(new TCell().setIntVal(0)); //MAX_DATA_LENGTH (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //INDEX_LENGTH (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //DATA_FREE (not available) + trow.addToColumnValue(new TCell().setStringVal("NULL")); //CREATE_TIME (not available) trow.addToColumnValue(new TCell().setStringVal( - item.getItemsSql())); // PARITION DESC + TimeUtils.longToTimeString(partition.getVisibleVersionTime()))); //UPDATE_TIME + trow.addToColumnValue(new TCell().setStringVal("NULL")); // CHECK_TIME (not available) + trow.addToColumnValue(new TCell().setIntVal(0)); //CHECKSUM (not available) + trow.addToColumnValue(new TCell().setStringVal("")); // PARTITION_COMMENT (not available) + trow.addToColumnValue(new TCell().setStringVal("")); // NODEGROUP (not available) + trow.addToColumnValue(new TCell().setStringVal("")); // TABLESPACE_NAME (not available) + dataBatch.add(trow); } - trow.addToColumnValue(new TCell().setLongVal(partition.getRowCount())); //TABLE_ROWS (PARTITION row) - trow.addToColumnValue(new TCell().setLongVal(partition.getAvgRowLength())); //AVG_ROW_LENGTH - trow.addToColumnValue(new TCell().setLongVal(partition.getDataLength())); //DATA_LENGTH - trow.addToColumnValue(new TCell().setIntVal(0)); //MAX_DATA_LENGTH (not available) - trow.addToColumnValue(new TCell().setIntVal(0)); //INDEX_LENGTH (not available) - trow.addToColumnValue(new TCell().setIntVal(0)); //DATA_FREE (not available) - trow.addToColumnValue(new TCell().setStringVal("NULL")); //CREATE_TIME (not available) - trow.addToColumnValue(new TCell().setStringVal( - TimeUtils.longToTimeString(partition.getVisibleVersionTime()))); //UPDATE_TIME - trow.addToColumnValue(new TCell().setStringVal("NULL")); // CHECK_TIME (not available) - trow.addToColumnValue(new TCell().setIntVal(0)); //CHECKSUM (not available) - trow.addToColumnValue(new TCell().setStringVal("")); // PARTITION_COMMENT (not available) - trow.addToColumnValue(new TCell().setStringVal("")); // NODEGROUP (not available) - trow.addToColumnValue(new TCell().setStringVal("")); // TABLESPACE_NAME (not available) - dataBatch.add(trow); + } finally { + olapTable.readUnlock(); } } // for table }