Commit f18b2386 authored by evgen@moonbone.local's avatar evgen@moonbone.local
Browse files

Bug#30020: Insufficient check led to a wrong info provided by the

information schema table.

The get_schema_views_record() function fills records in the view table of
the informations schema with data about given views. Among other info
the is_updatable flag is set. But the check whether the view is updatable or
not wasn't covering all cases thus sometimes providing wrong info.
This might led to a user confusion.

Now the get_schema_views_record function additionally calls to the 
view->can_be_merge() function to find out whether the view can be updated or
not.
parent 3301955b
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -3547,4 +3547,19 @@ a b
6	6
DROP VIEW v1;
DROP TABLE t1,t2,t3;
create table t1 (i int);
insert into t1 values (1), (2), (1), (3), (2), (4);
create view v1 as select distinct i from t1;
select * from v1;
i
1
2
3
4
select table_name, is_updatable from information_schema.views 
where table_name = 'v1';
table_name	is_updatable
v1	NO
drop view v1;
drop table t1;
End of 5.0 tests.
+13 −0
Original line number Diff line number Diff line
@@ -3402,5 +3402,18 @@ SELECT t.person_id AS a, t.person_id AS b FROM v1 t WHERE t.person_id=6;
DROP VIEW v1;
DROP TABLE t1,t2,t3;

#
# Bug#30020: Insufficient check led to a wrong info provided by the
#            information schema table.
#
create table t1 (i int);
insert into t1 values (1), (2), (1), (3), (2), (4);
create view v1 as select distinct i from t1;
select * from v1;
select table_name, is_updatable from information_schema.views 
   where table_name = 'v1';
drop view v1;
drop table t1;

--echo End of 5.0 tests.
+3 −1
Original line number Diff line number Diff line
@@ -3211,7 +3211,7 @@ static int get_schema_views_record(THD *thd, TABLE_LIST *tables,
      Item *item;
      Item_field *field;
      /*
        chech that at least one coulmn in view is updatable
        check that at least one column in view is updatable
      */
      while ((item= it++))
      {
@@ -3222,6 +3222,8 @@ static int get_schema_views_record(THD *thd, TABLE_LIST *tables,
          break;
        }
      }
      if (updatable_view && !tables->view->can_be_merged())
        updatable_view= 0;
    }
    if (updatable_view)
      table->field[5]->store(STRING_WITH_LEN("YES"), cs);