This is an automated email from the ASF dual-hosted git repository.

lzljs3620320 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git


The following commit(s) were added to refs/heads/master by this push:
     new ffd1f9c2b9 [rest] Add tableType parameter support for listing tables 
(#6295)
ffd1f9c2b9 is described below

commit ffd1f9c2b96324a7ab87b593ecf50760943ba022
Author: Jiajia Li <plusplusjia...@alibaba-inc.com>
AuthorDate: Mon Sep 22 18:07:16 2025 +0800

    [rest] Add tableType parameter support for listing tables (#6295)
---
 docs/static/rest-catalog-open-api.yaml             |   5 +
 .../main/java/org/apache/paimon/rest/RESTApi.java  |  15 +-
 .../org/apache/paimon/catalog/AbstractCatalog.java |  25 +-
 .../java/org/apache/paimon/catalog/Catalog.java    |  12 +-
 .../org/apache/paimon/catalog/CatalogUtils.java    |   9 +
 .../org/apache/paimon/catalog/DelegateCatalog.java |  23 +-
 .../java/org/apache/paimon/rest/RESTCatalog.java   |  17 +-
 .../org/apache/paimon/catalog/CatalogTestBase.java |  31 +-
 .../apache/paimon/rest/MockRESTCatalogTest.java    |   8 +-
 .../org/apache/paimon/rest/RESTCatalogServer.java  |  37 +++
 .../org/apache/paimon/rest/RESTCatalogTest.java    | 324 +++++++++++++++++++--
 11 files changed, 440 insertions(+), 66 deletions(-)

diff --git a/docs/static/rest-catalog-open-api.yaml 
b/docs/static/rest-catalog-open-api.yaml
index 0b85c56fcb..9bfc7cbdfb 100644
--- a/docs/static/rest-catalog-open-api.yaml
+++ b/docs/static/rest-catalog-open-api.yaml
@@ -350,6 +350,11 @@ paths:
           in: query
           schema:
             type: string
+        - name: tableType
+          description: Filter tables by table type. All table types will be 
returned if not set or empty.
+          in: query
+          schema:
+            type: string
       responses:
         "200":
           description: OK
diff --git a/paimon-api/src/main/java/org/apache/paimon/rest/RESTApi.java 
b/paimon-api/src/main/java/org/apache/paimon/rest/RESTApi.java
index 08ed9f93d2..0a9989bdd5 100644
--- a/paimon-api/src/main/java/org/apache/paimon/rest/RESTApi.java
+++ b/paimon-api/src/main/java/org/apache/paimon/rest/RESTApi.java
@@ -141,6 +141,7 @@ public class RESTApi {
 
     public static final String DATABASE_NAME_PATTERN = "databaseNamePattern";
     public static final String TABLE_NAME_PATTERN = "tableNamePattern";
+    public static final String TABLE_TYPE = "tableType";
     public static final String VIEW_NAME_PATTERN = "viewNamePattern";
     public static final String FUNCTION_NAME_PATTERN = "functionNamePattern";
     public static final String PARTITION_NAME_PATTERN = "partitionNamePattern";
@@ -354,14 +355,16 @@ public class RESTApi {
             String databaseName,
             @Nullable Integer maxResults,
             @Nullable String pageToken,
-            @Nullable String tableNamePattern) {
+            @Nullable String tableNamePattern,
+            @Nullable String tableType) {
         ListTablesResponse response =
                 client.get(
                         resourcePaths.tables(databaseName),
                         buildPagedQueryParams(
                                 maxResults,
                                 pageToken,
-                                Pair.of(TABLE_NAME_PATTERN, tableNamePattern)),
+                                Pair.of(TABLE_NAME_PATTERN, tableNamePattern),
+                                Pair.of(TABLE_TYPE, tableType)),
                         ListTablesResponse.class,
                         restAuthFunction);
         List<String> tables = response.getTables();
@@ -385,6 +388,8 @@ public class RESTApi {
      *     from a specific point.
      * @param tableNamePattern A sql LIKE pattern (%) for table names. All 
tables will be returned
      *     if not set or empty. Currently, only prefix matching is supported.
+     * @param tableType Optional parameter to filter tables by table type. All 
table types will be
+     *     returned if not set or empty.
      * @return {@link PagedList}: elements and nextPageToken.
      * @throws NoSuchResourceException Exception thrown on HTTP 404 means the 
database not exists
      * @throws ForbiddenException Exception thrown on HTTP 403 means don't 
have the permission for
@@ -394,14 +399,16 @@ public class RESTApi {
             String databaseName,
             @Nullable Integer maxResults,
             @Nullable String pageToken,
-            @Nullable String tableNamePattern) {
+            @Nullable String tableNamePattern,
+            @Nullable String tableType) {
         ListTableDetailsResponse response =
                 client.get(
                         resourcePaths.tableDetails(databaseName),
                         buildPagedQueryParams(
                                 maxResults,
                                 pageToken,
-                                Pair.of(TABLE_NAME_PATTERN, tableNamePattern)),
+                                Pair.of(TABLE_NAME_PATTERN, tableNamePattern),
+                                Pair.of(TABLE_TYPE, tableType)),
                         ListTableDetailsResponse.class,
                         restAuthFunction);
         List<GetTableResponse> tables = response.getTableDetails();
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/catalog/AbstractCatalog.java 
b/paimon-core/src/main/java/org/apache/paimon/catalog/AbstractCatalog.java
index 841643383c..5df78212f1 100644
--- a/paimon-core/src/main/java/org/apache/paimon/catalog/AbstractCatalog.java
+++ b/paimon-core/src/main/java/org/apache/paimon/catalog/AbstractCatalog.java
@@ -250,17 +250,27 @@ public abstract class AbstractCatalog implements Catalog {
 
     @Override
     public PagedList<String> listTablesPaged(
-            String databaseName, Integer maxResults, String pageToken, String 
tableNamePattern)
+            String databaseName,
+            Integer maxResults,
+            String pageToken,
+            String tableNamePattern,
+            String tableType)
             throws DatabaseNotExistException {
         CatalogUtils.validateNamePattern(this, tableNamePattern);
+        CatalogUtils.validateTableType(this, tableType);
         return new PagedList<>(listTables(databaseName), null);
     }
 
     @Override
     public PagedList<Table> listTableDetailsPaged(
-            String databaseName, Integer maxResults, String pageToken, String 
tableNamePattern)
+            String databaseName,
+            @Nullable Integer maxResults,
+            @Nullable String pageToken,
+            @Nullable String tableNamePattern,
+            @Nullable String tableType)
             throws DatabaseNotExistException {
         CatalogUtils.validateNamePattern(this, tableNamePattern);
+        CatalogUtils.validateTableType(this, tableType);
         if (isSystemDatabase(databaseName)) {
             List<Table> systemTables =
                     SystemTableLoader.loadGlobalTableNames().stream()
@@ -285,16 +295,21 @@ public abstract class AbstractCatalog implements Catalog {
         // check db exists
         getDatabase(databaseName);
 
-        return listTableDetailsPagedImpl(databaseName, maxResults, pageToken);
+        return listTableDetailsPagedImpl(
+                databaseName, maxResults, pageToken, tableNamePattern, 
tableType);
     }
 
     protected abstract List<String> listTablesImpl(String databaseName);
 
     protected PagedList<Table> listTableDetailsPagedImpl(
-            String databaseName, Integer maxResults, String pageToken)
+            String databaseName,
+            @Nullable Integer maxResults,
+            @Nullable String pageToken,
+            @Nullable String tableNamePattern,
+            @Nullable String tableType)
             throws DatabaseNotExistException {
         PagedList<String> pagedTableNames =
-                listTablesPaged(databaseName, maxResults, pageToken, null);
+                listTablesPaged(databaseName, maxResults, pageToken, 
tableNamePattern, tableType);
         return new PagedList<>(
                 pagedTableNames.getElements().stream()
                         .map(
diff --git a/paimon-core/src/main/java/org/apache/paimon/catalog/Catalog.java 
b/paimon-core/src/main/java/org/apache/paimon/catalog/Catalog.java
index 702dc155a5..557d563995 100644
--- a/paimon-core/src/main/java/org/apache/paimon/catalog/Catalog.java
+++ b/paimon-core/src/main/java/org/apache/paimon/catalog/Catalog.java
@@ -186,7 +186,8 @@ public interface Catalog extends AutoCloseable {
             String databaseName,
             @Nullable Integer maxResults,
             @Nullable String pageToken,
-            @Nullable String tableNamePattern)
+            @Nullable String tableNamePattern,
+            @Nullable String tableType)
             throws DatabaseNotExistException;
 
     /**
@@ -203,6 +204,8 @@ public interface Catalog extends AutoCloseable {
      *     from a specific point.
      * @param tableNamePattern A sql LIKE pattern (%) for table names. All 
table details will be
      *     returned if not set or empty. Currently, only prefix matching is 
supported.
+     * @param tableType Optional parameter to filter tables by table type. All 
table types will be
+     *     returned if not set or empty.
      * @return a list of the table details with provided page size in this 
database and next page
      *     token, or a list of the details of all tables in this database if 
the catalog does not
      *     {@link #supportsListObjectsPaged()}.
@@ -213,7 +216,8 @@ public interface Catalog extends AutoCloseable {
             String databaseName,
             @Nullable Integer maxResults,
             @Nullable String pageToken,
-            @Nullable String tableNamePattern)
+            @Nullable String tableNamePattern,
+            @Nullable String tableType)
             throws DatabaseNotExistException;
 
     /**
@@ -606,6 +610,10 @@ public interface Catalog extends AutoCloseable {
         return false;
     }
 
+    default boolean supportsListTableByType() {
+        return false;
+    }
+
     // ==================== Version management methods 
==========================
 
     /**
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/catalog/CatalogUtils.java 
b/paimon-core/src/main/java/org/apache/paimon/catalog/CatalogUtils.java
index fe204bfc87..c36993ff0a 100644
--- a/paimon-core/src/main/java/org/apache/paimon/catalog/CatalogUtils.java
+++ b/paimon-core/src/main/java/org/apache/paimon/catalog/CatalogUtils.java
@@ -163,6 +163,15 @@ public class CatalogUtils {
         }
     }
 
+    public static void validateTableType(Catalog catalog, String tableType) {
+        if (Objects.nonNull(tableType) && !catalog.supportsListTableByType()) {
+            throw new UnsupportedOperationException(
+                    String.format(
+                            "Current catalog %s does not support table type 
filter.",
+                            catalog.getClass().getSimpleName()));
+        }
+    }
+
     public static List<Partition> listPartitionsFromFileSystem(Table table) {
         Options options = Options.fromMap(table.options());
         InternalRowPartitionComputer computer =
diff --git 
a/paimon-core/src/main/java/org/apache/paimon/catalog/DelegateCatalog.java 
b/paimon-core/src/main/java/org/apache/paimon/catalog/DelegateCatalog.java
index 08776714a8..a4e90e5049 100644
--- a/paimon-core/src/main/java/org/apache/paimon/catalog/DelegateCatalog.java
+++ b/paimon-core/src/main/java/org/apache/paimon/catalog/DelegateCatalog.java
@@ -102,16 +102,26 @@ public abstract class DelegateCatalog implements Catalog {
 
     @Override
     public PagedList<String> listTablesPaged(
-            String databaseName, Integer maxResults, String pageToken, String 
tableNamePattern)
+            String databaseName,
+            Integer maxResults,
+            String pageToken,
+            String tableNamePattern,
+            String tableType)
             throws DatabaseNotExistException {
-        return wrapped.listTablesPaged(databaseName, maxResults, pageToken, 
tableNamePattern);
+        return wrapped.listTablesPaged(
+                databaseName, maxResults, pageToken, tableNamePattern, 
tableType);
     }
 
     @Override
     public PagedList<Table> listTableDetailsPaged(
-            String databaseName, Integer maxResults, String pageToken, String 
tableNamePattern)
+            String databaseName,
+            Integer maxResults,
+            String pageToken,
+            String tableNamePattern,
+            String tableType)
             throws DatabaseNotExistException {
-        return wrapped.listTableDetailsPaged(databaseName, maxResults, 
pageToken, tableNamePattern);
+        return wrapped.listTableDetailsPaged(
+                databaseName, maxResults, pageToken, tableNamePattern, 
tableType);
     }
 
     @Override
@@ -165,6 +175,11 @@ public abstract class DelegateCatalog implements Catalog {
         return wrapped.supportsListByPattern();
     }
 
+    @Override
+    public boolean supportsListTableByType() {
+        return wrapped.supportsListTableByType();
+    }
+
     @Override
     public boolean supportsVersionManagement() {
         return wrapped.supportsVersionManagement();
diff --git a/paimon-core/src/main/java/org/apache/paimon/rest/RESTCatalog.java 
b/paimon-core/src/main/java/org/apache/paimon/rest/RESTCatalog.java
index 6cdb23b5a5..9179e71aa9 100644
--- a/paimon-core/src/main/java/org/apache/paimon/rest/RESTCatalog.java
+++ b/paimon-core/src/main/java/org/apache/paimon/rest/RESTCatalog.java
@@ -224,10 +224,12 @@ public class RESTCatalog implements Catalog {
             String databaseName,
             @Nullable Integer maxResults,
             @Nullable String pageToken,
-            @Nullable String tableNamePattern)
+            @Nullable String tableNamePattern,
+            @Nullable String tableType)
             throws DatabaseNotExistException {
         try {
-            return api.listTablesPaged(databaseName, maxResults, pageToken, 
tableNamePattern);
+            return api.listTablesPaged(
+                    databaseName, maxResults, pageToken, tableNamePattern, 
tableType);
         } catch (NoSuchResourceException e) {
             throw new DatabaseNotExistException(databaseName);
         }
@@ -238,11 +240,13 @@ public class RESTCatalog implements Catalog {
             String db,
             @Nullable Integer maxResults,
             @Nullable String pageToken,
-            @Nullable String tableNamePattern)
+            @Nullable String tableNamePattern,
+            @Nullable String tableType)
             throws DatabaseNotExistException {
         try {
             PagedList<GetTableResponse> tables =
-                    api.listTableDetailsPaged(db, maxResults, pageToken, 
tableNamePattern);
+                    api.listTableDetailsPaged(
+                            db, maxResults, pageToken, tableNamePattern, 
tableType);
             return new PagedList<>(
                     tables.getElements().stream()
                             .map(t -> toTable(db, t))
@@ -330,6 +334,11 @@ public class RESTCatalog implements Catalog {
         return true;
     }
 
+    @Override
+    public boolean supportsListTableByType() {
+        return true;
+    }
+
     @Override
     public boolean supportsVersionManagement() {
         return true;
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/catalog/CatalogTestBase.java 
b/paimon-core/src/test/java/org/apache/paimon/catalog/CatalogTestBase.java
index 0e0370a5df..b1ffa865ae 100644
--- a/paimon-core/src/test/java/org/apache/paimon/catalog/CatalogTestBase.java
+++ b/paimon-core/src/test/java/org/apache/paimon/catalog/CatalogTestBase.java
@@ -305,7 +305,8 @@ public abstract class CatalogTestBase {
         // List tables paged returns an empty list when there are no tables in 
the database
         String databaseName = "tables_paged_db";
         catalog.createDatabase(databaseName, false);
-        PagedList<String> pagedTables = catalog.listTablesPaged(databaseName, 
null, null, null);
+        PagedList<String> pagedTables =
+                catalog.listTablesPaged(databaseName, null, null, null, null);
         assertThat(pagedTables.getElements()).isEmpty();
         assertNull(pagedTables.getNextPageToken());
 
@@ -318,22 +319,22 @@ public abstract class CatalogTestBase {
         // List tables paged returns a list with the names of all tables in 
the database in all
         // catalogs except RestCatalog
         // even if the maxResults or pageToken is not null
-        pagedTables = catalog.listTablesPaged(databaseName, null, null, null);
+        pagedTables = catalog.listTablesPaged(databaseName, null, null, null, 
null);
         assertPagedTables(pagedTables, tableNames);
 
         int maxResults = 2;
-        pagedTables = catalog.listTablesPaged(databaseName, maxResults, null, 
null);
+        pagedTables = catalog.listTablesPaged(databaseName, maxResults, null, 
null, null);
         assertPagedTables(pagedTables, tableNames);
 
         String pageToken = "table1";
-        pagedTables = catalog.listTablesPaged(databaseName, maxResults, 
pageToken, null);
+        pagedTables = catalog.listTablesPaged(databaseName, maxResults, 
pageToken, null, null);
         assertPagedTables(pagedTables, tableNames);
 
         maxResults = 8;
-        pagedTables = catalog.listTablesPaged(databaseName, maxResults, null, 
null);
+        pagedTables = catalog.listTablesPaged(databaseName, maxResults, null, 
null, null);
         assertPagedTables(pagedTables, tableNames);
 
-        pagedTables = catalog.listTablesPaged(databaseName, maxResults, 
pageToken, null);
+        pagedTables = catalog.listTablesPaged(databaseName, maxResults, 
pageToken, null, null);
         assertPagedTables(pagedTables, tableNames);
 
         // List tables throws DatabaseNotExistException when the database does 
not exist
@@ -342,7 +343,7 @@ public abstract class CatalogTestBase {
                 .isThrownBy(
                         () ->
                                 catalog.listTablesPaged(
-                                        "non_existing_db", finalMaxResults, 
pageToken, null));
+                                        "non_existing_db", finalMaxResults, 
pageToken, null, null));
     }
 
     @Test
@@ -351,7 +352,7 @@ public abstract class CatalogTestBase {
         String databaseName = "table_details_paged_db";
         catalog.createDatabase(databaseName, false);
         PagedList<Table> pagedTableDetails =
-                catalog.listTableDetailsPaged(databaseName, null, null, null);
+                catalog.listTableDetailsPaged(databaseName, null, null, null, 
null);
         assertThat(pagedTableDetails.getElements()).isEmpty();
         assertNull(pagedTableDetails.getNextPageToken());
 
@@ -364,28 +365,30 @@ public abstract class CatalogTestBase {
                     Identifier.create(databaseName, tableName), 
DEFAULT_TABLE_SCHEMA, false);
         }
 
-        pagedTableDetails = catalog.listTableDetailsPaged(databaseName, null, 
null, null);
+        pagedTableDetails = catalog.listTableDetailsPaged(databaseName, null, 
null, null, null);
         assertPagedTableDetails(pagedTableDetails, tableNames.length, 
tableNames);
         assertNull(pagedTableDetails.getNextPageToken());
 
         int maxResults = 2;
-        pagedTableDetails = catalog.listTableDetailsPaged(databaseName, 
maxResults, null, null);
+        pagedTableDetails =
+                catalog.listTableDetailsPaged(databaseName, maxResults, null, 
null, null);
         assertPagedTableDetails(pagedTableDetails, tableNames.length, 
tableNames);
         assertNull(pagedTableDetails.getNextPageToken());
 
         String pageToken = "table1";
         pagedTableDetails =
-                catalog.listTableDetailsPaged(databaseName, maxResults, 
pageToken, null);
+                catalog.listTableDetailsPaged(databaseName, maxResults, 
pageToken, null, null);
         assertPagedTableDetails(pagedTableDetails, tableNames.length, 
tableNames);
         assertNull(pagedTableDetails.getNextPageToken());
 
         maxResults = 8;
-        pagedTableDetails = catalog.listTableDetailsPaged(databaseName, 
maxResults, null, null);
+        pagedTableDetails =
+                catalog.listTableDetailsPaged(databaseName, maxResults, null, 
null, null);
         assertPagedTableDetails(pagedTableDetails, tableNames.length, 
tableNames);
         assertNull(pagedTableDetails.getNextPageToken());
 
         pagedTableDetails =
-                catalog.listTableDetailsPaged(databaseName, maxResults, 
pageToken, null);
+                catalog.listTableDetailsPaged(databaseName, maxResults, 
pageToken, null, null);
         assertPagedTableDetails(pagedTableDetails, tableNames.length, 
tableNames);
         assertNull(pagedTableDetails.getNextPageToken());
 
@@ -395,7 +398,7 @@ public abstract class CatalogTestBase {
                 .isThrownBy(
                         () ->
                                 catalog.listTableDetailsPaged(
-                                        "non_existing_db", finalMaxResults, 
pageToken, null));
+                                        "non_existing_db", finalMaxResults, 
pageToken, null, null));
     }
 
     @Test
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/rest/MockRESTCatalogTest.java 
b/paimon-core/src/test/java/org/apache/paimon/rest/MockRESTCatalogTest.java
index a6e1936f40..bf56514b4f 100644
--- a/paimon-core/src/test/java/org/apache/paimon/rest/MockRESTCatalogTest.java
+++ b/paimon-core/src/test/java/org/apache/paimon/rest/MockRESTCatalogTest.java
@@ -84,7 +84,9 @@ class MockRESTCatalogTest extends RESTCatalogTest {
 
     @AfterEach
     public void tearDown() throws Exception {
-        restCatalogServer.shutdown();
+        if (restCatalogServer != null) {
+            restCatalogServer.shutdown();
+        }
     }
 
     @Test
@@ -177,10 +179,10 @@ class MockRESTCatalogTest extends RESTCatalogTest {
                     Identifier.create(databaseName, tableName), 
DEFAULT_TABLE_SCHEMA, false);
         }
         PagedList<String> listTablesPaged =
-                restCatalog.listTablesPaged(databaseName, 1, "dt=20230101", 
null);
+                restCatalog.listTablesPaged(databaseName, 1, "dt=20230101", 
null, null);
         PagedList<String> listTablesPaged2 =
                 restCatalog.listTablesPaged(
-                        databaseName, 1, listTablesPaged.getNextPageToken(), 
null);
+                        databaseName, 1, listTablesPaged.getNextPageToken(), 
null, null);
         assertEquals(listTablesPaged.getElements().get(0), "dt=20230102");
         assertEquals(listTablesPaged2.getElements().get(0), "dt=20230103");
     }
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/rest/RESTCatalogServer.java 
b/paimon-core/src/test/java/org/apache/paimon/rest/RESTCatalogServer.java
index a2e1da2c40..67d4ff7e91 100644
--- a/paimon-core/src/test/java/org/apache/paimon/rest/RESTCatalogServer.java
+++ b/paimon-core/src/test/java/org/apache/paimon/rest/RESTCatalogServer.java
@@ -143,6 +143,7 @@ import static org.apache.paimon.rest.RESTApi.MAX_RESULTS;
 import static org.apache.paimon.rest.RESTApi.PAGE_TOKEN;
 import static org.apache.paimon.rest.RESTApi.PARTITION_NAME_PATTERN;
 import static org.apache.paimon.rest.RESTApi.TABLE_NAME_PATTERN;
+import static org.apache.paimon.rest.RESTApi.TABLE_TYPE;
 import static org.apache.paimon.rest.RESTApi.VIEW_NAME_PATTERN;
 import static org.apache.paimon.rest.ResourcePaths.FUNCTIONS;
 import static org.apache.paimon.rest.ResourcePaths.FUNCTION_DETAILS;
@@ -1296,12 +1297,30 @@ public class RESTCatalogServer {
 
     private List<String> listTables(String databaseName, Map<String, String> 
parameters) {
         String tableNamePattern = parameters.get(TABLE_NAME_PATTERN);
+        String tableType = parameters.get(TABLE_TYPE);
         List<String> tables = new ArrayList<>();
         for (Map.Entry<String, TableMetadata> entry : 
tableMetadataStore.entrySet()) {
             Identifier identifier = Identifier.fromString(entry.getKey());
             if (databaseName.equals(identifier.getDatabaseName())
                     && (Objects.isNull(tableNamePattern)
                             || matchNamePattern(identifier.getTableName(), 
tableNamePattern))) {
+
+                // Check table type filter if specified
+                if (StringUtils.isNotEmpty(tableType)) {
+                    String actualTableType = 
entry.getValue().schema().options().get(TYPE.key());
+                    if (StringUtils.equals(tableType, "table")) {
+                        // When filtering by "table" type, return tables with 
null or "table" type
+                        if (actualTableType != null && 
!"table".equals(actualTableType)) {
+                            continue;
+                        }
+                    } else {
+                        // For other table types, return exact matches
+                        if (!StringUtils.equals(tableType, actualTableType)) {
+                            continue;
+                        }
+                    }
+                }
+
                 tables.add(identifier.getTableName());
             }
         }
@@ -1361,12 +1380,30 @@ public class RESTCatalogServer {
     private List<GetTableResponse> listTableDetails(
             String databaseName, Map<String, String> parameters) {
         String tableNamePattern = parameters.get(TABLE_NAME_PATTERN);
+        String tableType = parameters.get(TABLE_TYPE);
         List<GetTableResponse> tableDetails = new ArrayList<>();
         for (Map.Entry<String, TableMetadata> entry : 
tableMetadataStore.entrySet()) {
             Identifier identifier = Identifier.fromString(entry.getKey());
             if (databaseName.equals(identifier.getDatabaseName())
                     && (Objects.isNull(tableNamePattern)
                             || matchNamePattern(identifier.getTableName(), 
tableNamePattern))) {
+
+                // Check table type filter if specified
+                if (StringUtils.isNotEmpty(tableType)) {
+                    String actualTableType = 
entry.getValue().schema().options().get(TYPE.key());
+                    if (StringUtils.equals(tableType, "table")) {
+                        // When filtering by "table" type, return tables with 
null or "table" type
+                        if (actualTableType != null && 
!"table".equals(actualTableType)) {
+                            continue;
+                        }
+                    } else {
+                        // For other table types, return exact matches
+                        if (!StringUtils.equals(tableType, actualTableType)) {
+                            continue;
+                        }
+                    }
+                }
+
                 GetTableResponse getTableResponse =
                         new GetTableResponse(
                                 entry.getValue().uuid(),
diff --git 
a/paimon-core/src/test/java/org/apache/paimon/rest/RESTCatalogTest.java 
b/paimon-core/src/test/java/org/apache/paimon/rest/RESTCatalogTest.java
index 51e2c986cf..8234cac4d3 100644
--- a/paimon-core/src/test/java/org/apache/paimon/rest/RESTCatalogTest.java
+++ b/paimon-core/src/test/java/org/apache/paimon/rest/RESTCatalogTest.java
@@ -251,10 +251,10 @@ public abstract class RESTCatalogTest extends 
CatalogTestBase {
                                 false));
         assertThrows(
                 Catalog.DatabaseNotExistException.class,
-                () -> catalog.listTablesPaged(database, 100, null, null));
+                () -> catalog.listTablesPaged(database, 100, null, null, 
null));
         assertThrows(
                 Catalog.DatabaseNotExistException.class,
-                () -> catalog.listTableDetailsPaged(database, 100, null, 
null));
+                () -> catalog.listTableDetailsPaged(database, 100, null, null, 
null));
     }
 
     @Test
@@ -362,7 +362,8 @@ public abstract class RESTCatalogTest extends 
CatalogTestBase {
         // List tables paged returns an empty list when there are no tables in 
the database
         String databaseName = "tables_paged_db";
         catalog.createDatabase(databaseName, false);
-        PagedList<String> pagedTables = catalog.listTablesPaged(databaseName, 
null, null, null);
+        PagedList<String> pagedTables =
+                catalog.listTablesPaged(databaseName, null, null, null, null);
         assertThat(pagedTables.getElements()).isEmpty();
         assertNull(pagedTables.getNextPageToken());
 
@@ -374,7 +375,7 @@ public abstract class RESTCatalogTest extends 
CatalogTestBase {
 
         // when maxResults is null or 0, the page length is set to a server 
configured value
         String[] sortedTableNames = 
Arrays.stream(tableNames).sorted().toArray(String[]::new);
-        pagedTables = catalog.listTablesPaged(databaseName, null, null, null);
+        pagedTables = catalog.listTablesPaged(databaseName, null, null, null, 
null);
         List<String> tables = pagedTables.getElements();
         assertThat(tables).containsExactly(sortedTableNames);
         assertNull(pagedTables.getNextPageToken());
@@ -383,7 +384,7 @@ public abstract class RESTCatalogTest extends 
CatalogTestBase {
         // server configured value
         // when pageToken is null, will list tables from the beginning
         int maxResults = 2;
-        pagedTables = catalog.listTablesPaged(databaseName, maxResults, null, 
null);
+        pagedTables = catalog.listTablesPaged(databaseName, maxResults, null, 
null, null);
         tables = pagedTables.getElements();
         assertEquals(maxResults, tables.size());
         assertThat(tables).containsExactly("abd", "def");
@@ -392,7 +393,7 @@ public abstract class RESTCatalogTest extends 
CatalogTestBase {
         // when pageToken is not null, will list tables from the pageToken 
(exclusive)
         pagedTables =
                 catalog.listTablesPaged(
-                        databaseName, maxResults, 
pagedTables.getNextPageToken(), null);
+                        databaseName, maxResults, 
pagedTables.getNextPageToken(), null, null);
         tables = pagedTables.getElements();
         assertEquals(maxResults, tables.size());
         assertThat(tables).containsExactly("opr", "table1");
@@ -400,7 +401,7 @@ public abstract class RESTCatalogTest extends 
CatalogTestBase {
 
         pagedTables =
                 catalog.listTablesPaged(
-                        databaseName, maxResults, 
pagedTables.getNextPageToken(), null);
+                        databaseName, maxResults, 
pagedTables.getNextPageToken(), null, null);
         tables = pagedTables.getElements();
         assertEquals(maxResults, tables.size());
         assertThat(tables).containsExactly("table2", "table3");
@@ -408,18 +409,18 @@ public abstract class RESTCatalogTest extends 
CatalogTestBase {
 
         pagedTables =
                 catalog.listTablesPaged(
-                        databaseName, maxResults, 
pagedTables.getNextPageToken(), null);
+                        databaseName, maxResults, 
pagedTables.getNextPageToken(), null, null);
         tables = pagedTables.getElements();
         assertEquals(1, tables.size());
         assertNull(pagedTables.getNextPageToken());
 
         maxResults = 8;
-        pagedTables = catalog.listTablesPaged(databaseName, maxResults, null, 
null);
+        pagedTables = catalog.listTablesPaged(databaseName, maxResults, null, 
null, null);
         tables = pagedTables.getElements();
         assertThat(tables).containsExactly(sortedTableNames);
         assertNull(pagedTables.getNextPageToken());
 
-        pagedTables = catalog.listTablesPaged(databaseName, maxResults, 
"table1", null);
+        pagedTables = catalog.listTablesPaged(databaseName, maxResults, 
"table1", null, null);
         tables = pagedTables.getElements();
         assertEquals(3, tables.size());
         assertThat(tables).containsExactly("table2", "table3", "table_name");
@@ -429,24 +430,24 @@ public abstract class RESTCatalogTest extends 
CatalogTestBase {
         assertThatExceptionOfType(Catalog.DatabaseNotExistException.class)
                 .isThrownBy(() -> catalog.listTables("non_existing_db"));
 
-        pagedTables = catalog.listTablesPaged(databaseName, null, null, 
"table%");
+        pagedTables = catalog.listTablesPaged(databaseName, null, null, 
"table%", null);
         tables = pagedTables.getElements();
         assertEquals(4, tables.size());
         assertThat(tables).containsExactly("table1", "table2", "table3", 
"table_name");
         assertNull(pagedTables.getNextPageToken());
 
-        pagedTables = catalog.listTablesPaged(databaseName, null, null, 
"table_");
+        pagedTables = catalog.listTablesPaged(databaseName, null, null, 
"table_", null);
         tables = pagedTables.getElements();
         assertTrue(tables.isEmpty());
         assertNull(pagedTables.getNextPageToken());
 
-        pagedTables = catalog.listTablesPaged(databaseName, null, null, 
"table_%");
+        pagedTables = catalog.listTablesPaged(databaseName, null, null, 
"table_%", null);
         tables = pagedTables.getElements();
         assertEquals(1, tables.size());
         assertThat(tables).containsExactly("table_name");
         assertNull(pagedTables.getNextPageToken());
 
-        pagedTables = catalog.listTablesPaged(databaseName, null, null, 
"table_name");
+        pagedTables = catalog.listTablesPaged(databaseName, null, null, 
"table_name", null);
         tables = pagedTables.getElements();
         assertEquals(1, tables.size());
         assertThat(tables).containsExactly("table_name");
@@ -454,11 +455,11 @@ public abstract class RESTCatalogTest extends 
CatalogTestBase {
 
         Assertions.assertThrows(
                 BadRequestException.class,
-                () -> catalog.listTablesPaged(databaseName, null, null, 
"%table"));
+                () -> catalog.listTablesPaged(databaseName, null, null, 
"%table", null));
 
         Assertions.assertThrows(
                 BadRequestException.class,
-                () -> catalog.listTablesPaged(databaseName, null, null, 
"ta%le"));
+                () -> catalog.listTablesPaged(databaseName, null, null, 
"ta%le", null));
     }
 
     @Test
@@ -467,7 +468,7 @@ public abstract class RESTCatalogTest extends 
CatalogTestBase {
         String databaseName = "table_details_paged_db";
         catalog.createDatabase(databaseName, false);
         PagedList<Table> pagedTableDetails =
-                catalog.listTableDetailsPaged(databaseName, null, null, null);
+                catalog.listTableDetailsPaged(databaseName, null, null, null, 
null);
         assertThat(pagedTableDetails.getElements()).isEmpty();
         assertNull(pagedTableDetails.getNextPageToken());
 
@@ -478,42 +479,44 @@ public abstract class RESTCatalogTest extends 
CatalogTestBase {
                     Identifier.create(databaseName, tableName), 
DEFAULT_TABLE_SCHEMA, false);
         }
 
-        pagedTableDetails = catalog.listTableDetailsPaged(databaseName, null, 
null, null);
+        pagedTableDetails = catalog.listTableDetailsPaged(databaseName, null, 
null, null, null);
         assertPagedTableDetails(pagedTableDetails, tableNames.length, 
expectedTableNames);
         assertNull(pagedTableDetails.getNextPageToken());
 
         int maxResults = 2;
-        pagedTableDetails = catalog.listTableDetailsPaged(databaseName, 
maxResults, null, null);
+        pagedTableDetails =
+                catalog.listTableDetailsPaged(databaseName, maxResults, null, 
null, null);
         assertPagedTableDetails(pagedTableDetails, maxResults, "abd", "def");
         assertEquals("def", pagedTableDetails.getNextPageToken());
 
         pagedTableDetails =
                 catalog.listTableDetailsPaged(
-                        databaseName, maxResults, 
pagedTableDetails.getNextPageToken(), null);
+                        databaseName, maxResults, 
pagedTableDetails.getNextPageToken(), null, null);
         assertPagedTableDetails(pagedTableDetails, maxResults, "opr", 
"table1");
         assertEquals("table1", pagedTableDetails.getNextPageToken());
 
         pagedTableDetails =
                 catalog.listTableDetailsPaged(
-                        databaseName, maxResults, 
pagedTableDetails.getNextPageToken(), null);
+                        databaseName, maxResults, 
pagedTableDetails.getNextPageToken(), null, null);
         assertPagedTableDetails(pagedTableDetails, maxResults, "table2", 
"table3");
         assertEquals("table3", pagedTableDetails.getNextPageToken());
 
         pagedTableDetails =
                 catalog.listTableDetailsPaged(
-                        databaseName, maxResults, 
pagedTableDetails.getNextPageToken(), null);
+                        databaseName, maxResults, 
pagedTableDetails.getNextPageToken(), null, null);
         assertEquals(1, pagedTableDetails.getElements().size());
         assertNull(pagedTableDetails.getNextPageToken());
 
         maxResults = 8;
-        pagedTableDetails = catalog.listTableDetailsPaged(databaseName, 
maxResults, null, null);
+        pagedTableDetails =
+                catalog.listTableDetailsPaged(databaseName, maxResults, null, 
null, null);
         assertPagedTableDetails(
                 pagedTableDetails, Math.min(maxResults, tableNames.length), 
expectedTableNames);
         assertNull(pagedTableDetails.getNextPageToken());
 
         String pageToken = "table1";
         pagedTableDetails =
-                catalog.listTableDetailsPaged(databaseName, maxResults, 
pageToken, null);
+                catalog.listTableDetailsPaged(databaseName, maxResults, 
pageToken, null, null);
         assertPagedTableDetails(pagedTableDetails, 3, "table2", "table3", 
"table_name");
         assertNull(pagedTableDetails.getNextPageToken());
 
@@ -523,31 +526,292 @@ public abstract class RESTCatalogTest extends 
CatalogTestBase {
                 .isThrownBy(
                         () ->
                                 catalog.listTableDetailsPaged(
-                                        "non_existing_db", finalMaxResults, 
pageToken, null));
+                                        "non_existing_db", finalMaxResults, 
pageToken, null, null));
 
         // List tables throws DatabaseNotExistException when the database does 
not exist
         assertThatExceptionOfType(Catalog.DatabaseNotExistException.class)
                 .isThrownBy(() -> catalog.listTables("non_existing_db"));
 
-        pagedTableDetails = catalog.listTableDetailsPaged(databaseName, null, 
null, "table%");
+        pagedTableDetails = catalog.listTableDetailsPaged(databaseName, null, 
null, "table%", null);
         assertPagedTableDetails(pagedTableDetails, 4, "table1", "table2", 
"table3", "table_name");
         assertNull(pagedTableDetails.getNextPageToken());
 
-        pagedTableDetails = catalog.listTableDetailsPaged(databaseName, null, 
null, "table_");
+        pagedTableDetails = catalog.listTableDetailsPaged(databaseName, null, 
null, "table_", null);
         Assertions.assertTrue(pagedTableDetails.getElements().isEmpty());
         assertNull(pagedTableDetails.getNextPageToken());
 
-        pagedTableDetails = catalog.listTableDetailsPaged(databaseName, null, 
null, "table_%");
+        pagedTableDetails =
+                catalog.listTableDetailsPaged(databaseName, null, null, 
"table_%", null);
         assertPagedTableDetails(pagedTableDetails, 1, "table_name");
         assertNull(pagedTableDetails.getNextPageToken());
 
         Assertions.assertThrows(
                 BadRequestException.class,
-                () -> catalog.listTableDetailsPaged(databaseName, null, null, 
"ta%le"));
+                () -> catalog.listTableDetailsPaged(databaseName, null, null, 
"ta%le", null));
 
         Assertions.assertThrows(
                 BadRequestException.class,
-                () -> catalog.listTableDetailsPaged(databaseName, null, null, 
"%tale"));
+                () -> catalog.listTableDetailsPaged(databaseName, null, null, 
"%tale", null));
+    }
+
+    @Test
+    public void testListTableDetailsPagedWithTableType() throws Exception {
+        String databaseName = "table_type_filter_db";
+        catalog.createDatabase(databaseName, false);
+
+        // Create tables with different types
+        Schema normalTableSchema = DEFAULT_TABLE_SCHEMA;
+        catalog.createTable(
+                Identifier.create(databaseName, "normal_table"), 
normalTableSchema, false);
+
+        Schema formatTableSchema =
+                Schema.newBuilder()
+                        .column("id", DataTypes.INT())
+                        .column("name", DataTypes.STRING())
+                        .option("type", TableType.FORMAT_TABLE.toString())
+                        .build();
+        catalog.createTable(
+                Identifier.create(databaseName, "format_table"), 
formatTableSchema, false);
+
+        Schema objectTableSchema =
+                Schema.newBuilder()
+                        .column("id", DataTypes.INT())
+                        .column("name", DataTypes.STRING())
+                        .option("type", TableType.OBJECT_TABLE.toString())
+                        .build();
+        catalog.createTable(
+                Identifier.create(databaseName, "object_table"), 
objectTableSchema, false);
+
+        // Test filtering by table type
+        PagedList<Table> allTables =
+                catalog.listTableDetailsPaged(databaseName, null, null, null, 
null);
+        assertThat(allTables.getElements()).hasSize(3);
+
+        PagedList<Table> normalTables =
+                catalog.listTableDetailsPaged(
+                        databaseName, null, null, null, 
TableType.TABLE.toString());
+        assertThat(normalTables.getElements()).hasSize(1);
+        
assertThat(normalTables.getElements().get(0).name()).isEqualTo("normal_table");
+
+        PagedList<Table> formatTables =
+                catalog.listTableDetailsPaged(
+                        databaseName, null, null, null, 
TableType.FORMAT_TABLE.toString());
+        assertThat(formatTables.getElements()).hasSize(1);
+        
assertThat(formatTables.getElements().get(0).name()).isEqualTo("format_table");
+
+        PagedList<Table> objectTables =
+                catalog.listTableDetailsPaged(
+                        databaseName, null, null, null, 
TableType.OBJECT_TABLE.toString());
+        assertThat(objectTables.getElements()).hasSize(1);
+        
assertThat(objectTables.getElements().get(0).name()).isEqualTo("object_table");
+
+        // Test with non-existent table type
+        PagedList<Table> nonExistentType =
+                catalog.listTableDetailsPaged(databaseName, null, null, null, 
"non-existent-type");
+        assertThat(nonExistentType.getElements()).isEmpty();
+
+        // Test with table name pattern and table type filter combined
+        PagedList<Table> filteredTables =
+                catalog.listTableDetailsPaged(
+                        databaseName, null, null, "format_%", 
TableType.FORMAT_TABLE.toString());
+        assertThat(filteredTables.getElements()).hasSize(1);
+        
assertThat(filteredTables.getElements().get(0).name()).isEqualTo("format_table");
+
+        // Test with table name pattern and non-existent table type filter 
combined
+        PagedList<Table> filteredNonExistentType =
+                catalog.listTableDetailsPaged(
+                        databaseName, null, null, "format_%", 
"non-existent-type");
+        assertThat(filteredNonExistentType.getElements()).isEmpty();
+
+        // Test maxResults parameter variations with table type filtering
+        // Test maxResults=1 with different table types
+        PagedList<Table> singleNormalTable =
+                catalog.listTableDetailsPaged(
+                        databaseName, 1, null, null, 
TableType.TABLE.toString());
+        assertThat(singleNormalTable.getElements()).hasSize(1);
+        assertEquals("normal_table", 
singleNormalTable.getElements().get(0).name());
+        assertEquals("normal_table", singleNormalTable.getNextPageToken());
+
+        PagedList<Table> singleFormatTable =
+                catalog.listTableDetailsPaged(
+                        databaseName, 1, null, null, 
TableType.FORMAT_TABLE.toString());
+        assertThat(singleFormatTable.getElements()).hasSize(1);
+        assertEquals("format_table", 
singleFormatTable.getElements().get(0).name());
+        assertEquals("format_table", singleFormatTable.getNextPageToken());
+
+        PagedList<Table> singleObjectTable =
+                catalog.listTableDetailsPaged(
+                        databaseName, 1, null, null, 
TableType.OBJECT_TABLE.toString());
+        assertThat(singleObjectTable.getElements()).hasSize(1);
+        assertEquals("object_table", 
singleObjectTable.getElements().get(0).name());
+        assertEquals("object_table", singleObjectTable.getNextPageToken());
+
+        // Test maxResults=2 with all table types
+        PagedList<Table> allTablesWithMaxResults =
+                catalog.listTableDetailsPaged(databaseName, 2, null, null, 
null);
+        assertThat(allTablesWithMaxResults.getElements()).hasSize(2);
+        assertThat(allTablesWithMaxResults.getNextPageToken()).isNotNull();
+
+        // Test maxResults=2 with table name pattern and table type filter 
combined
+        PagedList<Table> filteredTablesWithMaxResults =
+                catalog.listTableDetailsPaged(
+                        databaseName, 2, null, "format_%", 
TableType.FORMAT_TABLE.toString());
+        assertThat(filteredTablesWithMaxResults.getElements()).hasSize(1);
+        assertEquals("format_table", 
filteredTablesWithMaxResults.getElements().get(0).name());
+        assertThat(filteredTablesWithMaxResults.getNextPageToken()).isNull();
+
+        // Test maxResults=0 (should return all tables)
+        PagedList<Table> allTablesWithZeroMaxResults =
+                catalog.listTableDetailsPaged(databaseName, 0, null, null, 
null);
+        assertThat(allTablesWithZeroMaxResults.getElements()).hasSize(3);
+        assertThat(allTablesWithZeroMaxResults.getNextPageToken()).isNull();
+
+        // Test maxResults larger than total tables with table type filter
+        PagedList<Table> largeMaxResultsWithType =
+                catalog.listTableDetailsPaged(
+                        databaseName, 10, null, null, 
TableType.TABLE.toString());
+        assertThat(largeMaxResultsWithType.getElements()).hasSize(1);
+        assertEquals("normal_table", 
largeMaxResultsWithType.getElements().get(0).name());
+        assertThat(largeMaxResultsWithType.getNextPageToken()).isNull();
+
+        // Test maxResults with non-existent table type
+        PagedList<Table> nonExistentTypeWithMaxResults =
+                catalog.listTableDetailsPaged(databaseName, 5, null, null, 
"non-existent-type");
+        assertThat(nonExistentTypeWithMaxResults.getElements()).isEmpty();
+        assertThat(nonExistentTypeWithMaxResults.getNextPageToken()).isNull();
+    }
+
+    @Test
+    public void testListTablesPagedWithTableType() throws Exception {
+        String databaseName = "tables_paged_table_type_db";
+        catalog.createDatabase(databaseName, false);
+
+        // Create tables with different types
+        Schema normalTableSchema = DEFAULT_TABLE_SCHEMA;
+        catalog.createTable(
+                Identifier.create(databaseName, "normal_table"), 
normalTableSchema, false);
+
+        Schema formatTableSchema =
+                Schema.newBuilder()
+                        .column("id", DataTypes.INT())
+                        .column("name", DataTypes.STRING())
+                        .option("type", TableType.FORMAT_TABLE.toString())
+                        .build();
+        catalog.createTable(
+                Identifier.create(databaseName, "format_table"), 
formatTableSchema, false);
+
+        Schema objectTableSchema =
+                Schema.newBuilder()
+                        .column("id", DataTypes.INT())
+                        .column("name", DataTypes.STRING())
+                        .option("type", TableType.OBJECT_TABLE.toString())
+                        .build();
+        catalog.createTable(
+                Identifier.create(databaseName, "object_table"), 
objectTableSchema, false);
+
+        // Test filtering by table type
+        PagedList<String> allTables = catalog.listTablesPaged(databaseName, 
null, null, null, null);
+        assertThat(allTables.getElements()).hasSize(3);
+
+        PagedList<String> normalTables =
+                catalog.listTablesPaged(databaseName, null, null, null, 
TableType.TABLE.toString());
+        assertThat(normalTables.getElements()).hasSize(1);
+        
assertThat(normalTables.getElements().get(0)).isEqualTo("normal_table");
+
+        PagedList<String> formatTables =
+                catalog.listTablesPaged(
+                        databaseName, null, null, null, 
TableType.FORMAT_TABLE.toString());
+        assertThat(formatTables.getElements()).hasSize(1);
+        
assertThat(formatTables.getElements().get(0)).isEqualTo("format_table");
+
+        PagedList<String> objectTables =
+                catalog.listTablesPaged(
+                        databaseName, null, null, null, 
TableType.OBJECT_TABLE.toString());
+        assertThat(objectTables.getElements()).hasSize(1);
+        
assertThat(objectTables.getElements().get(0)).isEqualTo("object_table");
+
+        // Test with non-existent table type
+        PagedList<String> nonExistentType =
+                catalog.listTablesPaged(databaseName, null, null, null, 
"non-existent-type");
+        assertThat(nonExistentType.getElements()).isEmpty();
+
+        // Test with table name pattern and table type filter combined
+        PagedList<String> filteredTables =
+                catalog.listTablesPaged(
+                        databaseName, null, null, "format_%", 
TableType.FORMAT_TABLE.toString());
+        assertThat(filteredTables.getElements()).hasSize(1);
+        
assertThat(filteredTables.getElements().get(0)).isEqualTo("format_table");
+
+        // Test with table name pattern and non-existent table type filter 
combined
+        PagedList<String> filteredNonExistentType =
+                catalog.listTablesPaged(databaseName, null, null, "format_%", 
"non-existent-type");
+        assertThat(filteredNonExistentType.getElements()).isEmpty();
+
+        // Test paging with table type filter
+        int maxResults = 10;
+        PagedList<String> pagedNormalTables =
+                catalog.listTablesPaged(
+                        databaseName, maxResults, null, null, 
TableType.TABLE.toString());
+        assertThat(pagedNormalTables.getElements()).hasSize(1);
+        
assertThat(pagedNormalTables.getElements().get(0)).isEqualTo("normal_table");
+        assertNull(pagedNormalTables.getNextPageToken());
+
+        // Test maxResults parameter variations with table type filtering
+        // Test maxResults=0 (should return all tables)
+        PagedList<String> allTablesWithZeroMaxResults =
+                catalog.listTablesPaged(databaseName, 0, null, null, null);
+        assertThat(allTablesWithZeroMaxResults.getElements()).hasSize(3);
+        assertNull(allTablesWithZeroMaxResults.getNextPageToken());
+
+        // Test maxResults=1 with different table types
+        PagedList<String> singleNormalTable =
+                catalog.listTablesPaged(databaseName, 1, null, null, 
TableType.TABLE.toString());
+        assertThat(singleNormalTable.getElements()).hasSize(1);
+        assertEquals("normal_table", singleNormalTable.getElements().get(0));
+        assertEquals("normal_table", singleNormalTable.getNextPageToken());
+
+        PagedList<String> singleFormatTable =
+                catalog.listTablesPaged(
+                        databaseName, 1, null, null, 
TableType.FORMAT_TABLE.toString());
+        assertThat(singleFormatTable.getElements()).hasSize(1);
+        assertEquals("format_table", singleFormatTable.getElements().get(0));
+        assertEquals("format_table", singleFormatTable.getNextPageToken());
+
+        PagedList<String> singleObjectTable =
+                catalog.listTablesPaged(
+                        databaseName, 1, null, null, 
TableType.OBJECT_TABLE.toString());
+        assertThat(singleObjectTable.getElements()).hasSize(1);
+        assertEquals("object_table", singleObjectTable.getElements().get(0));
+        assertEquals("object_table", singleObjectTable.getNextPageToken());
+
+        // Test maxResults=2 with all table types
+        PagedList<String> allTablesWithMaxResults =
+                catalog.listTablesPaged(databaseName, 2, null, null, null);
+        assertThat(allTablesWithMaxResults.getElements()).hasSize(2);
+        assertThat(allTablesWithMaxResults.getNextPageToken()).isNotNull();
+
+        // Test maxResults=2 with table name pattern and table type filter 
combined
+        PagedList<String> filteredTablesWithMaxResults =
+                catalog.listTablesPaged(
+                        databaseName, 2, null, "format_%", 
TableType.FORMAT_TABLE.toString());
+        assertThat(filteredTablesWithMaxResults.getElements()).hasSize(1);
+        
assertThat(filteredTablesWithMaxResults.getElements().get(0)).isEqualTo("format_table");
+        assertNull(filteredTablesWithMaxResults.getNextPageToken());
+        assertEquals("format_table", 
filteredTablesWithMaxResults.getElements().get(0));
+        assertNull(filteredTablesWithMaxResults.getNextPageToken());
+
+        // Test maxResults larger than total tables with table type filter
+        PagedList<String> largeMaxResultsWithType =
+                catalog.listTablesPaged(databaseName, 10, null, null, 
TableType.TABLE.toString());
+        assertThat(largeMaxResultsWithType.getElements()).hasSize(1);
+        assertEquals("normal_table", 
largeMaxResultsWithType.getElements().get(0));
+        assertNull(largeMaxResultsWithType.getNextPageToken());
+
+        // Test maxResults with non-existent table type
+        PagedList<String> nonExistentTypeWithMaxResults =
+                catalog.listTablesPaged(databaseName, 5, null, null, 
"non-existent-type");
+        assertThat(nonExistentTypeWithMaxResults.getElements()).isEmpty();
+        assertNull(nonExistentTypeWithMaxResults.getNextPageToken());
     }
 
     @Test

Reply via email to