# LogicTest: local

# EXPLAIN test cases for using invertedFilterer on an inverted geospatial index.

statement ok
CREATE TABLE geo_table2(
  k int,
  geom geometry,
  k_plus_one int,
  PRIMARY KEY (k, k_plus_one),
  INVERTED INDEX geom_index(geom)
)

query T
EXPLAIN (DISTSQL) SELECT k FROM geo_table2 WHERE ST_Intersects('POINT(3.0 3.0)'::geometry, geom)
----
distribution: local
vectorized: true
·
• filter
│ filter: st_intersects('010100000000000000000008400000000000000840', geom)
│
└── • index join
    │ table: geo_table2@geo_table2_pkey
    │
    └── • inverted filter
        │ inverted column: geom_inverted_key
        │ num spans: 31
        │
        └── • scan
              missing stats
              table: geo_table2@geom_index
              spans: 31 spans
·
Diagram: https://cockroachdb.github.io/distsqlplan/decode.html#eJyUVFFP2zAQft-vsO4FKhmwE6ZNfuoGYcsElLWVtmmuIq8-StTUzmxnFKH-9ykpBRrWsvrBiu98n7_v8zn34H8XICD5fnX-Ib0k-6fpYDj4et4hg-Q8ORmSKTnr9y7IBG0W1K8CI_Ltc9JPiA9ZbgI6j-Pg9_eueunlcD8-ZCQ-ZJ09IT4lvYtk2P9B69JZBygYq_FSzdCD-AkcRhRKZ8fovXV16L7ZkOo5CEYhN2UV6vCIwtg6BHEPIQ8FgoBhzaOPSqM7YkBBY1B50cA-0ezWx2a50TgHCie2qGbGCzKlZJqVReUza3DJDSgMSlUnjyR8lHJ-raWccyblnL02wcGuNVwCUUaTmBEbbtB5GC0o2Co86fVBTRAEf2ZQegqCLej_e5SaP-gC6rO8COjQHfF1o1b5ZF46Yg3pRoL42gXig3JBNKrid2-lZBGTkrHXJiBo9K5ltRktNyj0qiBIl9NutNGaqGUN38WaLzY3D90Tbeueh8-snOJdq4WattlELm6Ri3Yh93hf8Tq1ZVy0nx3jjLOX4_3xi_WeeP4mu1HnyemNSo5bSuJdlPTRl9Z4XNOx6STWOumAL0YUUE9w-WvwtnJjvHJ23OxdLnsNUBPQ6MMyy5eL1KxSPjhUs8cH9ByJb0WKNiPxNlK0FSnejBS1keKtSMfb1I0oXBf2Nss1CFhd_cE_ptWAukBNfH1tgxt728AO78ra9GtVeKRwoaZ4igHdLDe5D_kYRHAVLhZv_gYAAP__Y8P2qw==

query T
EXPLAIN (DISTSQL) SELECT k, k_plus_one FROM geo_table2 WHERE ST_Intersects('POINT(3.0 3.0)'::geometry, geom)
----
distribution: local
vectorized: true
·
• filter
│ filter: st_intersects('010100000000000000000008400000000000000840', geom)
│
└── • index join
    │ table: geo_table2@geo_table2_pkey
    │
    └── • inverted filter
        │ inverted column: geom_inverted_key
        │ num spans: 31
        │
        └── • scan
              missing stats
              table: geo_table2@geom_index
              spans: 31 spans
·
Diagram: https://cockroachdb.github.io/distsqlplan/decode.html#eJyUVFFP2zAQft-vsO4FKhmwE6ZNfuoGYcsElLWVtmmpoqw-StTUzmxnFFX975NTCm1YyuoHK77zff6-z-cswP4uQED0_ebyQ3xNDs_jwXDw9bJDBtFldDYkU0qmaVlUNtUKyUW_d0UmqFOX_SowIN8-R_2IWJfmyqGxOHb28OCmF18PD8NjRsJj1jkQ4lPUu4qG_R_Ul846QEFpidfZDC2In8BhRKE0eozWauNDi3pDLOcgGIVclZXz4RGFsTYIYgEudwWCgKHn0cdMojlhQEGiy_Kihn2m2fXHprmSOAcKZ7qoZsqKbWkrbkBhUGY-eZLAxySZ38okmXOWJHP22gRH-9bwBEimJAkZ0e4OjYXRkoKu3LNe67IJguAbBsXnINiS_r9HsfqDxqG8yAuHBs0J3zZqnY_mpSFakW4giPUuEOsy40StKnz3NklYwJKEsdcmIKjkvmXejIYbFHqVE6TLaTdotSZoWMP3seaLztVj9wS7uufxMy2n-NBoId82m43USjRsEA32Ifp0d-E2zVVcNJ8g44yzl-P96Yv1gdh8n92gs-l62CrmtCEm3EdMH22plcUtKW0nscZJR3w5ooBygqs_hdWVGeON0eN672rZq4HqgETrVlm-WsRqnbLOYDZ7ek-bSHwnUtCOxJtIwU6ksB0paCKFO5FOd6kbUbgt9H2aSxCwvv2jf0zrAb4gm1h_bYM7fV_DDh9Kb_ptVlikcJVN8RwdmlmucuvyMQhnKlwu3_wNAAD__2Z4AE8=

query T
EXPLAIN SELECT k, k_plus_one FROM geo_table2 WHERE ST_Intersects('POINT(3.0 3.0)'::geometry, geom)
----
distribution: local
vectorized: true
·
• filter
│ filter: st_intersects('010100000000000000000008400000000000000840', geom)
│
└── • index join
    │ table: geo_table2@geo_table2_pkey
    │
    └── • inverted filter
        │ inverted column: geom_inverted_key
        │ num spans: 31
        │
        └── • scan
              missing stats
              table: geo_table2@geom_index
              spans: 31 spans

query T
EXPLAIN SELECT k, k_plus_one FROM geo_table2 WHERE ST_DFullyWithin('POINT(3.0 3.0)'::geometry, geom, 1)
----
distribution: local
vectorized: true
·
• filter
│ filter: st_dfullywithin('010100000000000000000008400000000000000840', geom, 1.0)
│
└── • index join
    │ table: geo_table2@geo_table2_pkey
    │
    └── • inverted filter
        │ inverted column: geom_inverted_key
        │ num spans: 30
        │
        └── • scan
              missing stats
              table: geo_table2@geom_index
              spans: 30 spans

# Bounding box operations.
statement ok
SET CLUSTER SETTING sql.spatial.experimental_box2d_comparison_operators.enabled = on

query T
EXPLAIN SELECT k FROM geo_table2 WHERE geom && 'POINT(3.0 3.0)'::geometry
----
distribution: local
vectorized: true
·
• filter
│ filter: geom && '010100000000000000000008400000000000000840'
│
└── • index join
    │ table: geo_table2@geo_table2_pkey
    │
    └── • inverted filter
        │ inverted column: geom_inverted_key
        │ num spans: 31
        │
        └── • scan
              missing stats
              table: geo_table2@geom_index
              spans: 31 spans

query T
EXPLAIN SELECT k FROM geo_table2 WHERE 'POINT(3.0 3.0)'::geometry::box2d && geom
----
distribution: local
vectorized: true
·
• filter
│ filter: 'BOX(3 3,3 3)' && geom
│
└── • index join
    │ table: geo_table2@geo_table2_pkey
    │
    └── • inverted filter
        │ inverted column: geom_inverted_key
        │ num spans: 31
        │
        └── • scan
              missing stats
              table: geo_table2@geom_index
              spans: 31 spans

query T
EXPLAIN SELECT k FROM geo_table2 WHERE 'LINESTRING(1.0 1.0, 5.0 5.0)'::geometry ~ geom
----
distribution: local
vectorized: true
·
• filter
│ filter: '010200000002000000000000000000F03F000000000000F03F00000000000014400000000000001440' ~ geom
│
└── • index join
    │ table: geo_table2@geo_table2_pkey
    │
    └── • inverted filter
        │ inverted column: geom_inverted_key
        │ num spans: 33
        │
        └── • scan
              missing stats
              table: geo_table2@geom_index
              spans: 33 spans

query T
EXPLAIN SELECT k FROM geo_table2 WHERE geom ~ 'LINESTRING(1.0 1.0, 5.0 5.0)'::geometry::box2d
----
distribution: local
vectorized: true
·
• filter
│ filter: geom ~ 'BOX(1 1,5 5)'
│
└── • index join
    │ table: geo_table2@geo_table2_pkey
    │
    └── • inverted filter
        │ inverted column: geom_inverted_key
        │ num spans: 30
        │
        └── • scan
              missing stats
              table: geo_table2@geom_index
              spans: 30 spans
