forked from oceanbase/oceanbase
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathparse_node.h
More file actions
354 lines (311 loc) · 9.74 KB
/
parse_node.h
File metadata and controls
354 lines (311 loc) · 9.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
/**
* Copyright (c) 2021 OceanBase
* OceanBase CE is licensed under Mulan PubL v2.
* You can use this software according to the terms and conditions of the Mulan PubL v2.
* You may obtain a copy of Mulan PubL v2 at:
* http://license.coscl.org.cn/MulanPubL-2.0
* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
* See the Mulan PubL v2 for more details.
*/
#ifndef OCEANBASE_SQL_PARSER_PARSE_NODE_H_
#define OCEANBASE_SQL_PARSER_PARSE_NODE_H_
#include <assert.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>
#include <stdint.h>
#include <stdbool.h>
#include <setjmp.h>
#ifdef SQL_PARSER_COMPILATION
#include "ob_sql_mode.h"
#include "ob_item_type.h"
#else
#include "common/sql_mode/ob_sql_mode.h"
#include "sql/parser/ob_item_type.h"
#endif
#ifdef __cplusplus
extern "C" {
#endif
#define MAX_ERROR_MSG 1024
struct ObCharsetInfo;
enum SelectParserOffset {
PARSE_SELECT_WITH,
PARSE_SELECT_DISTINCT,
PARSE_SELECT_SELECT,
PARSE_SELECT_INTO, // into before from
PARSE_SELECT_FROM,
PARSE_SELECT_WHERE,
PARSE_SELECT_DYNAMIC_SW_CBY, // connect by node or start with node
PARSE_SELECT_DYNAMIC_CBY_SW, // connect by node or start with node
PARSE_SELECT_GROUP,
PARSE_SELECT_HAVING,
PARSE_SELECT_SET,
PARSE_SELECT_ALL,
PARSE_SELECT_FORMER,
PARSE_SELECT_LATER,
PARSE_SELECT_ORDER,
PARSE_SELECT_LIMIT,
PARSE_SELECT_FOR_UPD,
PARSE_SELECT_HINTS,
PARSE_SELECT_WHEN,
PARSE_SELECT_NAMED_WINDOWS,
PARSE_SELECT_FETCH,
PARSE_SELECT_FETCH_TEMP, // use to temporary store fetch clause in parser
PARSE_SELECT_INTO_EXTRA, // ATTENTION!! SELECT_INTO_EXTRA must be the last one
PARSE_SELECT_MAX_IDX
};
enum GrantParseOffset {
PARSE_GRANT_ROLE_LIST,
PARSE_GRANT_ROLE_GRANTEE,
PARSE_GRANT_ROLE_OPT_WITH,
PARSE_GRANT_ROLE_MAX_IDX
};
enum GrantParseSysOffset {
PARSE_GRANT_SYS_PRIV_ORACLE_LIST,
PARSE_GRANT_SYS_PRIV_ORACLE_GRANTEE,
PARSE_GRANT_SYS_PRIV_ORACLE_OPT_WITH,
PARSE_GRANT_SYS_PRIV_ORACLE_MAX_IDX
};
enum ParseMode {
STD_MODE = 0,
FP_MODE, /* fast parse, keep hint, and do parameterization*/
MULTI_MODE, /* multi query ultra-fast parse */
FP_PARAMERIZE_AND_FILTER_HINT_MODE, /*Filter out the hint and do parameterization*/
FP_NO_PARAMERIZE_AND_FILTER_HINT_MODE, /*Filter out hints and do not parameterize*/
TRIGGER_MODE, /* treat ':xxx' as identifier */
DYNAMIC_SQL_MODE, /*In the process of parsing dynamic sql: iidx and:identifier should be determined
according to the statement type whether to check the name of the placeholder*/
DBMS_SQL_MODE,
};
typedef struct {
int err_code_;
char err_msg_[MAX_ERROR_MSG];
} ErrStat;
struct _ParseNode;
typedef struct _ObStmtLoc {
int first_column_;
int last_column_;
int first_line_;
int last_line_;
} ObStmtLoc;
typedef struct _ParseNode {
ObItemType type_;
int32_t num_child_;
int16_t param_num_;
struct {
uint16_t is_neg_ : 1;
uint16_t is_hidden_const_ : 1;
uint16_t is_tree_not_param_ : 1;
uint16_t length_semantics_ : 2;
uint16_t is_change_to_char_ : 1;
uint16_t is_val_paramed_item_idx_ : 1;
uint16_t is_copy_raw_text_ : 1;
uint16_t is_column_varchar_ : 1;
uint16_t is_trans_from_minus_ : 1;
uint16_t is_assigned_from_child_ : 1;
uint16_t is_num_must_be_pos_ : 1;
uint16_t is_date_unit_ : 1;
uint16_t reserved_ : 3;
};
union {
int64_t value_;
int32_t int32_values_[2];
int16_t int16_values_[4];
};
const char* str_value_;
int64_t str_len_;
const char* raw_text_;
int64_t text_len_;
int64_t pos_;
struct _ParseNode** children_; /* attributes for non-terninal node, which has children */
ObStmtLoc stmt_loc_;
union {
int64_t raw_param_idx_;
int64_t raw_sql_offset_;
};
#ifdef SQL_PARSER_COMPILATION
int token_off_;
int token_len_;
#endif
} ParseNode;
struct _ParamList;
typedef struct _ParamList {
ParseNode* node_;
struct _ParamList* next_;
} ParamList;
enum RefType {
REF_REL = 0,
REF_PROC,
REF_FUNC,
};
typedef struct _RefObjList {
enum RefType type_;
ParseNode* node_;
struct _RefObjList* next_;
} RefObjList;
typedef struct _PLParseInfo {
bool is_pl_parse_;
bool is_pl_parse_expr_;
/*for mysql pl*/
void* pl_ns_; // ObPLBlockNS
int last_pl_symbol_pos_;
RefObjList* ref_object_nodes_;
RefObjList* tail_ref_object_node_;
} PLParseInfo;
#define MAX_QUESTION_MARK 128
typedef struct _ObQuestionMarkCtx {
char* name_[MAX_QUESTION_MARK];
int count_;
bool by_ordinal_;
bool by_name_;
} ObQuestionMarkCtx;
// record the minus status while parsing the sql
// for example, 'select - -1 from dual'
// when parser sees the first '-', pos_ = 7, raw_sql_offset = 7, has_minus_ = true, is_cur_numeric_ = false
// after seeing the second '-', members are reseted, pos_ = 9, raw_sql_offset_ = 9, has_minus_ = true, is_cur_numberic
// = false after seeing '1', is_cur_numeric = true, then param node '-1' is returned
typedef struct _ObMinusStatuCtx {
int pos_;
int raw_sql_offset_;
bool has_minus_;
bool is_cur_numeric_;
} ObMinusStatusCtx;
#ifdef SQL_PARSER_COMPILATION
// for comment_list_ in ParseResult
typedef struct TokenPosInfo {
int token_off_;
int token_len_;
} TokenPosInfo;
#endif
typedef struct {
void* yyscan_info_;
ParseNode* result_tree_;
jmp_buf jmp_buf_; // handle fatal error
const char* input_sql_;
int input_sql_len_;
void* malloc_pool_; // ObIAllocator
int extra_errno_;
char error_msg_[MAX_ERROR_MSG];
int start_col_;
int end_col_;
int line_;
int yycolumn_;
int yylineno_;
char* tmp_literal_;
ObQuestionMarkCtx question_mark_ctx_;
ObSQLMode sql_mode_;
bool has_encount_comment_;
/*for faster parser*/
bool is_fp_;
/* for multi query fast parse (split queries) */
bool is_multi_query_;
char* no_param_sql_;
int no_param_sql_len_;
int no_param_sql_buf_len_;
ParamList* param_nodes_;
ParamList* tail_param_node_;
int param_node_num_;
int token_num_;
bool is_ignore_hint_; // used for outline
bool is_ignore_token_; // used for outline
bool need_parameterize_; // used for outline, to support signature of outline can contain hint
/*for pl*/
PLParseInfo pl_parse_info_;
/*for q-quote*/
bool in_q_quote_;
ObMinusStatusCtx minus_ctx_; // for fast parser to parse negative value
bool is_for_trigger_;
bool is_dynamic_sql_;
bool is_dbms_sql_;
bool is_batched_multi_enabled_split_;
bool is_not_utf8_connection_;
const struct ObCharsetInfo* charset_info_;
int last_well_formed_len_;
bool may_bool_value_; // used for true/false in sql parser
#ifdef SQL_PARSER_COMPILATION
TokenPosInfo* comment_list_;
int comment_cnt_;
int comment_cap_;
int realloc_cnt_;
bool stop_add_comment_;
#endif
} ParseResult;
typedef struct _ObFastParseCtx {
bool is_fp_;
} ObFastParseCtx;
typedef enum ObSizeUnitType {
SIZE_UNIT_TYPE_INVALID = -1,
SIZE_UNIT_TYPE_K,
SIZE_UNIT_TYPE_M,
SIZE_UNIT_TYPE_G,
SIZE_UNIT_TYPE_T,
SIZE_UNIT_TYPE_P,
SIZE_UNIT_TYPE_E,
SIZE_UNIT_TYPE_MAX
} ObSizeUnitType;
extern int parse_init(ParseResult* p);
extern int parse_reset(ParseResult* p);
extern int parse_terminate(ParseResult* p);
extern int parse_sql(ParseResult* p, const char* pszSql, size_t iLen);
extern void destroy_tree(ParseNode* pRoot);
extern unsigned char escaped_char(unsigned char c, int* with_back_slash);
extern char* str_tolower(char* buff, int64_t len);
extern char* str_toupper(char* buff, int64_t len);
extern int64_t str_remove_space(char* buff, int64_t len);
// extern int64_t ob_parse_string(const char *src, char *dest, int64_t len, int quote_type);
extern ParseNode* new_node(void* malloc_pool, ObItemType type, int num);
extern ParseNode* new_non_terminal_node(void* malloc_pool, ObItemType node_tag, int num, ...);
extern ParseNode* new_terminal_node(void* malloc_pool, ObItemType type);
/// convert x'42ab' to binary string
void ob_parse_binary(const char* src, int64_t len, char* dest);
int64_t ob_parse_binary_len(int64_t len);
// convert b'10010110' to binary string
// @pre dest buffer is enough
void ob_parse_bit_string(const char* src, int64_t len, char* dest);
int64_t ob_parse_bit_string_len(int64_t len);
// calculate hash value of syntax tree recursively
// @param [in] node syntax tree root
// @return hash value of syntax tree
extern uint64_t parsenode_hash(const ParseNode* node);
// compare syntax tree recursively
// @param [in] node1 first syntax tree
// @param [in] node2 second syntax tree
extern bool parsenode_equal(const ParseNode* node1, const ParseNode* node2);
extern int64_t get_question_mark(ObQuestionMarkCtx* ctx, void* malloc_pool, const char* name);
// compare ParseNode str_value_ to pattern
// @param [in] node ParseNode
// @param [in] pattern pattern_str
// @param [in] pat_len length of pattern
extern bool nodename_equal(const ParseNode* node, const char* pattern, int64_t pat_len);
#define OB_NODE_CAST_TYPE_IDX 0
#define OB_NODE_CAST_COLL_IDX 1
#define OB_NODE_CAST_N_PREC_IDX 2
#define OB_NODE_CAST_N_SCALE_IDX 3
#define OB_NODE_CAST_NUMBER_TYPE_IDX 1
#define OB_NODE_CAST_C_LEN_IDX 1
typedef enum ObNumberParseType {
NPT_PERC_SCALE = 0,
NPT_STAR_SCALE,
NPT_STAR,
NPT_PERC,
NPT_EMPTY,
} ObNumberParseType;
#ifndef SQL_PARSER_COMPILATION
bool check_stack_overflow_c();
#endif
typedef struct _ParserLinkNode {
struct _ParserLinkNode* next_;
struct _ParserLinkNode* prev_;
void* val_;
} ParserLinkNode;
ParserLinkNode* new_link_node(void* malloc);
typedef enum ObTranslateCharset {
TRANSLATE_CHAR_CS = 0,
TRANSLATE_NCHAR_CS = 1,
} ObTranslateCharset;
#ifdef __cplusplus
}
#endif
#endif // OCEANBASE_SQL_PARSER_PARSE_NODE_H_