Commit 69c52ea5 authored by unknown's avatar unknown

Merge bk-internal:/home/bk/mysql-5.0

into mysql.com:/home/jimw/my/mysql-5.0-clean
parents 926e6656 40518fd0
This diff is collapsed.
...@@ -2145,12 +2145,16 @@ row_sel_convert_mysql_key_to_innobase( ...@@ -2145,12 +2145,16 @@ row_sel_convert_mysql_key_to_innobase(
} }
if (dtype_get_mysql_type(dfield_get_type(dfield)) if (dtype_get_mysql_type(dfield_get_type(dfield))
== DATA_MYSQL_TRUE_VARCHAR) { == DATA_MYSQL_TRUE_VARCHAR
&& dfield_get_type(dfield)->mtype != DATA_INT) {
/* In a MySQL key value format, a true VARCHAR is /* In a MySQL key value format, a true VARCHAR is
always preceded by 2 bytes of a length field. always preceded by 2 bytes of a length field.
dfield_get_type(dfield)->len returns the maximum dfield_get_type(dfield)->len returns the maximum
'payload' len in bytes. That does not include the 'payload' len in bytes. That does not include the
2 bytes that tell the actual data length. */ 2 bytes that tell the actual data length.
We added the check != DATA_INT to make sure we do
not treat MySQL ENUM or SET as a true VARCHAR! */
data_len += 2; data_len += 2;
data_field_len += 2; data_field_len += 2;
......
...@@ -1173,4 +1173,16 @@ col1 ...@@ -1173,4 +1173,16 @@ col1
0000-00-00 00:00:00 0000-00-00 00:00:00
NULL NULL
drop table t1; drop table t1;
create table t1 (col1 tinyint);
drop procedure if exists t1;
Warnings:
Note 1305 PROCEDURE t1 does not exist
create procedure t1 () begin declare exit handler for sqlexception
select'a'; insert into t1 values (200); end;|
call t1();
ERROR 22003: Out of range value adjusted for column 'col1' at row 1
select * from t1;
col1
drop procedure t1;
drop table t1;
set sql_mode=@org_mode; set sql_mode=@org_mode;
...@@ -1031,6 +1031,21 @@ insert into t1 select * from t1; ...@@ -1031,6 +1031,21 @@ insert into t1 select * from t1;
select * from t1; select * from t1;
drop table t1; drop table t1;
#
# Test of inserting an invalid value via a stored procedure (Bug #5907)
#
create table t1 (col1 tinyint);
drop procedure if exists t1;
delimiter |;
create procedure t1 () begin declare exit handler for sqlexception
select'a'; insert into t1 values (200); end;|
delimiter ;|
--error 1264
call t1();
select * from t1;
drop procedure t1;
drop table t1;
# #
# Restore mode # Restore mode
# #
......
...@@ -2271,13 +2271,43 @@ inline ...@@ -2271,13 +2271,43 @@ inline
ulint ulint
get_innobase_type_from_mysql_type( get_innobase_type_from_mysql_type(
/*==============================*/ /*==============================*/
/* out: DATA_BINARY, DATA_VARCHAR, ... */ /* out: DATA_BINARY, DATA_VARCHAR, ... */
Field* field) /* in: MySQL field */ ulint* unsigned_flag, /* out: DATA_UNSIGNED if an 'unsigned type';
at least ENUM and SET, and unsigned integer
types are 'unsigned types' */
Field* field) /* in: MySQL field */
{ {
/* The following asserts try to check that the MySQL type code fits in /* The following asserts try to check that the MySQL type code fits in
8 bits: this is used in ibuf and also when DATA_NOT_NULL is ORed to 8 bits: this is used in ibuf and also when DATA_NOT_NULL is ORed to
the type */ the type */
DBUG_ASSERT((ulint)FIELD_TYPE_STRING < 256);
DBUG_ASSERT((ulint)FIELD_TYPE_VAR_STRING < 256);
DBUG_ASSERT((ulint)FIELD_TYPE_DOUBLE < 256);
DBUG_ASSERT((ulint)FIELD_TYPE_FLOAT < 256);
DBUG_ASSERT((ulint)FIELD_TYPE_DECIMAL < 256);
if (field->flags & UNSIGNED_FLAG) {
*unsigned_flag = DATA_UNSIGNED;
} else {
*unsigned_flag = 0;
}
if (field->real_type() == FIELD_TYPE_ENUM
|| field->real_type() == FIELD_TYPE_SET) {
/* MySQL has field->type() a string type for these, but the
data is actually internally stored as an unsigned integer
code! */
*unsigned_flag = DATA_UNSIGNED; /* MySQL has its own unsigned
flag set to zero, even though
internally this is an unsigned
integer type */
return(DATA_INT);
}
switch (field->type()) { switch (field->type()) {
/* NOTE that we only allow string types in DATA_MYSQL /* NOTE that we only allow string types in DATA_MYSQL
and DATA_VARMYSQL */ and DATA_VARMYSQL */
...@@ -2313,8 +2343,6 @@ get_innobase_type_from_mysql_type( ...@@ -2313,8 +2343,6 @@ get_innobase_type_from_mysql_type(
case FIELD_TYPE_DATETIME: case FIELD_TYPE_DATETIME:
case FIELD_TYPE_YEAR: case FIELD_TYPE_YEAR:
case FIELD_TYPE_NEWDATE: case FIELD_TYPE_NEWDATE:
case FIELD_TYPE_ENUM:
case FIELD_TYPE_SET:
case FIELD_TYPE_TIME: case FIELD_TYPE_TIME:
case FIELD_TYPE_TIMESTAMP: case FIELD_TYPE_TIMESTAMP:
return(DATA_INT); return(DATA_INT);
...@@ -2686,7 +2714,7 @@ build_template( ...@@ -2686,7 +2714,7 @@ build_template(
get_field_offset(table, field); get_field_offset(table, field);
templ->mysql_col_len = (ulint) field->pack_length(); templ->mysql_col_len = (ulint) field->pack_length();
templ->type = get_innobase_type_from_mysql_type(field); templ->type = index->table->cols[i].type.mtype;
templ->mysql_type = (ulint)field->type(); templ->mysql_type = (ulint)field->type();
if (templ->mysql_type == DATA_MYSQL_TRUE_VARCHAR) { if (templ->mysql_type == DATA_MYSQL_TRUE_VARCHAR) {
...@@ -2698,8 +2726,8 @@ build_template( ...@@ -2698,8 +2726,8 @@ build_template(
index->table->cols[i].type.prtype); index->table->cols[i].type.prtype);
templ->mbminlen = index->table->cols[i].type.mbminlen; templ->mbminlen = index->table->cols[i].type.mbminlen;
templ->mbmaxlen = index->table->cols[i].type.mbmaxlen; templ->mbmaxlen = index->table->cols[i].type.mbmaxlen;
templ->is_unsigned = (ulint) (field->flags & UNSIGNED_FLAG); templ->is_unsigned = index->table->cols[i].type.prtype
& DATA_UNSIGNED;
if (templ->type == DATA_BLOB) { if (templ->type == DATA_BLOB) {
prebuilt->templ_contains_blob = TRUE; prebuilt->templ_contains_blob = TRUE;
} }
...@@ -2962,7 +2990,6 @@ calc_row_difference( ...@@ -2962,7 +2990,6 @@ calc_row_difference(
byte* buf; byte* buf;
upd_field_t* ufield; upd_field_t* ufield;
ulint col_type; ulint col_type;
ulint is_unsigned;
ulint n_changed = 0; ulint n_changed = 0;
dfield_t dfield; dfield_t dfield;
uint i; uint i;
...@@ -2998,8 +3025,7 @@ calc_row_difference( ...@@ -2998,8 +3025,7 @@ calc_row_difference(
field_mysql_type = field->type(); field_mysql_type = field->type();
col_type = get_innobase_type_from_mysql_type(field); col_type = prebuilt->table->cols[i].type.mtype;
is_unsigned = (ulint) (field->flags & UNSIGNED_FLAG);
switch (col_type) { switch (col_type) {
...@@ -3072,8 +3098,7 @@ calc_row_difference( ...@@ -3072,8 +3098,7 @@ calc_row_difference(
} }
ufield->exp = NULL; ufield->exp = NULL;
ufield->field_no = ufield->field_no = prebuilt->table->cols[i].clust_pos;
(prebuilt->table->cols + i)->clust_pos;
n_changed++; n_changed++;
} }
} }
...@@ -3932,19 +3957,14 @@ create_table_def( ...@@ -3932,19 +3957,14 @@ create_table_def(
for (i = 0; i < n_cols; i++) { for (i = 0; i < n_cols; i++) {
field = form->field[i]; field = form->field[i];
col_type = get_innobase_type_from_mysql_type(field); col_type = get_innobase_type_from_mysql_type(&unsigned_type,
field);
if (field->null_ptr) { if (field->null_ptr) {
nulls_allowed = 0; nulls_allowed = 0;
} else { } else {
nulls_allowed = DATA_NOT_NULL; nulls_allowed = DATA_NOT_NULL;
} }
if (field->flags & UNSIGNED_FLAG) {
unsigned_type = DATA_UNSIGNED;
} else {
unsigned_type = 0;
}
if (field->binary()) { if (field->binary()) {
binary_type = DATA_BINARY_TYPE; binary_type = DATA_BINARY_TYPE;
} else { } else {
...@@ -4021,6 +4041,7 @@ create_index( ...@@ -4021,6 +4041,7 @@ create_index(
ulint ind_type; ulint ind_type;
ulint col_type; ulint col_type;
ulint prefix_len; ulint prefix_len;
ulint is_unsigned;
ulint i; ulint i;
ulint j; ulint j;
...@@ -4070,7 +4091,8 @@ create_index( ...@@ -4070,7 +4091,8 @@ create_index(
ut_a(j < form->s->fields); ut_a(j < form->s->fields);
col_type = get_innobase_type_from_mysql_type(key_part->field); col_type = get_innobase_type_from_mysql_type(
&is_unsigned, key_part->field);
if (DATA_BLOB == col_type if (DATA_BLOB == col_type
|| (key_part->length < field->pack_length() || (key_part->length < field->pack_length()
......
...@@ -2199,7 +2199,7 @@ String *Item_char_typecast::val_str(String *str) ...@@ -2199,7 +2199,7 @@ String *Item_char_typecast::val_str(String *str)
push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN, push_warning_printf(current_thd, MYSQL_ERROR::WARN_LEVEL_WARN,
ER_TRUNCATED_WRONG_VALUE, ER_TRUNCATED_WRONG_VALUE,
ER(ER_TRUNCATED_WRONG_VALUE), char_type, ER(ER_TRUNCATED_WRONG_VALUE), char_type,
res->c_ptr()); res->c_ptr_safe());
res->length((uint) length); res->length((uint) length);
} }
null_value= 0; null_value= 0;
......
...@@ -692,11 +692,11 @@ TABLE_LIST *find_table_in_list(TABLE_LIST *table, ...@@ -692,11 +692,11 @@ TABLE_LIST *find_table_in_list(TABLE_LIST *table,
/* /*
Test that table is unique Test that table is unique (It's only exists once in the table list)
SYNOPSIS SYNOPSIS
unique_table() unique_table()
table table which should be chaked table table which should be checked
table_list list of tables table_list list of tables
NOTE: to exclude derived tables from check we use following mechanism: NOTE: to exclude derived tables from check we use following mechanism:
......
...@@ -1410,7 +1410,8 @@ class THD :public ilink, ...@@ -1410,7 +1410,8 @@ class THD :public ilink,
inline void send_kill_message() const inline void send_kill_message() const
{ {
int err= killed_errno(); int err= killed_errno();
my_message(err, ER(err), MYF(0)); if (err)
my_message(err, ER(err), MYF(0));
} }
/* return TRUE if we will abort query if we make a warning now */ /* return TRUE if we will abort query if we make a warning now */
inline bool really_abort_on_warning() inline bool really_abort_on_warning()
......
...@@ -116,15 +116,6 @@ MYSQL_ERROR *push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level, ...@@ -116,15 +116,6 @@ MYSQL_ERROR *push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level,
if (thd->query_id != thd->warn_id) if (thd->query_id != thd->warn_id)
mysql_reset_errors(thd, 0); mysql_reset_errors(thd, 0);
thd->got_warning= 1; thd->got_warning= 1;
if (thd->spcont &&
thd->spcont->find_handler(code,
((int) level >=
(int) MYSQL_ERROR::WARN_LEVEL_WARN &&
thd->really_abort_on_warning()) ?
MYSQL_ERROR::WARN_LEVEL_ERROR : level))
{
DBUG_RETURN(NULL);
}
/* Abort if we are using strict mode and we are not using IGNORE */ /* Abort if we are using strict mode and we are not using IGNORE */
if ((int) level >= (int) MYSQL_ERROR::WARN_LEVEL_WARN && if ((int) level >= (int) MYSQL_ERROR::WARN_LEVEL_WARN &&
...@@ -132,14 +123,30 @@ MYSQL_ERROR *push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level, ...@@ -132,14 +123,30 @@ MYSQL_ERROR *push_warning(THD *thd, MYSQL_ERROR::enum_warning_level level,
{ {
/* Avoid my_message() calling push_warning */ /* Avoid my_message() calling push_warning */
bool no_warnings_for_error= thd->no_warnings_for_error; bool no_warnings_for_error= thd->no_warnings_for_error;
sp_rcontext *spcont= thd->spcont;
thd->no_warnings_for_error= 1; thd->no_warnings_for_error= 1;
thd->spcont= 0;
thd->killed= THD::KILL_BAD_DATA; thd->killed= THD::KILL_BAD_DATA;
my_message(code, msg, MYF(0)); my_message(code, msg, MYF(0));
thd->spcont= spcont;
thd->no_warnings_for_error= no_warnings_for_error; thd->no_warnings_for_error= no_warnings_for_error;
/* Store error in error list (as my_message() didn't do it in this case */ /* Store error in error list (as my_message() didn't do it) */
level= MYSQL_ERROR::WARN_LEVEL_ERROR; level= MYSQL_ERROR::WARN_LEVEL_ERROR;
} }
if (thd->spcont &&
thd->spcont->find_handler(code,
((int) level >=
(int) MYSQL_ERROR::WARN_LEVEL_WARN &&
thd->really_abort_on_warning()) ?
MYSQL_ERROR::WARN_LEVEL_ERROR : level))
{
DBUG_RETURN(NULL);
}
if (thd->warn_list.elements < thd->variables.max_error_count) if (thd->warn_list.elements < thd->variables.max_error_count)
{ {
/* /*
......
...@@ -3740,9 +3740,11 @@ copy_data_between_tables(TABLE *from,TABLE *to, ...@@ -3740,9 +3740,11 @@ copy_data_between_tables(TABLE *from,TABLE *to,
goto err; goto err;
}; };
/* Handler must be told explicitly to retrieve all columns, because /*
this function does not set field->query_id in the columns to the Handler must be told explicitly to retrieve all columns, because
current query id */ this function does not set field->query_id in the columns to the
current query id
*/
from->file->extra(HA_EXTRA_RETRIEVE_ALL_COLS); from->file->extra(HA_EXTRA_RETRIEVE_ALL_COLS);
init_read_record(&info, thd, from, (SQL_SELECT *) 0, 1,1); init_read_record(&info, thd, from, (SQL_SELECT *) 0, 1,1);
if (ignore || if (ignore ||
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment