diff options
-rw-r--r-- | .bzrignore | 1 | ||||
-rw-r--r-- | BUILD/FINISH.sh | 8 | ||||
-rw-r--r-- | BUILD/SETUP.sh | 43 | ||||
-rwxr-xr-x | BUILD/compile-alpha | 14 | ||||
-rwxr-xr-x | BUILD/compile-pentium | 15 | ||||
-rwxr-xr-x | BUILD/compile-pentium-debug | 24 | ||||
-rwxr-xr-x | BUILD/compile-pentium-debug-no-bdb | 22 | ||||
-rwxr-xr-x | BUILD/compile-pentium-gcov | 21 | ||||
-rwxr-xr-x | BUILD/compile-pentium-myodbc | 14 | ||||
-rwxr-xr-x | BUILD/compile-solaris-sparc | 16 | ||||
-rwxr-xr-x | BUILD/compile-solaris-sparc-purify | 18 | ||||
-rw-r--r-- | Docs/manual.texi | 6 | ||||
-rw-r--r-- | sql/gen_lex_hash.cc | 2 | ||||
-rw-r--r-- | sql/lex.h | 1 | ||||
-rw-r--r-- | sql/mysql_priv.h | 3 | ||||
-rw-r--r-- | sql/sql_base.cc | 68 | ||||
-rw-r--r-- | sql/sql_lex.h | 3 | ||||
-rw-r--r-- | sql/sql_parse.cc | 9 | ||||
-rw-r--r-- | sql/sql_show.cc | 45 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 7 |
20 files changed, 248 insertions, 92 deletions
diff --git a/.bzrignore b/.bzrignore index d51538477fa..c5f82922101 100644 --- a/.bzrignore +++ b/.bzrignore @@ -10,6 +10,7 @@ .gdb_history .libs .o +db-*.*.* BitKeeper/etc/config BitKeeper/etc/csets BitKeeper/etc/csets-in diff --git a/BUILD/FINISH.sh b/BUILD/FINISH.sh new file mode 100644 index 00000000000..39a3dc3f7ef --- /dev/null +++ b/BUILD/FINISH.sh @@ -0,0 +1,8 @@ +cflags="$c_warnings $extra_flags" +cxxflags="$cxx_warnings $base_cxxflags $extra_flags" +configure="./configure $base_configs $extra_configs" + +CFLAGS="$cflags" CXX=gcc CXXFLAGS="$cxxflags" eval "$configure" + +test "$make" = no || $make $AM_MAKEFLAGS +test -z "$strip" || strip mysqld diff --git a/BUILD/SETUP.sh b/BUILD/SETUP.sh new file mode 100644 index 00000000000..37c3dc2ea37 --- /dev/null +++ b/BUILD/SETUP.sh @@ -0,0 +1,43 @@ +if ! test -f sql/mysqld.cc; then + echo "You must run this script from the MySQL top-level directory" + exit 1 +fi + +set -e # exit on error + +AM_MAKEFLAGS="-j4" # XXX: auto-make uses this variable - export it??? + +# If you are not using codefusion add "-Wpointer-arith" to WARNINGS +# The following warning flag will give too many warnings: +# -Wshadow -Wunused -Winline (The later isn't usable in C++ as +# __attribute()__ doesn't work with gnu C++) +global_warnings="-Wimplicit -Wreturn-type -Wid-clash-51 -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wuninitialized -Wformat -Wimplicit-function-dec -Wimplicit-int -Wparentheses -Wsign-compare -Wwrite-strings" +c_warnings="$global_warnings -Wunused" +cxx_warnings="$global_warnings -Woverloaded-virtual -Wextern-inline -Wsign-promo -Wreorder -Wctor-dtor-privacy -Wnon-virtual-dtor" + +alpha_cflags="-mcpu=ev6 -Wa,-mev6" # not used yet +pentium_cflags="-mpentiumpro" +sparc_cflags="" + +fast_cflags="-O6 -fomit-frame-pointer" +debug_cflags="-DEXTRA_DEBUG -DFORCE_INIT_OF_VARS -O2" + +base_cxxflags="-felide-constructors -fno-exceptions -fno-rtti" + +base_configs="--prefix=/usr/local/mysql --enable-assembler --with-extra-charsets=complex --enable-thread-safe-client --with-mysqld-ldflags=-all-static --disable-shared" +alpha_configs="" # not used yet +pentium_configs="" +sparc_configs="" + +debug_configs="--with-debug" + +if gmake --version > /dev/null 2>&1; then + make=gmake +else + make=make +fi + +$make -k clean || true +/bin/rm -f */.deps/*.P config.cache + +aclocal; autoheader; aclocal; automake; autoconf diff --git a/BUILD/compile-alpha b/BUILD/compile-alpha index ff70be8a5ab..10b9d67e1c1 100755 --- a/BUILD/compile-alpha +++ b/BUILD/compile-alpha @@ -1,7 +1,9 @@ -make -k clean -/bin/rm -f */.deps/*.P */*.o -/bin/rm -f config.cache -aclocal; autoheader; aclocal; automake; autoconf +#! /bin/sh -CFLAGS="-O6 -fomit-frame-pointer -mcpu=ev6 -Wa,-mev6" CXX=gcc CXXFLAGS="-O6 -mcpu=ev6 -Wa,-mev6 -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --disable-shared --with-extra-charsets=complex -make +path=`dirname $0` +. "$path/SETUP.sh" + +extra_flags="$alpha_cflags $fast_cflags" +extra_configs="$alpha_configs" + +. "$path/FINISH.sh" diff --git a/BUILD/compile-pentium b/BUILD/compile-pentium index 79d5c5e19b9..cdbc7e773eb 100755 --- a/BUILD/compile-pentium +++ b/BUILD/compile-pentium @@ -1,9 +1,10 @@ -AM_MAKEFLAGS="-j 2" -make -k clean -/bin/rm -f */.deps/*.P config.cache +#! /bin/sh -aclocal; autoheader; aclocal; automake; autoconf +path=`dirname $0` +. "$path/SETUP.sh" -CFLAGS="-O6 -mpentiumpro -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -mpentiumpro -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-extra-charsets=complex --enable-thread-safe-client "$@" -make -j 2 -strip sql/mysqld +extra_flags="$pentium_cflags $fast_cflags" +extra_configs="$pentium_configs" +strip=yes + +. "$path/FINISH.sh" diff --git a/BUILD/compile-pentium-debug b/BUILD/compile-pentium-debug index beae200ea31..37381cc47df 100755 --- a/BUILD/compile-pentium-debug +++ b/BUILD/compile-pentium-debug @@ -1,21 +1,9 @@ -AM_MAKEFLAGS="-j 2" -make -k clean -/bin/rm -f */.deps/*.P config.cache +#! /bin/sh -aclocal; autoheader; aclocal; automake; autoconf +path=`dirname $0` +. "$path/SETUP.sh" -# If you are not using codefusion add "-Wpointer-arith" to WARNINGS -# The following warning flag will give too many warnings: -# -Wshadow -Wunused -Winline (The later isn't usable in C++ as -# __attribute()__ doesn't work with gnu C++) +extra_flags="$pentium_cflags $debug_cflags" +extra_configs="$pentium_configs $debug_configs" -GLOBAL_WARNINGS="-Wimplicit -Wreturn-type -Wid-clash-51 -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wuninitialized -Wformat -Wimplicit-function-dec -Wimplicit-int -Wparentheses -Wsign-compare -Wwrite-strings" -C_WARNINGS="$GLOBAL_WARNINGS -Wunused" -CC_WARNINGS="$GLOBAL_WARNINGS -Woverloaded-virtual -Wextern-inline -Wsign-promo -Wreorder -Wctor-dtor-privacy -Wnon-virtual-dtor" - - -CFLAGS="-DEXTRA_DEBUG -DFORCE_INIT_OF_VARS -O2 -mpentiumpro $C_WARNINGS" CXX=gcc \ -CXXFLAGS="-DEXTRA_DEBUG -DFORCE_INIT_OF_VARS -O2 -mpentiumpro -felide-constructors -fno-exceptions -fno-rtti $CC_WARNINGS" \ -./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-extra-charsets=complex --with-debug=full \ ---with-berkeley-db=/usr/local/BerkeleyDB -make -j 2 +. "$path/FINISH.sh" diff --git a/BUILD/compile-pentium-debug-no-bdb b/BUILD/compile-pentium-debug-no-bdb index b7f931a6718..fad58bec437 100755 --- a/BUILD/compile-pentium-debug-no-bdb +++ b/BUILD/compile-pentium-debug-no-bdb @@ -1,19 +1,9 @@ -make -k clean -/bin/rm -f */.deps/*.P config.cache +#! /bin/sh -aclocal; autoheader; aclocal; automake; autoconf +path=`dirname $0` +. "$path/SETUP.sh" -# If you are not using codefusion add "-Wpointer-arith" to WARNINGS -# The following warning flag will give too many warnings: -# -Wshadow -Wunused -Winline (The later isn't usable in C++ as -# __attribute()__ doesn't work with gnu C++) +extra_flags="$pentium_cflags $debug_cflags" +extra_configs="$pentium_configs $debug_configs --without-berkeley-db" -GLOBAL_WARNINGS="-Wimplicit -Wreturn-type -Wid-clash-51 -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wuninitialized -Wformat -Wimplicit-function-dec -Wimplicit-int -Wparentheses -Wsign-compare -Wwrite-strings" -C_WARNINGS="$GLOBAL_WARNINGS -Wunused" -CC_WARNINGS="$GLOBAL_WARNINGS -Woverloaded-virtual -Wextern-inline -Wsign-promo -Wreorder -Wctor-dtor-privacy -Wnon-virtual-dtor" - - -CFLAGS="-DEXTRA_DEBUG -DFORCE_INIT_OF_VARS -O2 -mpentiumpro $C_WARNINGS" CXX=gcc \ -CXXFLAGS="-DEXTRA_DEBUG -DFORCE_INIT_OF_VARS -O2 -mpentiumpro -felide-constructors -fno-exceptions -fno-rtti $CC_WARNINGS" \ -./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-extra-charsets=complex --with-debug=full -make +. "$path/FINISH.sh" diff --git a/BUILD/compile-pentium-gcov b/BUILD/compile-pentium-gcov index 2137798389b..4cb4ddb8057 100755 --- a/BUILD/compile-pentium-gcov +++ b/BUILD/compile-pentium-gcov @@ -1,18 +1,9 @@ -AM_MAKEFLAGS="-j 2" -make -k clean -/bin/rm -f */.deps/*.P config.cache +#! /bin/sh -aclocal; autoheader; aclocal; automake; autoconf +path=`dirname $0` +. "$path/SETUP.sh" -# If you are not using codefusion add "-Wpointer-arith" to WARNINGS -# The following warning flag will give too many warnings: -# -Wshadow -Wunused (The later isn't usable in C++ as -# __attribute()__ doesn't work with gnu C++) - -GLOBAL_WARNINGS="-Wimplicit -Wreturn-type -Wid-clash-51 -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wuninitialized -Wformat -Wimplicit-function-dec -Wimplicit-int -Wparentheses -Wsign-compare -Wwrite-strings" -C_WARNINGS="$GLOBAL_WARNINGS -Wunused" -CC_WARNINGS="$GLOBAL_WARNINGS -Woverloaded-virtual -Wextern-inline -Wsign-promo -Wreorder -Wctor-dtor-privacy -Wnon-virtual-dtor" - -CFLAGS="-O2 -mpentiumpro -fprofile-arcs -ftest-coverage $C_WARNINGS" CXX=gcc CXXFLAGS="-O2 -mpentiumpro -fprofile-arcs -ftest-coverage -felide-constructors -fno-exceptions -fno-rtti $CC_WARNINGS" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-extra-charsets=complex --with-debug=full -make -j 2 +extra_flags="$pentium_cflags -O2 -fprofile-arcs -ftest-coverage" +extra_configs="$pentium_configs $debug_configs" +. "$path/FINISH.sh" diff --git a/BUILD/compile-pentium-myodbc b/BUILD/compile-pentium-myodbc index 989f98eac60..4fcfc7e49dc 100755 --- a/BUILD/compile-pentium-myodbc +++ b/BUILD/compile-pentium-myodbc @@ -1,6 +1,12 @@ -make -k clean -/bin/rm -f */.deps/*.P config.cache +#! /bin/sh -aclocal; autoheader; aclocal; automake; autoconf +path=`dirname $0` +. "$path/SETUP.sh" -CFLAGS="-O6 -mpentiumpro -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -mpentiumpro -fomit-frame-pointer -felide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --with-extra-charsets=complex --without-server +extra_flags="$pentium_cflags $fast_cflags" +extra_configs="$pentium_configs --without-server" + +make=no +strip=yes + +. "$path/FINISH.sh" diff --git a/BUILD/compile-solaris-sparc b/BUILD/compile-solaris-sparc index d234fb2ab9c..0558cfda25d 100755 --- a/BUILD/compile-solaris-sparc +++ b/BUILD/compile-solaris-sparc @@ -1,9 +1,9 @@ -gmake -k clean -/bin/rm -f */.deps/*.P */*.o -/bin/rm -f config.cache -aclocal; autoheader; aclocal; automake; autoconf +#! /bin/sh -CFLAGS="-O6 -fomit-frame-pointer" CXX=gcc CXXFLAGS="-O6 -fomit-frame-pointer -f -elide-constructors -fno-exceptions -fno-rtti" ./configure --prefix=/usr/local/m -ysql --with-extra-charsets=complex -gmake +path=`dirname $0` +. "$path/SETUP.sh" + +extra_flags="$sparc_cflags $fast_cflags" +extra_configs="$sparc_configs" + +. "$path/FINISH.sh" diff --git a/BUILD/compile-solaris-sparc-purify b/BUILD/compile-solaris-sparc-purify index 2a48d71375d..bad8a569ea3 100755 --- a/BUILD/compile-solaris-sparc-purify +++ b/BUILD/compile-solaris-sparc-purify @@ -1,13 +1,9 @@ -gmake -k clean -/bin/rm -f */.deps/*.P */*.o -/bin/rm -f config.cache -aclocal; autoheader; aclocal; automake; autoconf +#! /bin/sh -GLOBAL_WARNINGS="-Wimplicit -Wreturn-type -Wid-clash-51 -Wswitch -Wtrigraphs -Wcomment -W -Wchar-subscripts -Wuninitialized -Wformat -Wimplicit-function-dec -Wimplicit-int -Wparentheses -Wsign-compare -Wwrite-strings" -C_WARNINGS="$GLOBAL_WARNINGS -Wunused" -CC_WARNINGS="$GLOBAL_WARNINGS -Woverloaded-virtual -Wextern-inline -Wsign-promo -Wreorder -Wctor-dtor-privacy -Wnon-virtual-dtor" +path=`dirname $0` +. "$path/SETUP.sh" -CFLAGS="-DHAVE_PURIFY -O2 $C_WARNINGS" CXX=gcc \ -CXXFLAGS="-DHAVE_PURIFY -O2 -felide-constructors -fno-exceptions -fno-rtti $CC_WARNINGS" \ -./configure --prefix=/usr/local/mysql --enable-assembler --with-mysqld-ldflags=-all-static --disable-shared --with-debug=full -gmake +extra_flags="$sparc_cflags -DHAVE_PURIFY -O2" +extra_configs="$sparc_configs --with-debug=full" + +. "$path/FINISH.sh" diff --git a/Docs/manual.texi b/Docs/manual.texi index 468ad37ae6d..d9ec213f78e 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -19894,7 +19894,7 @@ commands to examine and kill threads. @example SHOW DATABASES [LIKE wild] -or SHOW TABLES [FROM db_name] [LIKE wild] +or SHOW [OPEN] TABLES [FROM db_name] [LIKE wild] or SHOW COLUMNS FROM tbl_name [FROM db_name] [LIKE wild] or SHOW INDEX FROM tbl_name [FROM db_name] or SHOW TABLE STATUS [FROM db_name] [LIKE wild] @@ -19950,6 +19950,10 @@ get this list using the @code{mysqlshow db_name} command. will not show up in the output from @code{SHOW TABLES} or @code{mysqlshow db_name}. +@code{SHOW OPEN TABLES} lists the tables that are currently open in +the table cache. @xref{Table cache}. The @code{Comment} field tells +how many times the table is @code{cached} and @code{in_use}. + @code{SHOW COLUMNS} lists the columns in a given table. If the column types are different than you expect them to be based on a @code{CREATE TABLE} statement, note that @strong{MySQL} sometimes changes column diff --git a/sql/gen_lex_hash.cc b/sql/gen_lex_hash.cc index 1ba8c321ae7..e77081c64a0 100644 --- a/sql/gen_lex_hash.cc +++ b/sql/gen_lex_hash.cc @@ -472,7 +472,7 @@ int main(int argc,char **argv) int error; MY_INIT(argv[0]); - start_value=2610463L; best_t1=8358376L; best_t2=860646L; best_type=2; /* mode=4111 add=8 func_type: 0 */ + start_value=5206280L; best_t1=590774L; best_t2=5977654L; best_type=1; /* mode=6229 add=2 func_type: 0 */ if (get_options(argc,(char **) argv)) exit(1); diff --git a/sql/lex.h b/sql/lex.h index 503ce6998bb..399106bfd77 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -223,6 +223,7 @@ static SYMBOL symbols[] = { { "NOT", SYM(NOT),0,0}, { "NULL", SYM(NULL_SYM),0,0}, { "ON", SYM(ON),0,0}, + { "OPEN", SYM(OPEN_SYM),0,0}, { "OPTIMIZE", SYM(OPTIMIZE),0,0}, { "OPTION", SYM(OPTION),0,0}, { "OPTIONALLY", SYM(OPTIONALLY),0,0}, diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 067e17c4356..0980c91e444 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -354,6 +354,7 @@ Field *find_field_in_table(THD *thd,TABLE *table,const char *name,uint length, /* sql_list.c */ int mysqld_show_dbs(THD *thd,const char *wild); +int mysqld_show_open_tables(THD *thd,const char *db,const char *wild); int mysqld_show_tables(THD *thd,const char *db,const char *wild); int mysqld_extend_show_tables(THD *thd,const char *db,const char *wild); int mysqld_show_fields(THD *thd,TABLE_LIST *table, const char *wild); @@ -418,6 +419,8 @@ bool close_cached_tables(THD *thd, bool wait_for_refresh, TABLE_LIST *tables); void copy_field_from_tmp_record(Field *field,int offset); int fill_record(List<Item> &fields,List<Item> &values); int fill_record(Field **field,List<Item> &values); +int list_open_tables(THD *thd,List<char> *files, const char *db,const char *wild); +char* query_table_status(THD *thd,const char *db,const char *table_name); /* sql_calc.cc */ bool eval_const_cond(COND *cond); diff --git a/sql/sql_base.cc b/sql/sql_base.cc index 623ed5dc0b6..74e8dccd4d7 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -112,6 +112,74 @@ static void check_unused(void) #define check_unused() #endif +int list_open_tables(THD *thd,List<char> *tables, const char *db,const char *wild) +{ + int result = 0; + uint col_access=thd->col_access; + TABLE_LIST table_list; + DBUG_ENTER("list_open_tables"); + VOID(pthread_mutex_lock(&LOCK_open)); + bzero((char*) &table_list,sizeof(table_list)); + + for (uint idx=0 ; result == 0 && idx < open_cache.records; idx++) + { + TABLE *entry=(TABLE*) hash_element(&open_cache,idx); + if ((!entry->real_name) || strcmp(entry->table_cache_key,db)) + continue; + if (wild && wild[0] && wild_compare(entry->real_name,wild)) + continue; + if (db && !(col_access & TABLE_ACLS)) + { + table_list.db= (char*) db; + table_list.real_name= entry->real_name;/*real name*/ + table_list.grant.privilege=col_access; + if (check_grant(thd,TABLE_ACLS,&table_list,1)) + continue; + } + /* need to check if he have't already listed it */ + + List_iterator<char> it(*tables); + char *table_name; + int check = 0; + while (check == 0 && (table_name=it++)) + { + if (!strcmp(table_name,entry->real_name)) + check++; + } + if (check) + continue; + + if (tables->push_back(thd->strdup(entry->real_name))) + { + result = -1; + } + } + + VOID(pthread_mutex_unlock(&LOCK_open)); + DBUG_RETURN(result); +} + +char* +query_table_status(THD *thd,const char *db,const char *table_name) +{ + int cached = 0, in_use = 0; + char info[256]; + + for (uint idx=0 ; idx < open_cache.records; idx++) + { + TABLE *entry=(TABLE*) hash_element(&open_cache,idx); + if (strcmp(entry->table_cache_key,db) || + strcmp(entry->real_name,table_name)) + continue; + + cached++; + if (entry->in_use) + in_use++; + } + + sprintf(info, "cached=%d, in_use=%d", cached, in_use); + return thd->strdup(info); +} /****************************************************************************** diff --git a/sql/sql_lex.h b/sql/sql_lex.h index 46ff08e0a47..7f52cc3e84c 100644 --- a/sql/sql_lex.h +++ b/sql/sql_lex.h @@ -52,7 +52,8 @@ enum enum_sql_command { SQLCOM_ROLLBACK, SQLCOM_COMMIT, SQLCOM_SLAVE_START, SQLCOM_SLAVE_STOP, SQLCOM_BEGIN, SQLCOM_LOAD_MASTER_TABLE, SQLCOM_CHANGE_MASTER, SQLCOM_RENAME_TABLE, SQLCOM_BACKUP_TABLE, SQLCOM_RESTORE_TABLE, - SQLCOM_RESET, SQLCOM_PURGE, SQLCOM_SHOW_BINLOGS + SQLCOM_RESET, SQLCOM_PURGE, SQLCOM_SHOW_BINLOGS, + SQLCOM_SHOW_OPEN_TABLES }; enum lex_states { STATE_START, STATE_CHAR, STATE_IDENT, diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index fef35ed88d0..30b45cb18df 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -1488,6 +1488,8 @@ mysql_execute_command(void) } #endif case SQLCOM_SHOW_TABLES: + /* FALL THROUGH */ + case SQLCOM_SHOW_OPEN_TABLES: #ifdef DONT_ALLOW_SHOW_COMMANDS send_error(&thd->net,ER_NOT_ALLOWED_COMMAND); /* purecov: inspected */ DBUG_VOID_RETURN; @@ -1508,8 +1510,11 @@ mysql_execute_command(void) if (check_access(thd,SELECT_ACL,db,&thd->col_access)) goto error; /* purecov: inspected */ /* grant is checked in mysqld_show_tables */ - if (lex->options & SELECT_DESCRIBE) - res= mysqld_extend_show_tables(thd,db, + if (lex->sql_command == SQLCOM_SHOW_OPEN_TABLES) + res= mysqld_show_open_tables(thd,db, + (lex->wild ? lex->wild->ptr() : NullS)); + else if (lex->options & SELECT_DESCRIBE) + res= mysqld_extend_show_tables(thd,db, (lex->wild ? lex->wild->ptr() : NullS)); else res= mysqld_show_tables(thd,db, diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 3094ff26d89..d4643505ced 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -87,6 +87,47 @@ mysqld_show_dbs(THD *thd,const char *wild) } /*************************************************************************** +** List all open tables in a database +***************************************************************************/ + +int mysqld_show_open_tables(THD *thd,const char *db,const char *wild) +{ + Item_string *field=new Item_string("",0); + List<Item> field_list; + char *end,*table_name; + List<char> tables; + DBUG_ENTER("mysqld_show_open_tables"); + + field->name=(char*) thd->alloc(20+(uint) strlen(db)+(wild ? (uint) strlen(wild)+4:0)); + end=strxmov(field->name,"Open_tables_in_",db,NullS); + if (wild && wild[0]) + strxmov(end," (",wild,")",NullS); + field->max_length=NAME_LEN; + field_list.push_back(field); + field_list.push_back(new Item_empty_string("Comment",80)); + + if (send_fields(thd,field_list,1)) + DBUG_RETURN(1); + + if (list_open_tables(thd,&tables,db,wild)) + DBUG_RETURN(-1); + + List_iterator<char> it(tables); + while ((table_name=it++)) + { + thd->packet.length(0); + net_store_data(&thd->packet,table_name); + net_store_data(&thd->packet,query_table_status(thd,db,table_name)); + if (my_net_write(&thd->net,(char*) thd->packet.ptr(),thd->packet.length())) + DBUG_RETURN(-1); + } + + + send_eof(&thd->net); + DBUG_RETURN(0); +} + +/*************************************************************************** ** List all tables in a database (fast version) ** A table is a .frm file in the current databasedir ***************************************************************************/ @@ -161,9 +202,9 @@ mysql_find_files(THD *thd,List<char> *files, const char *db,const char *path, } else { - // Return only .frm files which isn't temp files. + // Return only .frm files which aren't temp files. if (my_strcasecmp(ext=fn_ext(file->name),reg_ext) || - is_prefix(file->name,tmp_file_prefix)) // Mysql temp table + is_prefix(file->name,tmp_file_prefix)) continue; *ext=0; if (wild && wild[0] && wild_compare(file->name,wild)) diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 84e55d46c71..94c1ea943e7 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -216,6 +216,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); %token NULL_SYM %token NUM %token ON +%token OPEN_SYM %token OPTION %token OPTIONALLY %token OR @@ -2151,6 +2152,11 @@ show_param: Lex->options|= SELECT_DESCRIBE; Lex->db= $3; } + | OPEN_SYM TABLES opt_db wild + { Lex->sql_command= SQLCOM_SHOW_OPEN_TABLES; + Lex->db= $3; + Lex->options=0; + } | COLUMNS FROM table_ident opt_db wild { Lex->sql_command= SQLCOM_SHOW_FIELDS; @@ -2513,6 +2519,7 @@ keyword: | NATIONAL_SYM {} | NCHAR_SYM {} | NO_SYM {} + | OPEN_SYM {} | PACK_KEYS_SYM {} | PASSWORD {} | PROCESS {} |