From 10a77253d90474678681e1b55ac6f39d4c3f369d Mon Sep 17 00:00:00 2001 From: Vallish Date: Thu, 19 Sep 2024 06:30:28 +0000 Subject: [PATCH] [fix](sys_table) fix potential NPE when query table_properties and partitions sys table --- .../tablefunction/MetadataGenerator.java | 134 ++++++++++-------- 1 file changed, 73 insertions(+), 61 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 04cd25642a4d54..103c659a990645 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 @@ -1211,29 +1211,34 @@ private static void tablePropertiesForInternalCatalog(UserIdentity currentUserId 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 } @@ -1341,49 +1346,56 @@ private static void partitionsForInternalCatalog(UserIdentity currentUserIdentit } 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) - - 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 { + 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() - .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 }