Bug #36774 different outputs for show create view for the same view
Submitted: 17 May 2008 7:41 Modified: 17 May 2008 14:02
Reporter: Ecker Sandor Email Updates:
Status: Duplicate Impact on me:
None 
Category:MySQL Server: Views Severity:S2 (Serious)
Version:5.0.51a,5.1.24rc OS:Windows (XP)
Assigned to: CPU Architecture:Any
Tags: preparedstataments, storedprocedure, VIEW

[17 May 2008 7:41] Ecker Sandor
Description:
Hi!

I'm not sure if this is a bug or not, but I have the same in the 5.0.51a,5.1.24rc versions.

I have a proc:

#----------------------------------------------------------------------------
CREATE PROCEDURE prepare_int_funccall(
        IN inputtablename VARCHAR(30),
        IN inputtablecolu VARCHAR(30),
        IN startdate int,
        IN enddate int,
        IN ob_direction int,
        IN viewname VARCHAR(30))
BEGIN
        SET @ipts:=startdate;
        SET @ipte:=enddate;

        SET @drops=CONCAT('DROP VIEW IF EXISTS ', viewname);

        SET @stmnt=CONCAT('CREATE OR REPLACE VIEW ', viewname);
        SET @stmnt=CONCAT(@stmnt, ' AS SELECT s_dateint,');
        SET @stmnt=CONCAT(@stmnt, inputtablecolu);
        SET @stmnt=CONCAT(@stmnt, ' AS inp_fv FROM ');
        SET @stmnt=CONCAT(@stmnt, inputtablename);
        IF startdate>=0 THEN
                SET @stmnt=CONCAT(@stmnt, ' WHERE s_dateint>=', startdate);
                SET @stmnt=CONCAT(@stmnt, ' AND s_dateint<=', enddate);
        END IF;
        IF ob_direction>=0 THEN
                SET @stmnt=CONCAT(@stmnt, ' ORDER BY s_dateint');
        ELSE
                SET @stmnt=CONCAT(@stmnt, ' ORDER BY s_dateint DESC');
        END IF;

        SELECT @stmnt;

#       PREPARE stmt FROM @drops;
#       EXECUTE stmt;
#       DEALLOCATE PREPARE stmt;

        PREPARE stmt FROM @stmnt;
        EXECUTE stmt;
        DEALLOCATE PREPARE stmt;

END;
//

there is a simple proc showlinregbaseview:

CREATE PROCEDURE showlinregbaseview()
READS SQL DATA
BEGIN
        show create view linregbase_view;
END;
//

these procs above are called form this (and the problem is described inline):

CREATE PROCEDURE viewcreate_test()
BEGIN
        call prepare_int_funccall('table','col1',-1,-1,1,
                'linregbase_view');
        call showlinregbaseview();
        show create view linregbase_view;

#everything is OK. both outputs show that the view is selecting the col1 

        call prepare_int_funccall('table','col2',-1,-1,1,
                'linregbase_view');
        call showlinregbaseview();
        show create view linregbase_view;

#!!!!!bug?: the showlinregbaseview still returns a view selecting col1, 
#but the the show in the viewcreate proc is OK (col2)

        call prepare_int_funccall('table','col3',-1,-1,1,
                'linregbase_view');
        call showlinregbaseview();
        show create view linregbase_view;

#!!!!!bug?: the showlinregbaseview still returns a view selecting col1, 
#but the the show in the viewcreate proc is OK (col3)

        call prepare_int_funccall('table','col4',-1,-1,1,
                'linregbase_view');
        call showlinregbaseview();
        show create view linregbase_view;

#!!!!!bug?: the showlinregbaseview still returns a view selecting col1, 
#but the the show in the viewcreate proc is OK (col4)

END;
//

Thanks,
REgards,
Sandor

The problem with the show create view output is that it is used when I do a select form the view too!!!

How to repeat:
create a table, poppulate with some dummy values

mysql> desc viewtesttable;
+-----------+----------------+------+-----+---------+-------+
| Field     | Type           | Null | Key | Default | Extra |
+-----------+----------------+------+-----+---------+-------+
| s_dateint | int(11)        | NO   | PRI | NULL    |       |
| col1      | float unsigned | NO   |     | NULL    |       |
| col2      | float unsigned | NO   |     | NULL    |       |
| col3      | float unsigned | NO   |     | NULL    |       |
| col4      | float unsigned | NO   |     | NULL    |       |
+-----------+----------------+------+-----+---------+-------+
5 rows in set (0.03 sec)

create the procedures above, and call viewcreate_test()

The logfile is the following:

col1: (OK)

mysql> call viewcreate_test();
+-------------------------------------------------------------------------------
----------------------------------+
| @stmnt
                                  |
+-------------------------------------------------------------------------------
----------------------------------+
| CREATE OR REPLACE VIEW linregbase_view AS SELECT s_dateint,col1 AS inp_fv FROM
 viewtesttable ORDER BY s_dateint |
+-------------------------------------------------------------------------------
----------------------------------+
1 row in set (0.02 sec)

+-----------------+-------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------------+----------------------+----------------------+
| View            | Create View

                        | character_set_client | collation_connection |
+-----------------+-------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------------+----------------------+----------------------+
| linregbase_view | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SE
CURITY DEFINER VIEW `linregbase_view` AS select `viewtesttable`.`s_dateint` AS `
s_dateint`,`viewtesttable`.`col1` AS `inp_fv` from `viewtesttable` order by `vie
wtesttable`.`s_dateint` | latin1               | latin1_swedish_ci    |
+-----------------+-------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------------+----------------------+----------------------+
1 row in set (0.06 sec)

+-----------------+-------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------------+----------------------+----------------------+
| View            | Create View

                        | character_set_client | collation_connection |
+-----------------+-------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------------+----------------------+----------------------+
| linregbase_view | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SE
CURITY DEFINER VIEW `linregbase_view` AS select `viewtesttable`.`s_dateint` AS `
s_dateint`,`viewtesttable`.`col1` AS `inp_fv` from `viewtesttable` order by `vie
wtesttable`.`s_dateint` | latin1               | latin1_swedish_ci    |
+-----------------+-------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------------+----------------------+----------------------+
1 row in set (0.11 sec)

col2:(notOK)

+-------------------------------------------------------------------------------
----------------------------------+
| @stmnt
                                  |
+-------------------------------------------------------------------------------
----------------------------------+
| CREATE OR REPLACE VIEW linregbase_view AS SELECT s_dateint,col2 AS inp_fv FROM
 viewtesttable ORDER BY s_dateint |
+-------------------------------------------------------------------------------
----------------------------------+
1 row in set (0.16 sec)

+-----------------+-------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------------+----------------------+----------------------+
| View            | Create View

                        | character_set_client | collation_connection |
+-----------------+-------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------------+----------------------+----------------------+
| linregbase_view | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SE
CURITY DEFINER VIEW `linregbase_view` AS select `viewtesttable`.`s_dateint` AS `
s_dateint`,`viewtesttable`.`col1` AS `inp_fv` from `viewtesttable` order by `vie
wtesttable`.`s_dateint` | latin1               | latin1_swedish_ci    |
+-----------------+-------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------------+----------------------+----------------------+
1 row in set (0.17 sec)

+-----------------+-------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------------+----------------------+----------------------+
| View            | Create View

                        | character_set_client | collation_connection |
+-----------------+-------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------------+----------------------+----------------------+
| linregbase_view | CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SE
CURITY DEFINER VIEW `linregbase_view` AS select `viewtesttable`.`s_dateint` AS `
s_dateint`,`viewtesttable`.`col2` AS `inp_fv` from `viewtesttable` order by `vie
wtesttable`.`s_dateint` | latin1               | latin1_swedish_ci    |
+-----------------+-------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------------+----------------------+----------------------+
1 row in set (0.22 sec)

col3,col4: so on...

Suggested fix:
??? I'm not a developer, mybe some context in the proc showlinregbaseview() is not updated...
[17 May 2008 8:22] Peter Laursen
I think I remember a similar report (of which this one may be a duplicate or at least related) that results from certain statements (like SHOW) inside a SP is cached somehow by the server in some memory space alloated to the SP - and old result is returned also after altering the underlying objects.

I may also have been fixed in 5.0 trunk and latest ENTERPRISE versions (but not in COMMUNITY as latest here is 5.0.51 (with few fixes added only in .51a and .51b)

Peter
(not a MySQL person)
[17 May 2008 14:02] Sveta Smirnova
Thank you for the report.

Peter is correct: this is duplicate of bug #32868.