Skip to content

Commit 477629d

Browse files
committed
MDEV-21147 Assertion `marked_for_read()' upon UPDATE on versioned table via view
Unit prepare prematurely fixed field which must be fixed via setup_conds() to correctly update table->covering_keys. Call vers_setup_conds() directly instead, because actually everything else is not needed.
1 parent cef2b34 commit 477629d

File tree

3 files changed

+34
-1
lines changed

3 files changed

+34
-1
lines changed

mysql-test/suite/versioning/r/update.result

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -295,5 +295,17 @@ primary key (pk)
295295
create or replace view v1 as select * from t1;
296296
insert into t1 values (1, null, 'd') , (2, null, 'i') ;
297297
update v1 set a= null where b = '';
298+
create or replace table t1 (id int, k int, primary key (id)) engine=innodb with system versioning;
299+
insert into t1 values (1,1),(2,2);
300+
create or replace view v1 as select * from t1;
301+
update v1 set id= 2 where k = 0;
302+
create or replace table t1 (a int) with system versioning;
303+
create or replace view v1 as select * from t1;
304+
create or replace procedure sp() update v1 set xx = 1;
305+
call sp;
306+
ERROR 42S22: Unknown column 'xx' in 'field list'
307+
call sp;
308+
ERROR 42S22: Unknown column 'xx' in 'field list'
309+
drop procedure sp;
298310
drop view v1;
299311
drop table t1;

mysql-test/suite/versioning/t/update.test

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,21 @@ create or replace view v1 as select * from t1;
214214
insert into t1 values (1, null, 'd') , (2, null, 'i') ;
215215
update v1 set a= null where b = '';
216216

217+
create or replace table t1 (id int, k int, primary key (id)) engine=innodb with system versioning;
218+
insert into t1 values (1,1),(2,2);
219+
create or replace view v1 as select * from t1;
220+
update v1 set id= 2 where k = 0;
221+
222+
create or replace table t1 (a int) with system versioning;
223+
create or replace view v1 as select * from t1;
224+
create or replace procedure sp() update v1 set xx = 1;
225+
--error ER_BAD_FIELD_ERROR
226+
call sp;
227+
--error ER_BAD_FIELD_ERROR
228+
call sp;
229+
217230
# cleanup
231+
drop procedure sp;
218232
drop view v1;
219233
drop table t1;
220234

sql/sql_derived.cc

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -707,8 +707,15 @@ bool mysql_derived_prepare(THD *thd, LEX *lex, TABLE_LIST *derived)
707707
case SQLCOM_DELETE_MULTI:
708708
case SQLCOM_UPDATE:
709709
case SQLCOM_UPDATE_MULTI:
710-
if ((res= unit->prepare(derived, derived->derived_result, 0)))
710+
if ((res= first_select->vers_setup_conds(thd,
711+
derived->merge_underlying_list)))
711712
goto exit;
713+
if (derived->merge_underlying_list->where)
714+
{
715+
Query_arena_stmt on_stmt_arena(thd);
716+
derived->where= and_items(thd, derived->where,
717+
derived->merge_underlying_list->where);
718+
}
712719
default:
713720
break;
714721
}

0 commit comments

Comments
 (0)