mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
BUG#14480, attempt2: In CREATE ... SELECT ..., don't count the same field twice
when calculating table->null_fields. mysql-test/r/create.result: Testcase for BUG#14480 mysql-test/t/create.test: Testcase for BUG#14480 sql/sql_table.cc: BUG#14480: For CREATE ... SELECT ... a field list passed to mysql_prepare_table() contains instances of create_field for both create-list and select-list. mysql_prepare_table() matches elements that refer to the same field, and joins them together. When the "join" is performed, both of create_field structures has already been counted in "null_fields". This fix makes sure that "null_fields" contains the correct value after two create_field structures have been joined.
This commit is contained in:
@ -1,4 +1,4 @@
|
|||||||
drop table if exists t1,t2,t3;
|
drop table if exists t1,t2,t3,t4,t5;
|
||||||
drop database if exists mysqltest;
|
drop database if exists mysqltest;
|
||||||
create table t1 (b char(0));
|
create table t1 (b char(0));
|
||||||
insert into t1 values (""),(null);
|
insert into t1 values (""),(null);
|
||||||
@ -632,3 +632,69 @@ t1 CREATE TABLE `t1` (
|
|||||||
PRIMARY KEY (`a`)
|
PRIMARY KEY (`a`)
|
||||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
a int(11) default NULL
|
||||||
|
);
|
||||||
|
insert into t2 values(111);
|
||||||
|
create table t1 (
|
||||||
|
a varchar(12) charset utf8 collate utf8_bin not null,
|
||||||
|
b int not null, primary key (a)
|
||||||
|
) select a, 1 as b from t2 ;
|
||||||
|
show create table t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` varchar(12) character set utf8 collate utf8_bin NOT NULL default '',
|
||||||
|
`b` int(11) NOT NULL default '0',
|
||||||
|
PRIMARY KEY (`a`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
drop table t1;
|
||||||
|
create table t1 (
|
||||||
|
a varchar(12) charset utf8 collate utf8_bin not null,
|
||||||
|
b int not null, primary key (a)
|
||||||
|
) select 'a' as a , 1 as b from t2 ;
|
||||||
|
show create table t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` varchar(12) character set utf8 collate utf8_bin NOT NULL default '',
|
||||||
|
`b` int(11) NOT NULL default '0',
|
||||||
|
PRIMARY KEY (`a`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
drop table t1;
|
||||||
|
create table t1 (
|
||||||
|
a varchar(12) charset utf8 collate utf8_bin,
|
||||||
|
b int not null, primary key (a)
|
||||||
|
) select 'a' as a , 1 as b from t2 ;
|
||||||
|
show create table t1;
|
||||||
|
Table Create Table
|
||||||
|
t1 CREATE TABLE `t1` (
|
||||||
|
`a` varchar(12) character set utf8 collate utf8_bin NOT NULL default '',
|
||||||
|
`b` int(11) NOT NULL default '0',
|
||||||
|
PRIMARY KEY (`a`)
|
||||||
|
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||||
|
drop table t1, t2;
|
||||||
|
create table t1 (
|
||||||
|
a1 int not null,
|
||||||
|
a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int, a9 int
|
||||||
|
);
|
||||||
|
insert into t1 values (1,1,1, 1,1,1, 1,1,1);
|
||||||
|
create table t2 (
|
||||||
|
a1 varchar(12) charset utf8 collate utf8_bin not null,
|
||||||
|
a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int, a9 int,
|
||||||
|
primary key (a1)
|
||||||
|
) select a1,a2,a3,a4,a5,a6,a7,a8,a9 from t1 ;
|
||||||
|
drop table t2;
|
||||||
|
create table t2 (
|
||||||
|
a1 varchar(12) charset utf8 collate utf8_bin,
|
||||||
|
a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int, a9 int
|
||||||
|
) select a1,a2,a3,a4,a5,a6,a7,a8,a9 from t1;
|
||||||
|
drop table t1, t2;
|
||||||
|
create table t1 (
|
||||||
|
a1 int, a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int, a9 int
|
||||||
|
);
|
||||||
|
insert into t1 values (1,1,1, 1,1,1, 1,1,1);
|
||||||
|
create table t2 (
|
||||||
|
a1 varchar(12) charset utf8 collate utf8_bin not null,
|
||||||
|
a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int, a9 int,
|
||||||
|
primary key (a1)
|
||||||
|
) select a1,a2,a3,a4,a5,a6,a7,a8,a9 from t1 ;
|
||||||
|
drop table t1, t2;
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
#
|
#
|
||||||
|
|
||||||
--disable_warnings
|
--disable_warnings
|
||||||
drop table if exists t1,t2,t3;
|
drop table if exists t1,t2,t3,t4,t5;
|
||||||
drop database if exists mysqltest;
|
drop database if exists mysqltest;
|
||||||
--enable_warnings
|
--enable_warnings
|
||||||
|
|
||||||
@ -534,4 +534,66 @@ create table t1 (
|
|||||||
show create table t1;
|
show create table t1;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#14480: assert failure in CREATE ... SELECT because of wrong
|
||||||
|
# calculation of number of NULLs.
|
||||||
|
#
|
||||||
|
CREATE TABLE t2 (
|
||||||
|
a int(11) default NULL
|
||||||
|
);
|
||||||
|
insert into t2 values(111);
|
||||||
|
|
||||||
|
create table t1 (
|
||||||
|
a varchar(12) charset utf8 collate utf8_bin not null,
|
||||||
|
b int not null, primary key (a)
|
||||||
|
) select a, 1 as b from t2 ;
|
||||||
|
show create table t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
create table t1 (
|
||||||
|
a varchar(12) charset utf8 collate utf8_bin not null,
|
||||||
|
b int not null, primary key (a)
|
||||||
|
) select 'a' as a , 1 as b from t2 ;
|
||||||
|
show create table t1;
|
||||||
|
drop table t1;
|
||||||
|
|
||||||
|
create table t1 (
|
||||||
|
a varchar(12) charset utf8 collate utf8_bin,
|
||||||
|
b int not null, primary key (a)
|
||||||
|
) select 'a' as a , 1 as b from t2 ;
|
||||||
|
show create table t1;
|
||||||
|
drop table t1, t2;
|
||||||
|
|
||||||
|
create table t1 (
|
||||||
|
a1 int not null,
|
||||||
|
a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int, a9 int
|
||||||
|
);
|
||||||
|
insert into t1 values (1,1,1, 1,1,1, 1,1,1);
|
||||||
|
|
||||||
|
create table t2 (
|
||||||
|
a1 varchar(12) charset utf8 collate utf8_bin not null,
|
||||||
|
a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int, a9 int,
|
||||||
|
primary key (a1)
|
||||||
|
) select a1,a2,a3,a4,a5,a6,a7,a8,a9 from t1 ;
|
||||||
|
drop table t2;
|
||||||
|
|
||||||
|
create table t2 (
|
||||||
|
a1 varchar(12) charset utf8 collate utf8_bin,
|
||||||
|
a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int, a9 int
|
||||||
|
) select a1,a2,a3,a4,a5,a6,a7,a8,a9 from t1;
|
||||||
|
|
||||||
|
drop table t1, t2;
|
||||||
|
create table t1 (
|
||||||
|
a1 int, a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int, a9 int
|
||||||
|
);
|
||||||
|
insert into t1 values (1,1,1, 1,1,1, 1,1,1);
|
||||||
|
|
||||||
|
create table t2 (
|
||||||
|
a1 varchar(12) charset utf8 collate utf8_bin not null,
|
||||||
|
a2 int, a3 int, a4 int, a5 int, a6 int, a7 int, a8 int, a9 int,
|
||||||
|
primary key (a1)
|
||||||
|
) select a1,a2,a3,a4,a5,a6,a7,a8,a9 from t1 ;
|
||||||
|
|
||||||
|
drop table t1, t2;
|
||||||
|
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
@ -647,8 +647,15 @@ int mysql_prepare_table(THD *thd, HA_CREATE_INFO *create_info,
|
|||||||
sql_field->pack_length= dup_field->pack_length;
|
sql_field->pack_length= dup_field->pack_length;
|
||||||
sql_field->create_length_to_internal_length();
|
sql_field->create_length_to_internal_length();
|
||||||
sql_field->decimals= dup_field->decimals;
|
sql_field->decimals= dup_field->decimals;
|
||||||
sql_field->flags= dup_field->flags;
|
|
||||||
sql_field->unireg_check= dup_field->unireg_check;
|
sql_field->unireg_check= dup_field->unireg_check;
|
||||||
|
/*
|
||||||
|
We're making one field from two, the result field will have
|
||||||
|
dup_field->flags as flags. If we've incremented null_fields
|
||||||
|
because of sql_field->flags, decrement it back.
|
||||||
|
*/
|
||||||
|
if (!(sql_field->flags & NOT_NULL_FLAG))
|
||||||
|
null_fields--;
|
||||||
|
sql_field->flags= dup_field->flags;
|
||||||
it2.remove(); // Remove first (create) definition
|
it2.remove(); // Remove first (create) definition
|
||||||
select_field_pos--;
|
select_field_pos--;
|
||||||
break;
|
break;
|
||||||
|
Reference in New Issue
Block a user