aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/selfuncs.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/selfuncs.c')
-rw-r--r--src/backend/utils/adt/selfuncs.c206
1 files changed, 2 insertions, 204 deletions
diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index 810a8f6db1f..1b37f38e641 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -15,7 +15,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.200 2006/04/26 18:28:29 momjian Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.201 2006/04/26 22:32:56 momjian Exp $
*
*-------------------------------------------------------------------------
*/
@@ -111,26 +111,6 @@
#include "utils/syscache.h"
-/* Return data from examine_variable and friends */
-typedef struct
-{
- Node *var; /* the Var or expression tree */
- RelOptInfo *rel; /* Relation, or NULL if not identifiable */
- HeapTuple statsTuple; /* pg_statistic tuple, or NULL if none */
- /* NB: if statsTuple!=NULL, it must be freed when caller is done */
- Oid vartype; /* exposed type of expression */
- Oid atttype; /* type to pass to get_attstatsslot */
- int32 atttypmod; /* typmod to pass to get_attstatsslot */
- bool isunique; /* true if matched to a unique index */
-} VariableStatData;
-
-#define ReleaseVariableStats(vardata) \
- do { \
- if (HeapTupleIsValid((vardata).statsTuple)) \
- ReleaseSysCache((vardata).statsTuple); \
- } while(0)
-
-
static double mcv_selectivity(VariableStatData *vardata, FmgrInfo *opproc,
Datum constval, double *sumcommonp);
static double ineq_histogram_selectivity(VariableStatData *vardata,
@@ -158,9 +138,6 @@ static double convert_one_bytea_to_scalar(unsigned char *value, int valuelen,
int rangelo, int rangehi);
static char *convert_string_datum(Datum value, Oid typid);
static double convert_timevalue_to_scalar(Datum value, Oid typid);
-static bool get_restriction_variable(PlannerInfo *root, List *args, int varRelid,
- VariableStatData *vardata, Node **other,
- bool *varonleft);
static void get_join_variables(PlannerInfo *root, List *args,
VariableStatData *vardata1,
VariableStatData *vardata2);
@@ -3172,7 +3149,7 @@ convert_timevalue_to_scalar(Datum value, Oid typid)
* Note: if there are Vars on both sides of the clause, we must fail, because
* callers are expecting that the other side will act like a pseudoconstant.
*/
-static bool
+bool
get_restriction_variable(PlannerInfo *root, List *args, int varRelid,
VariableStatData *vardata, Node **other,
bool *varonleft)
@@ -4852,182 +4829,3 @@ gistcostestimate(PG_FUNCTION_ARGS)
PG_RETURN_VOID();
}
-
-
-#define DEFAULT_PARENT_SEL 0.001
-
-/*
- * parentsel - Selectivity of parent relationship for ltree data types.
- */
-Datum
-parentsel(PG_FUNCTION_ARGS)
-{
- PlannerInfo *root = (PlannerInfo *) PG_GETARG_POINTER(0);
- Oid operator = PG_GETARG_OID(1);
- List *args = (List *) PG_GETARG_POINTER(2);
- int varRelid = PG_GETARG_INT32(3);
- VariableStatData vardata;
- Node *other;
- bool varonleft;
- Datum *values;
- int nvalues;
- float4 *numbers;
- int nnumbers;
- double selec = 0.0;
-
- /*
- * If expression is not variable <@ something or something <@ variable,
- * then punt and return a default estimate.
- */
- if (!get_restriction_variable(root, args, varRelid,
- &vardata, &other, &varonleft))
- PG_RETURN_FLOAT8(DEFAULT_PARENT_SEL);
-
- /*
- * If the something is a NULL constant, assume operator is strict and
- * return zero, ie, operator will never return TRUE.
- */
- if (IsA(other, Const) &&
- ((Const *) other)->constisnull)
- {
- ReleaseVariableStats(vardata);
- PG_RETURN_FLOAT8(0.0);
- }
-
- if (HeapTupleIsValid(vardata.statsTuple))
- {
- Form_pg_statistic stats;
- double mcvsum = 0.0;
- double mcvsel = 0.0;
- double hissel = 0.0;
-
- stats = (Form_pg_statistic) GETSTRUCT(vardata.statsTuple);
-
- if (IsA(other, Const))
- {
- /* Variable is being compared to a known non-null constant */
- Datum constval = ((Const *) other)->constvalue;
- bool match = false;
- int i;
-
- /*
- * Is the constant "<@" to any of the column's most common values?
- */
- if (get_attstatsslot(vardata.statsTuple,
- vardata.atttype, vardata.atttypmod,
- STATISTIC_KIND_MCV, InvalidOid,
- &values, &nvalues,
- &numbers, &nnumbers))
- {
- FmgrInfo contproc;
-
- fmgr_info(get_opcode(operator), &contproc);
-
- for (i = 0; i < nvalues; i++)
- {
- /* be careful to apply operator right way 'round */
- if (varonleft)
- match = DatumGetBool(FunctionCall2(&contproc,
- values[i],
- constval));
- else
- match = DatumGetBool(FunctionCall2(&contproc,
- constval,
- values[i]));
-
- /* calculate total selectivity of all most-common-values */
- mcvsum += numbers[i];
-
- /* calculate selectivity of matching most-common-values */
- if (match)
- mcvsel += numbers[i];
- }
- }
- else
- {
- /* no most-common-values info available */
- values = NULL;
- numbers = NULL;
- i = nvalues = nnumbers = 0;
- }
-
- free_attstatsslot(vardata.atttype, values, nvalues, NULL, 0);
-
- /*
- * Is the constant "<@" to any of the column's histogram values?
- */
- if (get_attstatsslot(vardata.statsTuple,
- vardata.atttype, vardata.atttypmod,
- STATISTIC_KIND_HISTOGRAM, InvalidOid,
- &values, &nvalues,
- NULL, NULL))
- {
- FmgrInfo contproc;
-
- fmgr_info(get_opcode(operator), &contproc);
-
- for (i = 0; i < nvalues; i++)
- {
- /* be careful to apply operator right way 'round */
- if (varonleft)
- match = DatumGetBool(FunctionCall2(&contproc,
- values[i],
- constval));
- else
- match = DatumGetBool(FunctionCall2(&contproc,
- constval,
- values[i]));
- /* count matching histogram values */
- if (match)
- hissel++;
- }
-
- if (hissel > 0.0)
- {
- /*
- * some matching values found inside histogram, divide
- * matching entries number by total histogram entries to
- * get the histogram related selectivity
- */
- hissel /= nvalues;
- }
- }
- else
- {
- /* no histogram info available */
- values = NULL;
- i = nvalues = 0;
- }
-
- free_attstatsslot(vardata.atttype, values, nvalues,
- NULL, 0);
-
-
- /*
- * calculate selectivity based on MCV and histogram result
- * histogram selectivity needs to be scaled down if there are any
- * most-common-values
- */
- selec = mcvsel + hissel * (1.0 - mcvsum);
-
- /*
- * don't return 0.0 selectivity unless all table values are inside
- * mcv
- */
- if (selec == 0.0 && mcvsum != 1.0)
- selec = DEFAULT_PARENT_SEL;
- }
- else
- selec = DEFAULT_PARENT_SEL;
- }
- else
- selec = DEFAULT_PARENT_SEL;
-
- ReleaseVariableStats(vardata);
-
- /* result should be in range, but make sure... */
- CLAMP_PROBABILITY(selec);
-
- PG_RETURN_FLOAT8((float8) selec);
-}
-