summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <monty@tik.mysql.com>2000-11-13 23:55:10 +0200
committerunknown <monty@tik.mysql.com>2000-11-13 23:55:10 +0200
commitf3d2341f1f30384d92b285c1e421d8c599ee2b79 (patch)
tree6689cb755cdb6ba0fb4cc6fbb215d75b175228d2
parent675d31ee9a14d636d838400c670d0a1c2b964c9a (diff)
downloadmariadb-git-f3d2341f1f30384d92b285c1e421d8c599ee2b79.tar.gz
Bug fixes, TRUNCATE, safer passwords on command line and connect timeout
Docs/manual.texi: Update of safe_mysqld, TRUNCATE and changes for 3.23.28 client/mysql.cc: Added --timeout client/mysqladmin.c: Safer password handling client/mysqldump.c: Safer password handling client/mysqlimport.c: Safer password handling client/mysqlshow.c: Safer password handling configure.in: Fixes for Darwin and added test of poll include/my_pthread.h: Fixes for darwin include/violite.h: Added test for polling libmysql/libmysql.c: connect timeout libmysql/violite.c: connect timeout mysys/hash.c: Fix when delting from empty table scripts/safe_mysqld.sh: Added --open-files, --core-file-size and --timezone sql-bench/bench-init.pl.sh: Function print_time sql-bench/crash-me.sh: Added test of truncate sql-bench/test-insert.sh: More "estimated" tests sql-bench/test-select.sh: More "estimated" tests sql/filesort.cc: Removed allocation of extra memory sql/ha_berkeley.cc: Better estimation of number of rows sql/item_create.cc: Truncate sql/item_create.h: Truncate sql/item_strfunc.cc: Removed usage of MY_FAE sql/lex.h: Truncate sql/lock.cc: Fixed possible loop bug sql/log.cc: Removed usage of FILE:s sql/mysqld.cc: Print of more server variables sql/sql_class.h: Changed FILE -> File sql/sql_insert.cc: Fixed bug in temptable handling sql/sql_lex.h: Cleanup sql/sql_load.cc: Removed usage of MY_FAE sql/sql_parse.cc: Cleanup + TRUNCATE sql/sql_select.cc: Cleanup + fix for INSERT ... SELECT sql/sql_yacc.yy: TRUNCATE sql/violite.c: Merge with client/violite.c strings/strstr-sparc.s: Fixed wrong register usage
-rw-r--r--Docs/manual.texi624
-rw-r--r--client/mysql.cc14
-rw-r--r--client/mysqladmin.c20
-rw-r--r--client/mysqldump.c19
-rw-r--r--client/mysqlimport.c17
-rw-r--r--client/mysqlshow.c22
-rw-r--r--configure.in8
-rw-r--r--include/my_pthread.h3
-rw-r--r--include/violite.h3
-rw-r--r--libmysql/libmysql.c36
-rw-r--r--libmysql/violite.c33
-rw-r--r--mysys/hash.c3
-rw-r--r--scripts/safe_mysqld.sh15
-rwxr-xr-xsql-bench/bench-init.pl.sh9
-rwxr-xr-xsql-bench/crash-me.sh7
-rwxr-xr-xsql-bench/test-insert.sh8
-rwxr-xr-xsql-bench/test-select.sh65
-rw-r--r--sql/filesort.cc15
-rw-r--r--sql/ha_berkeley.cc6
-rw-r--r--sql/item_create.cc5
-rw-r--r--sql/item_create.h1
-rw-r--r--sql/item_strfunc.cc2
-rw-r--r--sql/lex.h2
-rw-r--r--sql/lock.cc4
-rw-r--r--sql/log.cc127
-rw-r--r--sql/mysqld.cc20
-rw-r--r--sql/sql_class.h2
-rw-r--r--sql/sql_insert.cc8
-rw-r--r--sql/sql_lex.h24
-rw-r--r--sql/sql_load.cc2
-rw-r--r--sql/sql_parse.cc33
-rw-r--r--sql/sql_select.cc11
-rw-r--r--sql/sql_yacc.yy18
-rw-r--r--sql/violite.c46
-rw-r--r--strings/strstr-sparc.s4
35 files changed, 798 insertions, 438 deletions
diff --git a/Docs/manual.texi b/Docs/manual.texi
index f82b6858385..d49fddebc6c 100644
--- a/Docs/manual.texi
+++ b/Docs/manual.texi
@@ -373,6 +373,7 @@ MySQL Language Reference
* ANALYZE TABLE:: @code{ANALYZE TABLE} syntax
* REPAIR TABLE:: @code{REPAIR TABLE} syntax
* DELETE:: @code{DELETE} syntax
+* TRUNCATE::
* SELECT:: @code{SELECT} syntax
* JOIN:: @code{JOIN} syntax
* INSERT:: @code{INSERT} syntax
@@ -591,6 +592,7 @@ Speed of queries that access or update data
MySQL Utilites
* Programs:: What do the executables do?
+* safe_mysqld:: safe_mysqld, the wrapper around mysqld
* mysql:: The command line tool
* mysqladmin:: Administering a @strong{MySQL} server
* mysqldump:: Dumping the structure and data from @strong{MySQL} databases and tables
@@ -813,7 +815,7 @@ MySQL change history
Changes in release 3.23.x (Recommended; beta)
-* News-3.23.28::
+* News-3.23.28:: Changes in release 3.23.28
* News-3.23.27:: Changes in release 3.23.27
* News-3.23.26:: Changes in release 3.23.26
* News-3.23.25:: Changes in release 3.23.25
@@ -2002,6 +2004,8 @@ Hands on tutorial for @strong{MySQL}.
The Mac OS Xclave. Running @strong{MySQL} on Mac OS X
@item @uref{http://www.prnet.de/RegEx/mysql.html}@*
MySQL for Mac OS X Server.
+@item @uref{http://www.latencyzero.com/macosx/mysql.html}@*
+Bulding MySQL for Mac OS X
@item @uref{http://www.lilback.com/macsql/}@*
Client libraries for the Macintosh.
@end itemize
@@ -4895,6 +4899,8 @@ You can start the @strong{MySQL} server with the following command:
shell> bin/safe_mysqld --user=mysql &
@end example
+@xref{safe_mysqld}.
+
@xref{Post-installation}.
@cindex RPM file
@@ -6605,7 +6611,7 @@ table. @xref{Crashing}.
To get a core dump on Linux if mysqld dies with a SIGSEGV
signal, you can start mysqld with the @code{--core-file} option. Note
that you also probably need to raise the @code{core file size} by adding
-@code{ulimit -c 1000000} to @code{safe_mysqld}.
+@code{ulimit -c 1000000} to @code{safe_mysqld}. @xref{safe_mysqld}.
If you are using LinuxThreads and @code{mysqladmin shutdown} doesn't work,
you must upgrade to LinuxThreads Version 0.7.1 or newer.
@@ -6967,6 +6973,7 @@ shell> nohup mysqld [options] &
@code{nohup} causes the command following it to ignore any @code{SIGHUP}
signal sent from the terminal. Alternatively, start the server by running
@code{safe_mysqld}, which invokes @code{mysqld} using @code{nohup} for you.
+@xref{safe_mysqld}.
If you get a problem when compiling mysys/get_opt.c, just remove the
line #define _NO_PROTO from the start of that file!
@@ -7221,7 +7228,7 @@ FreeBSD is also known to have a very low default file handle limit.
safe_mysqld or raise the limits for the mysqld user in /etc/login.conf
(and rebuild it witg cap_mkdb /etc/login.conf.) Also be sure you set the
appropriate class for this user in the password file if you are not
-using the default (use: chpass mysqld-user-name)
+using the default (use: chpass mysqld-user-name). @xref{safe_mysqld}.
If you get problems with the current date in @strong{MySQL}, setting the
@code{TZ} variable will probably help. @xref{Environment variables}.
@@ -7308,7 +7315,7 @@ You can change the directory locations if you wish, or just use the
defaults by not specifying any locations.
If you have problems with performance under heavy load, try using the
-@code{--skip-thread-priority} option to @code{safe_mysqld}! This will run
+@code{--skip-thread-priority} option to @code{mysqld}! This will run
all threads with the same priority; on BSDI Version 3.1, this gives better
performance (at least until BSDI fixes their thread scheduler).
@@ -8466,6 +8473,7 @@ mysqld: Can't find file: 'host.frm'
The above may also happen with a binary @strong{MySQL} distribution if you
don't start @strong{MySQL} by executing exactly @code{./bin/safe_mysqld}!
+@xref{safe_mysqld}.
You might need to run @code{mysql_install_db} as @code{root}. However,
if you prefer, you can run the @strong{MySQL} server as an unprivileged
@@ -8779,7 +8787,7 @@ system startup and shutdown, and is described more fully in
@ref{Automatic start}.
@item
By invoking @code{safe_mysqld}, which tries to determine the proper options
-for @code{mysqld} and then runs it with those options.
+for @code{mysqld} and then runs it with those options. @xref{safe_mysqld}.
@item
On NT you should install @code{mysqld} as a service as follows:
@example
@@ -8875,47 +8883,6 @@ the command @code{telnet your-host-name tcp-ip-port-number} and press
something is using the TCP/IP port @code{mysqld} is trying to use.
See @ref{mysql_install_db} and @ref{Multiple servers}.
-The @code{safe_mysqld} script is written so that it normally is able to start
-a server that was installed from either a source or a binary version of
-@strong{MySQL}, even if these install the server in slightly different
-locations. @code{safe_mysqld} expects one of these conditions to be true:
-
-@itemize @bullet
-@item
-The server and databases can be found relative to the directory from which
-@code{safe_mysqld} is invoked. @code{safe_mysqld} looks under its working
-directory for @file{bin} and @file{data} directories (for binary
-distributions) or for @file{libexec} and @file{var} directories (for source
-distributions). This condition should be met if you execute
-@code{safe_mysqld} from your @strong{MySQL} installation directory (for
-example, @file{/usr/local/mysql} for a binary distribution).
-
-@item
-If the server and databases cannot be found relative to the working directory,
-@code{safe_mysqld} attempts to locate them by absolute pathnames. Typical
-locations are @file{/usr/local/libexec} and @file{/usr/local/var}.
-The actual locations are determined when the distribution was built from which
-@code{safe_mysqld} comes. They should be correct if
-@strong{MySQL} was installed in a standard location.
-@end itemize
-
-Because @code{safe_mysqld} will try to find the server and databases relative
-to its own working directory, you can install a binary distribution of
-@strong{MySQL} anywhere, as long as you start @code{safe_mysqld} from the
-@strong{MySQL} installation directory:
-
-@example
-shell> cd mysql_installation_directory
-shell> bin/safe_mysqld &
-@end example
-
-If @code{safe_mysqld} fails, even when invoked from the @strong{MySQL}
-installation directory, you can modify it to use the path to @code{mysqld}
-and the pathname options that are correct for your system. Note that if you
-upgrade @strong{MySQL} in the future, your modified version of
-@code{safe_mysqld} will be overwritten, so you should make a copy of your
-edited version that you can reinstall.
-
If @code{mysqld} is currently running, you can find out what path settings
it is using by executing this command:
@@ -9015,7 +8982,7 @@ The @code{mysql.server} script uses the following variables:
@findex command-line options
@cindex options, command-line
@node Command-line options, Option files, Automatic start, Post-installation
-@subsection Command-line Options
+@subsection mysqld command-line options
@code{mysqld} accepts the following command-line options:
@@ -10059,6 +10026,7 @@ The following will not yet work in @strong{MySQL}:
@example
SELECT * FROM table1 WHERE id IN (SELECT id FROM table2);
SELECT * FROM table1 WHERE id NOT IN (SELECT id FROM table2);
+SELECT * FROM table1 WHERE NOT EXISTS (SELECT id FROM table2 where table1.id=table2.id);
@end example
However, in many cases you can rewrite the query without a sub-select:
@@ -10338,6 +10306,11 @@ unless you do so in a very specific order.
It's very easy to do ``allowed'' circular definitions that make the
tables impossible to re-create each table with a single create statement,
even if the definition works and is usable.
+
+@item
+It's very easy to overlook @code{FOREIGN KEY ... ON DELETE} rules when
+one codes an application. It's not unusual that one loses a lot of
+important information just because a wrong or misused @code{ON DELETE} rule.
@end itemize
The only nice aspect of @code{FOREIGN KEY} is that it gives ODBC and some
@@ -12562,6 +12535,7 @@ to restart @code{mysqld} with @code{--skip-grant-tables} to run
* ANALYZE TABLE:: @code{ANALYZE TABLE} syntax
* REPAIR TABLE:: @code{REPAIR TABLE} syntax
* DELETE:: @code{DELETE} syntax
+* TRUNCATE::
* SELECT:: @code{SELECT} syntax
* JOIN:: @code{JOIN} syntax
* INSERT:: @code{INSERT} syntax
@@ -15173,6 +15147,9 @@ mysql> select BINARY "a" = "A";
@end example
@code{BINARY} was introduced in @strong{MySQL} 3.23.0.
+
+Note that in some context @strong{MySQL} will not be able to use the
+index efficiently when you cast an indexed column to @code{BINARY}.
@end table
@findex control flow functions
@@ -17648,6 +17625,8 @@ alter_specification:
or ADD PRIMARY KEY (index_col_name,...)
or ADD UNIQUE [index_name] (index_col_name,...)
or ADD FULLTEXT [index_name] (index_col_name,...)
+ or ADD [CONSTRAINT symbol] FOREIGN KEY index_name (index_col_name,...)
+ [reference_definition]
or ALTER [COLUMN] col_name @{SET DEFAULT literal | DROP DEFAULT@}
or CHANGE [COLUMN] old_col_name create_definition
or MODIFY [COLUMN] create_definition
@@ -17707,6 +17686,9 @@ INDEX} are @strong{MySQL} extensions to ANSI SQL92.
@code{MODIFY} is an Oracle extension to @code{ALTER TABLE}.
@item
+@code{TRUNCATE} is an Oracle extension. @xref{TRUNCATE}.
+
+@item
The optional word @code{COLUMN} is a pure noise word and can be omitted.
@item
@@ -18054,7 +18036,6 @@ as they are being backed up. If you want to backup several tables as
a snapshot, you must first issue @code{LOCK TABLES} obtaining a read
lock for each table in the group.
-
The command returns a table with the following columns:
@multitable @columnfractions .35 .65
@@ -18065,6 +18046,8 @@ The command returns a table with the following columns:
@item Msg_text @tab The message.
@end multitable
+Note that @code{BACKUP TABLE} is only available in @strong{MySQL}
+version 3.23.25 and later.
@findex RESTORE TABLE
@node RESTORE TABLE, ANALYZE TABLE, BACKUP TABLE, Reference
@@ -18163,7 +18146,7 @@ better than sorting on fixed length keys if you have long @code{char()}
keys that compress very good.
@findex DELETE
-@node DELETE, SELECT, REPAIR TABLE, Reference
+@node DELETE, TRUNCATE, REPAIR TABLE, Reference
@section @code{DELETE} syntax
@example
@@ -18175,14 +18158,10 @@ DELETE [LOW_PRIORITY] FROM tbl_name
given by @code{where_definition}, and returns the number of records deleted.
If you issue a @code{DELETE} with no @code{WHERE} clause, all rows are
-deleted. If you do this in @code{AUTOCOMMIT} mode, @strong{MySQL} does
-this by recreating the table as an empty table, which is much faster
-than deleting each row. In this case, @code{DELETE} returns zero as the
-number of affected records. (@strong{MySQL} can't return the number of
-rows that were actually deleted, because the recreate is done without
-opening the data files. As long as the table definition file
-@file{tbl_name.frm} is valid, the table can be recreated this way, even
-if the data or index files have become corrupted.).
+deleted. If you do this in @code{AUTOCOMMIT} mode, this works as
+@code{TRUNCATE}. @xref{TRUNCATE}. One problem with this is that
+@code{DELETE} will return zero as the number of affected records, but
+this will be fixed in 4.0.
If you really want to know how many records are deleted when you are deleting
all rows, and are willing to suffer a speed penalty, you can use a
@@ -18213,8 +18192,34 @@ returned to the client. This can be used to ensure that a specific
the @code{DELETE} command until the number of affected rows is less than
the @code{LIMIT} value.
+@findex TRUNCATE
+@node TRUNCATE, SELECT, DELETE, Reference
+@section @code{TRUNCATE} syntax
+
+@example
+TRUNCATE TABLE table_name
+@end example
+
+Is in 3.23 and the same thing as @code{DELETE FROM table_name}. @xref{DELETE}.
+The differences are:
+
+@table @bullet
+@item
+Implemented as a drop and recreate of the table, which makes this
+much faster when deleting many rows.
+@item
+Not transaction safe; @code{TRUNCATE} will automaticly end the current
+transaction as if @code{COMMIT} would have been called.
+@item
+Doesn't return the number of deleted rows.
+@item
+As long as the table definition file @file{table_name.frm} is
+valid, the table can be recreated this way, even if the data or index
+files have become corrupted..
+@end table
+
@findex SELECT
-@node SELECT, JOIN, DELETE, Reference
+@node SELECT, JOIN, TRUNCATE, Reference
@section @code{SELECT} syntax
@c help SELECT
@@ -18856,6 +18861,9 @@ record in the table has the same value as a new record on a unique index,
the old record is deleted before the new record is inserted.
@xref{INSERT, , @code{INSERT}}.
+In other words, you can't access the values of the old row from a
+@code{REPLACE} statement.
+
@findex LOAD DATA INFILE
@node LOAD DATA, UPDATE, REPLACE, Reference
@section @code{LOAD DATA INFILE} syntax
@@ -19858,11 +19866,17 @@ call should have more details. Check your OS documentation for the
maximum value for this variable. Attempting to set @code{back_log}
higher than your operating system limit will be ineffective.
+@item @code{basedir}
+The value of the @code{--basedir} option.
+
@item @code{bdb_cache_size}
The buffer that is allocated to cache index and rows for @code{BDB} tables.
If you don't use @code{BDB} tables, you should set this to 0 or
start @code{mysqld} with @code{--skip-bdb} o not waste memory for this cache.
+@item @code{bdb_home}
+The value of the @code{--bdb-home} option.
+
@item @code{bdb_lock_max}
The maximum number of locks (1000 by default) you can have active on a BDB
table. You should increase this if you get errors of type
@@ -19870,6 +19884,18 @@ table. You should increase this if you get errors of type
transactions or when mysqld has to examine a lot of rows to calculate
the query.
+@item @code{bdb_logdir}
+The value of the @code{--bdb-logdir} option.
+
+@item @code{bdb_tmpdir}
+The value of the @code{--bdb-tmpdir} option.
+
+@item @code{character_set}
+The default character set.
+
+@item @code{character_sets}
+The supported character sets.
+
@item @code{concurrent_inserts}
If @code{ON} (the default), @strong{MySQL} will allow you to use @code{INSERT}
on @code{MyISAM} tables at the same time as you run @code{SELECT} queries
@@ -19880,14 +19906,8 @@ or @code{--skip-new}.
The number of seconds the @code{mysqld} server is waiting for a connect
packet before responding with @code{Bad handshake}.
-@item @code{delayed_insert_timeout}
-How long a @code{INSERT DELAYED} thread should wait for @code{INSERT}
-statements before terminating.
-
-@item @code{delayed_insert_limit}
-After inserting @code{delayed_insert_limit} rows, the @code{INSERT
-DELAYED} handler will check if there are any @code{SELECT} statements
-pending. If so, it allows these to execute before continuing.
+@item @code{datadir}
+The value of the @code{--datadir} option.
@item @code{delay_key_write}
If enabled (is on by default), @strong{MySQL} will honor the
@@ -19901,14 +19921,22 @@ option this means that all tables will be treated as if they were
created with the @code{delay_key_write} option. You can clear this flag
by starting @code{mysqld} with @code{--skip-new} or @code{--safe-mode}.
+@item @code{delayed_insert_limit}
+After inserting @code{delayed_insert_limit} rows, the @code{INSERT
+DELAYED} handler will check if there are any @code{SELECT} statements
+pending. If so, it allows these to execute before continuing.
+
+@item @code{delayed_insert_timeout}
+How long a @code{INSERT DELAYED} thread should wait for @code{INSERT}
+statements before terminating.
+
@item @code{delayed_queue_size}
What size queue (in rows) should be allocated for handling @code{INSERT
DELAYED}. If the queue becomes full, any client that does @code{INSERT
DELAYED} will wait until there is room in the queue again.
@item @code{flush}
-This is @code{ON} if you have started @strong{MySQL} with the @code{--flush}
-option.
+This is @code{ON} if you started @code{mysqld} with @code{--flush}.
@item @code{flush_time}
If this is set to a non-zero value, then every @code{flush_time} seconds all
@@ -19961,14 +19989,35 @@ using @code{delay_key_write}. @xref{SHOW}.
To get even more speed when writing many rows at the same time use
@code{LOCK TABLES}. @xref{LOCK TABLES, , @code{LOCK TABLES}}.
-@item @code{lower_case_table_names}
-Change all table names to lower case on disk.
+@item @code{language}
+The language used for error messages.
+
+@item @code{large_file_support}
+If @code{mysqld} was compiled with options for big file support.
+
+@item @code{locked_in_memory}
+If @code{mysqld} was locked in memory with @code{--memlock}
+
+@item @code{log}
+If logging of all queries is enabled.
+
+@item @code{log_update}
+If the update log is enabled.
+
+@item @code{log_bin}
+If the binary log is enabled.
+
+@item @code{log_slave_updates}
+If the updates from the slave should be logged.
@item @code{long_query_time}
If a query takes longer than this (in seconds), the @code{Slow_queries} counter
will be incremented. If you are using @code{--log-slow-queries}, the query
will be logged to the slow query logfile. @xref{Slow query log}.
+@item @code{lower_case_table_names}
+Table names are stored in lower case on disk.
+
@item @code{max_allowed_packet}
The maximum size of one packet. The message buffer is initialized to
@code{net_buffer_length} bytes, but can grow up to @code{max_allowed_packet}
@@ -19993,15 +20042,15 @@ statements. If you try to insert data into a new table after all @code{INSERT
DELAYED} threads are in use, the row will be inserted as if the
@code{DELAYED} attribute wasn't specified.
+@item @code{max_heap_table_size}
+Don't allow creation of heap tables bigger than this.
+
@item @code{max_join_size}
Joins that are probably going to read more than @code{max_join_size}
records return an error. Set this value if your users tend to perform joins
without a @code{WHERE} clause that take a long time and return
millions of rows.
-@item @code{max_heap_table_size}
-Don't allow creation of heap tables bigger than this.
-
@item @code{max_sort_length}
The number of bytes to use when sorting @code{BLOB} or @code{TEXT}
values (only the first @code{max_sort_length} bytes of each value
@@ -20014,6 +20063,9 @@ Maximum number of temporary tables a client can keep open at the same time.
@item @code{max_write_lock_count}
After this many write locks, allow some read locks to run in between.
+@item @code{myisam_recover_options}
+The value of the @code{--myisam-recover} option.
+
@item @code{myisam_sort_buffer_size}
The buffer that is allocated when sorting the index when doing a
@code{REPAIR} or when creating indexes with @code{CREATE INDEX} or
@@ -20026,20 +20078,29 @@ can set it to the expected size of a query. (That is, the expected length of
SQL statements sent by clients. If statements exceed this length, the buffer
is automatically enlarged, up to @code{max_allowed_packet} bytes.)
-@item @code{net_retry_count}
-If a read on a communication port is interrupted, retry this many times
-before giving up. This value should be quite high on @code{FreeBSD} as
-internal interrupts is sent to all threads.
-
@item @code{net_read_timeout}
Number of seconds to wait for more data from a connection before aborting
the read. Note that when we don't expect data from a connection, the timeout
is defined by @code{write_timeout}.
+@item @code{net_retry_count}
+If a read on a communication port is interrupted, retry this many times
+before giving up. This value should be quite high on @code{FreeBSD} as
+internal interrupts is sent to all threads.
+
@item @code{net_write_timeout}
Number of seconds to wait for a block to be written to a connection before
aborting the write.
+@item @code{pid_file}
+The value of the @code{--pid-file} option.
+
+@item @code{port}
+The value of the @code{--port} option.
+
+@item @code{protocol_version}
+The protocol version used by the @code{MySQL} server.
+
@item @code{record_buffer}
Each thread that does a sequential scan allocates a buffer of this
size for each table it scans. If you do many sequential scans, you may
@@ -20049,6 +20110,15 @@ want to increase this value.
The initial allocation of the query buffer. If most of your queries are
long (like when inserting blobs), you should increase this!
+@item @code{server_id}
+The value of the @code{--server-id} option.
+
+@item @code{skip_locking}
+Is OFF if @code{mysqld} uses external locking.
+
+@item @code{skip_networking}
+Is ON if we only allow local (socket) connections.
+
@item @code{skip_show_databases}
This prevents people from doing @code{SHOW DATABASES}, if they don't
have the @code{PROCESS_PRIV} privilege. This can improve security if
@@ -20059,6 +20129,9 @@ tables other users have.
If the creating of the thread longer than this (in seconds), the
@code{Slow_launch_threads} counter will be incremented.
+@item @code{socket}
+The unix socket used by the server.
+
@item @code{sort_buffer}
Each thread that needs to do a sort allocates a buffer of this
size. Increase this value for faster @code{ORDER BY} or @code{GROUP BY}
@@ -20082,6 +20155,9 @@ connections, fail to perform queries, and be very unreliable.
For information about how the table cache works, see @ref{Table cache}.
+@item @code{table_type}
+The default table type
+
@item @code{thread_cache_size}
How many threads we should keep keep in a cache for reuse. When a
client disconnects the clients threads is put in the cache if there
@@ -20103,12 +20179,21 @@ The stack size for each thread. Many of the limits detected by the
@code{crash-me} test are dependent on this value. The default is
large enough for normal operation. @xref{Benchmarks}.
+@item @code{timezone}
+The timezone for the server.
+
@item @code{tmp_table_size}
If an in-memory temporary table exceeds this size, @strong{MySQL}
will automatically convert it to an on-disk @code{MyISAM} table.
Increase the value of @code{tmp_table_size} if you do many advanced
@code{GROUP BY} queries and you have lots of memory.
+@item @code{tmpdir}
+The directory used for temporary files and temporary tables.
+
+@item @code{version}
+The version number for the server.
+
@item @code{wait_timeout}
The number of seconds the server waits for activity on a connection before
closing it. See also @code{interactive_timeout}.
@@ -21941,8 +22026,8 @@ reused when you insert new data into the table.
You need enough extra memory for all HEAP tables that you want to use at
the same time.
@item
-To free memory, you should execute @code{DELETE FROM heap_table} or
-@code{DROP TABLE heap_table}.
+To free memory, you should execute @code{DELETE FROM heap_table},
+@code{TRUNCATE TABLE heap_table} or @code{DROP TABLE heap_table}.
@item
@strong{MySQL} cannot find out how approximately many rows there
are between two values (this is used by the range optimizer to decide which
@@ -24917,140 +25002,122 @@ databases should not be logged to the binary log with @code{binlog-ignore-db}
@item
Starting in 3.23.26, you can use @code{replicate-rewrite-db} to tell
the slave to apply updates from one database on the master to the one
-with a different name on the slave
+with a different name on the slave.
@end itemize
@node Replication Options, Replication SQL, Replication Features, Replication
@section Replication Options in my.cnf
-The table below explains the replications options in @code{my.cnf} . All
-of the are available starting in 3.23.15 unless indicated otherwise.
+If you are using replication, we recommend you to use MySQL 3.23.27 or
+later.
+
+On both master and slave you need to use the @code{server-id} option.
+This sets an unique replication id. You should pick a unique value in the
+range between 1 to 2^32-1 for each master and slave.
+Example: @code{server-id=3}
+
+The following table has the options you can use for the @strong{MASTER}:
@multitable @columnfractions .3 .7
@item @strong{Option} @tab @strong{Description}
-@item
-@code{log-bin}
- @tab Should be set on the master. Tells it to keep a binary update log.
-If a parameter is specified, the log will be written to the specified
-location. Note that if you give it a parameter with an extention
-(eg. @code{log-bin=/mysql/logs/replication.log} ) versions up to
-3.23.24 will not work right during replication if you do
-@code{FLUSH LOGS} . The problem is fixed
-in 3.23.25. If you are using this kind of log name, @code{FLUSH LOGS}
-will be ignored on binlog. To clear the log, run @code{FLUSH MASTER},
-and do not forget to run @code{FLUSH SLAVE} on all slaves. In 3.23.26
-and later versions you should use @code{RESET MASTER} and @code{RESET
-SLAVE}
-
-@item
-@code{log-bin-index}
- @tab Because the user could issue @code{FLUSH LOGS} command, we need to
+@item @code{log-bin=filename} @tab
+Write to a binary update log to the specified location. Note that if you
+give it a parameter with an extension
+(eg. @code{log-bin=/mysql/logs/replication.log} ) versions up to 3.23.24
+will not work right during replication if you do @code{FLUSH LOGS} . The
+problem is fixed in 3.23.25. If you are using this kind of log name,
+@code{FLUSH LOGS} will be ignored on binlog. To clear the log, run
+@code{FLUSH MASTER}, and do not forget to run @code{FLUSH SLAVE} on all
+slaves. In 3.23.26 and later versions you should use @code{RESET MASTER}
+and @code{RESET SLAVE}
+
+@item @code{log-bin-index=filename} @tab
+Because the user could issue @code{FLUSH LOGS} command, we need to
know which log is currently active and which ones have been rotated out
and it what sequence. This info is stored in the binary log index file.
-The default is `hostname`.index . You can use this option
-if you want to be a rebel.
-(Set on @strong{Master}, Example: @code{log-bin-index=db.index})
+The default is `hostname`.index . You can use this option if you want to
+be a rebel. (Example: @code{log-bin-index=db.index})
-@item
-@code{master-host}
- @tab Master hostname or IP address for replication. If not set, the slave
-thread will not be started.
-(Set on @strong{Slave}, Example: @code{master-host=db-master.mycompany.com})
+@item @code{sql-bin-update-same} @tab
+If set, setting @code{SQL_LOG_BIN} to a value will automatically set
+@code{SQL_LOG_UPDATE} to the same value and vice versa.
-@item
-@code{master-user}
- @tab The user the slave thread will authenticate as when connecting to
-the master. The user must have @code{FILE} privilige. If the master user
-is not set, user @code{test} is assumed.
-(Set on @strong{Slave}, Example: @code{master-user=scott})
+@item @code{binlog-do-db=database_name} @tab
+Tells the master it should log updates for the specified database, and
+exclude all others not explicitly mentioned.
+(Example: @code{binlog-do-db=some_database})
-@item
-@code{master-password}
- @tab The password the slave thread will authenticate with when connecting
-to the master. If not set, empty password is assumed
-(Set on @strong{Slave}, Example: @code{master-password=tiger})
+@item @code{binlog-ignore-db=database_name} @tab
+Tells the master that updates to the given database should not be logged
+to the binary log (Example: @code{binlog-ignore-db=some_database})
+@end multitable
-@item
-@code{master-port}
- @tab The port the master is listening on. If not set, the compiled setting
-of @code{MYSQL_PORT} is assumed. If you have not tinkered with @code{configure}
-options, this should be 3306.
-(Set on @strong{Slave}, Example: @code{master-port=3306})
+The following table has the options you can use for the @strong{SLAVE}:
-@item
-@code{master-connect-retry}
- @tab The number of seconds the slave thread will sleep before retrying to
-connect to the master in case the master goes down or the connection is lost.
-Default is 60.
-(Set on @strong{Slave}, Example: @code{master-connect-retry=60})
+@multitable @columnfractions .3 .7
-@item
-@code{master-info-file}
- @tab The location of the file that remembers where we left off on the master
+@item @strong{Option} @tab @strong{Description}
+@item @code{master-host=host} @tab
+Master hostname or IP address for replication. If not set, the slave
+thread will not be started.
+(Example: @code{master-host=db-master.mycompany.com})
+
+@item @code{master-user=username} @tab
+The user the slave thread will us for authentication when connecting to
+the master. The user must have @code{FILE} privilege. If the master user
+is not set, user @code{test} is assumed. (Example:
+@code{master-user=scott})
+
+@item @code{master-password=password} @tab
+The password the slave thread will authenticate with when connecting to
+the master. If not set, an empty password is assumed (Example:
+@code{master-password=tiger})
+
+@item @code{master-port=portnumber} @tab
+The port the master is listening on. If not set, the compiled setting of
+@code{MYSQL_PORT} is assumed. If you have not tinkered with
+@code{configure} options, this should be 3306. (Example:
+@code{master-port=3306})
+
+@item @code{master-connect-retry=seconds} @tab
+The number of seconds the slave thread will sleep before retrying to
+connect to the master in case the master goes down or the connection is
+lost. Default is 60. (Example: @code{master-connect-retry=60})
+
+@item @code{master-info-file=filename} @tab
+The location of the file that remembers where we left off on the master
during the replication process. The default is master.info in the data
directory. Sasha: The only reason I see for ever changing the default
-is the desire to be rebelious.
-(Set on @strong{Slave}, Example: @code{master-info-file=master.info})
-
-@item
-@code{replicate-do-db}
- @tab Tells the slave thread to restrict replication to the specified database.
-To specify more than one database, use the directive multiple times, once for
-each database. Note that this will only work if you do not use cross-database
-queries such as @code{UPDATE some_db.some_table SET foo='bar'} while having
-selected a different or no database.
-(Set on @strong{Slave}, Example: @code{replicate-do-db=some_db})
-
-@item
-@code{replicate-ignore-db}
- @tab Tells the slave thread to not replicate to the specified database. To
-specify more than one database to ignore, use the directive multiple times,
-once for each database. You must not use cross database updates for this
-option.
-(Set on @strong{Slave}, Example: @code{replicate-ignore-db=some_db})
-
-@item
-@code{sql-bin-update-same}
- @tab If set, setting @code{SQL_LOG_BIN} to a value will automatically set
-@code{SQL_LOG_UPDATE} to the same value and vice versa.
-(Set on @strong{Master}, Example: @code{sql-bin-update-same})
-
-@item
-@code{log-slave-updates}
- @tab Tells the slave to log the updates from the slave thread to the binary
-log. Off by default. You will need to turn it on if you plan to daisy-chain
-the slaves
-(Set on @strong{Slave}, Example: @code{log-slave-updates})
-
-@item
-@code{binlog-do-db}
- @tab Tells the master it should log updates for the specified database, and
-exclude all others not explicitly mentioned.
-(Set on @strong{Master}, Example: @code{binlog-do-db=some_database})
-
-@item
-@code{binlog-ignore-db}
- @tab Tells the master that updates to the given database should not be logged
-to the binary log
-(Set on @strong{Master}, Example: @code{binlog-ignore-db=some_database})
-
-@item
-@code{replicate-rewrite-db}
- @tab Tells the slave to apply updates to a database with a different
-name than the original ( Set on @strong{Slave}, Example:
+is the desire to be rebelious. (Example:
+@code{master-info-file=master.info})
+
+@item @code{replicate-do-db=database_name} @tab
+Tells the slave thread to restrict replication to the specified database.
+To specify more than one database, use the directive multiple times,
+once for each database. Note that this will only work if you do not use
+cross-database queries such as @code{UPDATE some_db.some_table SET
+foo='bar'} while having selected a different or no database.
+(Example: @code{replicate-do-db=some_db})
+
+@item @code{replicate-ignore-db=database_name} @tab
+Tells the slave thread to not replicate to the specified database. To
+specify more than one database to ignore, use the directive multiple
+times, once for each database. This option will not work if you use cross
+database updates. (Example: @code{replicate-ignore-db=some_db})
+
+@item @code{log-slave-updates} @tab
+Tells the slave to log the updates from the slave thread to the binary
+log. Off by default. You will need to turn it on if you plan to
+daisy-chain the slaves.
+
+@item @code{replicate-rewrite-db=from_name->to_name} @tab
+Updates to a database with a different name than the original (Example:
@code{replicate-rewrite-db=master_db_name->slave_db_name}
-@item
-@code{skip-slave-start}
- @tab Tells the slave server not to start the slave on the startup.
-The user can start it later with @code{SLAVE START}
-
-@item
-@code{server-id}
- @tab Sets the unique replicaiton numeric server id. You should pick one to assign.
-The range is from 1 to 2^32-1. (Set on both @strong{Master} and
-@strong{Slave}. Example: @code{server-id=3})
+@item @code{skip-slave-start} @tab
+Tells the slave server not to start the slave on the startup. The user
+can start it later with @code{SLAVE START}.
@end multitable
@cindex SQL commands, replication
@@ -26071,7 +26138,7 @@ This can be done with the following code:
@example
mysql> LOCK TABLES real_table WRITE, insert_table WRITE;
mysql> insert into real_table select * from insert_table;
-mysql> delete from insert_table;
+mysql> TRUNCATE TABLE insert_table;
mysql> UNLOCK TABLES;
@end example
@@ -26924,13 +26991,13 @@ it is very important to @code{OPTIMIZE TABLE} sometimes.
@node Delete speed, , Update speed, Query Speed
@subsection Speed of @code{DELETE} queries
+If you want to delete all rows in the table, you should use
+@code{TRUNCATE TABLE table_name}. @xref{TRUNCATE}.
+
The time to delete a record is exactly proportional to the number of
indexes. To delete records more quickly, you can increase the size of
the index cache. @xref{Server parameters}.
-It's also much faster to remove all rows than to remove a big part of the
-rows from a table.
-
@cindex optimization, tips
@cindex tips, optimization
@node Tips, Benchmarks, Query Speed, Performance
@@ -26961,7 +27028,7 @@ In some cases it may make sense to introduce a column that is 'hashed'
based on information from other columns. If this column is short and
reasonably unique it may be much faster than a big index on many
columns. In @strong{MySQL} its very easy to use this extra column:
-@code{SELECT * FROM table_name WHERE hash=MP5(concat(col1,col2))
+@code{SELECT * FROM table_name WHERE hash=MD5(concat(col1,col2))
AND col_1='constant' AND col_2='constant'}
@item
For tables that changes a lot you should try to avoid all @code{VARCHAR}
@@ -27399,6 +27466,7 @@ How big a @code{VARCHAR} column can be
@menu
* Programs:: What do the executables do?
+* safe_mysqld::
* mysql:: The command line tool
* mysqladmin:: Administering a @strong{MySQL} server
* mysqldump:: Dumping the structure and data from @strong{MySQL} databases and tables
@@ -27409,7 +27477,7 @@ How big a @code{VARCHAR} column can be
@cindex environment variables
@cindex programs, list of
-@node Programs, mysql, Tools, Tools
+@node Programs, safe_mysqld, Tools, Tools
@section Overview of the different MySQL programs
All @strong{MySQL} clients that communicate with the server using the
@@ -27530,20 +27598,106 @@ swaps @code{a} and @code{b} in the given files:
@example
shell> replace a b b a -- file1 file2 ...
@end example
+@end table
+@cindex tools, safe_mysqld
+@cindex scripts
@cindex @code{safe_mysqld}
+@node safe_mysqld, mysql, Programs, Tools
+@section safe_mysqld, the wrapper around mysqld
+
+@code{safe_mysqld} is the recommended way to start a @code{mysqld}
+daemon on Unix. @code{safe_mysqld} adds some safety features such as
+restarting the server when an error occurs and logging runtime
+information to a log file.
+
+Normally one should never edit the @code{safe_mysqld} script, but
+instead put the options to @code{safe_mysqld} in the
+@code{[safe_mysqld]} section in the @code{my.cnf}
+file. @code{safe_mysqld} will read all options from the @code{[mysqld]}
+and @code{[safe_mysqld]} sections from the option files.
+@xref{Option files}.
+
+Note that all options on the command line to @code{safe_mysqld} are passed
+to @code{mysqld}. If you wants to use any options in @code{safe_mysqld} that
+@code{mysqld} doesn't support, you must specify these in the option file.
+
+Most of the options to @code{safe_mysqld} are the same as the options to
+@code{mysqld}. @xref{Command-line options}.
-@item safe_mysqld
-A script that starts the @code{mysqld} daemon with some safety features, such
-as restarting the server when an error occurs and logging runtime information
-to a log file.
+@code{safe_mysqld} supports the following options:
+
+@table @code
+@item --basedir=path
+@item --core-file-size=#
+@item --defaults-extra-file=path
+@item --defaults-file=path
+@item --open-files=#
+Size of the core file @code{mysqld} should be able to create. Passed to
+@code{ulimit -c}.
+@item --datadir=path
+@item --err-log=path
+@item --ledir=path
+Path to @code{mysqld}
+@item --log=path
+@item --no-defaults
+@item --open-files=#
+Number of files @code{mysqld} should be able to open. Passed to
+@code{ulimit -n}.
+@item --pid-file=path
+@item --port=#
+@item --socket=path
+@item --timezone=#
+Set the timezone (the @code{TZ}) variable to the value of this parameter.
+@item --user=#
@end table
+The @code{safe_mysqld} script is written so that it normally is able to start
+a server that was installed from either a source or a binary version of
+@strong{MySQL}, even if these install the server in slightly different
+locations. @code{safe_mysqld} expects one of these conditions to be true:
+
+@itemize @bullet
+@item
+The server and databases can be found relative to the directory from which
+@code{safe_mysqld} is invoked. @code{safe_mysqld} looks under its working
+directory for @file{bin} and @file{data} directories (for binary
+distributions) or for @file{libexec} and @file{var} directories (for source
+distributions). This condition should be met if you execute
+@code{safe_mysqld} from your @strong{MySQL} installation directory (for
+example, @file{/usr/local/mysql} for a binary distribution).
+
+@item
+If the server and databases cannot be found relative to the working directory,
+@code{safe_mysqld} attempts to locate them by absolute pathnames. Typical
+locations are @file{/usr/local/libexec} and @file{/usr/local/var}.
+The actual locations are determined when the distribution was built from which
+@code{safe_mysqld} comes. They should be correct if
+@strong{MySQL} was installed in a standard location.
+@end itemize
+
+Because @code{safe_mysqld} will try to find the server and databases relative
+to its own working directory, you can install a binary distribution of
+@strong{MySQL} anywhere, as long as you start @code{safe_mysqld} from the
+@strong{MySQL} installation directory:
+
+@example
+shell> cd mysql_installation_directory
+shell> bin/safe_mysqld &
+@end example
+
+If @code{safe_mysqld} fails, even when invoked from the @strong{MySQL}
+installation directory, you can modify it to use the path to @code{mysqld}
+and the pathname options that are correct for your system. Note that if you
+upgrade @strong{MySQL} in the future, your modified version of
+@code{safe_mysqld} will be overwritten, so you should make a copy of your
+edited version that you can reinstall.
+
@cindex command line tool
@cindex tools, command line
@cindex scripts
@cindex @code{mysql}
-@node mysql, mysqladmin, Programs, Tools
+@node mysql, mysqladmin, safe_mysqld, Tools
@section The command line tool
@code{mysql} is a simple SQL shell (with GNU @code{readline} capabilities).
@@ -29553,10 +29707,13 @@ Use the table description file to create new (empty) data and index files:
@example
shell> mysql db_name
mysql> SET AUTOCOMMIT=1;
-mysql> DELETE FROM tbl_name;
+mysql> TRUNCATE TABLE table_name;
mysql> quit
@end example
+If your SQL version doesn't have @code{TRUNCATE}, use @code{DELETE FROM
+table_name} instead.
+
@item
Copy the old data file back onto the newly created data file.
(Don't just move the old file back onto the new file; you want to retain
@@ -32537,7 +32694,7 @@ something like this:
@example
shell> ./configure --with-tcp-port=port_number \
- --with-unix-socket=file_name \
+ --with-unix-socket-path=file_name \
--prefix=/usr/local/mysql-3.22.9
@end example
@@ -34548,7 +34705,9 @@ The specified group in the option file may contain the following options:
@item @code{port} @tab Default port number.
@item @code{return-found-rows} @tab Tell @code{mysql_info()} to return found rows instead of updated rows when using @code{UPDATE}.
@item @code{socket} @tab Default socket number.
-@item @code{timeout} @tab Connect timeout in seconds.
+@item
+@code{timeout} @tab Connect timeout in seconds. On Linux this timeout also
+is used for waiting for the first answer from the server.
@item @code{user} @tab Default user.
@end multitable
@@ -34758,14 +34917,20 @@ client library that uses a different protocol version. This can happen if you
use a very old client library to connect to a new server that wasn't started
with the @code{--old-protocol} option.
-@item CR_NAMEDPIPEOPEN_ERROR;
+@item CR_NAMEDPIPEOPEN_ERROR
Failed to create a named pipe on Windows.
-@item CR_NAMEDPIPEWAIT_ERROR;
+@item CR_NAMEDPIPEWAIT_ERROR
Failed to wait for a named pipe on Windows.
-@item CR_NAMEDPIPESETSTATE_ERROR;
+@item CR_NAMEDPIPESETSTATE_ERROR
Failed to get a pipe handler on Windows.
+
+@item CR_SERVER_LOST
+If @code{timeout} > 0 and it took longer then @code{timeout} seconds to
+connect to the server or if the server died while executing the
+@code{init-command}.
+
@end table
@subsubheading Example
@@ -37381,6 +37546,10 @@ Fernandez Herrero.
@itemize @bullet
@item Graphical clients
@itemize @bullet
+@item @uref{http://www.ideit.com/products/dbvis: DbVisualizer}
+Freeware JDBC client to graphically visualize the data and structure
+of several databases simultaneously. By Innovative-IT Development AB.
+
@item @uref{http://www.mysql.com/download_clients.html, mysqlgui homepage}
The @strong{MySQL} GUI client homepage. By Sinisa at MySQL AB.
@item @uref{http://www.mysql.com/Downloads/Contrib/kmysqladmin-0.4.1.tar.gz, kmysqladmin-0.4.1.tar.gz}
@@ -37801,6 +37970,13 @@ Prints the storage usage of a @strong{MySQL} database.
sprintf() function for SQL queries that can escape blobs. By Chunhua Liu.
@end itemize
+@appendixsec Windows programs
+@itemize @bullet
+@item @uref{http://www.mysql.com/Downloads/Contrib/LaunchMySQL.zip, LaunchMySQL.zip}
+The program launches the @strong{MySQL} server, shuts it down, and
+display status information. By Bill Thompson
+@end itemize
+
@appendixsec Uncategorized
@itemize @bullet
@@ -38191,9 +38367,31 @@ though, so 3.23 is not released as a stable version yet.
@appendixsubsec Changes in release 3.23.28
@itemize @bullet
@item
+Added options @code{--open-files} and @code{--timezone} to @code{safe_mysqld}.
+@item
+Fixed fatal bug in @code{CREATE TEMPORARY TABLE ...SELECT ...}.
+@item
+Fixed problem with @code{CREATE TABLE .. SELECT NULL}.
+@item
+Added status variables @code{large_file_support},@code{net_read_timeout},
+@code{net_write_timeout} and @code{query_buffer_size} to @code{SHOW VARIABLES}.
+@item
+Fixed bug where we didn't allow an index name after the
+@code{FOREIGN KEY} definition.
+@item
+Added @code{TRUNCATE TABLE table_name} as a synonym for
+@code{DELETE FROM table_name}.
+@item
Fixed bug in a BDB key compare function when comparing part keys.
@item
Added variable @code{bdb_lock_max} to @code{mysqld}.
+@item
+Added more tests to the benchmark suite.
+@item
+Fixed a overflow bug in the client code when using too long database names.
+@item
+@code{mysql_connect()} now aborts on Linux if the server doesn't answer in
+@code{timeout} seconds.
@end itemize
@node News-3.23.27, News-3.23.26, News-3.23.28, News-3.23.x
@@ -42601,6 +42799,8 @@ Allow users to change startup options.
@item
Subqueries. @code{select id from t where grp in (select grp from g where u > 100)}
@item
+Don't allow more than # threads to run MyISAM recover at the same time.
+@item
@code{INSERT SQL_CONCURRENT ...}; This will force the insert to happen at the
end of the data file if the table is in use by an select to allow
concurrent inserts.
@@ -42808,6 +43008,10 @@ insert into t1 values (now());
create table t2 select max(a) from t1;
show columns from t2;
@end example
+@item
+Come up with a nice syntax for a statement that will @code{UPDATE} the row
+if it exists and @code{INSERT} a new row if the row didn't exist.
+(Like @code{REPLACE} works with @code{INSERT} / @code{DELETE})
@end itemize
@node TODO sometime, TODO unplanned, TODO future, TODO
diff --git a/client/mysql.cc b/client/mysql.cc
index 8adb65ab3a6..5494ee6ccb9 100644
--- a/client/mysql.cc
+++ b/client/mysql.cc
@@ -115,7 +115,7 @@ static bool info_flag=0,ignore_errors=0,wait_flag=0,quick=0,
opt_compress=0,
vertical=0,skip_line_numbers=0,skip_column_names=0,opt_html=0,
no_named_cmds=1; // we want this to be the default
-static uint verbose=0,opt_silent=0,opt_mysql_port=0;
+static uint verbose=0,opt_silent=0,opt_mysql_port=0,opt_connect_timeout=0;
static my_string opt_mysql_unix_port=0;
static int connect_flag=CLIENT_INTERACTIVE;
static char *current_host,*current_db,*current_user=0,*opt_password=0,
@@ -334,7 +334,7 @@ sig_handler mysql_end(int sig)
exit(status.exit_status);
}
-enum options {OPT_CHARSETS_DIR=256, OPT_DEFAULT_CHARSET} ;
+enum options {OPT_CHARSETS_DIR=256, OPT_DEFAULT_CHARSET, OPT_TIMEOUT} ;
static struct option long_options[] =
@@ -374,6 +374,7 @@ static struct option long_options[] =
{"socket", required_argument, 0, 'S'},
#include "sslopt-longopts.h"
{"table", no_argument, 0, 't'},
+ {"timeout", required_argument, 0, OPT_TIMEOUT},
#ifndef DONT_ALLOW_USER_CHANGE
{"user", required_argument, 0, 'u'},
#endif
@@ -545,9 +546,12 @@ static int get_options(int argc, char **argv)
case 'p':
if (optarg)
{
+ char *start=optarg;
my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
opt_password=my_strdup(optarg,MYF(MY_FAE));
while (*optarg) *optarg++= 'x'; // Destroy argument
+ if (*start)
+ start[1]=0;
}
else
tty_password=1;
@@ -603,6 +607,9 @@ static int get_options(int argc, char **argv)
opt_mysql_unix_port=my_strdup(MYSQL_NAMEDPIPE,MYF(0));
#endif
break;
+ case OPT_TIMEOUT:
+ opt_connect_timeout=atoi(optarg);
+ break;
case 'V': usage(1); exit(0);
case 'I':
case '?':
@@ -1772,6 +1779,9 @@ sql_real_connect(char *host,char *database,char *user,char *password,
connected= 0;
}
mysql_init(&mysql);
+ if (opt_connect_timeout)
+ mysql_options(&mysql,MYSQL_OPT_CONNECT_TIMEOUT,
+ (char*) &opt_connect_timeout);
if (opt_compress)
mysql_options(&mysql,MYSQL_OPT_COMPRESS,NullS);
#ifdef HAVE_OPENSSL
diff --git a/client/mysqladmin.c b/client/mysqladmin.c
index f8432ec7fb6..d5b2e73451e 100644
--- a/client/mysqladmin.c
+++ b/client/mysqladmin.c
@@ -28,7 +28,7 @@
#include <my_pthread.h> /* because of signal() */
#endif
-#define ADMIN_VERSION "8.9"
+#define ADMIN_VERSION "8.11"
#define MAX_MYSQL_VAR 64
#define MAX_TIME_TO_WAIT 3600 /* Wait for shutdown */
#define MAX_TRUNC_LENGTH 3
@@ -137,7 +137,7 @@ int main(int argc,char *argv[])
{
int c, error = 0,option_index=0;
MYSQL mysql;
- char *host = NULL,*password=0,*user=0,**commands;
+ char *host = NULL,*opt_password=0,*user=0,**commands;
my_bool tty_password=0;
MY_INIT(argv[0]);
mysql_init(&mysql);
@@ -160,9 +160,12 @@ int main(int argc,char *argv[])
case 'p':
if (optarg)
{
- my_free(password,MYF(MY_ALLOW_ZERO_PTR));
- password=my_strdup(optarg,MYF(MY_FAE));
+ char *start=optarg;
+ my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
+ opt_password=my_strdup(optarg,MYF(MY_FAE));
while (*optarg) *optarg++= 'x'; /* Destroy argument */
+ if (*start)
+ start[1]=0; /* Cut length of argument */
}
else
tty_password=1;
@@ -243,12 +246,11 @@ int main(int argc,char *argv[])
exit(1);
}
if (tty_password)
- password = get_tty_password(NullS);
+ opt_password = get_tty_password(NullS);
VOID(signal(SIGINT,endprog)); /* Here if abort */
VOID(signal(SIGTERM,endprog)); /* Here if abort */
- mysql_init(&mysql);
if (opt_compress)
mysql_options(&mysql,MYSQL_OPT_COMPRESS,NullS);
#ifdef HAVE_OPENSSL
@@ -256,7 +258,7 @@ int main(int argc,char *argv[])
mysql_ssl_set(&mysql, opt_ssl_key, opt_ssl_cert, opt_ssl_ca,
opt_ssl_capath);
#endif /* HAVE_OPENSSL */
- if (sql_connect(&mysql,host,user,password,option_wait))
+ if (sql_connect(&mysql,host,user,opt_password,option_wait))
error = 1;
else
{
@@ -269,7 +271,7 @@ int main(int argc,char *argv[])
if (option_wait && !interrupted)
{
mysql_close(&mysql);
- if (!sql_connect(&mysql,host,user,password,option_wait))
+ if (!sql_connect(&mysql,host,user,opt_password,option_wait))
continue; /* Retry */
}
error=1;
@@ -286,7 +288,7 @@ int main(int argc,char *argv[])
}
mysql_close(&mysql);
}
- my_free(password,MYF(MY_ALLOW_ZERO_PTR));
+ my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
my_free(user,MYF(MY_ALLOW_ZERO_PTR));
free_defaults(argv);
my_end(0);
diff --git a/client/mysqldump.c b/client/mysqldump.c
index 5ec559c5227..82fcad6bff6 100644
--- a/client/mysqldump.c
+++ b/client/mysqldump.c
@@ -37,7 +37,7 @@
** Tõnu Samuel <tonu@please.do.not.remove.this.spam.ee>
**/
-#define DUMP_VERSION "8.10"
+#define DUMP_VERSION "8.11"
#include <global.h>
#include <my_sys.h>
@@ -75,7 +75,7 @@ static my_bool verbose=0,tFlag=0,cFlag=0,dFlag=0,quick=0, extended_insert = 0,
opt_delayed=0,create_options=0,opt_quoted=0,opt_databases=0,
opt_alldbs=0,opt_create_db=0,opt_first_slave=0;
static MYSQL mysql_connection,*sock=0;
-static char insert_pat[12 * 1024],*password=0,*current_user=0,
+static char insert_pat[12 * 1024],*opt_password=0,*current_user=0,
*current_host=0,*path=0,*fields_terminated=0,
*lines_terminated=0, *enclosed=0, *opt_enclosed=0, *escaped=0,
*where=0, *default_charset;
@@ -333,9 +333,12 @@ static int get_options(int *argc,char ***argv)
case 'p':
if (optarg)
{
- my_free(password,MYF(MY_ALLOW_ZERO_PTR));
- password=my_strdup(optarg,MYF(MY_FAE));
- while (*optarg) *optarg++= 'x'; /* Destroy argument */
+ char *start=optarg;
+ my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
+ opt_password=my_strdup(optarg,MYF(MY_FAE));
+ while (*optarg) *optarg++= 'x'; /* Destroy argument */
+ if (*start)
+ start[1]=0; /* Cut length of argument */
}
else
tty_password=1;
@@ -459,7 +462,7 @@ static int get_options(int *argc,char ***argv)
return 1;
}
if (tty_password)
- password=get_tty_password(NullS);
+ opt_password=get_tty_password(NullS);
return(0);
} /* get_options */
@@ -1236,7 +1239,7 @@ int main(int argc, char **argv)
my_end(0);
exit(EX_USAGE);
}
- if (dbConnect(current_host, current_user, password))
+ if (dbConnect(current_host, current_user, opt_password))
exit(EX_MYSQLERR);
if (!path)
write_heder(stdout, *argv);
@@ -1276,7 +1279,7 @@ int main(int argc, char **argv)
}
dbDisconnect(current_host);
puts("");
- my_free(password, MYF(MY_ALLOW_ZERO_PTR));
+ my_free(opt_password, MYF(MY_ALLOW_ZERO_PTR));
if (extended_insert)
dynstr_free(&extended_row);
my_end(0);
diff --git a/client/mysqlimport.c b/client/mysqlimport.c
index 596b68591b7..68cd84fbbb7 100644
--- a/client/mysqlimport.c
+++ b/client/mysqlimport.c
@@ -25,7 +25,7 @@
** * *
** *************************
*/
-#define IMPORT_VERSION "2.4"
+#define IMPORT_VERSION "2.5"
#include <global.h>
#include <my_sys.h>
@@ -45,7 +45,7 @@ static my_bool verbose=0,lock_tables=0,ignore_errors=0,delete=0,
replace=0,silent=0,ignore=0,opt_compress=0,opt_local_file=0;
static MYSQL mysql_connection;
-static char *password=0, *current_user=0,
+static char *opt_password=0, *current_user=0,
*current_host=0, *current_db=0, *fields_terminated=0,
*lines_terminated=0, *enclosed=0, *opt_enclosed=0,
*escaped=0, opt_low_priority=0, *opt_columns=0;
@@ -202,9 +202,12 @@ static int get_options(int *argc, char ***argv)
case 'p':
if (optarg)
{
- my_free(password,MYF(MY_ALLOW_ZERO_PTR));
- password= my_strdup(optarg,MYF(MY_FAE));
+ char *start=optarg;
+ my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
+ opt_password=my_strdup(optarg,MYF(MY_FAE));
while (*optarg) *optarg++= 'x'; /* Destroy argument */
+ if (*start)
+ start[1]=0; /* Cut length of argument */
}
else
tty_password= 1;
@@ -276,7 +279,7 @@ static int get_options(int *argc, char ***argv)
current_db= *((*argv)++);
(*argc)--;
if (tty_password)
- password=get_tty_password(NullS);
+ opt_password=get_tty_password(NullS);
return(0);
}
@@ -504,7 +507,7 @@ int main(int argc, char **argv)
argv_to_free= argv;
if (get_options(&argc, &argv))
return(1);
- if (!(sock= db_connect(current_host,current_db,current_user,password)))
+ if (!(sock= db_connect(current_host,current_db,current_user,opt_password)))
return(1); /* purecov: deadcode */
if (lock_tables)
lock_table(sock, argc, argv);
@@ -513,7 +516,7 @@ int main(int argc, char **argv)
if (exitcode == 0)
exitcode = error;
db_disconnect(current_host, sock);
- my_free(password,MYF(MY_ALLOW_ZERO_PTR));
+ my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
free_defaults(argv_to_free);
my_end(0);
return(exitcode);
diff --git a/client/mysqlshow.c b/client/mysqlshow.c
index bf924ddeecd..3c34b2df4b5 100644
--- a/client/mysqlshow.c
+++ b/client/mysqlshow.c
@@ -28,7 +28,7 @@
#include <stdarg.h>
#include <getopt.h>
-static my_string host=0,password=0,user=0;
+static my_string host=0,opt_password=0,user=0;
static my_bool opt_show_keys=0,opt_compress=0,opt_status=0;
static void get_options(int *argc,char ***argv);
@@ -88,15 +88,13 @@ int main(int argc, char **argv)
mysql_ssl_set(&mysql, opt_ssl_key, opt_ssl_cert, opt_ssl_ca,
opt_ssl_capath);
#endif
- if (!(mysql_real_connect(&mysql,host,user,password,
+ if (!(mysql_real_connect(&mysql,host,user,opt_password,
argv[0],opt_mysql_port,opt_mysql_unix_port,
0)))
{
fprintf(stderr,"%s: %s\n",my_progname,mysql_error(&mysql));
exit(1);
}
- /* if (!(mysql_connect(&mysql,host,user,password))) */
-
switch (argc)
{
@@ -111,11 +109,12 @@ int main(int argc, char **argv)
if (opt_status && ! wild)
error=list_table_status(&mysql,argv[0],argv[1]);
else
- error=list_fields(&mysql,argv[0],argv[1],wild); break;
+ error=list_fields(&mysql,argv[0],argv[1],wild);
+ break;
}
mysql_close(&mysql); /* Close & free connection */
- if (password)
- my_free(password,MYF(0));
+ if (opt_password)
+ my_free(opt_password,MYF(0));
my_end(0);
exit(error ? 1 : 0);
return 0; /* No compiler warnings */
@@ -223,9 +222,12 @@ get_options(int *argc,char ***argv)
case 'p':
if (optarg)
{
- my_free(password,MYF(MY_ALLOW_ZERO_PTR));
- password=my_strdup(optarg,MYF(MY_FAE));
+ char *start=optarg;
+ my_free(opt_password,MYF(MY_ALLOW_ZERO_PTR));
+ opt_password=my_strdup(optarg,MYF(MY_FAE));
while (*optarg) *optarg++= 'x'; /* Destroy argument */
+ if (*start)
+ start[1]=0; /* Cut length of argument */
}
else
tty_password=1;
@@ -266,7 +268,7 @@ get_options(int *argc,char ***argv)
(*argc)-=optind;
(*argv)+=optind;
if (tty_password)
- password=get_tty_password(NullS);
+ opt_password=get_tty_password(NullS);
return;
}
diff --git a/configure.in b/configure.in
index bd78c787189..7bab8197c9f 100644
--- a/configure.in
+++ b/configure.in
@@ -4,7 +4,7 @@ dnl Process this file with autoconf to produce a configure script.
AC_INIT(sql/mysqld.cc)
AC_CANONICAL_SYSTEM
# The Docs Makefile.am parses this line!
-AM_INIT_AUTOMAKE(mysql, 3.23.27-beta)
+AM_INIT_AUTOMAKE(mysql, 3.23.28-gamma)
AM_CONFIG_HEADER(config.h)
PROTOCOL_VERSION=10
@@ -687,6 +687,8 @@ case $SYSTEM_TYPE in
then
CFLAGS="$CFLAGS -traditional-cpp -DHAVE_DARWIN_THREADS"
CXXFLAGS="$CXXFLAGS -traditional-cpp -DHAVE_DARWIN_THREADS"
+ CFLAGS="$CFLAGS -traditional-cpp -DHAVE_DARWIN_THREADS -D_P1003_1B_VISIBLE"
+ CXXFLAGS="$CXXFLAGS -traditional-cpp -DHAVE_DARWIN_THREADS -D_P1003_1B_VISIBLE"
MAX_C_OPTIMIZE="-O"
with_named_curses=""
fi
@@ -1235,13 +1237,13 @@ AC_FUNC_UTIME_NULL
AC_FUNC_VPRINTF
AC_CHECK_FUNCS(alarm bmove \
chsize ftruncate rint finite fpsetmask fpresetsticky\
- cuserid fcntl fconvert \
+ cuserid fcntl fconvert poll \
getrusage getpwuid getcwd getrlimit getwd index stpcpy locking longjmp \
perror pread realpath rename \
socket strnlen madvise mkstemp \
strtol strtoul strtoull snprintf tempnam thr_setconcurrency \
gethostbyaddr_r gethostbyname_r getpwnam \
- bfill bzero bcmp strstr strpbrk strerror\
+ bfill bzero bcmp strstr strpbrk strerror \
tell atod memcpy memmove \
setupterm strcasecmp sighold \
vidattr setupterm lrand48 localtime_r \
diff --git a/include/my_pthread.h b/include/my_pthread.h
index bef7da93451..c7b5831a474 100644
--- a/include/my_pthread.h
+++ b/include/my_pthread.h
@@ -351,10 +351,9 @@ struct tm *localtime_r(const time_t *clock, struct tm *res);
#define pthread_kill(A,B) pthread_dummy(0)
#define pthread_condattr_init(A) pthread_dummy(0)
#define pthread_condattr_destroy(A) pthread_dummy(0)
-#define pthread_cond_init( A, B ) pthread_cond_init( (A), 0 )
#define pthread_signal(A,B) pthread_dummy(0)
#undef pthread_detach_this_thread
-#define pthread_detach_this_thread() { pthread_t tmp=pthread_self() ; pthread_detach(&tmp); }
+#define pthread_detach_this_thread() { pthread_t tmp=pthread_self() ; pthread_detach(tmp); }
#undef sigset
#define sigset(A,B) pthread_signal((A),(void (*)(int)) (B))
#endif
diff --git a/include/violite.h b/include/violite.h
index e7c3e8ede81..1f44c29ba65 100644
--- a/include/violite.h
+++ b/include/violite.h
@@ -108,6 +108,9 @@ my_bool vio_peer_addr(Vio * vio, char *buf);
void vio_in_addr(Vio *vio, struct in_addr *in);
+ /* Return 1 if there is data to be read */
+my_bool vio_poll_read(Vio *vio,uint timeout);
+
#ifdef __cplusplus
}
#endif
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index fecdd073a47..9343f8f53ef 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -64,6 +64,12 @@ my_string mysql_unix_port=0;
#define CLIENT_CAPABILITIES (CLIENT_LONG_PASSWORD | CLIENT_LONG_FLAG | CLIENT_LOCAL_FILES | CLIENT_TRANSACTIONS)
+#ifdef __WIN__
+#define CONNECT_TIMEOUT 20
+#else
+#define CONNECT_TIMEOUT 0
+#endif
+
#if defined(MSDOS) || defined(__WIN__)
#define ERRNO WSAGetLastError()
#define perror(A)
@@ -113,7 +119,7 @@ static ulong mysql_sub_escape_string(CHARSET_INFO *charset_info, char *to,
*****************************************************************************/
static int connect2(my_socket s, const struct sockaddr *name, uint namelen,
- uint to)
+ uint timeout)
{
#if defined(__WIN__)
return connect(s, (struct sockaddr*) name, namelen);
@@ -128,7 +134,7 @@ static int connect2(my_socket s, const struct sockaddr *name, uint namelen,
* exactly like the normal connect() call does.
*/
- if (to == 0)
+ if (timeout == 0)
return connect(s, (struct sockaddr*) name, namelen);
flags = fcntl(s, F_GETFL, 0); /* Set socket to not block */
@@ -175,13 +181,13 @@ static int connect2(my_socket s, const struct sockaddr *name, uint namelen,
start_time = time(NULL);
for (;;)
{
- tv.tv_sec = (long) to;
+ tv.tv_sec = (long) timeout;
tv.tv_usec = 0;
if ((res = select(s+1, NULL, &sfds, NULL, &tv)) >= 0)
break;
now_time=time(NULL);
- to-= (uint) (now_time - start_time);
- if (errno != EINTR || (int) to <= 0)
+ timeout-= (uint) (now_time - start_time);
+ if (errno != EINTR || (int) timeout <= 0)
return -1;
}
@@ -195,7 +201,7 @@ static int connect2(my_socket s, const struct sockaddr *name, uint namelen,
return(-1);
if (s_err)
- { /* getsockopt() could suceed */
+ { /* getsockopt could succeed */
errno = s_err;
return(-1); /* but return an error... */
}
@@ -1001,9 +1007,7 @@ mysql_init(MYSQL *mysql)
}
else
bzero((char*) (mysql),sizeof(*(mysql)));
-#ifdef __WIN__
- mysql->options.connect_timeout=20;
-#endif
+ mysql->options.connect_timeout=CONNECT_TIMEOUT;
#if defined(SIGPIPE) && defined(THREAD)
if (!((mysql)->client_flag & CLIENT_IGNORE_SIGPIPE))
(void) signal(SIGPIPE,pipe_sig_handler);
@@ -1140,7 +1144,8 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
const char *passwd, const char *db,
uint port, const char *unix_socket,uint client_flag)
{
- char buff[100],charset_name_buff[16],*end,*host_info, *charset_name;
+ char buff[NAME_LEN+100],charset_name_buff[16],*end,*host_info,
+ *charset_name;
my_socket sock;
uint32 ip_addr;
struct sockaddr_in sock_addr;
@@ -1341,6 +1346,13 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
/* Get version info */
mysql->protocol_version= PROTOCOL_VERSION; /* Assume this */
+ if (mysql->options.connect_timeout &&
+ vio_poll_read(net->vio, mysql->options.connect_timeout))
+ {
+ net->last_errno= CR_SERVER_LOST;
+ strmov(net->last_error,ER(net->last_errno));
+ goto error;
+ }
if ((pkt_length=net_safe_read(mysql)) == packet_error)
goto error;
@@ -1496,7 +1508,7 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
int3store(buff+2,max_allowed_packet);
if (user && user[0])
- strmake(buff+5,user,32);
+ strmake(buff+5,user,32); /* Max user name */
else
read_user_name((char*) buff+5);
#ifdef _CUSTOMCONFIG_
@@ -1507,7 +1519,7 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
(my_bool) (mysql->protocol_version == 9));
if (db && (mysql->server_capabilities & CLIENT_CONNECT_WITH_DB))
{
- end=strmov(end+1,db);
+ end=strmake(end+1,db,NAME_LEN);
mysql->db=my_strdup(db,MYF(MY_WME));
db=0;
}
diff --git a/libmysql/violite.c b/libmysql/violite.c
index 349a6fbd849..4efda9f3b90 100644
--- a/libmysql/violite.c
+++ b/libmysql/violite.c
@@ -32,6 +32,9 @@
#include <my_sys.h>
#include <my_net.h>
#include <m_string.h>
+#ifdef HAVE_POLL
+#include <sys/poll.h>
+#endif
#if defined(__EMX__)
#include <sys/ioctl.h>
@@ -98,7 +101,9 @@ Vio *vio_new(my_socket sd, enum enum_vio_type type, my_bool localhost)
if ((vio = (Vio*) my_malloc(sizeof(*vio),MYF(MY_WME))))
{
vio_reset(vio, type, sd, 0, localhost);
- sprintf(vio->desc, "socket (%d)", vio->sd);
+ sprintf(vio->desc,
+ (vio->type == VIO_TYPE_SOCKET ? "socket (%d)" : "TCP/IP (%d)"),
+ vio->sd);
#if !defined(___WIN__) && !defined(__EMX__)
#if !defined(NO_FCNTL_NONBLOCK)
vio->fcntl_mode = fcntl(sd, F_GETFL);
@@ -261,7 +266,7 @@ vio_is_blocking(Vio * vio)
}
-int vio_fastsend(Vio * vio, my_bool onoff)
+int vio_fastsend(Vio * vio __attribute__((unused)), my_bool onoff)
{
int r=0;
DBUG_ENTER("vio_fastsend");
@@ -322,7 +327,7 @@ int vio_close(Vio * vio)
if (vio->type == VIO_TYPE_NAMEDPIPE)
{
#if defined(__NT__) && defined(MYSQL_SERVER)
- CancelIO(vio->hPipe);
+ CancelIo(vio->hPipe);
DisconnectNamedPipe(vio->hPipe);
#endif
r=CloseHandle(vio->hPipe);
@@ -397,4 +402,26 @@ void vio_in_addr(Vio *vio, struct in_addr *in)
DBUG_VOID_RETURN;
}
+
+/* Return 0 if there is data to be read */
+
+my_bool vio_poll_read(Vio *vio,uint timeout)
+{
+#ifndef HAVE_POLL
+ return 0;
+#else
+ struct pollfd fds;
+ int res;
+ DBUG_ENTER("vio_poll");
+ fds.fd=vio->sd;
+ fds.events=POLLIN;
+ fds.revents=0;
+ if ((res=poll(&fds,1,(int) timeout*1000)) <= 0)
+ {
+ DBUG_RETURN(res < 0 ? 0 : 1); /* Don't return 1 on errors */
+ }
+ DBUG_RETURN(fds.revents & POLLIN ? 0 : 1);
+#endif
+}
+
#endif /* HAVE_VIO */
diff --git a/mysys/hash.c b/mysys/hash.c
index a6181443a42..9c6497c7717 100644
--- a/mysys/hash.c
+++ b/mysys/hash.c
@@ -374,10 +374,11 @@ my_bool hash_delete(HASH *hash,byte *record)
uint blength,pos2,pos_hashnr,lastpos_hashnr,idx,empty_index;
HASH_LINK *data,*lastpos,*gpos,*pos,*pos3,*empty;
DBUG_ENTER("hash_delete");
+ if (!hash->records)
+ DBUG_RETURN(1);
blength=hash->blength;
data=dynamic_element(&hash->array,0,HASH_LINK*);
-
/* Search after record with key */
pos=data+ hash_mask(rec_hashnr(hash,record),blength,hash->records);
gpos = 0;
diff --git a/scripts/safe_mysqld.sh b/scripts/safe_mysqld.sh
index 43023e0fb8b..615670326bb 100644
--- a/scripts/safe_mysqld.sh
+++ b/scripts/safe_mysqld.sh
@@ -28,10 +28,13 @@ parse_arguments() {
--socket=*) MYSQL_UNIX_PORT=`echo "$arg" | sed -e "s;--socket=;;"` ;;
--port=*) MYSQL_TCP_PORT=`echo "$arg" | sed -e "s;--port=;;"` ;;
--log=*) log=`echo "$arg" | sed -e "s;--log=;;"` ;;
- --err-log=*) err_log=`echo "$arg" | sed -e "s;--err-log=;;"` ;;
--basedir=*) MY_BASEDIR_VERSION=`echo "$arg" | sed -e "s;--basedir=;;"` ;;
- --ledir=*) ledir=`echo "$arg" | sed -e "s;--ledir=;;"` ;;
--user=*) user=`echo "$arg" | sed -e "s;--user=;;"` ;;
+ --ledir=*) ledir=`echo "$arg" | sed -e "s;--ledir=;;"` ;;
+ --err-log=*) err_log=`echo "$arg" | sed -e "s;--err-log=;;"` ;;
+ --open-files=*) open_files=`echo "$arg" | sed -e "s;--open-files=;;"` ;;
+ --core-file-size*) core_file_size=`echo "$arg" | sed -e "s;--core_file_size=;;"` ;;
+ --timezone=*) TZ=`echo "$arg" | sed -e "s;--timezone=;;"` ; export TZ; ;;
esac
done
}
@@ -105,6 +108,14 @@ if test -w /
then
# If we are root, change the err log to the right user.
touch $err_log; chown $user $err_log
+ if test -n "$open_files"
+ then
+ ulimit -n $open_files
+ fi
+ if test -n "$core_file_size"
+ then
+ ulimit -c $core_file_size
+ fi
fi
#
diff --git a/sql-bench/bench-init.pl.sh b/sql-bench/bench-init.pl.sh
index 3f650885c21..ae847c1a28f 100755
--- a/sql-bench/bench-init.pl.sh
+++ b/sql-bench/bench-init.pl.sh
@@ -339,6 +339,15 @@ sub end_benchmark
exit 0;
}
+sub print_time
+{
+ my ($estimated)=@_;
+ if ($estimated)
+ { print "Estimated time"; }
+ else
+ { print "Time"; }
+}
+
#
# Create a filename part for the machine that can be used for log file.
#
diff --git a/sql-bench/crash-me.sh b/sql-bench/crash-me.sh
index 6bb3eab63f9..5c993e842bc 100755
--- a/sql-bench/crash-me.sh
+++ b/sql-bench/crash-me.sh
@@ -39,7 +39,7 @@
# "3-byte int" or "same as xxx".
-$version="1.50";
+$version="1.51";
use DBI;
use Getopt::Long;
@@ -289,6 +289,11 @@ report("rename table","rename_table",
$dbh->do("drop table crash_q1");
$dbh->do("drop table crash_q");
+report("truncate table","truncate_table",
+ "create table crash_q (a integer, b integer,c CHAR(10))",
+ "truncate table crash_q",
+ "drop table crash_q1");
+
if ($dbh->do("create table crash_q (a integer, b integer,c CHAR(10))") &&
$dbh->do("create table crash_q1 (a integer, b integer,c CHAR(10) not null)"))
{
diff --git a/sql-bench/test-insert.sh b/sql-bench/test-insert.sh
index 36a2b7761d5..13bcfb2f6a9 100755
--- a/sql-bench/test-insert.sh
+++ b/sql-bench/test-insert.sh
@@ -498,6 +498,7 @@ if ($limits->{'group_functions'})
$loop_time=new Benchmark;
$count=1;
+ $estimated=0;
for ($tests=0 ; $tests < $small_loop_count ; $tests++)
{
$sth=$dbh->prepare($query="select count(*) from bench1") or die $DBI::errstr;
@@ -573,9 +574,12 @@ if ($limits->{'group_functions'})
print "Warning: '$query' returned wrong number of rows\n";
}
}
+ $end_time=new Benchmark;
+ last if ($estimated=predict_query_time($loop_time,$end_time,\$count,$tests,
+ $small_loop_count));
}
- $end_time=new Benchmark;
- print "Time for select_group ($count): " .
+ print_time($estimated);
+ print " for select_group ($count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n";
$loop_time=new Benchmark;
diff --git a/sql-bench/test-select.sh b/sql-bench/test-select.sh
index 10b36e4be60..32059d6ac8a 100755
--- a/sql-bench/test-select.sh
+++ b/sql-bench/test-select.sh
@@ -205,10 +205,7 @@ for ($i=0 ; $i < $opt_small_loop_count ; $i++)
$opt_small_loop_count));
}
-if ($estimated)
-{ print "Estimated time"; }
-else
-{ print "Time"; }
+print_time($estimated);
print " for select_range ($count:$rows): " .
timestr(timediff($end_time, $loop_time),"all") . "\n";
@@ -243,10 +240,7 @@ if ($limits->{'group_functions'})
last if ($estimated=predict_query_time($loop_time,$end_time,\$count,
$tests+1, $opt_loop_count));
}
- if ($estimated)
- { print "Estimated time"; }
- else
- { print "Time"; }
+ print_time($estimated);
print " for min_max_on_key ($count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n";
@@ -267,10 +261,7 @@ if ($limits->{'group_functions'})
last if ($estimated=predict_query_time($loop_time,$end_time,\$count,
$tests+1, $opt_loop_count));
}
- if ($estimated)
- { print "Estimated time"; }
- else
- { print "Time"; }
+ print_time($estimated);
print " for count_on_key ($count): " .
timestr(timediff($end_time, $loop_time),"all") . "\n\n";
@@ -289,54 +280,74 @@ if ($limits->{'group_functions'})
{
print "Testing count(distinct) on the table\n";
$loop_time=new Benchmark;
- $rows=0;
+ $rows=$estimated=$count=0;
for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
{
+ $count+=2;
$rows+=fetch_all_rows($dbh,"select count(distinct region) from bench1");
$rows+=fetch_all_rows($dbh,"select count(distinct grp) from bench1");
+ $end_time=new Benchmark;
+ last if ($estimated=predict_query_time($loop_time,$end_time,\$count,$i+1,
+ $opt_medium_loop_count));
}
- $end_time=new Benchmark;
- print "Time for count_distinct ($i:$rows): " .
+ print_time($estimated);
+ print " for count_distinct ($count:$rows): " .
timestr(timediff($end_time, $loop_time),"all") . "\n";
$loop_time=new Benchmark;
- $rows=0;
+ $rows=$estimated=$count=0;
for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
{
+ $count++;
$rows+=fetch_all_rows($dbh,"select region,count(distinct idn) from bench1 group by region");
+ $end_time=new Benchmark;
+ last if ($estimated=predict_query_time($loop_time,$end_time,\$count,$i+1,
+ $opt_medium_loop_count));
}
- $end_time=new Benchmark;
- print "Time for count_distinct_group_on_key ($i:$rows): " .
+ print_time($estimated);
+ print " for count_distinct_group_on_key ($count:$rows): " .
timestr(timediff($end_time, $loop_time),"all") . "\n";
$loop_time=new Benchmark;
- $rows=0;
+ $rows=$estimated=$count=0;
for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
{
+ $count++;
$rows+=fetch_all_rows($dbh,"select grp,count(distinct idn) from bench1 group by grp");
+ $end_time=new Benchmark;
+ last if ($estimated=predict_query_time($loop_time,$end_time,\$count,$i+1,
+ $opt_medium_loop_count));
}
- $end_time=new Benchmark;
- print "Time for count_distinct_group_on_key_parts ($i:$rows): " .
+ print_time($estimated);
+ print " for count_distinct_group_on_key_parts ($count:$rows): " .
timestr(timediff($end_time, $loop_time),"all") . "\n";
$loop_time=new Benchmark;
- $rows=0;
+ $rows=$estimated=$count=0;
for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
{
+ $count++;
$rows+=fetch_all_rows($dbh,"select grp,count(distinct rev_idn) from bench1 group by grp");
+ $end_time=new Benchmark;
+ last if ($estimated=predict_query_time($loop_time,$end_time,\$count,$i+1,
+ $opt_medium_loop_count));
}
- $end_time=new Benchmark;
- print "Time for count_distinct_group ($i:$rows): " .
+ print_time($estimated);
+ print " for count_distinct_group ($count:$rows): " .
timestr(timediff($end_time, $loop_time),"all") . "\n";
$loop_time=new Benchmark;
- $rows=0;
+ $rows=$estimated=$count=0;
for ($i=0 ; $i < $opt_medium_loop_count ; $i++)
{
+ $count++;
$rows+=fetch_all_rows($dbh,"select idn,count(distinct region) from bench1 group by idn");
+ $end_time=new Benchmark;
+ last if ($estimated=predict_query_time($loop_time,$end_time,\$count,$i+1,
+ $opt_medium_loop_count));
}
- $end_time=new Benchmark;
- print "Time for count_distinct_big ($i:$rows): " .
+ print_time($estimated);
+ print " for count_distinct_big ($count:$rows): " .
timestr(timediff($end_time, $loop_time),"all") . "\n";
}
diff --git a/sql/filesort.cc b/sql/filesort.cc
index 0cee107cbb8..220ff69a3e8 100644
--- a/sql/filesort.cc
+++ b/sql/filesort.cc
@@ -38,8 +38,8 @@ if (my_b_write((file),(byte*) (from),param->ref_length)) \
typedef struct st_buffpek { /* Struktur om sorteringsbuffrarna */
my_off_t file_pos; /* Where we are in the sort file */
- ha_rows count; /* Number of rows in table */
uchar *base,*key; /* key pointers */
+ ha_rows count; /* Number of rows in table */
ulong mem_count; /* numbers of keys in memory */
ulong max_keys; /* Max keys in buffert */
} BUFFPEK;
@@ -98,7 +98,6 @@ ha_rows filesort(TABLE **table, SORT_FIELD *sortorder, uint s_length,
BUFFPEK *buffpek;
ha_rows records;
uchar **sort_keys;
- gptr save_1,save_2;
IO_CACHE tempfile,*selected_records_file,*outfile;
SORTPARAM param;
DBUG_ENTER("filesort");
@@ -109,7 +108,6 @@ ha_rows filesort(TABLE **table, SORT_FIELD *sortorder, uint s_length,
outfile= table[0]->io_cache;
my_b_clear(&tempfile);
- save_1=save_2=0;
buffpek= (BUFFPEK *) NULL; sort_keys= (uchar **) NULL; error= 1;
maxbuffer=1;
param.ref_length= table[0]->file->ref_length;
@@ -160,11 +158,6 @@ ha_rows filesort(TABLE **table, SORT_FIELD *sortorder, uint s_length,
goto err;
#endif
- /* Reserve memory for IO_CACHE files */
- if (! (save_1=my_malloc(DISK_BUFFER_SIZE,MYF(MY_WME))) ||
- ! (save_2=my_malloc(DISK_BUFFER_SIZE,MYF(MY_WME))))
- goto err;
-
memavl=sortbuff_size;
while (memavl >= MIN_SORT_MEMORY)
{
@@ -207,10 +200,6 @@ ha_rows filesort(TABLE **table, SORT_FIELD *sortorder, uint s_length,
my_error(ER_OUTOFMEMORY,MYF(ME_ERROR+ME_WAITTANG),sortbuff_size);
goto err;
}
- my_free(save_1,MYF(0)); /* Free for later use */
- my_free(save_2,MYF(0));
- save_1=save_2=0;
-
param.sort_form= table[0];
param.end=(param.local_sortorder=sortorder)+s_length;
if ((records=find_all_keys(&param,select,sort_keys,buffpek,&maxbuffer,
@@ -252,8 +241,6 @@ ha_rows filesort(TABLE **table, SORT_FIELD *sortorder, uint s_length,
#endif
x_free((gptr) sort_keys);
x_free((gptr) buffpek);
- x_free(save_1);
- x_free(save_2);
close_cached_file(&tempfile);
if (my_b_inited(outfile))
{
diff --git a/sql/ha_berkeley.cc b/sql/ha_berkeley.cc
index 13306397fe1..80421f006cc 100644
--- a/sql/ha_berkeley.cc
+++ b/sql/ha_berkeley.cc
@@ -60,6 +60,7 @@
#define HA_BERKELEY_ROWS_IN_TABLE 10000 /* to get optimization right */
#define HA_BERKELEY_RANGE_COUNT 100
+#define HA_BERKELEY_MAX_ROWS 10000000 /* Max rows in table */
const char *ha_berkeley_ext=".db";
bool berkeley_skip=0;
@@ -1615,12 +1616,13 @@ void ha_berkeley::update_auto_primary_key()
ha_rows ha_berkeley::estimate_number_of_rows()
{
ulonglong max_ident;
+ ulonglong max_rows=table->max_rows ? table->max_rows : HA_BERKELEY_MAX_ROWS;
if (!hidden_primary_key)
- return INT_MAX32;
+ return (ha_rows) max_rows;
pthread_mutex_lock(&share->mutex);
max_ident=share->auto_ident+EXTRA_RECORDS;
pthread_mutex_unlock(&share->mutex);
- return (ha_rows) min(max_ident,(ulonglong) INT_MAX32);
+ return (ha_rows) min(max_ident,max_rows);
}
#endif /* HAVE_BERKELEY_DB */
diff --git a/sql/item_create.cc b/sql/item_create.cc
index 8c62643b35a..8e6332d4e16 100644
--- a/sql/item_create.cc
+++ b/sql/item_create.cc
@@ -352,11 +352,6 @@ Item *create_func_to_days(Item* a)
return new Item_func_to_days(a);
}
-Item *create_func_truncate (Item *a, Item *b)
-{
- return new Item_func_round(a,b,1);
-}
-
Item *create_func_ucase(Item* a)
{
return new Item_func_ucase(a);
diff --git a/sql/item_create.h b/sql/item_create.h
index aa617946d98..de2726b32b0 100644
--- a/sql/item_create.h
+++ b/sql/item_create.h
@@ -81,7 +81,6 @@ Item *create_func_tan(Item* a);;
Item *create_func_time_format(Item *a, Item *b);
Item *create_func_time_to_sec(Item* a);
Item *create_func_to_days(Item* a);
-Item *create_func_truncate (Item *a, Item *b);
Item *create_func_ucase(Item* a);
Item *create_func_version(void);
Item *create_func_weekday(Item* a);
diff --git a/sql/item_strfunc.cc b/sql/item_strfunc.cc
index a52b9a85857..f8b0576dab5 100644
--- a/sql/item_strfunc.cc
+++ b/sql/item_strfunc.cc
@@ -1586,7 +1586,7 @@ String *Item_load_file::val_str(String *str)
if (!(file_name= args[0]->val_str(str)) ||
!(current_thd->master_access & FILE_ACL) ||
- !my_stat(file_name->c_ptr(), &stat_info, MYF(MY_FAE)))
+ !my_stat(file_name->c_ptr(), &stat_info, MYF(MY_WME)))
goto err;
if (!(stat_info.st_mode & S_IROTH))
{
diff --git a/sql/lex.h b/sql/lex.h
index a5c1b6eb123..b759076ac6d 100644
--- a/sql/lex.h
+++ b/sql/lex.h
@@ -301,6 +301,7 @@ static SYMBOL symbols[] = {
{ "TINYTEXT", SYM(TINYTEXT),0,0},
{ "TINYINT", SYM(TINYINT),0,0},
{ "TRAILING", SYM(TRAILING),0,0},
+ { "TRUNCATE", SYM(TRUNCATE_SYM),0,0},
{ "TO", SYM(TO_SYM),0,0},
{ "TYPE", SYM(TYPE_SYM),0,0},
{ "UNION", SYM(UNION_SYM),0,0},
@@ -442,7 +443,6 @@ static SYMBOL sql_functions[] = {
{ "TIME_TO_SEC", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_time_to_sec)},
{ "TO_DAYS", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_to_days)},
{ "TRIM", SYM(TRIM),0,0},
- { "TRUNCATE", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_truncate )},
{ "UCASE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ucase)},
{ "UPPER", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ucase)},
{ "UNIQUE_USERS", SYM(UNIQUE_USERS),0,0},
diff --git a/sql/lock.cc b/sql/lock.cc
index 4c7ae8e950b..c85983b65d6 100644
--- a/sql/lock.cc
+++ b/sql/lock.cc
@@ -70,8 +70,8 @@ MYSQL_LOCK *mysql_lock_tables(THD *thd,TABLE **tables,uint count)
thd->proc_info="Waiting for table";
pthread_mutex_unlock(&thd->mysys_var->mutex);
- while (global_read_lock && ! thd->killed ||
- thd->version != refresh_version)
+ while (global_read_lock && ! thd->killed &&
+ thd->version == refresh_version)
{
(void) pthread_cond_wait(&COND_refresh,&LOCK_open);
}
diff --git a/sql/log.cc b/sql/log.cc
index d245f49bf7d..c1e38a104ca 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -24,8 +24,6 @@
#include <stdarg.h>
#include <m_ctype.h> // For test_if_number
-
-
MYSQL_LOG mysql_log,mysql_update_log,mysql_slow_log,mysql_bin_log;
extern I_List<i_string> binlog_do_db, binlog_ignore_db;
@@ -76,7 +74,7 @@ static int find_uniq_filename(char *name)
-MYSQL_LOG::MYSQL_LOG(): file(0),index_file(0),last_time(0),query_start(0),
+MYSQL_LOG::MYSQL_LOG(): file(-1),index_file(-1),last_time(0),query_start(0),
name(0), log_type(LOG_CLOSED),write_error(0),inited(0),
no_rotate(0)
{
@@ -90,10 +88,10 @@ MYSQL_LOG::MYSQL_LOG(): file(0),index_file(0),last_time(0),query_start(0),
MYSQL_LOG::~MYSQL_LOG()
{
if (inited)
- {
- (void) pthread_mutex_destroy(&LOCK_log);
- (void) pthread_mutex_destroy(&LOCK_index);
- }
+ {
+ (void) pthread_mutex_destroy(&LOCK_log);
+ (void) pthread_mutex_destroy(&LOCK_index);
+ }
}
void MYSQL_LOG::set_index_file_name(const char* index_file_name)
@@ -128,13 +126,14 @@ int MYSQL_LOG::generate_new_name(char *new_name, const char *log_name)
void MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg,
const char *new_name)
{
-
+ MY_STAT tmp_stat;
+ char buff[512];
if (!inited)
{
inited=1;
(void) pthread_mutex_init(&LOCK_log,NULL);
(void) pthread_mutex_init(&LOCK_index, NULL);
- if(log_type_arg == LOG_BIN && *fn_ext(log_name))
+ if (log_type_arg == LOG_BIN && *fn_ext(log_name))
no_rotate = 1;
}
@@ -149,13 +148,11 @@ void MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg,
fn_format(index_file_name, name, mysql_data_home, ".index", 6);
db[0]=0;
- MY_STAT tmp_stat;
bool do_magic = ((log_type == LOG_BIN) && !my_stat(log_file_name,
&tmp_stat, MYF(0)));
- file=my_fopen(log_file_name,O_APPEND | O_WRONLY | O_BINARY,
- MYF(MY_WME | ME_WAITTANG));
- if (!file)
+ if ((file=my_open(log_file_name,O_APPEND | O_WRONLY | O_BINARY,
+ MYF(MY_WME | ME_WAITTANG)) < 0)
{
my_free(name,MYF(0));
name=0;
@@ -165,21 +162,21 @@ void MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg,
if (log_type == LOG_NORMAL)
{
+ char *end;
#ifdef __NT__
- fprintf(file, "%s, Version: %s, started with:\nTCP Port: %d, Named Pipe: %s\n", my_progname, server_version, mysql_port, mysql_unix_port);
+ sprintf(buff, "%s, Version: %s, started with:\nTCP Port: %d, Named Pipe: %s\n", my_progname, server_version, mysql_port, mysql_unix_port);
#else
- fprintf(file, "%s, Version: %s, started with:\nTcp port: %d Unix socket: %s\n", my_progname,server_version,mysql_port,mysql_unix_port);
+ sprintf(buff, "%s, Version: %s, started with:\nTcp port: %d Unix socket: %s\n", my_progname,server_version,mysql_port,mysql_unix_port);
#endif
- fprintf(file,"Time Id Command Argument\n");
- (void) fflush(file);
+ end=strmov(strend(buff),"Time Id Command Argument\n");
+ my_write(file,buff,(uint) (end-buff),MYF(0));
}
else if (log_type == LOG_NEW)
{
time_t skr=time(NULL);
struct tm tm_tmp;
localtime_r(&skr,&tm_tmp);
-
- fprintf(file,"# %s, Version: %s at %02d%02d%02d %2d:%02d:%02d\n",
+ sprintf(buff,"# %s, Version: %s at %02d%02d%02d %2d:%02d:%02d\n",
my_progname,server_version,
tm_tmp.tm_year % 100,
tm_tmp.tm_mon+1,
@@ -187,7 +184,7 @@ void MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg,
tm_tmp.tm_hour,
tm_tmp.tm_min,
tm_tmp.tm_sec);
- (void) fflush(file);
+ my_write(file,buff,(uint) strlen(buff),MYF(0));
}
else if (log_type == LOG_BIN)
{
@@ -198,25 +195,26 @@ void MYSQL_LOG::open(const char *log_name, enum_log_type log_type_arg,
// clean up if failed
// then if index_file has not been previously opened, try to open it
// clean up if failed
- if((do_magic && my_fwrite(file, (byte*)BINLOG_MAGIC, 4,
- MYF(MY_NABP|MY_WME)) ||
- (!index_file &&
- !(index_file = my_fopen(index_file_name,O_APPEND | O_BINARY | O_RDWR,
- MYF(MY_WME))))))
+
+ if ((do_magic && my_write(file, (byte*) BINLOG_MAGIC, 4,
+ MYF(MY_NABP|MY_WME)) ||
+ (index_file < 0 &&
+ (index_file = my_fopen(index_file_name,O_APPEND | O_BINARY | O_RDWR,
+ MYF(MY_WME))) < 0)))
{
- my_fclose(file,MYF(MY_WME));
+ my_close(file,MYF(MY_WME));
my_free(name,MYF(0));
name=0;
- file=0;
+ file= -1;
log_type=LOG_CLOSED;
return;
}
Start_log_event s;
s.write(file);
pthread_mutex_lock(&LOCK_index);
- my_fseek(index_file, 0L, MY_SEEK_END, MYF(MY_WME));
- fprintf(index_file, "%s\n", log_file_name);
- fflush(index_file);
+ my_seek(index_file, 0L, MY_SEEK_END, MYF(MY_WME));
+ my_write(index_file, log_file_name,strlen(log_file_name), MYF(0));
+ my_write(index_file, "\n",1, MYF(0));
pthread_mutex_unlock(&LOCK_index);
}
}
@@ -225,7 +223,7 @@ int MYSQL_LOG::get_current_log(LOG_INFO* linfo)
{
pthread_mutex_lock(&LOCK_log);
strmake(linfo->log_file_name, log_file_name, sizeof(linfo->log_file_name));
- linfo->pos = my_ftell(file, MYF(MY_WME));
+ linfo->pos = my_tell(file, MYF(MY_WME));
pthread_mutex_unlock(&LOCK_log);
return 0;
}
@@ -235,63 +233,66 @@ int MYSQL_LOG::find_first_log(LOG_INFO* linfo, const char* log_name)
{
// mutex needed because we need to make sure the file pointer does not move
// from under our feet
- if(!index_file) return LOG_INFO_INVALID;
+ if (index_file < 0) return LOG_INFO_INVALID;
int error = 0;
char* fname = linfo->log_file_name;
int log_name_len = (uint) strlen(log_name);
pthread_mutex_lock(&LOCK_index);
- if(my_fseek(index_file, 0L, MY_SEEK_SET, MYF(MY_WME) ) == MY_FILEPOS_ERROR)
+ if (my_seek(index_file, 0L, MY_SEEK_SET, MYF(MY_WME) ) == MY_FILEPOS_ERROR)
+ {
+ error = LOG_INFO_SEEK;
+ goto err;
+ }
+
+ for(;;)
+ {
+ if (!fgets(fname, FN_REFLEN, index_file))
{
- error = LOG_INFO_SEEK;
+ error = feof(index_file) ? LOG_INFO_EOF : LOG_INFO_IO;
goto err;
}
- for(;;)
+ // if the log entry matches, empty string matching anything
+ if (!log_name_len ||
+ (fname[log_name_len] == '\n' &&
+ !memcmp(fname, log_name, log_name_len)))
{
- if(!fgets(fname, FN_REFLEN, index_file))
- {
- error = feof(index_file) ? LOG_INFO_EOF : LOG_INFO_IO;
- goto err;
- }
-
- // if the log entry matches, empty string matching anything
- if(!log_name_len || (fname[log_name_len] == '\n' && !memcmp(fname, log_name, log_name_len)))
- {
- if(log_name_len)
- fname[log_name_len] = 0; // to kill \n
- else
- {
- *(strend(fname) - 1) = 0;
- }
- linfo->index_file_offset = my_ftell(index_file, MYF(MY_WME));
- break;
- }
+ if (log_name_len)
+ fname[log_name_len] = 0; // to kill \n
+ else
+ {
+ *(strend(fname) - 1) = 0;
+ }
+ linfo->index_file_offset = my_tell(index_file, MYF(MY_WME));
+ break;
}
-
+ }
error = 0;
err:
pthread_mutex_unlock(&LOCK_index);
return error;
}
+
+
int MYSQL_LOG::find_next_log(LOG_INFO* linfo)
{
// mutex needed because we need to make sure the file pointer does not move
// from under our feet
- if(!index_file) return LOG_INFO_INVALID;
+ if (!index_file) return LOG_INFO_INVALID;
int error = 0;
char* fname = linfo->log_file_name;
char* end ;
pthread_mutex_lock(&LOCK_index);
- if(my_fseek(index_file, linfo->index_file_offset, MY_SEEK_SET, MYF(MY_WME) ) == MY_FILEPOS_ERROR)
+ if (my_fseek(index_file, linfo->index_file_offset, MY_SEEK_SET, MYF(MY_WME) ) == MY_FILEPOS_ERROR)
{
error = LOG_INFO_SEEK;
goto err;
}
- if(!fgets(fname, FN_REFLEN, index_file))
+ if (!fgets(fname, FN_REFLEN, index_file))
{
error = feof(index_file) ? LOG_INFO_EOF : LOG_INFO_IO;
goto err;
@@ -310,11 +311,11 @@ err:
// we assume that buf has at least FN_REFLEN bytes alloced
void MYSQL_LOG::make_log_name(char* buf, const char* log_ident)
{
- if(inited)
+ if (inited)
{
int dir_len = dirname_length(log_file_name);
int ident_len = (uint) strlen(log_ident);
- if(dir_len + ident_len + 1 > FN_REFLEN)
+ if (dir_len + ident_len + 1 > FN_REFLEN)
{
buf[0] = 0;
return; // protection agains malicious buffer overflow
@@ -337,7 +338,7 @@ void MYSQL_LOG::new_file()
{
if (file)
{
- if(no_rotate) // do not rotate logs that are marked non-rotatable
+ if (no_rotate) // do not rotate logs that are marked non-rotatable
return; // ( for binlog with constant name)
char new_name[FN_REFLEN], *old_name=name;
@@ -469,14 +470,14 @@ void MYSQL_LOG::write(Query_log_event* event_info)
if (thd->insert_id_used)
{
Intvar_log_event e((uchar)INSERT_ID_EVENT, thd->last_insert_id);
- if(e.write(file))
+ if (e.write(file))
{
sql_print_error(ER(ER_ERROR_ON_WRITE), name, errno);
goto err;
}
}
- if(thd->convert_set)
+ if (thd->convert_set)
{
char buf[1024] = "SET CHARACTER SET ";
char* p = strend(buf);
@@ -485,7 +486,7 @@ void MYSQL_LOG::write(Query_log_event* event_info)
// just in case somebody wants it later
thd->query_length = (uint)(p - buf);
Query_log_event e(thd, buf);
- if(e.write(file))
+ if (e.write(file))
{
sql_print_error(ER(ER_ERROR_ON_WRITE), name, errno);
goto err;
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index 6cb24de17c5..c2415a3e2c1 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -130,7 +130,7 @@ extern "C" int gethostname(char *name, int namelen);
#ifndef DBUG_OFF
static const char* default_dbug_option=IF_WIN("d:t:i:O,\\mysqld.trace",
- "d:t:i:o,/tmp/mysqld.trace");
+ "d:t:i:o,/tmp/mysqld.trace");
#endif
#ifdef __NT__
@@ -156,7 +156,7 @@ static pthread_t select_thread;
static pthread_t flush_thread; // Used when debugging
static bool opt_log,opt_update_log,opt_bin_log,opt_slow_log,opt_noacl,
opt_disable_networking=0, opt_bootstrap=0,opt_skip_show_db=0,
- opt_ansi_mode=0,opt_myisam_log=0;
+ opt_ansi_mode=0,opt_myisam_log=0, opt_large_files=sizeof(my_off_t) > 4;
bool opt_sql_bin_update = 0, opt_log_slave_updates = 0;
// if sql_bin_update is true, SQL_LOG_UPDATE and SQL_LOG_BIN are kept in sync, and are
@@ -576,8 +576,8 @@ void unireg_abort(int exit_code)
{
if (exit_code)
sql_print_error("Aborting\n");
- (void) my_delete(pidfile_name,MYF(0)); // This may not always exist
clean_up(); /* purecov: inspected */
+ (void) my_delete(pidfile_name,MYF(0)); // This may not always exist
exit(exit_code); /* purecov: inspected */
}
@@ -2421,20 +2421,21 @@ struct show_var_st init_vars[]= {
#endif
{"character_set", default_charset, SHOW_CHAR},
{"character_sets", (char*) &charsets_list, SHOW_CHAR_PTR},
- {"connect_timeout", (char*) &connect_timeout, SHOW_LONG},
{"concurrent_insert", (char*) &myisam_concurrent_insert, SHOW_MY_BOOL},
+ {"connect_timeout", (char*) &connect_timeout, SHOW_LONG},
{"datadir", mysql_real_data_home, SHOW_CHAR},
{"delay_key_write", (char*) &myisam_delay_key_write, SHOW_MY_BOOL},
{"delayed_insert_limit", (char*) &delayed_insert_limit, SHOW_LONG},
{"delayed_insert_timeout", (char*) &delayed_insert_timeout, SHOW_LONG},
{"delayed_queue_size", (char*) &delayed_queue_size, SHOW_LONG},
- {"join_buffer_size", (char*) &join_buff_size, SHOW_LONG},
{"flush", (char*) &myisam_flush, SHOW_MY_BOOL},
{"flush_time", (char*) &flush_time, SHOW_LONG},
{"init_file", (char*) &opt_init_file, SHOW_CHAR_PTR},
{"interactive_timeout", (char*) &net_interactive_timeout, SHOW_LONG},
+ {"join_buffer_size", (char*) &join_buff_size, SHOW_LONG},
{"key_buffer_size", (char*) &keybuff_size, SHOW_LONG},
{"language", language, SHOW_CHAR},
+ {"large_files_support", (char*) &opt_large_files, SHOW_BOOL},
#ifdef HAVE_MLOCKALL
{"locked_in_memory", (char*) &locked_in_memory, SHOW_BOOL},
#endif
@@ -2457,12 +2458,15 @@ struct show_var_st init_vars[]= {
{"myisam_recover_options", (char*) &myisam_recover_options_str, SHOW_CHAR_PTR},
{"myisam_sort_buffer_size", (char*) &myisam_sort_buffer_size, SHOW_LONG},
{"net_buffer_length", (char*) &net_buffer_length, SHOW_LONG},
+ {"net_read_timeout", (char*) &net_read_timeout, SHOW_LONG},
{"net_retry_count", (char*) &mysqld_net_retry_count, SHOW_LONG},
+ {"net_write_timeout", (char*) &net_write_timeout, SHOW_LONG},
{"pid_file", (char*) pidfile_name, SHOW_CHAR},
{"port", (char*) &mysql_port, SHOW_INT},
{"protocol_version", (char*) &protocol_version, SHOW_INT},
{"record_buffer", (char*) &my_default_record_cache_size,SHOW_LONG},
- {"server_id", (char*) &server_id, SHOW_LONG},
+ {"query_buffer_size", (char*) &query_buff_size, SHOW_LONG},
+ {"server_id", (char*) &server_id, SHOW_LONG},
{"skip_locking", (char*) &my_disable_locking, SHOW_MY_BOOL},
{"skip_networking", (char*) &opt_disable_networking, SHOW_BOOL},
{"skip_show_database", (char*) &opt_skip_show_db, SHOW_BOOL},
@@ -2471,11 +2475,11 @@ struct show_var_st init_vars[]= {
{"sort_buffer", (char*) &sortbuff_size, SHOW_LONG},
{"table_cache", (char*) &table_cache_size, SHOW_LONG},
{"table_type", (char*) &default_table_type_name, SHOW_CHAR_PTR},
+ {"thread_cache_size", (char*) &thread_cache_size, SHOW_LONG},
#ifdef HAVE_THR_SETCONCURRENCY
{"thread_concurrency", (char*) &concurrency, SHOW_LONG},
#endif
{"thread_stack", (char*) &thread_stack, SHOW_LONG},
- {"thread_cache_size", (char*) &thread_cache_size, SHOW_LONG},
#ifdef HAVE_TZNAME
{"timezone", time_zone, SHOW_CHAR},
#endif
@@ -3394,7 +3398,7 @@ static int get_service_parameters()
else if ( lstrcmp(szKeyValueName, TEXT("ShowDatabase")) == 0 )
{
CHECK_KEY_TYPE( REG_DWORD, szKeyValueName );
- opt_disable_networking = !(*lpdwValue);
+ opt_skip_show_db = !(*lpdwValue);
}
else if ( lstrcmp(szKeyValueName, TEXT("HostnameCaching")) == 0 )
{
diff --git a/sql/sql_class.h b/sql/sql_class.h
index 095dad09486..23e518ab790 100644
--- a/sql/sql_class.h
+++ b/sql/sql_class.h
@@ -85,7 +85,7 @@ class MYSQL_LOG {
public:
private:
pthread_mutex_t LOCK_log, LOCK_index;
- FILE *file, *index_file;
+ File file, index_file;
time_t last_time,query_start;
char *name;
enum_log_type log_type;
diff --git a/sql/sql_insert.cc b/sql/sql_insert.cc
index 9fc47cd4dfc..ab580e7f2b2 100644
--- a/sql/sql_insert.cc
+++ b/sql/sql_insert.cc
@@ -571,7 +571,7 @@ static TABLE *delayed_get_table(THD *thd,TABLE_LIST *table_list)
thread_count++;
pthread_mutex_unlock(&LOCK_thread_count);
if (!(tmp->thd.db=my_strdup(table_list->db,MYF(MY_WME))) ||
- !(tmp->thd.query=my_strdup(table_list->real_name,MYF(MY_FAE))))
+ !(tmp->thd.query=my_strdup(table_list->real_name,MYF(MY_WME))))
{
delete tmp;
thd->fatal_error=1;
@@ -1323,7 +1323,8 @@ bool select_create::send_eof()
{
VOID(pthread_mutex_lock(&LOCK_open));
mysql_unlock_tables(thd, lock);
- hash_delete(&open_cache,(byte*) table);
+ if (!table->tmp_table)
+ hash_delete(&open_cache,(byte*) table);
lock=0; table=0;
VOID(pthread_mutex_unlock(&LOCK_open));
}
@@ -1341,7 +1342,8 @@ void select_create::abort()
if (table)
{
enum db_type table_type=table->db_type;
- hash_delete(&open_cache,(byte*) table);
+ if (!table->tmp_table)
+ hash_delete(&open_cache,(byte*) table);
quick_rm_table(table_type,db,name);
table=0;
}
diff --git a/sql/sql_lex.h b/sql/sql_lex.h
index aa1a326cad7..33dc8853c13 100644
--- a/sql/sql_lex.h
+++ b/sql/sql_lex.h
@@ -34,19 +34,23 @@ class LEX_COLUMN;
#endif
enum enum_sql_command {
- SQLCOM_SELECT,SQLCOM_CREATE_TABLE,SQLCOM_CREATE_INDEX,SQLCOM_ALTER_TABLE,
- SQLCOM_UPDATE,SQLCOM_INSERT,SQLCOM_INSERT_SELECT,SQLCOM_DELETE,
- SQLCOM_DROP_TABLE,SQLCOM_DROP_INDEX,SQLCOM_SHOW_DATABASES,
- SQLCOM_SHOW_TABLES,SQLCOM_SHOW_FIELDS,SQLCOM_SHOW_KEYS,
+ SQLCOM_SELECT, SQLCOM_CREATE_TABLE, SQLCOM_CREATE_INDEX, SQLCOM_ALTER_TABLE,
+ SQLCOM_UPDATE, SQLCOM_INSERT, SQLCOM_INSERT_SELECT,
+ SQLCOM_DELETE, SQLCOM_TRUNCATE, SQLCOM_DROP_TABLE, SQLCOM_DROP_INDEX,
+
+ SQLCOM_SHOW_DATABASES, SQLCOM_SHOW_TABLES, SQLCOM_SHOW_FIELDS,
+ SQLCOM_SHOW_KEYS, SQLCOM_SHOW_VARIABLES, SQLCOM_SHOW_STATUS,
+ SQLCOM_SHOW_PROCESSLIST, SQLCOM_SHOW_MASTER_STAT, SQLCOM_SHOW_SLAVE_STAT,
+ SQLCOM_SHOW_GRANTS, SQLCOM_SHOW_CREATE,
+
SQLCOM_LOAD,SQLCOM_SET_OPTION,SQLCOM_LOCK_TABLES,SQLCOM_UNLOCK_TABLES,
SQLCOM_GRANT, SQLCOM_CHANGE_DB, SQLCOM_CREATE_DB, SQLCOM_DROP_DB,
- SQLCOM_REPAIR, SQLCOM_REPLACE, SQLCOM_REPLACE_SELECT, SQLCOM_SHOW_VARIABLES,
- SQLCOM_SHOW_STATUS, SQLCOM_CREATE_FUNCTION, SQLCOM_DROP_FUNCTION,
- SQLCOM_SHOW_PROCESSLIST,SQLCOM_REVOKE,SQLCOM_OPTIMIZE, SQLCOM_CHECK,
- SQLCOM_FLUSH, SQLCOM_KILL, SQLCOM_SHOW_GRANTS, SQLCOM_ANALYZE,
+ SQLCOM_REPAIR, SQLCOM_REPLACE, SQLCOM_REPLACE_SELECT,
+ SQLCOM_CREATE_FUNCTION, SQLCOM_DROP_FUNCTION,
+ SQLCOM_REVOKE,SQLCOM_OPTIMIZE, SQLCOM_CHECK,
+ SQLCOM_FLUSH, SQLCOM_KILL, SQLCOM_ANALYZE,
SQLCOM_ROLLBACK, SQLCOM_COMMIT, SQLCOM_SLAVE_START, SQLCOM_SLAVE_STOP,
- SQLCOM_BEGIN, SQLCOM_LOAD_MASTER_TABLE, SQLCOM_SHOW_CREATE,
- SQLCOM_SHOW_MASTER_STAT, SQLCOM_SHOW_SLAVE_STAT, SQLCOM_CHANGE_MASTER,
+ SQLCOM_BEGIN, SQLCOM_LOAD_MASTER_TABLE, SQLCOM_CHANGE_MASTER,
SQLCOM_RENAME_TABLE, SQLCOM_BACKUP_TABLE, SQLCOM_RESTORE_TABLE,
SQLCOM_RESET
};
diff --git a/sql/sql_load.cc b/sql/sql_load.cc
index 633855a18fa..9bf3346e61d 100644
--- a/sql/sql_load.cc
+++ b/sql/sql_load.cc
@@ -158,7 +158,7 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
unpack_filename(name,ex->file_name);
#ifndef __WIN__
MY_STAT stat_info;
- if (!my_stat(name,&stat_info,MYF(MY_FAE)))
+ if (!my_stat(name,&stat_info,MYF(MY_WME)))
DBUG_RETURN(-1);
// the file must be:
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 359ed495a83..c76a6be2d26 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -71,6 +71,20 @@ static void init_signals(void)
}
#endif
+static inline bool end_active_trans(THD *thd)
+{
+ if (!(thd->options & OPTION_AUTO_COMMIT) ||
+ (thd->options & OPTION_BEGIN))
+ {
+ if (ha_commit(thd))
+ return 1;
+ thd->options&= ~OPTION_BEGIN;
+ thd->server_status&= ~SERVER_STATUS_IN_TRANS;
+ }
+ return 0;
+}
+
+
/*
** Check if user is ok
** Updates:
@@ -1143,7 +1157,7 @@ mysql_execute_command(void)
}
}
/* ALTER TABLE ends previous transaction */
- if (!(thd->options & OPTION_AUTO_COMMIT) && ha_commit(thd))
+ if (end_active_trans(thd))
res= -1;
else
res= mysql_alter_table(thd, lex->db, lex->name,
@@ -1347,6 +1361,7 @@ mysql_execute_command(void)
break;
}
case SQLCOM_DELETE:
+ case SQLCOM_TRUNCATE:
{
if (check_access(thd,DELETE_ACL,tables->db,&tables->grant.privilege))
goto error; /* purecov: inspected */
@@ -1354,11 +1369,12 @@ mysql_execute_command(void)
goto error;
// Set privilege for the WHERE clause
tables->grant.want_privilege=(SELECT_ACL & ~tables->grant.privilege);
- res = mysql_delete(thd,tables,lex->where,lex->select_limit,
- lex->lock_option, lex->options);
-#ifdef DELETE_ITEMS
- delete lex->where;
-#endif
+ /* TRUNCATE ends previous transaction */
+ if (lex->sql_command == SQLCOM_TRUNCATE && end_active_trans(thd))
+ res= -1;
+ else
+ res = mysql_delete(thd,tables,lex->where,lex->select_limit,
+ lex->lock_option, lex->options);
break;
}
case SQLCOM_DROP_TABLE:
@@ -1699,6 +1715,11 @@ mysql_execute_command(void)
thd->server_status|= SERVER_STATUS_IN_TRANS;
break;
case SQLCOM_COMMIT:
+ /*
+ We don't use end_active_trans() here to ensure that this works
+ even if there is a problem with the OPTION_AUTO_COMMIT flag
+ (Which of course should never happen...)
+ */
thd->options&= ~OPTION_BEGIN;
thd->server_status&= ~SERVER_STATUS_IN_TRANS;
if (!ha_commit(thd))
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index d97a59cb898..7d7eab78d3b 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -2725,7 +2725,7 @@ return_zero_rows(select_result *result,TABLE_LIST *tables,List<Item> &fields,
{
for (TABLE_LIST *table=tables; table ; table=table->next)
mark_as_null_row(table->table); // All fields are NULL
- if (having && having->val_int() == 0.0)
+ if (having && having->val_int() == 0)
send_row=0;
}
if (!tables || !(result->send_fields(fields,1)))
@@ -3204,6 +3204,7 @@ Field *create_tmp_field(TABLE *table,Item *item, Item::Type type,
case Item::REAL_ITEM:
case Item::STRING_ITEM:
case Item::REF_ITEM:
+ case Item::NULL_ITEM:
{
bool maybe_null=item->maybe_null;
Field *new_field;
@@ -4501,7 +4502,7 @@ end_send(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
if (!end_of_records)
{
int error;
- if (join->having && join->having->val_int() == 0.0)
+ if (join->having && join->having->val_int() == 0)
DBUG_RETURN(0); // Didn't match having
if (join->procedure)
error=join->procedure->send_row(*join->fields);
@@ -4541,7 +4542,7 @@ end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
int error;
if (join->procedure)
{
- if (join->having && join->having->val_int() == 0.0)
+ if (join->having && join->having->val_int() == 0)
error= -1; // Didn't satisfy having
else
error=join->procedure->send_row(*join->fields) ? 1 : 0;
@@ -4552,7 +4553,7 @@ end_send_group(JOIN *join, JOIN_TAB *join_tab __attribute__((unused)),
{
if (!join->first_record)
clear_tables(join);
- if (join->having && join->having->val_int() == 0.0)
+ if (join->having && join->having->val_int() == 0)
error= -1; // Didn't satisfy having
else
error=join->result->send_data(*join->fields) ? 1 : 0;
@@ -5111,7 +5112,7 @@ create_sort_index(JOIN_TAB *tab,ORDER *order,ha_rows select_limit)
goto err; /* purecov: inspected */
/* It's not fatal if the following alloc fails */
table->io_cache=(IO_CACHE*) my_malloc(sizeof(IO_CACHE),
- MYF(MY_FAE | MY_ZEROFILL));
+ MYF(MY_WME | MY_ZEROFILL));
table->status=0; // May be wrong if quick_select
// If table has a range, move it to select
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index 4b404081676..42ac943e369 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -110,6 +110,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%token SLAVE
%token START_SYM
%token STOP_SYM
+%token TRUNCATE_SYM
%token ROLLBACK_SYM
%token OPTIMIZE
%token SHOW
@@ -492,9 +493,10 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%type <NONE>
query verb_clause create change select drop insert replace insert2
- insert_values update delete show describe load alter optimize flush
+ insert_values update delete truncate rename
+ show describe load alter optimize flush
reset begin commit rollback slave master_def master_defs
- repair restore backup analyze check rename
+ repair restore backup analyze check
field_list field_list_item field_spec kill
select_item_list select_item values_list no_braces
limit_clause delete_limit_clause fields opt_values values
@@ -560,6 +562,7 @@ verb_clause:
| set
| slave
| show
+ | truncate
| unlock
| update
| use
@@ -787,7 +790,7 @@ field_list_item:
Lex->key_list.push_back(new Key($1,$2,Lex->col_list));
Lex->col_list.empty(); /* Alloced by sql_alloc */
}
- | opt_constraint FOREIGN KEY_SYM '(' key_list ')' references
+ | opt_constraint FOREIGN KEY_SYM opt_ident '(' key_list ')' references
{
Lex->col_list.empty(); /* Alloced by sql_alloc */
}
@@ -1553,7 +1556,8 @@ simple_expr:
{ $$= new Item_func_trim($6,$4); }
| TRIM '(' expr FROM expr ')'
{ $$= new Item_func_trim($5,$3); }
-
+ | TRUNCATE_SYM '(' expr ',' expr ')'
+ { $$= new Item_func_round($3,$5,1); }
| UDA_CHAR_SUM '(' udf_expr_list ')'
{
if ($3 != NULL)
@@ -2125,6 +2129,11 @@ opt_delete_option:
QUICK { Lex->options|= OPTION_QUICK; }
| LOW_PRIORITY { Lex->lock_option= TL_WRITE_LOW_PRIORITY; }
+truncate:
+ TRUNCATE_SYM TABLE_SYM table
+ { Lex->sql_command= SQLCOM_TRUNCATE; Lex->options=0;
+ Lex->lock_option= current_thd->update_lock_default; }
+
/* Show things */
show: SHOW { Lex->wild=0;} show_param
@@ -2513,6 +2522,7 @@ keyword:
| STRING_SYM {}
| TEMPORARY {}
| TEXT_SYM {}
+ | TRUNCATE_SYM {}
| TIMESTAMP {}
| TIME_SYM {}
| TYPE_SYM {}
diff --git a/sql/violite.c b/sql/violite.c
index b18de053b5a..4efda9f3b90 100644
--- a/sql/violite.c
+++ b/sql/violite.c
@@ -1,18 +1,19 @@
/* Copyright (C) 2000 MySQL AB & MySQL Finland AB & TCX DataKonsult AB
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
- This program is distributed in the hope that it will be useful,
+ This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA */
/*
Note that we can't have assertion on file descriptors; The reason for
@@ -31,6 +32,9 @@
#include <my_sys.h>
#include <my_net.h>
#include <m_string.h>
+#ifdef HAVE_POLL
+#include <sys/poll.h>
+#endif
#if defined(__EMX__)
#include <sys/ioctl.h>
@@ -398,4 +402,26 @@ void vio_in_addr(Vio *vio, struct in_addr *in)
DBUG_VOID_RETURN;
}
+
+/* Return 0 if there is data to be read */
+
+my_bool vio_poll_read(Vio *vio,uint timeout)
+{
+#ifndef HAVE_POLL
+ return 0;
+#else
+ struct pollfd fds;
+ int res;
+ DBUG_ENTER("vio_poll");
+ fds.fd=vio->sd;
+ fds.events=POLLIN;
+ fds.revents=0;
+ if ((res=poll(&fds,1,(int) timeout*1000)) <= 0)
+ {
+ DBUG_RETURN(res < 0 ? 0 : 1); /* Don't return 1 on errors */
+ }
+ DBUG_RETURN(fds.revents & POLLIN ? 0 : 1);
+#endif
+}
+
#endif /* HAVE_VIO */
diff --git a/strings/strstr-sparc.s b/strings/strstr-sparc.s
index d0d3659b1f8..ad92068cb55 100644
--- a/strings/strstr-sparc.s
+++ b/strings/strstr-sparc.s
@@ -31,12 +31,12 @@ strstr:
! if (*str++ == *search) {
! i=(char*) str; j=(char*) search+1;
- ldsb [%o1],%g6 ! g6= First char of search
+ ldsb [%o1],%o2 ! o2= First char of search
.top:
ldsb [%o0],%g3 ! g3= First char of rest of str
cmp %g3,0
be .abort ! Found end null ;
- cmp %g3,%g6
+ cmp %g3,%o2
bne .top
add %o0,1,%o0