今日のBQ謎仕様 : require_partition_filter = true なテーブル同士をJOINしつつフルスキャンしたい時

パーティショニングしていて、require_partition_filter = true のテーブル同士をJOINする場合を考える。 そのようなテーブルをフルスキャンする場合、

WHERE partitioning_field IS NOT NULL

ってやるが、これは JOIN するテーブルが一つまでだと動くが、2つ以上のテーブルを JOIN しようとするとエラーになる模様。 つまり、

FROM tbl1
LEFT JOIN tbl2 ON (...)
WHERE tbl1.partitioning_field IS NOT NULL
  AND tbl2.partitioning_field IS NOT NULL

は動くけど、

FROM tbl1
LEFT JOIN tbl2 ON (...)
LEFT JOIN tbl3 ON (...)
WHERE tbl1.partitioning_field IS NOT NULL
  AND tbl2.partitioning_field IS NOT NULL
  AND tbl3.partitioning_field IS NOT NULL

は「tbl3 は partitioning_field で絞んないとクエリできまへん」と怒られる。理不尽...

こういう場合は、WITH句で各テーブルを WHERE partitioning_field IS NOT NULL してから JOIN する必要がある。(メンドイ...)

なお、パーティションを明示的に絞れば動くようだ。 つまりこれは動く。

FROM tbl1
LEFT JOIN tbl2 ON (...)
LEFT JOIN tbl3 ON (...)
WHERE tbl1.partitioning_field = "2021-01-01"
  AND tbl2.partitioning_field = "2021-01-01" 
  AND tbl3.partitioning_field = "2021-01-01" 

2022-01-30 追記

ON 句でパーティションを絞ると動く。

つまり、これは動く。

FROM tbl1
LEFT JOIN tbl2 ON (... AND tbl2.partitioning_field IS NOT NULL)
LEFT JOIN tbl3 ON (... AND tbl3.partitioning_field IS NOT NULL)
WHERE tbl1.partitioning_field IS NOT NULL