mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Merge mysqldev@production.mysql.com:my/mysql-5.0-release
into mysql.com:/Users/kent/mysql/bk/mysql-5.0-release
This commit is contained in:
@ -2616,31 +2616,50 @@ SET FOREIGN_KEY_CHECKS=1;
|
|||||||
INSERT INTO t2 VALUES(3);
|
INSERT INTO t2 VALUES(3);
|
||||||
ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test/t2`, CONSTRAINT `c1` FOREIGN KEY (`v`) REFERENCES `t1` (`id`))
|
ERROR 23000: Cannot add or update a child row: a foreign key constraint fails (`test/t2`, CONSTRAINT `c1` FOREIGN KEY (`v`) REFERENCES `t1` (`id`))
|
||||||
DROP TABLE t2;
|
DROP TABLE t2;
|
||||||
create table test_checksum(a int not null) engine=innodb DEFAULT CHARSET=latin1;
|
create table t1(a int not null) engine=innodb DEFAULT CHARSET=latin1;
|
||||||
insert into test_checksum values (1),(2);
|
insert into t1 values (1),(2);
|
||||||
set autocommit=0;
|
set autocommit=0;
|
||||||
checksum table test_checksum;
|
checksum table t1;
|
||||||
Table Checksum
|
Table Checksum
|
||||||
test.test_checksum 1531596814
|
test.t1 1531596814
|
||||||
insert into test_checksum values(3);
|
insert into t1 values(3);
|
||||||
checksum table test_checksum;
|
checksum table t1;
|
||||||
Table Checksum
|
Table Checksum
|
||||||
test.test_checksum 2605035534
|
test.t1 2605035534
|
||||||
commit;
|
commit;
|
||||||
checksum table test_checksum;
|
checksum table t1;
|
||||||
Table Checksum
|
Table Checksum
|
||||||
test.test_checksum 127268899
|
test.t1 127268899
|
||||||
commit;
|
commit;
|
||||||
drop table test_checksum;
|
drop table t1;
|
||||||
create table test_checksum(a int not null) engine=innodb DEFAULT CHARSET=latin1;
|
create table t1(a int not null) engine=innodb DEFAULT CHARSET=latin1;
|
||||||
insert into test_checksum values (1),(2);
|
insert into t1 values (1),(2);
|
||||||
set autocommit=1;
|
set autocommit=1;
|
||||||
checksum table test_checksum;
|
checksum table t1;
|
||||||
Table Checksum
|
Table Checksum
|
||||||
test.test_checksum 1531596814
|
test.t1 1531596814
|
||||||
set autocommit=1;
|
set autocommit=1;
|
||||||
insert into test_checksum values(3);
|
insert into t1 values(3);
|
||||||
checksum table test_checksum;
|
checksum table t1;
|
||||||
Table Checksum
|
Table Checksum
|
||||||
test.test_checksum 127268899
|
test.t1 127268899
|
||||||
drop table test_checksum;
|
drop table t1;
|
||||||
|
create table t1 (col1 integer primary key, col2 integer) engine=innodb;
|
||||||
|
insert t1 values (1,100);
|
||||||
|
create function f1 () returns integer begin
|
||||||
|
declare var1 int;
|
||||||
|
select col2 into var1 from t1 where col1=1 for update;
|
||||||
|
return var1;
|
||||||
|
end|
|
||||||
|
start transaction;
|
||||||
|
select f1();
|
||||||
|
f1()
|
||||||
|
100
|
||||||
|
update t1 set col2=0 where col1=1;
|
||||||
|
select * from t1;
|
||||||
|
col1 col2
|
||||||
|
1 100
|
||||||
|
rollback;
|
||||||
|
rollback;
|
||||||
|
drop table t1;
|
||||||
|
drop function f1;
|
||||||
|
@ -1571,36 +1571,67 @@ DROP TABLE t2;
|
|||||||
connect (a,localhost,root,,);
|
connect (a,localhost,root,,);
|
||||||
connect (b,localhost,root,,);
|
connect (b,localhost,root,,);
|
||||||
connection a;
|
connection a;
|
||||||
create table test_checksum(a int not null) engine=innodb DEFAULT CHARSET=latin1;
|
create table t1(a int not null) engine=innodb DEFAULT CHARSET=latin1;
|
||||||
insert into test_checksum values (1),(2);
|
insert into t1 values (1),(2);
|
||||||
set autocommit=0;
|
set autocommit=0;
|
||||||
checksum table test_checksum;
|
checksum table t1;
|
||||||
connection b;
|
connection b;
|
||||||
insert into test_checksum values(3);
|
insert into t1 values(3);
|
||||||
connection a;
|
connection a;
|
||||||
#
|
#
|
||||||
# Here checksum should not see insert
|
# Here checksum should not see insert
|
||||||
#
|
#
|
||||||
checksum table test_checksum;
|
checksum table t1;
|
||||||
connection a;
|
connection a;
|
||||||
commit;
|
commit;
|
||||||
checksum table test_checksum;
|
checksum table t1;
|
||||||
commit;
|
commit;
|
||||||
drop table test_checksum;
|
drop table t1;
|
||||||
#
|
#
|
||||||
# autocommit = 1
|
# autocommit = 1
|
||||||
#
|
#
|
||||||
connection a;
|
connection a;
|
||||||
create table test_checksum(a int not null) engine=innodb DEFAULT CHARSET=latin1;
|
create table t1(a int not null) engine=innodb DEFAULT CHARSET=latin1;
|
||||||
insert into test_checksum values (1),(2);
|
insert into t1 values (1),(2);
|
||||||
set autocommit=1;
|
set autocommit=1;
|
||||||
checksum table test_checksum;
|
checksum table t1;
|
||||||
connection b;
|
connection b;
|
||||||
set autocommit=1;
|
set autocommit=1;
|
||||||
insert into test_checksum values(3);
|
insert into t1 values(3);
|
||||||
connection a;
|
connection a;
|
||||||
#
|
#
|
||||||
# Here checksum sees insert
|
# Here checksum sees insert
|
||||||
#
|
#
|
||||||
checksum table test_checksum;
|
checksum table t1;
|
||||||
drop table test_checksum;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# BUG#11238 - in prelocking mode SELECT .. FOR UPDATE is changed to
|
||||||
|
# non-blocking SELECT
|
||||||
|
#
|
||||||
|
create table t1 (col1 integer primary key, col2 integer) engine=innodb;
|
||||||
|
insert t1 values (1,100);
|
||||||
|
delimiter |;
|
||||||
|
create function f1 () returns integer begin
|
||||||
|
declare var1 int;
|
||||||
|
select col2 into var1 from t1 where col1=1 for update;
|
||||||
|
return var1;
|
||||||
|
end|
|
||||||
|
delimiter ;|
|
||||||
|
start transaction;
|
||||||
|
select f1();
|
||||||
|
connection b;
|
||||||
|
send update t1 set col2=0 where col1=1;
|
||||||
|
connection default;
|
||||||
|
select * from t1;
|
||||||
|
connection a;
|
||||||
|
rollback;
|
||||||
|
connection b;
|
||||||
|
reap;
|
||||||
|
rollback;
|
||||||
|
connection default;
|
||||||
|
drop table t1;
|
||||||
|
drop function f1;
|
||||||
|
disconnect a;
|
||||||
|
disconnect b;
|
||||||
|
|
||||||
|
@ -1894,7 +1894,7 @@ int ha_berkeley::external_lock(THD *thd, int lock_type)
|
|||||||
Under LOCK TABLES, each used tables will force a call to start_stmt.
|
Under LOCK TABLES, each used tables will force a call to start_stmt.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int ha_berkeley::start_stmt(THD *thd)
|
int ha_berkeley::start_stmt(THD *thd, thr_lock_type lock_type)
|
||||||
{
|
{
|
||||||
int error=0;
|
int error=0;
|
||||||
DBUG_ENTER("ha_berkeley::start_stmt");
|
DBUG_ENTER("ha_berkeley::start_stmt");
|
||||||
|
@ -124,7 +124,7 @@ class ha_berkeley: public handler
|
|||||||
int extra(enum ha_extra_function operation);
|
int extra(enum ha_extra_function operation);
|
||||||
int reset(void);
|
int reset(void);
|
||||||
int external_lock(THD *thd, int lock_type);
|
int external_lock(THD *thd, int lock_type);
|
||||||
int start_stmt(THD *thd);
|
int start_stmt(THD *thd, thr_lock_type lock_type);
|
||||||
void position(byte *record);
|
void position(byte *record);
|
||||||
int analyze(THD* thd,HA_CHECK_OPT* check_opt);
|
int analyze(THD* thd,HA_CHECK_OPT* check_opt);
|
||||||
int optimize(THD* thd, HA_CHECK_OPT* check_opt);
|
int optimize(THD* thd, HA_CHECK_OPT* check_opt);
|
||||||
|
@ -6000,7 +6000,8 @@ int
|
|||||||
ha_innobase::start_stmt(
|
ha_innobase::start_stmt(
|
||||||
/*====================*/
|
/*====================*/
|
||||||
/* out: 0 or error code */
|
/* out: 0 or error code */
|
||||||
THD* thd) /* in: handle to the user thread */
|
THD* thd, /* in: handle to the user thread */
|
||||||
|
thr_lock_type lock_type)
|
||||||
{
|
{
|
||||||
row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt;
|
row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt;
|
||||||
trx_t* trx;
|
trx_t* trx;
|
||||||
@ -6041,7 +6042,7 @@ ha_innobase::start_stmt(
|
|||||||
} else {
|
} else {
|
||||||
if (trx->isolation_level != TRX_ISO_SERIALIZABLE
|
if (trx->isolation_level != TRX_ISO_SERIALIZABLE
|
||||||
&& thd->lex->sql_command == SQLCOM_SELECT
|
&& thd->lex->sql_command == SQLCOM_SELECT
|
||||||
&& thd->lex->lock_option == TL_READ) {
|
&& lock_type == TL_READ) {
|
||||||
|
|
||||||
/* For other than temporary tables, we obtain
|
/* For other than temporary tables, we obtain
|
||||||
no lock for consistent read (plain SELECT). */
|
no lock for consistent read (plain SELECT). */
|
||||||
|
@ -150,7 +150,7 @@ class ha_innobase: public handler
|
|||||||
int extra(enum ha_extra_function operation);
|
int extra(enum ha_extra_function operation);
|
||||||
int external_lock(THD *thd, int lock_type);
|
int external_lock(THD *thd, int lock_type);
|
||||||
int transactional_table_lock(THD *thd, int lock_type);
|
int transactional_table_lock(THD *thd, int lock_type);
|
||||||
int start_stmt(THD *thd);
|
int start_stmt(THD *thd, thr_lock_type lock_type);
|
||||||
|
|
||||||
void position(byte *record);
|
void position(byte *record);
|
||||||
ha_rows records_in_range(uint inx, key_range *min_key, key_range
|
ha_rows records_in_range(uint inx, key_range *min_key, key_range
|
||||||
|
@ -3401,7 +3401,7 @@ int ha_ndbcluster::external_lock(THD *thd, int lock_type)
|
|||||||
startTransaction for each transaction/statement.
|
startTransaction for each transaction/statement.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int ha_ndbcluster::start_stmt(THD *thd)
|
int ha_ndbcluster::start_stmt(THD *thd, thr_lock_type lock_type)
|
||||||
{
|
{
|
||||||
int error=0;
|
int error=0;
|
||||||
DBUG_ENTER("start_stmt");
|
DBUG_ENTER("start_stmt");
|
||||||
|
@ -501,7 +501,7 @@ class ha_ndbcluster: public handler
|
|||||||
int extra(enum ha_extra_function operation);
|
int extra(enum ha_extra_function operation);
|
||||||
int extra_opt(enum ha_extra_function operation, ulong cache_size);
|
int extra_opt(enum ha_extra_function operation, ulong cache_size);
|
||||||
int external_lock(THD *thd, int lock_type);
|
int external_lock(THD *thd, int lock_type);
|
||||||
int start_stmt(THD *thd);
|
int start_stmt(THD *thd, thr_lock_type lock_type);
|
||||||
const char * table_type() const;
|
const char * table_type() const;
|
||||||
const char ** bas_ext() const;
|
const char ** bas_ext() const;
|
||||||
ulong table_flags(void) const;
|
ulong table_flags(void) const;
|
||||||
|
@ -654,7 +654,7 @@ public:
|
|||||||
virtual int reset() { return extra(HA_EXTRA_RESET); }
|
virtual int reset() { return extra(HA_EXTRA_RESET); }
|
||||||
virtual int external_lock(THD *thd, int lock_type) { return 0; }
|
virtual int external_lock(THD *thd, int lock_type) { return 0; }
|
||||||
virtual void unlock_row() {}
|
virtual void unlock_row() {}
|
||||||
virtual int start_stmt(THD *thd) {return 0;}
|
virtual int start_stmt(THD *thd, thr_lock_type lock_type) {return 0;}
|
||||||
/*
|
/*
|
||||||
This is called to delete all rows in a table
|
This is called to delete all rows in a table
|
||||||
If the handler don't support this, then this function will
|
If the handler don't support this, then this function will
|
||||||
|
@ -2148,7 +2148,7 @@ static bool check_lock_and_start_stmt(THD *thd, TABLE *table,
|
|||||||
my_error(ER_TABLE_NOT_LOCKED_FOR_WRITE, MYF(0),table->alias);
|
my_error(ER_TABLE_NOT_LOCKED_FOR_WRITE, MYF(0),table->alias);
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
if ((error=table->file->start_stmt(thd)))
|
if ((error=table->file->start_stmt(thd, lock_type)))
|
||||||
{
|
{
|
||||||
table->file->print_error(error,MYF(0));
|
table->file->print_error(error,MYF(0));
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
|
@ -482,8 +482,6 @@ err:
|
|||||||
|
|
||||||
/* index of revision number in following table */
|
/* index of revision number in following table */
|
||||||
static const int revision_number_position= 8;
|
static const int revision_number_position= 8;
|
||||||
/* index of source */
|
|
||||||
static const int source_number_position= 11;
|
|
||||||
/* index of last required parameter for making view */
|
/* index of last required parameter for making view */
|
||||||
static const int required_view_parameters= 10;
|
static const int required_view_parameters= 10;
|
||||||
/* number of backups */
|
/* number of backups */
|
||||||
@ -1414,17 +1412,27 @@ mysql_rename_view(THD *thd,
|
|||||||
if ((parser= sql_parse_prepare(&pathstr, thd->mem_root, 1)) &&
|
if ((parser= sql_parse_prepare(&pathstr, thd->mem_root, 1)) &&
|
||||||
is_equal(&view_type, parser->type()))
|
is_equal(&view_type, parser->type()))
|
||||||
{
|
{
|
||||||
|
TABLE_LIST view_def;
|
||||||
char dir_buff[FN_REFLEN], file_buff[FN_REFLEN];
|
char dir_buff[FN_REFLEN], file_buff[FN_REFLEN];
|
||||||
|
|
||||||
|
/*
|
||||||
|
To be PS-friendly we should either to restore state of
|
||||||
|
TABLE_LIST object pointed by 'view' after using it for
|
||||||
|
view definition parsing or use temporary 'view_def'
|
||||||
|
object for it.
|
||||||
|
*/
|
||||||
|
bzero(&view_def, sizeof(view_def));
|
||||||
|
view_def.timestamp.str= view_def.timestamp_buffer;
|
||||||
|
view_def.view_suid= TRUE;
|
||||||
|
|
||||||
/* get view definition and source */
|
/* get view definition and source */
|
||||||
if (mysql_make_view(parser, view) ||
|
if (parser->parse((gptr)&view_def, thd->mem_root, view_parameters,
|
||||||
parser->parse((gptr)view, thd->mem_root,
|
sizeof(view_parameters)/sizeof(view_parameters[0])-1))
|
||||||
view_parameters + source_number_position, 1))
|
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
/* rename view and it's backups */
|
/* rename view and it's backups */
|
||||||
if (rename_in_schema_file(view->db, view->table_name, new_name,
|
if (rename_in_schema_file(view->db, view->table_name, new_name,
|
||||||
view->revision - 1, num_view_backups))
|
view_def.revision - 1, num_view_backups))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
strxnmov(dir_buff, FN_REFLEN, mysql_data_home, "/", view->db, "/", NullS);
|
strxnmov(dir_buff, FN_REFLEN, mysql_data_home, "/", view->db, "/", NullS);
|
||||||
@ -1438,12 +1446,12 @@ mysql_rename_view(THD *thd,
|
|||||||
- file_buff);
|
- file_buff);
|
||||||
|
|
||||||
if (sql_create_definition_file(&pathstr, &file, view_file_type,
|
if (sql_create_definition_file(&pathstr, &file, view_file_type,
|
||||||
(gptr)view, view_parameters,
|
(gptr)&view_def, view_parameters,
|
||||||
num_view_backups))
|
num_view_backups))
|
||||||
{
|
{
|
||||||
/* restore renamed view in case of error */
|
/* restore renamed view in case of error */
|
||||||
rename_in_schema_file(view->db, new_name, view->table_name,
|
rename_in_schema_file(view->db, new_name, view->table_name,
|
||||||
view->revision - 1, num_view_backups);
|
view_def.revision - 1, num_view_backups);
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
} else
|
} else
|
||||||
@ -1455,10 +1463,5 @@ mysql_rename_view(THD *thd,
|
|||||||
error= FALSE;
|
error= FALSE;
|
||||||
|
|
||||||
err:
|
err:
|
||||||
/*
|
|
||||||
We have to explicitly call destructor for view's LEX since it won't
|
|
||||||
be called otherwise.
|
|
||||||
*/
|
|
||||||
delete view->view;
|
|
||||||
DBUG_RETURN(error);
|
DBUG_RETURN(error);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user