|
7 | 7 | * array.sql and array_1.sql
|
8 | 8 | * --------------------
|
9 | 9 | * Test output for 64-bit and 32-bit systems respectively.
|
10 |
| - * |
11 |
| - * -------------------- |
12 |
| - * array_2.sql and array_3.sql |
13 |
| - * -------------------- |
14 |
| - * Since 6ed83d5fa55c in PostgreSQL 17, the order of rows |
15 |
| - * in the output has been changed. |
16 | 10 | */
|
17 | 11 | set enable_seqscan=off;
|
18 | 12 | set enable_sort=off;
|
@@ -859,41 +853,71 @@ EXPLAIN (COSTS OFF) SELECT * FROM test_array WHERE i % '{}';
|
859 | 853 | DROP INDEX idx_array;
|
860 | 854 | /*
|
861 | 855 | * Check ordering using distance operator
|
| 856 | + * |
| 857 | + * We want to check that index scan provides us correct ordering by distance |
| 858 | + * operator. File 'data/rum_array.data' contains two arrays that statisfy |
| 859 | + * i @> '{23,20}' and have finite distance i <=> '{51}', and a bunch of arrays |
| 860 | + * that statisfy i @> '{23,20}' and have infinite distance i <=> '{51}'. |
| 861 | + * |
| 862 | + * When ordering by distance the order of this bunch of arrays with infinite |
| 863 | + * distance is not determined and may depend of PostgreSQL version and system. |
| 864 | + * We don't add another sort expression to ORDER BY because that might cause |
| 865 | + * the planner to avoid using the index. Instead, we replace arrays that have |
| 866 | + * infinite distance with {-1} to unambiguously determine the test output. |
| 867 | + * |
| 868 | + * 'Infinity' is printed differently in the output in different PostgreSQL |
| 869 | + * versions, so we replace it with -1. |
862 | 870 | */
|
863 | 871 | CREATE TABLE test_array_order (
|
864 | 872 | i int2[]
|
865 | 873 | );
|
866 | 874 | \copy test_array_order(i) from 'data/rum_array.data';
|
867 | 875 | CREATE INDEX idx_array_order ON test_array_order USING rum (i rum_anyarray_ops);
|
| 876 | +/* |
| 877 | + * Check that plan of the query uses ordering provided by index scan |
| 878 | + */ |
868 | 879 | EXPLAIN (COSTS OFF)
|
869 |
| -SELECT *, i <=> '{51}' from test_array_order WHERE i @> '{23,20}' order by i <=> '{51}'; |
870 |
| - QUERY PLAN |
871 |
| ------------------------------------------------------- |
872 |
| - Index Scan using idx_array_order on test_array_order |
873 |
| - Index Cond: (i @> '{23,20}'::smallint[]) |
874 |
| - Order By: (i <=> '{51}'::smallint[]) |
875 |
| -(3 rows) |
| 880 | +SELECT |
| 881 | + CASE WHEN distance = 'Infinity' THEN '{-1}' |
| 882 | + ELSE i |
| 883 | + END i, |
| 884 | + CASE WHEN distance = 'Infinity' THEN -1 |
| 885 | + ELSE distance::numeric(18,14) |
| 886 | + END distance |
| 887 | + FROM |
| 888 | + (SELECT *, (i <=> '{51}') AS distance |
| 889 | + FROM test_array_order WHERE i @> '{23,20}' ORDER BY distance) t; |
| 890 | + QUERY PLAN |
| 891 | +------------------------------------------------------------ |
| 892 | + Subquery Scan on t |
| 893 | + -> Index Scan using idx_array_order on test_array_order |
| 894 | + Index Cond: (i @> '{23,20}'::smallint[]) |
| 895 | + Order By: (i <=> '{51}'::smallint[]) |
| 896 | +(4 rows) |
876 | 897 |
|
877 |
| -SELECT i, |
| 898 | +SELECT |
| 899 | + CASE WHEN distance = 'Infinity' THEN '{-1}' |
| 900 | + ELSE i |
| 901 | + END i, |
878 | 902 | CASE WHEN distance = 'Infinity' THEN -1
|
879 | 903 | ELSE distance::numeric(18,14)
|
880 | 904 | END distance
|
881 | 905 | FROM
|
882 | 906 | (SELECT *, (i <=> '{51}') AS distance
|
883 |
| - FROM test_array_order WHERE i @> '{23,20}' ORDER BY i <=> '{51}') t; |
| 907 | + FROM test_array_order WHERE i @> '{23,20}' ORDER BY distance) t; |
884 | 908 | i | distance
|
885 | 909 | ---------------------+------------------
|
886 | 910 | {20,23,51} | 1.73205080756888
|
887 | 911 | {33,51,20,77,23,65} | 2.44948974278318
|
888 |
| - {23,76,34,23,2,20} | -1 |
889 |
| - {20,60,45,23,29} | -1 |
890 |
| - {23,89,38,20,40,95} | -1 |
891 |
| - {23,20,72} | -1 |
892 |
| - {73,23,20} | -1 |
893 |
| - {6,97,20,89,23} | -1 |
894 |
| - {20,98,30,23,1,66} | -1 |
895 |
| - {57,23,39,46,50,20} | -1 |
896 |
| - {81,20,26,22,23} | -1 |
897 |
| - {18,23,10,90,15,20} | -1 |
| 912 | + {-1} | -1 |
| 913 | + {-1} | -1 |
| 914 | + {-1} | -1 |
| 915 | + {-1} | -1 |
| 916 | + {-1} | -1 |
| 917 | + {-1} | -1 |
| 918 | + {-1} | -1 |
| 919 | + {-1} | -1 |
| 920 | + {-1} | -1 |
| 921 | + {-1} | -1 |
898 | 922 | (12 rows)
|
899 | 923 |
|
0 commit comments