mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
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
This commit is contained in:
@ -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
|
||||
|
@ -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.
|
||||
|
62
bdb/patches/log-corruption.patch
Normal file
62
bdb/patches/log-corruption.patch
Normal file
@ -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);
|
||||
}
|
||||
|
||||
/*
|
@ -22,3 +22,6 @@ libs_LIBRARIES = libibuf.a
|
||||
libibuf_a_SOURCES = ibuf0ibuf.c
|
||||
|
||||
EXTRA_PROGRAMS =
|
||||
|
||||
# Don't update the files from bitkeeper
|
||||
%::SCCS/s.%
|
||||
|
@ -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.%
|
||||
|
@ -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.%
|
||||
|
@ -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 */
|
||||
|
@ -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 ]
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
Reference in New Issue
Block a user