--- /dev/null
+-- create table\r
+CREATE TABLE knn_recheck_geom(gid serial primary key, geom geometry);\r
+INSERT INTO knn_recheck_geom(gid,geom)\r
+SELECT ROW_NUMBER() OVER(ORDER BY x,y) AS gid, ST_Point(x*0.777,y*0.777) As geom\r
+FROM generate_series(-100,100, 1) AS x CROSS JOIN generate_series(-300,10000,10) As y;\r
+\r
+INSERT INTO knn_recheck_geom(gid, geom)\r
+SELECT 500000, 'LINESTRING(100 300, -10 700, 400 123, -300 10000)'::geometry;\r
+\r
+\r
+INSERT INTO knn_recheck_geom(gid, geom)\r
+SELECT 500001, 'POLYGON((100 3000, -10 700, 400 123, 405 124, 100 3000))'::geometry;\r
+\r
+INSERT INTO knn_recheck_geom(gid,geom)\r
+SELECT 600000 + ROW_NUMBER() OVER(ORDER BY gid) AS gid, ST_Buffer(geom,1000,2) As geom\r
+FROM knn_recheck_geom\r
+WHERE gid IN(1000, 10000, 2000, 40000);\r
+\r
+\r
+-- without index order should match st_distance order --\r
+-- point check\r
+SELECT gid, RANK() OVER(ORDER BY ST_Distance( 'POINT(200 1000)'::geometry, geom) )\r
+FROM knn_recheck_geom\r
+ORDER BY 'POINT(200 1000)'::geometry <-> geom LIMIT 5;\r
+\r
+-- linestring check\r
+SELECT gid, RANK() OVER(ORDER BY ST_Distance( 'LINESTRING(200 100, -10 600)'::geometry, geom) )\r
+FROM knn_recheck_geom\r
+ORDER BY 'LINESTRING(200 100, -10 600)'::geometry <-> geom LIMIT 5;\r
+\r
+-- lateral check before index\r
+SELECT a.gid, b.gid As match, RANK() OVER(PARTITION BY a.gid ORDER BY ST_Distance(a.geom, b.geom) ) As true_rn, b.rn As knn_rn\r
+FROM knn_recheck_geom As a \r
+ LEFT JOIN \r
+ LATERAL ( SELECT gid, geom, RANK() OVER(ORDER BY a.geom <-> g.geom) As rn \r
+ FROM knn_recheck_geom As g WHERE a.gid <> g.gid ORDER BY a.geom <-> g.geom LIMIT 5) As b ON true\r
+ WHERE a.gid IN(50000,50001,70000,61000)\r
+ORDER BY a.gid, b.rn;\r
+\r
+-- create index and repeat\r
+CREATE INDEX idx_knn_recheck_geom_gist ON knn_recheck_geom USING gist(geom);\r
+\r
+-- point check after index\r
+SELECT gid, RANK() OVER(ORDER BY ST_Distance( 'POINT(200 1000)'::geometry, geom) )\r
+FROM knn_recheck_geom\r
+ORDER BY 'POINT(200 1000)'::geometry <-> geom LIMIT 5;\r
+\r
+-- lateral check after index - currently is wrong\r
+SELECT a.gid, b.gid As match, RANK() OVER(PARTITION BY a.gid ORDER BY ST_Distance(a.geom, b.geom) ) As true_rn, b.rn As knn_rn\r
+FROM knn_recheck_geom As a \r
+ LEFT JOIN \r
+ LATERAL ( SELECT gid, geom, RANK() OVER(ORDER BY a.geom <-> g.geom) As rn \r
+ FROM knn_recheck_geom As g WHERE a.gid <> g.gid ORDER BY a.geom <-> g.geom LIMIT 5) As b ON true\r
+ WHERE a.gid IN(50000,50001,70000,61000)\r
+ORDER BY a.gid, b.rn;\r
+\r
+DROP TABLE knn_recheck_geom;
\ No newline at end of file