Merge remote-tracking branch 'origin/10.2' into bb-10.2-ext
This commit is contained in:
commit
1b3bd00c6b
@ -618,3 +618,14 @@ connection default;
|
||||
set @@global.max_allowed_packet = default;
|
||||
set @@global.net_buffer_length = default;
|
||||
disconnect newconn;
|
||||
create table t1(j longtext, p longtext);
|
||||
insert into t1 values
|
||||
('{"a":1,"b":2,"c":3}','$.a'),
|
||||
('{"a":1,"b":2,"c":3}','$.b'),
|
||||
('{"a":1,"b":2,"c":3}','$.c');
|
||||
select j, p, json_remove(j, p) from t1;
|
||||
j p json_remove(j, p)
|
||||
{"a":1,"b":2,"c":3} $.a {"b": 2, "c": 3}
|
||||
{"a":1,"b":2,"c":3} $.b {"a": 1, "c": 3}
|
||||
{"a":1,"b":2,"c":3} $.c {"a": 1, "b": 2}
|
||||
drop table t1;
|
||||
|
28
mysql-test/suite/innodb/r/trigger_error.result
Normal file
28
mysql-test/suite/innodb/r/trigger_error.result
Normal file
@ -0,0 +1,28 @@
|
||||
CREATE TABLE t1 (i INT) ENGINE=InnoDB;
|
||||
CREATE TABLE t2 (i INT) ENGINE=InnoDB;
|
||||
CREATE OR REPLACE TRIGGER tr1
|
||||
AFTER UPDATE ON t2
|
||||
FOR EACH ROW
|
||||
INSERT INTO tlog (i) VALUES (1);
|
||||
INSERT IGNORE INTO t2 VALUES (1);
|
||||
CREATE TRIGGER IF NOT EXISTS tr2
|
||||
BEFORE INSERT ON t2
|
||||
FOR EACH ROW
|
||||
INSERT INTO tlog (i) VALUES (2);
|
||||
START TRANSACTION;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
UPDATE t2 SET i = 3;
|
||||
ERROR 42S02: Table 'test.tlog' doesn't exist
|
||||
INSERT INTO t1 VALUES (2);
|
||||
INSERT INTO t2 VALUES (4);
|
||||
ERROR 42S02: Table 'test.tlog' doesn't exist
|
||||
UPDATE t1 SET i = 4 LIMIT 1;
|
||||
COMMIT;
|
||||
SELECT * FROM t1;
|
||||
i
|
||||
4
|
||||
2
|
||||
SELECT * FROM t2;
|
||||
i
|
||||
1
|
||||
DROP TABLE t1,t2;
|
31
mysql-test/suite/innodb/t/trigger_error.test
Normal file
31
mysql-test/suite/innodb/t/trigger_error.test
Normal file
@ -0,0 +1,31 @@
|
||||
--source include/have_innodb.inc
|
||||
|
||||
CREATE TABLE t1 (i INT) ENGINE=InnoDB;
|
||||
CREATE TABLE t2 (i INT) ENGINE=InnoDB;
|
||||
|
||||
CREATE OR REPLACE TRIGGER tr1
|
||||
AFTER UPDATE ON t2
|
||||
FOR EACH ROW
|
||||
INSERT INTO tlog (i) VALUES (1);
|
||||
|
||||
INSERT IGNORE INTO t2 VALUES (1);
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS tr2
|
||||
BEFORE INSERT ON t2
|
||||
FOR EACH ROW
|
||||
INSERT INTO tlog (i) VALUES (2);
|
||||
|
||||
START TRANSACTION;
|
||||
INSERT INTO t1 VALUES (1);
|
||||
--error ER_NO_SUCH_TABLE
|
||||
UPDATE t2 SET i = 3;
|
||||
INSERT INTO t1 VALUES (2);
|
||||
--error ER_NO_SUCH_TABLE
|
||||
INSERT INTO t2 VALUES (4);
|
||||
UPDATE t1 SET i = 4 LIMIT 1;
|
||||
COMMIT;
|
||||
|
||||
SELECT * FROM t1;
|
||||
SELECT * FROM t2;
|
||||
|
||||
DROP TABLE t1,t2;
|
@ -263,3 +263,14 @@ set @@global.max_allowed_packet = default;
|
||||
set @@global.net_buffer_length = default;
|
||||
--disconnect newconn
|
||||
|
||||
|
||||
#
|
||||
# MDEV-12262 Assertion `!null_value' failed in virtual bool Item::send on JSON_REMOVE.
|
||||
#
|
||||
create table t1(j longtext, p longtext);
|
||||
insert into t1 values
|
||||
('{"a":1,"b":2,"c":3}','$.a'),
|
||||
('{"a":1,"b":2,"c":3}','$.b'),
|
||||
('{"a":1,"b":2,"c":3}','$.c');
|
||||
select j, p, json_remove(j, p) from t1;
|
||||
drop table t1;
|
||||
|
@ -2633,6 +2633,7 @@ v_found:
|
||||
str->length(0);
|
||||
|
||||
if (append_simple(str, js->ptr(), rem_start - js->ptr()) ||
|
||||
(je.state == JST_KEY && n_item > 0 && str->append(",", 1)) ||
|
||||
append_simple(str, rem_end, js->end() - rem_end))
|
||||
goto js_error; /* Out of memory. */
|
||||
|
||||
@ -2658,6 +2659,7 @@ v_found:
|
||||
if (json_nice(&je, str, Item_func_json_format::LOOSE))
|
||||
goto js_error;
|
||||
|
||||
null_value= 0;
|
||||
return str;
|
||||
|
||||
js_error:
|
||||
|
@ -7448,6 +7448,8 @@ ER_GEOJSON_NOT_CLOSED
|
||||
eng "Incorrect GeoJSON format - polygon not closed."
|
||||
ER_JSON_PATH_EMPTY
|
||||
eng "Path expression '$' is not allowed in argument %d to function '%s'."
|
||||
ER_SLAVE_SAME_ID
|
||||
eng "A slave with the same server_uuid/server_id as this slave has connected to the master"
|
||||
ER_ILLEGAL_PARAMETER_DATA_TYPES2_FOR_OPERATION
|
||||
eng "Illegal parameter data types %s and %s for operation '%s'"
|
||||
ER_ILLEGAL_PARAMETER_DATA_TYPE_FOR_OPERATION
|
||||
|
@ -201,6 +201,9 @@ extern "C" sig_handler handle_fatal_signal(int sig)
|
||||
case ABORT_QUERY_HARD:
|
||||
kreason= "ABORT_QUERY";
|
||||
break;
|
||||
case KILL_SLAVE_SAME_ID:
|
||||
kreason= "KILL_SLAVE_SAME_ID";
|
||||
break;
|
||||
}
|
||||
my_safe_printf_stderr("%s", "\n"
|
||||
"Trying to get some variables.\n"
|
||||
|
@ -1987,6 +1987,8 @@ int killed_errno(killed_state killed)
|
||||
case KILL_SERVER:
|
||||
case KILL_SERVER_HARD:
|
||||
DBUG_RETURN(ER_SERVER_SHUTDOWN);
|
||||
case KILL_SLAVE_SAME_ID:
|
||||
DBUG_RETURN(ER_SLAVE_SAME_ID);
|
||||
}
|
||||
DBUG_RETURN(0); // Keep compiler happy
|
||||
}
|
||||
|
@ -477,17 +477,23 @@ enum killed_state
|
||||
ABORT_QUERY_HARD= 7,
|
||||
KILL_TIMEOUT= 8,
|
||||
KILL_TIMEOUT_HARD= 9,
|
||||
/*
|
||||
When binlog reading thread connects to the server it kills
|
||||
all the binlog threads with the same ID.
|
||||
*/
|
||||
KILL_SLAVE_SAME_ID= 10,
|
||||
/*
|
||||
All of the following killed states will kill the connection
|
||||
KILL_CONNECTION must be the first of these and it must start with
|
||||
an even number (becasue of HARD bit)!
|
||||
*/
|
||||
KILL_CONNECTION= 10,
|
||||
KILL_CONNECTION_HARD= 11,
|
||||
KILL_SYSTEM_THREAD= 12,
|
||||
KILL_SYSTEM_THREAD_HARD= 13,
|
||||
KILL_SERVER= 14,
|
||||
KILL_SERVER_HARD= 15
|
||||
KILL_CONNECTION= 12,
|
||||
KILL_CONNECTION_HARD= 13,
|
||||
KILL_SYSTEM_THREAD= 14,
|
||||
KILL_SYSTEM_THREAD_HARD= 15,
|
||||
KILL_SERVER= 16,
|
||||
KILL_SERVER_HARD= 17,
|
||||
|
||||
};
|
||||
|
||||
extern int killed_errno(killed_state killed);
|
||||
|
@ -2910,6 +2910,13 @@ err:
|
||||
THD_STAGE_INFO(thd, stage_waiting_to_finalize_termination);
|
||||
RUN_HOOK(binlog_transmit, transmit_stop, (thd, flags));
|
||||
|
||||
if (info->thd->killed == KILL_SLAVE_SAME_ID)
|
||||
{
|
||||
info->errmsg= "A slave with the same server_uuid/server_id as this slave "
|
||||
"has connected to the master";
|
||||
info->error= ER_SLAVE_SAME_ID;
|
||||
}
|
||||
|
||||
const bool binlog_open = my_b_inited(&log);
|
||||
if (file >= 0)
|
||||
{
|
||||
@ -2921,7 +2928,8 @@ err:
|
||||
thd->variables.max_allowed_packet= old_max_allowed_packet;
|
||||
delete info->fdev;
|
||||
|
||||
if (info->error == ER_MASTER_FATAL_ERROR_READING_BINLOG && binlog_open)
|
||||
if ((info->error == ER_MASTER_FATAL_ERROR_READING_BINLOG ||
|
||||
info->error == ER_SLAVE_SAME_ID) && binlog_open)
|
||||
{
|
||||
/*
|
||||
detailing the fatal error message with coordinates
|
||||
@ -3392,7 +3400,7 @@ void kill_zombie_dump_threads(uint32 slave_server_id)
|
||||
it will be slow because it will iterate through the list
|
||||
again. We just to do kill the thread ourselves.
|
||||
*/
|
||||
tmp->awake(KILL_QUERY);
|
||||
tmp->awake(KILL_SLAVE_SAME_ID);
|
||||
mysql_mutex_unlock(&tmp->LOCK_thd_data);
|
||||
}
|
||||
}
|
||||
|
@ -61,7 +61,7 @@ ut_dbg_assertion_failed(
|
||||
ut_dbg_assertion_failed(0, __FILE__, __LINE__)
|
||||
|
||||
/** Debug assertion */
|
||||
#define ut_ad(EXPR) DBUG_ASSERT(EXPR)
|
||||
#define ut_ad DBUG_ASSERT
|
||||
#ifdef UNIV_DEBUG
|
||||
/** Debug statement. Does nothing unless UNIV_DEBUG is defined. */
|
||||
#define ut_d(EXPR) EXPR
|
||||
|
@ -2005,10 +2005,9 @@ trx_undo_report_row_operation(
|
||||
undo->empty = FALSE;
|
||||
undo->top_page_no = page_no;
|
||||
undo->top_offset = offset;
|
||||
undo->top_undo_no = trx->undo_no;
|
||||
undo->top_undo_no = trx->undo_no++;
|
||||
undo->guess_block = undo_block;
|
||||
|
||||
trx->undo_no++;
|
||||
trx->undo_rseg_space = rseg->space;
|
||||
|
||||
mutex_exit(&trx->undo_mutex);
|
||||
|
@ -990,11 +990,11 @@ trx_roll_pop_top_rec_of_trx(trx_t* trx, roll_ptr_t* roll_ptr, mem_heap_t* heap)
|
||||
trx_undo_t* temp = trx->rsegs.m_noredo.undo;
|
||||
const undo_no_t limit = trx->roll_limit;
|
||||
|
||||
ut_ad(!insert || !update || !insert->top_undo_no
|
||||
ut_ad(!insert || !update || insert->empty || update->empty
|
||||
|| insert->top_undo_no != update->top_undo_no);
|
||||
ut_ad(!insert || !temp || !insert->top_undo_no
|
||||
ut_ad(!insert || !temp || insert->empty || temp->empty
|
||||
|| insert->top_undo_no != temp->top_undo_no);
|
||||
ut_ad(!update || !temp || !update->top_undo_no
|
||||
ut_ad(!update || !temp || update->empty || temp->empty
|
||||
|| update->top_undo_no != temp->top_undo_no);
|
||||
|
||||
if (insert && !insert->empty && limit <= insert->top_undo_no) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user