`DETACH DELETE` changes result cardinality for duplicate matches of a bound relationship
メンテナーはふだん 3 日以内に返信
まだ誰も着手していません。
評価
- 難易度
- 4/5
- 見積もり時間
- 3〜5日
- 初心者へのやさしさ
- 45/100
調査の方向性
Start at the Cypher planner and executor paths that handle DETACH DELETE and row propagation after deletion; the issue does not name specific files or tests. Reproduce the two queries on AGE 1.8.0 with PostgreSQL 18.6, then trace why the baseline loses a duplicate matched row. Done means both queries preserve the two matched rows, with a regression test covering the reproduction.
索引モデルが issue の本文から書いたものです。
説明
Environment
- Apache AGE
1.8.0, PostgreSQL18.6 - Docker image:
apache/age:release_PG18_1.8.0
Reproduction
The setup contains one fixed-length path and two parallel incoming
relationships. The second MATCH therefore yields two rows with the same
n1, n0, and r0 bindings.
LOAD 'age';
SET search_path = ag_catalog, public;
SELECT ag_catalog.create_graph('age_repro23_left');
SELECT *
FROM ag_catalog.cypher('age_repro23_left', $$
CREATE (a {id: 83})-[:rt2]->(n0:l0)
-[:rt7 {k4: true, k7: ''}]->(c:l2),
(n1:l1 {k5: false})-[:x]->(n0),
(n1)-[:y]->(n0)
$$) AS (v agtype);
SELECT ag_catalog.create_graph('age_repro23_right');
SELECT *
FROM ag_catalog.cypher('age_repro23_right', $$
CREATE (a {id: 83})-[:rt2]->(n0:l0)
-[:rt7 {k4: true, k7: ''}]->(c:l2),
(n1:l1 {k5: false})-[:x]->(n0),
(n1)-[:y]->(n0)
$$) AS (v agtype);
Baseline query — age_repro23_left
SELECT *
FROM ag_catalog.cypher('age_repro23_left', $$
MATCH ({id: 83})-[:rt2]->(n0:l0)-[r0:rt7]->(:l2)
WHERE r0.k4 = true
WITH *
MATCH (n1:l1 {k5: false})-[]->(n0)
WHERE r0.k7 CONTAINS ''
DETACH DELETE n1, n0
RETURN {r0: r0} AS result
$$) AS (result agtype);
Scope-preserving barrier query — age_repro23_right
SELECT *
FROM ag_catalog.cypher('age_repro23_right', $$
MATCH ({id: 83})-[:rt2]->(n0:l0)-[r0:rt7]->(:l2)
WHERE r0.k4 = true
WITH n0, r0
UNWIND [0] AS barrier0
WITH n0, r0
MATCH (n1:l1 {k5: false})-[]->(n0)
WHERE r0.k7 CONTAINS ''
WITH n0, r0, n1
UNWIND [0] AS barrier1
WITH n0, r0, n1
DETACH DELETE n1, n0
WITH {r0: r0} AS row
WITH collect(row) AS rows
UNWIND rows AS row
WITH row.r0 AS r0
RETURN {r0: r0} AS result
$$) AS (result agtype);
Expected and actual
Both queries should preserve the two matched rows.
On AGE 1.8.0 / PostgreSQL 18.6:
baseline: 1 row
barrier: 2 rows
- 主要言語
- C
- スター
- 4.9k
- フォーク
- 535
- 平均マージ
- 10日 13時間
- マージ済み PR(30日)
- 7
環境構築
- Dockerfile・Docker Compose ファイルなし
- プルリクエストのテンプレートなし
- コントリビューションガイドを読む
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
apache/age のほかの issue
-
Integer division by -1 on INT64_MIN raises a misclassified floating-point exception (22P01) instead of bigint out of range対応中かも @sean0407 が 11 日前に担当しました。 オープンbug
難易度 2/5 1〜3時間 初心者へのやさしさ 74/100
メンテナーはふだん 3 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 88/100
メンテナーはふだん 3 日以内に返信
-
bug
難易度 4/5 3〜5日 初心者へのやさしさ 53/100
メンテナーはふだん 3 日以内に返信
-
bug
難易度 4/5 3〜5日 初心者へのやさしさ 45/100
メンテナーはふだん 3 日以内に返信
-
bug
難易度 4/5 3〜5日 初心者へのやさしさ 48/100
メンテナーはふだん 3 日以内に返信
似ている issue
-
難易度 2/5 1〜3時間 初心者へのやさしさ 65/100
sumatrapdfreader/sumatrapdf#6403 ·
-
followup
難易度 1/5 1時間未満 初心者へのやさしさ 83/100
メンテナーはふだん 1 日以内に返信
-
難易度 2/5 1〜3時間 初心者へのやさしさ 76/100
oetiker/rrdtool-1.x#1392 ·
-
bottomless: finished S3 upload tasks are never reaped, so sqld memory grows by ~10 KB per WAL batchオープン
難易度 2/5 1〜3時間 初心者へのやさしさ 83/100
tursodatabase/libsql#2298 ·
-
enhancement good first issue
難易度 2/5 1〜3時間 初心者へのやさしさ 85/100