citus icon indicating copy to clipboard operation
citus copied to clipboard

PG18 – check-split - Columnar write fails with “invalid logical offset: 0” on INSERT/COPY

Open m3hm3t opened this issue 6 months ago • 1 comments

diff -dU10 -w /__w/citus/citus/src/test/regress/expected/citus_split_shard_columnar_partitioned.out /__w/citus/citus/src/test/regress/results/citus_split_shard_columnar_partitioned.out
--- /__w/citus/citus/src/test/regress/expected/citus_split_shard_columnar_partitioned.out.modified	2025-06-13 14:36:06.794940240 +0000
+++ /__w/citus/citus/src/test/regress/results/citus_split_shard_columnar_partitioned.out.modified	2025-06-13 14:36:06.816940361 +0000
@@ -133,46 +133,48 @@
     ALTER TABLE sensors_2020_01_01 ADD CONSTRAINT fkey_from_child_to_ref FOREIGN KEY (measureid) REFERENCES reference_table(measureid);
     -- No support for foreign keys, unique constraints, or exclusion constraints in columnar tables.
     -- Please see: https://github.com/citusdata/citus/tree/main/src/backend/columnar/README.md
 -- END: Create constraints for tables.
 -- BEGIN: Load data into tables
     INSERT INTO reference_table SELECT i FROM generate_series(0,1000)i;
     INSERT INTO colocated_dist_table SELECT i FROM generate_series(0,1000)i;
     INSERT INTO colocated_partitioned_table SELECT i, '2020-01-05' FROM generate_series(0,1000)i;
     INSERT INTO sensors SELECT i, '2020-01-05', '{}' FROM generate_series(0,1000)i;
     INSERT INTO sensorscolumnar SELECT i, '2020-01-05', '{}' FROM generate_series(0,1000)i;
+ERROR:  attempted columnar write on relation 22151 to invalid logical offset: 0
+CONTEXT:  while executing command on localhost:57637

When inserting or copying into a columnar table, the very first write is attempted at offset 0, which the columnar writer deems invalid and aborts with an error.

CREATE TABLE sensorscolumnar (
  id      int,
  ts      date,
  payload jsonb
) USING columnar;

INSERT INTO sensorscolumnar
  SELECT i, '2020-01-05', '{}'::jsonb
  FROM generate_series(0,1000) AS i;

Possible cause

The columnar writer state is zero‐initialized but never reserves a stripe before writing, so its internal logical_offset remains 0. The writer checks for offsets ≥1 and rejects 0 as invalid.

m3hm3t avatar Jun 16 '25 08:06 m3hm3t