# This file tests index candidates and index recommendations for geospatial
# functions.
exec-ddl
CREATE TABLE t1 (k INT, i INT, f FLOAT, s STRING)
----

exec-ddl
CREATE TABLE t2 (k INT, i INT, s STRING, geom1 GEOMETRY, geog1 GEOGRAPHY, bbox1 box2d, bbox2 box2d, geom2 GEOMETRY, geog2 GEOGRAPHY, inet1 INET)
----

# These test cases ensure that geospatial indexes are added as candidates when
# they are used in index-accelerated geospatial functions. Note: It is expected
# that index candidates are more loose, and they might not be chosen by the
# index recommendation engine.

# Part 1: Geospatial indexes should be added as candidates for index-accelerated.
# geospatial functions.
index-candidates
SELECT k FROM t2 WHERE st_covers(geom1, 'POINT(0 0 0 0)')
----
t2:
 (geom1)

index-recommendations
SELECT * FROM t2 WHERE st_covers(geom1, 'POINT(0 0 0 0)')
----
creation: CREATE INVERTED INDEX ON t.public.t2 (geom1);
--
optimal plan:
select
 ├── columns: k:1 i:2 s:3 geom1:4!null geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 ├── immutable
 ├── cost: 1058.09
 ├── index-join t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    ├── cost: 945.837778
 │    └── inverted-filter
 │         ├── columns: rowid:11!null
 │         ├── inverted expression: /14
 │         │    ├── tight: false, unique: false
 │         │    └── union spans
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │         │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │         ├── pre-filterer expression
 │         │    └── st_coveredby('01010000C00000000000000000000000000000000000000000000000000000000000000000', geom1:4)
 │         ├── cost: 254.706667
 │         ├── key: (11)
 │         └── scan t2@_hyp_1,inverted
 │              ├── columns: rowid:11!null geom1_inverted_key:14!null
 │              ├── inverted constraint: /14/11
 │              │    └── spans
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │              │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │              └── cost: 253.575556
 └── filters
      └── st_covers(geom1:4, '01010000C00000000000000000000000000000000000000000000000000000000000000000') [outer=(4), immutable, constraints=(/4: (/NULL - ])]

index-candidates
SELECT * FROM t2 WHERE st_covers('LINESTRING ( 0 0, 0 2 )'::geometry, geom2)
----
t2:
 (geom2)

index-recommendations
SELECT * FROM t2 WHERE st_covers('LINESTRING ( 0 0, 0 2 )'::geometry, geom2)
----
creation: CREATE INVERTED INDEX ON t.public.t2 (geom2);
--
optimal plan:
select
 ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8!null geog2:9 inet1:10
 ├── immutable
 ├── cost: 1058.09
 ├── index-join t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    ├── cost: 945.837778
 │    └── inverted-filter
 │         ├── columns: rowid:11!null
 │         ├── inverted expression: /14
 │         │    ├── tight: false, unique: false
 │         │    └── union spans
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │         │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │         ├── pre-filterer expression
 │         │    └── st_covers('0102000000020000000000000000000000000000000000000000000000000000000000000000000040', geom2:8)
 │         ├── cost: 254.706667
 │         ├── key: (11)
 │         └── scan t2@_hyp_1,inverted
 │              ├── columns: rowid:11!null geom2_inverted_key:14!null
 │              ├── inverted constraint: /14/11
 │              │    └── spans
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │              │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │              └── cost: 253.575556
 └── filters
      └── st_covers('0102000000020000000000000000000000000000000000000000000000000000000000000000000040', geom2:8) [outer=(8), immutable, constraints=(/8: (/NULL - ])]

index-candidates
SELECT * FROM t2 WHERE st_covers(geog1, geog2)
----
t2:
 (geog1)
 (geog2)

index-candidates
SELECT * FROM t2 WHERE st_coveredby(geom1, geom2)
----
t2:
 (geom1)
 (geom2)

# Note: An inverted index on geom1 or geom2 is not chosen for the query plan.
# When both arguments of spatial functions are variables in the column, we
# cannot determine if a row evaluates to true unless we check both values. This
# would require a full scan. However, if one of the arguments is a constant, we
# can determine if a row evaluates to true by just checking the variable value
# and comparing against the constant. We can use inverted index to
# index-accelerate this process.
index-recommendations
SELECT * FROM t2 WHERE st_coveredby(geom1, geom2)
----
no index recommendations
--
optimal plan:
select
 ├── columns: k:1 i:2 s:3 geom1:4!null geog1:5 bbox1:6 bbox2:7 geom2:8!null geog2:9 inet1:10
 ├── immutable
 ├── cost: 2250.15
 ├── scan t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    └── cost: 1240.12
 └── filters
      └── st_coveredby(geom1:4, geom2:8) [outer=(4,8), immutable, constraints=(/4: (/NULL - ]; /8: (/NULL - ])]

index-candidates
SELECT * FROM t2 WHERE st_coveredby(geog1, geog2)
----
t2:
 (geog1)
 (geog2)

index-candidates
SELECT * FROM t2 WHERE st_contains(geom2, 'LINESTRING ( 0 0, 0 2 )'::geometry)
----
t2:
 (geom2)

index-recommendations
SELECT * FROM t2 WHERE st_contains(geom2, 'LINESTRING ( 0 0, 0 2 )'::geometry)
----
creation: CREATE INVERTED INDEX ON t.public.t2 (geom2);
--
optimal plan:
select
 ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8!null geog2:9 inet1:10
 ├── immutable
 ├── cost: 12058.09
 ├── index-join t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    ├── cost: 945.837778
 │    └── inverted-filter
 │         ├── columns: rowid:11!null
 │         ├── inverted expression: /14
 │         │    ├── tight: false, unique: false
 │         │    └── union spans
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │         │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │         ├── pre-filterer expression
 │         │    └── st_coveredby('0102000000020000000000000000000000000000000000000000000000000000000000000000000040', geom2:8)
 │         ├── cost: 254.706667
 │         ├── key: (11)
 │         └── scan t2@_hyp_1,inverted
 │              ├── columns: rowid:11!null geom2_inverted_key:14!null
 │              ├── inverted constraint: /14/11
 │              │    └── spans
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │              │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │              └── cost: 253.575556
 └── filters
      └── st_contains(geom2:8, '0102000000020000000000000000000000000000000000000000000000000000000000000000000040') [outer=(8), immutable, constraints=(/8: (/NULL - ])]

index-candidates
SELECT * FROM t2 WHERE st_containsproperly(geom1, geom2)
----
t2:
 (geom1)
 (geom2)

index-recommendations
SELECT * FROM t2 WHERE st_containsproperly(geom1, geom2)
----
no index recommendations
--
optimal plan:
select
 ├── columns: k:1 i:2 s:3 geom1:4!null geog1:5 bbox1:6 bbox2:7 geom2:8!null geog2:9 inet1:10
 ├── immutable
 ├── cost: 101250.15
 ├── scan t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    └── cost: 1240.12
 └── filters
      └── st_containsproperly(geom1:4, geom2:8) [outer=(4,8), immutable, constraints=(/4: (/NULL - ]; /8: (/NULL - ])]

index-candidates
SELECT * FROM t2 WHERE st_crosses(geom1, geom2)
----
t2:
 (geom1)
 (geom2)

index-recommendations
SELECT * FROM t2 WHERE st_crosses(geom1, geom2)
----
no index recommendations
--
optimal plan:
select
 ├── columns: k:1 i:2 s:3 geom1:4!null geog1:5 bbox1:6 bbox2:7 geom2:8!null geog2:9 inet1:10
 ├── immutable
 ├── cost: 101250.15
 ├── scan t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    └── cost: 1240.12
 └── filters
      └── st_crosses(geom1:4, geom2:8) [outer=(4,8), immutable, constraints=(/4: (/NULL - ]; /8: (/NULL - ])]

index-candidates
SELECT * FROM t2 WHERE st_dwithin(geom1, geom2, 10)
----
t2:
 (geom1)
 (geom2)

index-candidates
SELECT * FROM t2 WHERE st_dfullywithin(geom1, geom2, 10)
----
t2:
 (geom1)
 (geom2)

index-candidates
SELECT * FROM t2 WHERE st_equals(geom1, 'LINESTRING ( 0 0, 0 2 )'::geometry)
----
t2:
 (geom1)

index-recommendations
SELECT * FROM t2 WHERE st_equals(geom1, 'LINESTRING ( 0 0, 0 2 )'::geometry)
----
creation: CREATE INVERTED INDEX ON t.public.t2 (geom1);
--
optimal plan:
select
 ├── columns: k:1 i:2 s:3 geom1:4!null geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 ├── immutable
 ├── cost: 12058.09
 ├── index-join t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    ├── cost: 945.837778
 │    └── inverted-filter
 │         ├── columns: rowid:11!null
 │         ├── inverted expression: /14
 │         │    ├── tight: false, unique: false
 │         │    └── union spans
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │         │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │         ├── pre-filterer expression
 │         │    └── st_intersects('0102000000020000000000000000000000000000000000000000000000000000000000000000000040', geom1:4)
 │         ├── cost: 254.706667
 │         ├── key: (11)
 │         └── scan t2@_hyp_1,inverted
 │              ├── columns: rowid:11!null geom1_inverted_key:14!null
 │              ├── inverted constraint: /14/11
 │              │    └── spans
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │              │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │              └── cost: 253.575556
 └── filters
      └── st_equals(geom1:4, '0102000000020000000000000000000000000000000000000000000000000000000000000000000040') [outer=(4), immutable, constraints=(/4: (/NULL - ])]

index-candidates
SELECT * FROM t2 WHERE st_intersects(geom1, 'POLYGON (( 1 2, 1 4, 3 4, 3 2, 1 2))'::geometry)
----
t2:
 (geom1)

index-recommendations
SELECT * FROM t2 WHERE st_intersects(geom1, 'POLYGON (( 1 2, 1 4, 3 4, 3 2, 1 2))'::geometry)
----
creation: CREATE INVERTED INDEX ON t.public.t2 (geom1);
--
optimal plan:
select
 ├── columns: k:1 i:2 s:3 geom1:4!null geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 ├── immutable
 ├── cost: 1062.09
 ├── index-join t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    ├── cost: 949.837778
 │    └── inverted-filter
 │         ├── columns: rowid:11!null
 │         ├── inverted expression: /14
 │         │    ├── tight: false, unique: false
 │         │    └── union spans
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x03", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x03"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │         │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │         ├── pre-filterer expression
 │         │    └── st_intersects('01030000000100000005000000000000000000F03F0000000000000040000000000000F03F00000000000010400000000000000840000000000000104000000000000008400000000000000040000000000000F03F0000000000000040', geom1:4)
 │         ├── cost: 258.706667
 │         ├── key: (11)
 │         └── scan t2@_hyp_1,inverted
 │              ├── columns: rowid:11!null geom1_inverted_key:14!null
 │              ├── inverted constraint: /14/11
 │              │    └── spans
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x03", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x03"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │              │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │              └── cost: 257.575556
 └── filters
      └── st_intersects(geom1:4, '01030000000100000005000000000000000000F03F0000000000000040000000000000F03F00000000000010400000000000000840000000000000104000000000000008400000000000000040000000000000F03F0000000000000040') [outer=(4), immutable, constraints=(/4: (/NULL - ])]

index-candidates
SELECT * FROM t2 WHERE st_overlaps(geom1, geom2)
----
t2:
 (geom1)
 (geom2)

index-recommendations
SELECT * FROM t2 WHERE st_overlaps(geom1, geom2)
----
no index recommendations
--
optimal plan:
select
 ├── columns: k:1 i:2 s:3 geom1:4!null geog1:5 bbox1:6 bbox2:7 geom2:8!null geog2:9 inet1:10
 ├── immutable
 ├── cost: 101250.15
 ├── scan t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    └── cost: 1240.12
 └── filters
      └── st_overlaps(geom1:4, geom2:8) [outer=(4,8), immutable, constraints=(/4: (/NULL - ]; /8: (/NULL - ])]

index-candidates
SELECT * FROM t2 WHERE st_touches(geom1, geom2)
----
t2:
 (geom1)
 (geom2)

index-candidates
SELECT * FROM t2 WHERE st_within(geom1, geom2)
----
t2:
 (geom1)
 (geom2)

index-candidates
SELECT * FROM t2 WHERE st_dwithinexclusive(geom1, 'LINESTRING ( 0 0, 0 2 )'::geometry, 10)
----
t2:
 (geom1)

index-candidates
SELECT * FROM t2 WHERE st_dwithinexclusive('SRID=4326;POINT(-42.89456 75.938299)'::geography, geog2, 10, true)
----
t2:
 (geog2)

index-recommendations
SELECT * FROM t2 WHERE st_dwithinexclusive('SRID=4326;POINT(-42.89456 75.938299)'::geography, geog2, 10, true)
----
creation: CREATE INVERTED INDEX ON t.public.t2 (geog2);
--
optimal plan:
select
 ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9!null inet1:10
 ├── immutable
 ├── cost: 930.978889
 ├── index-join t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    ├── cost: 929.837778
 │    └── inverted-filter
 │         ├── columns: rowid:11!null
 │         ├── inverted expression: /14
 │         │    ├── tight: false, unique: false
 │         │    └── union spans
 │         │         ├── ["B\xfdL\x00\x00\x00\x00\x00\x00\x00", "B\xfdL\x00\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfdO\x00\x00\x00\x00\x00\x00\x00", "B\xfdO\x00\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfdO\xaa@\x00\x00\x00\x00\x00", "B\xfdO\xaa@\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfdO\xaal\x00\x00\x00\x00\x00", "B\xfdO\xaal\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfdO\xaan@\x00\x00\x00\x00", "B\xfdO\xaan@\x00\x00\x00\x00"]
 │         │         ├── ["B\xfdO\xaanP\x00\x00\x00\x00", "B\xfdO\xaanP\x00\x00\x00\x00"]
 │         │         ├── ["B\xfdO\xaanT\x00\x00\x00\x00", "B\xfdO\xaanT\x00\x00\x00\x00"]
 │         │         ├── ["B\xfdO\xaanT@\x00\x00\x00", "B\xfdO\xaanT@\x00\x00\x00"]
 │         │         ├── ["B\xfdO\xaanTH\x80\x00\x01", "B\xfdO\xaanTI\x00\x00\x00")
 │         │         ├── ["B\xfdO\xaanTI\x00\x00\x00", "B\xfdO\xaanTI\x00\x00\x00"]
 │         │         ├── ["B\xfdO\xaanTI\x00\x00\x01", "B\xfdO\xaanTI\x80\x00\x00")
 │         │         ├── ["B\xfdO\xaanTK\x00\x00\x00", "B\xfdO\xaanTK\x00\x00\x00"]
 │         │         ├── ["B\xfdO\xaanTK\x80\x00\x01", "B\xfdO\xaanTL\x00\x00\x00")
 │         │         ├── ["B\xfdO\xaanTL\x00\x00\x00", "B\xfdO\xaanTL\x00\x00\x00"]
 │         │         ├── ["B\xfdO\xaanTL\x00\x00\x01", "B\xfdO\xaanTL\x80\x00\x00")
 │         │         ├── ["B\xfdO\xaanTM\x00\x00\x00", "B\xfdO\xaanTM\x00\x00\x00"]
 │         │         ├── ["B\xfdO\xaanTM\x80\x00\x01", "B\xfdO\xaanTN\x00\x00\x00")
 │         │         ├── ["B\xfdO\xaanTN\x00\x00\x01", "B\xfdO\xaanTP\x00\x00\x00")
 │         │         ├── ["B\xfdO\xaanTP\x00\x00\x00", "B\xfdO\xaanTP\x00\x00\x00"]
 │         │         ├── ["B\xfdO\xaanU\x00\x00\x00\x00", "B\xfdO\xaanU\x00\x00\x00\x00"]
 │         │         ├── ["B\xfdO\xaao\x00\x00\x00\x00\x00", "B\xfdO\xaao\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfdO\xaap\x00\x00\x00\x00\x00", "B\xfdO\xaap\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfdO\xab\x00\x00\x00\x00\x00\x00", "B\xfdO\xab\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfdO\xac\x00\x00\x00\x00\x00\x00", "B\xfdO\xac\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfdO\xb0\x00\x00\x00\x00\x00\x00", "B\xfdO\xb0\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfdO\xc0\x00\x00\x00\x00\x00\x00", "B\xfdO\xc0\x00\x00\x00\x00\x00\x00"]
 │         │         └── ["B\xfdP\x00\x00\x00\x00\x00\x00\x00", "B\xfdP\x00\x00\x00\x00\x00\x00\x00"]
 │         ├── pre-filterer expression
 │         │    └── st_dwithinexclusive('0101000020E6100000A6272CF1807245C0A6B73F170DFC5240', geog2:9, 10.0, true)
 │         ├── cost: 238.706667
 │         ├── key: (11)
 │         └── scan t2@_hyp_1,inverted
 │              ├── columns: rowid:11!null geog2_inverted_key:14!null
 │              ├── inverted constraint: /14/11
 │              │    └── spans
 │              │         ├── ["B\xfdL\x00\x00\x00\x00\x00\x00\x00", "B\xfdL\x00\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfdO\x00\x00\x00\x00\x00\x00\x00", "B\xfdO\x00\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfdO\xaa@\x00\x00\x00\x00\x00", "B\xfdO\xaa@\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfdO\xaal\x00\x00\x00\x00\x00", "B\xfdO\xaal\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfdO\xaan@\x00\x00\x00\x00", "B\xfdO\xaan@\x00\x00\x00\x00"]
 │              │         ├── ["B\xfdO\xaanP\x00\x00\x00\x00", "B\xfdO\xaanP\x00\x00\x00\x00"]
 │              │         ├── ["B\xfdO\xaanT\x00\x00\x00\x00", "B\xfdO\xaanT\x00\x00\x00\x00"]
 │              │         ├── ["B\xfdO\xaanT@\x00\x00\x00", "B\xfdO\xaanT@\x00\x00\x00"]
 │              │         ├── ["B\xfdO\xaanTH\x80\x00\x01", "B\xfdO\xaanTI\x00\x00\x00")
 │              │         ├── ["B\xfdO\xaanTI\x00\x00\x00", "B\xfdO\xaanTI\x00\x00\x00"]
 │              │         ├── ["B\xfdO\xaanTI\x00\x00\x01", "B\xfdO\xaanTI\x80\x00\x00")
 │              │         ├── ["B\xfdO\xaanTK\x00\x00\x00", "B\xfdO\xaanTK\x00\x00\x00"]
 │              │         ├── ["B\xfdO\xaanTK\x80\x00\x01", "B\xfdO\xaanTL\x00\x00\x00")
 │              │         ├── ["B\xfdO\xaanTL\x00\x00\x00", "B\xfdO\xaanTL\x00\x00\x00"]
 │              │         ├── ["B\xfdO\xaanTL\x00\x00\x01", "B\xfdO\xaanTL\x80\x00\x00")
 │              │         ├── ["B\xfdO\xaanTM\x00\x00\x00", "B\xfdO\xaanTM\x00\x00\x00"]
 │              │         ├── ["B\xfdO\xaanTM\x80\x00\x01", "B\xfdO\xaanTN\x00\x00\x00")
 │              │         ├── ["B\xfdO\xaanTN\x00\x00\x01", "B\xfdO\xaanTP\x00\x00\x00")
 │              │         ├── ["B\xfdO\xaanTP\x00\x00\x00", "B\xfdO\xaanTP\x00\x00\x00"]
 │              │         ├── ["B\xfdO\xaanU\x00\x00\x00\x00", "B\xfdO\xaanU\x00\x00\x00\x00"]
 │              │         ├── ["B\xfdO\xaao\x00\x00\x00\x00\x00", "B\xfdO\xaao\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfdO\xaap\x00\x00\x00\x00\x00", "B\xfdO\xaap\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfdO\xab\x00\x00\x00\x00\x00\x00", "B\xfdO\xab\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfdO\xac\x00\x00\x00\x00\x00\x00", "B\xfdO\xac\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfdO\xb0\x00\x00\x00\x00\x00\x00", "B\xfdO\xb0\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfdO\xc0\x00\x00\x00\x00\x00\x00", "B\xfdO\xc0\x00\x00\x00\x00\x00\x00"]
 │              │         └── ["B\xfdP\x00\x00\x00\x00\x00\x00\x00", "B\xfdP\x00\x00\x00\x00\x00\x00\x00"]
 │              └── cost: 237.575556
 └── filters
      └── st_dwithinexclusive('0101000020E6100000A6272CF1807245C0A6B73F170DFC5240', geog2:9, 10.0, true) [outer=(9), immutable, constraints=(/9: (/NULL - ])]

index-candidates
SELECT * FROM t2 WHERE st_dwithinexclusive(geog1, geog2, 10)
----
t2:
 (geog1)
 (geog2)

index-recommendations
SELECT * FROM t2 WHERE st_dwithinexclusive(geog1, geog2, 10)
----
no index recommendations
--
optimal plan:
select
 ├── columns: k:1 i:2 s:3 geom1:4 geog1:5!null bbox1:6 bbox2:7 geom2:8 geog2:9!null inet1:10
 ├── immutable
 ├── cost: 1250.15
 ├── scan t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    └── cost: 1240.12
 └── filters
      └── st_dwithinexclusive(geog1:5, geog2:9, 10.0) [outer=(5,9), immutable, constraints=(/5: (/NULL - ]; /9: (/NULL - ])]

index-candidates
SELECT * FROM t2 WHERE st_dfullywithinexclusive(geom1, geom2, 10)
----
t2:
 (geom1)
 (geom2)

# Part 2: Geospatial indexes should be added for Box2d operators and functions.

# Note: An inverted index on geom1 is not chosen for the query plan. When both
# arguments of functions are variables in the column, we cannot determine if a
# row evaluates to true unless we check both values. This would require a full
# scan. Thus, a non inverted index, bbox1, is chosen here.
index-candidates
SELECT * FROM t2 WHERE bbox1 ~ geom1
----
t2:
 (bbox1)
 (geom1)

index-recommendations
SELECT * FROM t2 WHERE bbox1 ~ geom1
----
creation: CREATE INDEX ON t.public.t2 (bbox1) STORING (k, i, s, geom1, geog1, bbox2, geom2, geog2, inet1);
--
optimal plan:
select
 ├── columns: k:1 i:2 s:3 geom1:4!null geog1:5 bbox1:6!null bbox2:7 geom2:8 geog2:9 inet1:10
 ├── immutable
 ├── cost: 1225.85
 ├── scan t2@_hyp_1
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6!null bbox2:7 geom2:8 geog2:9 inet1:10
 │    ├── constraint: /6/11: (/NULL - ]
 │    └── cost: 1215.92
 └── filters
      └── bbox1:6 ~ geom1:4 [outer=(4,6), immutable, constraints=(/4: (/NULL - ]; /6: (/NULL - ])]

# Note: An inverted index on geom1 is chosen for the query plan here. If one of
# the arguments is a constant, we can determine if a row evaluates to true by
# just checking the variable value and comparing against the constant. We can
# use inverted index to index-accelerate this process.
index-candidates
SELECT * FROM t2 WHERE bbox1 && bbox2 AND 'BOX(1 2, 3 4)'::box2d ~ geom1
----
t2:
 (bbox1)
 (bbox2)
 (geom1)

index-recommendations
SELECT * FROM t2 WHERE bbox1 && bbox2 AND 'BOX(1 2, 3 4)'::box2d ~ geom1
----
creation: CREATE INVERTED INDEX ON t.public.t2 (geom1);
--
optimal plan:
select
 ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6!null bbox2:7!null geom2:8 geog2:9 inet1:10
 ├── immutable
 ├── cost: 950.988889
 ├── index-join t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    ├── cost: 949.837778
 │    └── inverted-filter
 │         ├── columns: rowid:11!null
 │         ├── inverted expression: /14
 │         │    ├── tight: false, unique: false
 │         │    └── union spans
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x03", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x03"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │         │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │         ├── pre-filterer expression
 │         │    └── st_covers('01030000000100000005000000000000000000F03F0000000000000040000000000000F03F00000000000010400000000000000840000000000000104000000000000008400000000000000040000000000000F03F0000000000000040', geom1:4)
 │         ├── cost: 258.706667
 │         ├── key: (11)
 │         └── scan t2@_hyp_3,inverted
 │              ├── columns: rowid:11!null geom1_inverted_key:14!null
 │              ├── inverted constraint: /14/11
 │              │    └── spans
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x03", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x03"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │              │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │              └── cost: 257.575556
 └── filters
      ├── bbox1:6 && bbox2:7 [outer=(6,7), immutable, constraints=(/6: (/NULL - ]; /7: (/NULL - ])]
      └── 'BOX(1 2,3 4)' ~ geom1:4 [outer=(4), immutable]

# For queries that use the Box2d functions but arguments type is not geospatial,
# do not recommend their index.
index-candidates
SELECT * FROM t2 WHERE inet1 && inet1
----

index-recommendations
SELECT * FROM t2 WHERE inet1 && inet1
----
no index recommendations
--
optimal plan:
select
 ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 ├── immutable
 ├── cost: 1250.15
 ├── scan t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    └── cost: 1240.12
 └── filters
      └── inet1:10 && inet1:10 [outer=(10), immutable]

# Part 3: For spatial functions that do not use index accelerated geospatial
# functions, do not recommend geospatial index.
index-candidates
SELECT * FROM t2 WHERE st_hasarc(geom1)
----

index-recommendations
SELECT * FROM t2 WHERE st_hasarc(geom1)
----
no index recommendations
--
optimal plan:
select
 ├── columns: k:1 i:2 s:3 geom1:4!null geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 ├── immutable
 ├── cost: 2250.15
 ├── scan t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    └── cost: 1240.12
 └── filters
      └── st_hasarc(geom1:4) [outer=(4), immutable, constraints=(/4: (/NULL - ])]

index-candidates
SELECT * FROM t2 WHERE st_isclosed(geom1)
----

index-candidates
SELECT * FROM t2 WHERE st_iscollection(geom1)
----

index-candidates
SELECT st_area(geom1) FROM t2
----

index-candidates
SELECT * FROM t2 WHERE postgis_hasbbox(geom1) = true
----

index-candidates
SELECT * FROM t2 WHERE st_area(geog1) = 1
----

# Part 3: For non-spatial functions, do not recommend index.
index-candidates
SELECT * FROM t2 WHERE family(inet1) = 6
----

index-recommendations
SELECT * FROM t2 WHERE family(inet1) = 6
----
no index recommendations
--
optimal plan:
select
 ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 ├── immutable
 ├── cost: 1250.15
 ├── scan t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    └── cost: 1240.12
 └── filters
      └── family(inet1:10) = 6 [outer=(10), immutable]

index-candidates
SELECT * FROM t2 WHERE sign(k) = 2
----

# PART 4: These following test cases cover different cases for multi-column
# combinations for geospatial functions
# Note: For inverted indexes, only equal + inverted candidates are combined.

# 1.Geospatial Inverted + Geospatial Inverted: no combined candidates
index-candidates
SELECT * FROM t2 WHERE st_overlaps(geom1, 'POINT(0 0 0 0)') AND st_overlaps('POINT(0 0 0 0)', geom2)
----
t2:
 (geom1)
 (geom2)

index-recommendations
SELECT * FROM t2 WHERE st_overlaps(geom1, 'POINT(0 0 0 0)') AND st_overlaps('POINT(0 0 0 0)', geom2)
----
creation: CREATE INVERTED INDEX ON t.public.t2 (geom1);
--
optimal plan:
select
 ├── columns: k:1 i:2 s:3 geom1:4!null geog1:5 bbox1:6 bbox2:7 geom2:8!null geog2:9 inet1:10
 ├── immutable
 ├── cost: 23169.2111
 ├── index-join t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    ├── cost: 945.837778
 │    └── inverted-filter
 │         ├── columns: rowid:11!null
 │         ├── inverted expression: /14
 │         │    ├── tight: false, unique: false
 │         │    └── union spans
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │         │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │         ├── pre-filterer expression
 │         │    └── st_intersects('01010000C00000000000000000000000000000000000000000000000000000000000000000', geom1:4)
 │         ├── cost: 254.706667
 │         ├── key: (11)
 │         └── scan t2@_hyp_1,inverted
 │              ├── columns: rowid:11!null geom1_inverted_key:14!null
 │              ├── inverted constraint: /14/11
 │              │    └── spans
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │              │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │              └── cost: 253.575556
 └── filters
      ├── st_overlaps(geom1:4, '01010000C00000000000000000000000000000000000000000000000000000000000000000') [outer=(4), immutable, constraints=(/4: (/NULL - ])]
      └── st_overlaps('01010000C00000000000000000000000000000000000000000000000000000000000000000', geom2:8) [outer=(8), immutable, constraints=(/8: (/NULL - ])]

# 2.Geospatial Inverted + EQ: combined index (inverted + equal candidates)
index-candidates
SELECT * FROM t2 WHERE st_overlaps(geom1, 'POINT(0 0 0 0)') AND k = 2
----
t2:
 (geom1)
 (k)
 (k, geom1)

index-recommendations
SELECT * FROM t2 WHERE st_overlaps(geom1, 'POINT(0 0 0 0)') AND k = 2
----
creation: CREATE INVERTED INDEX ON t.public.t2 (k, geom1);
--
optimal plan:
select
 ├── columns: k:1!null i:2 s:3 geom1:4!null geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 ├── immutable
 ├── cost: 137.301112
 ├── fd: ()-->(1)
 ├── index-join t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    ├── cost: 26.148889
 │    └── inverted-filter
 │         ├── columns: rowid:11!null
 │         ├── inverted expression: /15
 │         │    ├── tight: false, unique: false
 │         │    └── union spans
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │         │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │         ├── pre-filterer expression
 │         │    └── st_intersects('01010000C00000000000000000000000000000000000000000000000000000000000000000', geom1:4)
 │         ├── cost: 19.2177778
 │         ├── key: (11)
 │         └── scan t2@_hyp_3,inverted
 │              ├── columns: rowid:11!null geom1_inverted_key:15!null
 │              ├── constraint: /1: [/2 - /2]
 │              ├── inverted constraint: /15/11
 │              │    └── spans
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │              │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │              └── cost: 19.1866667
 └── filters
      └── st_overlaps(geom1:4, '01010000C00000000000000000000000000000000000000000000000000000000000000000') [outer=(4), immutable, constraints=(/4: (/NULL - ])]

# 3.Geospatial inverted + R: no combined candidates
index-candidates
SELECT * FROM t2 WHERE st_overlaps(geom1, 'POINT(0 0 0 0)') AND k > 2
----
t2:
 (geom1)
 (k)

index-recommendations
SELECT * FROM t2 WHERE st_overlaps(geom1, 'POINT(0 0 0 0)') AND k > 2
----
creation: CREATE INVERTED INDEX ON t.public.t2 (geom1);
--
optimal plan:
select
 ├── columns: k:1!null i:2 s:3 geom1:4!null geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 ├── immutable
 ├── cost: 12058.1
 ├── index-join t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    ├── cost: 945.837778
 │    └── inverted-filter
 │         ├── columns: rowid:11!null
 │         ├── inverted expression: /14
 │         │    ├── tight: false, unique: false
 │         │    └── union spans
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │         │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │         ├── pre-filterer expression
 │         │    └── st_intersects('01010000C00000000000000000000000000000000000000000000000000000000000000000', geom1:4)
 │         ├── cost: 254.706667
 │         ├── key: (11)
 │         └── scan t2@_hyp_2,inverted
 │              ├── columns: rowid:11!null geom1_inverted_key:14!null
 │              ├── inverted constraint: /14/11
 │              │    └── spans
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │              │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │              └── cost: 253.575556
 └── filters
      ├── st_overlaps(geom1:4, '01010000C00000000000000000000000000000000000000000000000000000000000000000') [outer=(4), immutable, constraints=(/4: (/NULL - ])]
      └── k:1 > 2 [outer=(1), constraints=(/1: [/3 - ]; tight)]

# 4.Geospatial inverted + EQ + EQ: combined index (inverted + equal, inverted +
# equal group, equal group candidates)
index-candidates
SELECT * FROM t2 WHERE st_overlaps(geom1, 'POINT(0 0 0 0)') AND k = 2 AND i = 3
----
t2:
 (geom1)
 (i)
 (i, geom1)
 (k)
 (k, geom1)
 (k, i)
 (k, i, geom1)

index-recommendations
SELECT * FROM t2 WHERE st_overlaps(geom1, 'POINT(0 0 0 0)') AND k = 2 AND i = 3
----
creation: CREATE INDEX ON t.public.t2 (k) STORING (i, s, geom1, geog1, bbox1, bbox2, geom2, geog2, inet1);
creation: CREATE INDEX ON t.public.t2 (i) STORING (k, s, geom1, geog1, bbox1, bbox2, geom2, geog2, inet1);
--
optimal plan:
inner-join (zigzag t2@_hyp_1 t2@_hyp_2)
 ├── columns: k:1!null i:2!null s:3 geom1:4!null geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 ├── eq columns: [11] = [11]
 ├── left fixed columns: [1] = [2]
 ├── right fixed columns: [2] = [3]
 ├── immutable
 ├── cost: 28.3042149
 ├── fd: ()-->(1,2)
 └── filters
      ├── st_overlaps(geom1:4, '01010000C00000000000000000000000000000000000000000000000000000000000000000') [outer=(4), immutable, constraints=(/4: (/NULL - ])]
      ├── k:1 = 2 [outer=(1), constraints=(/1: [/2 - /2]; tight), fd=()-->(1)]
      └── i:2 = 3 [outer=(2), constraints=(/2: [/3 - /3]; tight), fd=()-->(2)]

# 5. Geospatial inverted + R + R: combined index (inverted + equal, inverted +
# equal group, equal group candidates)
index-candidates
SELECT * FROM t2 WHERE st_overlaps(geom1, 'POINT(0 0 0 0)') AND k > 2 AND i > 3
----
t2:
 (geom1)
 (i)
 (k)

index-recommendations
SELECT * FROM t2 WHERE st_overlaps(geom1, 'POINT(0 0 0 0)') AND k > 2 AND i > 3
----
creation: CREATE INVERTED INDEX ON t.public.t2 (geom1);
--
optimal plan:
select
 ├── columns: k:1!null i:2!null s:3 geom1:4!null geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 ├── immutable
 ├── cost: 12058.11
 ├── index-join t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    ├── cost: 945.837778
 │    └── inverted-filter
 │         ├── columns: rowid:11!null
 │         ├── inverted expression: /14
 │         │    ├── tight: false, unique: false
 │         │    └── union spans
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │         │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │         ├── pre-filterer expression
 │         │    └── st_intersects('01010000C00000000000000000000000000000000000000000000000000000000000000000', geom1:4)
 │         ├── cost: 254.706667
 │         ├── key: (11)
 │         └── scan t2@_hyp_3,inverted
 │              ├── columns: rowid:11!null geom1_inverted_key:14!null
 │              ├── inverted constraint: /14/11
 │              │    └── spans
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │              │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │              └── cost: 253.575556
 └── filters
      ├── st_overlaps(geom1:4, '01010000C00000000000000000000000000000000000000000000000000000000000000000') [outer=(4), immutable, constraints=(/4: (/NULL - ])]
      ├── k:1 > 2 [outer=(1), constraints=(/1: [/3 - ]; tight)]
      └── i:2 > 3 [outer=(2), constraints=(/2: [/4 - ]; tight)]

# 6. Geospatial inverted + EQ + R: combined index (inverted + equal, equal +
# range candidates)
index-candidates
SELECT * FROM t2 WHERE st_overlaps(geom1, geom2) AND k = 2 AND i > 3
----
t2:
 (geom1)
 (geom2)
 (i)
 (k)
 (k, geom1)
 (k, geom2)
 (k, i)

# 7. Geospatial inverted + Geospatial inverted + EQ: combined index (inverted +
# equal candidates)
index-candidates
SELECT * FROM t2 WHERE st_overlaps(geom1, 'POINT(0 0 0 0)') AND st_covers(geog1, geog2) AND k = 2
----
t2:
 (geog1)
 (geog2)
 (geom1)
 (k)
 (k, geog1)
 (k, geog2)
 (k, geom1)

# 8. Geospatial inverted + Geospatial inverted + R: no combined index
index-candidates
SELECT * FROM t2 WHERE st_overlaps(geom1, geom1) AND st_overlaps(geom2, geom2) AND k > 2
----
t2:
 (geom1)
 (geom2)
 (k)

# 9. Geospatial inverted + EQ: no combined index since inverted and equal
# candidates are from different table
index-candidates
SELECT * FROM t2 JOIN t1 ON st_crosses(geom1, geom2) WHERE t2.s = 'Hello' AND st_covers(geog1, geog2)
----
t2:
 (geog1)
 (geog2)
 (geom1)
 (geom2)
 (s)
 (s, geog1)
 (s, geog2)
 (s, geom1)
 (s, geom2)

# 10. Geospatial inverted + EQ + J: combined index between inverted + equal
# candidates from same table
index-candidates
SELECT * FROM t2 JOIN t1 ON t1.k = t2.k WHERE st_covers(geog1, geog2)
----
t1:
 (k)
t2:
 (geog1)
 (geog2)
 (k)

# 11. Geospatial inverted + J: no combined index between inverted + join
# candidates
index-candidates
SELECT * FROM t2 JOIN t1 ON t1.k != t2.k WHERE st_covers(geog1, geog2)
----
t1:
 (k)
t2:
 (geog1)
 (geog2)
 (k)

# 12. Geospatial inverted + J + EQ: combined index between join + equal
# candidates Note: No combined index between equal and inverted index from
# different tables
index-candidates
SELECT * FROM t2 JOIN t1 ON t1.k != t2.k WHERE st_covers(geog1, geog2) AND t2.i = 2
----
t1:
 (k)
t2:
 (geog1)
 (geog2)
 (i)
 (i, geog1)
 (i, geog2)
 (i, k)
 (k)

# These following test cases cover different cases for multi-column combinations
# for Box2d operations.
# Note: Box2d indexes are not added to inverted indexes.
# 13. Geospatial Inverted + Box2d Index + EQ: combined index between equal +
# inverted candidates
index-candidates
SELECT * FROM t2 WHERE geom1 && 'BOX(1 2, 3 4)'::box2d AND k = 2
----
t2:
 (geom1)
 (k)
 (k, geom1)

index-recommendations
SELECT * FROM t2 WHERE geom1 && 'BOX(1 2, 3 4)'::box2d AND k = 2
----
creation: CREATE INVERTED INDEX ON t.public.t2 (k, geom1);
--
optimal plan:
select
 ├── columns: k:1!null i:2 s:3 geom1:4!null geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 ├── immutable
 ├── cost: 26.1900001
 ├── fd: ()-->(1)
 ├── index-join t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    ├── cost: 26.148889
 │    └── inverted-filter
 │         ├── columns: rowid:11!null
 │         ├── inverted expression: /15
 │         │    ├── tight: false, unique: false
 │         │    └── union spans
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x03", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x03"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │         │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │         ├── pre-filterer expression
 │         │    └── st_intersects('01030000000100000005000000000000000000F03F0000000000000040000000000000F03F00000000000010400000000000000840000000000000104000000000000008400000000000000040000000000000F03F0000000000000040', geom1:4)
 │         ├── cost: 19.2177778
 │         ├── key: (11)
 │         └── scan t2@_hyp_3,inverted
 │              ├── columns: rowid:11!null geom1_inverted_key:15!null
 │              ├── constraint: /1: [/2 - /2]
 │              ├── inverted constraint: /15/11
 │              │    └── spans
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x03", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x03"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │              │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │              └── cost: 19.1866667
 └── filters
      └── geom1:4 && 'BOX(1 2,3 4)' [outer=(4), immutable, constraints=(/4: (/NULL - ])]

# 14. Geospatial Inverted + Box2d Index + R: no combined index
index-candidates
SELECT * FROM t2 WHERE bbox1 ~ bbox2 AND 'BOX(1 2, 3 4)'::box2d && geom2 AND k > 2
----
t2:
 (bbox1)
 (bbox2)
 (geom2)
 (k)

index-recommendations
SELECT * FROM t2 WHERE bbox1 ~ bbox2 AND 'BOX(1 2, 3 4)'::box2d && geom2 AND k > 2
----
creation: CREATE INDEX ON t.public.t2 (k) STORING (i, s, geom1, geog1, bbox1, bbox2, geom2, geog2, inet1);
--
optimal plan:
select
 ├── columns: k:1!null i:2 s:3 geom1:4 geog1:5 bbox1:6!null bbox2:7!null geom2:8 geog2:9 inet1:10
 ├── immutable
 ├── cost: 424.726667
 ├── scan t2@_hyp_3
 │    ├── columns: k:1!null i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    ├── constraint: /1/11: [/3 - ]
 │    └── cost: 421.353333
 └── filters
      ├── bbox1:6 ~ bbox2:7 [outer=(6,7), immutable, constraints=(/6: (/NULL - ]; /7: (/NULL - ])]
      └── 'BOX(1 2,3 4)' && geom2:8 [outer=(8), immutable]

# 15. Geospatial Inverted + Box2d Index + non spatial function: no combined
# index
index-candidates
SELECT * FROM t2 WHERE st_covers(geom1, geom2) AND ~k = 1
----
t2:
 (geom1)
 (geom2)

index-recommendations
SELECT * FROM t2 WHERE st_covers(geom1, geom2) AND ~k = 1
----
no index recommendations
--
optimal plan:
select
 ├── columns: k:1 i:2 s:3 geom1:4!null geog1:5 bbox1:6 bbox2:7 geom2:8!null geog2:9 inet1:10
 ├── immutable
 ├── cost: 2250.16
 ├── scan t2
 │    ├── columns: k:1 i:2 s:3 geom1:4 geog1:5 bbox1:6 bbox2:7 geom2:8 geog2:9 inet1:10
 │    └── cost: 1240.12
 └── filters
      ├── st_covers(geom1:4, geom2:8) [outer=(4,8), immutable, constraints=(/4: (/NULL - ]; /8: (/NULL - ])]
      └── (~k:1) = 1 [outer=(1), immutable]

# 16. Geospatial Inverted + J + EQ: combined index between join + equal,
# inverted + equal
index-candidates
SELECT * FROM t1, t2 WHERE st_covers(geom1, 'POLYGON (( 1 2, 1 4, 3 4, 3 2, 1 2))'::geometry) AND t1.s ~ t2.s AND ~t1.k = t1.k
----
t1:
 (k)
 (k, s)
 (s)
t2:
 (geom1)
 (s)

index-recommendations
SELECT * FROM t1, t2 WHERE t1.s ~ t2.s AND ~t1.k = t1.k
----
creation: CREATE INDEX ON t.public.t1 (k) STORING (i, f, s);
--
optimal plan:
inner-join (cross)
 ├── columns: k:1!null i:2 f:3 s:4!null k:8 i:9 s:10!null geom1:11 geog1:12 bbox1:13 bbox2:14 geom2:15 geog2:16 inet1:17
 ├── immutable
 ├── cost: 5665.48872
 ├── scan t2
 │    ├── columns: t2.k:8 t2.i:9 t2.s:10 geom1:11 geog1:12 bbox1:13 bbox2:14 geom2:15 geog2:16 inet1:17
 │    └── cost: 1240.12
 ├── select
 │    ├── columns: t1.k:1!null t1.i:2 f:3 t1.s:4
 │    ├── immutable
 │    ├── cost: 1107.05
 │    ├── scan t1@_hyp_1
 │    │    ├── columns: t1.k:1!null t1.i:2 f:3 t1.s:4
 │    │    ├── constraint: /1/5: (/NULL - ]
 │    │    └── cost: 1097.12
 │    └── filters
 │         └── t1.k:1 = (~t1.k:1) [outer=(1), immutable, constraints=(/1: (/NULL - ])]
 └── filters
      └── t1.s:4 ~ t2.s:10 [outer=(4,10), immutable, constraints=(/4: (/NULL - ]; /10: (/NULL - ])]

exec-ddl
DROP TABLE t1
----

exec-ddl
DROP TABLE t2
----

exec-ddl
CREATE TABLE t1 (k INT)
----

exec-ddl
CREATE TABLE t2 (k INT, geom1 GEOMETRY)
----

exec-ddl
CREATE INVERTED INDEX inverted_idx ON t2 (geom1);
----

# No index recommendation should be made since redundant index already exists.
# This test case is added here to make sure BuildOptAndHypTableMaps handles
# adding inverted hypothetical indexes correctly.
index-recommendations
SELECT * FROM t2 WHERE st_covers(geom1, 'POINT(0 0 0 0)')
----
no index recommendations
--
optimal plan:
select
 ├── columns: k:1 geom1:2!null
 ├── immutable
 ├── cost: 928.312222
 ├── index-join t2
 │    ├── columns: k:1 geom1:2
 │    ├── cost: 816.06
 │    └── inverted-filter
 │         ├── columns: rowid:3!null
 │         ├── inverted expression: /6
 │         │    ├── tight: false, unique: false
 │         │    └── union spans
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │         │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │         ├── pre-filterer expression
 │         │    └── st_coveredby('01010000C00000000000000000000000000000000000000000000000000000000000000000', geom1:2)
 │         ├── cost: 142.706667
 │         ├── key: (3)
 │         └── scan t2@inverted_idx,inverted
 │              ├── columns: rowid:3!null t2.geom1_inverted_key:6!null
 │              ├── inverted constraint: /6/3
 │              │    └── spans
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │              │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │              └── cost: 141.575556
 └── filters
      └── st_covers(geom1:2, '01010000C00000000000000000000000000000000000000000000000000000000000000000') [outer=(2), immutable, constraints=(/2: (/NULL - ])]

# The following tests check for not visible indexes.
exec-ddl
DROP INDEX inverted_idx
----

exec-ddl
CREATE INVERTED INDEX inverted_idx ON t2 (geom1) NOT VISIBLE
----

# Recommend alter index visible if the useful inverted index is invisible.
index-recommendations
SELECT * FROM t2 WHERE st_covers(geom1, 'POINT(0 0 0 0)')
----
alteration: ALTER INDEX t.public.t2@inverted_idx VISIBLE;
--
optimal plan:
select
 ├── columns: k:1 geom1:2!null
 ├── immutable
 ├── cost: 1040.31222
 ├── index-join t2
 │    ├── columns: k:1 geom1:2
 │    ├── cost: 928.06
 │    └── inverted-filter
 │         ├── columns: rowid:3!null
 │         ├── inverted expression: /8
 │         │    ├── tight: false, unique: false
 │         │    └── union spans
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │         │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │         ├── pre-filterer expression
 │         │    └── st_coveredby('01010000C00000000000000000000000000000000000000000000000000000000000000000', geom1:2)
 │         ├── cost: 254.706667
 │         ├── key: (3)
 │         └── scan t2@_hyp_2,inverted
 │              ├── columns: rowid:3!null geom1_inverted_key:8!null
 │              ├── inverted constraint: /8/3
 │              │    └── spans
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x01", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x01"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x04", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x04"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x10", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x10"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00@", "B\xfd\x10\x00\x00\x00\x00\x00\x00@"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x01\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x01\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x04\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x04\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x10\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x10\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00@\x00", "B\xfd\x10\x00\x00\x00\x00\x00@\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x01\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x01\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x04\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x04\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x10\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x10\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00@\x00\x00", "B\xfd\x10\x00\x00\x00\x00@\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x01\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x01\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x04\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x04\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x10\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x10\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x00@\x00\x00\x00", "B\xfd\x10\x00\x00\x00@\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x01\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x01\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x04\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x04\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00\x10\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x10\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x00@\x00\x00\x00\x00", "B\xfd\x10\x00\x00@\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x01\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x01\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x04\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x04\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00\x10\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x10\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x00@\x00\x00\x00\x00\x00", "B\xfd\x10\x00@\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x01\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x01\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x04\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x04\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10\x10\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x10\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x10@\x00\x00\x00\x00\x00\x00", "B\xfd\x10@\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │              │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │              └── cost: 253.575556
 └── filters
      └── st_covers(geom1:2, '01010000C00000000000000000000000000000000000000000000000000000000000000000') [outer=(2), immutable, constraints=(/2: (/NULL - ])]

exec-ddl
CREATE INVERTED INDEX inverted_idx_visible ON t2 (geom1) VISIBLE
----

# No recommendation if there is a useful index but just behind the invisible index.
index-recommendations
SELECT * FROM t2 WHERE st_covers(geom1, 'POINT(0 0 0 0)')
----
no index recommendations
--
optimal plan:
select
 ├── columns: k:1 geom1:2!null
 ├── immutable
 ├── cost: 928.312222
 ├── index-join t2
 │    ├── columns: k:1 geom1:2
 │    ├── cost: 816.06
 │    └── inverted-filter
 │         ├── columns: rowid:3!null
 │         ├── inverted expression: /8
 │         │    ├── tight: false, unique: false
 │         │    └── union spans
 │         │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │         │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │         │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │         ├── pre-filterer expression
 │         │    └── st_coveredby('01010000C00000000000000000000000000000000000000000000000000000000000000000', geom1:2)
 │         ├── cost: 142.706667
 │         ├── key: (3)
 │         └── scan t2@inverted_idx_visible,inverted
 │              ├── columns: rowid:3!null t2.geom1_inverted_key:8!null
 │              ├── inverted constraint: /8/3
 │              │    └── spans
 │              │         ├── ["B\xfd\x10\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x10\x00\x00\x00\x00\x00\x00\x00"]
 │              │         ├── ["B\xfd\x11\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x11\x00\x00\x00\x00\x00\x00\x00"]
 │              │         └── ["B\xfd\x14\x00\x00\x00\x00\x00\x00\x00", "B\xfd\x14\x00\x00\x00\x00\x00\x00\x00"]
 │              └── cost: 141.575556
 └── filters
      └── st_covers(geom1:2, '01010000C00000000000000000000000000000000000000000000000000000000000000000') [outer=(2), immutable, constraints=(/2: (/NULL - ])]
