Commit 9a1d8adc authored by gkodinov/kgeorge@macbook.gmz's avatar gkodinov/kgeorge@macbook.gmz
Browse files

Bug #26162: Trigger DML ignores low_priority_updates setting

  
The value of "low-priority-updates" option and the LOW PRIORITY
prefix was taken into account at parse time.
This caused triggers (among others) to ignore this flag (if
supplied for the DML statement).
Moved reading of the LOW_PRIORITY flag at run time.
Fixed an incosistency when handling
SET GLOBAL LOW_PRIORITY_UPDATES : now it is in effect for
delayed INSERTs.
Tested by checking the effect of LOW_PRIORITY flag via a 
trigger.
parent 48fe2802
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;
@@ -2667,6 +2668,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