citus
citus copied to clipboard
PG18 – check-split - Columnar write fails with “invalid logical offset: 0” on INSERT/COPY
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.