aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/gist/gistscan.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/access/gist/gistscan.c')
-rw-r--r--src/backend/access/gist/gistscan.c25
1 files changed, 21 insertions, 4 deletions
diff --git a/src/backend/access/gist/gistscan.c b/src/backend/access/gist/gistscan.c
index 636aa62b680..e72bf08f952 100644
--- a/src/backend/access/gist/gistscan.c
+++ b/src/backend/access/gist/gistscan.c
@@ -33,14 +33,30 @@ pairingheap_GISTSearchItem_cmp(const pairingheap_node *a, const pairingheap_node
const GISTSearchItem *sb = (const GISTSearchItem *) b;
IndexScanDesc scan = (IndexScanDesc) arg;
int i;
+ double *da = GISTSearchItemDistanceValues(sa, scan->numberOfOrderBys),
+ *db = GISTSearchItemDistanceValues(sb, scan->numberOfOrderBys);
+ bool *na = GISTSearchItemDistanceNulls(sa, scan->numberOfOrderBys),
+ *nb = GISTSearchItemDistanceNulls(sb, scan->numberOfOrderBys);
/* Order according to distance comparison */
for (i = 0; i < scan->numberOfOrderBys; i++)
{
- int cmp = -float8_cmp_internal(sa->distances[i], sb->distances[i]);
+ if (na[i])
+ {
+ if (!nb[i])
+ return -1;
+ }
+ else if (nb[i])
+ {
+ return 1;
+ }
+ else
+ {
+ int cmp = -float8_cmp_internal(da[i], db[i]);
- if (cmp != 0)
- return cmp;
+ if (cmp != 0)
+ return cmp;
+ }
}
/* Heap items go before inner pages, to ensure a depth-first search */
@@ -84,7 +100,8 @@ gistbeginscan(Relation r, int nkeys, int norderbys)
so->queueCxt = giststate->scanCxt; /* see gistrescan */
/* workspaces with size dependent on numberOfOrderBys: */
- so->distances = palloc(sizeof(double) * scan->numberOfOrderBys);
+ so->distanceValues = palloc(sizeof(double) * scan->numberOfOrderBys);
+ so->distanceNulls = palloc(sizeof(bool) * scan->numberOfOrderBys);
so->qual_ok = true; /* in case there are zero keys */
if (scan->numberOfOrderBys > 0)
{