diff options
author | unknown <monty@donna.mysql.fi> | 2001-03-06 20:38:53 +0200 |
---|---|---|
committer | unknown <monty@donna.mysql.fi> | 2001-03-06 20:38:53 +0200 |
commit | 08d7d5cf331a9f0e860792c356201ef386ceea5d (patch) | |
tree | 9613587a263dc7a069c1038873e71db018c29273 | |
parent | a9c60a41feb2189e270c41def107d40c1f00b8b5 (diff) | |
download | mariadb-git-08d7d5cf331a9f0e860792c356201ef386ceea5d.tar.gz |
Patch from sleepycat to fix problem with BDB and log files
Print full command name to log files
Convert table type to supported onces on ALTER TABLE
Docs/manual.texi:
Updates from user comments
bdb/log/log_rec.c:
Patch from sleepycat to fix problem with log files
innobase/ibuf/Makefile.am:
Don't let make do bk get
innobase/include/Makefile.am:
Don't let make do bk get
man/Makefile.am:
Don't let make do bk get
myisam/mi_dbug.c:
Print warning to debug log
mysql-test/mysql-test-run.sh:
Don't use innobase in replica
mysql-test/r/null_key.result:
Fix for new key lengths
sql/ha_innobase.cc:
Free hash cache at end
sql/log.cc:
Print full command name to log files
sql/sql_table.cc:
Convert table type to supported onces on ALTER TABLE
-rw-r--r-- | Docs/manual.texi | 88 | ||||
-rw-r--r-- | bdb/log/log_rec.c | 26 | ||||
-rw-r--r-- | bdb/patches/log-corruption.patch | 62 | ||||
-rw-r--r-- | innobase/ibuf/Makefile.am | 3 | ||||
-rw-r--r-- | innobase/include/Makefile.am | 3 | ||||
-rw-r--r-- | man/Makefile.am | 3 | ||||
-rw-r--r-- | myisam/mi_dbug.c | 11 | ||||
-rw-r--r-- | mysql-test/mysql-test-run.sh | 1 | ||||
-rw-r--r-- | mysql-test/r/null_key.result | 2 | ||||
-rw-r--r-- | sql/ha_innobase.cc | 7 | ||||
-rw-r--r-- | sql/log.cc | 2 | ||||
-rw-r--r-- | sql/sql_table.cc | 5 |
12 files changed, 185 insertions, 28 deletions
diff --git a/Docs/manual.texi b/Docs/manual.texi index a567f6a0bb6..154353b2063 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -10794,7 +10794,12 @@ other contexts, however. @strong{MySQL} doesn't yet support the Oracle SQL extension: @code{SELECT ... INTO TABLE ...}. @strong{MySQL} supports instead the ANSI SQL syntax @code{INSERT INTO ... SELECT ...}, which is basically -the same thing. +the same thing. @xref{INSERT}. + +@example +INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE +tblTemp1.fldOrder_ID > 100; +@end example Alternatively, you can use @code{SELECT INTO OUTFILE...} or @code{CREATE TABLE ... SELECT} to solve your problem. @@ -11041,7 +11046,22 @@ constraints for application that can't easily be coded to avoid them. @subsection Views @cindex views -@strong{MySQL} doesn't support views, but this is on the TODO. +@strong{MySQL} doesn't yet support views, but we plan to implement these +to about 4.1. + +Views are mostly useful in letting user access a set of relations as one +table (in read-only mode). Many SQL databases doesn't allow one to update +any rows in a view, but you have to do the updates in the separate tables. + +As @strong{MySQL} is mostly used in applications and on web system where +the application write has full control on the database usage, most of +our users haven't regarded views to be very important. (At least no one +has been interested enough of this to be prepared to finance the +implementation of views). + +One doesn't need views in @strong{MySQL} to restrict access to columns +as @strong{MySQL} has a very sophisticated privilege +system. @xref{Privilege system}. @node Missing comments, , Missing Views, Missing functions @subsection @samp{--} as the Start of a Comment @@ -19539,15 +19559,18 @@ or INSERT [LOW_PRIORITY | DELAYED] [IGNORE] or INSERT [LOW_PRIORITY | DELAYED] [IGNORE] [INTO] tbl_name SET col_name=expression, col_name=expression, ... +or INSERT [LOW_PRIORITY] [IGNORE] [INTO] tbl_name + SELECT ... + @end example -@code{INSERT} inserts new rows into an existing table. The @code{INSERT ... -VALUES} form of the statement inserts rows based on explicitly specified -values. The @code{INSERT ... SELECT} form inserts rows selected from another -table or tables. The @code{INSERT ... VALUES} form with multiple value lists -is supported in @strong{MySQL} Version 3.22.5 or later. The -@code{col_name=expression} syntax is supported in @strong{MySQL} Version 3.22.10 or -later. +@code{INSERT} inserts new rows into an existing table. The @code{INSERT +... VALUES} form of the statement inserts rows based on explicitly +specified values. The @code{INSERT ... SELECT} form inserts rows +selected from another table or tables. The @code{INSERT ... VALUES} +form with multiple value lists is supported in @strong{MySQL} Version +3.22.5 or later. The @code{col_name=expression} syntax is supported in +@strong{MySQL} Version 3.22.10 or later. @code{tbl_name} is the table into which rows should be inserted. The column name list or the @code{SET} clause indicates which columns the statement @@ -19607,9 +19630,17 @@ specify values for all columns that require a non-@code{NULL} value. You can find the value used for an @code{AUTO_INCREMENT} column with the @code{mysql_insert_id} function. @xref{mysql_insert_id, , @code{mysql_insert_id()}}. +@end itemize -@item -The following conditions hold for an @code{INSERT INTO ... SELECT} statement: +With @code{INSERT ... SELECT} statement you can quickly insert many rows +into a table from one or many tables. + +@example +INSERT INTO tblTemp2 (fldID) SELECT tblTemp1.fldOrder_ID FROM tblTemp1 WHERE +tblTemp1.fldOrder_ID > 100; +@end example + +The following conditions hold for an @code{INSERT ... SELECT} statement: @itemize @minus @item @@ -19626,7 +19657,6 @@ sub-select clauses, the situation could easily be very confusing!) @item @code{AUTO_INCREMENT} columns work as usual. @end itemize -@end itemize @findex mysql_info() If you use @code{INSERT ... SELECT} or an @code{INSERT ... VALUES} @@ -29385,16 +29415,16 @@ going. Hopefully this will be better handled in future Linux Kernels. This should contain a technical description of the @strong{MySQL} benchmark suite (and @code{crash-me}), but that description is not -written yet. Currently, you should look at the code and results in the -@file{sql-bench} directory in the distribution (and of course on the Web page -at @uref{http://www.mysql.com/information/crash-me.php} and (normally found in -the @file{sql-bench} directory in the @strong{MySQL} distribution)). +written yet. Currently, you can get a good idea of the benchmark by +looking at the code and results in the @file{sql-bench} directory in any +@strong{MySQL} source distributions. -It is meant to be a benchmark that will tell any user what things a -given SQL implementation performs well or poorly at. +This benchmark suite is meant to be a benchmark that will tell any user +what things a given SQL implementation performs well or poorly at. Note that this benchmark is single threaded, so it measures the minimum -time for the operations. +time for the operations. We plan to in the future add a lot of +multi-threaded tests to the benchmark suite. For example, (run on the same NT 4.0 machine): @@ -29424,12 +29454,28 @@ For example, (run on the same NT 4.0 machine): In the above test @strong{MySQL} was run with a 8M index cache. +We have gather some more benchmark results at +@uref{http://www.mysql.com/information/benchmarks.html}. + Note that Oracle is not included because they asked to be removed. All Oracle benchmarks have to be passed by Oracle! We believe that makes Oracle benchmarks @strong{VERY} biased because the above benchmarks are supposed to show what a standard installation can do for a single client. +To run the benchmark suite, you have to download a MySQL source distribution +install the perl DBI driver, the perl DBD driver for the database you want to +test and then do: + +@example +cd sql-bench +perl run-all-tests --server=# +@end example + +where # is one of supported servers. You can get a list of all options +and supported servers by doing @code{run-all-tests --help}. + +@cindex crash-me @code{crash-me} tries to determine what features a database supports and what it's capabilities and limitations are by actually running queries. For example, it determines: @@ -29447,6 +29493,9 @@ How big a query can be How big a @code{VARCHAR} column can be @end itemize +We can find the result from crash-me on a lot of different databases at +@uref{http://www.mysql.com/information/crash-me.php}. + @cindex utilities @node Tools, Maintenance, MySQL Benchmarks, Top @chapter MySQL Utilites @@ -39011,6 +39060,7 @@ You can also find this at: There are 2 supported JDBC drivers for @strong{MySQL} (the mm driver and the Reisin JDBC driver). You can find a copy of the mm driver at +@uref{http://mmmysql.sourceforge.net/} or @uref{http://www.mysql.com/Downloads/Contrib/} and the Reisin driver at @uref{http://www.caucho.com/projects/jdbc-mysql/index.xtp} For documentation consult any JDBC documentation and the driver's own diff --git a/bdb/log/log_rec.c b/bdb/log/log_rec.c index a871848295e..ad6d9f7ead2 100644 --- a/bdb/log/log_rec.c +++ b/bdb/log/log_rec.c @@ -50,6 +50,7 @@ static const char revid[] = "$Id: log_rec.c,v 11.48 2001/01/11 18:19:53 bostic E #include "db_am.h" #include "log.h" +static int __log_check_master __P((DB_ENV *, u_int8_t *, char *)); static int __log_do_open __P((DB_ENV *, DB_LOG *, u_int8_t *, char *, DBTYPE, int32_t, db_pgno_t)); static int __log_open_file __P((DB_ENV *, DB_LOG *, __log_register_args *)); @@ -341,6 +342,9 @@ __log_do_open(dbenv, lp, uid, name, ftype, ndx, meta_pgno) * Verify that we are opening the same file that we were * referring to when we wrote this log record. */ + if (meta_pgno != PGNO_BASE_MD && + __log_check_master(dbenv, uid, name) != 0) + goto not_right; if (memcmp(uid, dbp->fileid, DB_FILE_ID_LEN) != 0) { memset(zeroid, 0, DB_FILE_ID_LEN); if (memcmp(dbp->fileid, zeroid, DB_FILE_ID_LEN) != 0) @@ -361,6 +365,28 @@ not_right: return (ENOENT); } +static int +__log_check_master(dbenv, uid, name) + DB_ENV *dbenv; + u_int8_t *uid; + char *name; +{ + DB *dbp; + int ret; + + ret = 0; + if ((ret = db_create(&dbp, dbenv, 0)) != 0) + return (ret); + dbp->type = DB_BTREE; + ret = __db_dbopen(dbp, name, 0, __db_omode("rw----"), PGNO_BASE_MD); + + if (ret == 0 && memcmp(uid, dbp->fileid, DB_FILE_ID_LEN) != 0) + ret = EINVAL; + + (void) dbp->close(dbp, 0); + return (ret); +} + /* * __log_add_logid -- * Adds a DB entry to the log's DB entry table. diff --git a/bdb/patches/log-corruption.patch b/bdb/patches/log-corruption.patch new file mode 100644 index 00000000000..16c37ff7c06 --- /dev/null +++ b/bdb/patches/log-corruption.patch @@ -0,0 +1,62 @@ +# This patch fixes a bug caused mysqld to get a core dump while +# bdb tries to resolve the log file after mysqld was killed with kill -9. +# +# Author: Michael Ubell, Sleepycat Software +# Mon, 26 Feb 2001 12:56:23 -0500 (EST) +# + +*** log/log_rec.c 2001/02/08 03:05:01 11.50 +--- log/log_rec.c 2001/02/24 00:42:46 11.51 +*************** +*** 50,55 **** +--- 50,56 ---- + #include "db_am.h" + #include "log.h" + ++ static int __log_check_master __P((DB_ENV *, u_int8_t *, char *)); + static int __log_do_open __P((DB_ENV *, DB_LOG *, + u_int8_t *, char *, DBTYPE, int32_t, db_pgno_t)); + static int __log_open_file __P((DB_ENV *, DB_LOG *, __log_register_args *)); +*************** +*** 341,346 **** +--- 342,350 ---- + * Verify that we are opening the same file that we were + * referring to when we wrote this log record. + */ ++ if (meta_pgno != PGNO_BASE_MD && ++ __log_check_master(dbenv, uid, name) != 0) ++ goto not_right; + if (memcmp(uid, dbp->fileid, DB_FILE_ID_LEN) != 0) { + memset(zeroid, 0, DB_FILE_ID_LEN); + if (memcmp(dbp->fileid, zeroid, DB_FILE_ID_LEN) != 0) +*************** +*** 359,364 **** +--- 363,390 ---- + (void)__log_add_logid(dbenv, lp, NULL, ndx); + + return (ENOENT); ++ } ++ ++ static int ++ __log_check_master(dbenv, uid, name) ++ DB_ENV *dbenv; ++ u_int8_t *uid; ++ char *name; ++ { ++ DB *dbp; ++ int ret; ++ ++ ret = 0; ++ if ((ret = db_create(&dbp, dbenv, 0)) != 0) ++ return (ret); ++ dbp->type = DB_BTREE; ++ ret = __db_dbopen(dbp, name, 0, __db_omode("rw----"), PGNO_BASE_MD); ++ ++ if (ret == 0 && memcmp(uid, dbp->fileid, DB_FILE_ID_LEN) != 0) ++ ret = EINVAL; ++ ++ (void) dbp->close(dbp, 0); ++ return (ret); + } + + /* diff --git a/innobase/ibuf/Makefile.am b/innobase/ibuf/Makefile.am index 5d2681c553e..1c1d196c40c 100644 --- a/innobase/ibuf/Makefile.am +++ b/innobase/ibuf/Makefile.am @@ -22,3 +22,6 @@ libs_LIBRARIES = libibuf.a libibuf_a_SOURCES = ibuf0ibuf.c EXTRA_PROGRAMS = + +# Don't update the files from bitkeeper +%::SCCS/s.% diff --git a/innobase/include/Makefile.am b/innobase/include/Makefile.am index 9e0cb9f635f..fd5cc8b1a80 100644 --- a/innobase/include/Makefile.am +++ b/innobase/include/Makefile.am @@ -54,3 +54,6 @@ noinst_HEADERS = btr0btr.h btr0btr.ic btr0cur.h btr0cur.ic \ usr0sess.h usr0sess.ic usr0types.h ut0byte.h ut0byte.ic \ ut0dbg.h ut0lst.h ut0mem.h ut0mem.ic ut0rnd.h ut0rnd.ic \ ut0sort.h ut0ut.h ut0ut.ic + +# Don't update the files from bitkeeper +%::SCCS/s.% diff --git a/man/Makefile.am b/man/Makefile.am index 52a69870fb1..186fc01685e 100644 --- a/man/Makefile.am +++ b/man/Makefile.am @@ -22,3 +22,6 @@ man_MANS = mysql.1 isamchk.1 isamlog.1 mysql_zap.1 mysqlaccess.1 \ perror.1 replace.1 safe_mysqld.1 EXTRA_DIST = $(man_MANS) + +# Don't update the files from bitkeeper +%::SCCS/s.% diff --git a/myisam/mi_dbug.c b/myisam/mi_dbug.c index c424d65f7ec..eda1aafecc8 100644 --- a/myisam/mi_dbug.c +++ b/myisam/mi_dbug.c @@ -155,6 +155,7 @@ my_bool check_table_is_closed(const char *name, const char *where) { char filename[FN_REFLEN]; LIST *pos; + DBUG_ENTER("check_table_is_closed"); (void) fn_format(filename,name,"",MI_NAME_IEXT,4+16+32); for (pos=myisam_open_list ; pos ; pos=pos->next) @@ -163,10 +164,14 @@ my_bool check_table_is_closed(const char *name, const char *where) MYISAM_SHARE *share=info->s; if (!strcmp(share->filename,filename)) { - fprintf(stderr,"Warning: Table: %s is open on %s\n", name,where); - return 1; + if (share->last_version) + { + fprintf(stderr,"Warning: Table: %s is open on %s\n", name,where); + DBUG_PRINT("warning",("Table: %s is open on %s", name,where)); + DBUG_RETURN(1); + } } } - return 0; + DBUG_RETURN(0); } #endif /* EXTRA_DEBUG */ diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh index 7ebf054b0d4..075cfd83933 100644 --- a/mysql-test/mysql-test-run.sh +++ b/mysql-test/mysql-test-run.sh @@ -413,6 +413,7 @@ start_slave() --core \ --tmpdir=$MYSQL_TMP_DIR \ --language=english \ + --skip-innobase \ $SMALL_SERVER \ $EXTRA_SLAVE_OPT $EXTRA_SLAVE_MYSQLD_OPT" if [ x$DO_DDD = x1 ] diff --git a/mysql-test/r/null_key.result b/mysql-test/r/null_key.result index 6357f0b4682..98c43b20b01 100644 --- a/mysql-test/r/null_key.result +++ b/mysql-test/r/null_key.result @@ -7,7 +7,7 @@ t1 ref a,b a 9 const,const 1 where used; Using index table type possible_keys key key_len ref rows Extra t1 const a,b a 9 const,const 1 table type possible_keys key key_len ref rows Extra -t1 index NULL a 8 NULL 12 where used; Using index +t1 index NULL a 9 NULL 12 where used; Using index table type possible_keys key key_len ref rows Extra t1 range a,b a 9 NULL 3 where used; Using index table type possible_keys key key_len ref rows Extra diff --git a/sql/ha_innobase.cc b/sql/ha_innobase.cc index 372b4df09b7..b1008737ca4 100644 --- a/sql/ha_innobase.cc +++ b/sql/ha_innobase.cc @@ -499,6 +499,7 @@ innobase_end(void) DBUG_ENTER("innobase_end"); err = innobase_shutdown_for_mysql(); + hash_free(&innobase_open_tables); if (err != DB_SUCCESS) { @@ -1214,7 +1215,7 @@ ha_innobase::write_row( row_prebuilt_t* prebuilt = (row_prebuilt_t*)innobase_prebuilt; int error; - DBUG_ENTER("write_row"); + DBUG_ENTER("ha_innobase::write_row"); statistic_increment(ha_write_count, &LOCK_status); @@ -1432,7 +1433,7 @@ ha_innobase::update_row( upd_t* uvect; int error = 0; - DBUG_ENTER("update_row"); + DBUG_ENTER("ha_innobase::update_row"); if (prebuilt->upd_node) { uvect = prebuilt->upd_node->update; @@ -1476,7 +1477,7 @@ ha_innobase::delete_row( row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt; int error = 0; - DBUG_ENTER("update_row"); + DBUG_ENTER("ha_innobase::delete_row"); if (!prebuilt->upd_node) { row_get_prebuilt_update_vector(prebuilt); diff --git a/sql/log.cc b/sql/log.cc index 1ff86ed4b67..2d3a8bd062b 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -583,7 +583,7 @@ bool MYSQL_LOG::write(THD *thd,enum enum_server_command command, } else if (my_b_write(&log_file, (byte*) "\t\t",2) < 0) error=errno; - sprintf(buff,"%7ld %-10.10s", id,command_name[(uint) command]); + sprintf(buff,"%7ld %-11.11s", id,command_name[(uint) command]); if (my_b_write(&log_file, (byte*) buff,strlen(buff))) error=errno; if (format) diff --git a/sql/sql_table.cc b/sql/sql_table.cc index ce054353cc5..4d6a2e79fc3 100644 --- a/sql/sql_table.cc +++ b/sql/sql_table.cc @@ -747,6 +747,7 @@ bool close_cached_table(THD *thd,TABLE *table) DBUG_ENTER("close_cached_table"); if (table) { + DBUG_PRINT("enter",("table: %s", table->table_name)); VOID(table->file->extra(HA_EXTRA_FORCE_REOPEN)); // Close all data files /* Mark all tables that are in use as 'old' */ mysql_lock_abort(thd,table); // end threads waiting on lock @@ -1139,9 +1140,9 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, old_db_type=table->db_type; if (create_info->db_type == DB_TYPE_DEFAULT) create_info->db_type=old_db_type; + new_db_type=create_info->db_type= ha_checktype(create_info->db_type); if (create_info->row_type == ROW_TYPE_DEFAULT) create_info->row_type=table->row_type; - new_db_type=create_info->db_type; /* Check if the user only wants to do a simple RENAME */ @@ -1518,6 +1519,8 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, goto err; } table=0; // Marker for win32 version +#else + table->file->extra(HA_EXTRA_FORCE_REOPEN); // Don't use this file anymore #endif error=0; |