Follow-up to the Box3D Phase 1 epic (#2973). Adds the two Box3D-on-Box3D spatial predicates.
Scope
ST_3DBoxIntersects(box3d, box3d) -> boolean — closed-interval intersection on all three axes. Matches PostGIS's &&& 3D overlap operator.
ST_3DBoxContains(box3d, box3d) -> boolean — closed-interval containment on all three axes. Matches PostGIS's ~~ on box3d.
Semantics
- Closed-interval — edge/face/corner contact counts as intersecting and contained. Parallel to the Box2D contract on
ST_BoxIntersects / ST_BoxContains.
- Inverted bounds (
xmin > xmax, ymin > ymax, zmin > zmax) are rejected with IllegalArgumentException. Z does not wraparound, so we do not carry forward Box2D's "reserved for future antimeridian wraparound" exception.
- NULL input → NULL result (no in-band empty marker).
Out of scope
- Spatial join planner integration (separate follow-up — see EPIC).
- Filter pushdown for Box3D predicates against Box3D columns.
ST_3DDWithin distance predicate (separate follow-up).
Follow-up to the Box3D Phase 1 epic (#2973). Adds the two Box3D-on-Box3D spatial predicates.
Scope
ST_3DBoxIntersects(box3d, box3d) -> boolean— closed-interval intersection on all three axes. Matches PostGIS's&&&3D overlap operator.ST_3DBoxContains(box3d, box3d) -> boolean— closed-interval containment on all three axes. Matches PostGIS's~~onbox3d.Semantics
ST_BoxIntersects/ST_BoxContains.xmin > xmax,ymin > ymax,zmin > zmax) are rejected withIllegalArgumentException. Z does not wraparound, so we do not carry forward Box2D's "reserved for future antimeridian wraparound" exception.Out of scope
ST_3DDWithindistance predicate (separate follow-up).