mirror of
https://github.com/MariaDB/server.git
synced 2025-12-16 22:03:23 +03:00
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.
224 lines
7.0 KiB
C
224 lines
7.0 KiB
C
/******************************************************
|
|
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 */
|
|
/**********************************************************************
|
|
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) */
|
|
/**********************************************************************
|
|
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 */
|
|
|
|
/**********************************************************************
|
|
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 */
|
|
|
|
#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 */
|
|
|
|
/* 'alias' and 'indirection' are almost the same, but not quite.
|
|
'alias' always points to the primary instance of the variable, while
|
|
'indirection' does the same only if we should use the primary
|
|
instance's values for the node's data. This is usually the case, but
|
|
when initializing a cursor (e.g., "DECLARE CURSOR c IS SELECT * FROM
|
|
t WHERE id = x;"), we copy the values from the primary instance to
|
|
the cursor's instance so that they are fixed for the duration of the
|
|
cursor, and set 'indirection' to NULL. If we did not, the value of
|
|
'x' could change between fetches and things would break horribly.
|
|
|
|
TODO: It would be cleaner to make 'indirection' a boolean field and
|
|
always use 'alias' to refer to the primary node. */
|
|
|
|
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, ... */
|
|
const 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 */
|
|
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 */
|
|
const char* sql_string;
|
|
/* SQL string to parse */
|
|
size_t string_len;
|
|
/* SQL string length */
|
|
int next_char_pos;
|
|
/* position of the next character in
|
|
sql_string to give to the lexical
|
|
analyzer */
|
|
pars_info_t* info; /* extra information, or NULL */
|
|
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 */
|
|
#define SYM_FUNCTION 99 /* user function name */
|
|
|
|
#ifndef UNIV_NONINL
|
|
#include "pars0sym.ic"
|
|
#endif
|
|
|
|
#endif
|