|
| 1 | +SELECT set_sphere_output_precision(8); |
| 2 | + set_sphere_output_precision |
| 3 | +----------------------------- |
| 4 | + SET 8 |
| 5 | +(1 row) |
| 6 | + |
| 7 | +CREATE TABLE test_boxes ( |
| 8 | + b sbox |
| 9 | +); |
| 10 | +COPY test_boxes (b) FROM stdin; |
| 11 | +CREATE OR REPLACE FUNCTION qnodes(q text) RETURNS text |
| 12 | +LANGUAGE 'plpgsql' AS |
| 13 | +$$ |
| 14 | +DECLARE |
| 15 | + exp TEXT; |
| 16 | + mat TEXT[]; |
| 17 | + ret TEXT[]; |
| 18 | +BEGIN |
| 19 | + FOR exp IN EXECUTE 'EXPLAIN ' || q |
| 20 | + LOOP |
| 21 | + --RAISE NOTICE 'EXP: %', exp; |
| 22 | + mat := regexp_matches(exp, ' *(?:-> *)?(.*Scan on (test_boxes|test_boxes_brin_idx))'); |
| 23 | + --RAISE NOTICE 'MAT: %', mat; |
| 24 | + IF mat IS NOT NULL THEN |
| 25 | + ret := array_append(ret, mat[1]); |
| 26 | + END IF; |
| 27 | + --RAISE NOTICE 'RET: %', ret; |
| 28 | + END LOOP; |
| 29 | + RETURN array_to_string(ret,','); |
| 30 | +END; |
| 31 | +$$; |
| 32 | +CREATE INDEX test_boxes_brin_idx ON test_boxes USING brin (b); |
| 33 | +SET enable_indexscan = OFF; |
| 34 | +SET enable_bitmapscan = OFF; |
| 35 | +SET enable_seqscan = ON; |
| 36 | +SELECT 'scan_seq', qnodes('SELECT * FROM test_boxes WHERE b <@ sbox ''( (10d,10d), (20d,20d) )'''); |
| 37 | + ?column? | qnodes |
| 38 | +----------+------------------------ |
| 39 | + scan_seq | Seq Scan on test_boxes |
| 40 | +(1 row) |
| 41 | + |
| 42 | +SELECT * FROM test_boxes WHERE b <@ sbox '( (10d,10d), (20d,20d) )'; |
| 43 | + b |
| 44 | +--- |
| 45 | +(0 rows) |
| 46 | + |
| 47 | +SELECT 'scan_seq', qnodes('SELECT * FROM test_boxes WHERE b && sbox ''( (10d,10d), (20d,20d) )'''); |
| 48 | + ?column? | qnodes |
| 49 | +----------+------------------------ |
| 50 | + scan_seq | Seq Scan on test_boxes |
| 51 | +(1 row) |
| 52 | + |
| 53 | +SELECT * FROM test_boxes WHERE b && sbox '( (10d,10d), (20d,20d) )'; |
| 54 | + b |
| 55 | +-------------------------------------------------------- |
| 56 | + ((0.34906585 , 0.17453293), (0.35006585 , 0.17463293)) |
| 57 | +(1 row) |
| 58 | + |
| 59 | +SET enable_indexscan = OFF; |
| 60 | +SET enable_bitmapscan = ON; |
| 61 | +SET enable_seqscan = OFF; |
| 62 | +SELECT 'scan_idx', qnodes('SELECT * FROM test_boxes WHERE b <@ sbox ''( (10d,10d), (20d,20d) )'''); |
| 63 | + ?column? | qnodes |
| 64 | +----------+------------------------------------------------------------------------- |
| 65 | + scan_idx | Bitmap Heap Scan on test_boxes,Bitmap Index Scan on test_boxes_brin_idx |
| 66 | +(1 row) |
| 67 | + |
| 68 | +SELECT * FROM test_boxes WHERE b <@ sbox '( (10d,10d), (20d,20d) )'; |
| 69 | + b |
| 70 | +--- |
| 71 | +(0 rows) |
| 72 | + |
| 73 | +SELECT 'scan_idx', qnodes('SELECT * FROM test_boxes WHERE b && sbox ''( (10d,10d), (20d,20d) )'''); |
| 74 | + ?column? | qnodes |
| 75 | +----------+------------------------------------------------------------------------- |
| 76 | + scan_idx | Bitmap Heap Scan on test_boxes,Bitmap Index Scan on test_boxes_brin_idx |
| 77 | +(1 row) |
| 78 | + |
| 79 | +SELECT * FROM test_boxes WHERE b && sbox '( (10d,10d), (20d,20d) )'; |
| 80 | + b |
| 81 | +-------------------------------------------------------- |
| 82 | + ((0.34906585 , 0.17453293), (0.35006585 , 0.17463293)) |
| 83 | +(1 row) |
| 84 | + |
| 85 | +---- cleanup |
| 86 | +DROP INDEX test_boxes_brin_idx; |
| 87 | +DROP TABLE test_boxes; |
| 88 | +DROP FUNCTION qnodes(text); |
| 89 | +SET enable_indexscan = ON; |
| 90 | +SET enable_bitmapscan = ON; |
| 91 | +SET enable_seqscan = ON; |
0 commit comments