MySQL 8.0.37
Source Code Documentation
fts0ast.h
Go to the documentation of this file.
1/*****************************************************************************
2
3Copyright (c) 2007, 2024, Oracle and/or its affiliates.
4
5This program is free software; you can redistribute it and/or modify it under
6the terms of the GNU General Public License, version 2.0, as published by the
7Free Software Foundation.
8
9This program is designed to work with certain software (including
10but not limited to OpenSSL) that is licensed under separate terms,
11as designated in a particular file or component or in included license
12documentation. The authors of MySQL hereby grant you an additional
13permission to link the program and your derivative works with the
14separately licensed software that they have either included with
15the program or referenced in the documentation.
16
17This program is distributed in the hope that it will be useful, but WITHOUT
18ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
19FOR A PARTICULAR PURPOSE. See the GNU General Public License, version 2.0,
20for more details.
21
22You should have received a copy of the GNU General Public License along with
23this program; if not, write to the Free Software Foundation, Inc.,
2451 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25
26*****************************************************************************/
27
28/** @file include/fts0ast.h
29 The FTS query parser (AST) abstract syntax tree routines
30
31 Created 2007/03/16/03 Sunny Bains
32 *******************************************************/
33
34#ifndef INNOBASE_FST0AST_H
35#define INNOBASE_FST0AST_H
36
37#include "ha_prototypes.h"
38#include "mem0mem.h"
39
40/* The type of AST Node */
42 FTS_AST_OPER, /*!< Operator */
43 FTS_AST_NUMB, /*!< Number */
44 FTS_AST_TERM, /*!< Term (or word) */
45 FTS_AST_TEXT, /*!< Text string */
46 FTS_AST_PARSER_PHRASE_LIST, /*!< Phase for plugin parser
47 The difference from text type
48 is that we tokenize text into
49 term list */
50 FTS_AST_LIST, /*!< Expression list */
51 FTS_AST_SUBEXP_LIST /*!< Sub-Expression list */
52};
53
54/* The FTS query operators that we support */
56 FTS_NONE, /*!< No operator */
57
58 FTS_IGNORE, /*!< Ignore rows that contain
59 this word */
60
61 FTS_EXIST, /*!< Include rows that contain
62 this word */
63
64 FTS_NEGATE, /*!< Include rows that contain
65 this word but rank them
66 lower*/
67
68 FTS_INCR_RATING, /*!< Increase the rank for this
69 word*/
70
71 FTS_DECR_RATING, /*!< Decrease the rank for this
72 word*/
73
74 FTS_DISTANCE, /*!< Proximity distance */
75 FTS_IGNORE_SKIP, /*!< Transient node operator
76 signifies that this is a
77 FTS_IGNORE node, and ignored in
78 the first pass of
79 fts_ast_visit() */
80 FTS_EXIST_SKIP /*!< Transient node operator
81 signifies that this ia a
82 FTS_EXIST node, and ignored in
83 the first pass of
84 fts_ast_visit() */
85};
86
87/* Data types used by the FTS parser */
88struct fts_lexer_t;
89struct fts_ast_node_t;
90struct fts_ast_state_t;
91struct fts_ast_string_t;
92
94
95/********************************************************************
96Parse the string using the lexer setup within state.*/
97int fts_parse(
98 /* out: 0 on OK, 1 on error */
99 fts_ast_state_t *state); /*!< in: ast state instance.*/
100
101/********************************************************************
102Create an AST operator node */
104 void *arg, /*!< in: ast state */
105 fts_ast_oper_t oper); /*!< in: ast operator */
106/********************************************************************
107Create an AST term node, makes a copy of ptr */
109 void *arg, /*!< in: ast state */
110 const fts_ast_string_t *ptr); /*!< in: term string */
111/********************************************************************
112Create an AST text node */
114 void *arg, /*!< in: ast state */
115 const fts_ast_string_t *ptr); /*!< in: text string */
116/********************************************************************
117Create an AST expr list node */
119 void *arg, /*!< in: ast state */
120 fts_ast_node_t *expr); /*!< in: ast expr */
121/********************************************************************
122Create a sub-expression list node. This function takes ownership of
123expr and is responsible for deleting it. */
125 /* out: new node */
126 void *arg, /*!< in: ast state instance */
127 fts_ast_node_t *expr); /*!< in: ast expr instance */
128/********************************************************************
129Set the wildcard attribute of a term.*/
130extern void fts_ast_term_set_wildcard(
131 fts_ast_node_t *node); /*!< in: term to change */
132/********************************************************************
133Set the proximity attribute of a text node. */
134void fts_ast_text_set_distance(fts_ast_node_t *node, /*!< in/out: text node */
135 ulint distance); /*!< in: the text proximity
136 distance */
137/** Free a fts_ast_node_t instance.
138 @return next node to free */
140 fts_ast_node_t *node); /*!< in: node to free */
141/********************************************************************
142Add a sub-expression to an AST*/
144 fts_ast_node_t *list, /*!< in: list node instance */
145 fts_ast_node_t *node); /*!< in: (sub) expr to add */
146/********************************************************************
147Print the AST node recursively.*/
148extern void fts_ast_node_print(
149 fts_ast_node_t *node); /*!< in: ast node to print */
150/********************************************************************
151Free node and expr allocations.*/
152extern void fts_ast_state_free(fts_ast_state_t *state); /*!< in: state instance
153 to free */
154/** Check only union operation involved in the node
155@param[in] node ast node to check
156@return true if the node contains only union else false. */
158
159/** Traverse the AST - in-order traversal.
160 @return DB_SUCCESS if all went well */
161[[nodiscard]] dberr_t fts_ast_visit(
162 fts_ast_oper_t oper, /*!< in: FTS operator */
163 fts_ast_node_t *node, /*!< in: instance to traverse*/
164 fts_ast_callback visitor, /*!< in: callback */
165 void *arg, /*!< in: callback arg */
166 bool *has_ignore); /*!< out: whether we encounter
167 and ignored processing an
168 operator, currently we only
169 ignore FTS_IGNORE operator */
170/********************************************************************
171Create a lex instance.*/
172[[nodiscard]] fts_lexer_t *fts_lexer_create(
173 bool boolean_mode, /*!< in: query type */
174 const byte *query, /*!< in: query string */
175 ulint query_len) /*!< in: query string len */
176 MY_ATTRIBUTE((malloc));
177/********************************************************************
178Free an fts_lexer_t instance.*/
179void fts_lexer_free(fts_lexer_t *fts_lexer); /*!< in: lexer instance to
180 free */
181
182/**
183Create an ast string object, with NUL-terminator, so the string
184has one more byte than len
185@param[in] str pointer to string
186@param[in] len length of the string
187@return ast string with NUL-terminator */
189
190/**
191Free an ast string instance
192@param[in,out] ast_str string to free */
194
195/**
196Translate ast string of type FTS_AST_NUMB to unsigned long by strtoul
197@param[in] ast_str string to translate
198@param[in] base the base
199@return translated number */
200ulint fts_ast_string_to_ul(const fts_ast_string_t *ast_str, int base);
201
202/* String of length len.
203We always store the string of length len with a terminating '\0',
204regardless of there is any 0x00 in the string itself */
206 /*!< Pointer to string. */
207 byte *str;
208
209 /*!< Length of the string. */
211};
212
213/* Query term type */
215 fts_ast_string_t *ptr; /*!< Pointer to term string.*/
216 bool wildcard; /*!< true if wild card set.*/
217};
218
219/* Query text type */
221 fts_ast_string_t *ptr; /*!< Pointer to text string.*/
222 ulint distance; /*!< > 0 if proximity distance
223 set */
224};
225
226/* The list of nodes in an expr list */
228 fts_ast_node_t *head; /*!< Children list head */
229 fts_ast_node_t *tail; /*!< Children list tail */
230};
231
232/* FTS AST node to store the term, text, operator and sub-expressions.*/
234 fts_ast_type_t type; /*!< The type of node */
235 fts_ast_text_t text; /*!< Text node */
236 fts_ast_term_t term; /*!< Term node */
237 fts_ast_oper_t oper; /*!< Operator value */
238 fts_ast_list_t list; /*!< Expression list */
239 fts_ast_node_t *next; /*!< Link for expr list */
240 fts_ast_node_t *next_alloc; /*!< For tracking allocations */
241 bool visited; /*!< whether this node is
242 already processed */
244 /* Used by plugin parser */
245 fts_ast_node_t *up_node; /*!< Direct up node */
246 bool go_up; /*!< Flag if go one level up */
247};
248
249/* To track state during parsing */
251 mem_heap_t *heap; /*!< Heap to use for alloc */
252 fts_ast_node_t *root; /*!< If all goes OK, then this
253 will point to the root.*/
254
255 fts_ast_list_t list; /*!< List of nodes allocated */
256
257 fts_lexer_t *lexer; /*!< Lexer callback + arg */
258 CHARSET_INFO *charset; /*!< charset used for
259 tokenization */
260 /* Used by plugin parser */
261 fts_ast_node_t *cur_node; /*!< Current node into which
262 we add new node */
263 int depth; /*!< Depth of parsing state */
264};
265
266/** Create an AST term node, makes a copy of ptr for plugin parser
267 @return node */
269 /*==========i=====================*/
270 void *arg, /*!< in: ast state */
271 const char *ptr, /*!< in: term string */
272 const ulint len); /*!< in: term string length */
273
274/** Create an AST phrase list node for plugin parser
275 @return node */
277 void *arg); /*!< in: ast state */
278
279#ifdef UNIV_DEBUG
281#endif /* UNIV_DEBUG */
282
283#endif /* INNOBASE_FSTS0AST_H */
dberr_t
Definition: db0err.h:39
fts_ast_oper_t
Definition: fts0ast.h:55
@ FTS_IGNORE_SKIP
Transient node operator signifies that this is a FTS_IGNORE node, and ignored in the first pass of ft...
Definition: fts0ast.h:75
@ FTS_EXIST_SKIP
Transient node operator signifies that this ia a FTS_EXIST node, and ignored in the first pass of fts...
Definition: fts0ast.h:80
@ FTS_DISTANCE
Proximity distance.
Definition: fts0ast.h:74
@ FTS_INCR_RATING
Increase the rank for this word.
Definition: fts0ast.h:68
@ FTS_DECR_RATING
Decrease the rank for this word.
Definition: fts0ast.h:71
@ FTS_EXIST
Include rows that contain this word.
Definition: fts0ast.h:61
@ FTS_NONE
No operator.
Definition: fts0ast.h:56
@ FTS_IGNORE
Ignore rows that contain this word.
Definition: fts0ast.h:58
@ FTS_NEGATE
Include rows that contain this word but rank them lower.
Definition: fts0ast.h:64
void fts_ast_string_free(fts_ast_string_t *ast_str)
Free an ast string instance.
Definition: fts0ast.cc:677
fts_lexer_t * fts_lexer_create(bool boolean_mode, const byte *query, ulint query_len)
Definition: fts0pars.cc:1923
void fts_ast_text_set_distance(fts_ast_node_t *node, ulint distance)
in: the text proximity distance
Definition: fts0ast.cc:382
fts_ast_node_t * fts_ast_add_node(fts_ast_node_t *list, fts_ast_node_t *node)
in: (sub) expr to add
Definition: fts0ast.cc:335
void fts_lexer_free(fts_lexer_t *fts_lexer)
in: lexer instance to free
Definition: fts0pars.cc:1953
bool fts_ast_node_check_union(fts_ast_node_t *node)
Check only union operation involved in the node.
Definition: fts0ast.cc:493
fts_ast_node_t * fts_ast_create_node_term_for_parser(void *arg, const char *ptr, const ulint len)
Create an AST term node, makes a copy of ptr for plugin parser.
Definition: fts0ast.cc:162
fts_ast_node_t * fts_ast_create_node_subexp_list(void *arg, fts_ast_node_t *expr)
in: ast expr instance
Definition: fts0ast.cc:262
const char * fts_ast_node_type_get(fts_ast_type_t type)
Definition: fts0ast.cc:694
dberr_t(* fts_ast_callback)(fts_ast_oper_t, fts_ast_node_t *, void *)
Definition: fts0ast.h:93
int fts_parse(fts_ast_state_t *state)
in: ast state instance.
Definition: fts0pars.cc:1984
fts_ast_node_t * fts_ast_free_node(fts_ast_node_t *node)
Free a fts_ast_node_t instance.
Definition: fts0ast.cc:290
ulint fts_ast_string_to_ul(const fts_ast_string_t *ast_str, int base)
Translate ast string of type FTS_AST_NUMB to unsigned long by strtoul.
Definition: fts0ast.cc:689
fts_ast_node_t * fts_ast_create_node_phrase_list(void *arg)
Create an AST phrase list node for plugin parser.
Definition: fts0ast.cc:228
fts_ast_node_t * fts_ast_create_node_list(void *arg, fts_ast_node_t *expr)
in: ast expr
Definition: fts0ast.cc:245
fts_ast_string_t * fts_ast_string_create(const byte *str, ulint len)
Create an ast string object, with NUL-terminator, so the string has one more byte than len.
Definition: fts0ast.cc:656
fts_ast_node_t * fts_ast_create_node_term(void *arg, const fts_ast_string_t *ptr)
in: term string
Definition: fts0ast.cc:98
fts_ast_type_t
Definition: fts0ast.h:41
@ FTS_AST_NUMB
Number.
Definition: fts0ast.h:43
@ FTS_AST_TERM
Term (or word)
Definition: fts0ast.h:44
@ FTS_AST_PARSER_PHRASE_LIST
Phase for plugin parser The difference from text type is that we tokenize text into term list.
Definition: fts0ast.h:46
@ FTS_AST_OPER
Operator.
Definition: fts0ast.h:42
@ FTS_AST_SUBEXP_LIST
Sub-Expression list.
Definition: fts0ast.h:51
@ FTS_AST_TEXT
Text string.
Definition: fts0ast.h:45
@ FTS_AST_LIST
Expression list.
Definition: fts0ast.h:50
void fts_ast_state_free(fts_ast_state_t *state)
in: state instance to free
Definition: fts0ast.cc:397
dberr_t fts_ast_visit(fts_ast_oper_t oper, fts_ast_node_t *node, fts_ast_callback visitor, void *arg, bool *has_ignore)
Traverse the AST - in-order traversal.
Definition: fts0ast.cc:520
void fts_ast_term_set_wildcard(fts_ast_node_t *node)
in: term to change
Definition: fts0ast.cc:362
fts_ast_node_t * fts_ast_create_node_oper(void *arg, fts_ast_oper_t oper)
in: ast operator
Definition: fts0ast.cc:81
fts_ast_node_t * fts_ast_create_node_text(void *arg, const fts_ast_string_t *ptr)
in: text string
Definition: fts0ast.cc:191
void fts_ast_node_print(fts_ast_node_t *node)
in: ast node to print
Definition: fts0ast.cc:485
int fts_lexer(YYSTYPE *, fts_lexer_t *)
Definition: fts0pars.cc:1969
Prototypes for global functions in ha_innodb.cc that are called by InnoDB C code.
#define malloc(A)
Definition: lexyy.cc:914
The memory management.
static char * query
Definition: myisam_ftdump.cc:45
std::string str(const mysqlrouter::ConfigGenerator::Options::Endpoint &ep)
Definition: config_generator.cc:1044
bool distance(const dd::Spatial_reference_system *srs, const Geometry *g1, const Geometry *g2, double *distance, bool *is_null) noexcept
Computes the distance between two geometries.
Definition: distance.cc:40
std::list< T, ut::allocator< T > > list
Specialization of list which uses ut_allocator.
Definition: ut0new.h:2878
required string type
Definition: replication_group_member_actions.proto:34
Definition: m_ctype.h:385
Definition: fts0ast.h:227
fts_ast_node_t * tail
Children list tail.
Definition: fts0ast.h:229
fts_ast_node_t * head
Children list head.
Definition: fts0ast.h:228
Definition: fts0ast.h:233
fts_ast_oper_t oper
Operator value.
Definition: fts0ast.h:237
fts_ast_type_t type
The type of node.
Definition: fts0ast.h:234
fts_ast_node_t * next
Link for expr list.
Definition: fts0ast.h:239
bool visited
whether this node is already processed
Definition: fts0ast.h:241
bool go_up
Flag if go one level up.
Definition: fts0ast.h:246
fts_ast_list_t list
Expression list.
Definition: fts0ast.h:238
fts_ast_term_t term
Term node.
Definition: fts0ast.h:236
fts_ast_text_t text
Text node.
Definition: fts0ast.h:235
fts_ast_node_t * up_node
Direct up node.
Definition: fts0ast.h:245
fts_ast_node_t * next_alloc
For tracking allocations.
Definition: fts0ast.h:240
trx_t * trx
Definition: fts0ast.h:243
Definition: fts0ast.h:250
fts_ast_list_t list
List of nodes allocated.
Definition: fts0ast.h:255
fts_ast_node_t * root
If all goes OK, then this will point to the root.
Definition: fts0ast.h:252
fts_ast_node_t * cur_node
Current node into which we add new node.
Definition: fts0ast.h:261
int depth
Depth of parsing state.
Definition: fts0ast.h:263
CHARSET_INFO * charset
charset used for tokenization
Definition: fts0ast.h:258
mem_heap_t * heap
Heap to use for alloc.
Definition: fts0ast.h:251
fts_lexer_t * lexer
Lexer callback + arg.
Definition: fts0ast.h:257
Definition: fts0ast.h:205
byte * str
< Pointer to string.
Definition: fts0ast.h:207
ulint len
Definition: fts0ast.h:210
Definition: fts0ast.h:214
bool wildcard
true if wild card set.
Definition: fts0ast.h:216
fts_ast_string_t * ptr
Pointer to term string.
Definition: fts0ast.h:215
Definition: fts0ast.h:220
fts_ast_string_t * ptr
Pointer to text string.
Definition: fts0ast.h:221
ulint distance
> 0 if proximity distance set
Definition: fts0ast.h:222
Definition: fts0pars.cc:109
The info structure stored at the beginning of a heap block.
Definition: mem0mem.h:302
Definition: trx0trx.h:684
unsigned long int ulint
Definition: univ.i:406