Commit febb6b92 authored by unknown's avatar unknown
Browse files

Resolve one shift/reduce conflict introduced with the push of the fix

for bug#16425: Events: no DEFINER clause.  The problem was that there
were two rules

  ALTER view_algorithm_opt definer ... VIEW ...
  ALTER definer EVENT ...

so when there was 'ALTER definer' in the input it was unclear if empty
view_algorithm_opt should be executed or not.

We solve this by introducing three distinct rules

  ALTER view_algorithm definer ... VIEW ...
  ALTER definer ... VIEW ...
  ALTER definer EVENT ...

that remove the ambiguity.


mysql-test/r/view.result:
  Add result for the test of ALTER ALGORITHM= DEFINER= VIEW.
mysql-test/t/view.test:
  Add test case for ALTER ALGORITHM= DEFINER= VIEW.
parent 1b198eeb
Loading
Loading
Loading
Loading
+35 −0
Original line number Diff line number Diff line
@@ -3283,3 +3283,38 @@ DROP TABLE `t-2`;
DROP VIEW  `v-2`;
DROP DATABASE `d-1`;
USE test;
DROP VIEW IF EXISTS v1;
DROP TABLE IF EXISTS t1;
CREATE TABLE t1 (i INT);
CREATE VIEW v1 AS SELECT * FROM t1;
ALTER VIEW v1 AS SELECT * FROM t1;
SHOW CREATE VIEW v1;
View	Create View
v1	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`i` AS `i` from `t1`
ALTER DEFINER=no_such@user_1 VIEW v1 AS SELECT * FROM t1;
Warnings:
Note	1449	There is no 'no_such'@'user_1' registered
SHOW CREATE VIEW v1;
View	Create View
v1	CREATE ALGORITHM=UNDEFINED DEFINER=`no_such`@`user_1` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`i` AS `i` from `t1`
Warnings:
Note	1449	There is no 'no_such'@'user_1' registered
ALTER ALGORITHM=MERGE VIEW v1 AS SELECT * FROM t1;
Warnings:
Note	1449	There is no 'no_such'@'user_1' registered
SHOW CREATE VIEW v1;
View	Create View
v1	CREATE ALGORITHM=MERGE DEFINER=`no_such`@`user_1` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`i` AS `i` from `t1`
Warnings:
Note	1449	There is no 'no_such'@'user_1' registered
ALTER ALGORITHM=TEMPTABLE DEFINER=no_such@user_2 VIEW v1 AS SELECT * FROM t1;
Warnings:
Note	1449	There is no 'no_such'@'user_2' registered
SHOW CREATE VIEW v1;
View	Create View
v1	CREATE ALGORITHM=TEMPTABLE DEFINER=`no_such`@`user_2` SQL SECURITY DEFINER VIEW `v1` AS select `t1`.`i` AS `i` from `t1`
Warnings:
Note	1449	There is no 'no_such'@'user_2' registered
DROP VIEW v1;
DROP TABLE t1;
End of 5.1 tests.
+27 −0
Original line number Diff line number Diff line
@@ -3175,3 +3175,30 @@ DROP TABLE `t-2`;
DROP VIEW  `v-2`;
DROP DATABASE `d-1`;
USE test;


#
# Test that ALTER VIEW accepts DEFINER and ALGORITHM, see bug#16425.
#
--disable_warnings
DROP VIEW IF EXISTS v1;
DROP TABLE IF EXISTS t1;
--enable_warnings

CREATE TABLE t1 (i INT);
CREATE VIEW v1 AS SELECT * FROM t1;

ALTER VIEW v1 AS SELECT * FROM t1;
SHOW CREATE VIEW v1;
ALTER DEFINER=no_such@user_1 VIEW v1 AS SELECT * FROM t1;
SHOW CREATE VIEW v1;
ALTER ALGORITHM=MERGE VIEW v1 AS SELECT * FROM t1;
SHOW CREATE VIEW v1;
ALTER ALGORITHM=TEMPTABLE DEFINER=no_such@user_2 VIEW v1 AS SELECT * FROM t1;
SHOW CREATE VIEW v1;

DROP VIEW v1;
DROP TABLE t1;


--echo End of 5.1 tests.
+21 −21
Original line number Diff line number Diff line
@@ -492,7 +492,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
  Currently there is 287 shift/reduce conflict. We should not introduce
  new conflicts any more.
*/
%expect 287
%expect 286

/*
   Comments for TOKENS.
@@ -1246,7 +1246,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b, ulong *yystacksize);
	statement sp_suid
	sp_c_chistics sp_a_chistics sp_chistic sp_c_chistic xa
        load_data opt_field_or_var_spec fields_or_vars opt_load_data_set_spec
        definer view_replace_or_algorithm view_replace view_algorithm_opt
        definer view_replace_or_algorithm view_replace
        view_algorithm view_or_trigger_or_sp_or_event
        view_or_trigger_or_sp_or_event_tail
        view_suid view_tail view_list_opt view_list view_select
@@ -5154,17 +5154,24 @@ alter:
	    lex->sql_command= SQLCOM_ALTER_FUNCTION;
	    lex->spname= $3;
	  }
        | ALTER view_algorithm_opt definer view_suid
          VIEW_SYM table_ident
        | ALTER view_algorithm definer
          {
	    THD *thd= YYTHD;
	    LEX *lex= thd->lex;
	    lex->sql_command= SQLCOM_CREATE_VIEW;
            Lex->create_view_mode= VIEW_ALTER;
          }
          view_tail
          {}
        | ALTER definer
          /*
            We have two separate rules for ALTER VIEW rather that
            optional view_algorithm above, to resolve the ambiguity
            with the ALTER EVENT below.
          */
          {
            LEX *lex= Lex;
            lex->create_view_algorithm= VIEW_ALGORITHM_UNDEFINED;
            lex->create_view_mode= VIEW_ALTER;
	    /* first table in list is target VIEW name */
	    lex->select_lex.add_table_to_list(thd, $6, NULL, TL_OPTION_UPDATING);
          }
	  view_list_opt AS view_select view_check_option
          view_tail
          {}
	| ALTER definer EVENT_SYM sp_name
          /*
@@ -11298,13 +11305,6 @@ view_algorithm:
	{ Lex->create_view_algorithm= VIEW_ALGORITHM_TMPTABLE; }
	;

view_algorithm_opt:
	/* empty */
	{ Lex->create_view_algorithm= VIEW_ALGORITHM_UNDEFINED; }
	| view_algorithm
	{}
	;

view_suid:
	/* empty */
	{ Lex->create_view_suid= VIEW_SUID_DEFAULT; }