mirror of
https://github.com/MariaDB/server.git
synced 2025-01-23 07:14:17 +01:00
2dca2a1a5d
Fixed BUG#19542 "InnoDB doesn't increase the Handler_read_prev couter". Fixed BUG#19609 "Case sensitivity of innodb_data_file_path gives stupid error". Fixed BUG#19727 "InnoDB crashed server and crashed tables are ot recoverable". Also: * Remove remnants of the obsolete concept of memoryfixing tables and indexes. * Remove unused dict_table_LRU_trim(). * Remove unused 'trx' parameter from dict_table_get_on_id_low(), dict_table_get(), dict_table_get_and_increment_handle_count(). * Add a normal linked list implementation. * Add a work queue implementation. * Add 'level' parameter to mutex_create() and rw_lock_create(). Remove mutex_set_level() and rw_lock_set_level(). * Rename SYNC_LEVEL_NONE to SYNC_LEVEL_VARYING. * Add support for bound ids in InnoDB's parser. * Define UNIV_BTR_DEBUG for enabling consistency checks of FIL_PAGE_NEXT and FIL_PAGE_PREV when accessing sibling pages of B-tree indexes. btr_validate_level(): Check the validity of the doubly linked list formed by FIL_PAGE_NEXT and FIL_PAGE_PREV. * Adapt InnoDB to the new tablename to filename encoding in MySQL 5.1. ut_print_name(), ut_print_name1(): Add parameter 'table_id' for distinguishing names of tables from other identifiers. New: innobase_convert_from_table_id(), innobase_convert_from_id(), innobase_convert_from_filename(), innobase_get_charset. dict_accept(), dict_scan_id(), dict_scan_col(), dict_scan_table_name(), dict_skip_word(), dict_create_foreign_constraints_low(): Add parameter 'cs' so that isspace() can be replaced with my_isspace(), whose operation depends on the connection character set. dict_scan_id(): Convert identifier to UTF-8. dict_str_starts_with_keyword(): New extern function, to replace dict_accept() in row_search_for_mysql(). mysql_get_identifier_quote_char(): Replaced with innobase_print_identifier(). ha_innobase::create(): Remove the thd->convert_strin() call. Pass the statement to InnoDB in the connection character set and let InnoDB convert the identifier to UTF-8. * Add max_row_size to dict_table_t. * btr0cur.c btr_copy_externally_stored_field(): Only set the 'offset' variable when needed. * buf0buf.c buf_page_io_complete(): Write to the error log if the page number or the space id o the disk do not match those in memory. Also write to the error log if a page was read from the doublewrite buffer. The doublewrite buffer should be only read by the lower-level function fil_io() at database startup. * dict0dict.c dict_scan_table_name(): Remove fallback to differently encoded name when the table is not found. The encoding is handled at a higher level. * ha_innodb.cc Increment statistic counter in ha_innobase::index_prev() (bug 19542). Add innobase_convert_string wrapper function and a new file ha_prototypes.h. innobase_print_identifier(): Remove TODO comment before calling get_quote_char_for_identifier(). That function apparently assumes the identifier to be encoded in UTF-8. * ibuf0ibuf.c|h ibuf_count_get(), ibuf_counts[], ibuf_count_inited(): Define these only #ifdef UNIV_IBUF_DEBUG. Previously, when compiled without UNIV_IBUF_DEBUG, invoking ibuf_count_get() would crash InnoDB. The function is only being called #ifdef UNIV_IBUF_DEBUG. * innodb.result Adjust the results for changes in the foreign key error messages. * mem0mem.c|h New: mem_heap_dup(), mem_heap_printf(), mem_heap_cat(). * os0file.c Check the page trailers also after writing to disk. This improves chances of diagnosing bug 18886. os_file_check_page_trailers(): New function for checking that the two copies of the LSN stamped on the page match. os_aio_simulated_handle(): Call os_file_check_page_trailers() before and after os_file_write(). * row0mysql.c Move trx_commit_for_mysql(trx) calls before calls to row_mysql_unlock_data_dictionary(trx) (bug 19727). * row0sel.c row_fetch_print(): Handle SQL NULL values without crashing. row_sel_store_mysql_rec(): Remove useless call to rec_get_nth_field when handling an externally stored column. Fetch externally stored fields when using InnoDB's internal SQL parser. Optimize BLOB selects by using prebuilt->blob_heap directly instead of first reading BLOB data to a temporary heap and then copying it to prebuilt->blob_heap. * srv0srv.c srv_master_thread(): Remove unreachable code. * srv0start.c srv_parse_data_file_paths_and_sizes(): Accept lower-case 'm' and 'g' as abbreviations of megabyte and gigabyte (bug 19609). srv_parse_megabytes(): New fuction. * ut0dbg.c|h Implement InnoDB assertions (ut_a and ut_error) with abort() when the code is compiled with GCC 3 or later on other platforms than Windows or Netware. Also disable the variable ut_dbg_stop_threads and the function ut_dbg_stop_thread() i this case, unless UNIV_SYC_DEBUG is defined. This should allow the compiler to generate more compact code for assertions. * ut0list.c|h Add ib_list_create_heap(). mysql-test/r/innodb.result: Applied innodb-5.1-ss594 snapshot. mysql-test/t/innodb.test: Copy the comment from the beginning of the file to the end because MySQL developers continue adding test cases to this file. sql/ha_innodb.cc: Applied innodb-5.1-ss594 snapshot. storage/innobase/CMakeLists.txt: Applied innodb-5.1-ss594 snapshot. storage/innobase/Makefile.am: Applied innodb-5.1-ss594 snapshot. storage/innobase/btr/btr0btr.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/btr/btr0cur.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/btr/btr0pcur.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/btr/btr0sea.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/buf/buf0buf.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/buf/buf0flu.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/data/data0type.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/dict/dict0crea.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/dict/dict0dict.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/dict/dict0load.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/dict/dict0mem.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/fil/fil0fil.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/ha/hash0hash.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/ibuf/ibuf0ibuf.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/data0type.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/dict0dict.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/dict0dict.ic: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/dict0mem.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/fil0fil.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/fsp0fsp.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/ibuf0ibuf.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/mem0mem.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/pars0pars.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/pars0sym.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/pars0types.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/rem0rec.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/row0purge.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/row0undo.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/srv0srv.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/sync0rw.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/sync0sync.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/univ.i: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/ut0dbg.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/ut0ut.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/lock/lock0lock.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/log/log0log.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/log/log0recv.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/mem/mem0dbg.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/mem/mem0mem.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/mem/mem0pool.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/os/os0file.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/os/os0thread.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/pars/lexyy.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/pars/pars0lex.l: Applied innodb-5.1-ss594 snapshot. storage/innobase/pars/pars0pars.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/pars/pars0sym.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/row/row0ins.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/row/row0mysql.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/row/row0purge.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/row/row0row.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/row/row0sel.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/row/row0upd.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/srv/srv0srv.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/srv/srv0start.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/sync/sync0arr.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/sync/sync0rw.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/sync/sync0sync.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/thr/thr0loc.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/trx/trx0purge.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/trx/trx0rec.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/trx/trx0roll.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/trx/trx0rseg.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/trx/trx0sys.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/trx/trx0trx.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/ut/Makefile.am: Applied innodb-5.1-ss594 snapshot. storage/innobase/ut/ut0dbg.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/ut/ut0ut.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/ha_prototypes.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/ut0list.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/ut0list.ic: Applied innodb-5.1-ss594 snapshot. storage/innobase/include/ut0wqueue.h: Applied innodb-5.1-ss594 snapshot. storage/innobase/ut/ut0list.c: Applied innodb-5.1-ss594 snapshot. storage/innobase/ut/ut0wqueue.c: Applied innodb-5.1-ss594 snapshot.
352 lines
7.5 KiB
C
352 lines
7.5 KiB
C
/******************************************************
|
|
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"
|
|
#include "pars0grm.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 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);
|
|
}
|
|
|
|
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);
|
|
}
|
|
|
|
/**********************************************************************
|
|
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;
|
|
ulint len = 0;
|
|
|
|
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;
|
|
|
|
case DATA_VARCHAR:
|
|
*lit_type = PARS_STR_LIT;
|
|
break;
|
|
|
|
case DATA_CHAR:
|
|
ut_a(blit->length > 0);
|
|
|
|
len = blit->length;
|
|
*lit_type = PARS_STR_LIT;
|
|
break;
|
|
|
|
case DATA_INT:
|
|
ut_a(blit->length > 0);
|
|
ut_a(blit->length <= 8);
|
|
|
|
len = blit->length;
|
|
*lit_type = PARS_INT_LIT;
|
|
break;
|
|
|
|
default:
|
|
ut_error;
|
|
}
|
|
|
|
dtype_set(&(node->common.val.type), blit->type, blit->prtype, len, 0);
|
|
|
|
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);
|
|
}
|
|
|
|
/**********************************************************************
|
|
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);
|
|
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);
|
|
}
|
|
|
|
/**********************************************************************
|
|
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);
|
|
}
|