diff --git a/core/trino-main/src/main/java/io/trino/connector/informationschema/InformationSchemaMetadata.java b/core/trino-main/src/main/java/io/trino/connector/informationschema/InformationSchemaMetadata.java index 3cbbc82c09bd..90a9994c9a2d 100644 --- a/core/trino-main/src/main/java/io/trino/connector/informationschema/InformationSchemaMetadata.java +++ b/core/trino-main/src/main/java/io/trino/connector/informationschema/InformationSchemaMetadata.java @@ -183,7 +183,7 @@ public Optional> applyLimit(Connect InformationSchemaTableHandle table = (InformationSchemaTableHandle) handle; if (table.getLimit().isPresent() && table.getLimit().getAsLong() <= limit) { - return Optional.empty(); + return Optional.of(new LimitApplicationResult<>(table, true, false)); } return Optional.of(new LimitApplicationResult<>( diff --git a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DefaultJdbcMetadata.java b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DefaultJdbcMetadata.java index dfcd1c784851..6d0c7fc028a1 100644 --- a/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DefaultJdbcMetadata.java +++ b/plugin/trino-base-jdbc/src/main/java/io/trino/plugin/jdbc/DefaultJdbcMetadata.java @@ -439,8 +439,13 @@ public Optional> applyLimit(Connect return Optional.empty(); } + boolean limitGuaranteed = jdbcClient.isLimitGuaranteed(session); + if (handle.getLimit().isPresent() && handle.getLimit().getAsLong() <= limit) { - return Optional.empty(); + if (!limitGuaranteed) { + return Optional.empty(); + } + return Optional.of(new LimitApplicationResult<>(handle, limitGuaranteed, false)); } handle = new JdbcTableHandle( @@ -452,7 +457,7 @@ public Optional> applyLimit(Connect handle.getOtherReferencedTables(), handle.getNextSyntheticColumnId()); - return Optional.of(new LimitApplicationResult<>(handle, jdbcClient.isLimitGuaranteed(session), false)); + return Optional.of(new LimitApplicationResult<>(handle, limitGuaranteed, false)); } @Override diff --git a/plugin/trino-memory/src/main/java/io/trino/plugin/memory/MemoryMetadata.java b/plugin/trino-memory/src/main/java/io/trino/plugin/memory/MemoryMetadata.java index 1d4ad8e65099..bdb52968df33 100644 --- a/plugin/trino-memory/src/main/java/io/trino/plugin/memory/MemoryMetadata.java +++ b/plugin/trino-memory/src/main/java/io/trino/plugin/memory/MemoryMetadata.java @@ -401,7 +401,7 @@ public Optional> applyLimit(Connect MemoryTableHandle table = (MemoryTableHandle) handle; if (table.getLimit().isPresent() && table.getLimit().getAsLong() <= limit) { - return Optional.empty(); + return Optional.of(new LimitApplicationResult<>(table, true, true)); } return Optional.of(new LimitApplicationResult<>( diff --git a/plugin/trino-mongodb/src/main/java/io/trino/plugin/mongodb/MongoMetadata.java b/plugin/trino-mongodb/src/main/java/io/trino/plugin/mongodb/MongoMetadata.java index f75fdde18521..63a04c1d1a10 100644 --- a/plugin/trino-mongodb/src/main/java/io/trino/plugin/mongodb/MongoMetadata.java +++ b/plugin/trino-mongodb/src/main/java/io/trino/plugin/mongodb/MongoMetadata.java @@ -263,12 +263,12 @@ public Optional> applyLimit(Connect return Optional.empty(); } - // MongoDB doesn't support limit number greater than integer max - if (limit > Integer.MAX_VALUE) { - return Optional.empty(); + if (handle.getLimit().isPresent() && handle.getLimit().getAsInt() <= limit) { + return Optional.of(new LimitApplicationResult<>(handle, true, false)); } - if (handle.getLimit().isPresent() && handle.getLimit().getAsInt() <= limit) { + // MongoDB doesn't support limit number greater than integer max + if (limit > Integer.MAX_VALUE) { return Optional.empty(); } diff --git a/plugin/trino-pinot/src/main/java/io/trino/plugin/pinot/PinotMetadata.java b/plugin/trino-pinot/src/main/java/io/trino/plugin/pinot/PinotMetadata.java index cac8641167a0..b9e75fb3d851 100755 --- a/plugin/trino-pinot/src/main/java/io/trino/plugin/pinot/PinotMetadata.java +++ b/plugin/trino-pinot/src/main/java/io/trino/plugin/pinot/PinotMetadata.java @@ -258,10 +258,14 @@ public ConnectorTableProperties getTableProperties(ConnectorSession session, Con public Optional> applyLimit(ConnectorSession session, ConnectorTableHandle table, long limit) { PinotTableHandle handle = (PinotTableHandle) table; + Optional dynamicTable = handle.getQuery(); if (handle.getLimit().isPresent() && handle.getLimit().getAsLong() <= limit) { + if (dynamicTable.isPresent()) { + // single split - limit already present in handle is enforced + return Optional.of(new LimitApplicationResult<>(handle, true, false)); + } return Optional.empty(); } - Optional dynamicTable = handle.getQuery(); if (dynamicTable.isPresent() && (dynamicTable.get().getLimit().isEmpty() || dynamicTable.get().getLimit().getAsLong() > limit)) { dynamicTable = Optional.of(new DynamicTable(dynamicTable.get().getTableName(),