From 36d2b46496ed5e5a21510cb2060f2453a97a1b4e Mon Sep 17 00:00:00 2001 From: Dmitrii Barnukov <29237913+Nexus6v2@users.noreply.github.com> Date: Fri, 13 Mar 2026 12:46:43 +0100 Subject: [PATCH] dbeaver/pro#8331 added sql generation for large objects (#4208) * dbeaver/pro#8331 added sql generation for large objects * dbeaver/pro#8331 check only relevant columns --------- Co-authored-by: Ainur <59531286+yagudin10@users.noreply.github.com> --- .../service/sql/impl/WebServiceSQL.java | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) 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,