diff options
Diffstat (limited to 'innobase/include/pars0sym.h')
-rw-r--r-- | innobase/include/pars0sym.h | 191 |
1 files changed, 191 insertions, 0 deletions
diff --git a/innobase/include/pars0sym.h b/innobase/include/pars0sym.h new file mode 100644 index 00000000000..9fdeb1984a9 --- /dev/null +++ b/innobase/include/pars0sym.h @@ -0,0 +1,191 @@ +/****************************************************** +SQL parser symbol table + +(c) 1997 Innobase Oy + +Created 12/15/1997 Heikki Tuuri +*******************************************************/ + +#ifndef pars0sym_h +#define pars0sym_h + +#include "univ.i" +#include "que0types.h" +#include "usr0types.h" +#include "dict0types.h" +#include "pars0types.h" +#include "row0types.h" + +/********************************************************************** +Creates a symbol table for a single stored procedure or query. */ + +sym_tab_t* +sym_tab_create( +/*===========*/ + /* out, own: symbol table */ + mem_heap_t* heap); /* in: memory heap where to create */ +/********************************************************************** +Frees the memory allocated dynamically AFTER parsing phase for variables +etc. in the symbol table. Does not free the mem heap where the table was +originally created. Frees also SQL explicit cursor definitions. */ + +void +sym_tab_free_private( +/*=================*/ + sym_tab_t* sym_tab); /* in, own: symbol table */ +/********************************************************************** +Adds an integer literal to a symbol table. */ + +sym_node_t* +sym_tab_add_int_lit( +/*================*/ + /* out: symbol table node */ + sym_tab_t* sym_tab, /* in: symbol table */ + ulint val); /* in: integer value */ +/********************************************************************** +Adds an string literal to a symbol table. */ + +sym_node_t* +sym_tab_add_str_lit( +/*================*/ + /* out: symbol table node */ + sym_tab_t* sym_tab, /* in: symbol table */ + byte* str, /* in: string with no quotes around + it */ + ulint len); /* in: string length */ +/********************************************************************** +Adds an SQL null literal to a symbol table. */ + +sym_node_t* +sym_tab_add_null_lit( +/*=================*/ + /* out: symbol table node */ + sym_tab_t* sym_tab); /* in: symbol table */ +/********************************************************************** +Adds an identifier to a symbol table. */ + +sym_node_t* +sym_tab_add_id( +/*===========*/ + /* out: symbol table node */ + sym_tab_t* sym_tab, /* in: symbol table */ + byte* name, /* in: identifier name */ + ulint len); /* in: identifier length */ + +#define SYM_CLUST_FIELD_NO 0 +#define SYM_SEC_FIELD_NO 1 + +struct sym_node_struct{ + que_common_t common; /* node type: + QUE_NODE_SYMBOL */ + /* NOTE: if the data field in 'common.val' is not NULL and the symbol + table node is not for a temporary column, the memory for the value has + been allocated from dynamic memory and it should be freed when the + symbol table is discarded */ + + sym_node_t* indirection; /* pointer to + another symbol table + node which contains + the value for this + node, NULL otherwise */ + sym_node_t* alias; /* pointer to + another symbol table + node for which this + node is an alias, + NULL otherwise */ + UT_LIST_NODE_T(sym_node_t) col_var_list; /* list of table + columns or a list of + input variables for an + explicit cursor */ + ibool copy_val; /* TRUE if a column + and its value should + be copied to dynamic + memory when fetched */ + ulint field_nos[2]; /* if a column, in + the position + SYM_CLUST_FIELD_NO is + the field number in the + clustered index; in + the position + SYM_SEC_FIELD_NO + the field number in the + non-clustered index to + use first; if not found + from the index, then + ULINT_UNDEFINED */ + ibool resolved; /* TRUE if the + meaning of a variable + or a column has been + resolved; for literals + this is always TRUE */ + ulint token_type; /* SYM_VAR, SYM_COLUMN, + SYM_IMPLICIT_VAR, + SYM_LIT, SYM_TABLE, + SYM_CURSOR, ... */ + char* name; /* name of an id */ + ulint name_len; /* id name length */ + dict_table_t* table; /* table definition + if a table id or a + column id */ + dict_proc_t* procedure_def; /* stored procedure + definition, if a + stored procedure name */ + ulint col_no; /* column number if a + column */ + sel_buf_t* prefetch_buf; /* NULL, or a buffer + for cached column + values for prefetched + rows */ + sel_node_t* cursor_def; /* cursor definition + select node if a + named cursor */ + ulint param_type; /* PARS_INPUT, + PARS_OUTPUT, or + PARS_NOT_PARAM if not a + procedure parameter */ + sym_tab_t* sym_table; /* back pointer to + the symbol table */ + UT_LIST_NODE_T(sym_node_t) sym_list; /* list of symbol + nodes */ +}; + +struct sym_tab_struct{ + que_t* query_graph; + /* query graph generated by the + parser */ + char* sql_string; + /* SQL string to parse */ + int string_len; + /* SQL string length */ + int next_char_pos; + /* position of the next character in + sql_string to give to the lexical + analyzer */ + sym_node_list_t sym_list; + /* list of symbol nodes in the symbol + table */ + UT_LIST_BASE_NODE_T(func_node_t) + func_node_list; + /* list of function nodes in the + parsed query graph */ + mem_heap_t* heap; /* memory heap from which we can + allocate space */ +}; + +/* Types of a symbol table entry */ +#define SYM_VAR 91 /* declared parameter or local + variable of a procedure */ +#define SYM_IMPLICIT_VAR 92 /* storage for a intermediate result + of a calculation */ +#define SYM_LIT 93 /* literal */ +#define SYM_TABLE 94 /* database table name */ +#define SYM_COLUMN 95 /* database table name */ +#define SYM_CURSOR 96 /* named cursor */ +#define SYM_PROCEDURE_NAME 97 /* stored procedure name */ +#define SYM_INDEX 98 /* database index name */ + +#ifndef UNIV_NONINL +#include "pars0sym.ic" +#endif + +#endif |