diff --git a/plugin/trino-kudu/src/main/java/io/trino/plugin/kudu/schema/SchemaEmulationByTableNameConvention.java b/plugin/trino-kudu/src/main/java/io/trino/plugin/kudu/schema/SchemaEmulationByTableNameConvention.java index c66f08b3a4f..733ee57e7af 100644 --- a/plugin/trino-kudu/src/main/java/io/trino/plugin/kudu/schema/SchemaEmulationByTableNameConvention.java +++ b/plugin/trino-kudu/src/main/java/io/trino/plugin/kudu/schema/SchemaEmulationByTableNameConvention.java @@ -114,8 +114,27 @@ public List listSchemaNames(KuduClientWrapper client) { try { if (rawSchemasTable == null) { - createAndFillSchemasTable(client); - rawSchemasTable = getSchemasTable(client); + // Try to open the schemas table first, only create if it doesn't exist + try { + rawSchemasTable = client.openTable(rawSchemasTableName); + } + catch (KuduException e) { + if (e.getStatus().isNotFound()) { + // Table doesn't exist, try to create it (requires write permission) + // If creation fails due to permission, fall back to scanning table names + try { + createAndFillSchemasTable(client); + rawSchemasTable = getSchemasTable(client); + } + catch (KuduException createException) { + // Fall back to listing schemas from table names directly (read-only) + return listSchemaNamesFromTablets(client); + } + } + else { + throw e; + } + } } KuduScanner scanner = client.newScannerBuilder(rawSchemasTable).build();