defect
Tasks can return results that are displayed in the task view. However, the number of characters in the result is limited to 255, and a large portion of that is already taken up by the internationalization key, which is also stored.
As a result, the task fails and cannot save its result:
First Exception: com.top_logic.knowledge.service.KnowledgeBaseException
at com.top_logic.basic.ExceptionUtil.createException(ExceptionUtil.java:76)
at com.top_logic.util.sched.task.log.TaskLogWrapper.commitTaskEnded(TaskLogWrapper.java:1218)
at com.top_logic.util.sched.task.log.TaskLogWrapper.taskEnded(TaskLogWrapper.java:277)
at com.top_logic.util.sched.task.log.TaskLogWrapper.taskEnded(TaskLogWrapper.java:270)
at com.top_logic.model.search.providers.ScriptTask.lambda$run$0(ScriptTask.java:67)
at com.top_logic.basic.thread.ThreadContextManager.inInteractionInternal(ThreadContextManager.java:788)
at com.top_logic.basic.thread.ThreadContextManager.inSystemInteractionInternal(ThreadContextManager.java:798)
at com.top_logic.basic.thread.ThreadContextManager.inSystemInteraction(ThreadContextManager.java:231)
at com.top_logic.basic.thread.ThreadContext.inSystemContext(ThreadContext.java:175)
at com.top_logic.model.search.providers.ScriptTask.run(ScriptTask.java:54)
at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: com.top_logic.knowledge.service.KnowledgeBaseException: Database operation failed.
at com.top_logic.knowledge.service.db2.DefaultDBContext.commitTransaction(DefaultDBContext.java:2827)
at com.top_logic.knowledge.service.db2.TransactionImpl.internalCommit(TransactionImpl.java:418)
at com.top_logic.knowledge.service.AbstractTransaction.commit(AbstractTransaction.java:71)
at com.top_logic.util.sched.task.log.TaskLogWrapper.taskEndedInternal(TaskLogWrapper.java:1245)
at com.top_logic.util.sched.task.log.TaskLogWrapper.lambda$commitTaskEnded$2(TaskLogWrapper.java:1214)
at com.top_logic.basic.util.retry.Retry.run(Retry.java:85)
at com.top_logic.basic.util.retry.Retry.retry(Retry.java:47)
at com.top_logic.util.sched.task.log.TaskLogWrapper.commitTaskEnded(TaskLogWrapper.java:1213)
... 9 more
Caused by: java.sql.SQLException: Value too long for column "MESSAGE VARCHAR_IGNORECASE(250)": "'class.com.top_logic.model.search.providers.I18NConstants.TASK_MESSAGE__VALUE/sP... (256)"; SQL statement:
INSERT INTO "TASK_RESULT" ("BRANCH","IDENTIFIER","REV_MAX","REV_MIN","REV_CREATE","PHYSICAL_RESOURCE","TASK_NAME","MESSAGE","START","END","EXCEPTION_DUMP","WARNINGS","LOG_FILE","RESULT_TYPE","CLUSTER_NAME","CLUSTER_ID") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [22001-214]: INSERT INTO "TASK_RESULT" ("BRANCH","IDENTIFIER","REV_MAX","REV_MIN","REV_CREATE","PHYSICAL_RESOURCE," "TASK_NAME," "MESSAGE," "START," "END," "EXCEPTION_DUMP," "WARNINGS," "LOG_FILE," "RESULT_TYPE," "CLUSTER_NAME," "CLUSTER_ID") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
at com.top_logic.basic.sql.SQLH.enhanceMessage(SQLH.java:514)
at com.top_logic.basic.db.sql.PrepStmtBasedCompiledStatement.enhanceMessage(PrepStmtBasedCompiledStatement.java:207)
at com.top_logic.basic.db.sql.PrepStmtBasedCompiledStatement.executeUpdate(PrepStmtBasedCompiledStatement.java:64)
at com.top_logic.knowledge.service.db2.DefaultDBAccess.insert(DefaultDBAccess.java:982)
at com.top_logic.knowledge.service.db2.DefaultDBAccess.insert(DefaultDBAccess.java:961)
at com.top_logic.knowledge.service.db2.VersionedDBAccess.store(VersionedDBAccess.java:1084)
at com.top_logic.knowledge.service.db2.VersionedDBAccess.update(VersionedDBAccess.java:1040)
at com.top_logic.knowledge.service.db2.VersionedDBAccess.updateAll(VersionedDBAccess.java:1001)
at com.top_logic.knowledge.service.db2.DefaultDBContext.commitChanged(DefaultDBContext.java:2560)
at com.top_logic.knowledge.service.db2.DefaultDBContext.commitTransaction(DefaultDBContext.java:2755)
... 16 more
Caused by: org.h2.jdbc.JdbcSQLDataException: Value too long for column "MESSAGE VARCHAR_IGNORECASE(250)": "'class.com.top_logic.model.search.providers.I18NConstants.TASK_MESSAGE__VALUE/sP... (256)"; SQL statement:
INSERT INTO "TASK_RESULT" ("BRANCH","IDENTIFIER","REV_MAX","REV_MIN","REV_CREATE","PHYSICAL_RESOURCE","TASK_NAME","MESSAGE","START","END","EXCEPTION_DUMP","WARNINGS","LOG_FILE","RESULT_TYPE","CLUSTER_NAME","CLUSTER_ID") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) [22001-214]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:506)
at org.h2.message.DbException.getJdbcSQLException(DbException.java:477)
at org.h2.message.DbException.get(DbException.java:223)
at org.h2.message.DbException.getValueTooLongException(DbException.java:322)
at org.h2.value.Value.getValueTooLongException(Value.java:2573)
at org.h2.value.Value.convertToVarcharIgnoreCase(Value.java:1319)
at org.h2.value.Value.convertTo(Value.java:1121)
at org.h2.value.Value.convertForAssignTo(Value.java:1092)
at org.h2.table.Column.validateConvertUpdateSequence(Column.java:369)
at org.h2.table.Table.convertInsertRow(Table.java:926)
at org.h2.command.dml.Insert.insertRows(Insert.java:167)
at org.h2.command.dml.Insert.update(Insert.java:135)
at org.h2.command.dml.DataChangeStatement.update(DataChangeStatement.java:74)
at org.h2.command.CommandContainer.update(CommandContainer.java:169)
at org.h2.command.Command.executeUpdate(Command.java:252)
at org.h2.jdbc.JdbcPreparedStatement.executeUpdateInternal(JdbcPreparedStatement.java:209)
at org.h2.jdbc.JdbcPreparedStatement.executeUpdate(JdbcPreparedStatement.java:169)
at com.top_logic.basic.db.sql.PrepStmtBasedCompiledStatement.tryExecuteUpdate(PrepStmtBasedCompiledStatement.java:174)
at com.top_logic.basic.db.sql.PrepStmtBasedCompiledStatement.executeUpdate(PrepStmtBasedCompiledStatement.java:62)
... 23 more
Solution
Increase the "MESSAGE" column in the "TASK_RESULT" table to 4,000 characters.
Data Migration
- In an existing system, the column length must be increased manually, e.g., by:
For H2:
ALTER TABLE TASK_RESULT ALTER COLUMN MESSAGE CHARACTER VARYING (4000);
Test
- Configure and run a task that returns a result of 1,000 characters.