diff options
Diffstat (limited to 'src/include')
-rw-r--r-- | src/include/access/genam.h | 10 | ||||
-rw-r--r-- | src/include/access/gist_private.h | 27 | ||||
-rw-r--r-- | src/include/access/spgist_private.h | 8 |
3 files changed, 21 insertions, 24 deletions
diff --git a/src/include/access/genam.h b/src/include/access/genam.h index 6c56717ba77..a813b004be7 100644 --- a/src/include/access/genam.h +++ b/src/include/access/genam.h @@ -118,6 +118,13 @@ typedef enum IndexUniqueCheck } IndexUniqueCheck; +/* Nullable "ORDER BY col op const" distance */ +typedef struct IndexOrderByDistance +{ + double value; + bool isnull; +} IndexOrderByDistance; + /* * generalized index_ interface routines (in indexam.c) */ @@ -179,8 +186,7 @@ extern FmgrInfo *index_getprocinfo(Relation irel, AttrNumber attnum, uint16 procnum); extern void index_store_float8_orderby_distances(IndexScanDesc scan, Oid *orderByTypes, - double *distanceValues, - bool *distanceNulls, + IndexOrderByDistance *distances, bool recheckOrderBy); /* diff --git a/src/include/access/gist_private.h b/src/include/access/gist_private.h index ed5b643885d..ab134c1a394 100644 --- a/src/include/access/gist_private.h +++ b/src/include/access/gist_private.h @@ -138,29 +138,15 @@ typedef struct GISTSearchItem GISTSearchHeapItem heap; /* heap info, if heap tuple */ } data; - /* - * This data structure is followed by arrays of distance values and - * distance null flags. Size of both arrays is - * IndexScanDesc->numberOfOrderBys. See macros below for accessing those - * arrays. - */ + /* numberOfOrderBys entries */ + IndexOrderByDistance distances[FLEXIBLE_ARRAY_MEMBER]; } GISTSearchItem; #define GISTSearchItemIsHeap(item) ((item).blkno == InvalidBlockNumber) -#define SizeOfGISTSearchItem(n_distances) (DOUBLEALIGN(sizeof(GISTSearchItem)) + \ - (sizeof(double) + sizeof(bool)) * (n_distances)) - -/* - * We actually don't need n_distances compute pointer to distance values. - * Nevertheless take n_distances as argument to have same arguments list for - * GISTSearchItemDistanceValues() and GISTSearchItemDistanceNulls(). - */ -#define GISTSearchItemDistanceValues(item, n_distances) \ - ((double *) ((Pointer) (item) + DOUBLEALIGN(sizeof(GISTSearchItem)))) - -#define GISTSearchItemDistanceNulls(item, n_distances) \ - ((bool *) ((Pointer) (item) + DOUBLEALIGN(sizeof(GISTSearchItem)) + sizeof(double) * (n_distances))) +#define SizeOfGISTSearchItem(n_distances) \ + (offsetof(GISTSearchItem, distances) + \ + sizeof(IndexOrderByDistance) * (n_distances)) /* * GISTScanOpaqueData: private state for a scan of a GiST index @@ -176,8 +162,7 @@ typedef struct GISTScanOpaqueData bool firstCall; /* true until first gistgettuple call */ /* pre-allocated workspace arrays */ - double *distanceValues; /* output area for gistindex_keytest */ - bool *distanceNulls; + IndexOrderByDistance *distances; /* output area for gistindex_keytest */ /* info about killed items if any (killedItems is NULL if never used) */ OffsetNumber *killedItems; /* offset numbers of killed items */ diff --git a/src/include/access/spgist_private.h b/src/include/access/spgist_private.h index e0d1178f245..428e54bfbd2 100644 --- a/src/include/access/spgist_private.h +++ b/src/include/access/spgist_private.h @@ -169,8 +169,12 @@ typedef struct SpGistScanOpaqueData int numberOfKeys; /* number of index qualifier conditions */ ScanKey keyData; /* array of index qualifier descriptors */ int numberOfOrderBys; /* number of ordering operators */ + int numberOfNonNullOrderBys; /* number of ordering operators + * with non-NULL arguments */ ScanKey orderByData; /* array of ordering op descriptors */ Oid *orderByTypes; /* array of ordering op return types */ + int *nonNullOrderByOffsets; /* array of offset of non-NULL + * ordering keys in the original array */ Oid indexCollation; /* collation of index column */ /* Opclass defined functions: */ @@ -195,7 +199,9 @@ typedef struct SpGistScanOpaqueData bool recheckDistances[MaxIndexTuplesPerPage]; /* distance recheck * flags */ HeapTuple reconTups[MaxIndexTuplesPerPage]; /* reconstructed tuples */ - double *distances[MaxIndexTuplesPerPage]; /* distances (for recheck) */ + + /* distances (for recheck) */ + IndexOrderByDistance *distances[MaxIndexTuplesPerPage]; /* * Note: using MaxIndexTuplesPerPage above is a bit hokey since |