Line data Source code
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-2023, 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 49 208 : areasel(PG_FUNCTION_ARGS) 50 : { 51 208 : PG_RETURN_FLOAT8(0.005); 52 : } 53 : 54 : Datum 55 66 : areajoinsel(PG_FUNCTION_ARGS) 56 : { 57 66 : 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 68 934 : positionsel(PG_FUNCTION_ARGS) 69 : { 70 934 : PG_RETURN_FLOAT8(0.1); 71 : } 72 : 73 : Datum 74 114 : positionjoinsel(PG_FUNCTION_ARGS) 75 : { 76 114 : 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 87 676 : contsel(PG_FUNCTION_ARGS) 88 : { 89 676 : PG_RETURN_FLOAT8(0.001); 90 : } 91 : 92 : Datum 93 30 : contjoinsel(PG_FUNCTION_ARGS) 94 : { 95 30 : PG_RETURN_FLOAT8(0.001); 96 : }