pars0sym.c

来自「这是linux下运行的mysql软件包,可用于linux 下安装 php + m」· C语言 代码 · 共 238 行

C
238
字号
/******************************************************SQL parser symbol table(c) 1997 Innobase OyCreated 12/15/1997 Heikki Tuuri*******************************************************/#include "pars0sym.h"#ifdef UNIV_NONINL#include "pars0sym.ic"#endif#include "mem0mem.h"#include "data0type.h"#include "data0data.h"#include "pars0pars.h"#include "que0que.h"#include "eval0eval.h"#include "row0sel.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 */{	sym_tab_t*	sym_tab;	sym_tab = mem_heap_alloc(heap, sizeof(sym_tab_t));	UT_LIST_INIT(sym_tab->sym_list);	UT_LIST_INIT(sym_tab->func_node_list);	sym_tab->heap = heap;	return(sym_tab);}/**********************************************************************Frees the memory allocated dynamically AFTER parsing phase for variablesetc. in the symbol table. Does not free the mem heap where the table wasoriginally created. Frees also SQL explicit cursor definitions. */voidsym_tab_free_private(/*=================*/	sym_tab_t*	sym_tab)	/* in, own: symbol table */{	sym_node_t*	sym;	func_node_t*	func;	sym = UT_LIST_GET_FIRST(sym_tab->sym_list);	while (sym) {		eval_node_free_val_buf(sym);		if (sym->prefetch_buf) {			sel_col_prefetch_buf_free(sym->prefetch_buf);		}		if (sym->cursor_def) {			que_graph_free_recursive(sym->cursor_def);		}				sym = UT_LIST_GET_NEXT(sym_list, sym);	}	func = UT_LIST_GET_FIRST(sym_tab->func_node_list);	while (func) {		eval_node_free_val_buf(func);		func = UT_LIST_GET_NEXT(func_node_list, func);	}}/**********************************************************************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 */{	sym_node_t*	node;	byte*		data;		node = mem_heap_alloc(sym_tab->heap, sizeof(sym_node_t));	node->common.type = QUE_NODE_SYMBOL;		node->resolved = TRUE;	node->token_type = SYM_LIT;	node->indirection = NULL;		dtype_set(&(node->common.val.type), DATA_INT, 0, 4, 0);	data = mem_heap_alloc(sym_tab->heap, 4);	mach_write_to_4(data, val);	dfield_set_data(&(node->common.val), data, 4);		node->common.val_buf_size = 0;	node->prefetch_buf = NULL;	node->cursor_def = NULL;	UT_LIST_ADD_LAST(sym_list, sym_tab->sym_list, node);	node->sym_table = sym_tab;		return(node);}/**********************************************************************Adds a 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 */{	sym_node_t*	node;	byte*		data;		node = mem_heap_alloc(sym_tab->heap, sizeof(sym_node_t));	node->common.type = QUE_NODE_SYMBOL;	node->resolved = TRUE;	node->token_type = SYM_LIT;	node->indirection = NULL;		dtype_set(&(node->common.val.type), DATA_VARCHAR, DATA_ENGLISH, 0, 0);	if (len) {		data = mem_heap_alloc(sym_tab->heap, len);		ut_memcpy(data, str, len);	} else {		data = NULL;	}	dfield_set_data(&(node->common.val), data, len);	node->common.val_buf_size = 0;	node->prefetch_buf = NULL;	node->cursor_def = NULL;		UT_LIST_ADD_LAST(sym_list, sym_tab->sym_list, node);	node->sym_table = sym_tab;	return(node);}/**********************************************************************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 */{	sym_node_t*	node;		node = mem_heap_alloc(sym_tab->heap, sizeof(sym_node_t));	node->common.type = QUE_NODE_SYMBOL;		node->resolved = TRUE;	node->token_type = SYM_LIT;	node->indirection = NULL;		node->common.val.type.mtype = DATA_ERROR;	dfield_set_data(&(node->common.val), NULL, UNIV_SQL_NULL);	node->common.val_buf_size = 0;	node->prefetch_buf = NULL;	node->cursor_def = NULL;		UT_LIST_ADD_LAST(sym_list, sym_tab->sym_list, node);	node->sym_table = sym_tab;	return(node);}/**********************************************************************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 */{	sym_node_t*	node;		node = mem_heap_alloc(sym_tab->heap, sizeof(sym_node_t));	node->common.type = QUE_NODE_SYMBOL;		node->resolved = FALSE;	node->indirection = NULL;	node->name = mem_heap_strdupl(sym_tab->heap, (char*) name, len + 1);	node->name_len = len;	UT_LIST_ADD_LAST(sym_list, sym_tab->sym_list, node);	dfield_set_data(&(node->common.val), NULL, UNIV_SQL_NULL);	node->common.val_buf_size = 0;	node->prefetch_buf = NULL;	node->cursor_def = NULL;		node->sym_table = sym_tab;	return(node);}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?