@@ -480,23 +480,33 @@ DROP INDEX box_spgist;
480
480
--
481
481
-- Test the SP-GiST index on the larger volume of data
482
482
--
483
- CREATE TABLE quad_box_tbl (b box);
483
+ CREATE TABLE quad_box_tbl (id int, b box);
484
484
INSERT INTO quad_box_tbl
485
- SELECT box(point(x * 10, y * 10), point(x * 10 + 5, y * 10 + 5))
486
- FROM generate_series(1, 100) x,
487
- generate_series(1, 100) y;
485
+ SELECT (x - 1) * 100 + y, box(point(x * 10, y * 10), point(x * 10 + 5, y * 10 + 5))
486
+ FROM generate_series(1, 100) x,
487
+ generate_series(1, 100) y;
488
488
-- insert repeating data to test allTheSame
489
489
INSERT INTO quad_box_tbl
490
- SELECT '((200, 300),(210, 310))'
491
- FROM generate_series(1, 1000) ;
490
+ SELECT i, '((200, 300),(210, 310))'
491
+ FROM generate_series(10001, 11000) AS i ;
492
492
INSERT INTO quad_box_tbl
493
- VALUES
494
- ( NULL),
495
- ( NULL),
496
- ( '((-infinity,-infinity),(infinity,infinity))'),
497
- ( '((-infinity,100),(-infinity,500))'),
498
- ( '((-infinity,-infinity),(700,infinity))');
493
+ VALUES
494
+ (11001, NULL),
495
+ (11002, NULL),
496
+ (11003, '((-infinity,-infinity),(infinity,infinity))'),
497
+ (11004, '((-infinity,100),(-infinity,500))'),
498
+ (11005, '((-infinity,-infinity),(700,infinity))');
499
499
CREATE INDEX quad_box_tbl_idx ON quad_box_tbl USING spgist(b);
500
+ -- get reference results for ORDER BY distance from seq scan
501
+ SET enable_seqscan = ON;
502
+ SET enable_indexscan = OFF;
503
+ SET enable_bitmapscan = OFF;
504
+ CREATE TABLE quad_box_tbl_ord_seq1 AS
505
+ SELECT rank() OVER (ORDER BY b <-> point '123,456') n, b <-> point '123,456' dist, id
506
+ FROM quad_box_tbl;
507
+ CREATE TABLE quad_box_tbl_ord_seq2 AS
508
+ SELECT rank() OVER (ORDER BY b <-> point '123,456') n, b <-> point '123,456' dist, id
509
+ FROM quad_box_tbl WHERE b <@ box '((200,300),(500,600))';
500
510
SET enable_seqscan = OFF;
501
511
SET enable_indexscan = ON;
502
512
SET enable_bitmapscan = ON;
@@ -578,6 +588,54 @@ SELECT count(*) FROM quad_box_tbl WHERE b ~= box '((200,300),(205,305))';
578
588
1
579
589
(1 row)
580
590
591
+ -- test ORDER BY distance
592
+ SET enable_indexscan = ON;
593
+ SET enable_bitmapscan = OFF;
594
+ EXPLAIN (COSTS OFF)
595
+ SELECT rank() OVER (ORDER BY b <-> point '123,456') n, b <-> point '123,456' dist, id
596
+ FROM quad_box_tbl;
597
+ QUERY PLAN
598
+ ---------------------------------------------------------
599
+ WindowAgg
600
+ -> Index Scan using quad_box_tbl_idx on quad_box_tbl
601
+ Order By: (b <-> '(123,456)'::point)
602
+ (3 rows)
603
+
604
+ CREATE TEMP TABLE quad_box_tbl_ord_idx1 AS
605
+ SELECT rank() OVER (ORDER BY b <-> point '123,456') n, b <-> point '123,456' dist, id
606
+ FROM quad_box_tbl;
607
+ SELECT *
608
+ FROM quad_box_tbl_ord_seq1 seq FULL JOIN quad_box_tbl_ord_idx1 idx
609
+ ON seq.n = idx.n AND seq.id = idx.id AND
610
+ (seq.dist = idx.dist OR seq.dist IS NULL AND idx.dist IS NULL)
611
+ WHERE seq.id IS NULL OR idx.id IS NULL;
612
+ n | dist | id | n | dist | id
613
+ ---+------+----+---+------+----
614
+ (0 rows)
615
+
616
+ EXPLAIN (COSTS OFF)
617
+ SELECT rank() OVER (ORDER BY b <-> point '123,456') n, b <-> point '123,456' dist, id
618
+ FROM quad_box_tbl WHERE b <@ box '((200,300),(500,600))';
619
+ QUERY PLAN
620
+ ---------------------------------------------------------
621
+ WindowAgg
622
+ -> Index Scan using quad_box_tbl_idx on quad_box_tbl
623
+ Index Cond: (b <@ '(500,600),(200,300)'::box)
624
+ Order By: (b <-> '(123,456)'::point)
625
+ (4 rows)
626
+
627
+ CREATE TEMP TABLE quad_box_tbl_ord_idx2 AS
628
+ SELECT rank() OVER (ORDER BY b <-> point '123,456') n, b <-> point '123,456' dist, id
629
+ FROM quad_box_tbl WHERE b <@ box '((200,300),(500,600))';
630
+ SELECT *
631
+ FROM quad_box_tbl_ord_seq2 seq FULL JOIN quad_box_tbl_ord_idx2 idx
632
+ ON seq.n = idx.n AND seq.id = idx.id AND
633
+ (seq.dist = idx.dist OR seq.dist IS NULL AND idx.dist IS NULL)
634
+ WHERE seq.id IS NULL OR idx.id IS NULL;
635
+ n | dist | id | n | dist | id
636
+ ---+------+----+---+------+----
637
+ (0 rows)
638
+
581
639
RESET enable_seqscan;
582
640
RESET enable_indexscan;
583
641
RESET enable_bitmapscan;
0 commit comments