Details
-
Type:
Bug
-
Status: Closed
-
Priority:
Major
-
Resolution: Fixed
-
Affects Version/s: 10.1, 10.0
-
Fix Version/s: 10.0.21
-
Component/s: Data Manipulation - Update, Optimizer, Prepared Statements
-
Labels:None
-
Sprint:10.0.20
Description
CREATE TABLE t1 (f1 INT); INSERT INTO t1 VALUES (1),(2); CREATE TABLE t2 (f2 INT); INSERT INTO t2 VALUES (3),(4); CREATE TABLE t3 (f3 INT); INSERT INTO t3 VALUES (5),(6); PREPARE stmt FROM ' UPDATE t1, t2 SET f1 = 5 WHERE 8 IN ( SELECT MIN(f3) FROM t3 ) '; EXECUTE stmt; EXECUTE stmt;
Stack trace from 10.0 commit 50d98e9c
10.0/sql/sql_acl.cc:10717: static const ACL_internal_schema_access* ACL_internal_schema_registry::lookup(const char*): Assertion `name != __null' failed. 150409 20:14:21 [ERROR] mysqld got signal 6 ; #6 0x00007f5990d3b311 in *__GI___assert_fail (assertion=0xef24c4 "name != __null", file=<optimized out>, line=10717, function=0xef3aa0 "static const ACL_internal_schema_access* ACL_internal_schema_registry::lookup(const char*)") at assert.c:81 #7 0x000000000060fe2a in ACL_internal_schema_registry::lookup (name=0x0) at 10.0/sql/sql_acl.cc:10717 #8 0x000000000060fee0 in get_cached_schema_access (grant_internal_info=0x7f59891f4358, schema_name=0x0) at 10.0/sql/sql_acl.cc:10744 #9 0x000000000060ff63 in get_cached_table_access (grant_internal_info=0x7f59891f4358, schema_name=0x0, table_name=0x0) at 10.0/sql/sql_acl.cc:10767 #10 0x0000000000605179 in check_grant (thd=0x7f598bb2f070, want_access=4, tables=0x7f59891f4088, any_combination_will_do=false, number=0, no_errors=true) at 10.0/sql/sql_acl.cc:6680 #11 0x00000000006898e2 in multi_update_precheck (thd=0x7f598bb2f070, tables=0x7f59893475c0) at 10.0/sql/sql_parse.cc:7746 #12 0x000000000067e437 in mysql_execute_command (thd=0x7f598bb2f070) at 10.0/sql/sql_parse.cc:3313 #13 0x000000000069f51e in Prepared_statement::execute (this=0x7f5989291470, expanded_query=0x7f5992f43ae0, open_cursor=false) at 10.0/sql/sql_prepare.cc:3971 #14 0x000000000069e5f9 in Prepared_statement::execute_loop (this=0x7f5989291470, expanded_query=0x7f5992f43ae0, open_cursor=false, packet=0x0, packet_end=0x0) at 10.0/sql/sql_prepare.cc:3626 #15 0x000000000069c8fb in mysql_sql_stmt_execute (thd=0x7f598bb2f070) at 10.0/sql/sql_prepare.cc:2777 #16 0x000000000067c68c in mysql_execute_command (thd=0x7f598bb2f070) at 10.0/sql/sql_parse.cc:2560 #17 0x0000000000686e85 in mysql_parse (thd=0x7f598bb2f070, rawbuf=0x7f59890e0088 "EXECUTE stmt", length=12, parser_state=0x7f5992f44600) at 10.0/sql/sql_parse.cc:6517 #18 0x00000000006798b1 in dispatch_command (command=COM_QUERY, thd=0x7f598bb2f070, packet=0x7f598afeb071 "EXECUTE stmt", packet_length=12) at 10.0/sql/sql_parse.cc:1300 #19 0x0000000000678c47 in do_command (thd=0x7f598bb2f070) at 10.0/sql/sql_parse.cc:996 #20 0x0000000000796457 in do_handle_one_connection (thd_arg=0x7f598bb2f070) at 10.0/sql/sql_connect.cc:1375 #21 0x00000000007961aa in handle_one_connection (arg=0x7f598bb2f070) at 10.0/sql/sql_connect.cc:1289 #22 0x0000000000cd391e in pfs_spawn_thread (arg=0x7f598af6ce70) at 10.0/storage/perfschema/pfs.cc:1860 #23 0x00007f5992b35b50 in start_thread (arg=<optimized out>) at pthread_create.c:304 #24 0x00007f5990deb95d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
The problem appeared in 10.0 tree with this commit:
commit 775528ada3c2cc3a2a7ebafadebbcf44530aab50 0f8b194146b50afe442682c5a14a8a179e28f3b8
Author: Sergei Petrunia <psergey@askmonty.org>
Date: Fri Feb 20 03:17:46 2015 +0300
MDEV-7220: Materialization strategy is not used for REPLACE ... SELECT
Enable subquery materialization for non-SELECT queries with a SELECT part
Gliffy Diagrams
Attachments
Issue Links
- relates to
-
MDEV-8309 Stored procedure crashes server
-
- In Progress
-
Activity
- All
- Comments
- Work Log
- History
- Activity
- Transitions
Analysis:
The crash happens inside permission check in multi_update_precheck() call.
We crash when attempting to verify permissions for "<subquery2>" table.
Looking at table->next_local chain in multi_update_precheck():
PREPARE: t1->t2
EXECUTE: t1->t2
EXECUTE: t1->t2->"<subquery2>".
"<subquery2>" is injected into next_local chain by convert_subq_to_jtbm().