Assertion `count <= lock->read_no_write_count && count2 <= 100' failed in check_locks with numerous subqueries
Affects | Status | Importance | Assigned to | Milestone | |
---|---|---|---|---|---|
MariaDB |
Fix Released
|
Undecided
|
Oleksandr "Sanja" Byelkin |
Bug Description
When using an excessive number of subqueries, the server asserted as follows. If there is a 100-table limit, it must result in a client error message and not in an assertion. Furthermore, the constant 100 should not be used in the code as a literal -- it has to have a proper name.
mysqld: thr_lock.c:255: check_locks: Assertion `count <= lock->read_
# 2011-10-14T19:23:51 #3 <signal handler called>
# 2011-10-14T19:23:51 #4 0x00000035a6e328f5 in raise () from /lib64/libc.so.6
# 2011-10-14T19:23:51 #5 0x00000035a6e340d5 in abort () from /lib64/libc.so.6
# 2011-10-14T19:23:51 #6 0x00000035a6e2b8b5 in __assert_fail () from /lib64/libc.so.6
# 2011-10-14T19:23:51 #7 0x0000000000c4590b in check_locks (lock=0x7f4f401
# 2011-10-14T19:23:51 where=0xe94ff6 "read lock with no write locks", type=TL_READ,
# 2011-10-14T19:23:51 allow_no_locks=0 '\000') at thr_lock.c:254
# 2011-10-14T19:23:51 #8 0x0000000000c46af5 in thr_lock (data=0x7f4f401
# 2011-10-14T19:23:51 lock_type=TL_READ) at thr_lock.c:665
# 2011-10-14T19:23:51 #9 0x0000000000c47c71 in thr_multi_lock (data=0x7f4f400
# 2011-10-14T19:23:51 owner=0x4a1e150) at thr_lock.c:1088
# 2011-10-14T19:23:51 #10 0x00000000006a2002 in mysql_lock_tables (thd=0x4a1cca8,
# 2011-10-14T19:23:51 sql_lock=
# 2011-10-14T19:23:51 need_reopen=
# 2011-10-14T19:23:51 #11 0x00000000006a1daa in mysql_lock_tables (thd=0x4a1cca8,
# 2011-10-14T19:23:51 tables=
# 2011-10-14T19:23:51 at lock.cc:209
# 2011-10-14T19:23:51 #12 0x000000000071ef6d in lock_tables (thd=0x4a1cca8, tables=
# 2011-10-14T19:23:51 count=104, need_reopen=
# 2011-10-14T19:23:51 #13 0x000000000071e364 in open_and_
# 2011-10-14T19:23:51 tables=
# 2011-10-14T19:23:51 #14 0x00000000006cfc9a in open_and_
# 2011-10-14T19:23:51 tables=
# 2011-10-14T19:23:51 #15 0x00000000006c7ec2 in execute_
# 2011-10-14T19:23:51 all_tables=
# 2011-10-14T19:23:51 #16 0x00000000006beebe in mysql_execute_
# 2011-10-14T19:23:51 at sql_parse.cc:2250
# 2011-10-14T19:23:51 #17 0x00000000006cac8f in mysql_parse (thd=0x4a1cca8,
test case:
--disable_
SET SESSION optimizer_switch = 'index_
SET SESSION join_cache_level = 1;
SET SESSION join_buffer_size = 131072;
SET SESSION debug = '';
--enable_
# Begin test case for query 0
--disable_warnings
DROP TABLE /*! IF EXISTS */ t1;
--enable_warnings
CREATE TABLE t1 ( col_varchar_10_utf8 varchar(10) CHARACTER SET utf8 DEFAULT NULL, col_varchar_
INSERT INTO t1 VALUES ('tzvyvdkmdh'
INSERT INTO t1 VALUES ('fltzvyvdkm'
INSERT INTO t1 VALUES ('LWWVD','w');
INSERT INTO t1 VALUES ('w','mhfltzvyv
INSERT INTO t1 VALUES ('can\'t','just');
INSERT INTO t1 VALUES ('plkpmhfltz'
INSERT INTO t1 VALUES ('jhplkpmhfl'
INSERT INTO t1 VALUES ('m','LSPKM');
INSERT INTO t1 VALUES ('LAYAK'
INSERT INTO t1 VALUES ('GGSSM','there');
INSERT INTO t1 VALUES ('j','txrcvwsqx
INSERT INTO t1 VALUES ('z','HLRYV');
INSERT INTO t1 VALUES ('y','mvxdvtxrc
INSERT INTO t1 VALUES ('d','w');
INSERT INTO t1 VALUES ('VDBGR','IGRLP');
INSERT INTO t1 VALUES ('IZZWX'
INSERT INTO t1 VALUES ('just','HIHXI');
INSERT INTO t1 VALUES ('something','l');
INSERT INTO t1 VALUES ('ljadnpwlqo','b');
INSERT INTO t1 VALUES ('n','IJMQT');
SELECT alias2
FROM t1 AS alias1
LEFT OUTER JOIN view_F AS alias2 ON alias1.
WHERE
(
SELECT i1
FROM literals.integers
WHERE i1 = 4 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 1 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 5 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 5 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 5 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 1 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 8 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 8 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 7 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 5 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 6 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 5 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 0 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 2 )
AND alias2 BETWEEN
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 9 )
OR 4 AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 8 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 0 )
OR
( 65 ,
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
,
(
SELECT i1
FROM literals.integers
WHERE i1 = 30 )
,
(
SELECT i1
FROM literals.integers
WHERE i1 = 2 )
,
(
SELECT i1
FROM literals.integers
WHERE i1 = 25 )
,
(
SELECT i1
FROM literals.integers
WHERE i1 = 100 )
,
(
SELECT i1
FROM literals.integers
WHERE i1 = 7 )
,
(
SELECT i1
FROM literals.integers
WHERE i1 = 1 )
)
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 2 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 4 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 4 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 6 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 1 )
AND alias1 BETWEEN
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 2 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 0 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 1 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 5 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 2 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 5 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 10 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 1 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 65 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 4 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 5 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 65 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 0 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 8 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 5 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 1 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 9 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 5 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 1 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 1 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 6 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 5 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 2 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 6 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 4 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 14 )
OR alias1 AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 2 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 1 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 1 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 1 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 7 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 5 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 9 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 6 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 9 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 1 )
+
(
SELECT i1
FROM literals.integers
WHERE i1 = 8 )
OR
(
SELECT i1
FROM literals.integers
WHERE i1 = 3 )
AND
(
SELECT i1
FROM literals.integers
WHERE i1 = 6 );
DROP TABLE t1;
Changed in maria: | |
assignee: | nobody → Michael Widenius (monty) |
Changed in maria: | |
milestone: | none → 5.3 |
Changed in maria: | |
assignee: | Michael Widenius (monty) → Oleksandr "Sanja" Byelkin (sanja-byelkin) |
This test suite has a lot of syntax error (fixed).
But it is not repeatable because the 100 limit now is 1000 and it id constant now:
#define MAX_LOCKS 1000
If change it to 100 the problem is repeatable. So we should decide is it OK to put in debugging version of the server such artificial limit as protection against invinite loop?