mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
bzr merge -rtag:mariadb-10.0.12 maria/10.0
This commit is contained in:
@ -1,5 +1,5 @@
|
||||
/* Copyright (c) 2000, 2013, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2013, Monty Program Ab
|
||||
/* Copyright (c) 2000, 2014, Oracle and/or its affiliates.
|
||||
Copyright (c) 2009, 2014, SkySQL Ab.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
@ -125,12 +125,41 @@ append_algorithm(TABLE_LIST *table, String *buff);
|
||||
|
||||
static COND * make_cond_for_info_schema(COND *cond, TABLE_LIST *table);
|
||||
|
||||
/**
|
||||
Condition pushdown used for INFORMATION_SCHEMA / SHOW queries.
|
||||
This structure is to implement an optimization when
|
||||
accessing data dictionary data in the INFORMATION_SCHEMA
|
||||
or SHOW commands.
|
||||
When the query contain a TABLE_SCHEMA or TABLE_NAME clause,
|
||||
narrow the search for data based on the constraints given.
|
||||
*/
|
||||
typedef struct st_lookup_field_values
|
||||
{
|
||||
LEX_STRING db_value, table_value;
|
||||
bool wild_db_value, wild_table_value;
|
||||
/**
|
||||
Value of a TABLE_SCHEMA clause.
|
||||
Note that this value length may exceed @c NAME_LEN.
|
||||
@sa wild_db_value
|
||||
*/
|
||||
LEX_STRING db_value;
|
||||
/**
|
||||
Value of a TABLE_NAME clause.
|
||||
Note that this value length may exceed @c NAME_LEN.
|
||||
@sa wild_table_value
|
||||
*/
|
||||
LEX_STRING table_value;
|
||||
/**
|
||||
True when @c db_value is a LIKE clause,
|
||||
false when @c db_value is an '=' clause.
|
||||
*/
|
||||
bool wild_db_value;
|
||||
/**
|
||||
True when @c table_value is a LIKE clause,
|
||||
false when @c table_value is an '=' clause.
|
||||
*/
|
||||
bool wild_table_value;
|
||||
} LOOKUP_FIELD_VALUES;
|
||||
|
||||
|
||||
bool get_lookup_field_values(THD *, COND *, TABLE_LIST *, LOOKUP_FIELD_VALUES *);
|
||||
|
||||
/***************************************************************************
|
||||
@ -3901,14 +3930,22 @@ int make_db_list(THD *thd, Dynamic_array<LEX_STRING*> *files,
|
||||
|
||||
|
||||
/*
|
||||
If we have db lookup vaule we just add it to list and
|
||||
If we have db lookup value we just add it to list and
|
||||
exit from the function.
|
||||
We don't do this for database names longer than the maximum
|
||||
path length.
|
||||
name length.
|
||||
*/
|
||||
if (lookup_field_vals->db_value.str &&
|
||||
lookup_field_vals->db_value.length < FN_REFLEN)
|
||||
if (lookup_field_vals->db_value.str)
|
||||
{
|
||||
if (lookup_field_vals->db_value.length > NAME_LEN)
|
||||
{
|
||||
/*
|
||||
Impossible value for a database name,
|
||||
found in a WHERE DATABASE_NAME = 'xxx' clause.
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (is_infoschema_db(lookup_field_vals->db_value.str,
|
||||
lookup_field_vals->db_value.length))
|
||||
{
|
||||
@ -4041,6 +4078,14 @@ make_table_name_list(THD *thd, Dynamic_array<LEX_STRING*> *table_names,
|
||||
if (!lookup_field_vals->wild_table_value &&
|
||||
lookup_field_vals->table_value.str)
|
||||
{
|
||||
if (lookup_field_vals->table_value.length > NAME_LEN)
|
||||
{
|
||||
/*
|
||||
Impossible value for a table name,
|
||||
found in a WHERE TABLE_NAME = 'xxx' clause.
|
||||
*/
|
||||
return 0;
|
||||
}
|
||||
if (db_name == &INFORMATION_SCHEMA_NAME)
|
||||
{
|
||||
LEX_STRING *name;
|
||||
@ -4485,6 +4530,9 @@ static int fill_schema_table_from_frm(THD *thd, TABLE_LIST *tables,
|
||||
bzero((char*) &table_list, sizeof(TABLE_LIST));
|
||||
bzero((char*) &tbl, sizeof(TABLE));
|
||||
|
||||
DBUG_ASSERT(db_name->length <= NAME_LEN);
|
||||
DBUG_ASSERT(table_name->length <= NAME_LEN);
|
||||
|
||||
if (lower_case_table_names)
|
||||
{
|
||||
/*
|
||||
@ -4792,6 +4840,7 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
for (size_t i=0; i < db_names.elements(); i++)
|
||||
{
|
||||
LEX_STRING *db_name= db_names.at(i);
|
||||
DBUG_ASSERT(db_name->length <= NAME_LEN);
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (!(check_access(thd, SELECT_ACL, db_name->str,
|
||||
&thd->col_access, NULL, 0, 1) ||
|
||||
@ -4811,6 +4860,7 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
for (size_t i=0; i < table_names.elements(); i++)
|
||||
{
|
||||
LEX_STRING *table_name= table_names.at(i);
|
||||
DBUG_ASSERT(table_name->length <= NAME_LEN);
|
||||
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
if (!(thd->col_access & TABLE_ACLS))
|
||||
@ -4950,6 +5000,7 @@ int fill_schema_schemata(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
for (size_t i=0; i < db_names.elements(); i++)
|
||||
{
|
||||
LEX_STRING *db_name= db_names.at(i);
|
||||
DBUG_ASSERT(db_name->length <= NAME_LEN);
|
||||
if (db_name == &INFORMATION_SCHEMA_NAME)
|
||||
{
|
||||
if (store_schema_shemata(thd, table, db_name,
|
||||
|
Reference in New Issue
Block a user