2001-02-17 14:19:19 +02:00
|
|
|
/******************************************************
|
|
|
|
SQL evaluator: evaluates simple data structures, like expressions, in
|
|
|
|
a query graph
|
|
|
|
|
|
|
|
(c) 1997 Innobase Oy
|
|
|
|
|
|
|
|
Created 12/29/1997 Heikki Tuuri
|
|
|
|
*******************************************************/
|
|
|
|
|
|
|
|
#include "eval0eval.h"
|
|
|
|
|
|
|
|
#ifdef UNIV_NONINL
|
|
|
|
#include "eval0eval.ic"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include "data0data.h"
|
|
|
|
#include "row0sel.h"
|
|
|
|
|
|
|
|
/* The RND function seed */
|
|
|
|
ulint eval_rnd = 128367121;
|
|
|
|
|
|
|
|
/* Dummy adress used when we should allocate a buffer of size 0 in
|
|
|
|
the function below */
|
|
|
|
|
|
|
|
byte eval_dummy;
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Allocate a buffer from global dynamic memory for a value of a que_node.
|
|
|
|
NOTE that this memory must be explicitly freed when the query graph is
|
|
|
|
freed. If the node already has an allocated buffer, that buffer is freed
|
|
|
|
here. NOTE that this is the only function where dynamic memory should be
|
|
|
|
allocated for a query node val field. */
|
|
|
|
|
|
|
|
byte*
|
|
|
|
eval_node_alloc_val_buf(
|
|
|
|
/*====================*/
|
|
|
|
/* out: pointer to allocated buffer */
|
|
|
|
que_node_t* node, /* in: query graph node; sets the val field
|
|
|
|
data field to point to the new buffer, and
|
|
|
|
len field equal to size */
|
|
|
|
ulint size) /* in: buffer size */
|
|
|
|
{
|
|
|
|
dfield_t* dfield;
|
|
|
|
byte* data;
|
|
|
|
|
|
|
|
ut_ad(que_node_get_type(node) == QUE_NODE_SYMBOL
|
|
|
|
|| que_node_get_type(node) == QUE_NODE_FUNC);
|
|
|
|
|
|
|
|
dfield = que_node_get_val(node);
|
|
|
|
|
|
|
|
data = dfield_get_data(dfield);
|
|
|
|
|
|
|
|
if (data && data != &eval_dummy) {
|
|
|
|
mem_free(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (size == 0) {
|
|
|
|
data = &eval_dummy;
|
|
|
|
} else {
|
|
|
|
data = mem_alloc(size);
|
|
|
|
}
|
|
|
|
|
|
|
|
que_node_set_val_buf_size(node, size);
|
|
|
|
|
|
|
|
dfield_set_data(dfield, data, size);
|
|
|
|
|
|
|
|
return(data);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Free the buffer from global dynamic memory for a value of a que_node,
|
|
|
|
if it has been allocated in the above function. The freeing for pushed
|
|
|
|
column values is done in sel_col_prefetch_buf_free. */
|
|
|
|
|
|
|
|
void
|
|
|
|
eval_node_free_val_buf(
|
|
|
|
/*===================*/
|
|
|
|
que_node_t* node) /* in: query graph node */
|
|
|
|
{
|
|
|
|
dfield_t* dfield;
|
|
|
|
byte* data;
|
|
|
|
|
|
|
|
ut_ad(que_node_get_type(node) == QUE_NODE_SYMBOL
|
|
|
|
|| que_node_get_type(node) == QUE_NODE_FUNC);
|
|
|
|
|
|
|
|
dfield = que_node_get_val(node);
|
|
|
|
|
|
|
|
data = dfield_get_data(dfield);
|
|
|
|
|
|
|
|
if (que_node_get_val_buf_size(node) > 0) {
|
|
|
|
ut_a(data);
|
|
|
|
|
|
|
|
mem_free(data);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Evaluates a comparison node. */
|
|
|
|
|
|
|
|
ibool
|
|
|
|
eval_cmp(
|
|
|
|
/*=====*/
|
|
|
|
/* out: the result of the comparison */
|
|
|
|
func_node_t* cmp_node) /* in: comparison node */
|
|
|
|
{
|
|
|
|
que_node_t* arg1;
|
|
|
|
que_node_t* arg2;
|
|
|
|
int res;
|
|
|
|
ibool val;
|
|
|
|
int func;
|
|
|
|
|
|
|
|
ut_ad(que_node_get_type(cmp_node) == QUE_NODE_FUNC);
|
|
|
|
|
|
|
|
arg1 = cmp_node->args;
|
|
|
|
arg2 = que_node_get_next(arg1);
|
|
|
|
|
|
|
|
res = cmp_dfield_dfield(que_node_get_val(arg1),
|
|
|
|
que_node_get_val(arg2));
|
|
|
|
val = TRUE;
|
|
|
|
|
|
|
|
func = cmp_node->func;
|
|
|
|
|
|
|
|
if (func == '=') {
|
|
|
|
if (res != 0) {
|
|
|
|
val = FALSE;
|
|
|
|
}
|
|
|
|
} else if (func == '<') {
|
|
|
|
if (res != -1) {
|
|
|
|
val = FALSE;
|
|
|
|
}
|
|
|
|
} else if (func == PARS_LE_TOKEN) {
|
|
|
|
if (res == 1) {
|
|
|
|
val = FALSE;
|
|
|
|
}
|
|
|
|
} else if (func == PARS_NE_TOKEN) {
|
|
|
|
if (res == 0) {
|
|
|
|
val = FALSE;
|
|
|
|
}
|
|
|
|
} else if (func == PARS_GE_TOKEN) {
|
|
|
|
if (res == -1) {
|
|
|
|
val = FALSE;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
ut_ad(func == '>');
|
|
|
|
|
|
|
|
if (res != 1) {
|
|
|
|
val = FALSE;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
eval_node_set_ibool_val(cmp_node, val);
|
|
|
|
|
|
|
|
return(val);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Evaluates a logical operation node. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
eval_logical(
|
|
|
|
/*=========*/
|
|
|
|
func_node_t* logical_node) /* in: logical operation node */
|
|
|
|
{
|
|
|
|
que_node_t* arg1;
|
|
|
|
que_node_t* arg2;
|
|
|
|
ibool val1;
|
2001-11-05 23:48:03 +02:00
|
|
|
ibool val2 = 0; /* remove warning */
|
|
|
|
ibool val = 0; /* remove warning */
|
2001-02-17 14:19:19 +02:00
|
|
|
int func;
|
|
|
|
|
|
|
|
ut_ad(que_node_get_type(logical_node) == QUE_NODE_FUNC);
|
|
|
|
|
|
|
|
arg1 = logical_node->args;
|
|
|
|
arg2 = que_node_get_next(arg1); /* arg2 is NULL if func is 'NOT' */
|
|
|
|
|
|
|
|
val1 = eval_node_get_ibool_val(arg1);
|
|
|
|
|
|
|
|
if (arg2) {
|
|
|
|
val2 = eval_node_get_ibool_val(arg2);
|
|
|
|
}
|
|
|
|
|
|
|
|
func = logical_node->func;
|
|
|
|
|
|
|
|
if (func == PARS_AND_TOKEN) {
|
|
|
|
val = val1 & val2;
|
|
|
|
} else if (func == PARS_OR_TOKEN) {
|
|
|
|
val = val1 | val2;
|
|
|
|
} else if (func == PARS_NOT_TOKEN) {
|
|
|
|
val = TRUE - val1;
|
|
|
|
} else {
|
|
|
|
ut_error;
|
|
|
|
}
|
|
|
|
|
|
|
|
eval_node_set_ibool_val(logical_node, val);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Evaluates an arithmetic operation node. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
eval_arith(
|
|
|
|
/*=======*/
|
|
|
|
func_node_t* arith_node) /* in: arithmetic operation node */
|
|
|
|
{
|
|
|
|
que_node_t* arg1;
|
|
|
|
que_node_t* arg2;
|
|
|
|
lint val1;
|
2001-11-05 23:48:03 +02:00
|
|
|
lint val2 = 0; /* remove warning */
|
2001-02-17 14:19:19 +02:00
|
|
|
lint val;
|
|
|
|
int func;
|
|
|
|
|
|
|
|
ut_ad(que_node_get_type(arith_node) == QUE_NODE_FUNC);
|
|
|
|
|
|
|
|
arg1 = arith_node->args;
|
|
|
|
arg2 = que_node_get_next(arg1); /* arg2 is NULL if func is unary '-' */
|
|
|
|
|
|
|
|
val1 = eval_node_get_int_val(arg1);
|
|
|
|
|
|
|
|
if (arg2) {
|
|
|
|
val2 = eval_node_get_int_val(arg2);
|
|
|
|
}
|
|
|
|
|
|
|
|
func = arith_node->func;
|
|
|
|
|
|
|
|
if (func == '+') {
|
|
|
|
val = val1 + val2;
|
|
|
|
} else if ((func == '-') && arg2) {
|
|
|
|
val = val1 - val2;
|
|
|
|
} else if (func == '-') {
|
|
|
|
val = -val1;
|
|
|
|
} else if (func == '*') {
|
|
|
|
val = val1 * val2;
|
|
|
|
} else {
|
|
|
|
ut_ad(func == '/');
|
|
|
|
val = val1 / val2;
|
|
|
|
}
|
|
|
|
|
|
|
|
eval_node_set_int_val(arith_node, val);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Evaluates an aggregate operation node. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
eval_aggregate(
|
|
|
|
/*===========*/
|
|
|
|
func_node_t* node) /* in: aggregate operation node */
|
|
|
|
{
|
|
|
|
que_node_t* arg;
|
|
|
|
lint val;
|
|
|
|
lint arg_val;
|
|
|
|
int func;
|
|
|
|
|
|
|
|
ut_ad(que_node_get_type(node) == QUE_NODE_FUNC);
|
|
|
|
|
|
|
|
val = eval_node_get_int_val(node);
|
|
|
|
|
|
|
|
func = node->func;
|
|
|
|
|
|
|
|
if (func == PARS_COUNT_TOKEN) {
|
|
|
|
|
|
|
|
val = val + 1;
|
|
|
|
} else {
|
|
|
|
ut_ad(func == PARS_SUM_TOKEN);
|
|
|
|
|
|
|
|
arg = node->args;
|
|
|
|
arg_val = eval_node_get_int_val(arg);
|
|
|
|
|
|
|
|
val = val + arg_val;
|
|
|
|
}
|
|
|
|
|
|
|
|
eval_node_set_int_val(node, val);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Evaluates a predefined function node where the function is not relevant
|
|
|
|
in benchmarks. */
|
|
|
|
static
|
|
|
|
void
|
|
|
|
eval_predefined_2(
|
|
|
|
/*==============*/
|
|
|
|
func_node_t* func_node) /* in: predefined function node */
|
|
|
|
{
|
|
|
|
que_node_t* arg;
|
|
|
|
que_node_t* arg1;
|
2001-11-05 23:48:03 +02:00
|
|
|
que_node_t* arg2 = 0; /* remove warning (??? bug ???) */
|
2001-02-17 14:19:19 +02:00
|
|
|
lint int_val;
|
|
|
|
byte* data;
|
|
|
|
ulint len1;
|
|
|
|
ulint len2;
|
|
|
|
int func;
|
|
|
|
ulint i;
|
|
|
|
|
|
|
|
ut_ad(que_node_get_type(func_node) == QUE_NODE_FUNC);
|
|
|
|
|
|
|
|
arg1 = func_node->args;
|
|
|
|
|
|
|
|
if (arg1) {
|
|
|
|
arg2 = que_node_get_next(arg1);
|
|
|
|
}
|
|
|
|
|
|
|
|
func = func_node->func;
|
|
|
|
|
|
|
|
if (func == PARS_PRINTF_TOKEN) {
|
|
|
|
|
|
|
|
arg = arg1;
|
|
|
|
|
|
|
|
while (arg) {
|
|
|
|
dfield_print(que_node_get_val(arg));
|
|
|
|
|
|
|
|
arg = que_node_get_next(arg);
|
|
|
|
}
|
|
|
|
|
InnoDB: send diagnostic output to stderr or files
instead of stdout or fixed-size memory buffers
innobase/btr/btr0btr.c:
Output to stderr; quote table and index names
innobase/btr/btr0cur.c:
Output to stderr; quote table and index names
innobase/btr/btr0sea.c:
Output to stderr
innobase/buf/buf0buf.c:
Output to stderr; quote table and index names
innobase/buf/buf0flu.c:
Output to stderr
innobase/buf/buf0lru.c:
Output to stderr
innobase/buf/buf0rea.c:
Output to stderr
innobase/data/data0data.c:
Remove dtuple_validate() unless #ifdef UNIV_DEBUG
Remove unnecessary sprintf() calls
Output to stderr
innobase/data/data0type.c:
Output to stderr
innobase/dict/dict0boot.c:
Remove dummy call to printf()
innobase/dict/dict0crea.c:
Output diagnostic information to stream, not to memory
innobase/dict/dict0dict.c:
Output diagnostics to a file, not to a memory buffer
innobase/dict/dict0load.c:
Output to stderr; quote table and index names
innobase/eval/eval0eval.c:
Output to stderr
innobase/fil/fil0fil.c:
Output to stderr
innobase/fsp/fsp0fsp.c:
Output to stderr
Avoid sprintf()
innobase/fut/fut0lst.c:
Output to stderr
innobase/ha/ha0ha.c:
Output to stream, not to memory buffer
innobase/ibuf/ibuf0ibuf.c:
Output to stderr
Avoid sprintf()
innobase/include/buf0buf.h:
Output to stream, not to memory buffer
innobase/include/buf0buf.ic:
Use %p for displaying pointers
innobase/include/data0data.h:
Remove dtuple_sprintf()
innobase/include/dict0dict.h:
Output to stream, not to memory buffer
innobase/include/ha0ha.h:
Output to stream, not to memory buffer
innobase/include/ibuf0ibuf.h:
Output to stream, not to memory buffer
innobase/include/lock0lock.h:
Output to stream, not to memory buffer
innobase/include/log0log.h:
Output to stream, not to memory buffer
innobase/include/mtr0log.ic:
Output to stderr
Display pointers with %p
innobase/include/os0file.h:
Output to stream, not to memory buffer
innobase/include/rem0rec.h:
Remove rec_sprintf()
innobase/include/rem0rec.ic:
Output to stderr
innobase/include/row0sel.ic:
Output to stderr
innobase/include/row0upd.ic:
Quote table and index names
innobase/include/srv0srv.h:
Remove srv_sprintf_innodb_monitor()
innobase/include/sync0arr.h:
Output to stream, not to memory buffer
innobase/include/sync0sync.h:
Output to stream, not to memory buffer
innobase/include/trx0sys.h:
Output to stderr
innobase/include/trx0trx.h:
Output to stream, not to memory buffer
innobase/include/ut0ut.h:
Remove ut_sprintf_buf()
Add ut_print_name(), ut_print_namel() and ut_copy_file()
innobase/lock/lock0lock.c:
Output to stream, not to memory buffer
innobase/log/log0log.c:
Output to stderr
innobase/log/log0recv.c:
Output to stderr
innobase/mem/mem0dbg.c:
Output to stderr
innobase/mtr/mtr0log.c:
Display pointers with %p
innobase/mtr/mtr0mtr.c:
Output to stderr
innobase/os/os0file.c:
Output to stream, not to memory buffer
innobase/os/os0proc.c:
Output to stderr
innobase/os/os0thread.c:
Output to stderr
innobase/page/page0cur.c:
Output to stderr
innobase/page/page0page.c:
Avoid sprintf()
Output to stderr instead of stdout
innobase/pars/pars0opt.c:
Output to stderr instead of stdout
innobase/rem/rem0rec.c:
Remove rec_sprintf()
Output to stderr instead of stdout
innobase/row/row0ins.c:
Output diagnostics to stream instead of memory buffer
innobase/row/row0mysql.c:
Output to stderr instead of stdout
Quote table and index names
innobase/row/row0purge.c:
Output to stderr instead of stdout
innobase/row/row0row.c:
Quote table and index names
innobase/row/row0sel.c:
Output to stderr instead of stdout
Quote table and index names
innobase/row/row0umod.c:
Avoid sprintf()
Quote table and index names
innobase/row/row0undo.c:
Output to stderr instead of stdout
innobase/row/row0upd.c:
Avoid sprintf()
innobase/srv/srv0srv.c:
Output to stderr instead of stdout
innobase/srv/srv0start.c:
Handle srv_monitor_file
Make some global variables static
innobase/sync/sync0arr.c:
Output to stderr instead of stdout
Output to stream instead of memory buffer
innobase/sync/sync0rw.c:
Output to stderr instead of stdout
innobase/sync/sync0sync.c:
Output to stderr instead of stdout
Output to stream instead of memory buffer
innobase/trx/trx0purge.c:
Output to stderr instead of stdout
innobase/trx/trx0rec.c:
Quote index and table names
Avoid sprintf()
innobase/trx/trx0roll.c:
Quote identifier names
Output to stderr instead of stdout
innobase/trx/trx0sys.c:
Output to stderr instead of stdout
innobase/trx/trx0trx.c:
Output to stream instead of memory buffer
innobase/trx/trx0undo.c:
Output to stderr instead of stdout
innobase/ut/ut0ut.c:
Declare mysql_get_identifier_quote_char()
Remove ut_sprintf_buf()
Add ut_print_name() and ut_print_namel()
Add ut_copy_file()
sql/ha_innodb.cc:
innobase_mysql_print_thd(): output to stream, not to memory buffer
Add mysql_get_identifier_quote_char()
Remove unused function innobase_print_error()
Display pointers with %p
Buffer InnoDB output via files, not via statically allocated memory
2004-04-06 16:14:43 +03:00
|
|
|
putc('\n', stderr);
|
2001-02-17 14:19:19 +02:00
|
|
|
|
|
|
|
} else if (func == PARS_ASSERT_TOKEN) {
|
|
|
|
|
|
|
|
if (!eval_node_get_ibool_val(arg1)) {
|
InnoDB: send diagnostic output to stderr or files
instead of stdout or fixed-size memory buffers
innobase/btr/btr0btr.c:
Output to stderr; quote table and index names
innobase/btr/btr0cur.c:
Output to stderr; quote table and index names
innobase/btr/btr0sea.c:
Output to stderr
innobase/buf/buf0buf.c:
Output to stderr; quote table and index names
innobase/buf/buf0flu.c:
Output to stderr
innobase/buf/buf0lru.c:
Output to stderr
innobase/buf/buf0rea.c:
Output to stderr
innobase/data/data0data.c:
Remove dtuple_validate() unless #ifdef UNIV_DEBUG
Remove unnecessary sprintf() calls
Output to stderr
innobase/data/data0type.c:
Output to stderr
innobase/dict/dict0boot.c:
Remove dummy call to printf()
innobase/dict/dict0crea.c:
Output diagnostic information to stream, not to memory
innobase/dict/dict0dict.c:
Output diagnostics to a file, not to a memory buffer
innobase/dict/dict0load.c:
Output to stderr; quote table and index names
innobase/eval/eval0eval.c:
Output to stderr
innobase/fil/fil0fil.c:
Output to stderr
innobase/fsp/fsp0fsp.c:
Output to stderr
Avoid sprintf()
innobase/fut/fut0lst.c:
Output to stderr
innobase/ha/ha0ha.c:
Output to stream, not to memory buffer
innobase/ibuf/ibuf0ibuf.c:
Output to stderr
Avoid sprintf()
innobase/include/buf0buf.h:
Output to stream, not to memory buffer
innobase/include/buf0buf.ic:
Use %p for displaying pointers
innobase/include/data0data.h:
Remove dtuple_sprintf()
innobase/include/dict0dict.h:
Output to stream, not to memory buffer
innobase/include/ha0ha.h:
Output to stream, not to memory buffer
innobase/include/ibuf0ibuf.h:
Output to stream, not to memory buffer
innobase/include/lock0lock.h:
Output to stream, not to memory buffer
innobase/include/log0log.h:
Output to stream, not to memory buffer
innobase/include/mtr0log.ic:
Output to stderr
Display pointers with %p
innobase/include/os0file.h:
Output to stream, not to memory buffer
innobase/include/rem0rec.h:
Remove rec_sprintf()
innobase/include/rem0rec.ic:
Output to stderr
innobase/include/row0sel.ic:
Output to stderr
innobase/include/row0upd.ic:
Quote table and index names
innobase/include/srv0srv.h:
Remove srv_sprintf_innodb_monitor()
innobase/include/sync0arr.h:
Output to stream, not to memory buffer
innobase/include/sync0sync.h:
Output to stream, not to memory buffer
innobase/include/trx0sys.h:
Output to stderr
innobase/include/trx0trx.h:
Output to stream, not to memory buffer
innobase/include/ut0ut.h:
Remove ut_sprintf_buf()
Add ut_print_name(), ut_print_namel() and ut_copy_file()
innobase/lock/lock0lock.c:
Output to stream, not to memory buffer
innobase/log/log0log.c:
Output to stderr
innobase/log/log0recv.c:
Output to stderr
innobase/mem/mem0dbg.c:
Output to stderr
innobase/mtr/mtr0log.c:
Display pointers with %p
innobase/mtr/mtr0mtr.c:
Output to stderr
innobase/os/os0file.c:
Output to stream, not to memory buffer
innobase/os/os0proc.c:
Output to stderr
innobase/os/os0thread.c:
Output to stderr
innobase/page/page0cur.c:
Output to stderr
innobase/page/page0page.c:
Avoid sprintf()
Output to stderr instead of stdout
innobase/pars/pars0opt.c:
Output to stderr instead of stdout
innobase/rem/rem0rec.c:
Remove rec_sprintf()
Output to stderr instead of stdout
innobase/row/row0ins.c:
Output diagnostics to stream instead of memory buffer
innobase/row/row0mysql.c:
Output to stderr instead of stdout
Quote table and index names
innobase/row/row0purge.c:
Output to stderr instead of stdout
innobase/row/row0row.c:
Quote table and index names
innobase/row/row0sel.c:
Output to stderr instead of stdout
Quote table and index names
innobase/row/row0umod.c:
Avoid sprintf()
Quote table and index names
innobase/row/row0undo.c:
Output to stderr instead of stdout
innobase/row/row0upd.c:
Avoid sprintf()
innobase/srv/srv0srv.c:
Output to stderr instead of stdout
innobase/srv/srv0start.c:
Handle srv_monitor_file
Make some global variables static
innobase/sync/sync0arr.c:
Output to stderr instead of stdout
Output to stream instead of memory buffer
innobase/sync/sync0rw.c:
Output to stderr instead of stdout
innobase/sync/sync0sync.c:
Output to stderr instead of stdout
Output to stream instead of memory buffer
innobase/trx/trx0purge.c:
Output to stderr instead of stdout
innobase/trx/trx0rec.c:
Quote index and table names
Avoid sprintf()
innobase/trx/trx0roll.c:
Quote identifier names
Output to stderr instead of stdout
innobase/trx/trx0sys.c:
Output to stderr instead of stdout
innobase/trx/trx0trx.c:
Output to stream instead of memory buffer
innobase/trx/trx0undo.c:
Output to stderr instead of stdout
innobase/ut/ut0ut.c:
Declare mysql_get_identifier_quote_char()
Remove ut_sprintf_buf()
Add ut_print_name() and ut_print_namel()
Add ut_copy_file()
sql/ha_innodb.cc:
innobase_mysql_print_thd(): output to stream, not to memory buffer
Add mysql_get_identifier_quote_char()
Remove unused function innobase_print_error()
Display pointers with %p
Buffer InnoDB output via files, not via statically allocated memory
2004-04-06 16:14:43 +03:00
|
|
|
fputs("SQL assertion fails in a stored procedure!\n",
|
|
|
|
stderr);
|
2001-02-17 14:19:19 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
ut_a(eval_node_get_ibool_val(arg1));
|
|
|
|
|
|
|
|
/* This function, or more precisely, a debug procedure,
|
|
|
|
returns no value */
|
|
|
|
|
|
|
|
} else if (func == PARS_RND_TOKEN) {
|
|
|
|
|
|
|
|
len1 = (ulint)eval_node_get_int_val(arg1);
|
|
|
|
len2 = (ulint)eval_node_get_int_val(arg2);
|
|
|
|
|
|
|
|
ut_ad(len2 >= len1);
|
|
|
|
|
|
|
|
if (len2 > len1) {
|
|
|
|
int_val = (lint)(len1 +
|
|
|
|
(eval_rnd % (len2 - len1 + 1)));
|
|
|
|
} else {
|
|
|
|
int_val = (lint)len1;
|
|
|
|
}
|
|
|
|
|
|
|
|
eval_rnd = ut_rnd_gen_next_ulint(eval_rnd);
|
|
|
|
|
|
|
|
eval_node_set_int_val(func_node, int_val);
|
|
|
|
|
|
|
|
} else if (func == PARS_RND_STR_TOKEN) {
|
|
|
|
|
|
|
|
len1 = (ulint)eval_node_get_int_val(arg1);
|
|
|
|
|
|
|
|
data = eval_node_ensure_val_buf(func_node, len1);
|
|
|
|
|
|
|
|
for (i = 0; i < len1; i++) {
|
|
|
|
data[i] = (byte)(97 + (eval_rnd % 3));
|
|
|
|
|
|
|
|
eval_rnd = ut_rnd_gen_next_ulint(eval_rnd);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
ut_error;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Evaluates a notfound-function node. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
eval_notfound(
|
|
|
|
/*==========*/
|
|
|
|
func_node_t* func_node) /* in: function node */
|
|
|
|
{
|
|
|
|
que_node_t* arg1;
|
|
|
|
que_node_t* arg2;
|
|
|
|
sym_node_t* cursor;
|
|
|
|
sel_node_t* sel_node;
|
|
|
|
ibool ibool_val;
|
|
|
|
|
|
|
|
arg1 = func_node->args;
|
|
|
|
arg2 = que_node_get_next(arg1);
|
|
|
|
|
|
|
|
ut_ad(func_node->func == PARS_NOTFOUND_TOKEN);
|
|
|
|
|
|
|
|
cursor = arg1;
|
|
|
|
|
|
|
|
ut_ad(que_node_get_type(cursor) == QUE_NODE_SYMBOL);
|
|
|
|
|
|
|
|
if (cursor->token_type == SYM_LIT) {
|
|
|
|
|
|
|
|
ut_ad(ut_memcmp(dfield_get_data(que_node_get_val(cursor)),
|
|
|
|
"SQL", 3) == 0);
|
|
|
|
|
|
|
|
sel_node = cursor->sym_table->query_graph->last_sel_node;
|
|
|
|
} else {
|
|
|
|
sel_node = cursor->alias->cursor_def;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (sel_node->state == SEL_NODE_NO_MORE_ROWS) {
|
|
|
|
ibool_val = TRUE;
|
|
|
|
} else {
|
|
|
|
ibool_val = FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
eval_node_set_ibool_val(func_node, ibool_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Evaluates a substr-function node. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
eval_substr(
|
|
|
|
/*========*/
|
|
|
|
func_node_t* func_node) /* in: function node */
|
|
|
|
{
|
|
|
|
que_node_t* arg1;
|
|
|
|
que_node_t* arg2;
|
|
|
|
que_node_t* arg3;
|
|
|
|
dfield_t* dfield;
|
|
|
|
byte* str1;
|
|
|
|
ulint len1;
|
|
|
|
ulint len2;
|
|
|
|
|
|
|
|
arg1 = func_node->args;
|
|
|
|
arg2 = que_node_get_next(arg1);
|
|
|
|
|
|
|
|
ut_ad(func_node->func == PARS_SUBSTR_TOKEN);
|
|
|
|
|
|
|
|
arg3 = que_node_get_next(arg2);
|
|
|
|
|
|
|
|
str1 = dfield_get_data(que_node_get_val(arg1));
|
|
|
|
|
|
|
|
len1 = (ulint)eval_node_get_int_val(arg2);
|
|
|
|
len2 = (ulint)eval_node_get_int_val(arg3);
|
|
|
|
|
|
|
|
dfield = que_node_get_val(func_node);
|
|
|
|
|
|
|
|
dfield_set_data(dfield, str1 + len1, len2);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Evaluates a replstr-procedure node. */
|
|
|
|
static
|
|
|
|
void
|
|
|
|
eval_replstr(
|
|
|
|
/*=========*/
|
|
|
|
func_node_t* func_node) /* in: function node */
|
|
|
|
{
|
|
|
|
que_node_t* arg1;
|
|
|
|
que_node_t* arg2;
|
|
|
|
que_node_t* arg3;
|
|
|
|
que_node_t* arg4;
|
|
|
|
byte* str1;
|
|
|
|
byte* str2;
|
|
|
|
ulint len1;
|
|
|
|
ulint len2;
|
|
|
|
|
|
|
|
arg1 = func_node->args;
|
|
|
|
arg2 = que_node_get_next(arg1);
|
|
|
|
|
|
|
|
ut_ad(que_node_get_type(arg1) == QUE_NODE_SYMBOL);
|
|
|
|
|
|
|
|
arg3 = que_node_get_next(arg2);
|
|
|
|
arg4 = que_node_get_next(arg3);
|
|
|
|
|
|
|
|
str1 = dfield_get_data(que_node_get_val(arg1));
|
|
|
|
str2 = dfield_get_data(que_node_get_val(arg2));
|
|
|
|
|
|
|
|
len1 = (ulint)eval_node_get_int_val(arg3);
|
|
|
|
len2 = (ulint)eval_node_get_int_val(arg4);
|
|
|
|
|
|
|
|
if ((dfield_get_len(que_node_get_val(arg1)) < len1 + len2)
|
|
|
|
|| (dfield_get_len(que_node_get_val(arg2)) < len2)) {
|
|
|
|
|
|
|
|
ut_error;
|
|
|
|
}
|
|
|
|
|
|
|
|
ut_memcpy(str1 + len1, str2, len2);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Evaluates an instr-function node. */
|
|
|
|
static
|
|
|
|
void
|
|
|
|
eval_instr(
|
|
|
|
/*=======*/
|
|
|
|
func_node_t* func_node) /* in: function node */
|
|
|
|
{
|
|
|
|
que_node_t* arg1;
|
|
|
|
que_node_t* arg2;
|
|
|
|
dfield_t* dfield1;
|
|
|
|
dfield_t* dfield2;
|
|
|
|
lint int_val;
|
|
|
|
byte* str1;
|
|
|
|
byte* str2;
|
|
|
|
byte match_char;
|
|
|
|
ulint len1;
|
|
|
|
ulint len2;
|
|
|
|
ulint i;
|
|
|
|
ulint j;
|
|
|
|
|
|
|
|
arg1 = func_node->args;
|
|
|
|
arg2 = que_node_get_next(arg1);
|
|
|
|
|
|
|
|
dfield1 = que_node_get_val(arg1);
|
|
|
|
dfield2 = que_node_get_val(arg2);
|
|
|
|
|
|
|
|
str1 = dfield_get_data(dfield1);
|
|
|
|
str2 = dfield_get_data(dfield2);
|
|
|
|
|
|
|
|
len1 = dfield_get_len(dfield1);
|
|
|
|
len2 = dfield_get_len(dfield2);
|
|
|
|
|
|
|
|
if (len2 == 0) {
|
|
|
|
ut_error;
|
|
|
|
}
|
|
|
|
|
|
|
|
match_char = str2[0];
|
|
|
|
|
|
|
|
for (i = 0; i < len1; i++) {
|
|
|
|
/* In this outer loop, the number of matched characters is 0 */
|
|
|
|
|
|
|
|
if (str1[i] == match_char) {
|
|
|
|
|
|
|
|
if (i + len2 > len1) {
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
for (j = 1;; j++) {
|
|
|
|
/* We have already matched j characters */
|
|
|
|
|
|
|
|
if (j == len2) {
|
|
|
|
int_val = i + 1;
|
|
|
|
|
|
|
|
goto match_found;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (str1[i + j] != str2[j]) {
|
|
|
|
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int_val = 0;
|
|
|
|
|
|
|
|
match_found:
|
|
|
|
eval_node_set_int_val(func_node, int_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Evaluates a predefined function node. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
eval_binary_to_number(
|
|
|
|
/*==================*/
|
|
|
|
func_node_t* func_node) /* in: function node */
|
|
|
|
{
|
|
|
|
que_node_t* arg1;
|
|
|
|
dfield_t* dfield;
|
|
|
|
byte* str1;
|
|
|
|
byte* str2;
|
|
|
|
ulint len1;
|
|
|
|
ulint int_val;
|
|
|
|
|
|
|
|
arg1 = func_node->args;
|
|
|
|
|
|
|
|
dfield = que_node_get_val(arg1);
|
|
|
|
|
|
|
|
str1 = dfield_get_data(dfield);
|
|
|
|
len1 = dfield_get_len(dfield);
|
|
|
|
|
|
|
|
if (len1 > 4) {
|
|
|
|
ut_error;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (len1 == 4) {
|
|
|
|
str2 = str1;
|
|
|
|
} else {
|
|
|
|
int_val = 0;
|
|
|
|
str2 = (byte*)&int_val;
|
|
|
|
|
|
|
|
ut_memcpy(str2 + (4 - len1), str1, len1);
|
|
|
|
}
|
|
|
|
|
|
|
|
eval_node_copy_and_alloc_val(func_node, str2, 4);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Evaluates a predefined function node. */
|
|
|
|
static
|
|
|
|
void
|
|
|
|
eval_concat(
|
|
|
|
/*========*/
|
|
|
|
func_node_t* func_node) /* in: function node */
|
|
|
|
{
|
|
|
|
que_node_t* arg;
|
|
|
|
dfield_t* dfield;
|
|
|
|
byte* data;
|
|
|
|
ulint len;
|
|
|
|
ulint len1;
|
|
|
|
|
|
|
|
arg = func_node->args;
|
|
|
|
len = 0;
|
|
|
|
|
|
|
|
while (arg) {
|
|
|
|
len1 = dfield_get_len(que_node_get_val(arg));
|
|
|
|
|
|
|
|
len += len1;
|
|
|
|
|
|
|
|
arg = que_node_get_next(arg);
|
|
|
|
}
|
|
|
|
|
|
|
|
data = eval_node_ensure_val_buf(func_node, len);
|
|
|
|
|
|
|
|
arg = func_node->args;
|
|
|
|
len = 0;
|
|
|
|
|
|
|
|
while (arg) {
|
|
|
|
dfield = que_node_get_val(arg);
|
|
|
|
len1 = dfield_get_len(dfield);
|
|
|
|
|
|
|
|
ut_memcpy(data + len, dfield_get_data(dfield), len1);
|
|
|
|
|
|
|
|
len += len1;
|
|
|
|
|
|
|
|
arg = que_node_get_next(arg);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
2004-10-31 15:43:29 +02:00
|
|
|
Evaluates a predefined function node. If the first argument is an integer,
|
|
|
|
this function looks at the second argument which is the integer length in
|
|
|
|
bytes, and converts the integer to a VARCHAR.
|
|
|
|
If the first argument is of some other type, this function converts it to
|
|
|
|
BINARY. */
|
2001-02-17 14:19:19 +02:00
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
eval_to_binary(
|
|
|
|
/*===========*/
|
|
|
|
func_node_t* func_node) /* in: function node */
|
|
|
|
{
|
|
|
|
que_node_t* arg1;
|
|
|
|
que_node_t* arg2;
|
|
|
|
dfield_t* dfield;
|
|
|
|
byte* str1;
|
2004-10-31 15:43:29 +02:00
|
|
|
ulint len;
|
2001-02-17 14:19:19 +02:00
|
|
|
ulint len1;
|
|
|
|
|
|
|
|
arg1 = func_node->args;
|
|
|
|
|
|
|
|
str1 = dfield_get_data(que_node_get_val(arg1));
|
|
|
|
|
2004-10-31 15:43:29 +02:00
|
|
|
if (dtype_get_mtype(que_node_get_data_type(arg1)) != DATA_INT) {
|
|
|
|
|
|
|
|
len = dfield_get_len(que_node_get_val(arg1));
|
|
|
|
|
|
|
|
dfield = que_node_get_val(func_node);
|
|
|
|
|
|
|
|
dfield_set_data(dfield, str1, len);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2001-02-17 14:19:19 +02:00
|
|
|
arg2 = que_node_get_next(arg1);
|
|
|
|
|
|
|
|
len1 = (ulint)eval_node_get_int_val(arg2);
|
|
|
|
|
|
|
|
if (len1 > 4) {
|
|
|
|
|
|
|
|
ut_error;
|
|
|
|
}
|
|
|
|
|
|
|
|
dfield = que_node_get_val(func_node);
|
|
|
|
|
|
|
|
dfield_set_data(dfield, str1 + (4 - len1), len1);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Evaluates a predefined function node. */
|
|
|
|
UNIV_INLINE
|
|
|
|
void
|
|
|
|
eval_predefined(
|
|
|
|
/*============*/
|
|
|
|
func_node_t* func_node) /* in: function node */
|
|
|
|
{
|
|
|
|
que_node_t* arg1;
|
|
|
|
lint int_val;
|
|
|
|
byte* data;
|
|
|
|
int func;
|
|
|
|
|
|
|
|
func = func_node->func;
|
|
|
|
|
|
|
|
arg1 = func_node->args;
|
|
|
|
|
|
|
|
if (func == PARS_LENGTH_TOKEN) {
|
|
|
|
|
|
|
|
int_val = (lint)dfield_get_len(que_node_get_val(arg1));
|
|
|
|
|
|
|
|
} else if (func == PARS_TO_CHAR_TOKEN) {
|
|
|
|
|
InnoDB cleanup: fixing buffer overflows and quoting of quotes
innobase/dict/dict0crea.c:
Remove unneeded prototypes for static functions
Remove unused parameters from some functions
Replace some assertions with compile-time checks
dict_create_add_foreigns_to_dictionary():
allocate space dynamically for the SQL, and quote quotes
innobase/dict/dict0dict.c:
Remove unnecessary prototypes for static functions
dict_tables_have_same_db(): Remove length limitation
dict_remove_db_name(): Use strchr()
dict_get_db_name_len(): Use strchr()
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
Remove unnecessary strlen() calls
Allocate space dynamically for generated strings
dict_scan_id(): allow quotes within quoted strings
innobase/dict/dict0load.c:
Remove unnecessary strlen() calls
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/dict/dict0mem.c:
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/eval/eval0eval.c:
Make TO_CHAR() work with any machine word width
innobase/fil/fil0fil.c:
Replace mem_alloc()+strlen()+strcpy() with mem_strdup()
innobase/ibuf/ibuf0ibuf.c:
Make some global variables static
Add #ifdef UNIV_IBUF_DEBUG around debug statements
innobase/include/data0data.h:
Add #ifdef UNIV_DEBUG around dtuple_validate()
innobase/include/data0data.ic:
Replace = with == in ut_ad(tuple->magic_n == DATA_TUPLE_MAGIC_N)
innobase/include/dict0dict.h:
Add const qualifiers
innobase/include/lock0lock.h:
Add UL suffixes to unsigned long masks
innobase/include/log0log.h:
Remove unused parameter "type" of log_group_write_buf()
innobase/include/mem0mem.h:
Add mem_strdup(), mem_strdupl(), mem_strdupq(), mem_heap_strdup(),
and mem_heap_strdupl()
innobase/include/mem0mem.ic:
Add mem_strdup(), mem_strdupl(), mem_strdupq(), mem_heap_strdup(),
and mem_heap_strdupl()
innobase/include/row0uins.h:
Remove unused parameter "thr" of row_undo_ins()
innobase/include/row0undo.h:
Remvoe unused parameter "thr" of row_undo_search_clust_to_pcur()
innobase/include/ut0byte.h:
Add const qualifier to ut_cpy_in_lower_case()
Remove parameter "len" of ut_cmp_in_lower_case()
innobase/include/ut0mem.h:
Add ut_strlenq(), ut_strcpyq() and ut_memcpyq()
innobase/include/ut0mem.ic:
Add ut_strlenq()
innobase/include/ut0ut.h:
Declare ut_sprintf() as a printf-style function
innobase/lock/lock0lock.c:
lock_clust_rec_modify_check_and_lock(): Remove unused variable "trx"
innobase/log/log0log.c:
Remove unused parameters
innobase/log/log0recv.c:
Remove parameter "type" from log_group_write_buf()
innobase/mem/mem0mem.c:
Simplify the initialization of block->init_block
innobase/mtr/mtr0log.c:
Add a debug assertion to mlog_parse_initial_log_record()
innobase/page/page0cur.c:
Add debug assertion to page_cur_insert_rec_write_log()
Remove hard-coded buffer size in page_cur_parse_insert_rec()
innobase/page/page0page.c:
Remove unneeded variable rec
innobase/pars/pars0opt.c:
Correct a potential buffer overflow
innobase/pars/pars0pars.c:
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/row/row0ins.c:
Replace parameter "thr" with "trx" in row_ins_foreign_report_add_err()
Remove unnecessary strlen() call
Use strchr()
innobase/row/row0mysql.c:
Add row_mysql_is_recovered_tmp_table()
Add row_mysql_is_system_table()
Compare reserved table names with exact match
Use strstr() and strchr() and mem_strdupl()
Compute space needed for generated SQL, and allocate it dynamically
innobase/row/row0purge.c:
Remove unused parameters "thr"
innobase/row/row0row.c:
Simplify row_get_clust_rec()
innobase/row/row0uins.c:
Remove unused parameters "thr"
innobase/row/row0umod.c:
Remove unused variable "index"
row_undo_mod_del_unmark_sec_and_undo_update():
Remove parameter "node" and variable "rec"
Remove unused parameters "thr"
innobase/row/row0undo.c:
Remove unused parameters "thr"
innobase/srv/srv0srv.c:
Replace UT_NOT_USED() with __attribute__((unused))
innobase/srv/srv0start.c:
Remove unnecessary strlen() calls
Remove unused parameter "create_new_db" of open_or_create_log_file()
innobase/trx/trx0roll.c:
Replace mem_alloc()+strlen()+memcpy() with mem_strdup()
innobase/trx/trx0sys.c:
Remove unnecessary strlen() call
innobase/ut/ut0byte.c:
Add const qualifier to ut_cpy_in_lower_case()
Remove parameter "len" of ut_cmp_in_lower_case()
innobase/ut/ut0mem.c:
Add ut_strlenq() and ut_memcpyq()
sql/ha_innodb.cc:
Remove parameter "len" of ut_cmp_in_lower_case()
2004-04-01 16:51:34 +03:00
|
|
|
/* Convert number to character string as a
|
|
|
|
signed decimal integer. */
|
|
|
|
|
|
|
|
ulint uint_val;
|
|
|
|
int int_len;
|
|
|
|
|
2001-02-17 14:19:19 +02:00
|
|
|
int_val = eval_node_get_int_val(arg1);
|
|
|
|
|
InnoDB cleanup: fixing buffer overflows and quoting of quotes
innobase/dict/dict0crea.c:
Remove unneeded prototypes for static functions
Remove unused parameters from some functions
Replace some assertions with compile-time checks
dict_create_add_foreigns_to_dictionary():
allocate space dynamically for the SQL, and quote quotes
innobase/dict/dict0dict.c:
Remove unnecessary prototypes for static functions
dict_tables_have_same_db(): Remove length limitation
dict_remove_db_name(): Use strchr()
dict_get_db_name_len(): Use strchr()
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
Remove unnecessary strlen() calls
Allocate space dynamically for generated strings
dict_scan_id(): allow quotes within quoted strings
innobase/dict/dict0load.c:
Remove unnecessary strlen() calls
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/dict/dict0mem.c:
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/eval/eval0eval.c:
Make TO_CHAR() work with any machine word width
innobase/fil/fil0fil.c:
Replace mem_alloc()+strlen()+strcpy() with mem_strdup()
innobase/ibuf/ibuf0ibuf.c:
Make some global variables static
Add #ifdef UNIV_IBUF_DEBUG around debug statements
innobase/include/data0data.h:
Add #ifdef UNIV_DEBUG around dtuple_validate()
innobase/include/data0data.ic:
Replace = with == in ut_ad(tuple->magic_n == DATA_TUPLE_MAGIC_N)
innobase/include/dict0dict.h:
Add const qualifiers
innobase/include/lock0lock.h:
Add UL suffixes to unsigned long masks
innobase/include/log0log.h:
Remove unused parameter "type" of log_group_write_buf()
innobase/include/mem0mem.h:
Add mem_strdup(), mem_strdupl(), mem_strdupq(), mem_heap_strdup(),
and mem_heap_strdupl()
innobase/include/mem0mem.ic:
Add mem_strdup(), mem_strdupl(), mem_strdupq(), mem_heap_strdup(),
and mem_heap_strdupl()
innobase/include/row0uins.h:
Remove unused parameter "thr" of row_undo_ins()
innobase/include/row0undo.h:
Remvoe unused parameter "thr" of row_undo_search_clust_to_pcur()
innobase/include/ut0byte.h:
Add const qualifier to ut_cpy_in_lower_case()
Remove parameter "len" of ut_cmp_in_lower_case()
innobase/include/ut0mem.h:
Add ut_strlenq(), ut_strcpyq() and ut_memcpyq()
innobase/include/ut0mem.ic:
Add ut_strlenq()
innobase/include/ut0ut.h:
Declare ut_sprintf() as a printf-style function
innobase/lock/lock0lock.c:
lock_clust_rec_modify_check_and_lock(): Remove unused variable "trx"
innobase/log/log0log.c:
Remove unused parameters
innobase/log/log0recv.c:
Remove parameter "type" from log_group_write_buf()
innobase/mem/mem0mem.c:
Simplify the initialization of block->init_block
innobase/mtr/mtr0log.c:
Add a debug assertion to mlog_parse_initial_log_record()
innobase/page/page0cur.c:
Add debug assertion to page_cur_insert_rec_write_log()
Remove hard-coded buffer size in page_cur_parse_insert_rec()
innobase/page/page0page.c:
Remove unneeded variable rec
innobase/pars/pars0opt.c:
Correct a potential buffer overflow
innobase/pars/pars0pars.c:
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/row/row0ins.c:
Replace parameter "thr" with "trx" in row_ins_foreign_report_add_err()
Remove unnecessary strlen() call
Use strchr()
innobase/row/row0mysql.c:
Add row_mysql_is_recovered_tmp_table()
Add row_mysql_is_system_table()
Compare reserved table names with exact match
Use strstr() and strchr() and mem_strdupl()
Compute space needed for generated SQL, and allocate it dynamically
innobase/row/row0purge.c:
Remove unused parameters "thr"
innobase/row/row0row.c:
Simplify row_get_clust_rec()
innobase/row/row0uins.c:
Remove unused parameters "thr"
innobase/row/row0umod.c:
Remove unused variable "index"
row_undo_mod_del_unmark_sec_and_undo_update():
Remove parameter "node" and variable "rec"
Remove unused parameters "thr"
innobase/row/row0undo.c:
Remove unused parameters "thr"
innobase/srv/srv0srv.c:
Replace UT_NOT_USED() with __attribute__((unused))
innobase/srv/srv0start.c:
Remove unnecessary strlen() calls
Remove unused parameter "create_new_db" of open_or_create_log_file()
innobase/trx/trx0roll.c:
Replace mem_alloc()+strlen()+memcpy() with mem_strdup()
innobase/trx/trx0sys.c:
Remove unnecessary strlen() call
innobase/ut/ut0byte.c:
Add const qualifier to ut_cpy_in_lower_case()
Remove parameter "len" of ut_cmp_in_lower_case()
innobase/ut/ut0mem.c:
Add ut_strlenq() and ut_memcpyq()
sql/ha_innodb.cc:
Remove parameter "len" of ut_cmp_in_lower_case()
2004-04-01 16:51:34 +03:00
|
|
|
/* Determine the length of the string. */
|
|
|
|
|
|
|
|
if (int_val == 0) {
|
|
|
|
int_len = 1; /* the number 0 occupies 1 byte */
|
|
|
|
} else {
|
|
|
|
int_len = 0;
|
|
|
|
if (int_val < 0) {
|
|
|
|
uint_val = ((ulint) -int_val - 1) + 1;
|
|
|
|
int_len++; /* reserve space for minus sign */
|
|
|
|
} else {
|
|
|
|
uint_val = (ulint) int_val;
|
|
|
|
}
|
|
|
|
for (; uint_val > 0; int_len++) {
|
|
|
|
uint_val /= 10;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/* allocate the string */
|
|
|
|
data = eval_node_ensure_val_buf(func_node, int_len + 1);
|
2001-02-17 14:19:19 +02:00
|
|
|
|
InnoDB cleanup: fixing buffer overflows and quoting of quotes
innobase/dict/dict0crea.c:
Remove unneeded prototypes for static functions
Remove unused parameters from some functions
Replace some assertions with compile-time checks
dict_create_add_foreigns_to_dictionary():
allocate space dynamically for the SQL, and quote quotes
innobase/dict/dict0dict.c:
Remove unnecessary prototypes for static functions
dict_tables_have_same_db(): Remove length limitation
dict_remove_db_name(): Use strchr()
dict_get_db_name_len(): Use strchr()
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
Remove unnecessary strlen() calls
Allocate space dynamically for generated strings
dict_scan_id(): allow quotes within quoted strings
innobase/dict/dict0load.c:
Remove unnecessary strlen() calls
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/dict/dict0mem.c:
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/eval/eval0eval.c:
Make TO_CHAR() work with any machine word width
innobase/fil/fil0fil.c:
Replace mem_alloc()+strlen()+strcpy() with mem_strdup()
innobase/ibuf/ibuf0ibuf.c:
Make some global variables static
Add #ifdef UNIV_IBUF_DEBUG around debug statements
innobase/include/data0data.h:
Add #ifdef UNIV_DEBUG around dtuple_validate()
innobase/include/data0data.ic:
Replace = with == in ut_ad(tuple->magic_n == DATA_TUPLE_MAGIC_N)
innobase/include/dict0dict.h:
Add const qualifiers
innobase/include/lock0lock.h:
Add UL suffixes to unsigned long masks
innobase/include/log0log.h:
Remove unused parameter "type" of log_group_write_buf()
innobase/include/mem0mem.h:
Add mem_strdup(), mem_strdupl(), mem_strdupq(), mem_heap_strdup(),
and mem_heap_strdupl()
innobase/include/mem0mem.ic:
Add mem_strdup(), mem_strdupl(), mem_strdupq(), mem_heap_strdup(),
and mem_heap_strdupl()
innobase/include/row0uins.h:
Remove unused parameter "thr" of row_undo_ins()
innobase/include/row0undo.h:
Remvoe unused parameter "thr" of row_undo_search_clust_to_pcur()
innobase/include/ut0byte.h:
Add const qualifier to ut_cpy_in_lower_case()
Remove parameter "len" of ut_cmp_in_lower_case()
innobase/include/ut0mem.h:
Add ut_strlenq(), ut_strcpyq() and ut_memcpyq()
innobase/include/ut0mem.ic:
Add ut_strlenq()
innobase/include/ut0ut.h:
Declare ut_sprintf() as a printf-style function
innobase/lock/lock0lock.c:
lock_clust_rec_modify_check_and_lock(): Remove unused variable "trx"
innobase/log/log0log.c:
Remove unused parameters
innobase/log/log0recv.c:
Remove parameter "type" from log_group_write_buf()
innobase/mem/mem0mem.c:
Simplify the initialization of block->init_block
innobase/mtr/mtr0log.c:
Add a debug assertion to mlog_parse_initial_log_record()
innobase/page/page0cur.c:
Add debug assertion to page_cur_insert_rec_write_log()
Remove hard-coded buffer size in page_cur_parse_insert_rec()
innobase/page/page0page.c:
Remove unneeded variable rec
innobase/pars/pars0opt.c:
Correct a potential buffer overflow
innobase/pars/pars0pars.c:
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/row/row0ins.c:
Replace parameter "thr" with "trx" in row_ins_foreign_report_add_err()
Remove unnecessary strlen() call
Use strchr()
innobase/row/row0mysql.c:
Add row_mysql_is_recovered_tmp_table()
Add row_mysql_is_system_table()
Compare reserved table names with exact match
Use strstr() and strchr() and mem_strdupl()
Compute space needed for generated SQL, and allocate it dynamically
innobase/row/row0purge.c:
Remove unused parameters "thr"
innobase/row/row0row.c:
Simplify row_get_clust_rec()
innobase/row/row0uins.c:
Remove unused parameters "thr"
innobase/row/row0umod.c:
Remove unused variable "index"
row_undo_mod_del_unmark_sec_and_undo_update():
Remove parameter "node" and variable "rec"
Remove unused parameters "thr"
innobase/row/row0undo.c:
Remove unused parameters "thr"
innobase/srv/srv0srv.c:
Replace UT_NOT_USED() with __attribute__((unused))
innobase/srv/srv0start.c:
Remove unnecessary strlen() calls
Remove unused parameter "create_new_db" of open_or_create_log_file()
innobase/trx/trx0roll.c:
Replace mem_alloc()+strlen()+memcpy() with mem_strdup()
innobase/trx/trx0sys.c:
Remove unnecessary strlen() call
innobase/ut/ut0byte.c:
Add const qualifier to ut_cpy_in_lower_case()
Remove parameter "len" of ut_cmp_in_lower_case()
innobase/ut/ut0mem.c:
Add ut_strlenq() and ut_memcpyq()
sql/ha_innodb.cc:
Remove parameter "len" of ut_cmp_in_lower_case()
2004-04-01 16:51:34 +03:00
|
|
|
/* add terminating NUL character */
|
|
|
|
data[int_len] = 0;
|
|
|
|
|
|
|
|
/* convert the number */
|
|
|
|
|
|
|
|
if (int_val == 0) {
|
|
|
|
data[0] = '0';
|
|
|
|
} else {
|
|
|
|
int tmp;
|
|
|
|
if (int_val < 0) {
|
|
|
|
data[0] = '-'; /* preceding minus sign */
|
|
|
|
uint_val = ((ulint) -int_val - 1) + 1;
|
|
|
|
} else {
|
|
|
|
uint_val = (ulint) int_val;
|
|
|
|
}
|
|
|
|
for (tmp = int_len; uint_val > 0; uint_val /= 10) {
|
2004-05-25 02:28:44 +03:00
|
|
|
data[--tmp] = (byte) ('0' + (byte)(uint_val % 10));
|
InnoDB cleanup: fixing buffer overflows and quoting of quotes
innobase/dict/dict0crea.c:
Remove unneeded prototypes for static functions
Remove unused parameters from some functions
Replace some assertions with compile-time checks
dict_create_add_foreigns_to_dictionary():
allocate space dynamically for the SQL, and quote quotes
innobase/dict/dict0dict.c:
Remove unnecessary prototypes for static functions
dict_tables_have_same_db(): Remove length limitation
dict_remove_db_name(): Use strchr()
dict_get_db_name_len(): Use strchr()
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
Remove unnecessary strlen() calls
Allocate space dynamically for generated strings
dict_scan_id(): allow quotes within quoted strings
innobase/dict/dict0load.c:
Remove unnecessary strlen() calls
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/dict/dict0mem.c:
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/eval/eval0eval.c:
Make TO_CHAR() work with any machine word width
innobase/fil/fil0fil.c:
Replace mem_alloc()+strlen()+strcpy() with mem_strdup()
innobase/ibuf/ibuf0ibuf.c:
Make some global variables static
Add #ifdef UNIV_IBUF_DEBUG around debug statements
innobase/include/data0data.h:
Add #ifdef UNIV_DEBUG around dtuple_validate()
innobase/include/data0data.ic:
Replace = with == in ut_ad(tuple->magic_n == DATA_TUPLE_MAGIC_N)
innobase/include/dict0dict.h:
Add const qualifiers
innobase/include/lock0lock.h:
Add UL suffixes to unsigned long masks
innobase/include/log0log.h:
Remove unused parameter "type" of log_group_write_buf()
innobase/include/mem0mem.h:
Add mem_strdup(), mem_strdupl(), mem_strdupq(), mem_heap_strdup(),
and mem_heap_strdupl()
innobase/include/mem0mem.ic:
Add mem_strdup(), mem_strdupl(), mem_strdupq(), mem_heap_strdup(),
and mem_heap_strdupl()
innobase/include/row0uins.h:
Remove unused parameter "thr" of row_undo_ins()
innobase/include/row0undo.h:
Remvoe unused parameter "thr" of row_undo_search_clust_to_pcur()
innobase/include/ut0byte.h:
Add const qualifier to ut_cpy_in_lower_case()
Remove parameter "len" of ut_cmp_in_lower_case()
innobase/include/ut0mem.h:
Add ut_strlenq(), ut_strcpyq() and ut_memcpyq()
innobase/include/ut0mem.ic:
Add ut_strlenq()
innobase/include/ut0ut.h:
Declare ut_sprintf() as a printf-style function
innobase/lock/lock0lock.c:
lock_clust_rec_modify_check_and_lock(): Remove unused variable "trx"
innobase/log/log0log.c:
Remove unused parameters
innobase/log/log0recv.c:
Remove parameter "type" from log_group_write_buf()
innobase/mem/mem0mem.c:
Simplify the initialization of block->init_block
innobase/mtr/mtr0log.c:
Add a debug assertion to mlog_parse_initial_log_record()
innobase/page/page0cur.c:
Add debug assertion to page_cur_insert_rec_write_log()
Remove hard-coded buffer size in page_cur_parse_insert_rec()
innobase/page/page0page.c:
Remove unneeded variable rec
innobase/pars/pars0opt.c:
Correct a potential buffer overflow
innobase/pars/pars0pars.c:
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/row/row0ins.c:
Replace parameter "thr" with "trx" in row_ins_foreign_report_add_err()
Remove unnecessary strlen() call
Use strchr()
innobase/row/row0mysql.c:
Add row_mysql_is_recovered_tmp_table()
Add row_mysql_is_system_table()
Compare reserved table names with exact match
Use strstr() and strchr() and mem_strdupl()
Compute space needed for generated SQL, and allocate it dynamically
innobase/row/row0purge.c:
Remove unused parameters "thr"
innobase/row/row0row.c:
Simplify row_get_clust_rec()
innobase/row/row0uins.c:
Remove unused parameters "thr"
innobase/row/row0umod.c:
Remove unused variable "index"
row_undo_mod_del_unmark_sec_and_undo_update():
Remove parameter "node" and variable "rec"
Remove unused parameters "thr"
innobase/row/row0undo.c:
Remove unused parameters "thr"
innobase/srv/srv0srv.c:
Replace UT_NOT_USED() with __attribute__((unused))
innobase/srv/srv0start.c:
Remove unnecessary strlen() calls
Remove unused parameter "create_new_db" of open_or_create_log_file()
innobase/trx/trx0roll.c:
Replace mem_alloc()+strlen()+memcpy() with mem_strdup()
innobase/trx/trx0sys.c:
Remove unnecessary strlen() call
innobase/ut/ut0byte.c:
Add const qualifier to ut_cpy_in_lower_case()
Remove parameter "len" of ut_cmp_in_lower_case()
innobase/ut/ut0mem.c:
Add ut_strlenq() and ut_memcpyq()
sql/ha_innodb.cc:
Remove parameter "len" of ut_cmp_in_lower_case()
2004-04-01 16:51:34 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
dfield_set_len((dfield_t*) que_node_get_val(func_node),
|
|
|
|
int_len);
|
2001-02-17 14:19:19 +02:00
|
|
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
} else if (func == PARS_TO_NUMBER_TOKEN) {
|
|
|
|
|
InnoDB cleanup: fixing buffer overflows and quoting of quotes
innobase/dict/dict0crea.c:
Remove unneeded prototypes for static functions
Remove unused parameters from some functions
Replace some assertions with compile-time checks
dict_create_add_foreigns_to_dictionary():
allocate space dynamically for the SQL, and quote quotes
innobase/dict/dict0dict.c:
Remove unnecessary prototypes for static functions
dict_tables_have_same_db(): Remove length limitation
dict_remove_db_name(): Use strchr()
dict_get_db_name_len(): Use strchr()
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
Remove unnecessary strlen() calls
Allocate space dynamically for generated strings
dict_scan_id(): allow quotes within quoted strings
innobase/dict/dict0load.c:
Remove unnecessary strlen() calls
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/dict/dict0mem.c:
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/eval/eval0eval.c:
Make TO_CHAR() work with any machine word width
innobase/fil/fil0fil.c:
Replace mem_alloc()+strlen()+strcpy() with mem_strdup()
innobase/ibuf/ibuf0ibuf.c:
Make some global variables static
Add #ifdef UNIV_IBUF_DEBUG around debug statements
innobase/include/data0data.h:
Add #ifdef UNIV_DEBUG around dtuple_validate()
innobase/include/data0data.ic:
Replace = with == in ut_ad(tuple->magic_n == DATA_TUPLE_MAGIC_N)
innobase/include/dict0dict.h:
Add const qualifiers
innobase/include/lock0lock.h:
Add UL suffixes to unsigned long masks
innobase/include/log0log.h:
Remove unused parameter "type" of log_group_write_buf()
innobase/include/mem0mem.h:
Add mem_strdup(), mem_strdupl(), mem_strdupq(), mem_heap_strdup(),
and mem_heap_strdupl()
innobase/include/mem0mem.ic:
Add mem_strdup(), mem_strdupl(), mem_strdupq(), mem_heap_strdup(),
and mem_heap_strdupl()
innobase/include/row0uins.h:
Remove unused parameter "thr" of row_undo_ins()
innobase/include/row0undo.h:
Remvoe unused parameter "thr" of row_undo_search_clust_to_pcur()
innobase/include/ut0byte.h:
Add const qualifier to ut_cpy_in_lower_case()
Remove parameter "len" of ut_cmp_in_lower_case()
innobase/include/ut0mem.h:
Add ut_strlenq(), ut_strcpyq() and ut_memcpyq()
innobase/include/ut0mem.ic:
Add ut_strlenq()
innobase/include/ut0ut.h:
Declare ut_sprintf() as a printf-style function
innobase/lock/lock0lock.c:
lock_clust_rec_modify_check_and_lock(): Remove unused variable "trx"
innobase/log/log0log.c:
Remove unused parameters
innobase/log/log0recv.c:
Remove parameter "type" from log_group_write_buf()
innobase/mem/mem0mem.c:
Simplify the initialization of block->init_block
innobase/mtr/mtr0log.c:
Add a debug assertion to mlog_parse_initial_log_record()
innobase/page/page0cur.c:
Add debug assertion to page_cur_insert_rec_write_log()
Remove hard-coded buffer size in page_cur_parse_insert_rec()
innobase/page/page0page.c:
Remove unneeded variable rec
innobase/pars/pars0opt.c:
Correct a potential buffer overflow
innobase/pars/pars0pars.c:
Replace mem_heap_alloc()+strlen()+memcpy() with mem_heap_strdup()
innobase/row/row0ins.c:
Replace parameter "thr" with "trx" in row_ins_foreign_report_add_err()
Remove unnecessary strlen() call
Use strchr()
innobase/row/row0mysql.c:
Add row_mysql_is_recovered_tmp_table()
Add row_mysql_is_system_table()
Compare reserved table names with exact match
Use strstr() and strchr() and mem_strdupl()
Compute space needed for generated SQL, and allocate it dynamically
innobase/row/row0purge.c:
Remove unused parameters "thr"
innobase/row/row0row.c:
Simplify row_get_clust_rec()
innobase/row/row0uins.c:
Remove unused parameters "thr"
innobase/row/row0umod.c:
Remove unused variable "index"
row_undo_mod_del_unmark_sec_and_undo_update():
Remove parameter "node" and variable "rec"
Remove unused parameters "thr"
innobase/row/row0undo.c:
Remove unused parameters "thr"
innobase/srv/srv0srv.c:
Replace UT_NOT_USED() with __attribute__((unused))
innobase/srv/srv0start.c:
Remove unnecessary strlen() calls
Remove unused parameter "create_new_db" of open_or_create_log_file()
innobase/trx/trx0roll.c:
Replace mem_alloc()+strlen()+memcpy() with mem_strdup()
innobase/trx/trx0sys.c:
Remove unnecessary strlen() call
innobase/ut/ut0byte.c:
Add const qualifier to ut_cpy_in_lower_case()
Remove parameter "len" of ut_cmp_in_lower_case()
innobase/ut/ut0mem.c:
Add ut_strlenq() and ut_memcpyq()
sql/ha_innodb.cc:
Remove parameter "len" of ut_cmp_in_lower_case()
2004-04-01 16:51:34 +03:00
|
|
|
int_val = atoi((char*)
|
|
|
|
dfield_get_data(que_node_get_val(arg1)));
|
2001-02-17 14:19:19 +02:00
|
|
|
|
|
|
|
} else if (func == PARS_SYSDATE_TOKEN) {
|
|
|
|
int_val = (lint)ut_time();
|
|
|
|
} else {
|
|
|
|
eval_predefined_2(func_node);
|
|
|
|
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
eval_node_set_int_val(func_node, int_val);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************************************************
|
|
|
|
Evaluates a function node. */
|
|
|
|
|
|
|
|
void
|
|
|
|
eval_func(
|
|
|
|
/*======*/
|
|
|
|
func_node_t* func_node) /* in: function node */
|
|
|
|
{
|
|
|
|
que_node_t* arg;
|
|
|
|
ulint class;
|
|
|
|
ulint func;
|
|
|
|
|
|
|
|
ut_ad(que_node_get_type(func_node) == QUE_NODE_FUNC);
|
|
|
|
|
|
|
|
class = func_node->class;
|
|
|
|
func = func_node->func;
|
|
|
|
|
|
|
|
arg = func_node->args;
|
|
|
|
|
|
|
|
/* Evaluate first the argument list */
|
|
|
|
while (arg) {
|
|
|
|
eval_exp(arg);
|
|
|
|
|
|
|
|
/* The functions are not defined for SQL null argument
|
|
|
|
values, except for eval_cmp and notfound */
|
|
|
|
|
|
|
|
if ((dfield_get_len(que_node_get_val(arg)) == UNIV_SQL_NULL)
|
|
|
|
&& (class != PARS_FUNC_CMP)
|
|
|
|
&& (func != PARS_NOTFOUND_TOKEN)
|
|
|
|
&& (func != PARS_PRINTF_TOKEN)) {
|
|
|
|
ut_error;
|
|
|
|
}
|
|
|
|
|
|
|
|
arg = que_node_get_next(arg);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (class == PARS_FUNC_CMP) {
|
|
|
|
eval_cmp(func_node);
|
|
|
|
} else if (class == PARS_FUNC_ARITH) {
|
|
|
|
eval_arith(func_node);
|
|
|
|
} else if (class == PARS_FUNC_AGGREGATE) {
|
|
|
|
eval_aggregate(func_node);
|
|
|
|
} else if (class == PARS_FUNC_PREDEFINED) {
|
|
|
|
|
|
|
|
if (func == PARS_NOTFOUND_TOKEN) {
|
|
|
|
eval_notfound(func_node);
|
|
|
|
} else if (func == PARS_SUBSTR_TOKEN) {
|
|
|
|
eval_substr(func_node);
|
|
|
|
} else if (func == PARS_REPLSTR_TOKEN) {
|
|
|
|
eval_replstr(func_node);
|
|
|
|
} else if (func == PARS_INSTR_TOKEN) {
|
|
|
|
eval_instr(func_node);
|
|
|
|
} else if (func == PARS_BINARY_TO_NUMBER_TOKEN) {
|
|
|
|
eval_binary_to_number(func_node);
|
|
|
|
} else if (func == PARS_CONCAT_TOKEN) {
|
|
|
|
eval_concat(func_node);
|
|
|
|
} else if (func == PARS_TO_BINARY_TOKEN) {
|
|
|
|
eval_to_binary(func_node);
|
|
|
|
} else {
|
|
|
|
eval_predefined(func_node);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
ut_ad(class == PARS_FUNC_LOGICAL);
|
|
|
|
|
|
|
|
eval_logical(func_node);
|
|
|
|
}
|
|
|
|
}
|