summaryrefslogtreecommitdiff
path: root/src/backend/access/gin/ginscan.c
diff options
context:
space:
mode:
authorPeter Eisentraut <peter_e@gmx.net>2017-12-26 13:47:18 -0500
committerPeter Eisentraut <peter_e@gmx.net>2018-01-02 12:20:56 -0500
commit438036264a3b71eaf39b2d2eeca67237ed38ca51 (patch)
treec4fe35152c6ab32a3b661b8676b291a32f22304d /src/backend/access/gin/ginscan.c
parent93ea78b17c4743c2b63edb5998fb5796ae57e289 (diff)
downloadpostgresql-438036264a3b71eaf39b2d2eeca67237ed38ca51.tar.gz
Don't cast between GinNullCategory and bool
The original idea was that we could use an isNull-style bool array directly as a GinNullCategory array. However, the existing code already acknowledges that that doesn't really work, because of the possibility that bool as currently defined can have arbitrary bit patterns for true values. So it has to loop through the nullFlags array to set each bool value to an acceptable value. But if we are looping through the whole array anyway, we might as well build a proper GinNullCategory array instead and abandon the type casting. That makes the code much safer in case bool is ever changed to something else. Reviewed-by: Michael Paquier <michael.paquier@gmail.com>
Diffstat (limited to 'src/backend/access/gin/ginscan.c')
-rw-r--r--src/backend/access/gin/ginscan.c19
1 files changed, 8 insertions, 11 deletions
diff --git a/src/backend/access/gin/ginscan.c b/src/backend/access/gin/ginscan.c
index 7ceea7a741..77c0c577b5 100644
--- a/src/backend/access/gin/ginscan.c
+++ b/src/backend/access/gin/ginscan.c
@@ -295,6 +295,7 @@ ginNewScanKey(IndexScanDesc scan)
bool *partial_matches = NULL;
Pointer *extra_data = NULL;
bool *nullFlags = NULL;
+ GinNullCategory *categories;
int32 searchMode = GIN_SEARCH_MODE_DEFAULT;
/*
@@ -346,15 +347,12 @@ ginNewScanKey(IndexScanDesc scan)
}
/*
- * If the extractQueryFn didn't create a nullFlags array, create one,
- * assuming that everything's non-null. Otherwise, run through the
- * array and make sure each value is exactly 0 or 1; this ensures
- * binary compatibility with the GinNullCategory representation. While
- * at it, detect whether any null keys are present.
+ * Create GinNullCategory representation. If the extractQueryFn
+ * didn't create a nullFlags array, we assume everything is non-null.
+ * While at it, detect whether any null keys are present.
*/
- if (nullFlags == NULL)
- nullFlags = (bool *) palloc0(nQueryValues * sizeof(bool));
- else
+ categories = (GinNullCategory *) palloc0(nQueryValues * sizeof(GinNullCategory));
+ if (nullFlags)
{
int32 j;
@@ -362,17 +360,16 @@ ginNewScanKey(IndexScanDesc scan)
{
if (nullFlags[j])
{
- nullFlags[j] = true; /* not any other nonzero value */
+ categories[j] = GIN_CAT_NULL_KEY;
hasNullQuery = true;
}
}
}
- /* now we can use the nullFlags as category codes */
ginFillScanKey(so, skey->sk_attno,
skey->sk_strategy, searchMode,
skey->sk_argument, nQueryValues,
- queryValues, (GinNullCategory *) nullFlags,
+ queryValues, categories,
partial_matches, extra_data);
}