Skip to content

0.12.2

Choose a tag to compare

@ferenc-csaky ferenc-csaky released this 23 Oct 19:04
· 45 commits to main since this release
0.12.2
22bef48

Breaking Changes

  • Computed the generated __pk_hash primary key column with the collision-free hash_key instead of hash_columns. This affects stream tables without a primary key, which are keyed on a hash of all columns, and tables with nullable primary key columns. Rows that are already stored keep their old keys: a stream table stores a row a second time if it is processed again, for example after restoring an older checkpoint or resetting Kafka offsets, and a table with nullable primary key columns stores a new row on the first update of an existing one while the old row stays (#2513)
  • Resolved the Flink conflict behavior of every STREAM table sink to ON CONFLICT DO DEDUPLICATE instead of DO NOTHING, which removes the WatermarkTimestampAssigner and SinkMaterializer operators in front of these sinks. Rows with the same key in one JDBC write batch are now reduced to the last one before PostgreSQL applies its conflict action (still DO NOTHING by default), and Iceberg upsert sinks keep the last row instead of the first (#2512, #2514)

Important

Upgrade running jobs with stop-with-savepoint, and restore the new plan from that savepoint once with execution.state-recovery.ignore-unclaimed-state: true (job.allowNonRestoredState: true with the Flink Kubernetes Operator), since it no longer has the sink materializer operators. Rows still held in the materializer state are not written. Rebuild tables with nullable primary key columns by emptying them and processing their input again from the start. See Upgrading from a Savepoint and the Upgrade Notes.

Features

  • Negotiated the MCP protocol version with the client: the server now replies with the requested version if it supports it (2024-11-05, 2025-03-26, 2025-06-18 or 2025-11-25) and with 2025-11-25 otherwise, instead of always replying 2024-11-05, which clients built on the MCP Java SDK 2.1.0 reject (#2507)
  • Taught the agent how to upgrade a running pipeline from a savepoint, the upgrade notes for the hash_key change, and how PostgreSQL resolves conflicts of STREAM tables (#2512, #2513, #2514)
  • Taught the agent how text_search behaves in PostgreSQL compared to Flink, and to pass the same columns to every search on a table so the generated GIN index serves it (#2508)

Fixes

  • Wrote every row of a STREAM table to the database. Before, a row with the same timestamp as an earlier row of its source, for example the second row of a single batch mutation, could wait in Flink's sink materializer for a newer record, which never arrives on a quiet source. The materializer also kept state for every key without a TTL (#2512, #2514)
  • Stopped dropping distinct rows that hash_columns gave the same __pk_hash key, such as (1, 23, 'x') and (12, 3, 'x'), or NULL, 0 and '', and stopped storing a replayed row with an ARRAY or BYTES column a second time (#2513)
  • Kept the records written to a mutation topic before PARTITIONED BY was added to its table. The Flink source of a mutation table no longer decodes the Kafka message key, so records without a key are no longer silently dropped, also when the topic is read again from the earliest offset. The server still keys and partitions mutation records as before, and upsert mutation tables with a primary key are unchanged (#2509)
  • Matched the null default of PostgreSQL text_search queries to the generated GIN index ('' instead of ' '), so searches use the index instead of scanning the whole table. Deployed indexes are used after the next deploy without a rebuild (#2508)
  • Gave users docker run ... datasqrl/cmd:latest commands from the core-agent image instead of its container-only /opt/agent/cmd.sh wrapper (#2503)

Documentation

  • Documented upgrading a pipeline from a savepoint when the new plan removes stateful operators (#2512), the upgrade notes for the hash_key change (#2513), and how PostgreSQL resolves conflicts of STREAM tables and how to override it with sink.on-conflict.action (#2514)
  • Documented how PARTITIONED BY keys mutation records in Kafka (#2509) and the MCP transport endpoint with its supported protocol versions (#2507)

Maintenance

  • Updated Flink SQL Runner to 0.12.2, which adds the hash_key function and deprecates hash_columns (see its release notes)
  • Updated the MCP Java SDK from 2.0.1 to 2.1.0 (#2507)
  • Updated Pi from 1.3.0 to 1.4.0 in the agent image. Some providers now default to a different model, for example GitHub Copilot and NVIDIA, while the Anthropic default is unchanged (#2504)

Full Changelog: 0.12.1...0.12.2