Fixes for information_schema

parent bb529506
grant all privileges on test.* to mysqltest_1@localhost; grant all privileges on test.* to mysqltest_1@localhost;
select * from information_schema.SCHEMATA where schema_name > 'm'; select * from information_schema.SCHEMATA where schema_name > 'm';
CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME
NULL mysql latin1_swedish_ci NULL mysql latin1
NULL test latin1_swedish_ci NULL test latin1
select schema_name from information_schema.schemata; select schema_name from information_schema.schemata;
schema_name schema_name
mysql mysql
test test
show databases *; show databases *;
CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME
NULL mysql latin1_swedish_ci NULL mysql latin1
NULL test latin1_swedish_ci NULL test latin1
show databases like 't%'; show databases like 't%';
Database (t%) Database (t%)
test test
...@@ -20,7 +20,7 @@ mysql ...@@ -20,7 +20,7 @@ mysql
test test
show databases * where schema_name like 't%'; show databases * where schema_name like 't%';
CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME
NULL test latin1_swedish_ci NULL test latin1
show databases * where schema_name = 't%'; show databases * where schema_name = 't%';
CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME CATALOG_NAME SCHEMA_NAME DEFAULT_CHARACTER_SET_NAME
create database testtets; create database testtets;
...@@ -119,10 +119,10 @@ Field Type Collation Null Key Default Extra Privileges Comment ...@@ -119,10 +119,10 @@ Field Type Collation Null Key Default Extra Privileges Comment
c char(64) latin1_swedish_ci select,insert,update,references c char(64) latin1_swedish_ci select,insert,update,references
select * from information_schema.COLUMNS where table_name="t1" select * from information_schema.COLUMNS where table_name="t1"
and column_name= "a"; and column_name= "a";
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE CHARACTER_SET_NAME TYPE COLLATION_NAME IS_NULLABLE KEY COLUMN_DEFAULT EXTRA PRIVILIGES COMMENT TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE CHARACTER_SET_NAME TYPE COLLATION_NAME IS_NULLABLE KEY COLUMN_DEFAULT EXTRA PRIVILEGES COMMENT
NULL testtets t1 a 1 int 0 11 4 0 NULL int(11) NULL YES NULL select,insert,update,references NULL testtets t1 a 1 int 0 11 4 0 NULL int(11) NULL YES NULL select,insert,update,references
show columns * where table_name = "t1"; show columns * where table_name = "t1";
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE CHARACTER_SET_NAME TYPE COLLATION_NAME IS_NULLABLE KEY COLUMN_DEFAULT EXTRA PRIVILIGES COMMENT TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION DATA_TYPE CHARACTER_MAXIMUM_LENGTH CHARACTER_OCTET_LENGTH NUMERIC_PRECISION NUMERIC_SCALE CHARACTER_SET_NAME TYPE COLLATION_NAME IS_NULLABLE KEY COLUMN_DEFAULT EXTRA PRIVILEGES COMMENT
NULL testtets t1 a 1 int 0 11 4 0 NULL int(11) NULL YES NULL NULL testtets t1 a 1 int 0 11 4 0 NULL int(11) NULL YES NULL
NULL testtets t1 b 2 varchar 30 30 30 31 latin1 varchar(30) latin1_swedish_ci YES MUL NULL NULL testtets t1 b 2 varchar 30 30 30 31 latin1 varchar(30) latin1_swedish_ci YES MUL NULL
drop view v1; drop view v1;
...@@ -352,7 +352,7 @@ t1 CREATE TABLE `t1` ( ...@@ -352,7 +352,7 @@ t1 CREATE TABLE `t1` (
select * from information_schema.TABLE_CONSTRAINTS where select * from information_schema.TABLE_CONSTRAINTS where
TABLE_SCHEMA= "test"; TABLE_SCHEMA= "test";
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_SCHEMA TABLE_NAME CONSTRAINT_TYPE CONSTRAINT_METHOD CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_SCHEMA TABLE_NAME CONSTRAINT_TYPE CONSTRAINT_METHOD
NULL test PRIMARY test t1 PRIMARY NULL NULL test PRIMARY test t1 PRIMARY KEY NULL
NULL test constraint_1 test t1 UNIQUE NULL NULL test constraint_1 test t1 UNIQUE NULL
NULL test key_1 test t1 UNIQUE NULL NULL test key_1 test t1 UNIQUE NULL
NULL test key_2 test t1 UNIQUE NULL NULL test key_2 test t1 UNIQUE NULL
...@@ -371,10 +371,10 @@ FOREIGN KEY (t1_id) REFERENCES t1(id) ON UPDATE CASCADE) ENGINE=INNODB; ...@@ -371,10 +371,10 @@ FOREIGN KEY (t1_id) REFERENCES t1(id) ON UPDATE CASCADE) ENGINE=INNODB;
select * from information_schema.TABLE_CONSTRAINTS where select * from information_schema.TABLE_CONSTRAINTS where
TABLE_SCHEMA= "test"; TABLE_SCHEMA= "test";
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_SCHEMA TABLE_NAME CONSTRAINT_TYPE CONSTRAINT_METHOD CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_SCHEMA TABLE_NAME CONSTRAINT_TYPE CONSTRAINT_METHOD
NULL test PRIMARY test t1 PRIMARY NULL NULL test PRIMARY test t1 PRIMARY KEY NULL
NULL test PRIMARY test t2 PRIMARY NULL NULL test PRIMARY test t2 PRIMARY KEY NULL
NULL test t2_ibfk_1 test t2 FOREIGN ON DELETE CASCADE NULL test t2_ibfk_1 test t2 FOREIGN KEY ON DELETE CASCADE
NULL test t2_ibfk_2 test t2 FOREIGN ON UPDATE CASCADE NULL test t2_ibfk_2 test t2 FOREIGN KEY ON UPDATE CASCADE
select * from information_schema.KEY_COLUMN_USAGE where select * from information_schema.KEY_COLUMN_USAGE where
TABLE_SCHEMA= "test"; TABLE_SCHEMA= "test";
CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION REFERENCED_TABLE_SCHEMA REFERENCED_TABLE_NAME REFERENCED_COLUMN_NAME CONSTRAINT_CATALOG CONSTRAINT_SCHEMA CONSTRAINT_NAME TABLE_SCHEMA TABLE_NAME COLUMN_NAME ORDINAL_POSITION REFERENCED_TABLE_SCHEMA REFERENCED_TABLE_NAME REFERENCED_COLUMN_NAME
...@@ -400,3 +400,42 @@ drop table t2; ...@@ -400,3 +400,42 @@ drop table t2;
drop table t1; drop table t1;
drop procedure sel2; drop procedure sel2;
drop function sub1; drop function sub1;
create table t1(a int);
create view v1 (c) as select a from t1 with check option;
create view v2 (c) as select a from t1 WITH LOCAL CHECK OPTION;
create view v3 (c) as select a from t1 WITH CASCADED CHECK OPTION;
select * from information_schema.views;
TABLE_CATALOG TABLE_SCHEMA TABLE_NAME VIEW_DEFINITION CHECK_OPTION IS_UPDATABLE
NULL test v1 select `test`.`t1`.`a` AS `c` from `test`.`t1` WITH CASCADED CHECK OPTION YES
NULL test v2 select `test`.`t1`.`a` AS `c` from `test`.`t1` WITH LOCAL CHECK OPTION YES
NULL test v3 select `test`.`t1`.`a` AS `c` from `test`.`t1` WITH CASCADED CHECK OPTION YES
grant select (a) on test.t1 to joe@localhost with grant option;
select * from INFORMATION_SCHEMA.COLUMN_PRIVILEGES;
GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME COLUMN_NAME PRIVILEGE_TYPE IS_GRANTABLE
'joe'@'localhost' NULL test t1 a SELECT YES
select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES;
GRANTEE TABLE_CATALOG TABLE_SCHEMA TABLE_NAME PRIVILEGE_TYPE IS_GRANTABLE
'joe'@'localhost' NULL test t1 USAGE YES
drop view v1, v2, v3;
drop table t1;
delete from mysql.user where user='joe';
delete from mysql.db where user='joe';
delete from mysql.tables_priv where user='joe';
delete from mysql.columns_priv where user='joe';
flush privileges;
create procedure px5 ()
begin
declare v int;
declare c cursor for select version from
information_schema.tables;
open c;
fetch c into v;
select v;
close c;
end;//
call px5()//
v
9
call px5()//
v
9
...@@ -186,3 +186,39 @@ drop table t1; ...@@ -186,3 +186,39 @@ drop table t1;
drop procedure sel2; drop procedure sel2;
drop function sub1; drop function sub1;
create table t1(a int);
create view v1 (c) as select a from t1 with check option;
create view v2 (c) as select a from t1 WITH LOCAL CHECK OPTION;
create view v3 (c) as select a from t1 WITH CASCADED CHECK OPTION;
select * from information_schema.views;
grant select (a) on test.t1 to joe@localhost with grant option;
select * from INFORMATION_SCHEMA.COLUMN_PRIVILEGES;
select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES;
drop view v1, v2, v3;
drop table t1;
delete from mysql.user where user='joe';
delete from mysql.db where user='joe';
delete from mysql.tables_priv where user='joe';
delete from mysql.columns_priv where user='joe';
flush privileges;
delimiter //;
create procedure px5 ()
begin
declare v int;
declare c cursor for select version from
information_schema.tables;
open c;
fetch c into v;
select v;
close c;
end;//
call px5()//
call px5()//
delimiter ;//
\ No newline at end of file
...@@ -4107,10 +4107,10 @@ int fill_schema_column_privileges(THD *thd, TABLE_LIST *tables, COND *cond) ...@@ -4107,10 +4107,10 @@ int fill_schema_column_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
ulong table_access= grant_table->cols; ulong table_access= grant_table->cols;
if (table_access != 0) if (table_access != 0)
{ {
ulong test_access= grant_table->cols & ~GRANT_ACL; if (!(grant_table->privs & GRANT_ACL))
if (!(table_access & GRANT_ACL))
is_grantable= "NO"; is_grantable= "NO";
ulong test_access= table_access & ~GRANT_ACL;
strxmov(buff,"'",user,"'@'",grant_table->orig_host,"'",NullS); strxmov(buff,"'",user,"'@'",grant_table->orig_host,"'",NullS);
if (!test_access) if (!test_access)
continue; continue;
......
...@@ -1891,10 +1891,10 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond) ...@@ -1891,10 +1891,10 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
LEX *lex= thd->lex; LEX *lex= thd->lex;
TABLE *table= tables->table; TABLE *table= tables->table;
SELECT_LEX *select_lex= &lex->select_lex; SELECT_LEX *select_lex= &lex->select_lex;
SELECT_LEX *lsel= tables->schema_select_lex;
ST_SCHEMA_TABLE *schema_table= tables->schema_table; ST_SCHEMA_TABLE *schema_table= tables->schema_table;
DBUG_ENTER("fill_schema_tables"); DBUG_ENTER("fill_schema_tables");
SELECT_LEX *lsel= tables->schema_select_lex;
if (lsel) if (lsel)
{ {
TABLE *old_open_tables= thd->open_tables; TABLE *old_open_tables= thd->open_tables;
...@@ -1947,7 +1947,7 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond) ...@@ -1947,7 +1947,7 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
#endif #endif
{ {
List<char> files; List<char> files;
(void) sprintf(path,"%s/%s",mysql_data_home,base_name); strxmov(path, mysql_data_home, "/", base_name, NullS);
end= path + (len= unpack_dirname(path,path)); end= path + (len= unpack_dirname(path,path));
len= FN_LEN - len; len= FN_LEN - len;
if (mysql_find_files(thd, &files, base_name, if (mysql_find_files(thd, &files, base_name,
...@@ -2035,7 +2035,7 @@ int fill_schema_shemata(THD *thd, TABLE_LIST *tables, COND *cond) ...@@ -2035,7 +2035,7 @@ int fill_schema_shemata(THD *thd, TABLE_LIST *tables, COND *cond)
(grant_option && !check_grant_db(thd, file_name))) (grant_option && !check_grant_db(thd, file_name)))
#endif #endif
{ {
(void) sprintf(path,"%s/%s",mysql_data_home, file_name); strxmov(path, mysql_data_home, "/", file_name, NullS);
length=unpack_dirname(path,path); // Convert if not unix length=unpack_dirname(path,path); // Convert if not unix
found_libchar= 0; found_libchar= 0;
if (length && path[length-1] == FN_LIBCHAR) if (length && path[length-1] == FN_LIBCHAR)
...@@ -2050,8 +2050,8 @@ int fill_schema_shemata(THD *thd, TABLE_LIST *tables, COND *cond) ...@@ -2050,8 +2050,8 @@ int fill_schema_shemata(THD *thd, TABLE_LIST *tables, COND *cond)
load_db_opt(thd, path, &create); load_db_opt(thd, path, &create);
restore_record(table, default_values); restore_record(table, default_values);
table->field[1]->store(file_name, strlen(file_name), system_charset_info); table->field[1]->store(file_name, strlen(file_name), system_charset_info);
table->field[2]->store(create.default_table_charset->name, table->field[2]->store(create.default_table_charset->csname,
strlen(create.default_table_charset->name), strlen(create.default_table_charset->csname),
system_charset_info); system_charset_info);
table->file->write_row(table->record[0]); table->file->write_row(table->record[0]);
} }
...@@ -2187,7 +2187,8 @@ static int get_schema_tables_record(THD *thd, struct st_table_list *tables, ...@@ -2187,7 +2187,8 @@ static int get_schema_tables_record(THD *thd, struct st_table_list *tables,
if (file->raid_type) if (file->raid_type)
{ {
char buff[100]; char buff[100];
sprintf(buff," raid_type=%s raid_chunks=%d raid_chunksize=%ld", my_snprintf(buff,sizeof(buff),
" raid_type=%s raid_chunks=%d raid_chunksize=%ld",
my_raid_type(file->raid_type), file->raid_chunks, my_raid_type(file->raid_type), file->raid_chunks,
file->raid_chunksize/RAID_BLOCK_SIZE); file->raid_chunksize/RAID_BLOCK_SIZE);
ptr=strmov(ptr,buff); ptr=strmov(ptr,buff);
...@@ -2630,7 +2631,17 @@ static int get_schema_views_record(THD *thd, struct st_table_list *tables, ...@@ -2630,7 +2631,17 @@ static int get_schema_views_record(THD *thd, struct st_table_list *tables,
table->field[1]->store(tables->view_db.str, tables->view_db.length, cs); table->field[1]->store(tables->view_db.str, tables->view_db.length, cs);
table->field[2]->store(tables->view_name.str,tables->view_name.length,cs); table->field[2]->store(tables->view_name.str,tables->view_name.length,cs);
table->field[3]->store(tables->query.str, tables->query.length, cs); table->field[3]->store(tables->query.str, tables->query.length, cs);
if (tables->with_check != VIEW_CHECK_NONE)
{
if (tables->with_check == VIEW_CHECK_LOCAL)
table->field[4]->store("WITH LOCAL CHECK OPTION", 23, cs);
else
table->field[4]->store("WITH CASCADED CHECK OPTION", 26, cs);
}
else
table->field[4]->store("NONE", 4, cs); table->field[4]->store("NONE", 4, cs);
if (tables->updatable_view) if (tables->updatable_view)
table->field[5]->store("YES", 3, cs); table->field[5]->store("YES", 3, cs);
else else
...@@ -2668,7 +2679,7 @@ static int get_schema_constarints_record(THD *thd, struct st_table_list *tables, ...@@ -2668,7 +2679,7 @@ static int get_schema_constarints_record(THD *thd, struct st_table_list *tables,
table->field[3]->store(base_name, strlen(base_name), cs); table->field[3]->store(base_name, strlen(base_name), cs);
table->field[4]->store(file_name, strlen(file_name), cs); table->field[4]->store(file_name, strlen(file_name), cs);
if (i == primary_key && !strcmp(key_info->name, primary_key_name)) if (i == primary_key && !strcmp(key_info->name, primary_key_name))
table->field[5]->store("PRIMARY", 7, cs); table->field[5]->store("PRIMARY KEY", 11, cs);
else if (key_info->flags & HA_NOSAME) else if (key_info->flags & HA_NOSAME)
table->field[5]->store("UNIQUE", 6, cs); table->field[5]->store("UNIQUE", 6, cs);
table->file->write_row(table->record[0]); table->file->write_row(table->record[0]);
...@@ -2685,7 +2696,7 @@ static int get_schema_constarints_record(THD *thd, struct st_table_list *tables, ...@@ -2685,7 +2696,7 @@ static int get_schema_constarints_record(THD *thd, struct st_table_list *tables,
f_key_info->forein_id->length, cs); f_key_info->forein_id->length, cs);
table->field[3]->store(base_name, strlen(base_name), cs); table->field[3]->store(base_name, strlen(base_name), cs);
table->field[4]->store(file_name, strlen(file_name), cs); table->field[4]->store(file_name, strlen(file_name), cs);
table->field[5]->store("FOREIGN", 7, system_charset_info); table->field[5]->store("FOREIGN KEY", 11, system_charset_info);
table->field[6]->store(f_key_info->constraint_method->str, table->field[6]->store(f_key_info->constraint_method->str,
f_key_info->constraint_method->length, cs); f_key_info->constraint_method->length, cs);
table->field[6]->set_notnull(); table->field[6]->set_notnull();
...@@ -3099,6 +3110,8 @@ bool get_schema_tables_result(JOIN *join) ...@@ -3099,6 +3110,8 @@ bool get_schema_tables_result(JOIN *join)
if (!tab->table || !tab->table->pos_in_table_list) if (!tab->table || !tab->table->pos_in_table_list)
break; break;
TABLE_LIST *table_list= tab->table->pos_in_table_list; TABLE_LIST *table_list= tab->table->pos_in_table_list;
TABLE_LIST *save_next_global= table_list->next_global;
if (table_list->schema_table && thd->fill_derived_tables()) if (table_list->schema_table && thd->fill_derived_tables())
{ {
TABLE *old_derived_tables= thd->derived_tables; TABLE *old_derived_tables= thd->derived_tables;
...@@ -3112,11 +3125,13 @@ bool get_schema_tables_result(JOIN *join) ...@@ -3112,11 +3125,13 @@ bool get_schema_tables_result(JOIN *join)
{ {
thd->derived_tables= old_derived_tables; thd->derived_tables= old_derived_tables;
thd->lock= sql_lock; thd->lock= sql_lock;
table_list->next_global= save_next_global;
DBUG_RETURN(TRUE); DBUG_RETURN(TRUE);
} }
thd->lock= sql_lock; thd->lock= sql_lock;
thd->lex->sql_command= SQLCOM_SELECT; thd->lex->sql_command= SQLCOM_SELECT;
thd->derived_tables= old_derived_tables; thd->derived_tables= old_derived_tables;
table_list->next_global= save_next_global;
} }
} }
DBUG_RETURN(FALSE); DBUG_RETURN(FALSE);
...@@ -3178,7 +3193,7 @@ ST_FIELD_INFO columns_fields_info[]= ...@@ -3178,7 +3193,7 @@ ST_FIELD_INFO columns_fields_info[]=
{"KEY", 3, MYSQL_TYPE_STRING, 0, 0, 1, "Key"}, {"KEY", 3, MYSQL_TYPE_STRING, 0, 0, 1, "Key"},
{"COLUMN_DEFAULT", NAME_LEN, MYSQL_TYPE_STRING, 0, 1, 1, "Default"}, {"COLUMN_DEFAULT", NAME_LEN, MYSQL_TYPE_STRING, 0, 1, 1, "Default"},
{"EXTRA", 20, MYSQL_TYPE_STRING, 0, 0, 1, "Extra"}, {"EXTRA", 20, MYSQL_TYPE_STRING, 0, 0, 1, "Extra"},
{"PRIVILIGES", 80, MYSQL_TYPE_STRING, 0, 0, 1, "Privileges"}, {"PRIVILEGES", 80, MYSQL_TYPE_STRING, 0, 0, 1, "Privileges"},
{"COMMENT", 255, MYSQL_TYPE_STRING, 0, 0, 1, "Comment"}, {"COMMENT", 255, MYSQL_TYPE_STRING, 0, 0, 1, "Comment"},
{0, 0, MYSQL_TYPE_STRING, 0, 0, 0, 0} {0, 0, MYSQL_TYPE_STRING, 0, 0, 0, 0}
}; };
...@@ -3265,7 +3280,7 @@ ST_FIELD_INFO view_fields_info[]= ...@@ -3265,7 +3280,7 @@ ST_FIELD_INFO view_fields_info[]=
{"TABLE_SCHEMA", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, 1, 0}, {"TABLE_SCHEMA", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, 1, 0},
{"TABLE_NAME", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, 1, 0}, {"TABLE_NAME", NAME_LEN, MYSQL_TYPE_STRING, 0, 0, 1, 0},
{"VIEW_DEFINITION", 65535, MYSQL_TYPE_STRING, 0, 0, 1, 0}, {"VIEW_DEFINITION", 65535, MYSQL_TYPE_STRING, 0, 0, 1, 0},
{"CHECK_OPTION", 4, MYSQL_TYPE_STRING, 0, 0, 1, 0}, {"CHECK_OPTION", 30, MYSQL_TYPE_STRING, 0, 0, 1, 0},
{"IS_UPDATABLE", 3, MYSQL_TYPE_STRING, 0, 0, 1, 0}, {"IS_UPDATABLE", 3, MYSQL_TYPE_STRING, 0, 0, 1, 0},
{0, 0, MYSQL_TYPE_STRING, 0, 0, 0, 0} {0, 0, MYSQL_TYPE_STRING, 0, 0, 0, 0}
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment