Commit 86b715a7 authored by unknown's avatar unknown
Browse files

BUG#25897: Some queries are no longer possible after a CREATE VIEW

           fails

The bug was introduced with the push of the fix for bug#20953: after
the error on view creation we never reset the error state, so some
valid statements would give the same error after that.

The solution is to properly reset the error state.


mysql-test/r/view.result:
  Add result for bug#25897: Some queries are no longer possible after
  a CREATE VIEW fails.
mysql-test/t/view.test:
  Add test case for bug#25897: Some queries are no longer possible after
  a CREATE VIEW fails.
sql/sql_lex.cc:
  Add st_parsing_options::reset() method, call it from lex_start().
sql/sql_lex.h:
  Add st_parsing_options::reset() method, call it from constructor.
parent f65038bd
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -3023,4 +3023,14 @@ SHOW CREATE VIEW v1;
View	Create View
v1	CREATE ALGORITHM=UNDEFINED DEFINER=`root`@`localhost` SQL SECURITY DEFINER VIEW `v1` AS select _latin1'The\ZEnd' AS `TheEnd`
DROP VIEW v1;
DROP VIEW IF EXISTS v1;
SELECT * FROM (SELECT 1) AS t;
1
1
CREATE VIEW v1 AS SELECT * FROM (SELECT 1) AS t;
ERROR HY000: View's SELECT contains a subquery in the FROM clause
# Previously the following would fail.
SELECT * FROM (SELECT 1) AS t;
1
1
End of 5.0 tests.
+18 −0
Original line number Diff line number Diff line
@@ -2975,4 +2975,22 @@ SHOW CREATE VIEW v1;

DROP VIEW v1;


#
# BUG#25897: Some queries are no longer possible after a CREATE VIEW
# fails 
#
--disable_warnings
DROP VIEW IF EXISTS v1;
--enable_warnings

let $query = SELECT * FROM (SELECT 1) AS t;

eval $query;
--error ER_VIEW_SELECT_DERIVED
eval CREATE VIEW v1 AS $query;
--echo # Previously the following would fail.
eval $query;


--echo End of 5.0 tests.
+11 −0
Original line number Diff line number Diff line
@@ -99,6 +99,16 @@ void lex_free(void)
}


void
st_parsing_options::reset()
{
  allows_variable= TRUE;
  allows_select_into= TRUE;
  allows_select_procedure= TRUE;
  allows_derived= TRUE;
}


/*
  This is called before every query that is to be parsed.
  Because of this, it's critical to not do too much things here.
@@ -149,6 +159,7 @@ void lex_start(THD *thd, uchar *buf,uint length)
  lex->safe_to_cache_query= 1;
  lex->time_zone_tables_used= 0;
  lex->leaf_tables_insert= 0;
  lex->parsing_options.reset();
  lex->empty_field_list_on_rset= 0;
  lex->select_lex.select_number= 1;
  lex->next_state=MY_LEX_START;
+2 −4
Original line number Diff line number Diff line
@@ -866,10 +866,8 @@ struct st_parsing_options
  bool allows_select_procedure;
  bool allows_derived;

  st_parsing_options()
    : allows_variable(TRUE), allows_select_into(TRUE),
      allows_select_procedure(TRUE), allows_derived(TRUE)
  {}
  st_parsing_options() { reset(); }
  void reset();
};