1 /*-------------------------------------------------------------------------
2 *
3 * geo_selfuncs.c
4 * Selectivity routines registered in the operator catalog in the
5 * "oprrest" and "oprjoin" attributes.
6 *
7 * Portions Copyright (c) 1996-2017, PostgreSQL Global Development Group
8 * Portions Copyright (c) 1994, Regents of the University of California
9 *
10 *
11 * IDENTIFICATION
12 * src/backend/utils/adt/geo_selfuncs.c
13 *
14 * XXX These are totally bogus. Perhaps someone will make them do
15 * something reasonable, someday.
16 *
17 *-------------------------------------------------------------------------
18 */
19 #include "postgres.h"
20
21 #include "utils/builtins.h"
22 #include "utils/geo_decls.h"
23
24
25 /*
26 * Selectivity functions for geometric operators. These are bogus -- unless
27 * we know the actual key distribution in the index, we can't make a good
28 * prediction of the selectivity of these operators.
29 *
30 * Note: the values used here may look unreasonably small. Perhaps they
31 * are. For now, we want to make sure that the optimizer will make use
32 * of a geometric index if one is available, so the selectivity had better
33 * be fairly small.
34 *
35 * In general, GiST needs to search multiple subtrees in order to guarantee
36 * that all occurrences of the same key have been found. Because of this,
37 * the estimated cost for scanning the index ought to be higher than the
38 * output selectivity would indicate. gistcostestimate(), over in selfuncs.c,
39 * ought to be adjusted accordingly --- but until we can generate somewhat
40 * realistic numbers here, it hardly matters...
41 */
42
43
44 /*
45 * Selectivity for operators that depend on area, such as "overlap".
46 */
47
48 Datum
areasel(PG_FUNCTION_ARGS)49 areasel(PG_FUNCTION_ARGS)
50 {
51 PG_RETURN_FLOAT8(0.005);
52 }
53
54 Datum
areajoinsel(PG_FUNCTION_ARGS)55 areajoinsel(PG_FUNCTION_ARGS)
56 {
57 PG_RETURN_FLOAT8(0.005);
58 }
59
60 /*
61 * positionsel
62 *
63 * How likely is a box to be strictly left of (right of, above, below)
64 * a given box?
65 */
66
67 Datum
positionsel(PG_FUNCTION_ARGS)68 positionsel(PG_FUNCTION_ARGS)
69 {
70 PG_RETURN_FLOAT8(0.1);
71 }
72
73 Datum
positionjoinsel(PG_FUNCTION_ARGS)74 positionjoinsel(PG_FUNCTION_ARGS)
75 {
76 PG_RETURN_FLOAT8(0.1);
77 }
78
79 /*
80 * contsel -- How likely is a box to contain (be contained by) a given box?
81 *
82 * This is a tighter constraint than "overlap", so produce a smaller
83 * estimate than areasel does.
84 */
85
86 Datum
contsel(PG_FUNCTION_ARGS)87 contsel(PG_FUNCTION_ARGS)
88 {
89 PG_RETURN_FLOAT8(0.001);
90 }
91
92 Datum
contjoinsel(PG_FUNCTION_ARGS)93 contjoinsel(PG_FUNCTION_ARGS)
94 {
95 PG_RETURN_FLOAT8(0.001);
96 }
97