mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Bug#31633 Information schema = NULL queries crash the server
added correct handling of NULL values for lookup fields
This commit is contained in:
@ -1564,4 +1564,44 @@ SELECT TABLE_COLLATION FROM INFORMATION_SCHEMA.TABLES
|
|||||||
WHERE TABLE_SCHEMA='mysql' and TABLE_NAME= 'db';
|
WHERE TABLE_SCHEMA='mysql' and TABLE_NAME= 'db';
|
||||||
TABLE_COLLATION
|
TABLE_COLLATION
|
||||||
utf8_bin
|
utf8_bin
|
||||||
|
select * from information_schema.columns where table_schema = NULL;
|
||||||
|
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA PRIVILEGES COLUMN_COMMENT
|
||||||
|
select * from `information_schema`.`COLUMNS` where `TABLE_NAME` = NULL;
|
||||||
|
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION COLUMN_DEFAULT IS_NULLABLE DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE CHARACTER_SET_NAME COLLATION_NAME COLUMN_TYPE COLUMN_KEY EXTRA PRIVILEGES COLUMN_COMMENT
|
||||||
|
select * from `information_schema`.`KEY_COLUMN_USAGE` where `TABLE_SCHEMA` = NULL;
|
||||||
|
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION POSITION_IN_UNIQUE_CONSTRAINT REFERENCED_TABLE_SCHEMA REFERENCED_TABLE_NAME REFERENCED_COLUMN_NAME
|
||||||
|
select * from `information_schema`.`KEY_COLUMN_USAGE` where `TABLE_NAME` = NULL;
|
||||||
|
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION POSITION_IN_UNIQUE_CONSTRAINT REFERENCED_TABLE_SCHEMA REFERENCED_TABLE_NAME REFERENCED_COLUMN_NAME
|
||||||
|
select * from `information_schema`.`PARTITIONS` where `TABLE_SCHEMA` = NULL;
|
||||||
|
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PARTITION_NAME SUBPARTITION_NAME PARTITION_ORDINAL_POSITION SUBPARTITION_ORDINAL_POSITION PARTITION_METHOD SUBPARTITION_METHOD PARTITION_EXPRESSION SUBPARTITION_EXPRESSION PARTITION_DESCRIPTION TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE CREATE_TIME UPDATE_TIME CHECK_TIME CHECKSUM PARTITION_COMMENT NODEGROUP TABLESPACE_NAME
|
||||||
|
select * from `information_schema`.`PARTITIONS` where `TABLE_NAME` = NULL;
|
||||||
|
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PARTITION_NAME SUBPARTITION_NAME PARTITION_ORDINAL_POSITION SUBPARTITION_ORDINAL_POSITION PARTITION_METHOD SUBPARTITION_METHOD PARTITION_EXPRESSION SUBPARTITION_EXPRESSION PARTITION_DESCRIPTION TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE CREATE_TIME UPDATE_TIME CHECK_TIME CHECKSUM PARTITION_COMMENT NODEGROUP TABLESPACE_NAME
|
||||||
|
select * from `information_schema`.`REFERENTIAL_CONSTRAINTS` where `CONSTRAINT_SCHEMA` = NULL;
|
||||||
|
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME UNIQUE_CONSTRAINT_CATALOG UNIQUE_CONSTRAINT_SCHEMA UNIQUE_CONSTRAINT_NAME MATCH_OPTION UPDATE_RULE DELETE_RULE TABLE_NAME REFERENCED_TABLE_NAME
|
||||||
|
select * from `information_schema`.`REFERENTIAL_CONSTRAINTS` where `TABLE_NAME` = NULL;
|
||||||
|
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME UNIQUE_CONSTRAINT_CATALOG UNIQUE_CONSTRAINT_SCHEMA UNIQUE_CONSTRAINT_NAME MATCH_OPTION UPDATE_RULE DELETE_RULE TABLE_NAME REFERENCED_TABLE_NAME
|
||||||
|
select * from information_schema.schemata where schema_name = NULL;
|
||||||
|
CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME DEFAULT_COLLATION_NAME SQL_PATH
|
||||||
|
select * from `information_schema`.`STATISTICS` where `TABLE_SCHEMA` = NULL;
|
||||||
|
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME NON_UNIQUE INDEX_SCHEMA INDEX_NAME SEQ_IN_INDEX COLUMN_NAME COLLATION CARDINALITY SUB_PART PACKED NULLABLE INDEX_TYPE COMMENT
|
||||||
|
select * from `information_schema`.`STATISTICS` where `TABLE_NAME` = NULL;
|
||||||
|
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME NON_UNIQUE INDEX_SCHEMA INDEX_NAME SEQ_IN_INDEX COLUMN_NAME COLLATION CARDINALITY SUB_PART PACKED NULLABLE INDEX_TYPE COMMENT
|
||||||
|
select * from information_schema.tables where table_schema = NULL;
|
||||||
|
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT
|
||||||
|
select * from information_schema.tables where table_catalog = NULL;
|
||||||
|
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT
|
||||||
|
select * from information_schema.tables where table_name = NULL;
|
||||||
|
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE ENGINE VERSION ROW_FORMAT TABLE_ROWS AVG_ROW_LENGTH DATA_LENGTH MAX_DATA_LENGTH INDEX_LENGTH DATA_FREE AUTO_INCREMENT CREATE_TIME UPDATE_TIME CHECK_TIME TABLE_COLLATION CHECKSUM CREATE_OPTIONS TABLE_COMMENT
|
||||||
|
select * from `information_schema`.`TABLE_CONSTRAINTS` where `TABLE_SCHEMA` = NULL;
|
||||||
|
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_SCHEMA TABLE_NAME CONSTRAINT_TYPE
|
||||||
|
select * from `information_schema`.`TABLE_CONSTRAINTS` where `TABLE_NAME` = NULL;
|
||||||
|
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_SCHEMA TABLE_NAME CONSTRAINT_TYPE
|
||||||
|
select * from `information_schema`.`TRIGGERS` where `EVENT_OBJECT_SCHEMA` = NULL;
|
||||||
|
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION
|
||||||
|
select * from `information_schema`.`TRIGGERS` where `EVENT_OBJECT_TABLE` = NULL;
|
||||||
|
TRIGGER_CATALOG TRIGGER_SCHEMA TRIGGER_NAME EVENT_MANIPULATION EVENT_OBJECT_CATALOG EVENT_OBJECT_SCHEMA EVENT_OBJECT_TABLE ACTION_ORDER ACTION_CONDITION ACTION_STATEMENT ACTION_ORIENTATION ACTION_TIMING ACTION_REFERENCE_OLD_TABLE ACTION_REFERENCE_NEW_TABLE ACTION_REFERENCE_OLD_ROW ACTION_REFERENCE_NEW_ROW CREATED SQL_MODE DEFINER CHARACTER_SET_CLIENT COLLATION_CONNECTION DATABASE_COLLATION
|
||||||
|
select * from `information_schema`.`VIEWS` where `TABLE_SCHEMA` = NULL;
|
||||||
|
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE CHARACTER_SET_CLIENT COLLATION_CONNECTION
|
||||||
|
select * from `information_schema`.`VIEWS` where `TABLE_NAME` = NULL;
|
||||||
|
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE DEFINER SECURITY_TYPE CHARACTER_SET_CLIENT COLLATION_CONNECTION
|
||||||
End of 5.1 tests.
|
End of 5.1 tests.
|
||||||
|
@ -1208,4 +1208,28 @@ WHERE SCHEMA_NAME ='information_schema';
|
|||||||
SELECT TABLE_COLLATION FROM INFORMATION_SCHEMA.TABLES
|
SELECT TABLE_COLLATION FROM INFORMATION_SCHEMA.TABLES
|
||||||
WHERE TABLE_SCHEMA='mysql' and TABLE_NAME= 'db';
|
WHERE TABLE_SCHEMA='mysql' and TABLE_NAME= 'db';
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#31633 Information schema = NULL queries crash the server
|
||||||
|
#
|
||||||
|
select * from information_schema.columns where table_schema = NULL;
|
||||||
|
select * from `information_schema`.`COLUMNS` where `TABLE_NAME` = NULL;
|
||||||
|
select * from `information_schema`.`KEY_COLUMN_USAGE` where `TABLE_SCHEMA` = NULL;
|
||||||
|
select * from `information_schema`.`KEY_COLUMN_USAGE` where `TABLE_NAME` = NULL;
|
||||||
|
select * from `information_schema`.`PARTITIONS` where `TABLE_SCHEMA` = NULL;
|
||||||
|
select * from `information_schema`.`PARTITIONS` where `TABLE_NAME` = NULL;
|
||||||
|
select * from `information_schema`.`REFERENTIAL_CONSTRAINTS` where `CONSTRAINT_SCHEMA` = NULL;
|
||||||
|
select * from `information_schema`.`REFERENTIAL_CONSTRAINTS` where `TABLE_NAME` = NULL;
|
||||||
|
select * from information_schema.schemata where schema_name = NULL;
|
||||||
|
select * from `information_schema`.`STATISTICS` where `TABLE_SCHEMA` = NULL;
|
||||||
|
select * from `information_schema`.`STATISTICS` where `TABLE_NAME` = NULL;
|
||||||
|
select * from information_schema.tables where table_schema = NULL;
|
||||||
|
select * from information_schema.tables where table_catalog = NULL;
|
||||||
|
select * from information_schema.tables where table_name = NULL;
|
||||||
|
select * from `information_schema`.`TABLE_CONSTRAINTS` where `TABLE_SCHEMA` = NULL;
|
||||||
|
select * from `information_schema`.`TABLE_CONSTRAINTS` where `TABLE_NAME` = NULL;
|
||||||
|
select * from `information_schema`.`TRIGGERS` where `EVENT_OBJECT_SCHEMA` = NULL;
|
||||||
|
select * from `information_schema`.`TRIGGERS` where `EVENT_OBJECT_TABLE` = NULL;
|
||||||
|
select * from `information_schema`.`VIEWS` where `TABLE_SCHEMA` = NULL;
|
||||||
|
select * from `information_schema`.`VIEWS` where `TABLE_NAME` = NULL;
|
||||||
|
|
||||||
--echo End of 5.1 tests.
|
--echo End of 5.1 tests.
|
||||||
|
@ -2269,10 +2269,12 @@ int make_table_list(THD *thd, SELECT_LEX *sel,
|
|||||||
@param[in] table I_S table
|
@param[in] table I_S table
|
||||||
@param[in, out] lookup_field_vals Struct which holds lookup values
|
@param[in, out] lookup_field_vals Struct which holds lookup values
|
||||||
|
|
||||||
@return void
|
@return
|
||||||
|
0 success
|
||||||
|
1 error, there can be no matching records for the condition
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void get_lookup_value(THD *thd, Item_func *item_func,
|
bool get_lookup_value(THD *thd, Item_func *item_func,
|
||||||
TABLE_LIST *table,
|
TABLE_LIST *table,
|
||||||
LOOKUP_FIELD_VALUES *lookup_field_vals)
|
LOOKUP_FIELD_VALUES *lookup_field_vals)
|
||||||
{
|
{
|
||||||
@ -2305,13 +2307,17 @@ void get_lookup_value(THD *thd, Item_func *item_func,
|
|||||||
idx_val= 0;
|
idx_val= 0;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
item_field= (Item_field*) item_func->arguments()[idx_field];
|
item_field= (Item_field*) item_func->arguments()[idx_field];
|
||||||
if (table->table != item_field->field->table)
|
if (table->table != item_field->field->table)
|
||||||
return;
|
return 0;
|
||||||
tmp_str= item_func->arguments()[idx_val]->val_str(&str_buff);
|
tmp_str= item_func->arguments()[idx_val]->val_str(&str_buff);
|
||||||
|
|
||||||
|
/* impossible value */
|
||||||
|
if (!tmp_str)
|
||||||
|
return 1;
|
||||||
|
|
||||||
/* Lookup value is database name */
|
/* Lookup value is database name */
|
||||||
if (!cs->coll->strnncollsp(cs, (uchar *) field_name1, strlen(field_name1),
|
if (!cs->coll->strnncollsp(cs, (uchar *) field_name1, strlen(field_name1),
|
||||||
(uchar *) item_field->field_name,
|
(uchar *) item_field->field_name,
|
||||||
@ -2330,7 +2336,7 @@ void get_lookup_value(THD *thd, Item_func *item_func,
|
|||||||
tmp_str->length(), FALSE);
|
tmp_str->length(), FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2346,14 +2352,16 @@ void get_lookup_value(THD *thd, Item_func *item_func,
|
|||||||
@param[in] table I_S table
|
@param[in] table I_S table
|
||||||
@param[in, out] lookup_field_vals Struct which holds lookup values
|
@param[in, out] lookup_field_vals Struct which holds lookup values
|
||||||
|
|
||||||
@return void
|
@return
|
||||||
|
0 success
|
||||||
|
1 error, there can be no matching records for the condition
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void calc_lookup_values_from_cond(THD *thd, COND *cond, TABLE_LIST *table,
|
bool calc_lookup_values_from_cond(THD *thd, COND *cond, TABLE_LIST *table,
|
||||||
LOOKUP_FIELD_VALUES *lookup_field_vals)
|
LOOKUP_FIELD_VALUES *lookup_field_vals)
|
||||||
{
|
{
|
||||||
if (!cond)
|
if (!cond)
|
||||||
return;
|
return 0;
|
||||||
|
|
||||||
if (cond->type() == Item::COND_ITEM)
|
if (cond->type() == Item::COND_ITEM)
|
||||||
{
|
{
|
||||||
@ -2364,16 +2372,23 @@ void calc_lookup_values_from_cond(THD *thd, COND *cond, TABLE_LIST *table,
|
|||||||
while ((item= li++))
|
while ((item= li++))
|
||||||
{
|
{
|
||||||
if (item->type() == Item::FUNC_ITEM)
|
if (item->type() == Item::FUNC_ITEM)
|
||||||
get_lookup_value(thd, (Item_func*)item, table, lookup_field_vals);
|
{
|
||||||
|
if (get_lookup_value(thd, (Item_func*)item, table, lookup_field_vals))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
else
|
else
|
||||||
calc_lookup_values_from_cond(thd, item, table, lookup_field_vals);
|
{
|
||||||
|
if (calc_lookup_values_from_cond(thd, item, table, lookup_field_vals))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
else if (cond->type() == Item::FUNC_ITEM)
|
else if (cond->type() == Item::FUNC_ITEM &&
|
||||||
get_lookup_value(thd, (Item_func*) cond, table, lookup_field_vals);
|
get_lookup_value(thd, (Item_func*) cond, table, lookup_field_vals))
|
||||||
return;
|
return 1;
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -2486,10 +2501,12 @@ static COND * make_cond_for_info_schema(COND *cond, TABLE_LIST *table)
|
|||||||
@param[in] tables I_S table
|
@param[in] tables I_S table
|
||||||
@param[in, out] lookup_field_values Struct which holds lookup values
|
@param[in, out] lookup_field_values Struct which holds lookup values
|
||||||
|
|
||||||
@return void
|
@return
|
||||||
|
0 success
|
||||||
|
1 error, there can be no matching records for the condition
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void get_lookup_field_values(THD *thd, COND *cond, TABLE_LIST *tables,
|
bool get_lookup_field_values(THD *thd, COND *cond, TABLE_LIST *tables,
|
||||||
LOOKUP_FIELD_VALUES *lookup_field_values)
|
LOOKUP_FIELD_VALUES *lookup_field_values)
|
||||||
{
|
{
|
||||||
LEX *lex= thd->lex;
|
LEX *lex= thd->lex;
|
||||||
@ -2503,7 +2520,7 @@ void get_lookup_field_values(THD *thd, COND *cond, TABLE_LIST *tables,
|
|||||||
lookup_field_values->db_value.length= strlen(wild);
|
lookup_field_values->db_value.length= strlen(wild);
|
||||||
lookup_field_values->wild_db_value= 1;
|
lookup_field_values->wild_db_value= 1;
|
||||||
}
|
}
|
||||||
break;
|
return 0;
|
||||||
case SQLCOM_SHOW_TABLES:
|
case SQLCOM_SHOW_TABLES:
|
||||||
case SQLCOM_SHOW_TABLE_STATUS:
|
case SQLCOM_SHOW_TABLE_STATUS:
|
||||||
case SQLCOM_SHOW_TRIGGERS:
|
case SQLCOM_SHOW_TRIGGERS:
|
||||||
@ -2516,14 +2533,13 @@ void get_lookup_field_values(THD *thd, COND *cond, TABLE_LIST *tables,
|
|||||||
lookup_field_values->table_value.length= strlen(wild);
|
lookup_field_values->table_value.length= strlen(wild);
|
||||||
lookup_field_values->wild_table_value= 1;
|
lookup_field_values->wild_table_value= 1;
|
||||||
}
|
}
|
||||||
break;
|
return 0;
|
||||||
default:
|
default:
|
||||||
/*
|
/*
|
||||||
The "default" is for queries over I_S.
|
The "default" is for queries over I_S.
|
||||||
All previous cases handle SHOW commands.
|
All previous cases handle SHOW commands.
|
||||||
*/
|
*/
|
||||||
calc_lookup_values_from_cond(thd, cond, tables, lookup_field_values);
|
return calc_lookup_values_from_cond(thd, cond, tables, lookup_field_values);
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3113,7 +3129,11 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||||||
}
|
}
|
||||||
|
|
||||||
schema_table_idx= get_schema_table_idx(schema_table);
|
schema_table_idx= get_schema_table_idx(schema_table);
|
||||||
get_lookup_field_values(thd, cond, tables, &lookup_field_vals);
|
if (get_lookup_field_values(thd, cond, tables, &lookup_field_vals))
|
||||||
|
{
|
||||||
|
error= 0;
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
DBUG_PRINT("INDEX VALUES",("db_name='%s', table_name='%s'",
|
DBUG_PRINT("INDEX VALUES",("db_name='%s', table_name='%s'",
|
||||||
lookup_field_vals.db_value.str,
|
lookup_field_vals.db_value.str,
|
||||||
lookup_field_vals.table_value.str));
|
lookup_field_vals.table_value.str));
|
||||||
@ -3328,7 +3348,8 @@ int fill_schema_schemata(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||||||
#endif
|
#endif
|
||||||
DBUG_ENTER("fill_schema_shemata");
|
DBUG_ENTER("fill_schema_shemata");
|
||||||
|
|
||||||
get_lookup_field_values(thd, cond, tables, &lookup_field_vals);
|
if (get_lookup_field_values(thd, cond, tables, &lookup_field_vals))
|
||||||
|
DBUG_RETURN(0);
|
||||||
DBUG_PRINT("INDEX VALUES",("db_name='%s', table_name='%s'",
|
DBUG_PRINT("INDEX VALUES",("db_name='%s', table_name='%s'",
|
||||||
lookup_field_vals.db_value.str,
|
lookup_field_vals.db_value.str,
|
||||||
lookup_field_vals.table_value.str));
|
lookup_field_vals.table_value.str));
|
||||||
|
Reference in New Issue
Block a user