2005-10-27 07:29:40 +00:00
|
|
|
/******************************************************
|
|
|
|
SQL parser symbol table
|
|
|
|
|
|
|
|
(c) 1997 Innobase Oy
|
|
|
|
|
|
|
|
Created 12/15/1997 Heikki Tuuri
|
|
|
|
*******************************************************/
|
|
|
|
|
|
|
|
#include "pars0sym.h"
|
|
|
|
|
|
|
|
#ifdef UNIV_NONINL
|
|
|
|
#include "pars0sym.ic"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "mem0mem.h"
|
|
|
|
#include "data0type.h"
|
|
|
|
#include "data0data.h"
|
2006-04-01 06:06:59 +00:00
|
|
|
#include "pars0grm.h"
|
2005-10-27 07:29:40 +00:00
|
|
|
#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 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 */
|
|
|
|
{
|
|
|
|
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);
|
|
|
|
}
|
2006-02-21 12:37:54 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
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;
|
2006-02-21 12:37:54 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
node = mem_heap_alloc(sym_tab->heap, sizeof(sym_node_t));
|
|
|
|
|
|
|
|
node->common.type = QUE_NODE_SYMBOL;
|
2006-02-21 12:37:54 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
node->resolved = TRUE;
|
|
|
|
node->token_type = SYM_LIT;
|
|
|
|
|
|
|
|
node->indirection = NULL;
|
2006-02-21 12:37:54 +00:00
|
|
|
|
Reduce the size of the data dictionary cache. (Bug #20877)
dtype_t: Remove unused field "prec", which was supposed to be used for
the precision of decimal columns in stand-alone InnoDB.
dtype_get_prec(): Remove.
dtype_set(), dict_mem_table_add_col(): Remove parameter "prec".
dtype_t: Turn all fields (mtype, prtype, len, mbminlen, mbmaxlen, len)
into bit-fields.
dict_table_t, dict_index_t, dict_tree_t: Omit magic_n from non-debug builds.
dict_col_t: Turn ind, clust_pos, and ord_part into bit-fields.
Replace the default clust_pos value ULINT_UNDEFINED with
REC_MAX_N_FIELDS and replace all references to clust_pos with calls to
the accessor function dict_col_get_clust_pos().
dict_field_t: Turn prefix_len and fixed_len into bit-fields.
dict_tree_t: Remove pad[64].
dict_table_t: Turn the fields ibd_file_missing, tablespace_discarded,
cached, flags, stat_initialized, and autoinc_inited into bit-fields.
Remove does_not_fit_in_memory from non-debug builds.
dict_index_t: Turn the fields trx_id_offset, n_user_defined_cols,
n_uniq, n_def, n_fields, n_nullable, and cached into bit-fields.
dict_foreign_struct: Turn n_fields and type into bit-fields.
rw_lock_t: Turn cline, last_s_line, and last_x_line into bit-fields.
Omit level unless #defined UNIV_SYNC_DEBUG.
Move REC_MAX_N_FIELDS (and REC_MAX_HEAP_NO and REC_MAX_N_OWNED)
from rem0rec.c to rem0types.h, as they are needed in dict0dict.ic.
dict_col_get_clust_pos(): Map REC_MAX_N_FIELDS to ULINT_UNDEFINED.
2006-09-12 14:06:46 +00:00
|
|
|
dtype_set(&(node->common.val.type), DATA_INT, 0, 4);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
data = mem_heap_alloc(sym_tab->heap, 4);
|
|
|
|
mach_write_to_4(data, val);
|
|
|
|
|
|
|
|
dfield_set_data(&(node->common.val), data, 4);
|
2006-02-21 12:37:54 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
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;
|
2006-02-21 12:37:54 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
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;
|
2006-02-21 12:37:54 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
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;
|
2006-02-21 12:37:54 +00:00
|
|
|
|
Reduce the size of the data dictionary cache. (Bug #20877)
dtype_t: Remove unused field "prec", which was supposed to be used for
the precision of decimal columns in stand-alone InnoDB.
dtype_get_prec(): Remove.
dtype_set(), dict_mem_table_add_col(): Remove parameter "prec".
dtype_t: Turn all fields (mtype, prtype, len, mbminlen, mbmaxlen, len)
into bit-fields.
dict_table_t, dict_index_t, dict_tree_t: Omit magic_n from non-debug builds.
dict_col_t: Turn ind, clust_pos, and ord_part into bit-fields.
Replace the default clust_pos value ULINT_UNDEFINED with
REC_MAX_N_FIELDS and replace all references to clust_pos with calls to
the accessor function dict_col_get_clust_pos().
dict_field_t: Turn prefix_len and fixed_len into bit-fields.
dict_tree_t: Remove pad[64].
dict_table_t: Turn the fields ibd_file_missing, tablespace_discarded,
cached, flags, stat_initialized, and autoinc_inited into bit-fields.
Remove does_not_fit_in_memory from non-debug builds.
dict_index_t: Turn the fields trx_id_offset, n_user_defined_cols,
n_uniq, n_def, n_fields, n_nullable, and cached into bit-fields.
dict_foreign_struct: Turn n_fields and type into bit-fields.
rw_lock_t: Turn cline, last_s_line, and last_x_line into bit-fields.
Omit level unless #defined UNIV_SYNC_DEBUG.
Move REC_MAX_N_FIELDS (and REC_MAX_HEAP_NO and REC_MAX_N_OWNED)
from rem0rec.c to rem0types.h, as they are needed in dict0dict.ic.
dict_col_get_clust_pos(): Map REC_MAX_N_FIELDS to ULINT_UNDEFINED.
2006-09-12 14:06:46 +00:00
|
|
|
dtype_set(&(node->common.val.type), DATA_VARCHAR, DATA_ENGLISH, 0);
|
2005-10-27 07:29:40 +00:00
|
|
|
|
|
|
|
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;
|
2006-02-21 12:37:54 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
UT_LIST_ADD_LAST(sym_list, sym_tab->sym_list, node);
|
|
|
|
|
|
|
|
node->sym_table = sym_tab;
|
|
|
|
|
|
|
|
return(node);
|
|
|
|
}
|
|
|
|
|
2006-04-01 06:06:59 +00:00
|
|
|
/**********************************************************************
|
|
|
|
Add a bound literal to a symbol table. */
|
|
|
|
|
|
|
|
sym_node_t*
|
|
|
|
sym_tab_add_bound_lit(
|
|
|
|
/*==================*/
|
|
|
|
/* out: symbol table node */
|
|
|
|
sym_tab_t* sym_tab, /* in: symbol table */
|
|
|
|
const char* name, /* in: name of bound literal */
|
|
|
|
ulint* lit_type) /* out: type of literal (PARS_*_LIT) */
|
|
|
|
{
|
|
|
|
sym_node_t* node;
|
|
|
|
pars_bound_lit_t* blit;
|
2006-04-04 05:05:19 +00:00
|
|
|
ulint len = 0;
|
2006-04-01 06:06:59 +00:00
|
|
|
|
|
|
|
blit = pars_info_get_bound_lit(sym_tab->info, name);
|
|
|
|
ut_a(blit);
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
|
|
|
switch (blit->type) {
|
|
|
|
case DATA_FIXBINARY:
|
|
|
|
len = blit->length;
|
|
|
|
*lit_type = PARS_FIXBINARY_LIT;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case DATA_BLOB:
|
|
|
|
*lit_type = PARS_BLOB_LIT;
|
|
|
|
break;
|
2006-04-01 09:41:58 +00:00
|
|
|
|
|
|
|
case DATA_VARCHAR:
|
|
|
|
*lit_type = PARS_STR_LIT;
|
|
|
|
break;
|
2006-04-01 06:06:59 +00:00
|
|
|
|
2006-05-10 06:37:13 +00:00
|
|
|
case DATA_CHAR:
|
|
|
|
ut_a(blit->length > 0);
|
|
|
|
|
|
|
|
len = blit->length;
|
|
|
|
*lit_type = PARS_STR_LIT;
|
|
|
|
break;
|
|
|
|
|
2006-04-01 06:06:59 +00:00
|
|
|
case DATA_INT:
|
2006-04-04 05:05:19 +00:00
|
|
|
ut_a(blit->length > 0);
|
2006-04-01 06:06:59 +00:00
|
|
|
ut_a(blit->length <= 8);
|
2006-04-04 05:05:19 +00:00
|
|
|
|
2006-04-01 06:06:59 +00:00
|
|
|
len = blit->length;
|
|
|
|
*lit_type = PARS_INT_LIT;
|
|
|
|
break;
|
|
|
|
|
|
|
|
default:
|
|
|
|
ut_error;
|
|
|
|
}
|
|
|
|
|
Reduce the size of the data dictionary cache. (Bug #20877)
dtype_t: Remove unused field "prec", which was supposed to be used for
the precision of decimal columns in stand-alone InnoDB.
dtype_get_prec(): Remove.
dtype_set(), dict_mem_table_add_col(): Remove parameter "prec".
dtype_t: Turn all fields (mtype, prtype, len, mbminlen, mbmaxlen, len)
into bit-fields.
dict_table_t, dict_index_t, dict_tree_t: Omit magic_n from non-debug builds.
dict_col_t: Turn ind, clust_pos, and ord_part into bit-fields.
Replace the default clust_pos value ULINT_UNDEFINED with
REC_MAX_N_FIELDS and replace all references to clust_pos with calls to
the accessor function dict_col_get_clust_pos().
dict_field_t: Turn prefix_len and fixed_len into bit-fields.
dict_tree_t: Remove pad[64].
dict_table_t: Turn the fields ibd_file_missing, tablespace_discarded,
cached, flags, stat_initialized, and autoinc_inited into bit-fields.
Remove does_not_fit_in_memory from non-debug builds.
dict_index_t: Turn the fields trx_id_offset, n_user_defined_cols,
n_uniq, n_def, n_fields, n_nullable, and cached into bit-fields.
dict_foreign_struct: Turn n_fields and type into bit-fields.
rw_lock_t: Turn cline, last_s_line, and last_x_line into bit-fields.
Omit level unless #defined UNIV_SYNC_DEBUG.
Move REC_MAX_N_FIELDS (and REC_MAX_HEAP_NO and REC_MAX_N_OWNED)
from rem0rec.c to rem0types.h, as they are needed in dict0dict.ic.
dict_col_get_clust_pos(): Map REC_MAX_N_FIELDS to ULINT_UNDEFINED.
2006-09-12 14:06:46 +00:00
|
|
|
dtype_set(&(node->common.val.type), blit->type, blit->prtype, len);
|
2006-04-01 06:06:59 +00:00
|
|
|
|
|
|
|
dfield_set_data(&(node->common.val), blit->address, blit->length);
|
|
|
|
|
|
|
|
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);
|
|
|
|
}
|
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
/**********************************************************************
|
|
|
|
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;
|
2006-02-21 12:37:54 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
node = mem_heap_alloc(sym_tab->heap, sizeof(sym_node_t));
|
|
|
|
|
|
|
|
node->common.type = QUE_NODE_SYMBOL;
|
2006-02-21 12:37:54 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
node->resolved = TRUE;
|
|
|
|
node->token_type = SYM_LIT;
|
|
|
|
|
|
|
|
node->indirection = NULL;
|
2006-02-21 12:37:54 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
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;
|
2006-02-21 12:37:54 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
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;
|
2006-02-21 12:37:54 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
node = mem_heap_alloc(sym_tab->heap, sizeof(sym_node_t));
|
|
|
|
|
|
|
|
node->common.type = QUE_NODE_SYMBOL;
|
2006-02-21 12:37:54 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
node->resolved = FALSE;
|
|
|
|
node->indirection = NULL;
|
|
|
|
|
2006-03-28 09:35:33 +00:00
|
|
|
node->name = mem_heap_strdupl(sym_tab->heap, (char*) name, len);
|
2005-10-27 07:29:40 +00:00
|
|
|
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;
|
2006-02-21 12:37:54 +00:00
|
|
|
|
2005-10-27 07:29:40 +00:00
|
|
|
node->sym_table = sym_tab;
|
|
|
|
|
|
|
|
return(node);
|
|
|
|
}
|
2006-05-08 05:13:09 +00:00
|
|
|
|
|
|
|
/**********************************************************************
|
|
|
|
Add a bound identifier to a symbol table. */
|
|
|
|
|
|
|
|
sym_node_t*
|
|
|
|
sym_tab_add_bound_id(
|
|
|
|
/*===========*/
|
|
|
|
/* out: symbol table node */
|
|
|
|
sym_tab_t* sym_tab, /* in: symbol table */
|
|
|
|
const char* name) /* in: name of bound id */
|
|
|
|
{
|
|
|
|
sym_node_t* node;
|
|
|
|
pars_bound_id_t* bid;
|
|
|
|
|
|
|
|
bid = pars_info_get_bound_id(sym_tab->info, name);
|
|
|
|
ut_a(bid);
|
|
|
|
|
|
|
|
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_strdup(sym_tab->heap, bid->id);
|
|
|
|
node->name_len = strlen(node->name);
|
|
|
|
|
|
|
|
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);
|
|
|
|
}
|