MySQL 8.3.0
Source Code Documentation
pars0pars.cc File Reference

SQL parser. More...

#include "current_thd.h"
#include "ha_prototypes.h"
#include "data0data.h"
#include "data0type.h"
#include "dict0crea.h"
#include "dict0dd.h"
#include "dict0dict.h"
#include "dict0mem.h"
#include "eval0eval.h"
#include "lock0lock.h"
#include "pars0grm.h"
#include "pars0opt.h"
#include "pars0pars.h"
#include "que0que.h"
#include "row0ins.h"
#include "row0sel.h"
#include "row0upd.h"
#include "trx0roll.h"
#include "trx0trx.h"
#include "my_dbug.h"

Functions

void pars_init ()
 Initialize for the internal parser. More...
 
void pars_close ()
 Clean up the internal parser. More...
 
static pars_user_func_tpars_info_lookup_user_func (pars_info_t *info, const char *name)
 
static pars_bound_id_tpars_info_lookup_bound_id (pars_info_t *info, const char *name)
 
static pars_bound_lit_tpars_info_lookup_bound_lit (pars_info_t *info, const char *name)
 
static ulint pars_func_get_class (int func)
 Determines the class of a function code. More...
 
static func_node_tpars_func_low (int func, que_node_t *arg)
 Parses an operator or predefined function expression. More...
 
func_node_tpars_func (que_node_t *res_word, que_node_t *arg)
 Parses a function expression. More...
 
int pars_like_rebind (sym_node_t *node, const byte *ptr, ulint ptr_len)
 
static int pars_like_op (que_node_t *arg)
 
func_node_tpars_op (int func, que_node_t *arg1, que_node_t *arg2)
 Parses an operator expression. More...
 
order_node_tpars_order_by (sym_node_t *column, pars_res_word_t *asc)
 Parses an ORDER BY clause. More...
 
static bool pars_is_string_type (ulint mtype)
 Determine if a data type is a built-in string data type of the InnoDB SQL parser. More...
 
static void pars_resolve_func_data_type (func_node_t *node)
 Resolves the data type of a function in an expression. More...
 
static void pars_resolve_exp_variables_and_types (sel_node_t *select_node, que_node_t *exp_node)
 Resolves the meaning of variables in an expression and the data types of functions. More...
 
static void pars_resolve_exp_list_variables_and_types (sel_node_t *select_node, que_node_t *exp_node)
 Resolves the meaning of variables in an expression list. More...
 
static void pars_resolve_exp_columns (sym_node_t *table_node, que_node_t *exp_node)
 Resolves the columns in an expression. More...
 
static void pars_resolve_exp_list_columns (sym_node_t *table_node, que_node_t *exp_node)
 Resolves the meaning of columns in an expression list. More...
 
static void pars_retrieve_table_def (sym_node_t *sym_node)
 Retrieves the table definition for a table name id. More...
 
static ulint pars_retrieve_table_list_defs (sym_node_t *sym_node)
 Retrieves the table definitions for a list of table name ids. More...
 
static void pars_select_all_columns (sel_node_t *select_node)
 Adds all columns to the select list if the query is SELECT * FROM ... More...
 
sel_node_tpars_select_list (que_node_t *select_list, sym_node_t *into_list)
 Parses a select list; creates a query graph node for the whole SELECT statement. More...
 
static void pars_check_aggregate (sel_node_t *select_node)
 Checks if the query is an aggregate query, in which case the selct list must contain only aggregate function items. More...
 
sel_node_tpars_select_statement (sel_node_t *select_node, sym_node_t *table_list, que_node_t *search_cond, pars_res_word_t *for_update, pars_res_word_t *lock_shared, order_node_t *order_by)
 Parses a select statement. More...
 
que_node_tpars_cursor_declaration (sym_node_t *sym_node, sel_node_t *select_node)
 Parses a cursor declaration. More...
 
que_node_tpars_function_declaration (sym_node_t *sym_node)
 Parses a function declaration. More...
 
upd_node_tpars_update_statement_start (bool is_delete, sym_node_t *table_sym, col_assign_node_t *col_assign_list)
 Parses a delete or update statement start. More...
 
col_assign_node_tpars_column_assignment (sym_node_t *column, que_node_t *exp)
 Parses a column assignment in an update. More...
 
static void pars_process_assign_list (upd_node_t *node)
 Processes an update node assignment list. More...
 
upd_node_tpars_update_statement (upd_node_t *node, sym_node_t *cursor_sym, que_node_t *search_cond)
 Parses an update or delete statement. More...
 
ins_node_tpars_insert_statement (sym_node_t *table_sym, que_node_t *values_list, sel_node_t *select)
 Parses an insert statement. More...
 
static void pars_set_dfield_type (dfield_t *dfield, pars_res_word_t *type, ulint len, bool is_unsigned, bool is_not_null)
 Set the type of a dfield. More...
 
sym_node_tpars_variable_declaration (sym_node_t *node, pars_res_word_t *type)
 Parses a variable declaration. More...
 
sym_node_tpars_parameter_declaration (sym_node_t *node, ulint param_type, pars_res_word_t *type)
 Parses a procedure parameter declaration. More...
 
static void pars_set_parent_in_list (que_node_t *node_list, que_node_t *parent)
 Sets the parent field in a query node list. More...
 
elsif_node_tpars_elsif_element (que_node_t *cond, que_node_t *stat_list)
 Parses an elsif element. More...
 
if_node_tpars_if_statement (que_node_t *cond, que_node_t *stat_list, que_node_t *else_part)
 Parses an if-statement. More...
 
while_node_tpars_while_statement (que_node_t *cond, que_node_t *stat_list)
 Parses a while-statement. More...
 
for_node_tpars_for_statement (sym_node_t *loop_var, que_node_t *loop_start_limit, que_node_t *loop_end_limit, que_node_t *stat_list)
 Parses a for-loop-statement. More...
 
exit_node_tpars_exit_statement (void)
 Parses an exit statement. More...
 
return_node_tpars_return_statement (void)
 Parses a return-statement. More...
 
assign_node_tpars_assignment_statement (sym_node_t *var, que_node_t *val)
 Parses an assignment statement. More...
 
fetch_node_tpars_fetch_statement (sym_node_t *cursor, sym_node_t *into_list, sym_node_t *user_func)
 Parses a fetch statement. More...
 
open_node_tpars_open_statement (ulint type, sym_node_t *cursor)
 Parses an open or close cursor statement. More...
 
commit_node_tpars_commit_statement (void)
 Parses a commit statement. More...
 
roll_node_tpars_rollback_statement (void)
 Parses a rollback statement. More...
 
sym_node_tpars_column_def (sym_node_t *sym_node, pars_res_word_t *type, sym_node_t *len, void *is_unsigned, void *is_not_null)
 Parses a column definition at a table creation. More...
 
tab_node_tpars_create_table (sym_node_t *, sym_node_t *, sym_node_t *, sym_node_t *, void *)
 Parses a table creation operation. More...
 
ind_node_tpars_create_index (pars_res_word_t *, pars_res_word_t *, sym_node_t *, sym_node_t *, sym_node_t *)
 Parses an index creation operation. More...
 
que_fork_tpars_procedure_definition (sym_node_t *sym_node, sym_node_t *param_list, que_node_t *stat_list)
 Parses a procedure definition. More...
 
int pars_get_lex_chars (char *buf, size_t max_size)
 Retrieves characters to the lexical analyzer. More...
 
void yyerror (const char *s)
 Called by yyparse on error. More...
 
que_tpars_sql (pars_info_t *info, const char *str)
 Parses an SQL string returning the query graph. More...
 
que_thr_tpars_complete_graph_for_exec (que_node_t *node, trx_t *trx, mem_heap_t *heap, row_prebuilt_t *prebuilt)
 Completes a query graph by adding query thread and fork nodes above it and prepares the graph for running. More...
 
pars_info_tpars_info_create (void)
 Create parser info struct. More...
 
void pars_info_free (pars_info_t *info)
 Free info struct and everything it contains. More...
 
void pars_info_add_literal (pars_info_t *info, const char *name, const void *address, ulint length, ulint type, ulint prtype)
 Add bound literal. More...
 
void pars_info_add_str_literal (pars_info_t *info, const char *name, const char *str)
 Equivalent to pars_info_add_literal(info, name, str, strlen(str), DATA_VARCHAR, DATA_ENGLISH). More...
 
void pars_info_bind_literal (pars_info_t *info, const char *name, const void *address, ulint length, ulint type, ulint prtype)
 
void pars_info_bind_varchar_literal (pars_info_t *info, const char *name, const byte *str, ulint str_len)
 If the literal value already exists then it rebinds otherwise it creates a new entry. More...
 
void pars_info_add_int4_literal (pars_info_t *info, const char *name, lint val)
 Equivalent to: More...
 
void pars_info_bind_int4_literal (pars_info_t *info, const char *name, const uint32_t *val)
 If the literal value already exists then it rebinds otherwise it creates a new entry. More...
 
void pars_info_bind_int8_literal (pars_info_t *info, const char *name, const uint64_t *val)
 If the literal value already exists then it rebinds otherwise it creates a new entry. More...
 
void pars_info_add_ull_literal (pars_info_t *info, const char *name, uint64_t val)
 Equivalent to: More...
 
void pars_info_bind_ull_literal (pars_info_t *info, const char *name, const uint64_t *val)
 If the literal value already exists then it rebinds otherwise it creates a new entry. More...
 
void pars_info_bind_function (pars_info_t *info, const char *name, pars_user_func_cb_t func, void *arg)
 Add user function. More...
 
void pars_info_bind_id (pars_info_t *info, bool copy_name, const char *name, const char *id)
 Add bound id. More...
 
pars_bound_id_tpars_info_get_bound_id (pars_info_t *info, const char *name)
 Get bound identifier with the given name. More...
 
pars_bound_lit_tpars_info_get_bound_lit (pars_info_t *info, const char *name)
 Get bound literal with the given name. More...
 

Variables

sym_tab_tpars_sym_tab_global
 
pars_res_word_t pars_to_binary_token = {PARS_TO_BINARY_TOKEN}
 
pars_res_word_t pars_substr_token = {PARS_SUBSTR_TOKEN}
 
pars_res_word_t pars_concat_token = {PARS_CONCAT_TOKEN}
 
pars_res_word_t pars_instr_token = {PARS_INSTR_TOKEN}
 
pars_res_word_t pars_length_token = {PARS_LENGTH_TOKEN}
 
pars_res_word_t pars_count_token = {PARS_COUNT_TOKEN}
 
pars_res_word_t pars_sum_token = {PARS_SUM_TOKEN}
 
pars_res_word_t pars_distinct_token = {PARS_DISTINCT_TOKEN}
 
pars_res_word_t pars_binary_token = {PARS_BINARY_TOKEN}
 
pars_res_word_t pars_blob_token = {PARS_BLOB_TOKEN}
 
pars_res_word_t pars_int_token = {PARS_INT_TOKEN}
 
pars_res_word_t pars_bigint_token = {PARS_BIGINT_TOKEN}
 
pars_res_word_t pars_char_token = {PARS_CHAR_TOKEN}
 
pars_res_word_t pars_float_token = {PARS_FLOAT_TOKEN}
 
pars_res_word_t pars_update_token = {PARS_UPDATE_TOKEN}
 
pars_res_word_t pars_asc_token = {PARS_ASC_TOKEN}
 
pars_res_word_t pars_desc_token = {PARS_DESC_TOKEN}
 
pars_res_word_t pars_open_token = {PARS_OPEN_TOKEN}
 
pars_res_word_t pars_close_token = {PARS_CLOSE_TOKEN}
 
pars_res_word_t pars_share_token = {PARS_SHARE_TOKEN}
 
pars_res_word_t pars_unique_token = {PARS_UNIQUE_TOKEN}
 
pars_res_word_t pars_clustered_token = {PARS_CLUSTERED_TOKEN}
 
ulint pars_star_denoter = 12345678
 Global variable used to denote the '*' in SELECT * FROM. More...
 
ib_mutex_t pars_mutex
 Mutex to protect the sql parser. More...
 

Detailed Description

SQL parser.

Created 11/19/1996 Heikki Tuuri

Function Documentation

◆ pars_assignment_statement()

assign_node_t * pars_assignment_statement ( sym_node_t var,
que_node_t val 
)

Parses an assignment statement.

Returns
assignment statement node
Parameters
varin: variable to assign
valin: value to assign

◆ pars_check_aggregate()

static void pars_check_aggregate ( sel_node_t select_node)
static

Checks if the query is an aggregate query, in which case the selct list must contain only aggregate function items.

Parameters
select_nodein: select node already containing the select list

◆ pars_close()

void pars_close ( )

Clean up the internal parser.

◆ pars_column_assignment()

col_assign_node_t * pars_column_assignment ( sym_node_t column,
que_node_t exp 
)

Parses a column assignment in an update.

Returns
column assignment node
Parameters
columnin: column to assign
expin: value to assign

◆ pars_column_def()

sym_node_t * pars_column_def ( sym_node_t sym_node,
pars_res_word_t type,
sym_node_t len,
void *  is_unsigned,
void *  is_not_null 
)

Parses a column definition at a table creation.

Returns
column sym table node
Parameters
sym_nodein: column node in the symbol table
typein: data type
lenin: length of column, or NULL
is_unsignedin: if not NULL, column is of type UNSIGNED.
is_not_nullin: if not NULL, column is of type NOT NULL.

◆ pars_commit_statement()

commit_node_t * pars_commit_statement ( void  )

Parses a commit statement.

Returns
own: commit node struct

◆ pars_complete_graph_for_exec()

que_thr_t * pars_complete_graph_for_exec ( que_node_t node,
trx_t trx,
mem_heap_t heap,
row_prebuilt_t prebuilt 
)

Completes a query graph by adding query thread and fork nodes above it and prepares the graph for running.

The fork created is of type QUE_FORK_MYSQL_INTERFACE.

Parameters
[in]noderoot node for an incomplete query graph, or NULL for dummy graph
[in]trxtransaction handle
[in]heapmemory heap from which allocated
[in]prebuiltrow prebuilt structure
Returns
query thread node to run

◆ pars_create_index()

ind_node_t * pars_create_index ( pars_res_word_t unique_def,
pars_res_word_t clustered_def,
sym_node_t index_sym,
sym_node_t table_sym,
sym_node_t column_list 
)

Parses an index creation operation.

Parameters
[in]unique_defNot NULL if a unique index.
[in]clustered_defNot NULL if a clustered index.
[in]index_symIndex name node in the symbol table.
[in]table_symTable name node in the symbol table.
[in]column_listList of column names.
Returns
index create subgraph

◆ pars_create_table()

tab_node_t * pars_create_table ( sym_node_t table_sym,
sym_node_t column_defs,
sym_node_t compact,
sym_node_t block_size,
void *  not_fit_in_memory 
)

Parses a table creation operation.

Parameters
[in]table_symtable name node in the symbol table
[in]column_defslist of column names
[in]not_fit_in_memorya non-NULL pointer means that this is a table which in simulations should be simulated as not fitting in memory; thread is put to sleep to simulate disk accesses; NOTE that this flag is not stored to the data dictionary on disk, and the database will forget about non-NULL value if it has to reload the table definition from disk
[in]compactnon-NULL if COMPACT table
[in]block_sizeblock size (can be NULL)
Returns
table create subgraph

◆ pars_cursor_declaration()

que_node_t * pars_cursor_declaration ( sym_node_t sym_node,
sel_node_t select_node 
)

Parses a cursor declaration.

Returns
sym_node
Parameters
sym_nodein: cursor id node in the symbol table
select_nodein: select node

◆ pars_elsif_element()

elsif_node_t * pars_elsif_element ( que_node_t cond,
que_node_t stat_list 
)

Parses an elsif element.

Returns
elsif node
Parameters
condin: if-condition
stat_listin: statement list

◆ pars_exit_statement()

exit_node_t * pars_exit_statement ( void  )

Parses an exit statement.

Returns
exit statement node

◆ pars_fetch_statement()

fetch_node_t * pars_fetch_statement ( sym_node_t cursor,
sym_node_t into_list,
sym_node_t user_func 
)

Parses a fetch statement.

into_list or user_func (but not both) must be non-NULL.

Returns
fetch statement node
Parameters
cursorin: cursor node
into_listin: variables to set, or NULL
user_funcin: user function name, or NULL

◆ pars_for_statement()

for_node_t * pars_for_statement ( sym_node_t loop_var,
que_node_t loop_start_limit,
que_node_t loop_end_limit,
que_node_t stat_list 
)

Parses a for-loop-statement.

Returns
for-statement node
Parameters
loop_varin: loop variable
loop_start_limitin: loop start expression
loop_end_limitin: loop end expression
stat_listin: statement list

◆ pars_func()

func_node_t * pars_func ( que_node_t res_word,
que_node_t arg 
)

Parses a function expression.

Returns
own: function node in a query tree
Parameters
res_wordin: function name reserved word
argin: first argument in the argument list

◆ pars_func_get_class()

static ulint pars_func_get_class ( int  func)
static

Determines the class of a function code.

Returns
function class: PARS_FUNC_ARITH, ...
Parameters
funcin: function code: '=', PARS_GE_TOKEN, ...

◆ pars_func_low()

static func_node_t * pars_func_low ( int  func,
que_node_t arg 
)
static

Parses an operator or predefined function expression.

Returns
own: function node in a query tree
Parameters
funcin: function token code
argin: first argument in the argument list

◆ pars_function_declaration()

que_node_t * pars_function_declaration ( sym_node_t sym_node)

Parses a function declaration.

Returns
sym_node
Parameters
sym_nodein: function id node in the symbol table

◆ pars_get_lex_chars()

int pars_get_lex_chars ( char *  buf,
size_t  max_size 
)

Retrieves characters to the lexical analyzer.

Parameters
[in,out]bufBuffer where to copy
[in]max_sizeMaximum number of characters which fit in the buffer
Returns
number of characters copied or 0 on EOF

◆ pars_if_statement()

if_node_t * pars_if_statement ( que_node_t cond,
que_node_t stat_list,
que_node_t else_part 
)

Parses an if-statement.

Returns
if-statement node
Parameters
condin: if-condition
stat_listin: statement list
else_partin: else-part statement list or elsif element list

◆ pars_info_add_int4_literal()

void pars_info_add_int4_literal ( pars_info_t info,
const char *  name,
lint  val 
)

Equivalent to:

char buf[4]; mach_write_to_4(buf, val); pars_info_add_literal(info, name, buf, 4, DATA_INT, 0);

except that the buffer is dynamically allocated from the info struct's heap.

Parameters
infoin: info struct
namein: name
valin: value

◆ pars_info_add_literal()

void pars_info_add_literal ( pars_info_t info,
const char *  name,
const void *  address,
ulint  length,
ulint  type,
ulint  prtype 
)

Add bound literal.

Parameters
[in]infoInfo struct
[in]nameName
[in]addressAddress
[in]lengthLength of data
[in]typeType, e.g. data_fixbinary
[in]prtypePrecise type, e.g. data_unsigned

◆ pars_info_add_str_literal()

void pars_info_add_str_literal ( pars_info_t info,
const char *  name,
const char *  str 
)

Equivalent to pars_info_add_literal(info, name, str, strlen(str), DATA_VARCHAR, DATA_ENGLISH).

Parameters
[in]infoInfo struct
[in]nameName
[in]strString
Parameters
infoin: info struct
namein: name
strin: string

◆ pars_info_add_ull_literal()

void pars_info_add_ull_literal ( pars_info_t info,
const char *  name,
uint64_t  val 
)

Equivalent to:

char buf[8]; mach_write_to_8(buf, val); pars_info_add_literal(info, name, buf, 8, DATA_FIXBINARY, 0);

except that the buffer is dynamically allocated from the info struct's heap.

Parameters
infoin: info struct
namein: name
valin: value

◆ pars_info_bind_function()

void pars_info_bind_function ( pars_info_t info,
const char *  name,
pars_user_func_cb_t  func,
void *  arg 
)

Add user function.

Parameters
[in]infoInfo struct
[in]nameFunction name
[in]funcFunction address
[in]argUser-supplied argument

◆ pars_info_bind_id()

void pars_info_bind_id ( pars_info_t info,
bool  copy_name,
const char *  name,
const char *  id 
)

Add bound id.

Parameters
[in]infoinfo struct
[in]copy_namecopy name if true
[in]namename
[in]idid

◆ pars_info_bind_int4_literal()

void pars_info_bind_int4_literal ( pars_info_t info,
const char *  name,
const uint32_t *  val 
)

If the literal value already exists then it rebinds otherwise it creates a new entry.

Parameters
[in]infoInfo struct
[in]nameName
[in]valValue

◆ pars_info_bind_int8_literal()

void pars_info_bind_int8_literal ( pars_info_t info,
const char *  name,
const uint64_t *  val 
)

If the literal value already exists then it rebinds otherwise it creates a new entry.

Parameters
[in]infoInfo struct
[in]nameName
[in]valValue

◆ pars_info_bind_literal()

void pars_info_bind_literal ( pars_info_t info,
const char *  name,
const void *  address,
ulint  length,
ulint  type,
ulint  prtype 
)

◆ pars_info_bind_ull_literal()

void pars_info_bind_ull_literal ( pars_info_t info,
const char *  name,
const uint64_t *  val 
)

If the literal value already exists then it rebinds otherwise it creates a new entry.

Parameters
[in]infoInfo struct
[in]nameName
[in]valValue

◆ pars_info_bind_varchar_literal()

void pars_info_bind_varchar_literal ( pars_info_t info,
const char *  name,
const byte str,
ulint  str_len 
)

If the literal value already exists then it rebinds otherwise it creates a new entry.

Parameters
[in]infoInfo struct
[in]nameName
[in]strString
[in]str_lenString length

◆ pars_info_create()

pars_info_t * pars_info_create ( void  )

Create parser info struct.

Returns
own: info struct

◆ pars_info_free()

void pars_info_free ( pars_info_t info)

Free info struct and everything it contains.

in, own: info struct

Parameters
infoin, own: info struct

◆ pars_info_get_bound_id()

pars_bound_id_t * pars_info_get_bound_id ( pars_info_t info,
const char *  name 
)

Get bound identifier with the given name.

Parameters
[in]infoinfo struct
[in]namebound id name to find
Returns
bound id, or NULL if not found

◆ pars_info_get_bound_lit()

pars_bound_lit_t * pars_info_get_bound_lit ( pars_info_t info,
const char *  name 
)

Get bound literal with the given name.

Returns
bound literal, or NULL if not found
Parameters
infoin: info struct
namein: bound literal name to find

◆ pars_info_lookup_bound_id()

static pars_bound_id_t * pars_info_lookup_bound_id ( pars_info_t info,
const char *  name 
)
inlinestatic

◆ pars_info_lookup_bound_lit()

static pars_bound_lit_t * pars_info_lookup_bound_lit ( pars_info_t info,
const char *  name 
)
inlinestatic

◆ pars_info_lookup_user_func()

static pars_user_func_t * pars_info_lookup_user_func ( pars_info_t info,
const char *  name 
)
inlinestatic

◆ pars_init()

void pars_init ( )

Initialize for the internal parser.

◆ pars_insert_statement()

ins_node_t * pars_insert_statement ( sym_node_t table_sym,
que_node_t values_list,
sel_node_t select 
)

Parses an insert statement.

Returns
own: update node in a query tree
Parameters
table_symin: table name node
values_listin: value expression list or NULL
selectin: select condition or NULL

◆ pars_is_string_type()

static bool pars_is_string_type ( ulint  mtype)
static

Determine if a data type is a built-in string data type of the InnoDB SQL parser.

Returns
true if string data type
Parameters
mtypein: main data type

◆ pars_like_op()

static int pars_like_op ( que_node_t arg)
static

◆ pars_like_rebind()

int pars_like_rebind ( sym_node_t node,
const byte ptr,
ulint  ptr_len 
)

◆ pars_op()

func_node_t * pars_op ( int  func,
que_node_t arg1,
que_node_t arg2 
)

Parses an operator expression.

Returns
own: function node in a query tree
Parameters
funcin: operator token code
arg1in: first argument
arg2in: second argument or NULL for an unary operator

◆ pars_open_statement()

open_node_t * pars_open_statement ( ulint  type,
sym_node_t cursor 
)

Parses an open or close cursor statement.

Returns
fetch statement node
Parameters
typein: ROW_SEL_OPEN_CURSOR or ROW_SEL_CLOSE_CURSOR
cursorin: cursor node

◆ pars_order_by()

order_node_t * pars_order_by ( sym_node_t column,
pars_res_word_t asc 
)

Parses an ORDER BY clause.

Order by a single column only is supported.

Returns
own: order-by node in a query tree
Parameters
columnin: column name
ascin: &pars_asc_token or pars_desc_token

◆ pars_parameter_declaration()

sym_node_t * pars_parameter_declaration ( sym_node_t node,
ulint  param_type,
pars_res_word_t type 
)

Parses a procedure parameter declaration.

Returns
own: symbol table node of type SYM_VAR
Parameters
nodein: symbol table node allocated for the id of the parameter
param_typein: PARS_INPUT or PARS_OUTPUT
typein: pointer to a type token

◆ pars_procedure_definition()

que_fork_t * pars_procedure_definition ( sym_node_t sym_node,
sym_node_t param_list,
que_node_t stat_list 
)

Parses a procedure definition.

Returns
query fork node
Parameters
sym_nodein: procedure id node in the symbol table
param_listin: parameter declaration list
stat_listin: statement list

◆ pars_process_assign_list()

static void pars_process_assign_list ( upd_node_t node)
static

Processes an update node assignment list.

Parameters
nodein: update node

◆ pars_resolve_exp_columns()

static void pars_resolve_exp_columns ( sym_node_t table_node,
que_node_t exp_node 
)
static

Resolves the columns in an expression.

Parameters
table_nodein: first node in a table list
exp_nodein: expression

◆ pars_resolve_exp_list_columns()

static void pars_resolve_exp_list_columns ( sym_node_t table_node,
que_node_t exp_node 
)
static

Resolves the meaning of columns in an expression list.

Parameters
table_nodein: first node in a table list
exp_nodein: expression list first node, or NULL

◆ pars_resolve_exp_list_variables_and_types()

static void pars_resolve_exp_list_variables_and_types ( sel_node_t select_node,
que_node_t exp_node 
)
static

Resolves the meaning of variables in an expression list.

It is an error if some identifier cannot be resolved here. Resolves also the data types of functions.

Parameters
select_nodein: select node or NULL
exp_nodein: expression list first node, or NULL

◆ pars_resolve_exp_variables_and_types()

static void pars_resolve_exp_variables_and_types ( sel_node_t select_node,
que_node_t exp_node 
)
static

Resolves the meaning of variables in an expression and the data types of functions.

It is an error if some identifier cannot be resolved here.

Parameters
select_nodein: select node or NULL; if this is not NULL then the variable sym nodes are added to the copy_variables list of select_node
exp_nodein: expression

◆ pars_resolve_func_data_type()

static void pars_resolve_func_data_type ( func_node_t node)
static

Resolves the data type of a function in an expression.

The argument data types must already be resolved.

Parameters
nodein: function node

◆ pars_retrieve_table_def()

static void pars_retrieve_table_def ( sym_node_t sym_node)
static

Retrieves the table definition for a table name id.

Parameters
sym_nodein: table node

◆ pars_retrieve_table_list_defs()

static ulint pars_retrieve_table_list_defs ( sym_node_t sym_node)
static

Retrieves the table definitions for a list of table name ids.

Returns
number of tables
Parameters
sym_nodein: first table node in list

◆ pars_return_statement()

return_node_t * pars_return_statement ( void  )

Parses a return-statement.

Returns
return-statement node

◆ pars_rollback_statement()

roll_node_t * pars_rollback_statement ( void  )

Parses a rollback statement.

Returns
own: rollback node struct

◆ pars_select_all_columns()

static void pars_select_all_columns ( sel_node_t select_node)
static

Adds all columns to the select list if the query is SELECT * FROM ...

Parameters
select_nodein: select node already containing the table list

◆ pars_select_list()

sel_node_t * pars_select_list ( que_node_t select_list,
sym_node_t into_list 
)

Parses a select list; creates a query graph node for the whole SELECT statement.

Returns
own: select node in a query tree
Parameters
select_listin: select list
into_listin: variables list or NULL

◆ pars_select_statement()

sel_node_t * pars_select_statement ( sel_node_t select_node,
sym_node_t table_list,
que_node_t search_cond,
pars_res_word_t for_update,
pars_res_word_t lock_shared,
order_node_t order_by 
)

Parses a select statement.

Returns
own: select node in a query tree
Parameters
select_nodein: select node already containing the select list
table_listin: table list
search_condin: search condition or NULL
for_updatein: NULL or &pars_update_token
lock_sharedin: NULL or &pars_share_token
order_byin: NULL or an order-by node

◆ pars_set_dfield_type()

static void pars_set_dfield_type ( dfield_t dfield,
pars_res_word_t type,
ulint  len,
bool  is_unsigned,
bool  is_not_null 
)
static

Set the type of a dfield.

Parameters
dfieldin: dfield
typein: pointer to a type token
lenin: length, or 0
is_unsignedin: if true, column is UNSIGNED.
is_not_nullin: if true, column is NOT NULL.

◆ pars_set_parent_in_list()

static void pars_set_parent_in_list ( que_node_t node_list,
que_node_t parent 
)
static

Sets the parent field in a query node list.

Parameters
node_listin: first node in a list
parentin: parent value to set in all nodes of the list

◆ pars_sql()

que_t * pars_sql ( pars_info_t info,
const char *  str 
)

Parses an SQL string returning the query graph.

Returns
own: the query graph
Parameters
infoin: extra information, or NULL
strin: SQL string

◆ pars_update_statement()

upd_node_t * pars_update_statement ( upd_node_t node,
sym_node_t cursor_sym,
que_node_t search_cond 
)

Parses an update or delete statement.

Returns
own: update node in a query tree
Parameters
nodein: update node
cursor_symin: pointer to a cursor entry in the symbol table or NULL
search_condin: search condition or NULL

◆ pars_update_statement_start()

upd_node_t * pars_update_statement_start ( bool  is_delete,
sym_node_t table_sym,
col_assign_node_t col_assign_list 
)

Parses a delete or update statement start.

Returns
own: update node in a query tree
Parameters
is_deletein: true if delete
table_symin: table name node
col_assign_listin: column assignment list, NULL if delete

◆ pars_variable_declaration()

sym_node_t * pars_variable_declaration ( sym_node_t node,
pars_res_word_t type 
)

Parses a variable declaration.

Returns
own: symbol table node of type SYM_VAR
Parameters
nodein: symbol table node allocated for the id of the variable
typein: pointer to a type token

◆ pars_while_statement()

while_node_t * pars_while_statement ( que_node_t cond,
que_node_t stat_list 
)

Parses a while-statement.

Returns
while-statement node
Parameters
condin: while-condition
stat_listin: statement list

◆ yyerror()

void yyerror ( const char *  s)

Called by yyparse on error.

in: error message string

Parameters
sin: error message string

Variable Documentation

◆ pars_asc_token

pars_res_word_t pars_asc_token = {PARS_ASC_TOKEN}

◆ pars_bigint_token

pars_res_word_t pars_bigint_token = {PARS_BIGINT_TOKEN}

◆ pars_binary_token

pars_res_word_t pars_binary_token = {PARS_BINARY_TOKEN}

◆ pars_blob_token

pars_res_word_t pars_blob_token = {PARS_BLOB_TOKEN}

◆ pars_char_token

pars_res_word_t pars_char_token = {PARS_CHAR_TOKEN}

◆ pars_close_token

pars_res_word_t pars_close_token = {PARS_CLOSE_TOKEN}

◆ pars_clustered_token

pars_res_word_t pars_clustered_token = {PARS_CLUSTERED_TOKEN}

◆ pars_concat_token

pars_res_word_t pars_concat_token = {PARS_CONCAT_TOKEN}

◆ pars_count_token

pars_res_word_t pars_count_token = {PARS_COUNT_TOKEN}

◆ pars_desc_token

pars_res_word_t pars_desc_token = {PARS_DESC_TOKEN}

◆ pars_distinct_token

pars_res_word_t pars_distinct_token = {PARS_DISTINCT_TOKEN}

◆ pars_float_token

pars_res_word_t pars_float_token = {PARS_FLOAT_TOKEN}

◆ pars_instr_token

pars_res_word_t pars_instr_token = {PARS_INSTR_TOKEN}

◆ pars_int_token

pars_res_word_t pars_int_token = {PARS_INT_TOKEN}

◆ pars_length_token

pars_res_word_t pars_length_token = {PARS_LENGTH_TOKEN}

◆ pars_mutex

ib_mutex_t pars_mutex

Mutex to protect the sql parser.

◆ pars_open_token

pars_res_word_t pars_open_token = {PARS_OPEN_TOKEN}

◆ pars_share_token

pars_res_word_t pars_share_token = {PARS_SHARE_TOKEN}

◆ pars_star_denoter

ulint pars_star_denoter = 12345678

Global variable used to denote the '*' in SELECT * FROM.

◆ pars_substr_token

pars_res_word_t pars_substr_token = {PARS_SUBSTR_TOKEN}

◆ pars_sum_token

pars_res_word_t pars_sum_token = {PARS_SUM_TOKEN}

◆ pars_sym_tab_global

sym_tab_t* pars_sym_tab_global

◆ pars_to_binary_token

pars_res_word_t pars_to_binary_token = {PARS_TO_BINARY_TOKEN}

◆ pars_unique_token

pars_res_word_t pars_unique_token = {PARS_UNIQUE_TOKEN}

◆ pars_update_token

pars_res_word_t pars_update_token = {PARS_UPDATE_TOKEN}