Merge rurik.mysql.com:/home/igor/mysql-5.0
into rurik.mysql.com:/home/igor/dev/mysql-5.0-0
This commit is contained in:
commit
d64bdafb4c
@ -74,6 +74,7 @@ Docs/safe-mysql.xml
|
||||
Docs/tex.fmt
|
||||
Docs/texi2dvi.out
|
||||
INSTALL-SOURCE
|
||||
INSTALL-WIN-SOURCE
|
||||
Logs/*
|
||||
MIRRORS
|
||||
Makefile
|
||||
@ -482,6 +483,7 @@ mysql-test/gmon.out
|
||||
mysql-test/install_test_db
|
||||
mysql-test/mysql-test-run
|
||||
mysql-test/r/*.reject
|
||||
mysql-test/r/index_merge_load.result
|
||||
mysql-test/r/rpl000001.eval
|
||||
mysql-test/r/rpl000002.eval
|
||||
mysql-test/r/rpl000014.eval
|
||||
@ -492,6 +494,7 @@ mysql-test/r/slave-running.eval
|
||||
mysql-test/r/slave-stopped.eval
|
||||
mysql-test/share/mysql
|
||||
mysql-test/std_data/*.pem
|
||||
mysql-test/t/index_merge.load
|
||||
mysql-test/var/*
|
||||
mysql.kdevprj
|
||||
mysql.proj
|
||||
@ -646,5 +649,3 @@ vio/test-ssl
|
||||
vio/test-sslclient
|
||||
vio/test-sslserver
|
||||
vio/viotest-ssl
|
||||
mysql-test/r/index_merge_load.result
|
||||
mysql-test/t/index_merge.load
|
||||
|
@ -9,6 +9,7 @@ acurtis@pcgem.rdg.cyberkinetica.com
|
||||
administrador@light.hegel.local
|
||||
ahlentz@co3064164-a.rochd1.qld.optusnet.com.au
|
||||
akishkin@work.mysql.com
|
||||
antony@ltantony.rdg.cyberkinetica.homeunix.net
|
||||
arjen@co3064164-a.bitbike.com
|
||||
arjen@fred.bitbike.com
|
||||
arjen@george.bitbike.com
|
||||
|
@ -26,7 +26,7 @@ EXTRA_DIST = $(noinst_SCRIPTS) $(BUILT_SOURCES) mysqld_error.txt \
|
||||
|
||||
all: $(targets) txt_files
|
||||
|
||||
txt_files: ../INSTALL-SOURCE ../COPYING \
|
||||
txt_files: ../INSTALL-SOURCE ../COPYING ../INSTALL-WIN-SOURCE \
|
||||
INSTALL-BINARY ../support-files/MacOSX/ReadMe.txt
|
||||
|
||||
CLEAN_FILES: $(BUILD_SOURCES)
|
||||
@ -194,6 +194,9 @@ GT = $(srcdir)/Support/generate-text-files.pl
|
||||
../INSTALL-SOURCE: mysql.info $(GT)
|
||||
perl -w $(GT) mysql.info "Installing" "Tutorial" > $@
|
||||
|
||||
../INSTALL-WIN-SOURCE: mysql.info $(GT)
|
||||
perl -w $(GT) mysql.info "Windows source build" "Post-installation" > $@
|
||||
|
||||
# We put the description for the binary installation here so that
|
||||
# people who download source wont have to see it. It is moved up to
|
||||
# the toplevel by the script that makes the binary tar files.
|
||||
|
@ -1,221 +0,0 @@
|
||||
#########################################################
|
||||
# #
|
||||
# HOWTO : INSTALL MySQL FROM SOURCE #
|
||||
# WINDOWS PORT #
|
||||
# #
|
||||
# Copyright (C) MySQL AB 1995-2003 #
|
||||
#########################################################
|
||||
|
||||
This is a simple 'HOWTO' document describing how to
|
||||
build MySQL binaries for versions 4.1 and above on
|
||||
Windows. Instructions are provided for building binaries
|
||||
from a standard source distribution or from the BitKeeper
|
||||
tree that contains the latest development source.
|
||||
|
||||
---------------------------------------------------------
|
||||
NOTE
|
||||
---------------------------------------------------------
|
||||
|
||||
Normally, it is best to use precompiled binary distributions
|
||||
of MySQL that are built specifically for optimal performance
|
||||
on Windows by MySQL AB. Binary distributions are available
|
||||
from:
|
||||
|
||||
http://www.mysql.com/downloads/
|
||||
|
||||
The instructions in this document are strictly for users
|
||||
who want to test MySQL on Windows from the latest source or
|
||||
from the BitKeeper tree, and for internal MySQL developers.
|
||||
|
||||
--------------------------------------------------------
|
||||
TABLE OF CONTENTS
|
||||
--------------------------------------------------------
|
||||
1. REQUIREMENTS
|
||||
2. OBTAINING A WINDOWS SOURCE DISTRIBUTION
|
||||
3. CREATING A SOURCE PACKAGE FROM THE 'BitKeeper' TREE
|
||||
4. BUILDING 'mysql server and clients' FROM VC++ WORKSPACE
|
||||
5. BUILDING FROM 'nmake' MAKEFILES
|
||||
6. STARTING THE MYSQL SERVER FOR THE FIRST TIME
|
||||
7. TESTING THE CONNECTION
|
||||
8. SPECIAL NOTES AND CONSIDERATIONS
|
||||
|
||||
-------------------------------------------------------
|
||||
1. REQUIREMENTS
|
||||
-------------------------------------------------------
|
||||
|
||||
To build MySQL on Windows from source, you need the
|
||||
following compiler and resources available on your Windows
|
||||
system:
|
||||
|
||||
- Microsoft Visual C++ 6.0 and above
|
||||
- ~45 MB disk space
|
||||
- 64 MB RAM
|
||||
|
||||
You'll also need a MySQL source distribution, which you
|
||||
can obtain as described in section 2.
|
||||
|
||||
-------------------------------------------------------
|
||||
2. OBTAINING A WINDOWS SOURCE DISTRIBUTION
|
||||
-------------------------------------------------------
|
||||
|
||||
There are two ways you can get a Windows source distribution
|
||||
for MySQL version 4.1 and above:
|
||||
|
||||
I. Obtain a MySQL AB-distributed source distribution for the
|
||||
particular version of MySQL in which you are interested.
|
||||
Prepackaged source distributions are available for released
|
||||
versions of MySQL and can be obtained from:
|
||||
|
||||
http://www.mysql.com/downloads/
|
||||
|
||||
II. Alternatively, you can package a source distribution
|
||||
yourself from the latest BitKeeper developer source
|
||||
tree. If you plan to do this, you must create the
|
||||
package on a Unix system and then transfer it to your
|
||||
Windows system. (The reason for this is that some of the
|
||||
configuration and build steps require tools that work only
|
||||
on Unix.) The BitKeeper approach thus requires:
|
||||
|
||||
- A system running Unix, or a Unix-like system such as Linux
|
||||
- BitKeeper 3.0 installed on that system (you can obtain
|
||||
BitKeeper from http://www.bitkeeper.com)
|
||||
|
||||
If you are using the first option, you can skip the next
|
||||
section and go directly to "BUILDING 'mysql server & clients'
|
||||
FROM VC++ WORKSPACE"
|
||||
|
||||
-------------------------------------------------------
|
||||
3. CREATING A SOURCE PACKAGE FROM THE 'BitKeeper' TREE
|
||||
-------------------------------------------------------
|
||||
|
||||
To build the latest Windows source package from the current
|
||||
BitKeeper source tree, use the following instructions. Please
|
||||
note that this procedure must be performed on a system
|
||||
running a Unix or Unix-like operating system. (The procedure
|
||||
is known to work well on Linux, for example.)
|
||||
|
||||
- Clone the BitKeeper source tree for MySQL (version 4.1
|
||||
or above, as desired). For more information how to clone
|
||||
the source tree, see the instructions at:
|
||||
|
||||
http://www.mysql.com/doc/en/Installing_source_tree.html
|
||||
|
||||
- Configure and build the distribution so that you have a
|
||||
server binary to work with. One way to do this is to run
|
||||
the following command in the top-level directory of your
|
||||
source tree:
|
||||
|
||||
./BUILD/compile-pentium-max
|
||||
|
||||
- After making sure that the build process completed successfully,
|
||||
run the following utility script from top-level directory
|
||||
of your source tree:
|
||||
|
||||
./scripts/make_win_src_distribution
|
||||
|
||||
This script creates a Windows source package, to be used on
|
||||
your Windows system. You can supply different options to the
|
||||
script based on your needs. It accepts the following options:
|
||||
|
||||
--debug Debug, without creating the package
|
||||
--tmp Specify the temporary location
|
||||
--suffix Suffix name for the package
|
||||
--dirname Directory name to copy files (intermediate)
|
||||
--silent Do not list verbosely files processed
|
||||
--tar Create tar.gz package instead of .zip
|
||||
--help Show this help message
|
||||
|
||||
By default, make_win_src_distribution creates a zipped
|
||||
archive with the name mysql-$version-win-src.zip, where
|
||||
$version represents the version of your MySQL source tree.
|
||||
|
||||
- Copy or upload to your Windows machine the Windows source
|
||||
package that you have just created. To compile it, use
|
||||
the instructions in the next section.
|
||||
|
||||
---------------------------------------------------------
|
||||
4. BUILDING 'mysql server & clients' FROM VC++ WORKSPACE
|
||||
---------------------------------------------------------
|
||||
|
||||
NOTE: MySQL 4.1 and above VC++ workspace files are compatible
|
||||
with Microsoft Visual Studio 6.0 and above(7.0/.NET)
|
||||
editions and tested by MySQL folks before each
|
||||
release.
|
||||
|
||||
Unpack the Windows source zipped archive to a folder and open
|
||||
mysql.dsw from your top-level directory.
|
||||
|
||||
If you want to build both release and debug versions, then
|
||||
select 'build' -> 'buildall' option. To build only release
|
||||
or debug versions, select all appropriate workspaces from
|
||||
the 'build' -> 'batch build' option.
|
||||
|
||||
The simplest solution to building the basic clients and core
|
||||
server is to set your current active workspace as 'mysqld'
|
||||
release or debug version, and just hit 'build' or 'F7', which
|
||||
creates the necessary client binaries in the 'client_release'
|
||||
or 'client_debug' directories. The libraries are placed in the
|
||||
'lib_release' and 'lib_debug' directories for release and
|
||||
debug versions, respectively.
|
||||
|
||||
Now you have built the distribution. If you get any compiler
|
||||
errors, please cross check and email the compiler output to
|
||||
win32@lists.mysql.com for further assistance.
|
||||
|
||||
---------------------------------------------------------
|
||||
5. BUILDING FROM 'nmake' MAKEFILES
|
||||
---------------------------------------------------------
|
||||
TODO from MySQL PIEFU team.
|
||||
|
||||
---------------------------------------------------------
|
||||
6. STARTING THE MYSQL SERVER FOR THE FIRST TIME
|
||||
---------------------------------------------------------
|
||||
|
||||
The server built using the preceding instructions will
|
||||
expect that the MySQL base directory and data directory
|
||||
are C:\mysql and C:\mysql\data by default. If you want to
|
||||
test your server using the source root directory and its
|
||||
data directory as the base directory and data directory,
|
||||
you will need to tell the server their pathnames. You can
|
||||
either do this on the command line with the --basedir
|
||||
and --data-dir options, or place appropriate options in
|
||||
an option file (C:\my.cnf or the my.ini file in your
|
||||
Windows directory). If you have an existing data directory
|
||||
elsewhere that you want to use, you can specify its pathname
|
||||
instead.
|
||||
|
||||
Start your server from the 'client_release' or 'client_debug'
|
||||
directory (depending on which server you want to use). The
|
||||
general instructions are given here:
|
||||
|
||||
http://www.mysql.com/doc/en/Windows_installation.html
|
||||
|
||||
You'll have to adapt the instructions appropriately if you
|
||||
want to use a different base directory and/or data directory.
|
||||
|
||||
That's all!!! See, it's as simple to build MySQL on Windows
|
||||
as on any other platform!!!
|
||||
|
||||
---------------------------------------------------------
|
||||
7. TESTING THE CONNECTION
|
||||
---------------------------------------------------------
|
||||
|
||||
Once the server is running in standalone fashion or as a
|
||||
service based on your configuration, try to connect to it
|
||||
from the 'mysql' command line SQL interactive utility that
|
||||
exists in your 'client_release' or 'client_debug' directory.
|
||||
|
||||
---------------------------------------------------------
|
||||
8. SPECIAL NOTES AND CONSIDERATIONS
|
||||
---------------------------------------------------------
|
||||
|
||||
- For production use, MySQL AB does not advise using a MySQL
|
||||
server built by yourself from source. It is preferable to
|
||||
stick to using binaries shipped by MySQL AB.
|
||||
|
||||
- If you find something not working as expected, or you have
|
||||
suggestions about ways to improve the current build process
|
||||
on Windows, please email to win32@lists.mysql.com.
|
||||
|
||||
Thanks
|
||||
MySQL Team
|
@ -340,3 +340,38 @@ inline double ulonglong2double(ulonglong value)
|
||||
#define default_shared_memory_base_name "MYSQL"
|
||||
#define MYSQL_DEFAULT_CHARSET_NAME "latin1"
|
||||
#define MYSQL_DEFAULT_COLLATION_NAME "latin1_swedish_ci"
|
||||
|
||||
/* Define charsets you want */
|
||||
/* #undef HAVE_CHARSET_armscii8 */
|
||||
/* #undef HAVE_CHARSET_ascii */
|
||||
#define HAVE_CHARSET_big5 1
|
||||
#define HAVE_CHARSET_cp1250 1
|
||||
/* #undef HAVE_CHARSET_cp1251 */
|
||||
/* #undef HAVE_CHARSET_cp1256 */
|
||||
/* #undef HAVE_CHARSET_cp1257 */
|
||||
/* #undef HAVE_CHARSET_cp850 */
|
||||
/* #undef HAVE_CHARSET_cp852 */
|
||||
/* #undef HAVE_CHARSET_cp866 */
|
||||
/* #undef HAVE_CHARSET_dec8 */
|
||||
#define HAVE_CHARSET_euckr 1
|
||||
#define HAVE_CHARSET_gb2312 1
|
||||
#define HAVE_CHARSET_gbk 1
|
||||
/* #undef HAVE_CHARSET_greek */
|
||||
/* #undef HAVE_CHARSET_hebrew */
|
||||
/* #undef HAVE_CHARSET_hp8 */
|
||||
/* #undef HAVE_CHARSET_keybcs2 */
|
||||
/* #undef HAVE_CHARSET_koi8r */
|
||||
/* #undef HAVE_CHARSET_koi8u */
|
||||
#define HAVE_CHARSET_latin1 1
|
||||
#define HAVE_CHARSET_latin2 1
|
||||
/* #undef HAVE_CHARSET_latin5 */
|
||||
/* #undef HAVE_CHARSET_latin7 */
|
||||
/* #undef HAVE_CHARSET_macce */
|
||||
/* #undef HAVE_CHARSET_macroman */
|
||||
#define HAVE_CHARSET_sjis 1
|
||||
/* #undef HAVE_CHARSET_swe7 */
|
||||
#define HAVE_CHARSET_tis620 1
|
||||
#define HAVE_CHARSET_ucs2 1
|
||||
#define HAVE_CHARSET_ujis 1
|
||||
#define HAVE_CHARSET_utf8 1
|
||||
|
||||
|
@ -26,8 +26,8 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define FT_QUERY_MAXLEN 1024
|
||||
#define HA_FT_MAXLEN 254
|
||||
#define HA_FT_MAXBYTELEN 254
|
||||
#define HA_FT_MAXCHARLEN (HA_FT_MAXBYTELEN/3)
|
||||
|
||||
typedef struct st_ft_info FT_INFO;
|
||||
struct _ft_vft
|
||||
|
@ -301,36 +301,38 @@
|
||||
#define ER_BAD_FT_COLUMN 1282
|
||||
#define ER_UNKNOWN_KEY_CACHE 1283
|
||||
#define ER_WARN_HOSTNAME_WONT_WORK 1284
|
||||
#define ER_SP_NO_RECURSIVE_CREATE 1285
|
||||
#define ER_SP_ALREADY_EXISTS 1286
|
||||
#define ER_SP_DOES_NOT_EXIST 1287
|
||||
#define ER_SP_DROP_FAILED 1288
|
||||
#define ER_SP_STORE_FAILED 1289
|
||||
#define ER_SP_LILABEL_MISMATCH 1290
|
||||
#define ER_SP_LABEL_REDEFINE 1291
|
||||
#define ER_SP_LABEL_MISMATCH 1292
|
||||
#define ER_SP_UNINIT_VAR 1293
|
||||
#define ER_SP_BADSELECT 1294
|
||||
#define ER_SP_BADRETURN 1295
|
||||
#define ER_SP_BADSTATEMENT 1296
|
||||
#define ER_UPDATE_LOG_DEPRECATED_IGNORED 1297
|
||||
#define ER_UPDATE_LOG_DEPRECATED_TRANSLATED 1298
|
||||
#define ER_QUERY_INTERRUPTED 1299
|
||||
#define ER_SP_WRONG_NO_OF_ARGS 1300
|
||||
#define ER_SP_COND_MISMATCH 1301
|
||||
#define ER_SP_NORETURN 1302
|
||||
#define ER_SP_NORETURNEND 1303
|
||||
#define ER_SP_BAD_CURSOR_QUERY 1304
|
||||
#define ER_SP_BAD_CURSOR_SELECT 1305
|
||||
#define ER_SP_CURSOR_MISMATCH 1306
|
||||
#define ER_SP_CURSOR_ALREADY_OPEN 1307
|
||||
#define ER_SP_CURSOR_NOT_OPEN 1308
|
||||
#define ER_SP_UNDECLARED_VAR 1309
|
||||
#define ER_SP_WRONG_NO_OF_FETCH_ARGS 1310
|
||||
#define ER_SP_FETCH_NO_DATA 1311
|
||||
#define ER_SP_DUP_PARAM 1312
|
||||
#define ER_SP_DUP_VAR 1313
|
||||
#define ER_SP_DUP_COND 1314
|
||||
#define ER_SP_DUP_CURS 1315
|
||||
#define ER_SP_CANT_ALTER 1316
|
||||
#define ER_ERROR_MESSAGES 317
|
||||
#define ER_UNKNOWN_TABLE_ENGINE 1285
|
||||
#define ER_SP_NO_RECURSIVE_CREATE 1286
|
||||
#define ER_SP_ALREADY_EXISTS 1287
|
||||
#define ER_SP_DOES_NOT_EXIST 1288
|
||||
#define ER_SP_DROP_FAILED 1289
|
||||
#define ER_SP_STORE_FAILED 1290
|
||||
#define ER_SP_LILABEL_MISMATCH 1291
|
||||
#define ER_SP_LABEL_REDEFINE 1292
|
||||
#define ER_SP_LABEL_MISMATCH 1293
|
||||
#define ER_SP_UNINIT_VAR 1294
|
||||
#define ER_SP_BADSELECT 1295
|
||||
#define ER_SP_BADRETURN 1296
|
||||
#define ER_SP_BADSTATEMENT 1297
|
||||
#define ER_UPDATE_LOG_DEPRECATED_IGNORED 1298
|
||||
#define ER_UPDATE_LOG_DEPRECATED_TRANSLATED 1299
|
||||
#define ER_QUERY_INTERRUPTED 1300
|
||||
#define ER_SP_WRONG_NO_OF_ARGS 1301
|
||||
#define ER_SP_COND_MISMATCH 1302
|
||||
#define ER_SP_NORETURN 1303
|
||||
#define ER_SP_NORETURNEND 1304
|
||||
#define ER_SP_BAD_CURSOR_QUERY 1305
|
||||
#define ER_SP_BAD_CURSOR_SELECT 1306
|
||||
#define ER_SP_CURSOR_MISMATCH 1307
|
||||
#define ER_SP_CURSOR_ALREADY_OPEN 1308
|
||||
#define ER_SP_CURSOR_NOT_OPEN 1309
|
||||
#define ER_SP_UNDECLARED_VAR 1310
|
||||
#define ER_SP_WRONG_NO_OF_FETCH_ARGS 1311
|
||||
#define ER_SP_FETCH_NO_DATA 1312
|
||||
#define ER_SP_DUP_PARAM 1313
|
||||
#define ER_SP_DUP_VAR 1314
|
||||
#define ER_SP_DUP_COND 1315
|
||||
#define ER_SP_DUP_CURS 1316
|
||||
#define ER_SP_CANT_ALTER 1317
|
||||
#define ER_SP_SUBSELECT_NYI 1318
|
||||
#define ER_ERROR_MESSAGES 319
|
||||
|
@ -161,6 +161,7 @@ ER_WARN_DATA_OUT_OF_RANGE, "01000", "",
|
||||
ER_WARN_DATA_TRUNCATED, "01000", "",
|
||||
ER_WRONG_NAME_FOR_INDEX, "42000", "",
|
||||
ER_WRONG_NAME_FOR_CATALOG, "42000", "",
|
||||
ER_UNKNOWN_TABLE_ENGINE, "42000", "",
|
||||
/* 5.0 */
|
||||
ER_SP_NO_RECURSIVE_CREATE, "2F003", "",
|
||||
ER_SP_ALREADY_EXISTS, "42000", "",
|
||||
@ -194,3 +195,4 @@ ER_SP_DUP_VAR, "42000", "",
|
||||
ER_SP_DUP_COND, "42000", "",
|
||||
ER_SP_DUP_CURS, "42000", "",
|
||||
/*ER_SP_CANT_ALTER*/
|
||||
ER_SP_SUBSELECT_NYI, "0A000", "",
|
||||
|
@ -29,7 +29,7 @@ static my_bool verbose;
|
||||
static char *query=NULL;
|
||||
static uint lengths[256];
|
||||
|
||||
#define MAX_LEN (HA_FT_MAXLEN+10)
|
||||
#define MAX_LEN (HA_FT_MAXBYTELEN+10)
|
||||
#define HOW_OFTEN_TO_WRITE 10000
|
||||
|
||||
static struct my_option my_long_options[] =
|
||||
|
@ -19,7 +19,7 @@
|
||||
#include "ftdefs.h"
|
||||
|
||||
ulong ft_min_word_len=4;
|
||||
ulong ft_max_word_len=HA_FT_MAXLEN;
|
||||
ulong ft_max_word_len=HA_FT_MAXCHARLEN;
|
||||
ulong ft_query_expansion_limit=5;
|
||||
const char *ft_boolean_syntax="+ -><()~*:\"\"&|";
|
||||
|
||||
@ -29,7 +29,7 @@ const HA_KEYSEG ft_keysegs[FT_SEGS]={
|
||||
63, /* language (will be overwritten) */
|
||||
0, 0, 0, /* null_bit, bit_start, bit_end */
|
||||
HA_VAR_LENGTH | HA_PACK_KEY, /* flag */
|
||||
HA_FT_MAXLEN, /* length */
|
||||
HA_FT_MAXBYTELEN, /* length */
|
||||
HA_FT_WLEN, /* start */
|
||||
0, /* null_pos */
|
||||
NULL /* charset */
|
||||
|
@ -279,7 +279,7 @@ int _mi_ft_del(MI_INFO *info, uint keynr, byte *keybuf, const byte *record,
|
||||
uint _ft_make_key(MI_INFO *info, uint keynr, byte *keybuf, FT_WORD *wptr,
|
||||
my_off_t filepos)
|
||||
{
|
||||
byte buf[HA_FT_MAXLEN+16];
|
||||
byte buf[HA_FT_MAXBYTELEN+16];
|
||||
DBUG_ENTER("_ft_make_key");
|
||||
|
||||
#if HA_FT_WTYPE == HA_KEYTYPE_FLOAT
|
||||
|
@ -1979,7 +1979,7 @@ int mi_repair_by_sort(MI_CHECK *param, register MI_INFO *info,
|
||||
|
||||
sort_param.key_read=sort_ft_key_read;
|
||||
sort_param.key_write=sort_ft_key_write;
|
||||
sort_param.key_length+=FT_MAX_WORD_LEN_FOR_SORT-HA_FT_MAXLEN;
|
||||
sort_param.key_length+=FT_MAX_WORD_LEN_FOR_SORT-HA_FT_MAXBYTELEN;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -2375,7 +2375,7 @@ int mi_repair_parallel(MI_CHECK *param, register MI_INFO *info,
|
||||
total_key_length+=sort_param[i].key_length;
|
||||
|
||||
if (sort_param[i].keyinfo->flag & HA_FULLTEXT)
|
||||
sort_param[i].key_length+=FT_MAX_WORD_LEN_FOR_SORT-ft_max_word_len;
|
||||
sort_param[i].key_length+=FT_MAX_WORD_LEN_FOR_SORT-HA_FT_MAXBYTELEN;
|
||||
}
|
||||
sort_info.total_keys=i;
|
||||
sort_param[0].master= 1;
|
||||
@ -3913,7 +3913,7 @@ static my_bool mi_too_big_key_for_sort(MI_KEYDEF *key, ha_rows rows)
|
||||
{
|
||||
uint key_maxlength=key->maxlength;
|
||||
if (key->flag & HA_FULLTEXT)
|
||||
key_maxlength+=FT_MAX_WORD_LEN_FOR_SORT-HA_FT_MAXLEN;
|
||||
key_maxlength+=FT_MAX_WORD_LEN_FOR_SORT-HA_FT_MAXBYTELEN;
|
||||
return (key->flag & (HA_BINARY_PACK_KEY | HA_VAR_LENGTH_KEY | HA_FULLTEXT) &&
|
||||
((ulonglong) rows * key_maxlength >
|
||||
(ulonglong) myisam_max_temp_length));
|
||||
|
@ -289,9 +289,9 @@ int mi_create(const char *name,uint keys,MI_KEYDEF *keydefs,
|
||||
}
|
||||
|
||||
fulltext_keys++;
|
||||
key_length+= HA_FT_MAXLEN+HA_FT_WLEN;
|
||||
key_length+= HA_FT_MAXBYTELEN+HA_FT_WLEN;
|
||||
length++; /* At least one length byte */
|
||||
min_key_length_skipp+=HA_FT_MAXLEN;
|
||||
min_key_length_skipp+=HA_FT_MAXBYTELEN;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -322,11 +322,11 @@ static struct my_option my_long_options[] =
|
||||
{ "decode_bits", OPT_DECODE_BITS, "", (gptr*) &decode_bits,
|
||||
(gptr*) &decode_bits, 0, GET_UINT, REQUIRED_ARG, 9L, 4L, 17L, 0L, 1L, 0},
|
||||
{ "ft_min_word_len", OPT_FT_MIN_WORD_LEN, "", (gptr*) &ft_min_word_len,
|
||||
(gptr*) &ft_min_word_len, 0, GET_ULONG, REQUIRED_ARG, 4, 1, HA_FT_MAXLEN,
|
||||
(gptr*) &ft_min_word_len, 0, GET_ULONG, REQUIRED_ARG, 4, 1, HA_FT_MAXCHARLEN,
|
||||
0, 1, 0},
|
||||
{ "ft_max_word_len", OPT_FT_MAX_WORD_LEN, "", (gptr*) &ft_max_word_len,
|
||||
(gptr*) &ft_max_word_len, 0, GET_ULONG, REQUIRED_ARG, HA_FT_MAXLEN, 10,
|
||||
HA_FT_MAXLEN, 0, 1, 0},
|
||||
(gptr*) &ft_max_word_len, 0, GET_ULONG, REQUIRED_ARG, HA_FT_MAXCHARLEN, 10,
|
||||
HA_FT_MAXCHARLEN, 0, 1, 0},
|
||||
{ 0, 0, 0, 0, 0, 0, GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0}
|
||||
};
|
||||
|
||||
|
@ -156,7 +156,7 @@ int _create_index_by_sort(MI_SORT_PARAM *info,my_bool no_messages,
|
||||
while ((maxbuffer= (int) (records/(keys-1)+1)) != skr);
|
||||
|
||||
if ((sort_keys=(uchar **)my_malloc(keys*(sort_length+sizeof(char*))+
|
||||
HA_FT_MAXLEN, MYF(0))))
|
||||
HA_FT_MAXBYTELEN, MYF(0))))
|
||||
{
|
||||
if (my_init_dynamic_array(&buffpek, sizeof(BUFFPEK), maxbuffer,
|
||||
maxbuffer/2))
|
||||
@ -365,7 +365,7 @@ pthread_handler_decl(thr_find_all_keys,arg)
|
||||
}
|
||||
if ((sort_keys=(uchar **)my_malloc(keys*(sort_length+sizeof(char*))+
|
||||
((info->keyinfo->flag & HA_FULLTEXT) ?
|
||||
HA_FT_MAXLEN : 0), MYF(0))))
|
||||
HA_FT_MAXBYTELEN : 0), MYF(0))))
|
||||
{
|
||||
if (my_init_dynamic_array(&info->buffpek, sizeof(BUFFPEK),
|
||||
maxbuffer, maxbuffer/2))
|
||||
|
@ -201,17 +201,16 @@ t1 CREATE TABLE `t1` (
|
||||
) TYPE=HEAP DEFAULT CHARSET=latin1
|
||||
drop table t1;
|
||||
SET SESSION table_type="gemini";
|
||||
ERROR 42000: Unknown table engine 'gemini'
|
||||
SELECT @@table_type;
|
||||
@@table_type
|
||||
GEMINI
|
||||
HEAP
|
||||
CREATE TABLE t1 (a int not null);
|
||||
Warnings:
|
||||
Warning 1265 Using storage engine MYISAM for table 't1'
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) NOT NULL default '0'
|
||||
) TYPE=MyISAM DEFAULT CHARSET=latin1
|
||||
) TYPE=HEAP DEFAULT CHARSET=latin1
|
||||
SET SESSION table_type=default;
|
||||
drop table t1;
|
||||
create table t1 ( k1 varchar(2), k2 int, primary key(k1,k2));
|
||||
@ -347,17 +346,16 @@ t1 CREATE TABLE `t1` (
|
||||
) TYPE=HEAP DEFAULT CHARSET=latin1
|
||||
drop table t1;
|
||||
SET SESSION table_type="gemini";
|
||||
ERROR 42000: Unknown table engine 'gemini'
|
||||
SELECT @@table_type;
|
||||
@@table_type
|
||||
GEMINI
|
||||
HEAP
|
||||
CREATE TABLE t1 (a int not null);
|
||||
Warnings:
|
||||
Warning 1265 Using storage engine MYISAM for table 't1'
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) NOT NULL default '0'
|
||||
) TYPE=MyISAM DEFAULT CHARSET=latin1
|
||||
) TYPE=HEAP DEFAULT CHARSET=latin1
|
||||
SET SESSION table_type=default;
|
||||
drop table t1;
|
||||
create table t1(a int,b int,c int unsigned,d date,e char,f datetime,g time,h blob);
|
||||
|
@ -2,6 +2,6 @@ show variables like "ft\_%";
|
||||
Variable_name Value
|
||||
ft_boolean_syntax + -><()~*:""&|
|
||||
ft_min_word_len 4
|
||||
ft_max_word_len 254
|
||||
ft_max_word_len 84
|
||||
ft_query_expansion_limit 20
|
||||
ft_stopword_file (built-in)
|
||||
|
@ -188,13 +188,14 @@ ttt qqq
|
||||
NULL NULL
|
||||
NULL NULL
|
||||
2001-01-01 02:02:02 26:02:02
|
||||
SELECT TIMEDIFF(t1,t4) As ttt, TIMEDIFF(t2, t3) As qqq from test;
|
||||
ttt qqq
|
||||
-744:00:00 NULL
|
||||
26305:01:02 22:58:58
|
||||
-26305:01:02 -22:58:58
|
||||
NULL 26:02:02
|
||||
NULL NULL
|
||||
NULL NULL
|
||||
00:00:00 -24:00:00
|
||||
SELECT TIMEDIFF(t1, t4) As ttt, TIMEDIFF(t2, t3) As qqq,
|
||||
TIMEDIFF(t3, t2) As eee, TIMEDIFF(t2, t4) As rrr from test;
|
||||
ttt qqq eee rrr
|
||||
-744:00:00 NULL NULL NULL
|
||||
26305:01:02 22:58:58 -22:58:58 NULL
|
||||
-26305:01:02 -22:58:58 22:58:58 NULL
|
||||
NULL 26:02:02 26:02:02 NULL
|
||||
NULL NULL NULL NULL
|
||||
NULL NULL NULL NULL
|
||||
00:00:00 -24:00:00 24:00:00 NULL
|
||||
drop table t1, test;
|
||||
|
@ -464,6 +464,63 @@ date_add(date,INTERVAL "1 1:1" DAY_MINUTE)
|
||||
select date_add(date,INTERVAL "1 1:1:1" DAY_SECOND) from t1;
|
||||
date_add(date,INTERVAL "1 1:1:1" DAY_SECOND)
|
||||
2003-01-03 01:01:01
|
||||
select date_add(date,INTERVAL "1" WEEK) from t1;
|
||||
date_add(date,INTERVAL "1" WEEK)
|
||||
2003-01-09 00:00:00
|
||||
select date_add(date,INTERVAL "1" QUARTER) from t1;
|
||||
date_add(date,INTERVAL "1" QUARTER)
|
||||
2003-04-02
|
||||
select timestampadd(MINUTE, 1, date) from t1;
|
||||
timestampadd(MINUTE, 1, date)
|
||||
2003-01-02 00:01:00
|
||||
select timestampadd(WEEK, 1, date) from t1;
|
||||
timestampadd(WEEK, 1, date)
|
||||
2003-01-09 00:00:00
|
||||
select timestampadd(SQL_TSI_SECOND, 1, date) from t1;
|
||||
timestampadd(SQL_TSI_SECOND, 1, date)
|
||||
2003-01-02 00:00:01
|
||||
select timestampadd(SQL_TSI_FRAC_SECOND, 1, date) from t1;
|
||||
timestampadd(SQL_TSI_FRAC_SECOND, 1, date)
|
||||
2003-01-02 00:00:00.000001
|
||||
select timestampdiff(MONTH, '2001-02-01', '2001-05-01') as a;
|
||||
a
|
||||
3
|
||||
select timestampdiff(YEAR, '2002-05-01', '2001-01-01') as a;
|
||||
a
|
||||
-1
|
||||
select timestampdiff(QUARTER, '2002-05-01', '2001-01-01') as a;
|
||||
a
|
||||
-5
|
||||
select timestampdiff(MONTH, '2000-03-28', '2000-02-29') as a;
|
||||
a
|
||||
0
|
||||
select timestampdiff(MONTH, '1991-03-28', '2000-02-29') as a;
|
||||
a
|
||||
107
|
||||
select timestampdiff(SQL_TSI_WEEK, '2001-02-01', '2001-05-01') as a;
|
||||
a
|
||||
12
|
||||
select timestampdiff(SQL_TSI_HOUR, '2001-02-01', '2001-05-01') as a;
|
||||
a
|
||||
2136
|
||||
select timestampdiff(SQL_TSI_DAY, '2001-02-01', '2001-05-01') as a;
|
||||
a
|
||||
89
|
||||
select timestampdiff(SQL_TSI_MINUTE, '2001-02-01 12:59:59', '2001-05-01 12:58:59') as a;
|
||||
a
|
||||
128159
|
||||
select timestampdiff(SQL_TSI_SECOND, '2001-02-01 12:59:59', '2001-05-01 12:58:58') as a;
|
||||
a
|
||||
7689539
|
||||
select timestampdiff(SQL_TSI_FRAC_SECOND, '2001-02-01 12:59:59.120000', '2001-05-01 12:58:58.119999') as a;
|
||||
a
|
||||
7689538999999
|
||||
select timestampdiff(SQL_TSI_DAY, '1986-02-01', '1986-03-01') as a1,
|
||||
timestampdiff(SQL_TSI_DAY, '1900-02-01', '1900-03-01') as a2,
|
||||
timestampdiff(SQL_TSI_DAY, '1996-02-01', '1996-03-01') as a3,
|
||||
timestampdiff(SQL_TSI_DAY, '2000-02-01', '2000-03-01') as a4;
|
||||
a1 a2 a3 a4
|
||||
28 28 29 29
|
||||
select date_add(time,INTERVAL 1 SECOND) from t1;
|
||||
date_add(time,INTERVAL 1 SECOND)
|
||||
2006-07-08 00:00:01
|
||||
@ -508,3 +565,9 @@ id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
Warnings:
|
||||
Note 1003 select high_priority no_cache period_add(_latin1'9602',-(12)) AS `period_add("9602",-12)`,period_diff(199505,_latin1'9404') AS `period_diff(199505,"9404")`,from_days(to_days(_latin1'960101')) AS `from_days(to_days("960101"))`,dayofmonth(_latin1'1997-01-02') AS `dayofmonth("1997-01-02")`,month(_latin1'1997-01-02') AS `month("1997-01-02")`,monthname(_latin1'1972-03-04') AS `monthname("1972-03-04")`,dayofyear(_latin1'0000-00-00') AS `dayofyear("0000-00-00")`,hour(_latin1'1997-03-03 23:03:22') AS `HOUR("1997-03-03 23:03:22")`,minute(_latin1'23:03:22') AS `MINUTE("23:03:22")`,second(230322) AS `SECOND(230322)`,quarter(980303) AS `QUARTER(980303)`,week(_latin1'1998-03-03',0) AS `WEEK("1998-03-03")`,yearweek(_latin1'2000-01-01',1) AS `yearweek("2000-01-01",1)`,week(19950101,1) AS `week(19950101,1)`,year(_latin1'98-02-03') AS `year("98-02-03")`,(weekday(to_days(curdate())) - weekday(to_days(now()))) AS `weekday(curdate())-weekday(now())`,dayname(to_days(_latin1'1962-03-03')) AS `dayname("1962-03-03")`,unix_timestamp() AS `unix_timestamp()`,sec_to_time((time_to_sec(_latin1'0:30:47') / 6.21)) AS `sec_to_time(time_to_sec("0:30:47")/6.21)`,curtime() AS `curtime()`,utc_time() AS `utc_time()`,curdate() AS `curdate()`,utc_date() AS `utc_date()`,utc_timestamp() AS `utc_timestamp()`,date_format(_latin1'1997-01-02 03:04:05',_latin1'%M %W %D %Y %y %m %d %h %i %s %w') AS `date_format("1997-01-02 03:04:05", "%M %W %D %Y %y %m %d %h %i %s %w")`,from_unixtime(unix_timestamp(_latin1'1994-03-02 10:11:12')) AS `from_unixtime(unix_timestamp("1994-03-02 10:11:12"))`,(_latin1'1997-12-31 23:59:59' + interval 1 second) AS `"1997-12-31 23:59:59" + INTERVAL 1 SECOND`,(_latin1'1998-01-01 00:00:00' - interval 1 second) AS `"1998-01-01 00:00:00" - INTERVAL 1 SECOND`,(_latin1'1997-12-31' + interval 1 day) AS `INTERVAL 1 DAY + "1997-12-31"`,extract(year from _latin1'1999-01-02 10:11:12') AS `extract(YEAR FROM "1999-01-02 10:11:12")`,(_latin1'1997-12-31 23:59:59' + interval 1 second) AS `date_add("1997-12-31 23:59:59",INTERVAL 1 SECOND)`
|
||||
explain extended select timestampdiff(SQL_TSI_WEEK, '2001-02-01', '2001-05-01') as a1,
|
||||
timestampdiff(SQL_TSI_FRAC_SECOND, '2001-02-01 12:59:59.120000', '2001-05-01 12:58:58.119999') as a2;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE NULL NULL NULL NULL NULL NULL NULL No tables used
|
||||
Warnings:
|
||||
Note 1003 select high_priority timestamp_diff(WEEK,_latin1'2001-02-01',_latin1'2001-05-01') AS `a1`,timestamp_diff(SECOND_FRAC,_latin1'2001-02-01 12:59:59.120000',_latin1'2001-05-01 12:58:58.119999') AS `a2`
|
||||
|
@ -1,12 +1,14 @@
|
||||
drop table if exists t1;
|
||||
create table t1 (time time, date date, timestamp timestamp);
|
||||
insert into t1 values ("12:22:22","97:02:03","1997-01-02");
|
||||
create table t1 (time time, date date, timestamp timestamp,
|
||||
quarter int, week int, year int, timestampadd int, timestampdiff int);
|
||||
insert into t1 values ("12:22:22","97:02:03","1997-01-02",1,2,3,4,5);
|
||||
select * from t1;
|
||||
time date timestamp
|
||||
12:22:22 1997-02-03 1997-01-02 00:00:00
|
||||
select t1.time+0,t1.date+0,t1.timestamp+0,concat(date," ",time) from t1;
|
||||
t1.time+0 t1.date+0 t1.timestamp+0 concat(date," ",time)
|
||||
122222 19970203 19970102000000 1997-02-03 12:22:22
|
||||
time date timestamp quarter week year timestampadd timestampdiff
|
||||
12:22:22 1997-02-03 1997-01-02 00:00:00 1 2 3 4 5
|
||||
select t1.time+0,t1.date+0,t1.timestamp+0,concat(date," ",time),
|
||||
t1.quarter+t1.week, t1.year+timestampadd, timestampdiff from t1;
|
||||
t1.time+0 t1.date+0 t1.timestamp+0 concat(date," ",time) t1.quarter+t1.week t1.year+timestampadd timestampdiff
|
||||
122222 19970203 19970102000000 1997-02-03 12:22:22 3 7 5
|
||||
drop table t1;
|
||||
create table events(binlog int);
|
||||
insert into events values(1);
|
||||
|
@ -35,7 +35,7 @@ call foo();
|
||||
ERROR 42000: PROCEDURE foo does not exist
|
||||
drop procedure if exists foo;
|
||||
Warnings:
|
||||
Warning 1287 PROCEDURE foo does not exist
|
||||
Warning 1288 PROCEDURE foo does not exist
|
||||
show create procedure foo;
|
||||
ERROR 42000: PROCEDURE foo does not exist
|
||||
create procedure foo()
|
||||
@ -71,7 +71,7 @@ declare y int;
|
||||
set x = y;
|
||||
end;
|
||||
Warnings:
|
||||
Warning 1293 Referring to uninitialized variable y
|
||||
Warning 1294 Referring to uninitialized variable y
|
||||
drop procedure foo;
|
||||
create procedure foo()
|
||||
begin
|
||||
@ -270,4 +270,14 @@ ERROR 42S22: Unknown column 'valname' in 'order clause'
|
||||
drop procedure bug1965;
|
||||
select 1 into a;
|
||||
ERROR 42000: Undeclared variable: a
|
||||
create procedure bug336(id char(16))
|
||||
begin
|
||||
declare x int;
|
||||
set x = (select sum(t.data) from test.t2 t);
|
||||
end;
|
||||
ERROR 0A000: Subselect value not supported
|
||||
create function bug1654()
|
||||
returns int
|
||||
return (select sum(t.data) from test.t2 t);
|
||||
ERROR 0A000: Statements like SELECT, INSERT, UPDATE (and others) are not allowed in a FUNCTION
|
||||
drop table t1;
|
||||
|
@ -801,6 +801,17 @@ avg 0 4.4
|
||||
delete from t1;
|
||||
delete from t2;
|
||||
drop procedure bug1874;
|
||||
drop table if exists table_1;
|
||||
create table t3 (column_1_0 int);
|
||||
create procedure bug1653()
|
||||
update t3 set column_1 = 0;
|
||||
call bug1653();
|
||||
ERROR 42S22: Unknown column 'column_1' in 'field list'
|
||||
drop table t3;
|
||||
create table t3 (column_1 int);
|
||||
call bug1653();
|
||||
drop procedure bug1653;
|
||||
drop table t3;
|
||||
drop table if exists fac;
|
||||
create table fac (n int unsigned not null primary key, f bigint unsigned);
|
||||
create procedure ifac(n int unsigned)
|
||||
@ -948,6 +959,51 @@ drop procedure opp;
|
||||
drop procedure ip;
|
||||
show procedure status like '%p%';
|
||||
Name Type Creator Modified Created Suid Comment
|
||||
drop table if exists fib;
|
||||
create table fib ( f bigint unsigned not null );
|
||||
insert into fib values (1), (1);
|
||||
create procedure fib(n int unsigned)
|
||||
begin
|
||||
if n > 0 then
|
||||
begin
|
||||
declare x, y bigint unsigned;
|
||||
declare c cursor for select f from fib order by f desc limit 2;
|
||||
open c;
|
||||
fetch c into y;
|
||||
fetch c into x;
|
||||
close c;
|
||||
insert into fib values (x+y);
|
||||
call fib(n-1);
|
||||
end;
|
||||
end if;
|
||||
end;
|
||||
call fib(20);
|
||||
select * from fib order by f asc;
|
||||
f
|
||||
1
|
||||
1
|
||||
2
|
||||
3
|
||||
5
|
||||
8
|
||||
13
|
||||
21
|
||||
34
|
||||
55
|
||||
89
|
||||
144
|
||||
233
|
||||
377
|
||||
610
|
||||
987
|
||||
1597
|
||||
2584
|
||||
4181
|
||||
6765
|
||||
10946
|
||||
17711
|
||||
drop table fib;
|
||||
drop procedure fib;
|
||||
create procedure bar(x char(16), y int)
|
||||
comment "111111111111" sql security invoker
|
||||
insert into test.t1 values (x, y);
|
||||
|
@ -143,7 +143,7 @@ Variable_name Value
|
||||
table_type HEAP
|
||||
show global variables like 'table_type';
|
||||
Variable_name Value
|
||||
table_type INNODB
|
||||
table_type InnoDB
|
||||
set GLOBAL query_cache_size=100000;
|
||||
set GLOBAL myisam_max_sort_file_size=2000000;
|
||||
show global variables like 'myisam_max_sort_file_size';
|
||||
@ -241,7 +241,7 @@ ERROR HY000: Unknown system variable 'unknown_variable'
|
||||
set max_join_size="hello";
|
||||
ERROR 42000: Wrong argument type to variable 'max_join_size'
|
||||
set table_type=UNKNOWN_TABLE_TYPE;
|
||||
ERROR 42000: Variable 'table_type' can't be set to the value of 'UNKNOWN_TABLE_TYPE'
|
||||
ERROR 42000: Unknown table engine 'UNKNOWN_TABLE_TYPE'
|
||||
set table_type=INNODB, big_tables=2;
|
||||
ERROR 42000: Variable 'big_tables' can't be set to the value of '2'
|
||||
show local variables like 'table_type';
|
||||
@ -360,7 +360,7 @@ set sql_log_bin=1;
|
||||
set sql_log_off=1;
|
||||
set sql_log_update=1;
|
||||
Warnings:
|
||||
Note 1297 The update log is deprecated and replaced by the binary log. SET SQL_LOG_UPDATE has been ignored.
|
||||
Note 1298 The update log is deprecated and replaced by the binary log. SET SQL_LOG_UPDATE has been ignored.
|
||||
set sql_low_priority_updates=1;
|
||||
set sql_max_join_size=200;
|
||||
select @@sql_max_join_size,@@max_join_size;
|
||||
|
@ -121,8 +121,8 @@ select @@warning_count;
|
||||
drop table t1;
|
||||
create table t1 (id int) type=isam;
|
||||
Warnings:
|
||||
Warning 1265 Using storage engine MYISAM for table 't1'
|
||||
Warning 1265 Using storage engine MyISAM for table 't1'
|
||||
alter table t1 type=isam;
|
||||
Warnings:
|
||||
Warning 1265 Using storage engine MYISAM for table 't1'
|
||||
Warning 1265 Using storage engine MyISAM for table 't1'
|
||||
drop table t1;
|
||||
|
@ -157,7 +157,7 @@ SELECT @@table_type;
|
||||
CREATE TABLE t1 (a int not null);
|
||||
show create table t1;
|
||||
drop table t1;
|
||||
# Test what happens when using a non existing table type
|
||||
--error 1285
|
||||
SET SESSION table_type="gemini";
|
||||
SELECT @@table_type;
|
||||
CREATE TABLE t1 (a int not null);
|
||||
@ -277,7 +277,7 @@ SELECT @@table_type;
|
||||
CREATE TABLE t1 (a int not null);
|
||||
show create table t1;
|
||||
drop table t1;
|
||||
# Test what happens when using a non existing table type
|
||||
--error 1285
|
||||
SET SESSION table_type="gemini";
|
||||
SELECT @@table_type;
|
||||
CREATE TABLE t1 (a int not null);
|
||||
|
@ -94,6 +94,7 @@ insert into test values
|
||||
('2001-01-01 01:01:01', '01:01:01', '1 01:01:01', '2001-01-01 01:01:01');
|
||||
|
||||
SELECT ADDTIME(t1,t2) As ttt, ADDTIME(t2, t3) As qqq from test;
|
||||
SELECT TIMEDIFF(t1,t4) As ttt, TIMEDIFF(t2, t3) As qqq from test;
|
||||
SELECT TIMEDIFF(t1, t4) As ttt, TIMEDIFF(t2, t3) As qqq,
|
||||
TIMEDIFF(t3, t2) As eee, TIMEDIFF(t2, t4) As rrr from test;
|
||||
|
||||
drop table t1, test;
|
||||
|
@ -220,6 +220,30 @@ select date_add(date,INTERVAL "1:1:1" HOUR_SECOND) from t1;
|
||||
select date_add(date,INTERVAL "1 1:1" DAY_MINUTE) from t1;
|
||||
select date_add(date,INTERVAL "1 1:1:1" DAY_SECOND) from t1;
|
||||
|
||||
select date_add(date,INTERVAL "1" WEEK) from t1;
|
||||
select date_add(date,INTERVAL "1" QUARTER) from t1;
|
||||
select timestampadd(MINUTE, 1, date) from t1;
|
||||
select timestampadd(WEEK, 1, date) from t1;
|
||||
select timestampadd(SQL_TSI_SECOND, 1, date) from t1;
|
||||
select timestampadd(SQL_TSI_FRAC_SECOND, 1, date) from t1;
|
||||
|
||||
select timestampdiff(MONTH, '2001-02-01', '2001-05-01') as a;
|
||||
select timestampdiff(YEAR, '2002-05-01', '2001-01-01') as a;
|
||||
select timestampdiff(QUARTER, '2002-05-01', '2001-01-01') as a;
|
||||
select timestampdiff(MONTH, '2000-03-28', '2000-02-29') as a;
|
||||
select timestampdiff(MONTH, '1991-03-28', '2000-02-29') as a;
|
||||
select timestampdiff(SQL_TSI_WEEK, '2001-02-01', '2001-05-01') as a;
|
||||
select timestampdiff(SQL_TSI_HOUR, '2001-02-01', '2001-05-01') as a;
|
||||
select timestampdiff(SQL_TSI_DAY, '2001-02-01', '2001-05-01') as a;
|
||||
select timestampdiff(SQL_TSI_MINUTE, '2001-02-01 12:59:59', '2001-05-01 12:58:59') as a;
|
||||
select timestampdiff(SQL_TSI_SECOND, '2001-02-01 12:59:59', '2001-05-01 12:58:58') as a;
|
||||
select timestampdiff(SQL_TSI_FRAC_SECOND, '2001-02-01 12:59:59.120000', '2001-05-01 12:58:58.119999') as a;
|
||||
|
||||
select timestampdiff(SQL_TSI_DAY, '1986-02-01', '1986-03-01') as a1,
|
||||
timestampdiff(SQL_TSI_DAY, '1900-02-01', '1900-03-01') as a2,
|
||||
timestampdiff(SQL_TSI_DAY, '1996-02-01', '1996-03-01') as a3,
|
||||
timestampdiff(SQL_TSI_DAY, '2000-02-01', '2000-03-01') as a4;
|
||||
|
||||
# The following is not as one would expect...
|
||||
select date_add(time,INTERVAL 1 SECOND) from t1;
|
||||
drop table t1;
|
||||
@ -247,3 +271,6 @@ select strcmp(date_format(utc_timestamp(),"%Y-%m-%d"), utc_date())=0;
|
||||
select strcmp(concat(utc_date(),' ',utc_time()),utc_timestamp())=0;
|
||||
|
||||
explain extended select period_add("9602",-12),period_diff(199505,"9404"),from_days(to_days("960101")),dayofmonth("1997-01-02"), month("1997-01-02"), monthname("1972-03-04"),dayofyear("0000-00-00"),HOUR("1997-03-03 23:03:22"),MINUTE("23:03:22"),SECOND(230322),QUARTER(980303),WEEK("1998-03-03"),yearweek("2000-01-01",1),week(19950101,1),year("98-02-03"),weekday(curdate())-weekday(now()),dayname("1962-03-03"),unix_timestamp(),sec_to_time(time_to_sec("0:30:47")/6.21),curtime(),utc_time(),curdate(),utc_date(),utc_timestamp(),date_format("1997-01-02 03:04:05", "%M %W %D %Y %y %m %d %h %i %s %w"),from_unixtime(unix_timestamp("1994-03-02 10:11:12")),"1997-12-31 23:59:59" + INTERVAL 1 SECOND,"1998-01-01 00:00:00" - INTERVAL 1 SECOND,INTERVAL 1 DAY + "1997-12-31", extract(YEAR FROM "1999-01-02 10:11:12"),date_add("1997-12-31 23:59:59",INTERVAL 1 SECOND);
|
||||
|
||||
explain extended select timestampdiff(SQL_TSI_WEEK, '2001-02-01', '2001-05-01') as a1,
|
||||
timestampdiff(SQL_TSI_FRAC_SECOND, '2001-02-01 12:59:59.120000', '2001-05-01 12:58:58.119999') as a2;
|
||||
|
@ -6,10 +6,12 @@
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
|
||||
create table t1 (time time, date date, timestamp timestamp);
|
||||
insert into t1 values ("12:22:22","97:02:03","1997-01-02");
|
||||
create table t1 (time time, date date, timestamp timestamp,
|
||||
quarter int, week int, year int, timestampadd int, timestampdiff int);
|
||||
insert into t1 values ("12:22:22","97:02:03","1997-01-02",1,2,3,4,5);
|
||||
select * from t1;
|
||||
select t1.time+0,t1.date+0,t1.timestamp+0,concat(date," ",time) from t1;
|
||||
select t1.time+0,t1.date+0,t1.timestamp+0,concat(date," ",time),
|
||||
t1.quarter+t1.week, t1.year+timestampadd, timestampdiff from t1;
|
||||
drop table t1;
|
||||
create table events(binlog int);
|
||||
insert into events values(1);
|
||||
|
@ -32,18 +32,18 @@ create function func1() returns int
|
||||
return 42|
|
||||
|
||||
# Can't create recursively
|
||||
--error 1285
|
||||
--error 1286
|
||||
create procedure foo()
|
||||
create procedure bar() set @x=3|
|
||||
--error 1285
|
||||
--error 1286
|
||||
create procedure foo()
|
||||
create function bar() returns double return 2.3|
|
||||
|
||||
# Already exists
|
||||
--error 1286
|
||||
--error 1287
|
||||
create procedure proc1()
|
||||
set @x = 42|
|
||||
--error 1286
|
||||
--error 1287
|
||||
create function func1() returns int
|
||||
return 42|
|
||||
|
||||
@ -51,39 +51,39 @@ drop procedure proc1|
|
||||
drop function func1|
|
||||
|
||||
# Does not exist
|
||||
--error 1287
|
||||
--error 1288
|
||||
alter procedure foo|
|
||||
--error 1287
|
||||
--error 1288
|
||||
alter function foo|
|
||||
--error 1287
|
||||
--error 1288
|
||||
drop procedure foo|
|
||||
--error 1287
|
||||
--error 1288
|
||||
drop function foo|
|
||||
--error 1287
|
||||
--error 1288
|
||||
call foo()|
|
||||
drop procedure if exists foo|
|
||||
--error 1287
|
||||
--error 1288
|
||||
show create procedure foo|
|
||||
|
||||
# LEAVE/ITERATE with no match
|
||||
--error 1290
|
||||
--error 1291
|
||||
create procedure foo()
|
||||
foo: loop
|
||||
leave bar;
|
||||
end loop|
|
||||
--error 1290
|
||||
--error 1291
|
||||
create procedure foo()
|
||||
foo: loop
|
||||
iterate bar;
|
||||
end loop|
|
||||
--error 1290
|
||||
--error 1291
|
||||
create procedure foo()
|
||||
foo: begin
|
||||
iterate foo;
|
||||
end|
|
||||
|
||||
# Redefining label
|
||||
--error 1291
|
||||
--error 1292
|
||||
create procedure foo()
|
||||
foo: loop
|
||||
foo: loop
|
||||
@ -92,7 +92,7 @@ foo: loop
|
||||
end loop foo|
|
||||
|
||||
# End label mismatch
|
||||
--error 1292
|
||||
--error 1293
|
||||
create procedure foo()
|
||||
foo: loop
|
||||
set @x=2;
|
||||
@ -113,17 +113,17 @@ begin
|
||||
select name from mysql.proc;
|
||||
select type from mysql.proc;
|
||||
end|
|
||||
--error 1294
|
||||
--error 1295
|
||||
call foo()|
|
||||
drop procedure foo|
|
||||
|
||||
# RETURN in FUNCTION only
|
||||
--error 1295
|
||||
--error 1296
|
||||
create procedure foo()
|
||||
return 42|
|
||||
|
||||
# Doesn't allow queries in FUNCTIONs (for now :-( )
|
||||
--error 1296
|
||||
--error 1297
|
||||
create function foo() returns int
|
||||
begin
|
||||
declare x int;
|
||||
@ -137,19 +137,19 @@ create procedure p(x int)
|
||||
create function f(x int) returns int
|
||||
return x+42|
|
||||
|
||||
--error 1300
|
||||
--error 1301
|
||||
call p()|
|
||||
--error 1300
|
||||
--error 1301
|
||||
call p(1, 2)|
|
||||
--error 1300
|
||||
--error 1301
|
||||
select f()|
|
||||
--error 1300
|
||||
--error 1301
|
||||
select f(1, 2)|
|
||||
|
||||
drop procedure p|
|
||||
drop function f|
|
||||
|
||||
--error 1301
|
||||
--error 1302
|
||||
create procedure p(val int, out res int)
|
||||
begin
|
||||
declare x int default 0;
|
||||
@ -163,7 +163,7 @@ begin
|
||||
end if;
|
||||
end|
|
||||
|
||||
--error 1301
|
||||
--error 1302
|
||||
create procedure p(val int, out res int)
|
||||
begin
|
||||
declare x int default 0;
|
||||
@ -178,7 +178,7 @@ begin
|
||||
end if;
|
||||
end|
|
||||
|
||||
--error 1302
|
||||
--error 1303
|
||||
create function f(val int) returns int
|
||||
begin
|
||||
declare x int;
|
||||
@ -196,12 +196,12 @@ begin
|
||||
end if;
|
||||
end|
|
||||
|
||||
--error 1303
|
||||
--error 1304
|
||||
select f(10)|
|
||||
|
||||
drop function f|
|
||||
|
||||
--error 1304
|
||||
--error 1305
|
||||
create procedure p()
|
||||
begin
|
||||
declare c cursor for insert into test.t1 values ("foo", 42);
|
||||
@ -210,7 +210,7 @@ begin
|
||||
close c;
|
||||
end|
|
||||
|
||||
--error 1305
|
||||
--error 1306
|
||||
create procedure p()
|
||||
begin
|
||||
declare x int;
|
||||
@ -220,7 +220,7 @@ begin
|
||||
close c;
|
||||
end|
|
||||
|
||||
--error 1306
|
||||
--error 1307
|
||||
create procedure p()
|
||||
begin
|
||||
declare c cursor for select * from test.t;
|
||||
@ -242,7 +242,7 @@ begin
|
||||
open c;
|
||||
close c;
|
||||
end|
|
||||
--error 1307
|
||||
--error 1308
|
||||
call p()|
|
||||
drop procedure p|
|
||||
|
||||
@ -254,11 +254,11 @@ begin
|
||||
close c;
|
||||
close c;
|
||||
end|
|
||||
--error 1308
|
||||
--error 1309
|
||||
call p()|
|
||||
drop procedure p|
|
||||
|
||||
--error 1287
|
||||
--error 1288
|
||||
alter procedure bar3 sql security invoker|
|
||||
--error 1059
|
||||
alter procedure bar3 name
|
||||
@ -272,7 +272,7 @@ drop table if exists t1|
|
||||
create table t1 (val int, x float)|
|
||||
insert into t1 values (42, 3.1), (19, 1.2)|
|
||||
|
||||
--error 1309
|
||||
--error 1310
|
||||
create procedure p()
|
||||
begin
|
||||
declare c cursor for select * from t1;
|
||||
@ -292,7 +292,7 @@ begin
|
||||
fetch c into x;
|
||||
close c;
|
||||
end|
|
||||
--error 1310
|
||||
--error 1311
|
||||
call p()|
|
||||
drop procedure p|
|
||||
|
||||
@ -307,34 +307,34 @@ begin
|
||||
fetch c into x, y, z;
|
||||
close c;
|
||||
end|
|
||||
--error 1310
|
||||
--error 1311
|
||||
call p()|
|
||||
drop procedure p|
|
||||
|
||||
--error 1312
|
||||
--error 1313
|
||||
create procedure p(in x int, x char(10))
|
||||
begin
|
||||
end|
|
||||
--error 1312
|
||||
--error 1313
|
||||
create function p(x int, x char(10))
|
||||
begin
|
||||
end|
|
||||
|
||||
--error 1313
|
||||
--error 1314
|
||||
create procedure p()
|
||||
begin
|
||||
declare x float;
|
||||
declare x int;
|
||||
end|
|
||||
|
||||
--error 1314
|
||||
--error 1315
|
||||
create procedure p()
|
||||
begin
|
||||
declare c condition for 1064;
|
||||
declare c condition for 1065;
|
||||
end|
|
||||
|
||||
--error 1315
|
||||
--error 1316
|
||||
create procedure p()
|
||||
begin
|
||||
declare c cursor for select * from t1;
|
||||
@ -358,9 +358,26 @@ drop procedure bug1965|
|
||||
#
|
||||
# BUG#1966
|
||||
#
|
||||
--error 1309
|
||||
--error 1310
|
||||
select 1 into a|
|
||||
|
||||
#
|
||||
# BUG#336
|
||||
#
|
||||
--error 1318
|
||||
create procedure bug336(id char(16))
|
||||
begin
|
||||
declare x int;
|
||||
set x = (select sum(t.data) from test.t2 t);
|
||||
end|
|
||||
|
||||
#
|
||||
# BUG#1654
|
||||
#
|
||||
--error 1297
|
||||
create function bug1654()
|
||||
returns int
|
||||
return (select sum(t.data) from test.t2 t)|
|
||||
|
||||
drop table t1|
|
||||
|
||||
|
@ -815,6 +815,11 @@ delete from t2|
|
||||
drop table t3|
|
||||
drop procedure cur2|
|
||||
|
||||
|
||||
#
|
||||
# Test cases for old bugs
|
||||
#
|
||||
|
||||
#
|
||||
# BUG#822
|
||||
#
|
||||
@ -898,7 +903,6 @@ select @1, @2|
|
||||
drop table t70|
|
||||
drop procedure bug1656|
|
||||
|
||||
|
||||
#
|
||||
# BUG#1862
|
||||
#
|
||||
@ -920,7 +924,6 @@ select * from t3|
|
||||
drop table t3|
|
||||
drop procedure bug1862|
|
||||
|
||||
|
||||
#
|
||||
# BUG#1874
|
||||
#
|
||||
@ -945,6 +948,26 @@ delete from t1|
|
||||
delete from t2|
|
||||
drop procedure bug1874|
|
||||
|
||||
#
|
||||
# BUG#1653
|
||||
#
|
||||
--disable_warnings
|
||||
drop table if exists table_1|
|
||||
--enable_warnings
|
||||
create table t3 (column_1_0 int)|
|
||||
|
||||
create procedure bug1653()
|
||||
update t3 set column_1 = 0|
|
||||
|
||||
--error 1054
|
||||
call bug1653()|
|
||||
drop table t3|
|
||||
create table t3 (column_1 int)|
|
||||
call bug1653()|
|
||||
|
||||
drop procedure bug1653|
|
||||
drop table t3|
|
||||
|
||||
|
||||
#
|
||||
# Some "real" examples
|
||||
@ -1071,7 +1094,47 @@ drop procedure ip|
|
||||
--replace_column 4 '0000-00-00 00:00:00' 5 '0000-00-00 00:00:00'
|
||||
show procedure status like '%p%'|
|
||||
|
||||
|
||||
# Fibonacci, for recursion test. (Yet Another Numerical series :)
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists fib|
|
||||
--enable_warnings
|
||||
create table fib ( f bigint unsigned not null )|
|
||||
|
||||
insert into fib values (1), (1)|
|
||||
|
||||
# We deliberately do it the awkward way, fetching the last two
|
||||
# values from the table, in order to exercise various statements
|
||||
# and table accesses at each turn.
|
||||
create procedure fib(n int unsigned)
|
||||
begin
|
||||
if n > 0 then
|
||||
begin
|
||||
declare x, y bigint unsigned;
|
||||
declare c cursor for select f from fib order by f desc limit 2;
|
||||
|
||||
open c;
|
||||
fetch c into y;
|
||||
fetch c into x;
|
||||
close c;
|
||||
insert into fib values (x+y);
|
||||
call fib(n-1);
|
||||
end;
|
||||
end if;
|
||||
end|
|
||||
|
||||
call fib(20)|
|
||||
|
||||
select * from fib order by f asc|
|
||||
drop table fib|
|
||||
drop procedure fib|
|
||||
|
||||
|
||||
#
|
||||
# Comment & suid
|
||||
#
|
||||
|
||||
create procedure bar(x char(16), y int)
|
||||
comment "111111111111" sql security invoker
|
||||
insert into test.t1 values (x, y)|
|
||||
|
@ -136,7 +136,7 @@ set big_tables="OFFF";
|
||||
set unknown_variable=1;
|
||||
--error 1232
|
||||
set max_join_size="hello";
|
||||
--error 1231
|
||||
--error 1285
|
||||
set table_type=UNKNOWN_TABLE_TYPE;
|
||||
--error 1231
|
||||
set table_type=INNODB, big_tables=2;
|
||||
|
@ -1,27 +1,27 @@
|
||||
The MySQL Benchmarks
|
||||
|
||||
These tests needs a MySQL version of at least 3.20.28 or 3.21.10.
|
||||
NOTE: With MySQL 3.20.# you have to use '--skip-in', because MySQL 3.20
|
||||
doesn't support the IN operator.
|
||||
These tests require a MySQL version of at least 3.20.28 or 3.21.10.
|
||||
|
||||
Currently the following servers are supported:
|
||||
MySQL 3.20 and 3.21, PostgreSQL 6.#, mSQL 2.# and Solid Server 2.2
|
||||
|
||||
In this directory are the queries and raw data files used to populate
|
||||
the MySQL benchmarks. In order to run the benchmarks you should normally
|
||||
execute a command like the following:
|
||||
The benchmark directory contains the query files and raw data files used to
|
||||
populate the MySQL benchmark tables. In order to run the benchmarks, you
|
||||
should normally execute a command such as the following:
|
||||
|
||||
run-all-tests --server=mysql --cmp=mysql,pg,solid --user=test --password=test --log
|
||||
|
||||
The above means that one wants to run the benchmark with MySQL. The limits
|
||||
should be taken from all of mysql,PostgreSQL and Solid. Login name and
|
||||
password is 'test'. The result should be saved as a RUN file in the output
|
||||
This means that you want to run the benchmarks with MySQL. The
|
||||
limits should be taken from all of MySQL, PostgreSQL, and Solid.
|
||||
The login name and password for connecting to the server both are
|
||||
``test''. The result should be saved as a RUN file in the output
|
||||
directory.
|
||||
|
||||
When the above script has run you will have the individual results and the
|
||||
When run-all-tests has finished, will have the individual results and the
|
||||
the total RUN- file in the output directory.
|
||||
|
||||
If you want to look at some old results, try:
|
||||
If you want to look at some old results, use the compare-results script.
|
||||
For example:
|
||||
|
||||
compare-results --dir=Results --cmp=mysql,pg,solid
|
||||
compare-results --dir=Results --cmp=mysql,pg,solid --relative
|
||||
@ -29,8 +29,9 @@ compare-results --dir=Results --cmp=mysql,pg,solid --relative
|
||||
compare-results --dir=Results --cmp=msql,mysql,pg,solid
|
||||
compare-results --dir=Results --cmp=msql,mysql,pg,solid --relative
|
||||
|
||||
compare-results --dir=results --server=mysql --same-server --cmp=mysql,pg,solid
|
||||
compare-results --dir=Results --server=mysql --same-server --cmp=mysql,pg,solid
|
||||
|
||||
Some of the files in the benchmark directory are:
|
||||
|
||||
File Description
|
||||
|
||||
@ -38,24 +39,21 @@ Data/ATIS Contains data for 29 related tables used in the ATIS tests.
|
||||
Data/Wisconsin Contains data for the Wisconsin benchmark.
|
||||
Results Contains old benchmark results.
|
||||
Makefile.am Automake Makefile
|
||||
Overview-paper A paper nicked from the net about database bench-
|
||||
marking.
|
||||
README This file.
|
||||
test-ATIS.sh Cretation of 29 tables and a lot of selects on them.
|
||||
test-ATIS.sh Creation of 29 tables and a lot of selects on them.
|
||||
test-connect.sh Test how fast a connection to the server is.
|
||||
test-create.sh Test how fast a table is created.
|
||||
test-insert.sh Test create and fill of a table.
|
||||
test-wisconsin.sh This is a port of the PostgreSQL version of this
|
||||
benchmark.
|
||||
run-all-test Use this to run all tests. When all test are run,
|
||||
use the --log --use-old option to get a RUN-file.
|
||||
compare-results Makes a compare table from different RUN files.
|
||||
server-cfg Contains the limit and functions for all supported
|
||||
test-wisconsin.sh A port of the PostgreSQL version of this benchmark.
|
||||
run-all-tests Use this to run all tests. When all tests are run,
|
||||
use the --log and --use-old options to get a RUN-file.
|
||||
compare-results Generates a comparison table from different RUN files.
|
||||
server-cfg Contains the limits and functions for all supported
|
||||
SQL servers. If you want to add a new server, this
|
||||
should be the only file that neads to be changed.
|
||||
|
||||
|
||||
Most of the test should use portable SQL to make it possible to
|
||||
Most of the tests should use portable SQL to make it possible to
|
||||
compare different databases. Sometimes SQL extensions can make things
|
||||
a lot faster. In this case the test may use the extensions if the --fast
|
||||
option is used.
|
||||
@ -65,12 +63,10 @@ Useful options to all test-scripts (and run-all-tests):
|
||||
--host=# Hostname for MySQL server (default: localhost)
|
||||
--db=# Database to use (default: test)
|
||||
--fast Allow use of any non-standard SQL extension to
|
||||
do the get things done faster.
|
||||
--skip-in Don't do test with the IN operation (if the SQL server
|
||||
hasn't implemented this, for example mSQL and MySQL 3.20).
|
||||
get things done faster.
|
||||
--lock-tables Use table locking to get more speed.
|
||||
|
||||
From a text at http://www.mgt.ncu.edu.tw/CSIM/Paper/sixth/11.html
|
||||
From a text at http://www.mgt.ncu.edu.tw/CSIM/Paper/sixth/11.html:
|
||||
|
||||
The Wisconsin Benchmark
|
||||
|
||||
@ -81,13 +77,13 @@ systematically measure and compare the performance of relational
|
||||
database systems with database machines. The benchmark is a
|
||||
single-user and single-factor experiment using a synthetic database
|
||||
and a controlled workload. It measures the query optimization
|
||||
performance of database systems with 32 query types to exe cise the
|
||||
performance of database systems with 32 query types to exercise the
|
||||
components of the proposed systems. The query suites include
|
||||
selection, join, projection, aggregate, and simple update queries.
|
||||
|
||||
The test database consists of four generic relations. The tenk
|
||||
relation is the key table and most used. Two data types of small
|
||||
integer number and character string are utilized. Data values are
|
||||
integer numbers and character strings are utilized. Data values are
|
||||
uniformly distributed. The primary metric is the query elapsed
|
||||
time. The main criticisms of the benchmark include the nature of
|
||||
single-user workload, the simplistic database structure, and the
|
||||
|
@ -57,7 +57,7 @@ noinst_HEADERS = item.h item_func.h item_sum.h item_cmpfunc.h \
|
||||
lex.h lex_symbol.h sql_acl.h sql_crypt.h \
|
||||
log_event.h sql_repl.h slave.h \
|
||||
stacktrace.h sql_sort.h sql_cache.h set_var.h \
|
||||
spatial.h gstream.h client_settings.h
|
||||
spatial.h gstream.h client_settings.h \
|
||||
sp_head.h sp_pcontext.h sp_rcontext.h sp.h sp_cache.h
|
||||
mysqld_SOURCES = sql_lex.cc sql_handler.cc \
|
||||
item.cc item_sum.cc item_buff.cc item_func.cc \
|
||||
|
@ -50,14 +50,33 @@ ulong ha_read_count, ha_write_count, ha_delete_count, ha_update_count,
|
||||
ha_commit_count, ha_rollback_count,
|
||||
ha_read_rnd_count, ha_read_rnd_next_count;
|
||||
|
||||
const char *ha_table_type[] = {
|
||||
"", "DIAB_ISAM","HASH","MISAM","PISAM","RMS_ISAM","HEAP", "ISAM",
|
||||
"MRG_ISAM","MYISAM", "MRG_MYISAM", "BDB", "INNODB", "GEMINI", "?", "?",NullS
|
||||
};
|
||||
static SHOW_COMP_OPTION have_yes= SHOW_OPTION_YES;
|
||||
|
||||
TYPELIB ha_table_typelib=
|
||||
struct show_table_type_st sys_table_types[]=
|
||||
{
|
||||
array_elements(ha_table_type)-3, "", ha_table_type
|
||||
{"MyISAM", &have_yes,
|
||||
"Default type from 3.23 with great performance", DB_TYPE_MYISAM},
|
||||
{"HEAP", &have_yes,
|
||||
"Hash based, stored in memory, useful for temporary tables", DB_TYPE_HEAP},
|
||||
{"MEMORY", &have_yes,
|
||||
"Alias for HEAP", DB_TYPE_HEAP},
|
||||
{"MERGE", &have_yes,
|
||||
"Collection of identical MyISAM tables", DB_TYPE_MRG_MYISAM},
|
||||
{"MRG_MYISAM",&have_yes,
|
||||
"Alias for MERGE", DB_TYPE_MRG_MYISAM},
|
||||
{"ISAM", &have_isam,
|
||||
"Obsolete table type; Is replaced by MyISAM", DB_TYPE_ISAM},
|
||||
{"MRG_ISAM", &have_isam,
|
||||
"Obsolete table type; Is replaced by MRG_MYISAM", DB_TYPE_MRG_ISAM},
|
||||
{"InnoDB", &have_innodb,
|
||||
"Supports transactions, row-level locking and foreign keys", DB_TYPE_INNODB},
|
||||
{"INNOBASE", &have_innodb,
|
||||
"Alias for INNODB", DB_TYPE_INNODB},
|
||||
{"BDB", &have_berkeley_db,
|
||||
"Supports transactions and page-level locking", DB_TYPE_BERKELEY_DB},
|
||||
{"BERKELEYDB",&have_berkeley_db,
|
||||
"Alias for BDB", DB_TYPE_BERKELEY_DB},
|
||||
{NullS, NULL, NullS, DB_TYPE_UNKNOWN}
|
||||
};
|
||||
|
||||
const char *ha_row_type[] = {
|
||||
@ -70,35 +89,31 @@ const char *tx_isolation_names[] =
|
||||
TYPELIB tx_isolation_typelib= {array_elements(tx_isolation_names)-1,"",
|
||||
tx_isolation_names};
|
||||
|
||||
enum db_type ha_resolve_by_name(char *name, uint namelen)
|
||||
enum db_type ha_resolve_by_name(const char *name, uint namelen)
|
||||
{
|
||||
enum db_type result = DB_TYPE_UNKNOWN;
|
||||
if (!my_strcasecmp(&my_charset_latin1, name, "HEAP") ||
|
||||
!my_strcasecmp(&my_charset_latin1, name, "MEMORY")) {
|
||||
result = DB_TYPE_HEAP;
|
||||
} else
|
||||
if (!my_strcasecmp(&my_charset_latin1, name, "MRG_MYISAM") ||
|
||||
!my_strcasecmp(&my_charset_latin1, name, "MERGE")) {
|
||||
result = DB_TYPE_MRG_MYISAM;
|
||||
} else
|
||||
if (!my_strcasecmp(&my_charset_latin1, name, "MYISAM")) {
|
||||
result = DB_TYPE_MYISAM;
|
||||
} else
|
||||
if (!my_strcasecmp(&my_charset_latin1, name, "BDB") ||
|
||||
!my_strcasecmp(&my_charset_latin1, name, "BERKELEYDB")) {
|
||||
result = DB_TYPE_BERKELEY_DB;
|
||||
} else
|
||||
if (!my_strcasecmp(&my_charset_latin1, name, "INNODB") ||
|
||||
!my_strcasecmp(&my_charset_latin1, name, "INNOBASE")) {
|
||||
result = DB_TYPE_INNODB;
|
||||
} else
|
||||
if (!my_strcasecmp(&my_charset_latin1, name, "ISAM")) {
|
||||
result = DB_TYPE_ISAM;
|
||||
} else
|
||||
if (!my_strcasecmp(&my_charset_latin1, name, "DEFAULT")) {
|
||||
result = (enum db_type) current_thd->variables.table_type;
|
||||
return(enum db_type) current_thd->variables.table_type;
|
||||
}
|
||||
return result;
|
||||
|
||||
show_table_type_st *types;
|
||||
for (types= sys_table_types; types->type; types++)
|
||||
{
|
||||
if (!my_strcasecmp(&my_charset_latin1, name, types->type))
|
||||
return(enum db_type)types->db_type;
|
||||
}
|
||||
return DB_TYPE_UNKNOWN;
|
||||
}
|
||||
|
||||
const char *ha_get_table_type(enum db_type db_type)
|
||||
{
|
||||
show_table_type_st *types;
|
||||
for (types= sys_table_types; types->type; types++)
|
||||
{
|
||||
if (db_type == types->db_type)
|
||||
return types->type;
|
||||
}
|
||||
|
||||
return "none";
|
||||
}
|
||||
|
||||
/* Use other database handler if databasehandler is not incompiled */
|
||||
@ -136,12 +151,13 @@ enum db_type ha_checktype(enum db_type database_type)
|
||||
default:
|
||||
break;
|
||||
}
|
||||
/* Use this as default */
|
||||
#if 0
|
||||
return((enum db_type) current_thd->variables.table_type);
|
||||
#else
|
||||
return(DB_TYPE_MYISAM);
|
||||
#endif
|
||||
|
||||
return
|
||||
DB_TYPE_UNKNOWN != (enum db_type) current_thd->variables.table_type ?
|
||||
(enum db_type) current_thd->variables.table_type :
|
||||
DB_TYPE_UNKNOWN != (enum db_type) global_system_variables.table_type ?
|
||||
(enum db_type) global_system_variables.table_type :
|
||||
DB_TYPE_MYISAM;
|
||||
} /* ha_checktype */
|
||||
|
||||
|
||||
|
@ -131,6 +131,13 @@ enum db_type { DB_TYPE_UNKNOWN=0,DB_TYPE_DIAB_ISAM=1,
|
||||
DB_TYPE_BERKELEY_DB, DB_TYPE_INNODB, DB_TYPE_GEMINI,
|
||||
DB_TYPE_DEFAULT };
|
||||
|
||||
struct show_table_type_st {
|
||||
const char *type;
|
||||
SHOW_COMP_OPTION *value;
|
||||
const char *comment;
|
||||
enum db_type db_type;
|
||||
};
|
||||
|
||||
enum row_type { ROW_TYPE_NOT_USED=-1, ROW_TYPE_DEFAULT, ROW_TYPE_FIXED,
|
||||
ROW_TYPE_DYNAMIC, ROW_TYPE_COMPRESSED};
|
||||
|
||||
@ -372,8 +379,9 @@ public:
|
||||
|
||||
/* Some extern variables used with handlers */
|
||||
|
||||
extern struct show_table_type_st sys_table_types[];
|
||||
extern const char *ha_row_type[];
|
||||
extern TYPELIB ha_table_typelib, tx_isolation_typelib;
|
||||
extern TYPELIB tx_isolation_typelib;
|
||||
|
||||
/* Wrapper functions */
|
||||
#define ha_commit_stmt(thd) (ha_commit_trans((thd), &((thd)->transaction.stmt)))
|
||||
@ -383,7 +391,8 @@ extern TYPELIB ha_table_typelib, tx_isolation_typelib;
|
||||
|
||||
#define ha_supports_generate(T) (T != DB_TYPE_INNODB)
|
||||
|
||||
enum db_type ha_resolve_by_name(char *name, uint namelen);
|
||||
enum db_type ha_resolve_by_name(const char *name, uint namelen);
|
||||
const char *ha_get_table_type(enum db_type db_type);
|
||||
handler *get_new_handler(TABLE *table, enum db_type db_type);
|
||||
my_off_t ha_get_ptr(byte *ptr, uint pack_length);
|
||||
void ha_store_ptr(byte *buff, uint pack_length, my_off_t pos);
|
||||
|
11
sql/item.cc
11
sql/item.cc
@ -240,6 +240,17 @@ Item_splocal::this_const_item() const
|
||||
return thd->spcont->get_item(m_offset);
|
||||
}
|
||||
|
||||
Item::Type
|
||||
Item_splocal::type() const
|
||||
{
|
||||
THD *thd= current_thd;
|
||||
|
||||
if (thd->spcont)
|
||||
return thd->spcont->get_item(m_offset)->type();
|
||||
return NULL_ITEM; // Anything but SUBSELECT_ITEM
|
||||
}
|
||||
|
||||
|
||||
bool DTCollation::aggregate(DTCollation &dt)
|
||||
{
|
||||
if (!my_charset_same(collation, dt.collation))
|
||||
|
@ -268,10 +268,7 @@ public:
|
||||
|
||||
// Abstract methods inherited from Item. Just defer the call to
|
||||
// the item in the frame
|
||||
inline enum Type type() const
|
||||
{
|
||||
return this_const_item()->type();
|
||||
}
|
||||
enum Type type() const;
|
||||
|
||||
inline double val()
|
||||
{
|
||||
|
@ -312,11 +312,6 @@ Item *create_func_current_user()
|
||||
system_charset_info);
|
||||
}
|
||||
|
||||
Item *create_func_quarter(Item* a)
|
||||
{
|
||||
return new Item_func_quarter(a);
|
||||
}
|
||||
|
||||
Item *create_func_radians(Item *a)
|
||||
{
|
||||
return new Item_func_units((char*) "radians",a,M_PI/180,0.0);
|
||||
|
@ -72,7 +72,6 @@ Item *create_func_period_diff(Item* a, Item *b);
|
||||
Item *create_func_pi(void);
|
||||
Item *create_func_pow(Item* a, Item *b);
|
||||
Item *create_func_current_user(void);
|
||||
Item *create_func_quarter(Item* a);
|
||||
Item *create_func_radians(Item *a);
|
||||
Item *create_func_release_lock(Item* a);
|
||||
Item *create_func_repeat(Item* a, Item *b);
|
||||
|
@ -869,9 +869,15 @@ static bool get_interval_value(Item *args,interval_type int_type,
|
||||
case INTERVAL_YEAR:
|
||||
interval->year=value;
|
||||
break;
|
||||
case INTERVAL_QUARTER:
|
||||
interval->month=value*3;
|
||||
break;
|
||||
case INTERVAL_MONTH:
|
||||
interval->month=value;
|
||||
break;
|
||||
case INTERVAL_WEEK:
|
||||
interval->day=value*7;
|
||||
break;
|
||||
case INTERVAL_DAY:
|
||||
interval->day=value;
|
||||
break;
|
||||
@ -1547,6 +1553,7 @@ bool Item_date_add_interval::get_date(TIME *ltime, uint fuzzy_date)
|
||||
goto null_date;
|
||||
break;
|
||||
case INTERVAL_DAY:
|
||||
case INTERVAL_WEEK:
|
||||
period= calc_daynr(ltime->year,ltime->month,ltime->day) +
|
||||
sign*interval.day;
|
||||
if (period < 0 || period >= MAX_DAY_NUMBER) // Daynumber from year 0 to 9999-12-31
|
||||
@ -1562,6 +1569,7 @@ bool Item_date_add_interval::get_date(TIME *ltime, uint fuzzy_date)
|
||||
ltime->day=28; // Was leap-year
|
||||
break;
|
||||
case INTERVAL_YEAR_MONTH:
|
||||
case INTERVAL_QUARTER:
|
||||
case INTERVAL_MONTH:
|
||||
period= (ltime->year*12 + sign*interval.year*12 +
|
||||
ltime->month-1 + sign*interval.month);
|
||||
@ -1623,12 +1631,13 @@ longlong Item_date_add_interval::val_int()
|
||||
|
||||
static const char *interval_names[]=
|
||||
{
|
||||
"year", "month", "day", "hour", "minute",
|
||||
"second", "microsecond", "year_month",
|
||||
"day_hour", "day_minute", "day_second",
|
||||
"hour_minute", "hour_second", "minute_second",
|
||||
"day_microsecond", "hour_microsecond",
|
||||
"minute_microsecond", "second_microsecond"
|
||||
"year", "quarter", "month", "day", "hour",
|
||||
"minute", "week", "second", "microsecond",
|
||||
"year_month", "day_hour", "day_minute",
|
||||
"day_second", "hour_minute", "hour_second",
|
||||
"minute_second", "day_microsecond",
|
||||
"hour_microsecond", "minute_microsecond",
|
||||
"second_microsecond"
|
||||
};
|
||||
|
||||
void Item_date_add_interval::print(String *str)
|
||||
@ -1659,7 +1668,9 @@ void Item_extract::fix_length_and_dec()
|
||||
switch (int_type) {
|
||||
case INTERVAL_YEAR: max_length=4; date_value=1; break;
|
||||
case INTERVAL_YEAR_MONTH: max_length=6; date_value=1; break;
|
||||
case INTERVAL_QUARTER: max_length=2; date_value=1; break;
|
||||
case INTERVAL_MONTH: max_length=2; date_value=1; break;
|
||||
case INTERVAL_WEEK: max_length=2; date_value=1; break;
|
||||
case INTERVAL_DAY: max_length=2; date_value=1; break;
|
||||
case INTERVAL_DAY_HOUR: max_length=9; date_value=0; break;
|
||||
case INTERVAL_DAY_MINUTE: max_length=11; date_value=0; break;
|
||||
@ -1682,6 +1693,8 @@ void Item_extract::fix_length_and_dec()
|
||||
longlong Item_extract::val_int()
|
||||
{
|
||||
TIME ltime;
|
||||
uint year;
|
||||
ulong week_format;
|
||||
long neg;
|
||||
if (date_value)
|
||||
{
|
||||
@ -1703,7 +1716,16 @@ longlong Item_extract::val_int()
|
||||
switch (int_type) {
|
||||
case INTERVAL_YEAR: return ltime.year;
|
||||
case INTERVAL_YEAR_MONTH: return ltime.year*100L+ltime.month;
|
||||
case INTERVAL_QUARTER: return ltime.month/3 + 1;
|
||||
case INTERVAL_MONTH: return ltime.month;
|
||||
case INTERVAL_WEEK:
|
||||
{
|
||||
week_format= current_thd->variables.default_week_format;
|
||||
return calc_week(<ime,
|
||||
(week_format & 2) != 0,
|
||||
(week_format & 1) == 0,
|
||||
&year);
|
||||
}
|
||||
case INTERVAL_DAY: return ltime.day;
|
||||
case INTERVAL_DAY_HOUR: return (long) (ltime.day*100L+ltime.hour)*neg;
|
||||
case INTERVAL_DAY_MINUTE: return (long) (ltime.day*10000L+
|
||||
@ -2085,6 +2107,79 @@ void Item_func_add_time::print(String *str)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
SYNOPSIS
|
||||
calc_time_diff()
|
||||
l_time1 TIME/DATE/DATETIME value
|
||||
l_time2 TIME/DATE/DATETIME value
|
||||
l_sign Can be 1 (operation of addition)
|
||||
or -1 (substraction)
|
||||
seconds_out Returns count of seconds bitween
|
||||
l_time1 and l_time2
|
||||
microseconds_out Returns count of microseconds bitween
|
||||
l_time1 and l_time2.
|
||||
|
||||
DESCRIPTION
|
||||
Calculates difference in seconds(seconds_out)
|
||||
and microseconds(microseconds_out)
|
||||
bitween two TIME/DATE/DATETIME values.
|
||||
|
||||
RETURN VALUES
|
||||
Rertuns sign of difference.
|
||||
1 means negative result
|
||||
0 means positive result
|
||||
|
||||
*/
|
||||
|
||||
bool calc_time_diff(TIME *l_time1,TIME *l_time2, int l_sign,
|
||||
longlong *seconds_out, long *microseconds_out)
|
||||
{
|
||||
long days;
|
||||
bool neg;
|
||||
longlong seconds= *seconds_out;
|
||||
long microseconds= *microseconds_out;
|
||||
|
||||
/*
|
||||
We suppose that if first argument is TIMESTAMP_TIME
|
||||
the second argument should be TIMESTAMP_TIME also.
|
||||
We should check it before calc_time_diff call.
|
||||
*/
|
||||
if (l_time1->time_type == TIMESTAMP_TIME) // Time value
|
||||
days= l_time1->day - l_sign*l_time2->day;
|
||||
else // DateTime value
|
||||
days= (calc_daynr((uint) l_time1->year,
|
||||
(uint) l_time1->month,
|
||||
(uint) l_time1->day) -
|
||||
l_sign*calc_daynr((uint) l_time2->year,
|
||||
(uint) l_time2->month,
|
||||
(uint) l_time2->day));
|
||||
|
||||
microseconds= l_time1->second_part - l_sign*l_time2->second_part;
|
||||
seconds= ((longlong) days*86400L + l_time1->hour*3600L +
|
||||
l_time1->minute*60L + l_time1->second + microseconds/1000000L -
|
||||
(longlong)l_sign*(l_time2->hour*3600L+l_time2->minute*60L+l_time2->second));
|
||||
|
||||
neg= 0;
|
||||
if (seconds < 0)
|
||||
{
|
||||
seconds= -seconds;
|
||||
neg= 1;
|
||||
}
|
||||
else if (seconds == 0 && microseconds < 0)
|
||||
{
|
||||
microseconds= -microseconds;
|
||||
neg= 1;
|
||||
}
|
||||
if (microseconds < 0)
|
||||
{
|
||||
microseconds+= 1000000L;
|
||||
seconds--;
|
||||
}
|
||||
*seconds_out= seconds;
|
||||
*microseconds_out= microseconds;
|
||||
return neg;
|
||||
}
|
||||
|
||||
/*
|
||||
TIMEDIFF(t,s) is a time function that calculates the
|
||||
time value between a start and end time.
|
||||
@ -2110,40 +2205,16 @@ String *Item_func_timediff::val_str(String *str)
|
||||
if (l_time1.neg != l_time2.neg)
|
||||
l_sign= -l_sign;
|
||||
|
||||
if (l_time1.time_type == TIMESTAMP_TIME) // Time value
|
||||
days= l_time1.day - l_sign*l_time2.day;
|
||||
else // DateTime value
|
||||
days= (calc_daynr((uint) l_time1.year,
|
||||
(uint) l_time1.month,
|
||||
(uint) l_time1.day) -
|
||||
l_sign*calc_daynr((uint) l_time2.year,
|
||||
(uint) l_time2.month,
|
||||
(uint) l_time2.day));
|
||||
l_time3.neg= calc_time_diff(&l_time1,&l_time2, l_sign,
|
||||
&seconds, µseconds);
|
||||
|
||||
microseconds= l_time1.second_part - l_sign*l_time2.second_part;
|
||||
seconds= ((longlong) days*86400L + l_time1.hour*3600L +
|
||||
l_time1.minute*60L + l_time1.second + microseconds/1000000L -
|
||||
(longlong)l_sign*(l_time2.hour*3600L+l_time2.minute*60L+
|
||||
l_time2.second));
|
||||
|
||||
l_time3.neg= 0;
|
||||
if (seconds < 0)
|
||||
{
|
||||
seconds= -seconds;
|
||||
l_time3.neg= 1;
|
||||
}
|
||||
else if (seconds == 0 && microseconds < 0)
|
||||
{
|
||||
microseconds= -microseconds;
|
||||
l_time3.neg= 1;
|
||||
}
|
||||
if (microseconds < 0)
|
||||
{
|
||||
microseconds+= 1000000L;
|
||||
seconds--;
|
||||
}
|
||||
/*
|
||||
For TIMESTAMP_TIME only:
|
||||
If both argumets are negative values and diff between them
|
||||
is negative we need to swap sign as result should be positive.
|
||||
*/
|
||||
if ((l_time2.neg == l_time1.neg) && l_time1.neg)
|
||||
l_time3.neg= l_time3.neg ? 0 : 1;
|
||||
l_time3.neg= 1-l_time3.neg; // Swap sign of result
|
||||
|
||||
calc_time_from_sec(&l_time3, (long) seconds, microseconds);
|
||||
|
||||
@ -2210,6 +2281,166 @@ longlong Item_func_microsecond::val_int()
|
||||
}
|
||||
|
||||
|
||||
longlong Item_func_timestamp_diff::val_int()
|
||||
{
|
||||
TIME ltime1, ltime2;
|
||||
longlong seconds;
|
||||
long microseconds;
|
||||
long months= 0;
|
||||
int neg= 1;
|
||||
|
||||
null_value= 0;
|
||||
if (args[0]->get_date(<ime1, 0) ||
|
||||
args[1]->get_date(<ime2, 0))
|
||||
goto null_date;
|
||||
|
||||
if (calc_time_diff(<ime2,<ime1, 1,
|
||||
&seconds, µseconds))
|
||||
neg= -1;
|
||||
|
||||
if (int_type == INTERVAL_YEAR ||
|
||||
int_type == INTERVAL_QUARTER ||
|
||||
int_type == INTERVAL_MONTH)
|
||||
{
|
||||
uint year, year_tmp;
|
||||
uint year_beg, year_end, month_beg, month_end;
|
||||
uint diff_days= seconds/86400L;
|
||||
uint diff_months= 0;
|
||||
uint diff_years= 0;
|
||||
if (neg == -1)
|
||||
{
|
||||
year_beg= ltime2.year;
|
||||
year_end= ltime1.year;
|
||||
month_beg= ltime2.month;
|
||||
month_end= ltime1.month;
|
||||
}
|
||||
else
|
||||
{
|
||||
year_beg= ltime1.year;
|
||||
year_end= ltime2.year;
|
||||
month_beg= ltime1.month;
|
||||
month_end= ltime2.month;
|
||||
}
|
||||
/* calc years*/
|
||||
for (year= year_beg;year < year_end; year++)
|
||||
{
|
||||
uint days=calc_days_in_year(year);
|
||||
if (days > diff_days)
|
||||
break;
|
||||
diff_days-= days;
|
||||
diff_years++;
|
||||
}
|
||||
|
||||
/* calc months; Current year is in the 'year' variable */
|
||||
month_beg--; /* Change months to be 0-11 for easier calculation */
|
||||
month_end--;
|
||||
|
||||
months= 12*diff_years;
|
||||
while (month_beg != month_end)
|
||||
{
|
||||
uint m_days= (uint) days_in_month[month_beg];
|
||||
if (month_beg == 1)
|
||||
{
|
||||
/* This is only calculated once so there is no reason to cache it*/
|
||||
uint leap= (uint) ((year & 3) == 0 && (year%100 ||
|
||||
(year%400 == 0 && year)));
|
||||
m_days+= leap;
|
||||
}
|
||||
if (m_days > diff_days)
|
||||
break;
|
||||
diff_days-= m_days;
|
||||
months++;
|
||||
if (month_beg++ == 11) /* if we wrap to next year */
|
||||
{
|
||||
month_beg= 0;
|
||||
year++;
|
||||
}
|
||||
}
|
||||
if (neg == -1)
|
||||
months= -months;
|
||||
}
|
||||
|
||||
switch (int_type) {
|
||||
case INTERVAL_YEAR:
|
||||
return months/12;
|
||||
case INTERVAL_QUARTER:
|
||||
return months/3;
|
||||
case INTERVAL_MONTH:
|
||||
return months;
|
||||
case INTERVAL_WEEK:
|
||||
return seconds/86400L/7L*neg;
|
||||
case INTERVAL_DAY:
|
||||
return seconds/86400L*neg;
|
||||
case INTERVAL_HOUR:
|
||||
return seconds/3600L*neg;
|
||||
case INTERVAL_MINUTE:
|
||||
return seconds/60L*neg;
|
||||
case INTERVAL_SECOND:
|
||||
return seconds*neg;
|
||||
case INTERVAL_MICROSECOND:
|
||||
{
|
||||
longlong max_sec= LONGLONG_MAX/1000000;
|
||||
if (max_sec > seconds ||
|
||||
max_sec == seconds && LONGLONG_MAX%1000000 >= microseconds)
|
||||
return (longlong) (seconds*1000000L+microseconds)*neg;
|
||||
goto null_date;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
null_date:
|
||||
null_value=1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void Item_func_timestamp_diff::print(String *str)
|
||||
{
|
||||
str->append(func_name());
|
||||
str->append('(');
|
||||
|
||||
switch (int_type) {
|
||||
case INTERVAL_YEAR:
|
||||
str->append("YEAR");
|
||||
break;
|
||||
case INTERVAL_QUARTER:
|
||||
str->append("QUARTER");
|
||||
break;
|
||||
case INTERVAL_MONTH:
|
||||
str->append("MONTH");
|
||||
break;
|
||||
case INTERVAL_WEEK:
|
||||
str->append("WEEK");
|
||||
break;
|
||||
case INTERVAL_DAY:
|
||||
str->append("DAY");
|
||||
break;
|
||||
case INTERVAL_HOUR:
|
||||
str->append("HOUR");
|
||||
break;
|
||||
case INTERVAL_MINUTE:
|
||||
str->append("MINUTE");
|
||||
break;
|
||||
case INTERVAL_SECOND:
|
||||
str->append("SECOND");
|
||||
break;
|
||||
case INTERVAL_MICROSECOND:
|
||||
str->append("SECOND_FRAC");
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
for (uint i=0 ; i < 2 ; i++)
|
||||
{
|
||||
str->append(',');
|
||||
args[i]->print(str);
|
||||
}
|
||||
str->append(')');
|
||||
}
|
||||
|
||||
|
||||
String *Item_func_get_format::val_str(String *str)
|
||||
{
|
||||
const char *format_name;
|
||||
|
@ -543,11 +543,11 @@ public:
|
||||
|
||||
enum interval_type
|
||||
{
|
||||
INTERVAL_YEAR, INTERVAL_MONTH, INTERVAL_DAY, INTERVAL_HOUR, INTERVAL_MINUTE,
|
||||
INTERVAL_SECOND, INTERVAL_MICROSECOND ,INTERVAL_YEAR_MONTH,
|
||||
INTERVAL_DAY_HOUR, INTERVAL_DAY_MINUTE, INTERVAL_DAY_SECOND,
|
||||
INTERVAL_HOUR_MINUTE, INTERVAL_HOUR_SECOND, INTERVAL_MINUTE_SECOND,
|
||||
INTERVAL_DAY_MICROSECOND, INTERVAL_HOUR_MICROSECOND,
|
||||
INTERVAL_YEAR, INTERVAL_QUARTER, INTERVAL_MONTH, INTERVAL_DAY, INTERVAL_HOUR,
|
||||
INTERVAL_MINUTE, INTERVAL_WEEK, INTERVAL_SECOND, INTERVAL_MICROSECOND ,
|
||||
INTERVAL_YEAR_MONTH, INTERVAL_DAY_HOUR, INTERVAL_DAY_MINUTE,
|
||||
INTERVAL_DAY_SECOND, INTERVAL_HOUR_MINUTE, INTERVAL_HOUR_SECOND,
|
||||
INTERVAL_MINUTE_SECOND, INTERVAL_DAY_MICROSECOND, INTERVAL_HOUR_MICROSECOND,
|
||||
INTERVAL_MINUTE_MICROSECOND, INTERVAL_SECOND_MICROSECOND
|
||||
};
|
||||
|
||||
@ -769,6 +769,23 @@ public:
|
||||
};
|
||||
|
||||
|
||||
class Item_func_timestamp_diff :public Item_int_func
|
||||
{
|
||||
const interval_type int_type;
|
||||
public:
|
||||
Item_func_timestamp_diff(Item *a,Item *b,interval_type type_arg)
|
||||
:Item_int_func(a,b), int_type(type_arg) {}
|
||||
const char *func_name() const { return "timestamp_diff"; }
|
||||
longlong val_int();
|
||||
void fix_length_and_dec()
|
||||
{
|
||||
decimals=0;
|
||||
maybe_null=1;
|
||||
}
|
||||
void print(String *str);
|
||||
};
|
||||
|
||||
|
||||
enum date_time_format
|
||||
{
|
||||
USA_FORMAT, JIS_FORMAT, ISO_FORMAT, EUR_FORMAT, INTERNAL_FORMAT
|
||||
|
16
sql/lex.h
16
sql/lex.h
@ -179,6 +179,7 @@ static SYMBOL symbols[] = {
|
||||
{ "FOREIGN", SYM(FOREIGN),0,0},
|
||||
{ "FORCE", SYM(FORCE_SYM),0,0},
|
||||
{ "FOUND", SYM(FOUND_SYM),0,0},
|
||||
{ "FRAC_SECOND", SYM(FRAC_SECOND_SYM),0,0},
|
||||
{ "RAID_TYPE", SYM(RAID_TYPE),0,0},
|
||||
{ "RAID_CHUNKS", SYM(RAID_CHUNKS),0,0},
|
||||
{ "RAID_CHUNKSIZE", SYM(RAID_CHUNKSIZE),0,0},
|
||||
@ -336,6 +337,7 @@ static SYMBOL symbols[] = {
|
||||
{ "PROCESS" , SYM(PROCESS),0,0},
|
||||
{ "PROCESSLIST", SYM(PROCESSLIST_SYM),0,0},
|
||||
{ "PRIVILEGES", SYM(PRIVILEGES),0,0},
|
||||
{ "QUARTER", SYM(QUARTER_SYM),0,0},
|
||||
{ "QUERY", SYM(QUERY_SYM),0,0},
|
||||
{ "QUICK", SYM(QUICK),0,0},
|
||||
{ "RAID0", SYM(RAID_0_SYM),0,0},
|
||||
@ -401,6 +403,15 @@ static SYMBOL symbols[] = {
|
||||
{ "SQL_NO_CACHE", SYM(SQL_NO_CACHE_SYM), 0, 0},
|
||||
{ "SQL_SMALL_RESULT", SYM(SQL_SMALL_RESULT),0,0},
|
||||
{ "SQL_THREAD", SYM(SQL_THREAD),0,0},
|
||||
{ "SQL_TSI_FRAC_SECOND", SYM(FRAC_SECOND_SYM),0,0},
|
||||
{ "SQL_TSI_SECOND", SYM(SECOND_SYM),0,0},
|
||||
{ "SQL_TSI_MINUTE", SYM(MINUTE_SYM),0,0},
|
||||
{ "SQL_TSI_HOUR", SYM(HOUR_SYM),0,0},
|
||||
{ "SQL_TSI_DAY", SYM(DAY_SYM),0,0},
|
||||
{ "SQL_TSI_WEEK", SYM(WEEK_SYM),0,0},
|
||||
{ "SQL_TSI_MONTH", SYM(MONTH_SYM),0,0},
|
||||
{ "SQL_TSI_QUARTER", SYM(QUARTER_SYM),0,0},
|
||||
{ "SQL_TSI_YEAR", SYM(YEAR_SYM),0,0},
|
||||
{ "SOUNDS", SYM(SOUNDS_SYM),0,0},
|
||||
{ "SSL", SYM(SSL_SYM),0,0},
|
||||
{ "STRAIGHT_JOIN", SYM(STRAIGHT_JOIN),0,0},
|
||||
@ -421,6 +432,8 @@ static SYMBOL symbols[] = {
|
||||
{ "THEN", SYM(THEN_SYM),0,0},
|
||||
{ "TIME", SYM(TIME_SYM),0,0},
|
||||
{ "TIMESTAMP", SYM(TIMESTAMP),0,0},
|
||||
{ "TIMESTAMPADD", SYM(TIMESTAMP_ADD),0,0},
|
||||
{ "TIMESTAMPDIFF", SYM(TIMESTAMP_DIFF),0,0},
|
||||
{ "TINYBLOB", SYM(TINYBLOB),0,0},
|
||||
{ "TINYTEXT", SYM(TINYTEXT),0,0},
|
||||
{ "TINYINT", SYM(TINYINT),0,0},
|
||||
@ -456,6 +469,7 @@ static SYMBOL symbols[] = {
|
||||
{ "VARYING", SYM(VARYING),0,0},
|
||||
{ "VARBINARY", SYM(VARBINARY),0,0},
|
||||
{ "WARNINGS", SYM(WARNINGS),0,0},
|
||||
{ "WEEK", SYM(WEEK_SYM),0,0},
|
||||
{ "WITH", SYM(WITH),0,0},
|
||||
{ "WORK", SYM(WORK_SYM),0,0},
|
||||
{ "WRITE", SYM(WRITE_SYM),0,0},
|
||||
@ -644,7 +658,6 @@ static SYMBOL sql_functions[] = {
|
||||
{ "POSITION", SYM(POSITION_SYM),0,0},
|
||||
{ "POW", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_pow)},
|
||||
{ "POWER", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_pow)},
|
||||
{ "QUARTER", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_quarter)},
|
||||
{ "QUOTE", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_quote)},
|
||||
{ "RADIANS", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_radians)},
|
||||
{ "RAND", SYM(RAND),0,0},
|
||||
@ -691,7 +704,6 @@ static SYMBOL sql_functions[] = {
|
||||
{ "UPPER", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ucase)},
|
||||
{ "VARIANCE", SYM(VARIANCE_SYM),0,0},
|
||||
{ "VERSION", SYM(FUNC_ARG0),0,CREATE_FUNC(create_func_version)},
|
||||
{ "WEEK", SYM(WEEK_SYM),0,0},
|
||||
{ "WEEKDAY", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_weekday)},
|
||||
{ "WEEKOFYEAR", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_weekofyear)},
|
||||
{ "WITHIN", SYM(FUNC_ARG2),0,CREATE_FUNC(create_func_within)},
|
||||
|
@ -860,7 +860,6 @@ extern MY_BITMAP temp_pool;
|
||||
extern String my_empty_string;
|
||||
extern String my_null_string;
|
||||
extern SHOW_VAR init_vars[],status_vars[], internal_vars[];
|
||||
extern struct show_table_type_st table_type_vars[];
|
||||
extern SHOW_COMP_OPTION have_isam;
|
||||
extern SHOW_COMP_OPTION have_innodb;
|
||||
extern SHOW_COMP_OPTION have_berkeley_db;
|
||||
|
@ -3650,7 +3650,7 @@ enum options_mysqld
|
||||
OPT_MAX_SEEKS_FOR_KEY, OPT_MAX_TMP_TABLES, OPT_MAX_USER_CONNECTIONS,
|
||||
OPT_MAX_LENGTH_FOR_SORT_DATA,
|
||||
OPT_MAX_WRITE_LOCK_COUNT, OPT_BULK_INSERT_BUFFER_SIZE,
|
||||
OPT_MAX_ERROR_COUNT, OPT_MAX_PREP_STMT,
|
||||
OPT_MAX_ERROR_COUNT,
|
||||
OPT_MYISAM_BLOCK_SIZE, OPT_MYISAM_MAX_EXTRA_SORT_FILE_SIZE,
|
||||
OPT_MYISAM_MAX_SORT_FILE_SIZE, OPT_MYISAM_SORT_BUFFER_SIZE,
|
||||
OPT_NET_BUFFER_LENGTH, OPT_NET_RETRY_COUNT,
|
||||
@ -4277,11 +4277,11 @@ log and this option does nothing anymore.",
|
||||
{ "ft_min_word_len", OPT_FT_MIN_WORD_LEN,
|
||||
"The minimum length of the word to be included in a FULLTEXT index. Note: FULLTEXT indexes must be rebuilt after changing this variable.",
|
||||
(gptr*) &ft_min_word_len, (gptr*) &ft_min_word_len, 0, GET_ULONG,
|
||||
REQUIRED_ARG, 4, 1, HA_FT_MAXLEN, 0, 1, 0},
|
||||
REQUIRED_ARG, 4, 1, HA_FT_MAXCHARLEN, 0, 1, 0},
|
||||
{ "ft_max_word_len", OPT_FT_MAX_WORD_LEN,
|
||||
"The maximum length of the word to be included in a FULLTEXT index. Note: FULLTEXT indexes must be rebuilt after changing this variable.",
|
||||
(gptr*) &ft_max_word_len, (gptr*) &ft_max_word_len, 0, GET_ULONG,
|
||||
REQUIRED_ARG, HA_FT_MAXLEN, 10, HA_FT_MAXLEN, 0, 1, 0},
|
||||
REQUIRED_ARG, HA_FT_MAXCHARLEN, 10, HA_FT_MAXCHARLEN, 0, 1, 0},
|
||||
{ "ft_query_expansion_limit", OPT_FT_QUERY_EXPANSION_LIMIT,
|
||||
"Number of best matches to use for query expansion",
|
||||
(gptr*) &ft_query_expansion_limit, (gptr*) &ft_query_expansion_limit, 0, GET_ULONG,
|
||||
@ -4440,11 +4440,6 @@ The minimum value for this variable is 4096.",
|
||||
(gptr*) &global_system_variables.max_length_for_sort_data,
|
||||
(gptr*) &max_system_variables.max_length_for_sort_data, 0, GET_ULONG,
|
||||
REQUIRED_ARG, 1024, 4, 8192*1024L, 0, 1, 0},
|
||||
{"max_prepared_statements", OPT_MAX_PREP_STMT,
|
||||
"Max number of prepared_statements for a thread.",
|
||||
(gptr*) &global_system_variables.max_prep_stmt_count,
|
||||
(gptr*) &max_system_variables.max_prep_stmt_count, 0, GET_ULONG,
|
||||
REQUIRED_ARG, DEFAULT_PREP_STMT_COUNT, 0, ~0L, 0, 1, 0},
|
||||
{"max_relay_log_size", OPT_MAX_RELAY_LOG_SIZE,
|
||||
"If non-zero: relay log will be rotated automatically when the size exceeds this value; if zero (the default): when the size exceeds max_binlog_size. 0 expected, the minimum value for this variable is 4096.",
|
||||
(gptr*) &max_relay_log_size, (gptr*) &max_relay_log_size, 0, GET_ULONG,
|
||||
@ -5457,13 +5452,12 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
||||
break;
|
||||
case OPT_TABLE_TYPE:
|
||||
{
|
||||
int type;
|
||||
if ((type=find_type(argument, &ha_table_typelib, 2)) <= 0)
|
||||
if ((enum db_type)((global_system_variables.table_type=
|
||||
ha_resolve_by_name(argument, strlen(argument)))) == DB_TYPE_UNKNOWN)
|
||||
{
|
||||
fprintf(stderr,"Unknown table type: %s\n",argument);
|
||||
exit(1);
|
||||
}
|
||||
global_system_variables.table_type= type-1;
|
||||
break;
|
||||
}
|
||||
case OPT_SERVER_ID:
|
||||
|
@ -203,8 +203,6 @@ sys_var_thd_ha_rows sys_sql_max_join_size("sql_max_join_size",
|
||||
&SV::max_join_size,
|
||||
fix_max_join_size);
|
||||
#endif
|
||||
sys_var_thd_ulong sys_max_prep_stmt_count("max_prepared_statements",
|
||||
&SV::max_prep_stmt_count);
|
||||
sys_var_long_ptr sys_max_relay_log_size("max_relay_log_size",
|
||||
&max_relay_log_size,
|
||||
fix_max_relay_log_size);
|
||||
@ -285,8 +283,8 @@ sys_var_thd_ulong sys_sort_buffer("sort_buffer_size",
|
||||
&SV::sortbuff_size);
|
||||
sys_var_thd_sql_mode sys_sql_mode("sql_mode",
|
||||
&SV::sql_mode);
|
||||
sys_var_thd_enum sys_table_type("table_type", &SV::table_type,
|
||||
&ha_table_typelib);
|
||||
sys_var_thd_table_type sys_table_type("table_type",
|
||||
&SV::table_type);
|
||||
sys_var_long_ptr sys_table_cache_size("table_cache",
|
||||
&table_cache_size);
|
||||
sys_var_long_ptr sys_thread_cache_size("thread_cache_size",
|
||||
@ -463,7 +461,6 @@ sys_var *sys_variables[]=
|
||||
&sys_max_heap_table_size,
|
||||
&sys_max_join_size,
|
||||
&sys_max_length_for_sort_data,
|
||||
&sys_max_prep_stmt_count,
|
||||
&sys_max_relay_log_size,
|
||||
&sys_max_seeks_for_key,
|
||||
&sys_max_sort_length,
|
||||
@ -654,7 +651,6 @@ struct show_var_st init_vars[]= {
|
||||
{sys_max_seeks_for_key.name, (char*) &sys_max_seeks_for_key, SHOW_SYS},
|
||||
{sys_max_length_for_sort_data.name, (char*) &sys_max_length_for_sort_data,
|
||||
SHOW_SYS},
|
||||
{sys_max_prep_stmt_count.name,(char*) &sys_max_prep_stmt_count, SHOW_SYS},
|
||||
{sys_max_sort_length.name, (char*) &sys_max_sort_length, SHOW_SYS},
|
||||
{sys_max_user_connections.name,(char*) &sys_max_user_connections, SHOW_SYS},
|
||||
{sys_max_tmp_tables.name, (char*) &sys_max_tmp_tables, SHOW_SYS},
|
||||
@ -2434,6 +2430,61 @@ int set_var_password::update(THD *thd)
|
||||
#endif
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Functions to handle table_type
|
||||
****************************************************************************/
|
||||
|
||||
bool sys_var_thd_table_type::check(THD *thd, set_var *var)
|
||||
/* Based upon sys_var::check_enum() */
|
||||
{
|
||||
char buff[80];
|
||||
const char *value;
|
||||
String str(buff, sizeof(buff), &my_charset_latin1), *res;
|
||||
|
||||
if (var->value->result_type() == STRING_RESULT)
|
||||
{
|
||||
if (!(res=var->value->val_str(&str)) ||
|
||||
!(var->save_result.ulong_value=
|
||||
(ulong) ha_resolve_by_name(res->ptr(), res->length())))
|
||||
{
|
||||
value= res ? res->c_ptr() : "NULL";
|
||||
goto err;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
err:
|
||||
my_error(ER_UNKNOWN_TABLE_ENGINE, MYF(0), value);
|
||||
return 1;
|
||||
}
|
||||
|
||||
byte *sys_var_thd_table_type::value_ptr(THD *thd, enum_var_type type,
|
||||
LEX_STRING *base)
|
||||
{
|
||||
ulong val;
|
||||
val= ((type == OPT_GLOBAL) ? global_system_variables.*offset :
|
||||
thd->variables.*offset);
|
||||
const char *table_type= ha_get_table_type((enum db_type)val);
|
||||
return (byte *)table_type;
|
||||
}
|
||||
|
||||
void sys_var_thd_table_type::set_default(THD *thd, enum_var_type type)
|
||||
{
|
||||
if (type == OPT_GLOBAL)
|
||||
global_system_variables.*offset= (ulong) DB_TYPE_MYISAM;
|
||||
else
|
||||
thd->variables.*offset= (ulong) (global_system_variables.*offset);
|
||||
}
|
||||
|
||||
bool sys_var_thd_table_type::update(THD *thd, set_var *var)
|
||||
{
|
||||
if (var->type == OPT_GLOBAL)
|
||||
global_system_variables.*offset= var->save_result.ulong_value;
|
||||
else
|
||||
thd->variables.*offset= var->save_result.ulong_value;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Functions to handle sql_mode
|
||||
****************************************************************************/
|
||||
|
@ -343,6 +343,26 @@ public:
|
||||
};
|
||||
|
||||
|
||||
class sys_var_thd_table_type :public sys_var_thd
|
||||
{
|
||||
protected:
|
||||
ulong SV::*offset;
|
||||
public:
|
||||
sys_var_thd_table_type(const char *name_arg, ulong SV::*offset_arg)
|
||||
:sys_var_thd(name_arg), offset(offset_arg)
|
||||
{}
|
||||
bool check(THD *thd, set_var *var);
|
||||
SHOW_TYPE type() { return SHOW_CHAR; }
|
||||
bool check_update_type(Item_result type)
|
||||
{
|
||||
return type != STRING_RESULT; /* Only accept strings */
|
||||
}
|
||||
void set_default(THD *thd, enum_var_type type);
|
||||
bool update(THD *thd, set_var *var);
|
||||
byte *value_ptr(THD *thd, enum_var_type type, LEX_STRING *base);
|
||||
};
|
||||
|
||||
|
||||
class sys_var_thd_bit :public sys_var_thd
|
||||
{
|
||||
sys_update_func update_func;
|
||||
|
@ -297,6 +297,7 @@ character-set=latin2
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -329,3 +330,4 @@ character-set=latin2
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -291,6 +291,7 @@ character-set=latin1
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -323,3 +324,4 @@ character-set=latin1
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -299,6 +299,7 @@ character-set=latin1
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -331,3 +332,4 @@ character-set=latin1
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -288,6 +288,7 @@ character-set=latin1
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -320,3 +321,4 @@ character-set=latin1
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -293,6 +293,7 @@ character-set=latin7
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -325,3 +326,4 @@ character-set=latin7
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -288,6 +288,7 @@ character-set=latin1
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -320,3 +321,4 @@ character-set=latin1
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -300,6 +300,7 @@ character-set=latin1
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -332,3 +333,4 @@ character-set=latin1
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -288,6 +288,7 @@ character-set=greek
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -320,3 +321,4 @@ character-set=greek
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -290,6 +290,7 @@ character-set=latin2
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -322,3 +323,4 @@ character-set=latin2
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -288,6 +288,7 @@ character-set=latin1
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -320,3 +321,4 @@ character-set=latin1
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -290,6 +290,7 @@ character-set=ujis
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -322,3 +323,4 @@ character-set=ujis
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -288,6 +288,7 @@ character-set=euckr
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -320,3 +321,4 @@ character-set=euckr
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -290,6 +290,7 @@ character-set=latin1
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -322,3 +323,4 @@ character-set=latin1
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -290,6 +290,7 @@ character-set=latin1
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -322,3 +323,4 @@ character-set=latin1
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -292,6 +292,7 @@ character-set=latin2
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -324,3 +325,4 @@ character-set=latin2
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -289,6 +289,7 @@ character-set=latin1
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -321,3 +322,4 @@ character-set=latin1
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -292,6 +292,7 @@ character-set=latin2
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -324,3 +325,4 @@ character-set=latin2
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -290,6 +290,7 @@ character-set=koi8r
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -322,3 +323,4 @@ character-set=koi8r
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -283,6 +283,7 @@ character-set=cp1250
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -315,3 +316,4 @@ character-set=cp1250
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -296,6 +296,7 @@ character-set=latin2
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -328,3 +329,4 @@ character-set=latin2
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -290,6 +290,7 @@ character-set=latin1
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -322,3 +323,4 @@ character-set=latin1
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -288,6 +288,7 @@ character-set=latin1
|
||||
"Kolumn '%-.64s' kan inte vara del av ett FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -320,3 +321,4 @@ character-set=latin1
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -293,6 +293,7 @@ character-set=koi8u
|
||||
"Column '%-.64s' cannot be part of FULLTEXT index",
|
||||
"Unknown key cache '%-.100s'",
|
||||
"MySQL is started in --skip-name-resolve mode. You need to restart it without this switch for this grant to work",
|
||||
"Unknown table engine '%s'",
|
||||
"Can't create a %s from within another stored routine"
|
||||
"%s %s already exists"
|
||||
"%s %s does not exist"
|
||||
@ -325,3 +326,4 @@ character-set=koi8u
|
||||
"Duplicate condition: %s"
|
||||
"Duplicate cursor: %s"
|
||||
"Failed to ALTER %s %s"
|
||||
"Subselect value not supported"
|
||||
|
@ -3107,7 +3107,6 @@ slave_begin:
|
||||
sql_print_error("Failed during slave thread initialization");
|
||||
goto err;
|
||||
}
|
||||
thd->init_for_queries();
|
||||
rli->sql_thd= thd;
|
||||
thd->temporary_tables = rli->save_temporary_tables; // restore temp tables
|
||||
pthread_mutex_lock(&LOCK_thread_count);
|
||||
|
@ -537,6 +537,7 @@ sp_head::restore_lex(THD *thd)
|
||||
DBUG_ENTER("sp_head::restore_lex");
|
||||
LEX *sublex= thd->lex;
|
||||
LEX *oldlex= (LEX *)m_lex.pop();
|
||||
SELECT_LEX *sl;
|
||||
|
||||
if (! oldlex)
|
||||
return; // Nothing to restore
|
||||
@ -544,7 +545,7 @@ sp_head::restore_lex(THD *thd)
|
||||
// Update some state in the old one first
|
||||
oldlex->ptr= sublex->ptr;
|
||||
oldlex->next_state= sublex->next_state;
|
||||
for (SELECT_LEX *sl= sublex->all_selects_list ;
|
||||
for (sl= sublex->all_selects_list ;
|
||||
sl ;
|
||||
sl= sl->next_select_in_list())
|
||||
{
|
||||
@ -584,7 +585,7 @@ sp_head::restore_lex(THD *thd)
|
||||
// QQ ...or just open tables in thd->open_tables?
|
||||
// This is not entirerly clear at the moment, but for now, we collect
|
||||
// tables here.
|
||||
for (SELECT_LEX *sl= sublex.all_selects_list ;
|
||||
for (sl= sublex.all_selects_list ;
|
||||
sl ;
|
||||
sl= sl->next_select())
|
||||
{
|
||||
@ -714,6 +715,7 @@ sp_instr_stmt::exec_stmt(THD *thd, LEX *lex)
|
||||
{
|
||||
LEX *olex; // The other lex
|
||||
Item *freelist;
|
||||
SELECT_LEX *sl;
|
||||
int res;
|
||||
|
||||
olex= thd->lex; // Save the other lex
|
||||
@ -726,7 +728,7 @@ sp_instr_stmt::exec_stmt(THD *thd, LEX *lex)
|
||||
|
||||
// Copy WHERE clause pointers to avoid damaging by optimisation
|
||||
// Also clear ref_pointer_arrays.
|
||||
for (SELECT_LEX *sl= lex->all_selects_list ;
|
||||
for (sl= lex->all_selects_list ;
|
||||
sl ;
|
||||
sl= sl->next_select_in_list())
|
||||
{
|
||||
@ -772,7 +774,7 @@ sp_instr_stmt::exec_stmt(THD *thd, LEX *lex)
|
||||
close_thread_tables(thd); /* Free tables */
|
||||
}
|
||||
|
||||
for (SELECT_LEX *sl= lex->all_selects_list ;
|
||||
for (sl= lex->all_selects_list ;
|
||||
sl ;
|
||||
sl= sl->next_select_in_list())
|
||||
{
|
||||
|
106
sql/sql_class.cc
106
sql/sql_class.cc
@ -91,21 +91,21 @@ THD::THD():user_time(0), is_fatal_error(0),
|
||||
insert_id_used(0), rand_used(0), in_lock_tables(0),
|
||||
global_read_lock(0), bootstrap(0), spcont(NULL)
|
||||
{
|
||||
lex= &main_lex;
|
||||
host=user=priv_user=db=query=ip=0;
|
||||
host= user= priv_user= db= ip= 0;
|
||||
host_or_ip= "connecting host";
|
||||
locked=some_tables_deleted=no_errors=password= 0;
|
||||
query_start_used= 0;
|
||||
count_cuted_fields= CHECK_FIELD_IGNORE;
|
||||
killed= NOT_KILLED;
|
||||
db_length=query_length=col_access=0;
|
||||
db_length= col_access=0;
|
||||
query_error= tmp_table_used= 0;
|
||||
next_insert_id=last_insert_id=0;
|
||||
open_tables= temporary_tables= handler_tables= derived_tables= 0;
|
||||
tmp_table=0;
|
||||
lock=locked_tables=0;
|
||||
used_tables=0;
|
||||
cuted_fields= sent_row_count= current_stmt_id= 0L;
|
||||
cuted_fields= sent_row_count= 0L;
|
||||
statement_id_counter= 0UL;
|
||||
// Must be reset to handle error with THD's created for init of mysqld
|
||||
lex->current_select= 0;
|
||||
start_time=(time_t) 0;
|
||||
@ -141,7 +141,6 @@ THD::THD():user_time(0), is_fatal_error(0),
|
||||
server_id = ::server_id;
|
||||
slave_net = 0;
|
||||
command=COM_CONNECT;
|
||||
set_query_id=1;
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
db_access=NO_ACCESS;
|
||||
#endif
|
||||
@ -149,8 +148,10 @@ THD::THD():user_time(0), is_fatal_error(0),
|
||||
*scramble= '\0';
|
||||
|
||||
init();
|
||||
init_sql_alloc(&mem_root, // must be after init()
|
||||
variables.query_alloc_block_size,
|
||||
variables.query_prealloc_size);
|
||||
/* Initialize sub structures */
|
||||
bzero((char*) &mem_root,sizeof(mem_root));
|
||||
init_alloc_root(&warn_root, WARN_ALLOC_BLOCK_SIZE, WARN_ALLOC_PREALLOC_SIZE);
|
||||
user_connect=(USER_CONN *)0;
|
||||
hash_init(&user_vars, system_charset_info, USER_VARS_HASH_SIZE, 0, 0,
|
||||
@ -192,7 +193,9 @@ THD::THD():user_time(0), is_fatal_error(0),
|
||||
transaction.trans_log.end_of_file= max_binlog_cache_size;
|
||||
}
|
||||
#endif
|
||||
|
||||
init_sql_alloc(&transaction.mem_root,
|
||||
variables.trans_alloc_block_size,
|
||||
variables.trans_prealloc_size);
|
||||
/*
|
||||
We need good random number initialization for new thread
|
||||
Just coping global one will not work
|
||||
@ -235,22 +238,6 @@ void THD::init(void)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Init THD for query processing
|
||||
|
||||
This has to be called once before we call mysql_parse()
|
||||
*/
|
||||
|
||||
void THD::init_for_queries()
|
||||
{
|
||||
init_sql_alloc(&mem_root, variables.query_alloc_block_size,
|
||||
variables.query_prealloc_size);
|
||||
init_sql_alloc(&transaction.mem_root,
|
||||
variables.trans_alloc_block_size,
|
||||
variables.trans_prealloc_size);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Do what's needed when one invokes change user
|
||||
|
||||
@ -351,13 +338,12 @@ THD::~THD()
|
||||
safeFree(user);
|
||||
safeFree(db);
|
||||
safeFree(ip);
|
||||
free_root(&mem_root,MYF(0));
|
||||
free_root(&warn_root,MYF(0));
|
||||
free_root(&transaction.mem_root,MYF(0));
|
||||
mysys_var=0; // Safety (shouldn't be needed)
|
||||
free_root(&warn_root, MYF(0));
|
||||
free_root(&transaction.mem_root, MYF(0));
|
||||
mysys_var= 0; // Safety (shouldn't be needed)
|
||||
pthread_mutex_destroy(&LOCK_delete);
|
||||
#ifndef DBUG_OFF
|
||||
dbug_sentry = THD_SENTRY_GONE;
|
||||
dbug_sentry= THD_SENTRY_GONE;
|
||||
#endif
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
@ -1280,3 +1266,67 @@ void TMP_TABLE_PARAM::init()
|
||||
group_parts= group_length= group_null_parts= 0;
|
||||
quick_group= 1;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
Statement functions
|
||||
****************************************************************************/
|
||||
|
||||
Statement::Statement(THD *thd)
|
||||
:id(++thd->statement_id_counter),
|
||||
query_id(0), /* initialized later */
|
||||
set_query_id(1),
|
||||
allow_sum_func(0), /* initialized later */
|
||||
command(COM_SLEEP), /* initialized later */
|
||||
lex(&main_lex),
|
||||
query(0), /* these two are set */
|
||||
query_length(0), /* in alloc_query() */
|
||||
free_list(0)
|
||||
{
|
||||
init_sql_alloc(&mem_root,
|
||||
thd->variables.query_alloc_block_size,
|
||||
thd->variables.query_prealloc_size);
|
||||
}
|
||||
|
||||
|
||||
Statement::Statement()
|
||||
:id(0),
|
||||
query_id(0),
|
||||
set_query_id(1),
|
||||
allow_sum_func(0),
|
||||
command(COM_SLEEP),
|
||||
lex(&main_lex),
|
||||
query(0),
|
||||
query_length(0),
|
||||
free_list(0)
|
||||
{
|
||||
bzero((char *) &mem_root, sizeof(mem_root));
|
||||
}
|
||||
|
||||
|
||||
Statement::~Statement()
|
||||
{
|
||||
free_root(&mem_root, MYF(0));
|
||||
}
|
||||
|
||||
|
||||
C_MODE_START
|
||||
|
||||
static byte *
|
||||
get_statement_id_as_hash_key(const byte *record, uint *key_length,
|
||||
my_bool not_used __attribute__((unused)))
|
||||
{
|
||||
const Statement *statement= (const Statement *) record;
|
||||
*key_length= sizeof(statement->id);
|
||||
return (byte *) &((const Statement *) statement)->id;
|
||||
}
|
||||
|
||||
C_MODE_END
|
||||
|
||||
|
||||
Statement_map::Statement_map()
|
||||
{
|
||||
enum { START_HASH_SIZE = 16 };
|
||||
hash_init(&st_hash, default_charset_info, START_HASH_SIZE, 0, 0,
|
||||
get_statement_id_as_hash_key, (hash_free_key) 0, MYF(0));
|
||||
}
|
||||
|
||||
|
150
sql/sql_class.h
150
sql/sql_class.h
@ -375,7 +375,6 @@ struct system_variables
|
||||
ulong max_error_count;
|
||||
ulong max_heap_table_size;
|
||||
ulong max_length_for_sort_data;
|
||||
ulong max_prep_stmt_count;
|
||||
ulong max_sort_length;
|
||||
ulong max_tmp_tables;
|
||||
ulong myisam_repair_threads;
|
||||
@ -431,12 +430,130 @@ struct system_variables
|
||||
};
|
||||
|
||||
void free_tmp_table(THD *thd, TABLE *entry);
|
||||
|
||||
|
||||
/*
|
||||
State of a single command executed against this connection.
|
||||
One connection can contain a lot of simultaneously running statements,
|
||||
some of which could be:
|
||||
- prepared, that is, contain placeholders,
|
||||
- opened as cursors. We maintain 1 to 1 relationship between
|
||||
statement and cursor - if user wants to create another cursor for his
|
||||
query, we create another statement for it.
|
||||
To perform some action with statement we reset THD part to the state of
|
||||
that statement, do the action, and then save back modified state from THD
|
||||
to the statement. It will be changed in near future, and Statement will
|
||||
be used explicitly.
|
||||
*/
|
||||
|
||||
class Statement
|
||||
{
|
||||
public:
|
||||
/* FIXME: must be private */
|
||||
LEX main_lex;
|
||||
public:
|
||||
/*
|
||||
Uniquely identifies each statement object in thread scope; change during
|
||||
statement lifetime.
|
||||
*/
|
||||
ulong id;
|
||||
|
||||
/*
|
||||
Id of current query. Statement can be reused to execute several queries.
|
||||
query_id is global in context of the whole MySQL server.
|
||||
Id is automatically generated from mutex-protected counter.
|
||||
It's used in handler code for various purposes: to check which columns
|
||||
from table are necessary for this select, to check if it's necessary to
|
||||
update auto-updatable fields (like auto_increment and timestamp).
|
||||
*/
|
||||
ulong query_id;
|
||||
/*
|
||||
- if set_query_id == 1, we set field->query_id for all fields. In that case
|
||||
field list can not contain duplicates.
|
||||
*/
|
||||
bool set_query_id;
|
||||
/*
|
||||
This variable is used in post-parse stage to declare that sum-functions,
|
||||
or functions which have sense only if GROUP BY is present, are allowed.
|
||||
For example in queries
|
||||
SELECT MIN(i) FROM foo
|
||||
SELECT GROUP_CONCAT(a, b, MIN(i)) FROM ... GROUP BY ...
|
||||
MIN(i) have no sense.
|
||||
Though it's grammar-related issue, it's hard to catch it out during the
|
||||
parse stage because GROUP BY clause goes in the end of query. This
|
||||
variable is mainly used in setup_fields/fix_fields.
|
||||
See item_sum.cc for details.
|
||||
*/
|
||||
bool allow_sum_func;
|
||||
/*
|
||||
Type of current query: COM_PREPARE, COM_QUERY, etc. Set from the
|
||||
first byte of the incoming packet in do_command()
|
||||
*/
|
||||
enum enum_server_command command;
|
||||
|
||||
LEX *lex; // parse tree descriptor
|
||||
/*
|
||||
Points to the query associated with this statement. It's const, but
|
||||
we need to declare it char * because all table handlers are written
|
||||
in C and need to point to it.
|
||||
*/
|
||||
char *query;
|
||||
uint32 query_length; // current query length
|
||||
/*
|
||||
List of items created in the parser for this query. Every item puts
|
||||
itself to the list on creation (see Item::Item() for details))
|
||||
*/
|
||||
Item *free_list;
|
||||
MEM_ROOT mem_root;
|
||||
|
||||
protected:
|
||||
/*
|
||||
This constructor is called when statement is a subobject of THD:
|
||||
some variables are initialized in THD::init due to locking problems
|
||||
*/
|
||||
Statement();
|
||||
public:
|
||||
Statement(THD *thd);
|
||||
virtual ~Statement();
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
Used to seek all existing statements in the connection
|
||||
Not responsible for statements memory.
|
||||
*/
|
||||
|
||||
class Statement_map
|
||||
{
|
||||
public:
|
||||
Statement_map();
|
||||
|
||||
int insert(Statement *statement)
|
||||
{
|
||||
return my_hash_insert(&st_hash, (byte *) statement);
|
||||
}
|
||||
Statement *seek(ulong id)
|
||||
{
|
||||
return (Statement *) hash_search(&st_hash, (byte *) &id, sizeof(id));
|
||||
}
|
||||
void erase(Statement *statement)
|
||||
{
|
||||
hash_delete(&st_hash, (byte *) statement);
|
||||
}
|
||||
|
||||
~Statement_map() { hash_free(&st_hash); }
|
||||
private:
|
||||
HASH st_hash;
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
For each client connection we create a separate thread with THD serving as
|
||||
a thread/connection descriptor
|
||||
*/
|
||||
|
||||
class THD :public ilink
|
||||
class THD :public ilink,
|
||||
public Statement
|
||||
{
|
||||
public:
|
||||
#ifdef EMBEDDED_LIBRARY
|
||||
@ -449,9 +566,6 @@ public:
|
||||
ulong extra_length;
|
||||
#endif
|
||||
NET net; // client connection descriptor
|
||||
LEX main_lex;
|
||||
LEX *lex; // parse tree descriptor
|
||||
MEM_ROOT mem_root; // 1 command-life memory pool
|
||||
MEM_ROOT warn_root; // For warnings and errors
|
||||
Protocol *protocol; // Current protocol
|
||||
Protocol_simple protocol_simple; // Normal protocol
|
||||
@ -464,7 +578,6 @@ public:
|
||||
struct system_variables variables; // Changeable local variables
|
||||
pthread_mutex_t LOCK_delete; // Locked before thd is deleted
|
||||
|
||||
char *query; // Points to the current query,
|
||||
/*
|
||||
A pointer to the stack frame of handle_one_connection(),
|
||||
which is called first in the thread for handling a client
|
||||
@ -507,13 +620,17 @@ public:
|
||||
// TODO: document the variables below
|
||||
MYSQL_LOCK *lock; /* Current locks */
|
||||
MYSQL_LOCK *locked_tables; /* Tables locked with LOCK */
|
||||
/*
|
||||
One thread can hold up to one named user-level lock. This variable
|
||||
points to a lock object if the lock is present. See item_func.cc and
|
||||
chapter 'Miscellaneous functions', for functions GET_LOCK, RELEASE_LOCK.
|
||||
*/
|
||||
ULL *ull;
|
||||
PREP_STMT *last_prepared_stmt;
|
||||
#ifndef DBUG_OFF
|
||||
uint dbug_sentry; // watch out for memory corruption
|
||||
#endif
|
||||
struct st_my_thread_var *mysys_var;
|
||||
enum enum_server_command command;
|
||||
uint32 server_id;
|
||||
uint32 file_id; // for LOAD DATA INFILE
|
||||
/*
|
||||
@ -546,7 +663,6 @@ public:
|
||||
free_root(&mem_root,MYF(MY_KEEP_PREALLOC));
|
||||
}
|
||||
} transaction;
|
||||
Item *free_list;
|
||||
Field *dupp_field;
|
||||
#ifndef __WIN__
|
||||
sigset_t signals,block_signals;
|
||||
@ -577,18 +693,25 @@ public:
|
||||
USER_CONN *user_connect;
|
||||
CHARSET_INFO *db_charset;
|
||||
List<TABLE> temporary_tables_should_be_free; // list of temporary tables
|
||||
/*
|
||||
FIXME: this, and some other variables like 'count_cuted_fields'
|
||||
maybe should be statement/cursor local, that is, moved to Statement
|
||||
class. With current implementation warnings produced in each prepared
|
||||
statement/ cursor settle here.
|
||||
*/
|
||||
List <MYSQL_ERROR> warn_list;
|
||||
uint warn_count[(uint) MYSQL_ERROR::WARN_LEVEL_END];
|
||||
uint total_warn_count;
|
||||
ulong query_id, warn_id, version, options, thread_id, col_access;
|
||||
ulong current_stmt_id;
|
||||
ulong warn_id, version, options, thread_id, col_access;
|
||||
|
||||
/* Statement id is thread-wide. This counter is used to generate ids */
|
||||
ulong statement_id_counter;
|
||||
ulong rand_saved_seed1, rand_saved_seed2;
|
||||
ulong row_count; // Row counter, mainly for errors and warnings
|
||||
long dbug_thread_id;
|
||||
pthread_t real_id;
|
||||
uint current_tablenr,tmp_table;
|
||||
uint server_status,open_options;
|
||||
uint32 query_length;
|
||||
uint32 db_length;
|
||||
uint select_number; //number of select (used for EXPLAIN)
|
||||
/* variables.transaction_isolation is reset to this after each commit */
|
||||
@ -601,9 +724,9 @@ public:
|
||||
char scramble[SCRAMBLE_LENGTH+1];
|
||||
|
||||
bool slave_thread;
|
||||
bool set_query_id,locked,some_tables_deleted;
|
||||
bool locked, some_tables_deleted;
|
||||
bool last_cuted_field;
|
||||
bool no_errors, allow_sum_func, password, is_fatal_error;
|
||||
bool no_errors, password, is_fatal_error;
|
||||
bool query_start_used,last_insert_id_used,insert_id_used,rand_used;
|
||||
bool system_thread,in_lock_tables,global_read_lock;
|
||||
bool query_error, bootstrap, cleanup_done;
|
||||
@ -646,7 +769,6 @@ public:
|
||||
|
||||
void init(void);
|
||||
void change_user(void);
|
||||
void init_for_queries();
|
||||
void cleanup(void);
|
||||
bool store_globals();
|
||||
#ifdef SIGNAL_WITH_VIO_CLOSE
|
||||
|
@ -948,7 +948,6 @@ pthread_handler_decl(handle_one_connection,arg)
|
||||
thd->command=COM_SLEEP;
|
||||
thd->version=refresh_version;
|
||||
thd->set_time();
|
||||
thd->init_for_queries();
|
||||
while (!net->error && net->vio != 0 && !(thd->killed == THD::KILL_CONNECTION))
|
||||
{
|
||||
if (do_command(thd))
|
||||
@ -1028,7 +1027,6 @@ extern "C" pthread_handler_decl(handle_bootstrap,arg)
|
||||
thd->priv_user=thd->user=(char*) my_strdup("boot", MYF(MY_WME));
|
||||
|
||||
buff= (char*) thd->net.buff;
|
||||
thd->init_for_queries();
|
||||
while (fgets(buff, thd->net.max_packet, file))
|
||||
{
|
||||
uint length=(uint) strlen(buff);
|
||||
|
@ -901,7 +901,7 @@ bool mysql_stmt_prepare(THD *thd, char *packet, uint packet_length)
|
||||
|
||||
bzero((char*) &stmt, sizeof(stmt));
|
||||
|
||||
stmt.stmt_id= ++thd->current_stmt_id;
|
||||
stmt.stmt_id= ++thd->statement_id_counter;
|
||||
init_sql_alloc(&stmt.mem_root,
|
||||
thd->variables.query_alloc_block_size,
|
||||
thd->variables.query_prealloc_size);
|
||||
|
@ -173,33 +173,6 @@ int mysqld_show_tables(THD *thd,const char *db,const char *wild)
|
||||
** List all table types supported
|
||||
***************************************************************************/
|
||||
|
||||
struct show_table_type_st {
|
||||
const char *type;
|
||||
SHOW_COMP_OPTION *value;
|
||||
const char *comment;
|
||||
};
|
||||
|
||||
|
||||
SHOW_COMP_OPTION have_yes= SHOW_OPTION_YES;
|
||||
|
||||
static struct show_table_type_st sys_table_types[]=
|
||||
{
|
||||
{"MyISAM", &have_yes,
|
||||
"Default type from 3.23 with great performance"},
|
||||
{"HEAP" , &have_yes,
|
||||
"Hash based, stored in memory, useful for temporary tables"},
|
||||
{"MERGE", &have_yes,
|
||||
"Collection of identical MyISAM tables"},
|
||||
{"ISAM", &have_isam,
|
||||
"Obsolete table type; Is replaced by MyISAM"},
|
||||
{"InnoDB", &have_innodb,
|
||||
"Supports transactions, row-level locking and foreign keys"},
|
||||
{"BDB", &have_berkeley_db,
|
||||
"Supports transactions and page-level locking"},
|
||||
{NullS, NULL, NullS}
|
||||
};
|
||||
|
||||
|
||||
int mysqld_show_table_types(THD *thd)
|
||||
{
|
||||
List<Item> field_list;
|
||||
@ -213,8 +186,8 @@ int mysqld_show_table_types(THD *thd)
|
||||
if (protocol->send_fields(&field_list,1))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
const char *default_type_name=
|
||||
ha_table_typelib.type_names[thd->variables.table_type];
|
||||
const char *default_type_name=
|
||||
ha_get_table_type((enum db_type)thd->variables.table_type);
|
||||
|
||||
show_table_type_st *types;
|
||||
for (types= sys_table_types; types->type; types++)
|
||||
|
@ -400,7 +400,7 @@ int mysql_create_table(THD *thd,const char *db, const char *table_name,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_WARN_USING_OTHER_HANDLER,
|
||||
ER(ER_WARN_USING_OTHER_HANDLER),
|
||||
ha_table_typelib.type_names[new_db_type],
|
||||
ha_get_table_type(new_db_type),
|
||||
table_name);
|
||||
}
|
||||
db_options=create_info->table_options;
|
||||
@ -2007,7 +2007,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
||||
push_warning_printf(thd, MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_WARN_USING_OTHER_HANDLER,
|
||||
ER(ER_WARN_USING_OTHER_HANDLER),
|
||||
ha_table_typelib.type_names[new_db_type],
|
||||
ha_get_table_type(new_db_type),
|
||||
new_name);
|
||||
}
|
||||
if (create_info->row_type == ROW_TYPE_NOT_USED)
|
||||
|
@ -81,7 +81,7 @@ inline Item *or_or_concat(THD *thd, Item* A, Item* B)
|
||||
enum Item_udftype udf_type;
|
||||
CHARSET_INFO *charset;
|
||||
thr_lock_type lock_type;
|
||||
interval_type interval;
|
||||
interval_type interval, interval_time_st;
|
||||
timestamp_type date_time_type;
|
||||
st_select_lex *select_lex;
|
||||
chooser_compare_func_creator boolfunc2creator;
|
||||
@ -459,6 +459,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
|
||||
%token STRING_SYM
|
||||
%token TEXT_SYM
|
||||
%token TIMESTAMP
|
||||
%token TIMESTAMP_ADD
|
||||
%token TIMESTAMP_DIFF
|
||||
%token TIME_SYM
|
||||
%token TINYBLOB
|
||||
%token TINYINT
|
||||
@ -502,6 +504,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
|
||||
%token FIELD_FUNC
|
||||
%token FORMAT_SYM
|
||||
%token FOR_SYM
|
||||
%token FRAC_SECOND_SYM
|
||||
%token FROM_UNIXTIME
|
||||
%token GEOMCOLLFROMTEXT
|
||||
%token GEOMFROMTEXT
|
||||
@ -547,6 +550,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
|
||||
%token POLYGON
|
||||
%token POSITION_SYM
|
||||
%token PROCEDURE
|
||||
%token QUARTER_SYM
|
||||
%token RAND
|
||||
%token REPLACE
|
||||
%token RIGHT
|
||||
@ -691,6 +695,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
|
||||
%type <date_time_type> date_time_type;
|
||||
%type <interval> interval
|
||||
|
||||
%type <interval_time_st> interval_time_st
|
||||
|
||||
%type <db_type> table_types
|
||||
|
||||
%type <row_type> row_types
|
||||
@ -1548,10 +1554,15 @@ sp_proc_stmt:
|
||||
}
|
||||
else
|
||||
{
|
||||
sp_instr_freturn *i=
|
||||
new sp_instr_freturn(lex->sphead->instructions(),
|
||||
$2, lex->sphead->m_returns);
|
||||
sp_instr_freturn *i;
|
||||
|
||||
if ($2->type() == Item::SUBSELECT_ITEM)
|
||||
{ /* QQ For now, just disallow subselects as values */
|
||||
send_error(lex->thd, ER_SP_BADSTATEMENT);
|
||||
YYABORT;
|
||||
}
|
||||
i= new sp_instr_freturn(lex->sphead->instructions(),
|
||||
$2, lex->sphead->m_returns);
|
||||
lex->sphead->add_instr(i);
|
||||
lex->sphead->m_has_return= TRUE;
|
||||
}
|
||||
@ -2084,7 +2095,7 @@ table_types:
|
||||
{
|
||||
$$ = ha_resolve_by_name($1.str,$1.length);
|
||||
if ($$ == DB_TYPE_UNKNOWN) {
|
||||
net_printf(YYTHD, ER_UNKNOWN_TABLE, $1.str);
|
||||
net_printf(YYTHD, ER_UNKNOWN_TABLE_ENGINE, $1.str);
|
||||
YYABORT;
|
||||
}
|
||||
};
|
||||
@ -3761,6 +3772,8 @@ simple_expr:
|
||||
Geometry::wkbPolygon, Geometry::wkbLineString); }
|
||||
| POSITION_SYM '(' no_in_expr IN_SYM expr ')'
|
||||
{ $$ = new Item_func_locate($5,$3); }
|
||||
| QUARTER_SYM '(' expr ')'
|
||||
{ $$ = new Item_func_quarter($3); }
|
||||
| RAND '(' expr ')'
|
||||
{ $$= new Item_func_rand($3); Lex->uncacheable(UNCACHEABLE_RAND);}
|
||||
| RAND '(' ')'
|
||||
@ -3794,6 +3807,10 @@ simple_expr:
|
||||
{ $$= new Item_datetime_typecast($3); }
|
||||
| TIMESTAMP '(' expr ',' expr ')'
|
||||
{ $$= new Item_func_add_time($3, $5, 1, 0); }
|
||||
| TIMESTAMP_ADD '(' interval_time_st ',' expr ',' expr ')'
|
||||
{ $$= new Item_date_add_interval($7,$5,$3,0); }
|
||||
| TIMESTAMP_DIFF '(' interval_time_st ',' expr ',' expr ')'
|
||||
{ $$= new Item_func_timestamp_diff($5,$7,$3); }
|
||||
| TRIM '(' expr ')'
|
||||
{ $$= new Item_func_trim($3); }
|
||||
| TRIM '(' LEADING expr FROM expr ')'
|
||||
@ -4284,23 +4301,29 @@ using_list:
|
||||
};
|
||||
|
||||
interval:
|
||||
DAY_HOUR_SYM { $$=INTERVAL_DAY_HOUR; }
|
||||
interval_time_st {}
|
||||
| DAY_HOUR_SYM { $$=INTERVAL_DAY_HOUR; }
|
||||
| DAY_MICROSECOND_SYM { $$=INTERVAL_DAY_MICROSECOND; }
|
||||
| DAY_MINUTE_SYM { $$=INTERVAL_DAY_MINUTE; }
|
||||
| DAY_SECOND_SYM { $$=INTERVAL_DAY_SECOND; }
|
||||
| DAY_SYM { $$=INTERVAL_DAY; }
|
||||
| HOUR_MICROSECOND_SYM { $$=INTERVAL_HOUR_MICROSECOND; }
|
||||
| HOUR_MINUTE_SYM { $$=INTERVAL_HOUR_MINUTE; }
|
||||
| HOUR_SECOND_SYM { $$=INTERVAL_HOUR_SECOND; }
|
||||
| HOUR_SYM { $$=INTERVAL_HOUR; }
|
||||
| MICROSECOND_SYM { $$=INTERVAL_MICROSECOND; }
|
||||
| MINUTE_MICROSECOND_SYM { $$=INTERVAL_MINUTE_MICROSECOND; }
|
||||
| MINUTE_SECOND_SYM { $$=INTERVAL_MINUTE_SECOND; }
|
||||
| SECOND_MICROSECOND_SYM { $$=INTERVAL_SECOND_MICROSECOND; }
|
||||
| YEAR_MONTH_SYM { $$=INTERVAL_YEAR_MONTH; };
|
||||
|
||||
interval_time_st:
|
||||
DAY_SYM { $$=INTERVAL_DAY; }
|
||||
| WEEK_SYM { $$=INTERVAL_WEEK; }
|
||||
| HOUR_SYM { $$=INTERVAL_HOUR; }
|
||||
| FRAC_SECOND_SYM { $$=INTERVAL_MICROSECOND; }
|
||||
| MINUTE_SYM { $$=INTERVAL_MINUTE; }
|
||||
| MONTH_SYM { $$=INTERVAL_MONTH; }
|
||||
| SECOND_MICROSECOND_SYM { $$=INTERVAL_SECOND_MICROSECOND; }
|
||||
| QUARTER_SYM { $$=INTERVAL_QUARTER; }
|
||||
| SECOND_SYM { $$=INTERVAL_SECOND; }
|
||||
| YEAR_MONTH_SYM { $$=INTERVAL_YEAR_MONTH; }
|
||||
| YEAR_SYM { $$=INTERVAL_YEAR; };
|
||||
|
||||
date_time_type:
|
||||
@ -5807,6 +5830,7 @@ keyword:
|
||||
| PREV_SYM {}
|
||||
| PROCESS {}
|
||||
| PROCESSLIST_SYM {}
|
||||
| QUARTER_SYM {}
|
||||
| QUERY_SYM {}
|
||||
| QUICK {}
|
||||
| RAID_0_SYM {}
|
||||
@ -5858,6 +5882,8 @@ keyword:
|
||||
| TRANSACTION_SYM {}
|
||||
| TRUNCATE_SYM {}
|
||||
| TIMESTAMP {}
|
||||
| TIMESTAMP_ADD {}
|
||||
| TIMESTAMP_DIFF {}
|
||||
| TIME_SYM {}
|
||||
| TYPE_SYM {}
|
||||
| FUNCTION_SYM {}
|
||||
@ -5869,6 +5895,7 @@ keyword:
|
||||
| VARIABLES {}
|
||||
| VALUE_SYM {}
|
||||
| WARNINGS {}
|
||||
| WEEK_SYM {}
|
||||
| WORK_SYM {}
|
||||
| X509_SYM {}
|
||||
| YEAR_SYM {}
|
||||
@ -5933,6 +5960,11 @@ option_value:
|
||||
}
|
||||
else
|
||||
{ /* An SP local variable */
|
||||
if ($3 && $3->type() == Item::SUBSELECT_ITEM)
|
||||
{ /* QQ For now, just disallow subselects as values */
|
||||
send_error(lex->thd, ER_SP_SUBSELECT_NYI);
|
||||
YYABORT;
|
||||
}
|
||||
sp_pvar_t *spv= lex->spcont->find_pvar(&$1.base_name);
|
||||
sp_instr_set *i= new sp_instr_set(lex->sphead->instructions(),
|
||||
spv->offset, $3, spv->type);
|
||||
|
@ -84,7 +84,6 @@
|
||||
#define TRANS_MEM_ROOT_PREALLOC 4096
|
||||
|
||||
#define DEFAULT_ERROR_COUNT 64
|
||||
#define DEFAULT_PREP_STMT_COUNT 64
|
||||
#define EXTRA_RECORDS 10 /* Extra records in sort */
|
||||
#define SCROLL_EXTRA 5 /* Extra scroll-rows. */
|
||||
#define FIELD_NAME_USED ((uint) 32768) /* Bit set if fieldname used */
|
||||
|
Loading…
x
Reference in New Issue
Block a user