Skip to content

Commit

Permalink
MDEV-7671: Cache VIEW definitions in the TDC
Browse files Browse the repository at this point in the history
(changes of backported patch are very small: strlen removed, error processing fixed, view open statistics added)
  • Loading branch information
sanja-byelkin committed Mar 11, 2015
1 parent 3aa1a60 commit 80f03ab
Show file tree
Hide file tree
Showing 17 changed files with 141 additions and 213 deletions.
1 change: 1 addition & 0 deletions mysql-test/suite/roles/definer.result
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ Warnings:
Note 1449 The user specified as a definer ('role4'@'') does not exist
select * from test.v5;
ERROR HY000: The user specified as a definer ('role4'@'') does not exist
flush tables;
show create view test.v5;
View Create View character_set_client collation_connection
v5 CREATE ALGORITHM=UNDEFINED DEFINER=`role4`@`%` SQL SECURITY DEFINER VIEW `test`.`v5` AS select (`mysqltest1`.`t1`.`a` + `mysqltest1`.`t1`.`b`) AS `a+b`,`mysqltest1`.`t1`.`c` AS `c` from `mysqltest1`.`t1` latin1 latin1_swedish_ci
Expand Down
1 change: 1 addition & 0 deletions mysql-test/suite/roles/definer.test
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ open(F, '>', $f) or die "open(>$f): $!";
syswrite F, $_ or die "syswrite($f): $!"
EOF

flush tables;
show create view test.v5;
select * from test.v5;
drop user role4;
Expand Down
2 changes: 1 addition & 1 deletion plugin/handler_socket/handlersocket/database.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1016,7 +1016,7 @@ dbcontext::cmd_open(dbcallback_i& cb, const cmd_open_args& arg)
tables.mdl_request.init(MDL_key::TABLE, arg.dbn, arg.tbl,
for_write_flag ? MDL_SHARED_WRITE : MDL_SHARED_READ, MDL_TRANSACTION);
Open_table_context ot_act(thd, 0);
if (!open_table(thd, &tables, thd->mem_root, &ot_act)) {
if (!open_table(thd, &tables, &ot_act)) {
table = tables.table;
}
#else
Expand Down
62 changes: 32 additions & 30 deletions sql/parse_file.cc
Original file line number Diff line number Diff line change
Expand Up @@ -404,7 +404,7 @@ sql_parse_prepare(const LEX_STRING *file_name, MEM_ROOT *mem_root,
{
MY_STAT stat_info;
size_t len;
char *end, *sign;
char *buff, *end, *sign;
File_parser *parser;
File file;
DBUG_ENTER("sql_parse_prepare");
Expand All @@ -426,7 +426,7 @@ sql_parse_prepare(const LEX_STRING *file_name, MEM_ROOT *mem_root,
DBUG_RETURN(0);
}

if (!(parser->buff= (char*) alloc_root(mem_root, (size_t)(stat_info.st_size+1))))
if (!(buff= (char*) alloc_root(mem_root, (size_t)(stat_info.st_size+1))))
{
DBUG_RETURN(0);
}
Expand All @@ -437,9 +437,8 @@ sql_parse_prepare(const LEX_STRING *file_name, MEM_ROOT *mem_root,
DBUG_RETURN(0);
}

if ((len= mysql_file_read(file, (uchar *)parser->buff,
stat_info.st_size, MYF(MY_WME))) ==
MY_FILE_ERROR)
if ((len= mysql_file_read(file, (uchar *)buff, stat_info.st_size,
MYF(MY_WME))) == MY_FILE_ERROR)
{
mysql_file_close(file, MYF(MY_WME));
DBUG_RETURN(0);
Expand All @@ -450,20 +449,20 @@ sql_parse_prepare(const LEX_STRING *file_name, MEM_ROOT *mem_root,
DBUG_RETURN(0);
}

end= parser->end= parser->buff + len;
end= buff + len;
*end= '\0'; // barrier for more simple parsing

// 7 = 5 (TYPE=) + 1 (letter at least of type name) + 1 ('\n')
if (len < 7 ||
parser->buff[0] != 'T' ||
parser->buff[1] != 'Y' ||
parser->buff[2] != 'P' ||
parser->buff[3] != 'E' ||
parser->buff[4] != '=')
buff[0] != 'T' ||
buff[1] != 'Y' ||
buff[2] != 'P' ||
buff[3] != 'E' ||
buff[4] != '=')
goto frm_error;

// skip signature;
parser->file_type.str= sign= parser->buff + 5;
parser->file_type.str= sign= buff + 5;
while (*sign >= 'A' && *sign <= 'Z' && sign < end)
sign++;
if (*sign != '\n')
Expand All @@ -472,6 +471,7 @@ sql_parse_prepare(const LEX_STRING *file_name, MEM_ROOT *mem_root,
// EOS for file signature just for safety
*sign= '\0';

parser->end= end;
parser->start= sign + 1;
parser->content_ok= 1;

Expand Down Expand Up @@ -504,11 +504,12 @@ sql_parse_prepare(const LEX_STRING *file_name, MEM_ROOT *mem_root,
*/


static char *
parse_string(char *ptr, char *end, MEM_ROOT *mem_root, LEX_STRING *str)
static const char *
parse_string(const char *ptr, const char *end, MEM_ROOT *mem_root,
LEX_STRING *str)
{
// get string length
char *eol= strchr(ptr, '\n');
const char *eol= strchr(ptr, '\n');

if (eol >= end)
return 0;
Expand All @@ -535,7 +536,7 @@ parse_string(char *ptr, char *end, MEM_ROOT *mem_root, LEX_STRING *str)
*/

my_bool
read_escaped_string(char *ptr, char *eol, LEX_STRING *str)
read_escaped_string(const char *ptr, const char *eol, LEX_STRING *str)
{
char *write_pos= str->str;

Expand Down Expand Up @@ -595,10 +596,11 @@ read_escaped_string(char *ptr, char *eol, LEX_STRING *str)
*/


char *
parse_escaped_string(char *ptr, char *end, MEM_ROOT *mem_root, LEX_STRING *str)
const char *
parse_escaped_string(const char *ptr, const char *end, MEM_ROOT *mem_root,
LEX_STRING *str)
{
char *eol= strchr(ptr, '\n');
const char *eol= strchr(ptr, '\n');

if (eol == 0 || eol >= end ||
!(str->str= (char*) alloc_root(mem_root, (eol - ptr) + 1)) ||
Expand All @@ -624,11 +626,11 @@ parse_escaped_string(char *ptr, char *end, MEM_ROOT *mem_root, LEX_STRING *str)
\# pointer on symbol after string
*/

static char *
parse_quoted_escaped_string(char *ptr, char *end,
static const char *
parse_quoted_escaped_string(const char *ptr, const char *end,
MEM_ROOT *mem_root, LEX_STRING *str)
{
char *eol;
const char *eol;
uint result_len= 0;
bool escaped= 0;

Expand Down Expand Up @@ -665,7 +667,7 @@ parse_quoted_escaped_string(char *ptr, char *end,
@param[in] mem_root MEM_ROOT for parameters allocation
*/

bool get_file_options_ulllist(char *&ptr, char *end, char *line,
bool get_file_options_ulllist(const char *&ptr, const char *end, const char *line,
uchar* base, File_option *parameter,
MEM_ROOT *mem_root)
{
Expand All @@ -676,7 +678,7 @@ bool get_file_options_ulllist(char *&ptr, char *end, char *line,
while (ptr < end)
{
int not_used;
char *num_end= end;
char *num_end= const_cast<char *>(end);
if (!(num= (ulonglong*)alloc_root(mem_root, sizeof(ulonglong))) ||
nlist->push_back(num, mem_root))
goto nlist_err;
Expand Down Expand Up @@ -731,18 +733,18 @@ bool get_file_options_ulllist(char *&ptr, char *end, char *line,
my_bool
File_parser::parse(uchar* base, MEM_ROOT *mem_root,
struct File_option *parameters, uint required,
Unknown_key_hook *hook)
Unknown_key_hook *hook) const
{
uint first_param= 0, found= 0;
char *ptr= start;
char *eol;
const char *ptr= start;
const char *eol;
LEX_STRING *str;
List<LEX_STRING> *list;
DBUG_ENTER("File_parser::parse");

while (ptr < end && found < required)
{
char *line= ptr;
const char *line= ptr;
if (*ptr == '#')
{
// it is comment
Expand Down Expand Up @@ -940,9 +942,9 @@ File_parser::parse(uchar* base, MEM_ROOT *mem_root,
*/

bool
File_parser_dummy_hook::process_unknown_string(char *&unknown_key,
File_parser_dummy_hook::process_unknown_string(const char *&unknown_key,
uchar* base, MEM_ROOT *mem_root,
char *end)
const char *end)
{
DBUG_ENTER("file_parser_dummy_hook::process_unknown_string");
DBUG_PRINT("info", ("Unknown key: '%60s'", unknown_key));
Expand Down
26 changes: 14 additions & 12 deletions sql/parse_file.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,8 @@ class Unknown_key_hook
public:
Unknown_key_hook() {} /* Remove gcc warning */
virtual ~Unknown_key_hook() {} /* Remove gcc warning */
virtual bool process_unknown_string(char *&unknown_key, uchar* base,
MEM_ROOT *mem_root, char *end)= 0;
virtual bool process_unknown_string(const char *&unknown_key, uchar* base,
MEM_ROOT *mem_root, const char *end)= 0;
};


Expand All @@ -69,18 +69,20 @@ class File_parser_dummy_hook: public Unknown_key_hook
{
public:
File_parser_dummy_hook() {} /* Remove gcc warning */
virtual bool process_unknown_string(char *&unknown_key, uchar* base,
MEM_ROOT *mem_root, char *end);
virtual bool process_unknown_string(const char *&unknown_key, uchar* base,
MEM_ROOT *mem_root, const char *end);
};

extern File_parser_dummy_hook file_parser_dummy_hook;

bool get_file_options_ulllist(char *&ptr, char *end, char *line,
uchar* base, File_option *parameter,
bool get_file_options_ulllist(const char *&ptr, const char *end,
const char *line, uchar* base,
File_option *parameter,
MEM_ROOT *mem_root);

char *
parse_escaped_string(char *ptr, char *end, MEM_ROOT *mem_root, LEX_STRING *str);
const char *
parse_escaped_string(const char *ptr, const char *end, MEM_ROOT *mem_root,
LEX_STRING *str);

class File_parser;
File_parser *sql_parse_prepare(const LEX_STRING *file_name,
Expand All @@ -96,18 +98,18 @@ my_bool rename_in_schema_file(THD *thd,

class File_parser: public Sql_alloc
{
char *buff, *start, *end;
char *start, *end;
LEX_STRING file_type;
bool content_ok;
public:
File_parser() :buff(0), start(0), end(0), content_ok(0)
File_parser() :start(0), end(0), content_ok(0)
{ file_type.str= 0; file_type.length= 0; }

bool ok() { return content_ok; }
LEX_STRING *type() { return &file_type; }
const LEX_STRING *type() const { return &file_type; }
my_bool parse(uchar* base, MEM_ROOT *mem_root,
struct File_option *parameters, uint required,
Unknown_key_hook *hook);
Unknown_key_hook *hook) const;

friend File_parser *sql_parse_prepare(const LEX_STRING *file_name,
MEM_ROOT *mem_root,
Expand Down
2 changes: 1 addition & 1 deletion sql/sql_admin.cc
Original file line number Diff line number Diff line change
Expand Up @@ -250,7 +250,7 @@ static int prepare_for_repair(THD *thd, TABLE_LIST *table_list,
Now we should be able to open the partially repaired table
to finish the repair in the handler later on.
*/
if (open_table(thd, table_list, thd->mem_root, &ot_ctx))
if (open_table(thd, table_list, &ot_ctx))
{
error= send_check_errmsg(thd, table_list, "repair",
"Failed to open partially repaired table");
Expand Down
Loading

0 comments on commit 80f03ab

Please sign in to comment.