非互換
Fujitsu Enterprise Postgres 17 SP2では、IS NOT NULL制約の列を持つ表に対し外部結合を行った場合の実行結果を変更します。
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)
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)
対処方法
ありません。