Commit cc0eff3e authored by igor@olga.mysql.com's avatar igor@olga.mysql.com
Browse files

Merge olga.mysql.com:/home/igor/mysql-5.0-opt

into  olga.mysql.com:/home/igor/dev-opt/mysql-5.0-opt-bug28728
parents 91da3132 8fd809bf
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -54,6 +54,11 @@ enum thr_lock_type { TL_IGNORE=-1,
		     TL_WRITE_CONCURRENT_INSERT,
		     /* Write used by INSERT DELAYED.  Allows READ locks */
		     TL_WRITE_DELAYED,
                     /* 
                       parser only! Late bound low_priority flag. 
                       At open_tables() becomes thd->update_lock_default.
                     */
                     TL_WRITE_DEFAULT,
		     /* WRITE lock that has lower priority than TL_READ */
		     TL_WRITE_LOW_PRIORITY,
		     /* Normal WRITE lock */
+24 −0
Original line number Diff line number Diff line
@@ -1449,4 +1449,28 @@ isave
1
2
drop table t1, t2, t3;
CREATE TABLE t1 (id INTEGER);
CREATE TABLE t2 (id INTEGER);
INSERT INTO t2 VALUES (1),(2);
CREATE TRIGGER t1_test AFTER INSERT ON t1 FOR EACH ROW 
INSERT INTO t2 VALUES (new.id);
SELECT GET_LOCK('B26162',20);
GET_LOCK('B26162',20)
1
SELECT 'rl_acquirer', GET_LOCK('B26162',5), id FROM t2 WHERE id = 1;
SET SESSION LOW_PRIORITY_UPDATES=1;
SET GLOBAL LOW_PRIORITY_UPDATES=1;
INSERT INTO t1 VALUES (5);
SELECT 'rl_contender', id FROM t2 WHERE id > 1;
SELECT RELEASE_LOCK('B26162');
RELEASE_LOCK('B26162')
0
rl_acquirer	GET_LOCK('B26162',5)	id
rl_acquirer	0	1
rl_contender	id
rl_contender	2
DROP TRIGGER t1_test;
DROP TABLE t1,t2;
SET SESSION LOW_PRIORITY_UPDATES=DEFAULT;
SET GLOBAL LOW_PRIORITY_UPDATES=DEFAULT;
End of 5.0 tests
+55 −0
Original line number Diff line number Diff line
@@ -1763,4 +1763,59 @@ select * from t1;
select * from t3;
drop table t1, t2, t3;

#
# Bug #26162: Trigger DML ignores low_priority_updates setting
#
CREATE TABLE t1 (id INTEGER);
CREATE TABLE t2 (id INTEGER);

INSERT INTO t2 VALUES (1),(2);

# trigger that produces the high priority insert, but should be low, adding
# LOW_PRIORITY fixes this
CREATE TRIGGER t1_test AFTER INSERT ON t1 FOR EACH ROW 
  INSERT INTO t2 VALUES (new.id);

CONNECT (rl_acquirer,  localhost, root,,);
CONNECT (wl_acquirer,  localhost, root,,);
CONNECT (rl_contender, localhost, root,,);

SELECT GET_LOCK('B26162',20);

CONNECTION rl_acquirer;
--send
SELECT 'rl_acquirer', GET_LOCK('B26162',5), id FROM t2 WHERE id = 1;

CONNECTION wl_acquirer;
SET SESSION LOW_PRIORITY_UPDATES=1;
SET GLOBAL LOW_PRIORITY_UPDATES=1;
--send
INSERT INTO t1 VALUES (5);

CONNECTION rl_contender;
# must not "see" the row inserted by the INSERT (as it must run before the
# INSERT)
--send
SELECT 'rl_contender', id FROM t2 WHERE id > 1;

CONNECTION default;
SELECT RELEASE_LOCK('B26162');

CONNECTION wl_acquirer;
--reap
CONNECTION rl_acquirer;
--reap
CONNECTION rl_contender;
--reap

CONNECTION default;
DISCONNECT rl_acquirer;
DISCONNECT wl_acquirer;
DISCONNECT rl_contender;

DROP TRIGGER t1_test;
DROP TABLE t1,t2;
SET SESSION LOW_PRIORITY_UPDATES=DEFAULT;
SET GLOBAL LOW_PRIORITY_UPDATES=DEFAULT;

--echo End of 5.0 tests
+5 −1
Original line number Diff line number Diff line
@@ -1226,7 +1226,11 @@ static void sys_default_ftb_syntax(THD *thd, enum_var_type type)

static void fix_low_priority_updates(THD *thd, enum_var_type type)
{
  if (type != OPT_GLOBAL)
  if (type == OPT_GLOBAL)
    thr_upgraded_concurrent_insert_lock= 
      (global_system_variables.low_priority_updates ?
       TL_WRITE_LOW_PRIORITY : TL_WRITE);
  else
    thd->update_lock_default= (thd->variables.low_priority_updates ?
			       TL_WRITE_LOW_PRIORITY : TL_WRITE);
}
+7 −0
Original line number Diff line number Diff line
@@ -1505,6 +1505,7 @@ TABLE *open_table(THD *thd, TABLE_LIST *table_list, MEM_ROOT *mem_root,
  HASH_SEARCH_STATE state;
  DBUG_ENTER("open_table");

  DBUG_ASSERT (table_list->lock_type != TL_WRITE_DEFAULT);
  /* find a unused table in the open table cache */
  if (refresh)
    *refresh=0;
@@ -2674,6 +2675,12 @@ int open_tables(THD *thd, TABLE_LIST **start, uint *counter, uint flags)
  for (tables= *start; tables ;tables= tables->next_global)
  {
    safe_to_ignore_table= FALSE;                // 'FALSE', as per coding style

    if (tables->lock_type == TL_WRITE_DEFAULT)
    {
      tables->lock_type= thd->update_lock_default;
      DBUG_ASSERT (tables->lock_type >= TL_WRITE_ALLOW_WRITE);
    }
    /*
      Ignore placeholders for derived tables. After derived tables
      processing, link to created temporary table will be put here.
Loading