1
by brian
clean slate |
1 |
/******************************************************
|
2 |
SQL parser
|
|
3 |
||
4 |
(c) 1996 Innobase Oy
|
|
5 |
||
6 |
Created 11/19/1996 Heikki Tuuri
|
|
7 |
*******************************************************/
|
|
8 |
||
9 |
#ifndef pars0pars_h
|
|
10 |
#define pars0pars_h
|
|
11 |
||
12 |
#include "univ.i" |
|
13 |
#include "que0types.h" |
|
14 |
#include "usr0types.h" |
|
15 |
#include "pars0types.h" |
|
16 |
#include "row0types.h" |
|
17 |
#include "trx0types.h" |
|
18 |
#include "ut0vec.h" |
|
19 |
||
20 |
/* Type of the user functions. The first argument is always InnoDB-supplied
|
|
21 |
and varies in type, while 'user_arg' is a user-supplied argument. The
|
|
22 |
meaning of the return type also varies. See the individual use cases, e.g.
|
|
23 |
the FETCH statement, for details on them. */
|
|
24 |
typedef void* (*pars_user_func_cb_t)(void* arg, void* user_arg); |
|
25 |
||
26 |
extern int yydebug; |
|
27 |
||
28 |
/* If the following is set TRUE, the lexer will print the SQL string
|
|
29 |
as it tokenizes it */
|
|
30 |
||
31 |
#ifdef UNIV_SQL_DEBUG
|
|
32 |
extern ibool pars_print_lexed; |
|
33 |
#endif /* UNIV_SQL_DEBUG */ |
|
34 |
||
35 |
/* Global variable used while parsing a single procedure or query : the code is
|
|
36 |
NOT re-entrant */
|
|
37 |
extern sym_tab_t* pars_sym_tab_global; |
|
38 |
||
39 |
extern pars_res_word_t pars_to_char_token; |
|
40 |
extern pars_res_word_t pars_to_number_token; |
|
41 |
extern pars_res_word_t pars_to_binary_token; |
|
42 |
extern pars_res_word_t pars_binary_to_number_token; |
|
43 |
extern pars_res_word_t pars_substr_token; |
|
44 |
extern pars_res_word_t pars_replstr_token; |
|
45 |
extern pars_res_word_t pars_concat_token; |
|
46 |
extern pars_res_word_t pars_length_token; |
|
47 |
extern pars_res_word_t pars_instr_token; |
|
48 |
extern pars_res_word_t pars_sysdate_token; |
|
49 |
extern pars_res_word_t pars_printf_token; |
|
50 |
extern pars_res_word_t pars_assert_token; |
|
51 |
extern pars_res_word_t pars_rnd_token; |
|
52 |
extern pars_res_word_t pars_rnd_str_token; |
|
53 |
extern pars_res_word_t pars_count_token; |
|
54 |
extern pars_res_word_t pars_sum_token; |
|
55 |
extern pars_res_word_t pars_distinct_token; |
|
56 |
extern pars_res_word_t pars_binary_token; |
|
57 |
extern pars_res_word_t pars_blob_token; |
|
58 |
extern pars_res_word_t pars_int_token; |
|
59 |
extern pars_res_word_t pars_char_token; |
|
60 |
extern pars_res_word_t pars_float_token; |
|
61 |
extern pars_res_word_t pars_update_token; |
|
62 |
extern pars_res_word_t pars_asc_token; |
|
63 |
extern pars_res_word_t pars_desc_token; |
|
64 |
extern pars_res_word_t pars_open_token; |
|
65 |
extern pars_res_word_t pars_close_token; |
|
66 |
extern pars_res_word_t pars_share_token; |
|
67 |
extern pars_res_word_t pars_unique_token; |
|
68 |
extern pars_res_word_t pars_clustered_token; |
|
69 |
||
70 |
extern ulint pars_star_denoter; |
|
71 |
||
72 |
/* Procedure parameter types */
|
|
73 |
#define PARS_INPUT 0
|
|
74 |
#define PARS_OUTPUT 1
|
|
75 |
#define PARS_NOT_PARAM 2
|
|
76 |
||
77 |
int
|
|
78 |
yyparse(void); |
|
79 |
||
80 |
/*****************************************************************
|
|
81 |
Parses an SQL string returning the query graph. */
|
|
82 |
||
83 |
que_t* |
|
84 |
pars_sql( |
|
85 |
/*=====*/
|
|
86 |
/* out, own: the query graph */
|
|
87 |
pars_info_t* info, /* in: extra information, or NULL */ |
|
88 |
const char* str); /* in: SQL string */ |
|
89 |
/*****************************************************************
|
|
90 |
Retrieves characters to the lexical analyzer. */
|
|
91 |
||
92 |
void
|
|
93 |
pars_get_lex_chars( |
|
94 |
/*===============*/
|
|
95 |
char* buf, /* in/out: buffer where to copy */ |
|
96 |
int* result, /* out: number of characters copied or EOF */ |
|
97 |
int max_size); /* in: maximum number of characters which fit |
|
98 |
in the buffer */
|
|
99 |
/*****************************************************************
|
|
100 |
Called by yyparse on error. */
|
|
101 |
||
102 |
void
|
|
103 |
yyerror( |
|
104 |
/*====*/
|
|
105 |
const char* s); /* in: error message string */ |
|
106 |
/*************************************************************************
|
|
107 |
Parses a variable declaration. */
|
|
108 |
||
109 |
sym_node_t* |
|
110 |
pars_variable_declaration( |
|
111 |
/*======================*/
|
|
112 |
/* out, own: symbol table node of type
|
|
113 |
SYM_VAR */
|
|
114 |
sym_node_t* node, /* in: symbol table node allocated for the |
|
115 |
id of the variable */
|
|
116 |
pars_res_word_t* type); /* in: pointer to a type token */ |
|
117 |
/*************************************************************************
|
|
118 |
Parses a function expression. */
|
|
119 |
||
120 |
func_node_t* |
|
121 |
pars_func( |
|
122 |
/*======*/
|
|
123 |
/* out, own: function node in a query tree */
|
|
124 |
que_node_t* res_word,/* in: function name reserved word */ |
|
125 |
que_node_t* arg); /* in: first argument in the argument list */ |
|
126 |
/*************************************************************************
|
|
127 |
Parses an operator expression. */
|
|
128 |
||
129 |
func_node_t* |
|
130 |
pars_op( |
|
131 |
/*====*/
|
|
132 |
/* out, own: function node in a query tree */
|
|
133 |
int func, /* in: operator token code */ |
|
134 |
que_node_t* arg1, /* in: first argument */ |
|
135 |
que_node_t* arg2); /* in: second argument or NULL for an unary |
|
136 |
operator */
|
|
137 |
/*************************************************************************
|
|
138 |
Parses an ORDER BY clause. Order by a single column only is supported. */
|
|
139 |
||
140 |
order_node_t* |
|
141 |
pars_order_by( |
|
142 |
/*==========*/
|
|
143 |
/* out, own: order-by node in a query tree */
|
|
144 |
sym_node_t* column, /* in: column name */ |
|
145 |
pars_res_word_t* asc); /* in: &pars_asc_token or pars_desc_token */ |
|
146 |
/*************************************************************************
|
|
147 |
Parses a select list; creates a query graph node for the whole SELECT
|
|
148 |
statement. */
|
|
149 |
||
150 |
sel_node_t* |
|
151 |
pars_select_list( |
|
152 |
/*=============*/
|
|
153 |
/* out, own: select node in a query
|
|
154 |
tree */
|
|
155 |
que_node_t* select_list, /* in: select list */ |
|
156 |
sym_node_t* into_list); /* in: variables list or NULL */ |
|
157 |
/*************************************************************************
|
|
158 |
Parses a cursor declaration. */
|
|
159 |
||
160 |
que_node_t* |
|
161 |
pars_cursor_declaration( |
|
162 |
/*====================*/
|
|
163 |
/* out: sym_node */
|
|
164 |
sym_node_t* sym_node, /* in: cursor id node in the symbol |
|
165 |
table */
|
|
166 |
sel_node_t* select_node); /* in: select node */ |
|
167 |
/*************************************************************************
|
|
168 |
Parses a function declaration. */
|
|
169 |
||
170 |
que_node_t* |
|
171 |
pars_function_declaration( |
|
172 |
/*======================*/
|
|
173 |
/* out: sym_node */
|
|
174 |
sym_node_t* sym_node); /* in: function id node in the symbol |
|
175 |
table */
|
|
176 |
/*************************************************************************
|
|
177 |
Parses a select statement. */
|
|
178 |
||
179 |
sel_node_t* |
|
180 |
pars_select_statement( |
|
181 |
/*==================*/
|
|
182 |
/* out, own: select node in a query
|
|
183 |
tree */
|
|
184 |
sel_node_t* select_node, /* in: select node already containing |
|
185 |
the select list */
|
|
186 |
sym_node_t* table_list, /* in: table list */ |
|
187 |
que_node_t* search_cond, /* in: search condition or NULL */ |
|
188 |
pars_res_word_t* for_update, /* in: NULL or &pars_update_token */ |
|
189 |
pars_res_word_t* consistent_read,/* in: NULL or |
|
190 |
&pars_consistent_token */
|
|
191 |
order_node_t* order_by); /* in: NULL or an order-by node */ |
|
192 |
/*************************************************************************
|
|
193 |
Parses a column assignment in an update. */
|
|
194 |
||
195 |
col_assign_node_t* |
|
196 |
pars_column_assignment( |
|
197 |
/*===================*/
|
|
198 |
/* out: column assignment node */
|
|
199 |
sym_node_t* column, /* in: column to assign */ |
|
200 |
que_node_t* exp); /* in: value to assign */ |
|
201 |
/*************************************************************************
|
|
202 |
Parses a delete or update statement start. */
|
|
203 |
||
204 |
upd_node_t* |
|
205 |
pars_update_statement_start( |
|
206 |
/*========================*/
|
|
207 |
/* out, own: update node in a query
|
|
208 |
tree */
|
|
209 |
ibool is_delete, /* in: TRUE if delete */ |
|
210 |
sym_node_t* table_sym, /* in: table name node */ |
|
211 |
col_assign_node_t* col_assign_list);/* in: column assignment list, NULL |
|
212 |
if delete */
|
|
213 |
/*************************************************************************
|
|
214 |
Parses an update or delete statement. */
|
|
215 |
||
216 |
upd_node_t* |
|
217 |
pars_update_statement( |
|
218 |
/*==================*/
|
|
219 |
/* out, own: update node in a query
|
|
220 |
tree */
|
|
221 |
upd_node_t* node, /* in: update node */ |
|
222 |
sym_node_t* cursor_sym, /* in: pointer to a cursor entry in |
|
223 |
the symbol table or NULL */
|
|
224 |
que_node_t* search_cond); /* in: search condition or NULL */ |
|
225 |
/*************************************************************************
|
|
226 |
Parses an insert statement. */
|
|
227 |
||
228 |
ins_node_t* |
|
229 |
pars_insert_statement( |
|
230 |
/*==================*/
|
|
231 |
/* out, own: update node in a query
|
|
232 |
tree */
|
|
233 |
sym_node_t* table_sym, /* in: table name node */ |
|
234 |
que_node_t* values_list, /* in: value expression list or NULL */ |
|
235 |
sel_node_t* select); /* in: select condition or NULL */ |
|
236 |
/*************************************************************************
|
|
237 |
Parses a procedure parameter declaration. */
|
|
238 |
||
239 |
sym_node_t* |
|
240 |
pars_parameter_declaration( |
|
241 |
/*=======================*/
|
|
242 |
/* out, own: symbol table node of type
|
|
243 |
SYM_VAR */
|
|
244 |
sym_node_t* node, /* in: symbol table node allocated for the |
|
245 |
id of the parameter */
|
|
246 |
ulint param_type, |
|
247 |
/* in: PARS_INPUT or PARS_OUTPUT */
|
|
248 |
pars_res_word_t* type); /* in: pointer to a type token */ |
|
249 |
/*************************************************************************
|
|
250 |
Parses an elsif element. */
|
|
251 |
||
252 |
elsif_node_t* |
|
253 |
pars_elsif_element( |
|
254 |
/*===============*/
|
|
255 |
/* out: elsif node */
|
|
256 |
que_node_t* cond, /* in: if-condition */ |
|
257 |
que_node_t* stat_list); /* in: statement list */ |
|
258 |
/*************************************************************************
|
|
259 |
Parses an if-statement. */
|
|
260 |
||
261 |
if_node_t* |
|
262 |
pars_if_statement( |
|
263 |
/*==============*/
|
|
264 |
/* out: if-statement node */
|
|
265 |
que_node_t* cond, /* in: if-condition */ |
|
266 |
que_node_t* stat_list, /* in: statement list */ |
|
267 |
que_node_t* else_part); /* in: else-part statement list */ |
|
268 |
/*************************************************************************
|
|
269 |
Parses a for-loop-statement. */
|
|
270 |
||
271 |
for_node_t* |
|
272 |
pars_for_statement( |
|
273 |
/*===============*/
|
|
274 |
/* out: for-statement node */
|
|
275 |
sym_node_t* loop_var, /* in: loop variable */ |
|
276 |
que_node_t* loop_start_limit,/* in: loop start expression */ |
|
277 |
que_node_t* loop_end_limit, /* in: loop end expression */ |
|
278 |
que_node_t* stat_list); /* in: statement list */ |
|
279 |
/*************************************************************************
|
|
280 |
Parses a while-statement. */
|
|
281 |
||
282 |
while_node_t* |
|
283 |
pars_while_statement( |
|
284 |
/*=================*/
|
|
285 |
/* out: while-statement node */
|
|
286 |
que_node_t* cond, /* in: while-condition */ |
|
287 |
que_node_t* stat_list); /* in: statement list */ |
|
288 |
/*************************************************************************
|
|
289 |
Parses an exit statement. */
|
|
290 |
||
291 |
exit_node_t* |
|
292 |
pars_exit_statement(void); |
|
293 |
/*=====================*/
|
|
294 |
/* out: exit statement node */
|
|
295 |
/*************************************************************************
|
|
296 |
Parses a return-statement. */
|
|
297 |
||
298 |
return_node_t* |
|
299 |
pars_return_statement(void); |
|
300 |
/*=======================*/
|
|
301 |
/* out: return-statement node */
|
|
302 |
/*************************************************************************
|
|
303 |
Parses a procedure call. */
|
|
304 |
||
305 |
func_node_t* |
|
306 |
pars_procedure_call( |
|
307 |
/*================*/
|
|
308 |
/* out: function node */
|
|
309 |
que_node_t* res_word,/* in: procedure name reserved word */ |
|
310 |
que_node_t* args); /* in: argument list */ |
|
311 |
/*************************************************************************
|
|
312 |
Parses an assignment statement. */
|
|
313 |
||
314 |
assign_node_t* |
|
315 |
pars_assignment_statement( |
|
316 |
/*======================*/
|
|
317 |
/* out: assignment statement node */
|
|
318 |
sym_node_t* var, /* in: variable to assign */ |
|
319 |
que_node_t* val); /* in: value to assign */ |
|
320 |
/*************************************************************************
|
|
321 |
Parses a fetch statement. into_list or user_func (but not both) must be
|
|
322 |
non-NULL. */
|
|
323 |
||
324 |
fetch_node_t* |
|
325 |
pars_fetch_statement( |
|
326 |
/*=================*/
|
|
327 |
/* out: fetch statement node */
|
|
328 |
sym_node_t* cursor, /* in: cursor node */ |
|
329 |
sym_node_t* into_list, /* in: variables to set, or NULL */ |
|
330 |
sym_node_t* user_func); /* in: user function name, or NULL */ |
|
331 |
/*************************************************************************
|
|
332 |
Parses an open or close cursor statement. */
|
|
333 |
||
334 |
open_node_t* |
|
335 |
pars_open_statement( |
|
336 |
/*================*/
|
|
337 |
/* out: fetch statement node */
|
|
338 |
ulint type, /* in: ROW_SEL_OPEN_CURSOR |
|
339 |
or ROW_SEL_CLOSE_CURSOR */
|
|
340 |
sym_node_t* cursor); /* in: cursor node */ |
|
341 |
/*************************************************************************
|
|
342 |
Parses a row_printf-statement. */
|
|
343 |
||
344 |
row_printf_node_t* |
|
345 |
pars_row_printf_statement( |
|
346 |
/*======================*/
|
|
347 |
/* out: row_printf-statement node */
|
|
348 |
sel_node_t* sel_node); /* in: select node */ |
|
349 |
/*************************************************************************
|
|
350 |
Parses a commit statement. */
|
|
351 |
||
352 |
commit_node_t* |
|
353 |
pars_commit_statement(void); |
|
354 |
/*=======================*/
|
|
355 |
/*************************************************************************
|
|
356 |
Parses a rollback statement. */
|
|
357 |
||
358 |
roll_node_t* |
|
359 |
pars_rollback_statement(void); |
|
360 |
/*=========================*/
|
|
361 |
/*************************************************************************
|
|
362 |
Parses a column definition at a table creation. */
|
|
363 |
||
364 |
sym_node_t* |
|
365 |
pars_column_def( |
|
366 |
/*============*/
|
|
367 |
/* out: column sym table
|
|
368 |
node */
|
|
369 |
sym_node_t* sym_node, /* in: column node in the |
|
370 |
symbol table */
|
|
371 |
pars_res_word_t* type, /* in: data type */ |
|
372 |
sym_node_t* len, /* in: length of column, or |
|
373 |
NULL */
|
|
374 |
void* is_unsigned, /* in: if not NULL, column |
|
375 |
is of type UNSIGNED. */
|
|
376 |
void* is_not_null); /* in: if not NULL, column |
|
377 |
is of type NOT NULL. */
|
|
378 |
/*************************************************************************
|
|
379 |
Parses a table creation operation. */
|
|
380 |
||
381 |
tab_node_t* |
|
382 |
pars_create_table( |
|
383 |
/*==============*/
|
|
384 |
/* out: table create subgraph */
|
|
385 |
sym_node_t* table_sym, /* in: table name node in the symbol |
|
386 |
table */
|
|
387 |
sym_node_t* column_defs, /* in: list of column names */ |
|
388 |
void* not_fit_in_memory);/* in: a non-NULL pointer means that |
|
389 |
this is a table which in simulations
|
|
390 |
should be simulated as not fitting
|
|
391 |
in memory; thread is put to sleep
|
|
392 |
to simulate disk accesses; NOTE that
|
|
393 |
this flag is not stored to the data
|
|
394 |
dictionary on disk, and the database
|
|
395 |
will forget about non-NULL value if
|
|
396 |
it has to reload the table definition
|
|
397 |
from disk */
|
|
398 |
/*************************************************************************
|
|
399 |
Parses an index creation operation. */
|
|
400 |
||
401 |
ind_node_t* |
|
402 |
pars_create_index( |
|
403 |
/*==============*/
|
|
404 |
/* out: index create subgraph */
|
|
405 |
pars_res_word_t* unique_def, /* in: not NULL if a unique index */ |
|
406 |
pars_res_word_t* clustered_def, /* in: not NULL if a clustered index */ |
|
407 |
sym_node_t* index_sym, /* in: index name node in the symbol |
|
408 |
table */
|
|
409 |
sym_node_t* table_sym, /* in: table name node in the symbol |
|
410 |
table */
|
|
411 |
sym_node_t* column_list); /* in: list of column names */ |
|
412 |
/*************************************************************************
|
|
413 |
Parses a procedure definition. */
|
|
414 |
||
415 |
que_fork_t* |
|
416 |
pars_procedure_definition( |
|
417 |
/*======================*/
|
|
418 |
/* out: query fork node */
|
|
419 |
sym_node_t* sym_node, /* in: procedure id node in the symbol |
|
420 |
table */
|
|
421 |
sym_node_t* param_list, /* in: parameter declaration list */ |
|
422 |
que_node_t* stat_list); /* in: statement list */ |
|
423 |
||
424 |
/*****************************************************************
|
|
425 |
Parses a stored procedure call, when this is not within another stored
|
|
426 |
procedure, that is, the client issues a procedure call directly.
|
|
427 |
In MySQL/InnoDB, stored InnoDB procedures are invoked via the
|
|
428 |
parsed procedure tree, not via InnoDB SQL, so this function is not used. */
|
|
429 |
||
430 |
que_fork_t* |
|
431 |
pars_stored_procedure_call( |
|
432 |
/*=======================*/
|
|
433 |
/* out: query graph */
|
|
434 |
sym_node_t* sym_node); /* in: stored procedure name */ |
|
435 |
/**********************************************************************
|
|
436 |
Completes a query graph by adding query thread and fork nodes
|
|
437 |
above it and prepares the graph for running. The fork created is of
|
|
438 |
type QUE_FORK_MYSQL_INTERFACE. */
|
|
439 |
||
440 |
que_thr_t* |
|
441 |
pars_complete_graph_for_exec( |
|
442 |
/*=========================*/
|
|
443 |
/* out: query thread node to run */
|
|
444 |
que_node_t* node, /* in: root node for an incomplete |
|
445 |
query graph */
|
|
446 |
trx_t* trx, /* in: transaction handle */ |
|
447 |
mem_heap_t* heap); /* in: memory heap from which allocated */ |
|
448 |
||
449 |
/********************************************************************
|
|
450 |
Create parser info struct.*/
|
|
451 |
||
452 |
pars_info_t* |
|
453 |
pars_info_create(void); |
|
454 |
/*==================*/
|
|
455 |
/* out, own: info struct */
|
|
456 |
||
457 |
/********************************************************************
|
|
458 |
Free info struct and everything it contains.*/
|
|
459 |
||
460 |
void
|
|
461 |
pars_info_free( |
|
462 |
/*===========*/
|
|
463 |
pars_info_t* info); /* in: info struct */ |
|
464 |
||
465 |
/********************************************************************
|
|
466 |
Add bound literal. */
|
|
467 |
||
468 |
void
|
|
469 |
pars_info_add_literal( |
|
470 |
/*==================*/
|
|
471 |
pars_info_t* info, /* in: info struct */ |
|
472 |
const char* name, /* in: name */ |
|
473 |
const void* address, /* in: address */ |
|
474 |
ulint length, /* in: length of data */ |
|
475 |
ulint type, /* in: type, e.g. DATA_FIXBINARY */ |
|
476 |
ulint prtype); /* in: precise type, e.g. |
|
477 |
DATA_UNSIGNED */
|
|
478 |
||
479 |
/********************************************************************
|
|
480 |
Equivalent to pars_info_add_literal(info, name, str, strlen(str),
|
|
481 |
DATA_VARCHAR, DATA_ENGLISH). */
|
|
482 |
||
483 |
void
|
|
484 |
pars_info_add_str_literal( |
|
485 |
/*======================*/
|
|
486 |
pars_info_t* info, /* in: info struct */ |
|
487 |
const char* name, /* in: name */ |
|
488 |
const char* str); /* in: string */ |
|
489 |
||
490 |
/********************************************************************
|
|
491 |
Equivalent to:
|
|
492 |
||
493 |
char buf[4];
|
|
494 |
mach_write_to_4(buf, val);
|
|
495 |
pars_info_add_literal(info, name, buf, 4, DATA_INT, 0);
|
|
496 |
||
497 |
except that the buffer is dynamically allocated from the info struct's
|
|
498 |
heap. */
|
|
499 |
||
500 |
void
|
|
501 |
pars_info_add_int4_literal( |
|
502 |
/*=======================*/
|
|
503 |
pars_info_t* info, /* in: info struct */ |
|
504 |
const char* name, /* in: name */ |
|
505 |
lint val); /* in: value */ |
|
506 |
||
507 |
/********************************************************************
|
|
508 |
Equivalent to:
|
|
509 |
||
510 |
char buf[8];
|
|
511 |
mach_write_to_8(buf, val);
|
|
512 |
pars_info_add_literal(info, name, buf, 8, DATA_BINARY, 0);
|
|
513 |
||
514 |
except that the buffer is dynamically allocated from the info struct's
|
|
515 |
heap. */
|
|
516 |
||
517 |
void
|
|
518 |
pars_info_add_dulint_literal( |
|
519 |
/*=========================*/
|
|
520 |
pars_info_t* info, /* in: info struct */ |
|
521 |
const char* name, /* in: name */ |
|
522 |
dulint val); /* in: value */ |
|
523 |
/********************************************************************
|
|
524 |
Add user function. */
|
|
525 |
||
526 |
void
|
|
527 |
pars_info_add_function( |
|
528 |
/*===================*/
|
|
529 |
pars_info_t* info, /* in: info struct */ |
|
530 |
const char* name, /* in: function name */ |
|
531 |
pars_user_func_cb_t func, /* in: function address */ |
|
532 |
void* arg); /* in: user-supplied argument */ |
|
533 |
||
534 |
/********************************************************************
|
|
535 |
Add bound id. */
|
|
536 |
||
537 |
void
|
|
538 |
pars_info_add_id( |
|
539 |
/*=============*/
|
|
540 |
pars_info_t* info, /* in: info struct */ |
|
541 |
const char* name, /* in: name */ |
|
542 |
const char* id); /* in: id */ |
|
543 |
||
544 |
/********************************************************************
|
|
545 |
Get user function with the given name.*/
|
|
546 |
||
547 |
pars_user_func_t* |
|
548 |
pars_info_get_user_func( |
|
549 |
/*====================*/
|
|
550 |
/* out: user func, or NULL if not
|
|
551 |
found */
|
|
552 |
pars_info_t* info, /* in: info struct */ |
|
553 |
const char* name); /* in: function name to find*/ |
|
554 |
||
555 |
/********************************************************************
|
|
556 |
Get bound literal with the given name.*/
|
|
557 |
||
558 |
pars_bound_lit_t* |
|
559 |
pars_info_get_bound_lit( |
|
560 |
/*====================*/
|
|
561 |
/* out: bound literal, or NULL if
|
|
562 |
not found */
|
|
563 |
pars_info_t* info, /* in: info struct */ |
|
564 |
const char* name); /* in: bound literal name to find */ |
|
565 |
||
566 |
/********************************************************************
|
|
567 |
Get bound id with the given name.*/
|
|
568 |
||
569 |
pars_bound_id_t* |
|
570 |
pars_info_get_bound_id( |
|
571 |
/*===================*/
|
|
572 |
/* out: bound id, or NULL if not
|
|
573 |
found */
|
|
574 |
pars_info_t* info, /* in: info struct */ |
|
575 |
const char* name); /* in: bound id name to find */ |
|
576 |
||
577 |
||
578 |
/* Extra information supplied for pars_sql(). */
|
|
579 |
struct pars_info_struct { |
|
580 |
mem_heap_t* heap; /* our own memory heap */ |
|
581 |
||
582 |
ib_vector_t* funcs; /* user functions, or NUll |
|
583 |
(pars_user_func_t*) */
|
|
584 |
ib_vector_t* bound_lits; /* bound literals, or NULL |
|
585 |
(pars_bound_lit_t*) */
|
|
586 |
ib_vector_t* bound_ids; /* bound ids, or NULL |
|
587 |
(pars_bound_id_t*) */
|
|
588 |
||
589 |
ibool graph_owns_us; /* if TRUE (which is the default), |
|
590 |
que_graph_free() will free us */
|
|
591 |
};
|
|
592 |
||
593 |
/* User-supplied function and argument. */
|
|
594 |
struct pars_user_func_struct { |
|
595 |
const char* name; /* function name */ |
|
596 |
pars_user_func_cb_t func; /* function address */ |
|
597 |
void* arg; /* user-supplied argument */ |
|
598 |
};
|
|
599 |
||
600 |
/* Bound literal. */
|
|
601 |
struct pars_bound_lit_struct { |
|
602 |
const char* name; /* name */ |
|
603 |
const void* address; /* address */ |
|
604 |
ulint length; /* length of data */ |
|
605 |
ulint type; /* type, e.g. DATA_FIXBINARY */ |
|
606 |
ulint prtype; /* precise type, e.g. DATA_UNSIGNED */ |
|
607 |
};
|
|
608 |
||
609 |
/* Bound id. */
|
|
610 |
struct pars_bound_id_struct { |
|
611 |
const char* name; /* name */ |
|
612 |
const char* id; /* id */ |
|
613 |
};
|
|
614 |
||
615 |
/* Struct used to denote a reserved word in a parsing tree */
|
|
616 |
struct pars_res_word_struct{ |
|
617 |
int code; /* the token code for the reserved word from |
|
618 |
pars0grm.h */
|
|
619 |
};
|
|
620 |
||
621 |
/* A predefined function or operator node in a parsing tree; this construct
|
|
622 |
is also used for some non-functions like the assignment ':=' */
|
|
623 |
struct func_node_struct{ |
|
624 |
que_common_t common; /* type: QUE_NODE_FUNC */ |
|
625 |
int func; /* token code of the function name */ |
|
626 |
ulint class; /* class of the function */ |
|
627 |
que_node_t* args; /* argument(s) of the function */ |
|
628 |
UT_LIST_NODE_T(func_node_t) cond_list; |
|
629 |
/* list of comparison conditions; defined
|
|
630 |
only for comparison operator nodes except,
|
|
631 |
presently, for OPT_SCROLL_TYPE ones */
|
|
632 |
UT_LIST_NODE_T(func_node_t) func_node_list; |
|
633 |
/* list of function nodes in a parsed
|
|
634 |
query graph */
|
|
635 |
};
|
|
636 |
||
637 |
/* An order-by node in a select */
|
|
638 |
struct order_node_struct{ |
|
639 |
que_common_t common; /* type: QUE_NODE_ORDER */ |
|
640 |
sym_node_t* column; /* order-by column */ |
|
641 |
ibool asc; /* TRUE if ascending, FALSE if descending */ |
|
642 |
};
|
|
643 |
||
644 |
/* Procedure definition node */
|
|
645 |
struct proc_node_struct{ |
|
646 |
que_common_t common; /* type: QUE_NODE_PROC */ |
|
647 |
sym_node_t* proc_id; /* procedure name symbol in the symbol |
|
648 |
table of this same procedure */
|
|
649 |
sym_node_t* param_list; /* input and output parameters */ |
|
650 |
que_node_t* stat_list; /* statement list */ |
|
651 |
sym_tab_t* sym_tab; /* symbol table of this procedure */ |
|
652 |
};
|
|
653 |
||
654 |
/* elsif-element node */
|
|
655 |
struct elsif_node_struct{ |
|
656 |
que_common_t common; /* type: QUE_NODE_ELSIF */ |
|
657 |
que_node_t* cond; /* if condition */ |
|
658 |
que_node_t* stat_list; /* statement list */ |
|
659 |
};
|
|
660 |
||
661 |
/* if-statement node */
|
|
662 |
struct if_node_struct{ |
|
663 |
que_common_t common; /* type: QUE_NODE_IF */ |
|
664 |
que_node_t* cond; /* if condition */ |
|
665 |
que_node_t* stat_list; /* statement list */ |
|
666 |
que_node_t* else_part; /* else-part statement list */ |
|
667 |
elsif_node_t* elsif_list; /* elsif element list */ |
|
668 |
};
|
|
669 |
||
670 |
/* while-statement node */
|
|
671 |
struct while_node_struct{ |
|
672 |
que_common_t common; /* type: QUE_NODE_WHILE */ |
|
673 |
que_node_t* cond; /* while condition */ |
|
674 |
que_node_t* stat_list; /* statement list */ |
|
675 |
};
|
|
676 |
||
677 |
/* for-loop-statement node */
|
|
678 |
struct for_node_struct{ |
|
679 |
que_common_t common; /* type: QUE_NODE_FOR */ |
|
680 |
sym_node_t* loop_var; /* loop variable: this is the |
|
681 |
dereferenced symbol from the
|
|
682 |
variable declarations, not the
|
|
683 |
symbol occurrence in the for loop
|
|
684 |
definition */
|
|
685 |
que_node_t* loop_start_limit;/* initial value of loop variable */ |
|
686 |
que_node_t* loop_end_limit; /* end value of loop variable */ |
|
687 |
int loop_end_value; /* evaluated value for the end value: |
|
688 |
it is calculated only when the loop
|
|
689 |
is entered, and will not change within
|
|
690 |
the loop */
|
|
691 |
que_node_t* stat_list; /* statement list */ |
|
692 |
};
|
|
693 |
||
694 |
/* exit statement node */
|
|
695 |
struct exit_node_struct{ |
|
696 |
que_common_t common; /* type: QUE_NODE_EXIT */ |
|
697 |
};
|
|
698 |
||
699 |
/* return-statement node */
|
|
700 |
struct return_node_struct{ |
|
701 |
que_common_t common; /* type: QUE_NODE_RETURN */ |
|
702 |
};
|
|
703 |
||
704 |
/* Assignment statement node */
|
|
705 |
struct assign_node_struct{ |
|
706 |
que_common_t common; /* type: QUE_NODE_ASSIGNMENT */ |
|
707 |
sym_node_t* var; /* variable to set */ |
|
708 |
que_node_t* val; /* value to assign */ |
|
709 |
};
|
|
710 |
||
711 |
/* Column assignment node */
|
|
712 |
struct col_assign_node_struct{ |
|
713 |
que_common_t common; /* type: QUE_NODE_COL_ASSIGN */ |
|
714 |
sym_node_t* col; /* column to set */ |
|
715 |
que_node_t* val; /* value to assign */ |
|
716 |
};
|
|
717 |
||
718 |
/* Classes of functions */
|
|
719 |
#define PARS_FUNC_ARITH 1 /* +, -, *, / */ |
|
720 |
#define PARS_FUNC_LOGICAL 2
|
|
721 |
#define PARS_FUNC_CMP 3
|
|
722 |
#define PARS_FUNC_PREDEFINED 4 /* TO_NUMBER, SUBSTR, ... */ |
|
723 |
#define PARS_FUNC_AGGREGATE 5 /* COUNT, DISTINCT, SUM */ |
|
724 |
#define PARS_FUNC_OTHER 6 /* these are not real functions, |
|
725 |
e.g., := */
|
|
726 |
||
727 |
#ifndef UNIV_NONINL
|
|
728 |
#include "pars0pars.ic" |
|
729 |
#endif
|
|
730 |
||
731 |
#endif
|