Bug #30020 Wrong IS_UPDATABLE value in I_S.VIEWS for a non updatable view (regression)

Submitted: 24 Jul 2007 23:02 Modified: 3 Aug 2007 15:52
Reporter: Omer Barnir (OCA) Email Updates:
Status: Closed Impact on me:
None 
Category:MySQL Server: Information schema Severity:S3 (Non-critical)
Version:5.0.46 OS:Any
Assigned to: Evgeny Potemkin CPU Architecture:Any

[24 Jul 2007 23:02] Omer Barnir
Description:
A view that is based on distinct values of one table can not be updatable and it isn't. However the INFORMATION_SCHEMA.VIEWS table shows as if it is updatable.

See the following:

omer@linux:~/ent-5.0.46-com/mysql-test> ../bin/mysql --user=root --port=9306 --protocol=tcp
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.0.46-enterprise-log MySQL Enterprise Server (Commercial)

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql> create database db_test;
Query OK, 1 row affected (0.01 sec)

mysql> use db_test
Database changed

mysql> create table t_data (i int);
Query OK, 0 rows affected (0.01 sec)

mysql> insert into t_data values (1), (2), (1), (3), (2), (4);
Query OK, 6 rows affected (0.00 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> select * from t_data;
+------+
| i    |
+------+
|    1 |
|    2 |
|    1 |
|    3 |
|    2 |
|    4 |
+------+
6 rows in set (0.00 sec)

mysql> create view distinct_view as select distinct i from t_data;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from distinct_view;
+------+
| i    |
+------+
|    1 |
|    2 |
|    3 |
|    4 |
+------+
4 rows in set (0.00 sec)

# Error os expected
mysql> insert into distinct_view values (99);
ERROR 1471 (HY000): The target table distinct_view of the INSERT is not insertable-into

# Error is expected
mysql> update distinct_view set i=7 where i=1;
ERROR 1288 (HY000): The target table distinct_view of the UPDATE is not updatable

# Should show the value as 'NO'
mysql> select table_name, is_updatable from information_schema.views where table_schema='db_test';
+---------------+--------------+
| table_name    | is_updatable |
+---------------+--------------+
| distinct_view | YES          |  <-- This is wromg
+---------------+--------------+
1 row in set (0.00 sec)

How to repeat:
Run the following from the mysql client:

create database db_test;
use db_test;
create table t_data (i int);
insert into t_data values (1), (2), (1), (3), (2), (4);
create view distinct_view as select distinct i from t_data;
select * from distinct_view;
insert into distinct_view values (99);  
update distinct_view set i=7 where i=1; 
select table_name, is_updatable 
   from information_schema.views 
   where table_schema='db_test';

Suggested fix:
The IS_UPDATABLE should have the valuse of 'NO'
[28 Jul 2007 12:06] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/31763

ChangeSet@1.2483, 2007-07-28 16:02:29+04:00, evgen@moonbone.local +3 -0
  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.
[2 Aug 2007 19:12] Bugs System
Pushed into 5.1.21-beta
[2 Aug 2007 19:15] Bugs System
Pushed into 5.0.48
[3 Aug 2007 15:52] Paul DuBois
Noted in 5.0.48, 5.1.21 changelogs.

The IS_UPDATABLE column in the INFORMATION_SCHEMA.VIEWS table was not
always set correctly.

Portions of this website are copyright © 2001, 2002 The PHP Group

Page generated in 0.054 sec. using MySQL 8.4.7-u6-cloud

Timestamp references displayed by the system are UTC.
Content reproduced on this site is the property of the respective copyright holders.
It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.