Commit 3148d6f2 authored by unknown's avatar unknown

Another bugfix for #615

Looks a bit nicer than previous one


mysql-test/r/insert.result:
  Test results added
mysql-test/t/insert.test:
  testcase for the bug added
sql/field.h:
  Field::set_default fixed
sql/field_conv.cc:
  Now we can just replace field->reset() with field->set_default() here
parent 83dc6b10
...@@ -58,6 +58,16 @@ skr 2 ...@@ -58,6 +58,16 @@ skr 2
test 1 test 1
test 2 test 2
drop table t1; drop table t1;
create table t1 (id int NOT NULL DEFAULT 8);
insert into t1 values(NULL);
Column 'id' cannot be null
insert into t1 values (1), (NULL), (2);
select * from t1;
id
1
8
2
drop table t1;
drop database if exists foo; drop database if exists foo;
create database foo; create database foo;
use foo; use foo;
......
...@@ -50,6 +50,17 @@ insert into t1 values ('rts',NULL),('rts',NULL),('test',NULL); ...@@ -50,6 +50,17 @@ insert into t1 values ('rts',NULL),('rts',NULL),('test',NULL);
select * from t1; select * from t1;
drop table t1; drop table t1;
#
#Test of behaviour with INSERT VALUES (NULL)
#
create table t1 (id int NOT NULL DEFAULT 8);
-- error 1048
insert into t1 values(NULL);
insert into t1 values (1), (NULL), (2);
select * from t1;
drop table t1;
# #
# Test of mysqld crash with fully qualified column names # Test of mysqld crash with fully qualified column names
# #
...@@ -60,3 +71,4 @@ use foo; ...@@ -60,3 +71,4 @@ use foo;
create table t1 (c int); create table t1 (c int);
insert into foo.t1 set foo.t1.c = '1'; insert into foo.t1 set foo.t1.c = '1';
drop database foo; drop database foo;
...@@ -72,10 +72,12 @@ class Field { ...@@ -72,10 +72,12 @@ class Field {
virtual void reset_fields() {} virtual void reset_fields() {}
virtual void set_default() virtual void set_default()
{ {
memcpy(ptr, ptr + table->rec_buff_length, pack_length()); my_ptrdiff_t offset = (my_ptrdiff_t) (table->record[2] -
table->record[0]);
memcpy(ptr, ptr + offset, pack_length());
if (null_ptr) if (null_ptr)
*null_ptr= ((*null_ptr & (uchar) ~null_bit) | *null_ptr= ((*null_ptr & (uchar) ~null_bit) |
null_ptr[table->rec_buff_length] & null_bit); null_ptr[offset] & null_bit);
} }
virtual bool binary() const { return 1; } virtual bool binary() const { return 1; }
virtual bool zero_pack() const { return 1; } virtual bool zero_pack() const { return 1; }
......
...@@ -118,10 +118,9 @@ set_field_to_null(Field *field) ...@@ -118,10 +118,9 @@ set_field_to_null(Field *field)
field->reset(); field->reset();
return 0; return 0;
} }
field->reset(); field->set_default();
if (current_thd->count_cuted_fields) if (current_thd->count_cuted_fields)
{ {
field->set_default();
current_thd->cuted_fields++; // Increment error counter current_thd->cuted_fields++; // Increment error counter
return 0; return 0;
} }
...@@ -171,12 +170,11 @@ set_field_to_null_with_conversions(Field *field, bool no_conversions) ...@@ -171,12 +170,11 @@ set_field_to_null_with_conversions(Field *field, bool no_conversions)
((Field_timestamp*) field)->set_time(); ((Field_timestamp*) field)->set_time();
return 0; // Ok to set time to NULL return 0; // Ok to set time to NULL
} }
field->reset(); field->set_default();
if (field == field->table->next_number_field) if (field == field->table->next_number_field)
return 0; // field is set in handler.cc return 0; // field is set in handler.cc
if (current_thd->count_cuted_fields) if (current_thd->count_cuted_fields)
{ {
field->set_default();
current_thd->cuted_fields++; // Increment error counter current_thd->cuted_fields++; // Increment error counter
return 0; return 0;
} }
......
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