ページの先頭行へ戻る
Enterprise Postgres 17 SP2 リリース情報

2.2.15 IS NOT NULL制約の列を持つ表に対し外部結合を行った場合の実行結果変更

非互換

Fujitsu Enterprise Postgres 17 SP2では、IS NOT NULL制約の列を持つ表に対し外部結合を行った場合の実行結果を変更します。

Fujitsu Enterprise Postgres 17 SP1以前の場合

IS NOT NULL制約の列を持つ表に対し外部結合を行った場合に誤った結果が得られる場合があります。

postgres=# CREATE TABLE pred_tab (a int, b int);
CREATE TABLE
postgres=# CREATE TABLE pred_tab_notnull (a int, b int NOT NULL);
CREATE TABLE
postgres=# INSERT INTO pred_tab VALUES (1, 1);
INSERT 0 1
postgres=# INSERT INTO pred_tab VALUES (2, 2);
INSERT 0 1
postgres=# INSERT INTO pred_tab_notnull VALUES (2, 2);
INSERT 0 1
postgres=# INSERT INTO pred_tab_notnull VALUES (3, 3);
INSERT 0 1
postgres=# ANALYZE pred_tab;
ANALYZE
postgres=# ANALYZE pred_tab_notnull;
ANALYZE
postgres=# SELECT * FROM pred_tab t1
postgres-#     LEFT JOIN pred_tab t2 ON TRUE
postgres-#     LEFT JOIN pred_tab_notnull t3 ON t2.a = t3.a
postgres-#     LEFT JOIN pred_tab t4 ON t3.b IS NOT NULL;
 a | b | a | b | a | b | a | b
---+---+---+---+---+---+---+---
 1 | 1 | 1 | 1 |   |   | 1 | 1
 1 | 1 | 1 | 1 |   |   | 2 | 2
 1 | 1 | 2 | 2 | 2 | 2 | 1 | 1
 1 | 1 | 2 | 2 | 2 | 2 | 2 | 2
 2 | 2 | 1 | 1 |   |   | 1 | 1
 2 | 2 | 1 | 1 |   |   | 2 | 2
 2 | 2 | 2 | 2 | 2 | 2 | 1 | 1
 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2
(8 rows)
Fujitsu Enterprise Postgres 17 SP2の場合

IS NOT NULL制約の列を持つ表に対し外部結合を行った場合に正しい結果が得られるようになります。

postgres=# SELECT * FROM pred_tab t1
postgres-#     LEFT JOIN pred_tab t2 ON TRUE
postgres-#     LEFT JOIN pred_tab_notnull t3 ON t2.a = t3.a
postgres-#     LEFT JOIN pred_tab t4 ON t3.b IS NOT NULL;
 a | b | a | b | a | b | a | b 
---+---+---+---+---+---+---+---
 1 | 1 | 1 | 1 |   |   |   |  
 1 | 1 | 2 | 2 | 2 | 2 | 1 | 1
 1 | 1 | 2 | 2 | 2 | 2 | 2 | 2
 2 | 2 | 1 | 1 |   |   |   |  
 2 | 2 | 2 | 2 | 2 | 2 | 1 | 1
 2 | 2 | 2 | 2 | 2 | 2 | 2 | 2
(6 rows)

対処方法

ありません。