summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane2000-09-23 21:27:05 +0000
committerTom Lane2000-09-23 21:27:05 +0000
commit89ebadcd779de650016b04cc11c416f7d0ec0516 (patch)
tree5008cbe0831a3242af477f4fba8e54f4780b8ac3
parent5a5531a3f47124851ab84a18f08fec6ddda86e34 (diff)
Back-patch fix for erroneous selectivity of not-equals.
-rw-r--r--src/backend/utils/adt/selfuncs.c19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index 4718dc668a7..246a8d6086d 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -15,7 +15,7 @@
*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.66 2000/05/26 17:19:15 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/utils/adt/selfuncs.c,v 1.66.2.1 2000/09/23 21:27:05 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -255,9 +255,24 @@ neqsel(Oid opid,
Datum value,
int32 flag)
{
+ Oid eqopid;
float64 result;
- result = eqsel(opid, relid, attno, value, flag);
+ /*
+ * We want 1 - eqsel() where the equality operator is the one associated
+ * with this != operator, that is, its negator.
+ */
+ eqopid = get_negator(opid);
+ if (eqopid)
+ {
+ result = eqsel(eqopid, relid, attno, value, flag);
+ }
+ else
+ {
+ /* Use default selectivity (should we raise an error instead?) */
+ result = (float64) palloc(sizeof(float64data));
+ *result = DEFAULT_EQ_SEL;
+ }
*result = 1.0 - *result;
return result;
}