Federico Mariani created CAMEL-24044:
----------------------------------------
Summary: camel-sql - Postgres aggregation repositories fail on
insert: version bound without a placeholder
Key: CAMEL-24044
URL: https://issues.apache.org/jira/browse/CAMEL-24044
Project: Camel
Issue Type: Bug
Components: camel-sql
Reporter: Federico Mariani
Assignee: Federico Mariani
PostgresAggregationRepository.insert() builds {{INSERT INTO t(exchange, id[,
body][, headers...]) VALUES (...) ON CONFLICT DO NOTHING}} without the
{{version}} column, but delegates to the base {{insertHelper}} which binds
blob(1), key(2), version(3)[, body(4), ...] - one more bound parameter than
placeholders. Every {{add()}} fails with {{The column index is out of range: 3,
number of columns: 2}} (verified against a real PostgreSQL instance). With
{{storeBodyAsText=true}} the version long is bound into the {{body}}
placeholder before the failure.
ClusteredPostgresAggregationRepository has the same defect in its
completed-table insert: {{add()}} works (it goes through the base insert), but
every {{remove()}} fails when moving the aggregated exchange to the completed
table - i.e. every aggregation blows up at completion. In addition it never
appends the {{INSTANCE_ID}} column that
{{ClusteredJdbcAggregationRepository.insertHelper}} binds when
{{recoveryByInstance=true}}, so instance-scoped recovery could never match
{{scan()}}.
Broken since the CAMEL-7810 optimistic locking refactor (Camel 3.4); neither
class has any test coverage. Fix: include the {{version}} column (and
{{INSTANCE_ID}} for the clustered variant when applicable) in the Postgres
INSERT statements, add integration tests against real PostgreSQL, and update
the stale PostgreSQL schema in the component documentation.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)