diff --git a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/impl/WebServiceSQL.java b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/impl/WebServiceSQL.java index c9b9a94556..5870be0fec 100644 --- a/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/impl/WebServiceSQL.java +++ b/server/bundles/io.cloudbeaver.server/src/io/cloudbeaver/service/sql/impl/WebServiceSQL.java @@ -31,6 +31,7 @@ import org.jkiss.code.NotNull; import org.jkiss.code.Nullable; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; +import org.jkiss.dbeaver.model.DBPDataKind; import org.jkiss.dbeaver.model.DBPDataSource; import org.jkiss.dbeaver.model.DBPDataSourceContainer; import org.jkiss.dbeaver.model.DBUtils; @@ -256,10 +257,38 @@ public class WebServiceSQL implements DBWServiceSQL { @NotNull String resultsId, @NotNull List selectedRows ) throws DBWebException { + checkAndFillTruncatedData(sqlContext, resultsId, selectedRows); WebDBDResultSetDataProvider dataProvider = new WebDBDResultSetDataProvider(resultsId, sqlContext, selectedRows); return createAndRunGenerator(webSession, generatorId, Collections.singletonList(dataProvider)); } + private void checkAndFillTruncatedData( + @NotNull WebSQLContextInfo sqlContext, + @NotNull String resultsId, + @NotNull List selectedRows + ) throws DBWebException { + List attributes = Arrays.stream(sqlContext.getResults(resultsId).getAttributes()) + .filter(attr -> canBeTruncated(attr.getDataKind())) + .toList(); + for (WebSQLResultsRow row : selectedRows) { + Object[] data = row.getData(); + for (DBDAttributeBinding attribute : attributes) { + int position = attribute.getOrdinalPosition(); + boolean valueIsTruncated = data[position] != null && + data[position].toString().length() == WebSQLConstants.TEXT_PREVIEW_MAX_LENGTH; + if (valueIsTruncated) { + data[position] = getCellValue(sqlContext, resultsId, position, row); + } + } + } + } + + private boolean canBeTruncated(@NotNull DBPDataKind dataKind) { + return dataKind.equals(DBPDataKind.STRING) || + dataKind.equals(DBPDataKind.CONTENT) || + dataKind.equals(DBPDataKind.BINARY); + } + private String createAndRunGenerator( @NotNull WebSession session, @NotNull String generatorId,