1 /*-------------------------------------------------------------------------
3 * Portions Copyright (c) 2017-2020, pg_bigm Development Group
4 * Portions Copyright (c) 2013-2016, NTT DATA Corporation
5 * Portions Copyright (c) 2004-2012, PostgreSQL Global Development Group
9 * Support full text search using bigrams.
10 * Author: NTT DATA Corporation
12 *-------------------------------------------------------------------------
17 #include "access/itup.h"
18 #include "storage/bufpage.h"
19 #include "utils/builtins.h"
22 extern bool bigm_enable_recheck;
23 extern int bigm_gin_key_limit;
24 extern double bigm_similarity_limit;
25 extern char *bigm_last_update;
31 /* operator strategy numbers */
32 #define LikeStrategyNumber 1
33 #define SimilarityStrategyNumber 2
37 bool pmatch; /* partial match is required? */
38 int8 bytelen; /* byte length of bi-gram string */
41 * Bi-gram string; we assume here that the maximum bytes for a character
47 #define BIGMSIZE sizeof(bigm)
50 bigmstrcmp(char *arg1, int len1, char *arg2, int len2)
53 int len = Min(len1, len2);
55 for (i = 0; i < len; i++, arg1++, arg2++)
65 return (len1 == len2) ? 0 : ((len1 < len2) ? -1 : 1);
68 #define CMPBIGM(a,b) ( bigmstrcmp(((bigm *)a)->str, ((bigm *)a)->bytelen, ((bigm *)b)->str, ((bigm *)b)->bytelen) )
70 #define CPBIGM(bptr, s, len) do { \
72 memcpy(bptr->str, s, len); \
73 bptr->bytelen = len; \
74 bptr->pmatch = false; \
77 #define ISESCAPECHAR(x) (*(x) == '\\') /* Wildcard escape character */
78 #define ISWILDCARDCHAR(x) (*(x) == '%' || *(x) == '_') /* Wildcard
82 int32 vl_len_; /* varlena header (do not touch directly!) */
86 #define CALCGTSIZE(len) (VARHDRSZ + len * sizeof(bigm))
87 #define GETARR(x) ( (bigm *)( (char*)x + VARHDRSZ ) )
88 #define ARRNELEM(x) ( ( VARSIZE(x) - VARHDRSZ )/sizeof(bigm) )
90 extern BIGM *generate_bigm(char *str, int slen);
91 extern BIGM *generate_wildcard_bigm(const char *str, int slen, bool *removeDups);
93 #endif /* __BIGM_H__ */