mirror of
https://github.com/MariaDB/server.git
synced 2026-05-16 20:07:13 +02:00
merge
myisam/mi_write.c: Auto merged mysql-test/r/subselect.result: Auto merged sql/sql_select.cc: Auto merged
This commit is contained in:
commit
e44a7da25f
93 changed files with 821 additions and 240 deletions
|
|
@ -5,6 +5,7 @@ Administrator@fred.
|
|||
Miguel@light.local
|
||||
Sinisa@sinisa.nasamreza.org
|
||||
WAX@sergbook.mysql.com
|
||||
acurtis@pcgem.rdg.cyberkinetica.com
|
||||
administrador@light.hegel.local
|
||||
ahlentz@co3064164-a.rochd1.qld.optusnet.com.au
|
||||
akishkin@work.mysql.com
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@
|
|||
#include <locale.h>
|
||||
#endif
|
||||
|
||||
const char *VER= "14.3";
|
||||
const char *VER= "14.4";
|
||||
|
||||
/* Don't try to make a nice table if the data is too big */
|
||||
#define MAX_COLUMN_LENGTH 1024
|
||||
|
|
@ -134,7 +134,8 @@ static my_bool info_flag=0,ignore_errors=0,wait_flag=0,quick=0,
|
|||
vertical=0, line_numbers=1, column_names=1,opt_html=0,
|
||||
opt_xml=0,opt_nopager=1, opt_outfile=0, named_cmds= 0,
|
||||
tty_password= 0, opt_nobeep=0, opt_reconnect=1,
|
||||
default_charset_used= 0, opt_secure_auth= 0;
|
||||
default_charset_used= 0, opt_secure_auth= 0,
|
||||
default_pager_set= 0;
|
||||
static uint verbose=0,opt_silent=0,opt_mysql_port=0, opt_local_infile=0;
|
||||
static my_string opt_mysql_unix_port=0;
|
||||
static int connect_flag=CLIENT_INTERACTIVE;
|
||||
|
|
@ -173,9 +174,7 @@ static CHARSET_INFO *charset_info= &my_charset_latin1;
|
|||
|
||||
#include "sslopt-vars.h"
|
||||
|
||||
#ifndef DBUG_OFF
|
||||
const char *default_dbug_option="d:t:o,/tmp/mysql.trace";
|
||||
#endif
|
||||
|
||||
void tee_fprintf(FILE *file, const char *fmt, ...);
|
||||
void tee_fputs(const char *s, FILE *file);
|
||||
|
|
@ -331,9 +330,12 @@ int main(int argc,char *argv[])
|
|||
strmov(pager, "stdout"); // the default, if --pager wasn't given
|
||||
{
|
||||
char *tmp=getenv("PAGER");
|
||||
if (tmp)
|
||||
if (tmp && strlen(tmp))
|
||||
{
|
||||
default_pager_set= 1;
|
||||
strmov(default_pager, tmp);
|
||||
}
|
||||
}
|
||||
if (!isatty(0) || !isatty(1))
|
||||
{
|
||||
status.batch=1; opt_silent=1;
|
||||
|
|
@ -467,6 +469,8 @@ static struct my_option my_long_options[] =
|
|||
{
|
||||
{"help", '?', "Display this help and exit.", 0, 0, 0, GET_NO_ARG, NO_ARG, 0,
|
||||
0, 0, 0, 0, 0},
|
||||
{"help", 'I', "Synonym for -?", 0, 0, 0, GET_NO_ARG, NO_ARG, 0,
|
||||
0, 0, 0, 0, 0},
|
||||
{"auto-rehash", OPT_AUTO_REHASH,
|
||||
"Enable automatic rehashing. One doesn't need to use 'rehash' to get table and field completion, but startup and reconnecting may take a longer time. Disable with --disable-auto-rehash.",
|
||||
(gptr*) &rehash, (gptr*) &rehash, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
|
||||
|
|
@ -484,8 +488,11 @@ static struct my_option my_long_options[] =
|
|||
{"compress", 'C', "Use compression in server/client protocol.",
|
||||
(gptr*) &opt_compress, (gptr*) &opt_compress, 0, GET_BOOL, NO_ARG, 0, 0, 0,
|
||||
0, 0, 0},
|
||||
#ifndef DBUG_OFF
|
||||
{"debug", '#', "Output debug log.", (gptr*) &default_dbug_option,
|
||||
#ifdef DBUG_OFF
|
||||
{"debug", '#', "This is a non-debug version. Catch this and exit",
|
||||
0,0, 0, GET_DISABLED, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#else
|
||||
{"debug", '#', "Output debug log", (gptr*) &default_dbug_option,
|
||||
(gptr*) &default_dbug_option, 0, GET_STR, OPT_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
{"database", 'D', "Database to use.", (gptr*) ¤t_db,
|
||||
|
|
@ -608,19 +615,27 @@ static struct my_option my_long_options[] =
|
|||
GET_NO_ARG, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"wait", 'w', "Wait and retry if connection is down.", 0, 0, 0, GET_NO_ARG,
|
||||
NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"connect_timeout", OPT_CONNECT_TIMEOUT, "", (gptr*) &opt_connect_timeout,
|
||||
{"connect_timeout", OPT_CONNECT_TIMEOUT,
|
||||
"Number of seconds before connection timeout.",
|
||||
(gptr*) &opt_connect_timeout,
|
||||
(gptr*) &opt_connect_timeout, 0, GET_ULONG, REQUIRED_ARG, 0, 0, 3600*12, 0,
|
||||
0, 1},
|
||||
{"max_allowed_packet", OPT_MAX_ALLOWED_PACKET, "",
|
||||
{"max_allowed_packet", OPT_MAX_ALLOWED_PACKET,
|
||||
"Max packet length to send to, or receive from server",
|
||||
(gptr*) &max_allowed_packet, (gptr*) &max_allowed_packet, 0, GET_ULONG,
|
||||
REQUIRED_ARG, 16 *1024L*1024L, 4096, (longlong) 2*1024L*1024L*1024L,
|
||||
MALLOC_OVERHEAD, 1024, 0},
|
||||
{"net_buffer_length", OPT_NET_BUFFER_LENGTH, "",
|
||||
{"net_buffer_length", OPT_NET_BUFFER_LENGTH,
|
||||
"Buffer for TCP/IP and socket communication",
|
||||
(gptr*) &net_buffer_length, (gptr*) &net_buffer_length, 0, GET_ULONG,
|
||||
REQUIRED_ARG, 16384, 1024, 512*1024*1024L, MALLOC_OVERHEAD, 1024, 0},
|
||||
{"select_limit", OPT_SELECT_LIMIT, "", (gptr*) &select_limit,
|
||||
{"select_limit", OPT_SELECT_LIMIT,
|
||||
"Automatic limit for SELECT when using --safe-updates",
|
||||
(gptr*) &select_limit,
|
||||
(gptr*) &select_limit, 0, GET_ULONG, REQUIRED_ARG, 1000L, 1, ~0L, 0, 1, 0},
|
||||
{"max_join_size", OPT_MAX_JOIN_SIZE, "", (gptr*) &max_join_size,
|
||||
{"max_join_size", OPT_MAX_JOIN_SIZE,
|
||||
"Automatic limit for rows in a join when using --safe-updates",
|
||||
(gptr*) &max_join_size,
|
||||
(gptr*) &max_join_size, 0, GET_ULONG, REQUIRED_ARG, 1000000L, 1, ~0L, 0, 1,
|
||||
0},
|
||||
{"secure-auth", OPT_SECURE_AUTH, "Refuse client connecting to server if it"
|
||||
|
|
@ -689,12 +704,17 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
|
|||
else
|
||||
{
|
||||
opt_nopager= 0;
|
||||
if (argument)
|
||||
if (argument && strlen(argument))
|
||||
{
|
||||
default_pager_set= 1;
|
||||
strmov(pager, argument);
|
||||
else
|
||||
strmov(pager, default_pager);
|
||||
strmov(default_pager, pager);
|
||||
}
|
||||
else if (default_pager_set)
|
||||
strmov(pager, default_pager);
|
||||
else
|
||||
opt_nopager= 1;
|
||||
}
|
||||
break;
|
||||
case OPT_NOPAGER:
|
||||
printf("WARNING: option deprecated; use --disable-pager instead.\n");
|
||||
|
|
@ -814,6 +834,7 @@ static int get_options(int argc, char **argv)
|
|||
strmov(default_pager, "stdout");
|
||||
strmov(pager, "stdout");
|
||||
opt_nopager= 1;
|
||||
default_pager_set= 0;
|
||||
opt_outfile= 0;
|
||||
opt_reconnect= 0;
|
||||
connect_flag= 0; /* Not in interactive mode */
|
||||
|
|
@ -1535,7 +1556,7 @@ static int com_server_help(String *buffer __attribute__((unused)),
|
|||
init_pager();
|
||||
char last_char;
|
||||
|
||||
int num_name, num_cat;
|
||||
int num_name= 0, num_cat= 0;
|
||||
LINT_INIT(num_name);
|
||||
LINT_INIT(num_cat);
|
||||
|
||||
|
|
@ -2163,12 +2184,17 @@ com_pager(String *buffer, char *line __attribute__((unused)))
|
|||
|
||||
if (status.batch)
|
||||
return 0;
|
||||
/* Skip space from file name */
|
||||
/* Skip spaces in front of the pager command */
|
||||
while (my_isspace(charset_info, *line))
|
||||
line++;
|
||||
if (!(param= strchr(line, ' '))) // if pager was not given, use the default
|
||||
/* Skip the pager command */
|
||||
param= strchr(line, ' ');
|
||||
/* Skip the spaces between the command and the argument */
|
||||
while (param && my_isspace(charset_info, *param))
|
||||
param++;
|
||||
if (!param || !strlen(param)) // if pager was not given, use the default
|
||||
{
|
||||
if (!default_pager[0])
|
||||
if (!default_pager_set)
|
||||
{
|
||||
tee_fprintf(stdout, "Default pager wasn't set, using stdout.\n");
|
||||
opt_nopager=1;
|
||||
|
|
@ -2180,8 +2206,6 @@ com_pager(String *buffer, char *line __attribute__((unused)))
|
|||
}
|
||||
else
|
||||
{
|
||||
while (my_isspace(charset_info,*param))
|
||||
param++;
|
||||
end= strmake(pager_name, param, sizeof(pager_name)-1);
|
||||
while (end > pager_name && (my_isspace(charset_info,end[-1]) ||
|
||||
my_iscntrl(charset_info,end[-1])))
|
||||
|
|
@ -2191,7 +2215,7 @@ com_pager(String *buffer, char *line __attribute__((unused)))
|
|||
strmov(default_pager, pager_name);
|
||||
}
|
||||
opt_nopager=0;
|
||||
tee_fprintf(stdout, "PAGER set to %s\n", pager);
|
||||
tee_fprintf(stdout, "PAGER set to '%s'\n", pager);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -2202,6 +2226,7 @@ com_nopager(String *buffer __attribute__((unused)),
|
|||
{
|
||||
strmov(pager, "stdout");
|
||||
opt_nopager=1;
|
||||
PAGER= stdout;
|
||||
tee_fprintf(stdout, "PAGER set to stdout\n");
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,7 +37,7 @@
|
|||
** 10 Jun 2003: SET NAMES and --no-set-names by Alexander Barkov
|
||||
*/
|
||||
|
||||
#define DUMP_VERSION "10.4"
|
||||
#define DUMP_VERSION "10.5"
|
||||
|
||||
#include <my_global.h>
|
||||
#include <my_sys.h>
|
||||
|
|
@ -107,7 +107,8 @@ static CHARSET_INFO *charset_info= &my_charset_latin1;
|
|||
const char *compatible_mode_names[]=
|
||||
{
|
||||
"MYSQL323", "MYSQL40", "POSTGRESQL", "ORACLE", "MSSQL", "DB2",
|
||||
"SAPDB", "NO_KEY_OPTIONS", "NO_TABLE_OPTIONS", "NO_FIELD_OPTIONS",
|
||||
"MAXDB", "NO_KEY_OPTIONS", "NO_TABLE_OPTIONS", "NO_FIELD_OPTIONS",
|
||||
"ANSI",
|
||||
NullS
|
||||
};
|
||||
TYPELIB compatible_mode_typelib= {array_elements(compatible_mode_names) - 1,
|
||||
|
|
@ -136,7 +137,7 @@ static struct my_option my_long_options[] =
|
|||
"Directory where character sets are.", (gptr*) &charsets_dir,
|
||||
(gptr*) &charsets_dir, 0, GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"compatible", OPT_COMPATIBLE,
|
||||
"Change the dump to be compatible with a given mode. By default tables are dumped without any restrictions. Legal modes are: mysql323, mysql40, postgresql, oracle, mssql, db2, sapdb, no_key_options, no_table_options, no_field_options. One can use several modes separated by commas. Note: Requires MySQL server version 4.1.0 or higher. This option does a no operation on earlier server versions.",
|
||||
"Change the dump to be compatible with a given mode. By default tables are dumped without any restrictions. Legal modes are: ansi, mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb, no_key_options, no_table_options, no_field_options. One can use several modes separated by commas. Note: Requires MySQL server version 4.1.0 or higher. This option does a no operation on earlier server versions.",
|
||||
(gptr*) &opt_compatible_mode_str, (gptr*) &opt_compatible_mode_str, 0,
|
||||
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0},
|
||||
{"complete-insert", 'c', "Use complete insert statements.", (gptr*) &cFlag,
|
||||
|
|
@ -239,7 +240,7 @@ static struct my_option my_long_options[] =
|
|||
{"quick", 'q', "Don't buffer query, dump directly to stdout.",
|
||||
(gptr*) &quick, (gptr*) &quick, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0},
|
||||
{"quote-names",'Q', "Quote table and column names with backticks (`).",
|
||||
(gptr*) &opt_quoted, (gptr*) &opt_quoted, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0,
|
||||
(gptr*) &opt_quoted, (gptr*) &opt_quoted, 0, GET_BOOL, NO_ARG, 1, 0, 0, 0,
|
||||
0, 0},
|
||||
{"result-file", 'r',
|
||||
"Direct output to a given file. This option should be used in MSDOS, because it prevents new line '\\n' from being converted to '\\r\\n' (carriage return + line feed).",
|
||||
|
|
@ -830,7 +831,7 @@ static uint getTableStructure(char *table, char* db)
|
|||
char *end;
|
||||
uint i;
|
||||
|
||||
sprintf(buff, "/*!41000 SET @@sql_mode=\"");
|
||||
sprintf(buff, "/*!40100 SET @@sql_mode=\"");
|
||||
end= strend(buff);
|
||||
for (i= 0; opt_compatible_mode; opt_compatible_mode>>= 1, i++)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -24,10 +24,21 @@ noinst_HEADERS = chared.h el.h histedit.h key.h \
|
|||
hist.h map.h prompt.h search.h \
|
||||
strlcpy.h libedit_term.h tty.h
|
||||
|
||||
EXTRA_DIST = makelist
|
||||
EXTRA_DIST = makelist.sh
|
||||
|
||||
CLEANFILES = makelist
|
||||
|
||||
DEFS = -DUNDEF_THREADS_HACK -DHAVE_CONFIG_H -DNO_KILL_INTR
|
||||
|
||||
SUFFIXES = .sh
|
||||
|
||||
.sh:
|
||||
@RM@ -f $@ $@-t
|
||||
@SED@ \
|
||||
-e 's!@''AWK''@!@AWK@!' \
|
||||
$< > $@-t
|
||||
@MV@ $@-t $@
|
||||
|
||||
vi.h: vi.c makelist
|
||||
sh ./makelist -h ./vi.c > $@.tmp && \
|
||||
mv $@.tmp $@
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@
|
|||
|
||||
# makelist.sh: Automatically generate header files...
|
||||
|
||||
AWK=/usr/bin/awk
|
||||
AWK=@AWK@
|
||||
USAGE="Usage: $0 -h|-e|-fc|-fh|-bc|-bh|-m <filenames>"
|
||||
|
||||
if [ "x$1" = "x" ]
|
||||
|
|
@ -206,6 +206,7 @@ typedef struct charset_info_st
|
|||
uchar state_map[256];
|
||||
uchar ident_map[256];
|
||||
uint strxfrm_multiply;
|
||||
uint mbminlen;
|
||||
uint mbmaxlen;
|
||||
char max_sort_char; /* For LIKE optimization */
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,8 @@
|
|||
C_MODE_START
|
||||
|
||||
enum get_opt_var_type { GET_NO_ARG, GET_BOOL, GET_INT, GET_UINT, GET_LONG,
|
||||
GET_ULONG, GET_LL, GET_ULL, GET_STR, GET_STR_ALLOC
|
||||
GET_ULONG, GET_LL, GET_ULL, GET_STR, GET_STR_ALLOC,
|
||||
GET_DISABLED
|
||||
};
|
||||
|
||||
#define GET_ASK_ADDR 128
|
||||
|
|
|
|||
|
|
@ -68,6 +68,7 @@ extern const char * NEAR globerrs[]; /* my_error_messages is here */
|
|||
#define EXIT_UNKNOWN_SUFFIX 9
|
||||
#define EXIT_NO_PTR_TO_VARIABLE 10
|
||||
#define EXIT_CANNOT_CONNECT_TO_SERVICE 11
|
||||
#define EXIT_OPTION_DISABLED 12
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
|
|
|
|||
|
|
@ -2773,6 +2773,18 @@ row_search_for_mysql(
|
|||
ut_a(0);
|
||||
}
|
||||
|
||||
if (trx->n_mysql_tables_in_use == 0) {
|
||||
char err_buf[1000];
|
||||
|
||||
trx_print(err_buf, trx);
|
||||
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: MySQL is trying to perform a SELECT\n"
|
||||
"InnoDB: but it has not locked any tables in ::external_lock()!\n%s\n",
|
||||
err_buf);
|
||||
ut_a(0);
|
||||
}
|
||||
|
||||
/* printf("Match mode %lu\n search tuple ", match_mode);
|
||||
dtuple_print(search_tuple);
|
||||
|
||||
|
|
@ -3072,6 +3084,18 @@ shortcut_fails_too_big_rec:
|
|||
if (!prebuilt->sql_stat_start) {
|
||||
/* No need to set an intention lock or assign a read view */
|
||||
|
||||
if (trx->read_view == NULL
|
||||
&& prebuilt->select_lock_type == LOCK_NONE) {
|
||||
char err_buf[1000];
|
||||
|
||||
trx_print(err_buf, trx);
|
||||
|
||||
fprintf(stderr,
|
||||
"InnoDB: Error: MySQL is trying to perform a consistent read\n"
|
||||
"InnoDB: but the read view is not assigned!\n%s\n", err_buf);
|
||||
|
||||
ut_a(0);
|
||||
}
|
||||
} else if (prebuilt->select_lock_type == LOCK_NONE) {
|
||||
/* This is a consistent read */
|
||||
/* Assign a read view for the query */
|
||||
|
|
|
|||
|
|
@ -2739,8 +2739,6 @@ loop:
|
|||
|
||||
cnt++;
|
||||
|
||||
os_thread_sleep(2000000);
|
||||
|
||||
/* Try to track a strange bug reported by Harald Fuchs and others,
|
||||
where the lsn seems to decrease at times */
|
||||
|
||||
|
|
@ -2782,6 +2780,8 @@ loop:
|
|||
fflush(stderr);
|
||||
fflush(stdout);
|
||||
|
||||
os_thread_sleep(2000000);
|
||||
|
||||
if (srv_shutdown_state < SRV_SHUTDOWN_LAST_PHASE) {
|
||||
|
||||
goto loop;
|
||||
|
|
|
|||
|
|
@ -1512,12 +1512,13 @@ NetWare. */
|
|||
srv_is_being_started = FALSE;
|
||||
|
||||
#ifdef UNIV_DEBUG
|
||||
/* Wait a while so that creates threads have time to suspend themselves
|
||||
before we switch sync debugging on; otherwise a thread may execute
|
||||
mutex_enter() before the checks are on, and mutex_exit() after the
|
||||
checks are on. */
|
||||
/* Wait a while so that the created threads have time to suspend
|
||||
themselves before we switch sync debugging on; otherwise a thread may
|
||||
execute mutex_enter() before the checks are on, and mutex_exit() after
|
||||
the checks are on, which will cause an assertion failure in sync
|
||||
debug. */
|
||||
|
||||
os_thread_sleep(2000000);
|
||||
os_thread_sleep(3000000);
|
||||
#endif
|
||||
sync_order_checks_on = TRUE;
|
||||
|
||||
|
|
|
|||
|
|
@ -551,7 +551,7 @@ static int chk_index(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo,
|
|||
ha_checksum *key_checksum, uint level)
|
||||
{
|
||||
int flag;
|
||||
uint used_length,comp_flag,nod_flag,key_length,not_used;
|
||||
uint used_length,comp_flag,nod_flag,key_length=0,not_used;
|
||||
uchar key[MI_MAX_POSSIBLE_KEY_BUFF],*temp_buff,*keypos,*old_keypos,*endpos;
|
||||
my_off_t next_page,record;
|
||||
char llbuff[22];
|
||||
|
|
@ -586,6 +586,8 @@ static int chk_index(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo,
|
|||
}
|
||||
for ( ;; )
|
||||
{
|
||||
memcpy((char*) info->lastkey,(char*) key,key_length);
|
||||
info->lastkey_length=key_length;
|
||||
if (nod_flag)
|
||||
{
|
||||
next_page=_mi_kpos(nod_flag,keypos);
|
||||
|
|
@ -629,8 +631,6 @@ static int chk_index(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo,
|
|||
}
|
||||
(*key_checksum)+= mi_byte_checksum((byte*) key,
|
||||
key_length- info->s->rec_reflength);
|
||||
memcpy((char*) info->lastkey,(char*) key,key_length);
|
||||
info->lastkey_length=key_length;
|
||||
record= _mi_dpos(info,0,key+key_length);
|
||||
if (keyinfo->flag & HA_FULLTEXT) /* special handling for ft2 */
|
||||
{
|
||||
|
|
@ -658,7 +658,7 @@ static int chk_index(MI_CHECK *param, MI_INFO *info, MI_KEYDEF *keyinfo,
|
|||
DBUG_PRINT("test",("page: %s record: %s filelength: %s",
|
||||
llstr(page,llbuff),llstr(record,llbuff2),
|
||||
llstr(info->state->data_file_length,llbuff3)));
|
||||
DBUG_DUMP("key",(byte*) info->lastkey,key_length);
|
||||
DBUG_DUMP("key",(byte*) key,key_length);
|
||||
DBUG_DUMP("new_in_page",(char*) old_keypos,(uint) (keypos-old_keypos));
|
||||
goto err;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -374,7 +374,7 @@ static int w_search(register MI_INFO *info, register MI_KEYDEF *keyinfo,
|
|||
my_off_t root=info->dupp_key_pos;
|
||||
keyinfo=&info->s->ft2_keyinfo;
|
||||
key+=off;
|
||||
keypos-=keyinfo->keylength; /* we'll modify key entry 'in vivo' */
|
||||
keypos-=keyinfo->keylength+nod_flag; /* we'll modify key entry 'in vivo' */
|
||||
error=_mi_ck_real_write_btree(info, keyinfo, key, 0,
|
||||
&root, comp_flag);
|
||||
_mi_dpointer(info, keypos+HA_FT_WLEN, root);
|
||||
|
|
|
|||
|
|
@ -603,7 +603,7 @@ error () {
|
|||
error_is () {
|
||||
$ECHO "Errors are (from $TIMEFILE) :"
|
||||
$CAT < $TIMEFILE
|
||||
$ECHO "(the last line(s) may be the ones that caused the die() in mysqltest)"
|
||||
$ECHO "(the last lines may be the most important ones)"
|
||||
}
|
||||
|
||||
prefix_to_8() {
|
||||
|
|
@ -1309,6 +1309,9 @@ run_testcase ()
|
|||
skip_inc
|
||||
$ECHO "$RES$RES_SPACE [ skipped ]"
|
||||
else
|
||||
if [ $res -gt 2 ]; then
|
||||
$ECHO "mysqltest returned unexpected code $res, it has probably crashed" >> $TIMEFILE
|
||||
fi
|
||||
total_inc
|
||||
fail_inc
|
||||
$ECHO "$RES$RES_SPACE [ fail ]"
|
||||
|
|
|
|||
|
|
@ -412,3 +412,12 @@ t1 0 PRIMARY 1 Host A NULL NULL NULL BTREE
|
|||
t1 0 PRIMARY 2 User A 0 NULL NULL BTREE
|
||||
t1 1 Host 1 Host A NULL NULL NULL BTREE disabled
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a int UNIQUE);
|
||||
ALTER TABLE t1 DROP PRIMARY KEY;
|
||||
SHOW CREATE TABLE t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`a` int(11) default NULL,
|
||||
UNIQUE KEY `a` (`a`)
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
DROP TABLE t1;
|
||||
|
|
|
|||
|
|
@ -19,6 +19,12 @@ SELECT HEX(a) FROM t2;
|
|||
HEX(a)
|
||||
D0BFD180D0BED0B1D0B0
|
||||
DROP TABLE t1, t2;
|
||||
CREATE TABLE t1 (description text character set cp1250 NOT NULL);
|
||||
INSERT INTO t1 (description) VALUES (_latin2'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasssssssssssaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddde');
|
||||
SELECT description FROM t1;
|
||||
description
|
||||
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasssssssssssaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddde
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a TEXT CHARACTER SET cp1251) SELECT _koi8r'ÐÒÏÂÁ' AS a;
|
||||
CREATE TABLE t2 (a TEXT CHARACTER SET utf8);
|
||||
SHOW CREATE TABLE t1;
|
||||
|
|
|
|||
|
|
@ -173,6 +173,12 @@ SELECT * FROM t1 WHERE word LIKE _ucs2 x'00630061005F';
|
|||
word
|
||||
cat
|
||||
DROP TABLE t1;
|
||||
select insert(_ucs2 0x006100620063,10,2,_ucs2 0x006400650066);
|
||||
insert(_ucs2 0x006100620063,10,2,_ucs2 0x006400650066)
|
||||
abc
|
||||
select insert(_ucs2 0x006100620063,1,2,_ucs2 0x006400650066);
|
||||
insert(_ucs2 0x006100620063,1,2,_ucs2 0x006400650066)
|
||||
defc
|
||||
SET NAMES latin1;
|
||||
CREATE TABLE t1 (
|
||||
word VARCHAR(64),
|
||||
|
|
@ -270,3 +276,51 @@ aardvara
|
|||
aardvark
|
||||
aardvarz
|
||||
DROP TABLE t1;
|
||||
SELECT HEX(_ucs2 0x0);
|
||||
HEX(_ucs2 0x0)
|
||||
0000
|
||||
SELECT HEX(_ucs2 0x01);
|
||||
HEX(_ucs2 0x01)
|
||||
0001
|
||||
SELECT HEX(_ucs2 0x012);
|
||||
HEX(_ucs2 0x012)
|
||||
0012
|
||||
SELECT HEX(_ucs2 0x0123);
|
||||
HEX(_ucs2 0x0123)
|
||||
0123
|
||||
SELECT HEX(_ucs2 0x01234);
|
||||
HEX(_ucs2 0x01234)
|
||||
00001234
|
||||
SELECT HEX(_ucs2 0x012345);
|
||||
HEX(_ucs2 0x012345)
|
||||
00012345
|
||||
SELECT HEX(_ucs2 0x0123456);
|
||||
HEX(_ucs2 0x0123456)
|
||||
00123456
|
||||
SELECT HEX(_ucs2 0x01234567);
|
||||
HEX(_ucs2 0x01234567)
|
||||
01234567
|
||||
SELECT HEX(_ucs2 0x012345678);
|
||||
HEX(_ucs2 0x012345678)
|
||||
000012345678
|
||||
SELECT HEX(_ucs2 0x0123456789);
|
||||
HEX(_ucs2 0x0123456789)
|
||||
000123456789
|
||||
SELECT HEX(_ucs2 0x0123456789A);
|
||||
HEX(_ucs2 0x0123456789A)
|
||||
00123456789A
|
||||
SELECT HEX(_ucs2 0x0123456789AB);
|
||||
HEX(_ucs2 0x0123456789AB)
|
||||
0123456789AB
|
||||
SELECT HEX(_ucs2 0x0123456789ABC);
|
||||
HEX(_ucs2 0x0123456789ABC)
|
||||
0000123456789ABC
|
||||
SELECT HEX(_ucs2 0x0123456789ABCD);
|
||||
HEX(_ucs2 0x0123456789ABCD)
|
||||
000123456789ABCD
|
||||
SELECT HEX(_ucs2 0x0123456789ABCDE);
|
||||
HEX(_ucs2 0x0123456789ABCDE)
|
||||
00123456789ABCDE
|
||||
SELECT HEX(_ucs2 0x0123456789ABCDEF);
|
||||
HEX(_ucs2 0x0123456789ABCDEF)
|
||||
0123456789ABCDEF
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
drop table if exists t1;
|
||||
set names utf8;
|
||||
select left(_utf8 0xD0B0D0B1D0B2,1);
|
||||
left(_utf8 0xD0B0D0B1D0B2,1)
|
||||
|
|
@ -62,3 +63,19 @@ select 'A' like 'a' collate utf8_bin;
|
|||
select _utf8 0xD0B0D0B1D0B2 like concat(_utf8'%',_utf8 0xD0B1,_utf8 '%');
|
||||
_utf8 0xD0B0D0B1D0B2 like concat(_utf8'%',_utf8 0xD0B1,_utf8 '%')
|
||||
1
|
||||
select insert('txs',2,1,'hi'),insert('is ',4,0,'a'),insert('txxxxt',2,4,'es');
|
||||
insert('txs',2,1,'hi') insert('is ',4,0,'a') insert('txxxxt',2,4,'es')
|
||||
this is a test
|
||||
select insert("aa",100,1,"b"),insert("aa",1,3,"b");
|
||||
insert("aa",100,1,"b") insert("aa",1,3,"b")
|
||||
aa b
|
||||
create table t1 select date_format("2004-01-19 10:10:10", "%Y-%m-%d");
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`date_format("2004-01-19 10:10:10", "%Y-%m-%d")` char(4) character set utf8 default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1
|
||||
select * from t1;
|
||||
date_format("2004-01-19 10:10:10", "%Y-%m-%d")
|
||||
2004-01-19
|
||||
drop table t1;
|
||||
|
|
|
|||
|
|
@ -85,6 +85,10 @@ a b
|
|||
2 b
|
||||
3 c
|
||||
3 c
|
||||
select * from (select * from t1 union all select * from t1 limit 2) a;
|
||||
a b
|
||||
1 a
|
||||
2 b
|
||||
explain select * from (select * from t1 union select * from t1) a;
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 3
|
||||
|
|
@ -245,3 +249,27 @@ id select_type table type possible_keys key key_len ref rows Extra
|
|||
2 DERIVED t1 ALL NULL NULL NULL NULL 2
|
||||
3 UNION t1 ALL NULL NULL NULL NULL 2
|
||||
drop table t1;
|
||||
CREATE TABLE t1 (
|
||||
OBJECTID int(11) NOT NULL default '0',
|
||||
SORTORDER int(11) NOT NULL auto_increment,
|
||||
KEY t1_SortIndex (SORTORDER),
|
||||
KEY t1_IdIndex (OBJECTID)
|
||||
) TYPE=MyISAM DEFAULT CHARSET=latin1;
|
||||
Warnings:
|
||||
Warning 1286 'TYPE=storage_engine' is deprecated. Use 'ENGINE=storage_engine' instead.
|
||||
CREATE TABLE t2 (
|
||||
ID int(11) default NULL,
|
||||
PARID int(11) default NULL,
|
||||
UNIQUE KEY t2_ID_IDX (ID),
|
||||
KEY t2_PARID_IDX (PARID)
|
||||
) engine=MyISAM DEFAULT CHARSET=latin1;
|
||||
INSERT INTO t2 VALUES (1000,0),(1001,0),(1002,0),(1003,0),(1008,1),(1009,1),(1010,1),(1011,1),(1016,2);
|
||||
CREATE TABLE t3 (
|
||||
ID int(11) default NULL,
|
||||
DATA decimal(10,2) default NULL,
|
||||
UNIQUE KEY t3_ID_IDX (ID)
|
||||
) engine=MyISAM DEFAULT CHARSET=latin1;
|
||||
INSERT INTO t3 VALUES (1000,0.00),(1001,0.25),(1002,0.50),(1003,0.75),(1008,1.00),(1009,1.25),(1010,1.50),(1011,1.75);
|
||||
select 497, TMP.ID, NULL from (select 497 as ID, MAX(t3.DATA) as DATA from t1 join t2 on (t1.ObjectID = t2.ID) join t3 on (t1.ObjectID = t3.ID) group by t2.ParID order by DATA DESC) as TMP;
|
||||
497 ID NULL
|
||||
drop table t1, t2, t3;
|
||||
|
|
|
|||
|
|
@ -6,10 +6,19 @@ inet_ntoa(inet_aton("255.255.255.255.255.255.255.255"))
|
|||
NULL
|
||||
select inet_aton("255.255.255.255.255"),inet_aton("255.255.1.255"),inet_aton("0.1.255");
|
||||
inet_aton("255.255.255.255.255") inet_aton("255.255.1.255") inet_aton("0.1.255")
|
||||
1099511627775 4294902271 511
|
||||
1099511627775 4294902271 65791
|
||||
select inet_ntoa(1099511627775),inet_ntoa(4294902271),inet_ntoa(511);
|
||||
inet_ntoa(1099511627775) inet_ntoa(4294902271) inet_ntoa(511)
|
||||
NULL 255.255.1.255 0.0.1.255
|
||||
select hex(inet_aton('127'));
|
||||
hex(inet_aton('127'))
|
||||
7F
|
||||
select hex(inet_aton('127.1'));
|
||||
hex(inet_aton('127.1'))
|
||||
7F000001
|
||||
select hex(inet_aton('127.1.1'));
|
||||
hex(inet_aton('127.1.1'))
|
||||
7F010001
|
||||
select length(format('nan', 2)) > 0;
|
||||
length(format('nan', 2)) > 0
|
||||
1
|
||||
|
|
|
|||
|
|
@ -605,3 +605,6 @@ 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 md5(_latin1'hello') AS `md5('hello')`,sha(_latin1'abc') AS `sha('abc')`,sha(_latin1'abc') AS `sha1('abc')`,soundex(_latin1'') AS `soundex('')`,(soundex(_latin1'mood') = soundex(_latin1'mud')) AS `'mood' sounds like 'mud'`,aes_decrypt(aes_encrypt(_latin1'abc',_latin1'1'),_latin1'1') AS `aes_decrypt(aes_encrypt('abc','1'),'1')`,concat(_latin1'*',repeat(_latin1' ',5),_latin1'*') AS `concat('*',space(5),'*')`,reverse(_latin1'abc') AS `reverse('abc')`,rpad(_latin1'a',4,_latin1'1') AS `rpad('a',4,'1')`,lpad(_latin1'a',4,_latin1'1') AS `lpad('a',4,'1')`,concat_ws(_latin1',',_latin1'',NULL,_latin1'a') AS `concat_ws(',','',NULL,'a')`,make_set(255,_latin2'a',_latin2'b',_latin2'c') AS `make_set(255,_latin2'a',_latin2'b',_latin2'c')`,elt(2,1) AS `elt(2,1)`,locate(_latin1'a',_latin1'b',2) AS `locate("a","b",2)`,format(130,10) AS `format(130,10)`,char(0) AS `char(0)`,conv(130,16,10) AS `conv(130,16,10)`,hex(130) AS `hex(130)`,(_latin1'HE' collate _latin1'BINARY') AS `binary 'HE'`,export_set(255,_latin2'y',_latin2'n',_latin2' ') AS `export_set(255,_latin2'y',_latin2'n',_latin2' ')`,field((_latin1'b' collate _latin1'latin1_bin'),_latin1'A',_latin1'B') AS `FIELD('b' COLLATE latin1_bin,'A','B')`,find_in_set(_latin1'B',_latin1'a,b,c,d') AS `FIND_IN_SET(_latin1'B',_latin1'a,b,c,d')`,collation(conv(130,16,10)) AS `collation(conv(130,16,10))`,coercibility(conv(130,16,10)) AS `coercibility(conv(130,16,10))`,length(_latin1'\n \r\0\\_\\%\\') AS `length('\n\t\r\b\0\_\%\\')`,bit_length(_latin1'\n \r\0\\_\\%\\') AS `bit_length('\n\t\r\b\0\_\%\\')`,bit_length(_latin1'\n \r\0\\_\\%\\') AS `bit_length('\n\t\r\b\0\_\%\\')`,concat(_latin1'monty',_latin1' was here ',_latin1'again') AS `concat('monty',' was here ','again')`,length(_latin1'hello') AS `length('hello')`,char(ascii(_latin1'h')) AS `char(ascii('h'))`,ord(_latin1'h') AS `ord('h')`,quote((1 / 0)) AS `quote(1/0)`,crc32(_latin1'123') AS `crc32("123")`,replace(_latin1'aaaa',_latin1'a',_latin1'b') AS `replace('aaaa','a','b')`,insert(_latin1'txs',2,1,_latin1'hi') AS `insert('txs',2,1,'hi')`,left(_latin2'a',1) AS `left(_latin2'a',1)`,right(_latin2'a',1) AS `right(_latin2'a',1)`,lcase(_latin2'a') AS `lcase(_latin2'a')`,ucase(_latin2'a') AS `ucase(_latin2'a')`,substr(_latin1'abcdefg',3,2) AS `SUBSTR('abcdefg',3,2)`,substr_index(_latin1'1abcd;2abcd;3abcd;4abcd',_latin1';',2) AS `substring_index("1abcd;2abcd;3abcd;4abcd", ';', 2)`,trim(_latin2' a ') AS `trim(_latin2' a ')`,ltrim(_latin2' a ') AS `ltrim(_latin2' a ')`,rtrim(_latin2' a ') AS `rtrim(_latin2' a ')`,decode(encode(repeat(_latin1'a',100000))) AS `decode(encode(repeat("a",100000),"monty"),"monty")`
|
||||
SELECT lpad(12345, 5, "#");
|
||||
lpad(12345, 5, "#")
|
||||
12345
|
||||
|
|
|
|||
|
|
@ -21,17 +21,17 @@ DROP TABLE t1;
|
|||
CREATE TABLE t1 (a decimal(240, 20));
|
||||
INSERT INTO t1 VALUES ("1234567890123456789012345678901234567890"),
|
||||
("0987654321098765432109876543210987654321");
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1 (
|
||||
a decimal(240,20) default NULL
|
||||
DROP TABLE IF EXISTS `t1`;
|
||||
CREATE TABLE `t1` (
|
||||
`a` decimal(240,20) default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||
|
||||
|
||||
/*!40000 ALTER TABLE t1 DISABLE KEYS */;
|
||||
LOCK TABLES t1 WRITE;
|
||||
INSERT INTO t1 VALUES ("1234567890123456789012345678901234567890.00000000000000000000"),("0987654321098765432109876543210987654321.00000000000000000000");
|
||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||
LOCK TABLES `t1` WRITE;
|
||||
INSERT INTO `t1` VALUES ("1234567890123456789012345678901234567890.00000000000000000000"),("0987654321098765432109876543210987654321.00000000000000000000");
|
||||
UNLOCK TABLES;
|
||||
/*!40000 ALTER TABLE t1 ENABLE KEYS */;
|
||||
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
|
||||
|
||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
||||
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
||||
|
|
@ -41,17 +41,17 @@ UNLOCK TABLES;
|
|||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a double);
|
||||
INSERT INTO t1 VALUES (-9e999999);
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1 (
|
||||
a double default NULL
|
||||
DROP TABLE IF EXISTS `t1`;
|
||||
CREATE TABLE `t1` (
|
||||
`a` double default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
|
||||
|
||||
|
||||
/*!40000 ALTER TABLE t1 DISABLE KEYS */;
|
||||
LOCK TABLES t1 WRITE;
|
||||
INSERT INTO t1 VALUES (RES);
|
||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||
LOCK TABLES `t1` WRITE;
|
||||
INSERT INTO `t1` VALUES (RES);
|
||||
UNLOCK TABLES;
|
||||
/*!40000 ALTER TABLE t1 ENABLE KEYS */;
|
||||
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
|
||||
|
||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
||||
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
||||
|
|
@ -105,17 +105,17 @@ INSERT INTO t1 VALUES ("1\""), ("\"2");
|
|||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a VARCHAR(255)) DEFAULT CHARSET koi8r;
|
||||
INSERT INTO t1 VALUES (_koi8r x'C1C2C3C4C5');
|
||||
DROP TABLE IF EXISTS t1;
|
||||
CREATE TABLE t1 (
|
||||
a varchar(255) default NULL
|
||||
DROP TABLE IF EXISTS `t1`;
|
||||
CREATE TABLE `t1` (
|
||||
`a` varchar(255) default NULL
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=koi8r;
|
||||
|
||||
|
||||
/*!40000 ALTER TABLE t1 DISABLE KEYS */;
|
||||
LOCK TABLES t1 WRITE;
|
||||
INSERT INTO t1 VALUES ('абцде');
|
||||
/*!40000 ALTER TABLE `t1` DISABLE KEYS */;
|
||||
LOCK TABLES `t1` WRITE;
|
||||
INSERT INTO `t1` VALUES ('абцде');
|
||||
UNLOCK TABLES;
|
||||
/*!40000 ALTER TABLE t1 ENABLE KEYS */;
|
||||
/*!40000 ALTER TABLE `t1` ENABLE KEYS */;
|
||||
|
||||
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
|
||||
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
|
||||
|
|
|
|||
|
|
@ -153,3 +153,6 @@ explain select * from t1 where a between 2 and 3 or b is null;
|
|||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range idx idx 4 NULL 2 Using where
|
||||
drop table t1;
|
||||
select cast(NULL as signed);
|
||||
cast(NULL as signed)
|
||||
NULL
|
||||
|
|
|
|||
|
|
@ -816,4 +816,12 @@ show status like "Qcache_queries_in_cache";
|
|||
Variable_name Value
|
||||
Qcache_queries_in_cache 4
|
||||
DROP TABLE t1;
|
||||
CREATE TABLE t1 (a int(1));
|
||||
CREATE DATABASE mysqltest;
|
||||
USE mysqltest;
|
||||
DROP DATABASE mysqltest;
|
||||
SELECT * FROM test.t1;
|
||||
a
|
||||
USE test;
|
||||
DROP TABLE t1;
|
||||
SET GLOBAL query_cache_size=0;
|
||||
|
|
|
|||
|
|
@ -88,20 +88,37 @@ drop table t2;
|
|||
create table t1 (
|
||||
test_set set( 'val1', 'val2', 'val3' ) not null default '',
|
||||
name char(20) default 'O''Brien' comment 'O''Brien as default',
|
||||
c int not null comment 'int column'
|
||||
c int not null comment 'int column',
|
||||
`c-b` int comment 'name with a space',
|
||||
`space ` int comment 'name with a space',
|
||||
) comment = 'it\'s a table' ;
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
`test_set` set('val1','val2','val3') NOT NULL default '',
|
||||
`name` char(20) default 'O''Brien' COMMENT 'O''Brien as default',
|
||||
`c` int(11) NOT NULL default '0' COMMENT 'int column'
|
||||
`c` int(11) NOT NULL default '0' COMMENT 'int column',
|
||||
`c-b` int(11) default NULL COMMENT 'name with a space',
|
||||
`space ` int(11) default NULL COMMENT 'name with a space'
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='it''s a table'
|
||||
set sql_quote_show_create=0;
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE t1 (
|
||||
test_set set('val1','val2','val3') NOT NULL default '',
|
||||
name char(20) default 'O''Brien' COMMENT 'O''Brien as default',
|
||||
c int(11) NOT NULL default '0' COMMENT 'int column',
|
||||
`c-b` int(11) default NULL COMMENT 'name with a space',
|
||||
`space ` int(11) default NULL COMMENT 'name with a space'
|
||||
) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='it''s a table'
|
||||
set sql_quote_show_create=1;
|
||||
show full columns from t1;
|
||||
Field Type Collation Null Key Default Extra Privileges Comment
|
||||
test_set set('val1','val2','val3') latin1_swedish_ci select,insert,update,references
|
||||
name char(20) latin1_swedish_ci YES O'Brien select,insert,update,references O'Brien as default
|
||||
c int(11) NULL 0 select,insert,update,references int column
|
||||
c-b int(11) NULL YES NULL select,insert,update,references name with a space
|
||||
space int(11) NULL YES NULL select,insert,update,references name with a space
|
||||
drop table t1;
|
||||
create table t1 (a int not null, unique aa (a));
|
||||
show create table t1;
|
||||
|
|
|
|||
|
|
@ -1569,3 +1569,12 @@ INSERT INTO t2 VALUES (100, 200, 'C');
|
|||
SELECT DISTINCT COLC FROM t1 WHERE COLA = (SELECT COLA FROM t2 WHERE COLB = 200 AND COLC ='C' LIMIT 1);
|
||||
COLC
|
||||
DROP TABLE t1, t2;
|
||||
create table t1 (a int, b decimal(13, 3));
|
||||
insert into t1 values (1, 0.123);
|
||||
select a, (select max(b) from t1) into outfile "subselect.out.file.1" from t1;
|
||||
delete from t1;
|
||||
load data infile "subselect.out.file.1" into table t1;
|
||||
select * from t1;
|
||||
a b
|
||||
1 0.123
|
||||
drop table t1;
|
||||
|
|
|
|||
|
|
@ -60,6 +60,39 @@ INSERT INTO t2 VALUES (1,1),(2,2),(3,3);
|
|||
SELECT distinct p1.processor_id, (SELECT y.yod_id FROM t1 p2, t2 y WHERE p2.processor_id = p1.processor_id and p2.processor_id = y.processor_id) FROM t1 p1;
|
||||
processor_id (SELECT y.yod_id FROM t1 p2, t2 y WHERE p2.processor_id = p1.processor_id and p2.processor_id = y.processor_id)
|
||||
1 1
|
||||
2 1
|
||||
3 1
|
||||
2 2
|
||||
3 3
|
||||
drop table t1,t2,t3;
|
||||
CREATE TABLE t1 (
|
||||
id int(11) NOT NULL default '0',
|
||||
b int(11) default NULL,
|
||||
c char(3) default NULL,
|
||||
PRIMARY KEY (id),
|
||||
KEY t2i1 (b)
|
||||
) ENGINE=innodb DEFAULT CHARSET=latin1;
|
||||
INSERT INTO t1 VALUES (0,0,'GPL'),(1,0,'GPL'),(2,1,'GPL'),(3,2,'GPL');
|
||||
CREATE TABLE t2 (
|
||||
id int(11) NOT NULL default '0',
|
||||
b int(11) default NULL,
|
||||
c char(3) default NULL,
|
||||
PRIMARY KEY (id),
|
||||
KEY t2i (b)
|
||||
) ENGINE=innodb DEFAULT CHARSET=latin1;
|
||||
INSERT INTO t2 VALUES (0,0,'GPL'),(1,0,'GPL'),(2,1,'GPL'),(3,2,'GPL');
|
||||
select (select max(id) from t2 where b=1 group by b) as x,b from t1 where b=1;
|
||||
x b
|
||||
2 1
|
||||
drop table t1,t2;
|
||||
create table t1 (id int not null, value char(255), primary key(id)) engine=innodb;
|
||||
create table t2 (id int not null, value char(255)) engine=innodb;
|
||||
insert into t1 values (1,'a'),(2,'b');
|
||||
insert into t2 values (1,'z'),(2,'x');
|
||||
select t2.id,t2.value,(select t1.value from t1 where t1.id=t2.id) from t2;
|
||||
id value (select t1.value from t1 where t1.id=t2.id)
|
||||
1 z a
|
||||
2 x b
|
||||
select t2.id,t2.value,(select t1.value from t1 where t1.id=t2.id) from t2;
|
||||
id value (select t1.value from t1 where t1.id=t2.id)
|
||||
1 z a
|
||||
2 x b
|
||||
drop table t1,t2;
|
||||
|
|
|
|||
|
|
@ -66,7 +66,7 @@ t9 CREATE TABLE `t9` (
|
|||
drop database mysqltest;
|
||||
create table t1 (a int not null) type=myisam;
|
||||
Warnings:
|
||||
Warning 1286 'TYPE=database_engine' is deprecated. Use 'ENGINE=database_engine' instead.
|
||||
Warning 1286 'TYPE=storage_engine' is deprecated. Use 'ENGINE=storage_engine' instead.
|
||||
show create table t1;
|
||||
Table Create Table
|
||||
t1 CREATE TABLE `t1` (
|
||||
|
|
|
|||
|
|
@ -128,10 +128,10 @@ Warning 1265 Using storage engine MyISAM for table 't1'
|
|||
drop table t1;
|
||||
create table t1 (id int) type=heap;
|
||||
Warnings:
|
||||
Warning 1286 'TYPE=database_engine' is deprecated. Use 'ENGINE=database_engine' instead.
|
||||
Warning 1286 'TYPE=storage_engine' is deprecated. Use 'ENGINE=storage_engine' instead.
|
||||
alter table t1 type=myisam;
|
||||
Warnings:
|
||||
Warning 1286 'TYPE=database_engine' is deprecated. Use 'ENGINE=database_engine' instead.
|
||||
Warning 1286 'TYPE=storage_engine' is deprecated. Use 'ENGINE=storage_engine' instead.
|
||||
drop table t1;
|
||||
set table_type=MYISAM;
|
||||
Warnings:
|
||||
|
|
|
|||
|
|
@ -244,3 +244,12 @@ LOCK TABLES t1 WRITE;
|
|||
ALTER TABLE t1 DISABLE KEYS;
|
||||
SHOW INDEX FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Bug 2361
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (a int UNIQUE);
|
||||
ALTER TABLE t1 DROP PRIMARY KEY;
|
||||
SHOW CREATE TABLE t1;
|
||||
DROP TABLE t1;
|
||||
|
|
|
|||
|
|
@ -14,6 +14,15 @@ INSERT t2 SELECT * FROM t1;
|
|||
SELECT HEX(a) FROM t2;
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
|
||||
#
|
||||
# Check that long strings conversion does not fail (bug#2218)
|
||||
#
|
||||
CREATE TABLE t1 (description text character set cp1250 NOT NULL);
|
||||
INSERT INTO t1 (description) VALUES (_latin2'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaasssssssssssaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbcccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddde');
|
||||
SELECT description FROM t1;
|
||||
DROP TABLE t1;
|
||||
|
||||
# same with TEXT
|
||||
CREATE TABLE t1 (a TEXT CHARACTER SET cp1251) SELECT _koi8r'ÐÒÏÂÁ' AS a;
|
||||
CREATE TABLE t2 (a TEXT CHARACTER SET utf8);
|
||||
|
|
@ -62,3 +71,4 @@ SET NAMES koi8r;
|
|||
SELECT hex('ÔÅÓÔ');
|
||||
SET character_set_connection=cp1251;
|
||||
SELECT hex('ÔÅÓÔ');
|
||||
|
||||
|
|
|
|||
|
|
@ -93,6 +93,12 @@ SELECT * FROM t1 WHERE word LIKE _ucs2 x'00630025';
|
|||
SELECT * FROM t1 WHERE word LIKE _ucs2 x'00630061005F';
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# Check that INSERT works fine.
|
||||
# This invokes charpos() function.
|
||||
select insert(_ucs2 0x006100620063,10,2,_ucs2 0x006400650066);
|
||||
select insert(_ucs2 0x006100620063,1,2,_ucs2 0x006400650066);
|
||||
|
||||
######################################################
|
||||
|
||||
#
|
||||
|
|
@ -192,3 +198,23 @@ DROP TABLE t1;
|
|||
#
|
||||
########################################################
|
||||
|
||||
|
||||
# Bug #2390
|
||||
# Check alignment
|
||||
#
|
||||
SELECT HEX(_ucs2 0x0);
|
||||
SELECT HEX(_ucs2 0x01);
|
||||
SELECT HEX(_ucs2 0x012);
|
||||
SELECT HEX(_ucs2 0x0123);
|
||||
SELECT HEX(_ucs2 0x01234);
|
||||
SELECT HEX(_ucs2 0x012345);
|
||||
SELECT HEX(_ucs2 0x0123456);
|
||||
SELECT HEX(_ucs2 0x01234567);
|
||||
SELECT HEX(_ucs2 0x012345678);
|
||||
SELECT HEX(_ucs2 0x0123456789);
|
||||
SELECT HEX(_ucs2 0x0123456789A);
|
||||
SELECT HEX(_ucs2 0x0123456789AB);
|
||||
SELECT HEX(_ucs2 0x0123456789ABC);
|
||||
SELECT HEX(_ucs2 0x0123456789ABCD);
|
||||
SELECT HEX(_ucs2 0x0123456789ABCDE);
|
||||
SELECT HEX(_ucs2 0x0123456789ABCDEF);
|
||||
|
|
|
|||
|
|
@ -2,6 +2,9 @@
|
|||
# Tests with the utf8 character set
|
||||
#
|
||||
|
||||
--disable_warnings
|
||||
drop table if exists t1;
|
||||
--enable_warnings
|
||||
set names utf8;
|
||||
|
||||
select left(_utf8 0xD0B0D0B1D0B2,1);
|
||||
|
|
@ -35,3 +38,18 @@ select _utf8 0xD0B0D0B1D0B2 like concat(_utf8'%',_utf8 0xD0B1,_utf8 '%');
|
|||
#
|
||||
#select _utf8 0xD0B0D0B1D0B2 like concat(_utf8'%',_utf8 0xD091,_utf8 '%');
|
||||
#
|
||||
|
||||
#
|
||||
# Bug 2367: INSERT() behaviour is different for different charsets.
|
||||
#
|
||||
select insert('txs',2,1,'hi'),insert('is ',4,0,'a'),insert('txxxxt',2,4,'es');
|
||||
select insert("aa",100,1,"b"),insert("aa",1,3,"b");
|
||||
|
||||
#
|
||||
# CREATE ... SELECT
|
||||
#
|
||||
create table t1 select date_format("2004-01-19 10:10:10", "%Y-%m-%d");
|
||||
show create table t1;
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
||||
|
|
|
|||
|
|
@ -35,6 +35,7 @@ select a from (select 1 as a) as b;
|
|||
select 1 from (select 1) as a;
|
||||
select * from (select * from t1 union select * from t1) a;
|
||||
select * from (select * from t1 union all select * from t1) a;
|
||||
select * from (select * from t1 union all select * from t1 limit 2) a;
|
||||
explain select * from (select * from t1 union select * from t1) a;
|
||||
explain select * from (select * from t1 union all select * from t1) a;
|
||||
CREATE TABLE t2 (a int not null);
|
||||
|
|
@ -138,3 +139,29 @@ insert into t1 values (1),(2);
|
|||
select * from ( select * from t1 union select * from t1) a,(select * from t1 union select * from t1) b;
|
||||
explain select * from ( select * from t1 union select * from t1) a,(select * from t1 union select * from t1) b;
|
||||
drop table t1;
|
||||
|
||||
|
||||
#
|
||||
# correct lex->current_select
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
OBJECTID int(11) NOT NULL default '0',
|
||||
SORTORDER int(11) NOT NULL auto_increment,
|
||||
KEY t1_SortIndex (SORTORDER),
|
||||
KEY t1_IdIndex (OBJECTID)
|
||||
) TYPE=MyISAM DEFAULT CHARSET=latin1;
|
||||
CREATE TABLE t2 (
|
||||
ID int(11) default NULL,
|
||||
PARID int(11) default NULL,
|
||||
UNIQUE KEY t2_ID_IDX (ID),
|
||||
KEY t2_PARID_IDX (PARID)
|
||||
) engine=MyISAM DEFAULT CHARSET=latin1;
|
||||
INSERT INTO t2 VALUES (1000,0),(1001,0),(1002,0),(1003,0),(1008,1),(1009,1),(1010,1),(1011,1),(1016,2);
|
||||
CREATE TABLE t3 (
|
||||
ID int(11) default NULL,
|
||||
DATA decimal(10,2) default NULL,
|
||||
UNIQUE KEY t3_ID_IDX (ID)
|
||||
) engine=MyISAM DEFAULT CHARSET=latin1;
|
||||
INSERT INTO t3 VALUES (1000,0.00),(1001,0.25),(1002,0.50),(1003,0.75),(1008,1.00),(1009,1.25),(1010,1.50),(1011,1.75);
|
||||
select 497, TMP.ID, NULL from (select 497 as ID, MAX(t3.DATA) as DATA from t1 join t2 on (t1.ObjectID = t2.ID) join t3 on (t1.ObjectID = t3.ID) group by t2.ParID order by DATA DESC) as TMP;
|
||||
drop table t1, t2, t3;
|
||||
|
|
|
|||
|
|
@ -8,6 +8,10 @@ select inet_ntoa(inet_aton("255.255.255.255.255.255.255.255"));
|
|||
select inet_aton("255.255.255.255.255"),inet_aton("255.255.1.255"),inet_aton("0.1.255");
|
||||
select inet_ntoa(1099511627775),inet_ntoa(4294902271),inet_ntoa(511);
|
||||
|
||||
select hex(inet_aton('127'));
|
||||
select hex(inet_aton('127.1'));
|
||||
select hex(inet_aton('127.1.1'));
|
||||
|
||||
#
|
||||
# Test for core dump with nan
|
||||
#
|
||||
|
|
|
|||
|
|
@ -346,3 +346,9 @@ DROP TABLE t1;
|
|||
select substring_index("1abcd;2abcd;3abcd;4abcd", ';', 2),substring_index("1abcd;2abcd;3abcd;4abcd", ';', -2);
|
||||
|
||||
explain extended select md5('hello'), sha('abc'), sha1('abc'), soundex(''), 'mood' sounds like 'mud', aes_decrypt(aes_encrypt('abc','1'),'1'),concat('*',space(5),'*'), reverse('abc'), rpad('a',4,'1'), lpad('a',4,'1'), concat_ws(',','',NULL,'a'),make_set(255,_latin2'a',_latin2'b',_latin2'c'),elt(2,1),locate("a","b",2),format(130,10),char(0),conv(130,16,10),hex(130),binary 'HE', export_set(255,_latin2'y',_latin2'n',_latin2' '),FIELD('b' COLLATE latin1_bin,'A','B'),FIND_IN_SET(_latin1'B',_latin1'a,b,c,d'),collation(conv(130,16,10)), coercibility(conv(130,16,10)),length('\n\t\r\b\0\_\%\\'),bit_length('\n\t\r\b\0\_\%\\'),bit_length('\n\t\r\b\0\_\%\\'),concat('monty',' was here ','again'),length('hello'),char(ascii('h')),ord('h'),quote(1/0),crc32("123"),replace('aaaa','a','b'),insert('txs',2,1,'hi'),left(_latin2'a',1),right(_latin2'a',1),lcase(_latin2'a'),ucase(_latin2'a'),SUBSTR('abcdefg',3,2),substring_index("1abcd;2abcd;3abcd;4abcd", ';', 2),trim(_latin2' a '),ltrim(_latin2' a '),rtrim(_latin2' a '), decode(encode(repeat("a",100000),"monty"),"monty");
|
||||
|
||||
#
|
||||
# Bug #2182
|
||||
#
|
||||
|
||||
SELECT lpad(12345, 5, "#");
|
||||
|
|
|
|||
|
|
@ -97,3 +97,4 @@ insert into t1 values
|
|||
explain select * from t1 where a between 2 and 3;
|
||||
explain select * from t1 where a between 2 and 3 or b is null;
|
||||
drop table t1;
|
||||
select cast(NULL as signed);
|
||||
|
|
|
|||
|
|
@ -589,4 +589,17 @@ show status like "Qcache_queries_in_cache";
|
|||
# Keep things tidy
|
||||
#
|
||||
DROP TABLE t1;
|
||||
|
||||
#
|
||||
# DROP current database test
|
||||
#
|
||||
CREATE TABLE t1 (a int(1));
|
||||
CREATE DATABASE mysqltest;
|
||||
USE mysqltest;
|
||||
DROP DATABASE mysqltest;
|
||||
SELECT * FROM test.t1;
|
||||
USE test;
|
||||
DROP TABLE t1;
|
||||
|
||||
|
||||
SET GLOBAL query_cache_size=0;
|
||||
|
|
|
|||
|
|
@ -53,9 +53,14 @@ drop table t2;
|
|||
create table t1 (
|
||||
test_set set( 'val1', 'val2', 'val3' ) not null default '',
|
||||
name char(20) default 'O''Brien' comment 'O''Brien as default',
|
||||
c int not null comment 'int column'
|
||||
c int not null comment 'int column',
|
||||
`c-b` int comment 'name with a space',
|
||||
`space ` int comment 'name with a space',
|
||||
) comment = 'it\'s a table' ;
|
||||
show create table t1;
|
||||
set sql_quote_show_create=0;
|
||||
show create table t1;
|
||||
set sql_quote_show_create=1;
|
||||
show full columns from t1;
|
||||
drop table t1;
|
||||
|
||||
|
|
|
|||
|
|
@ -1009,3 +1009,15 @@ INSERT INTO t1 VALUES (1,1,'1A3240'), (1,2,'4W2365');
|
|||
INSERT INTO t2 VALUES (100, 200, 'C');
|
||||
SELECT DISTINCT COLC FROM t1 WHERE COLA = (SELECT COLA FROM t2 WHERE COLB = 200 AND COLC ='C' LIMIT 1);
|
||||
DROP TABLE t1, t2;
|
||||
|
||||
#
|
||||
# Bug 2198
|
||||
#
|
||||
|
||||
create table t1 (a int, b decimal(13, 3));
|
||||
insert into t1 values (1, 0.123);
|
||||
select a, (select max(b) from t1) into outfile "subselect.out.file.1" from t1;
|
||||
delete from t1;
|
||||
load data infile "subselect.out.file.1" into table t1;
|
||||
select * from t1;
|
||||
drop table t1;
|
||||
|
|
|
|||
|
|
@ -68,3 +68,36 @@ INSERT INTO t3 VALUES (1,1),(2,2),(3,3);
|
|||
INSERT INTO t2 VALUES (1,1),(2,2),(3,3);
|
||||
SELECT distinct p1.processor_id, (SELECT y.yod_id FROM t1 p2, t2 y WHERE p2.processor_id = p1.processor_id and p2.processor_id = y.processor_id) FROM t1 p1;
|
||||
drop table t1,t2,t3;
|
||||
|
||||
#
|
||||
# innodb locking
|
||||
#
|
||||
CREATE TABLE t1 (
|
||||
id int(11) NOT NULL default '0',
|
||||
b int(11) default NULL,
|
||||
c char(3) default NULL,
|
||||
PRIMARY KEY (id),
|
||||
KEY t2i1 (b)
|
||||
) ENGINE=innodb DEFAULT CHARSET=latin1;
|
||||
INSERT INTO t1 VALUES (0,0,'GPL'),(1,0,'GPL'),(2,1,'GPL'),(3,2,'GPL');
|
||||
CREATE TABLE t2 (
|
||||
id int(11) NOT NULL default '0',
|
||||
b int(11) default NULL,
|
||||
c char(3) default NULL,
|
||||
PRIMARY KEY (id),
|
||||
KEY t2i (b)
|
||||
) ENGINE=innodb DEFAULT CHARSET=latin1;
|
||||
INSERT INTO t2 VALUES (0,0,'GPL'),(1,0,'GPL'),(2,1,'GPL'),(3,2,'GPL');
|
||||
select (select max(id) from t2 where b=1 group by b) as x,b from t1 where b=1;
|
||||
drop table t1,t2;
|
||||
|
||||
#
|
||||
# reiniting innodb tables
|
||||
#
|
||||
create table t1 (id int not null, value char(255), primary key(id)) engine=innodb;
|
||||
create table t2 (id int not null, value char(255)) engine=innodb;
|
||||
insert into t1 values (1,'a'),(2,'b');
|
||||
insert into t2 values (1,'z'),(2,'x');
|
||||
select t2.id,t2.value,(select t1.value from t1 where t1.id=t2.id) from t2;
|
||||
select t2.id,t2.value,(select t1.value from t1 where t1.id=t2.id) from t2;
|
||||
drop table t1,t2;
|
||||
|
|
|
|||
|
|
@ -131,6 +131,7 @@ static void simple_cs_init_functions(CHARSET_INFO *cs)
|
|||
cs->coll= &my_collation_8bit_simple_ci_handler;
|
||||
|
||||
cs->cset= &my_charset_8bit_handler;
|
||||
cs->mbminlen= 1;
|
||||
cs->mbmaxlen= 1;
|
||||
}
|
||||
|
||||
|
|
@ -273,6 +274,7 @@ static int simple_cs_copy_data(CHARSET_INFO *to, CHARSET_INFO *from)
|
|||
if (create_fromuni(to))
|
||||
goto err;
|
||||
}
|
||||
to->mbminlen= 1;
|
||||
to->mbmaxlen= 1;
|
||||
|
||||
return 0;
|
||||
|
|
@ -357,7 +359,7 @@ static int add_collation(CHARSET_INFO *cs)
|
|||
}
|
||||
|
||||
|
||||
#define MAX_BUF 1024*16
|
||||
#define MY_MAX_ALLOWED_BUF 1024*1024
|
||||
#define MY_CHARSET_INDEX "Index.xml"
|
||||
|
||||
const char *charsets_dir= NULL;
|
||||
|
|
@ -369,16 +371,19 @@ static my_bool my_read_charset_file(const char *filename, myf myflags)
|
|||
char *buf;
|
||||
int fd;
|
||||
uint len;
|
||||
MY_STAT stat_info;
|
||||
|
||||
if (!(buf= (char *)my_malloc(MAX_BUF,myflags)))
|
||||
return FALSE;
|
||||
if (!my_stat(filename, &stat_info, MYF(MY_WME)) ||
|
||||
((len= (uint)stat_info.st_size) > MY_MAX_ALLOWED_BUF) ||
|
||||
!(buf= (char *)my_malloc(len,myflags)))
|
||||
return TRUE;
|
||||
|
||||
if ((fd=my_open(filename,O_RDONLY,myflags)) < 0)
|
||||
{
|
||||
my_free(buf,myflags);
|
||||
return TRUE;
|
||||
}
|
||||
len=read(fd,buf,MAX_BUF);
|
||||
len=read(fd,buf,len);
|
||||
my_close(fd,myflags);
|
||||
|
||||
if (my_parse_charset_xml(buf,len,add_collation))
|
||||
|
|
@ -543,6 +548,7 @@ static CHARSET_INFO *get_internal_charset(uint cs_number, myf flags)
|
|||
cs= (cs->state & MY_CS_AVAILABLE) ? cs : NULL;
|
||||
}
|
||||
pthread_mutex_unlock(&THR_LOCK_charset);
|
||||
pthread_mutex_unlock(&THR_LOCK_charset);
|
||||
return cs;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -461,7 +461,8 @@ static char *remove_end_comment(char *ptr)
|
|||
else if (quote == *ptr)
|
||||
quote= 0;
|
||||
}
|
||||
if (!quote && *ptr == '#') /* We are not inside a comment */
|
||||
/* We are not inside a comment */
|
||||
if (!quote && (*ptr == '#' || *ptr == ';'))
|
||||
{
|
||||
*ptr= 0;
|
||||
return ptr;
|
||||
|
|
|
|||
|
|
@ -1175,8 +1175,8 @@ int _flush_io_cache(IO_CACHE *info, int need_append_buffer_lock)
|
|||
info IO_CACHE Handle to free
|
||||
|
||||
NOTES
|
||||
It's currently safe to call this if one has called io_cache_init()
|
||||
on the 'info' object, even if io_cache_init() failed.
|
||||
It's currently safe to call this if one has called init_io_cache()
|
||||
on the 'info' object, even if init_io_cache() failed.
|
||||
This function is also safe to call twice with the same handle.
|
||||
|
||||
RETURN
|
||||
|
|
|
|||
|
|
@ -285,6 +285,19 @@ int handle_options(int *argc, char ***argv,
|
|||
return EXIT_AMBIGUOUS_OPTION;
|
||||
}
|
||||
}
|
||||
if ((optp->var_type & GET_TYPE_MASK) == GET_DISABLED)
|
||||
{
|
||||
if (my_getopt_print_errors)
|
||||
fprintf(stderr,
|
||||
"%s: %s: Option '%s' used, but is disabled\n", my_progname,
|
||||
option_is_loose ? "WARNING" : "ERROR", opt_str);
|
||||
if (option_is_loose)
|
||||
{
|
||||
(*argc)--;
|
||||
continue;
|
||||
}
|
||||
return EXIT_OPTION_DISABLED;
|
||||
}
|
||||
if (must_be_var && (optp->var_type & GET_TYPE_MASK) == GET_NO_ARG)
|
||||
{
|
||||
if (my_getopt_print_errors)
|
||||
|
|
@ -358,6 +371,14 @@ int handle_options(int *argc, char ***argv,
|
|||
{
|
||||
/* Option recognized. Find next what to do with it */
|
||||
opt_found= 1;
|
||||
if ((optp->var_type & GET_TYPE_MASK) == GET_DISABLED)
|
||||
{
|
||||
if (my_getopt_print_errors)
|
||||
fprintf(stderr,
|
||||
"%s: ERROR: Option '-%c' used, but is disabled\n",
|
||||
my_progname, optp->id);
|
||||
return EXIT_OPTION_DISABLED;
|
||||
}
|
||||
if ((optp->var_type & GET_TYPE_MASK) == GET_BOOL &&
|
||||
optp->arg_type == NO_ARG)
|
||||
{
|
||||
|
|
@ -550,7 +571,7 @@ static int findopt(char *optpat, uint length,
|
|||
const struct my_option **opt_res,
|
||||
char **ffname)
|
||||
{
|
||||
int count;
|
||||
uint count;
|
||||
struct my_option *opt= (struct my_option *) *opt_res;
|
||||
|
||||
for (count= 0; opt->name; opt++)
|
||||
|
|
@ -562,6 +583,7 @@ static int findopt(char *optpat, uint length,
|
|||
*ffname= (char *) opt->name; /* We only need to know one prev */
|
||||
if (!opt->name[length]) /* Exact match */
|
||||
return 1;
|
||||
if (!count || strcmp(*ffname, opt->name)) /* Don't count synonyms */
|
||||
count++;
|
||||
}
|
||||
}
|
||||
|
|
@ -882,7 +904,8 @@ void my_print_variables(const struct my_option *options)
|
|||
longlong2str(*((ulonglong*) value), buff, 10);
|
||||
printf("%s\n", buff);
|
||||
break;
|
||||
default: /* dummy default to avoid compiler warnings */
|
||||
default:
|
||||
printf("(Disabled)\n");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,3 +24,7 @@ CREATE TABLE tables_priv (Host char(60) binary DEFAULT '' NOT NULL, Db char(64)
|
|||
|
||||
CREATE TABLE columns_priv (Host char(60) binary DEFAULT '' NOT NULL, Db char(64) binary DEFAULT '' NOT NULL, User char(16) binary DEFAULT '' NOT NULL, Table_name char(64) binary DEFAULT '' NOT NULL, Column_name char(64) binary DEFAULT '' NOT NULL, Timestamp timestamp(14), Column_priv set('Select','Insert','Update','References') DEFAULT '' NOT NULL, PRIMARY KEY (Host,Db,User,Table_name,Column_name)) comment='Column privileges';
|
||||
|
||||
CREATE TABLE help_topic (help_topic_id int unsigned NOT NULL, name varchar(64) NOT NULL, help_category_id smallint unsigned NOT NULL, description text NOT NULL, example text NOT NULL, url varchar(128) NOT NULL, primary key (help_topic_id), unique index (name))comment='help topics';
|
||||
CREATE TABLE help_category (help_category_id smallint unsigned NOT NULL, name varchar(64) NOT NULL, parent_category_id smallint unsigned null, url varchar(128) NOT NULL, primary key (help_category_id), unique index (name)) comment='help categories';
|
||||
CREATE TABLE help_keyword (help_keyword_id int unsigned NOT NULL, name varchar(64) NOT NULL, primary key (help_keyword_id), unique index (name)) comment='help keywords';
|
||||
CREATE TABLE help_relation (help_topic_id int unsigned NOT NULL references help_topic, help_keyword_id int unsigned NOT NULL references help_keyword, primary key (help_keyword_id, help_topic_id)) comment='keyword-topic relation';
|
||||
|
|
|
|||
|
|
@ -77,7 +77,7 @@ mysql_thread_init,
|
|||
mysql_thread_safe,
|
||||
mysql_use_result,
|
||||
net_safe_read,
|
||||
simple_command,
|
||||
#simple_command,
|
||||
mysql_connect,
|
||||
mysql_create_db,
|
||||
mysql_drop_db,
|
||||
|
|
|
|||
10
sql/field.cc
10
sql/field.cc
|
|
@ -4567,17 +4567,19 @@ int Field_blob::store(const char *from,uint length,CHARSET_INFO *cs)
|
|||
}
|
||||
else
|
||||
{
|
||||
bool was_conversion;
|
||||
char buff[80];
|
||||
String tmpstr(buff,sizeof(buff), &my_charset_bin);
|
||||
|
||||
/* Convert character set if nesessary */
|
||||
if (use_conversion(cs, field_charset))
|
||||
if ((was_conversion= use_conversion(cs, field_charset)))
|
||||
{
|
||||
tmpstr.copy(from, length, cs, field_charset);
|
||||
from= tmpstr.ptr();
|
||||
length= tmpstr.length();
|
||||
}
|
||||
Field_blob::store_length(length);
|
||||
if (table->copy_blobs || length <= MAX_FIELD_WIDTH)
|
||||
if (was_conversion || table->copy_blobs || length <= MAX_FIELD_WIDTH)
|
||||
{ // Must make a copy
|
||||
if (from != value.ptr()) // For valgrind
|
||||
{
|
||||
|
|
@ -5609,11 +5611,11 @@ create_field::create_field(Field *old_field,Field *orig_field)
|
|||
case 3: sql_type= FIELD_TYPE_MEDIUM_BLOB; break;
|
||||
default: sql_type= FIELD_TYPE_LONG_BLOB; break;
|
||||
}
|
||||
length /= charset->mbmaxlen; // QQ: Probably not needed
|
||||
length=(length+charset->mbmaxlen-1)/charset->mbmaxlen; // QQ: Probably not needed
|
||||
break;
|
||||
case FIELD_TYPE_STRING:
|
||||
case FIELD_TYPE_VAR_STRING:
|
||||
length /= charset->mbmaxlen;
|
||||
length=(length+charset->mbmaxlen-1)/charset->mbmaxlen;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -1867,7 +1867,6 @@ void Item_cache_int::store(Item *item)
|
|||
{
|
||||
value= item->val_int_result();
|
||||
null_value= item->null_value;
|
||||
collation.set(item->collation);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1875,7 +1874,6 @@ void Item_cache_real::store(Item *item)
|
|||
{
|
||||
value= item->val_result();
|
||||
null_value= item->null_value;
|
||||
collation.set(item->collation);
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -1898,7 +1896,6 @@ void Item_cache_str::store(Item *item)
|
|||
value_buff.copy(*value);
|
||||
value= &value_buff;
|
||||
}
|
||||
collation.set(item->collation);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
18
sql/item.h
18
sql/item.h
|
|
@ -477,7 +477,7 @@ public:
|
|||
CHARSET_INFO *cs, Derivation dv= DERIVATION_COERCIBLE)
|
||||
{
|
||||
collation.set(cs, dv);
|
||||
str_value.set(str,length,cs);
|
||||
str_value.set_or_copy_aligned(str,length,cs);
|
||||
/*
|
||||
We have to have a different max_length than 'length' here to
|
||||
ensure that we get the right length if we do use the item
|
||||
|
|
@ -493,7 +493,7 @@ public:
|
|||
CHARSET_INFO *cs, Derivation dv= DERIVATION_COERCIBLE)
|
||||
{
|
||||
collation.set(cs, dv);
|
||||
str_value.set(str,length,cs);
|
||||
str_value.set_or_copy_aligned(str,length,cs);
|
||||
max_length= str_value.numchars()*cs->mbmaxlen;
|
||||
set_name(name_par,0,cs);
|
||||
decimals=NOT_FIXED_DEC;
|
||||
|
|
@ -878,13 +878,15 @@ public:
|
|||
void set_used_tables(table_map map) { used_table_map= map; }
|
||||
|
||||
virtual bool allocate(uint i) { return 0; };
|
||||
virtual bool setup(Item *item) { example= item; return 0; };
|
||||
virtual void store(Item *)= 0;
|
||||
void set_len_n_dec(uint32 max_len, uint8 dec)
|
||||
virtual bool setup(Item *item)
|
||||
{
|
||||
max_length= max_len;
|
||||
decimals= dec;
|
||||
}
|
||||
example= item;
|
||||
max_length= item->max_length;
|
||||
decimals= item->decimals;
|
||||
collation.set(item->collation);
|
||||
return 0;
|
||||
};
|
||||
virtual void store(Item *)= 0;
|
||||
enum Type type() const { return CACHE_ITEM; }
|
||||
static Item_cache* get_cache(Item_result type);
|
||||
table_map used_tables() const { return used_table_map; }
|
||||
|
|
|
|||
|
|
@ -2618,6 +2618,7 @@ longlong Item_func_inet_aton::val_int()
|
|||
const char *p,* end;
|
||||
char c = '.'; // we mark c to indicate invalid IP in case length is 0
|
||||
char buff[36];
|
||||
int dot_count= 0;
|
||||
|
||||
String *s,tmp(buff,sizeof(buff),&my_charset_bin);
|
||||
if (!(s = args[0]->val_str(&tmp))) // If null value
|
||||
|
|
@ -2636,6 +2637,7 @@ longlong Item_func_inet_aton::val_int()
|
|||
}
|
||||
else if (c == '.')
|
||||
{
|
||||
dot_count++;
|
||||
result= (result << 8) + (ulonglong) byte_result;
|
||||
byte_result = 0;
|
||||
}
|
||||
|
|
@ -2643,7 +2645,14 @@ longlong Item_func_inet_aton::val_int()
|
|||
goto err; // Invalid character
|
||||
}
|
||||
if (c != '.') // IP number can't end on '.'
|
||||
{
|
||||
switch (dot_count)
|
||||
{
|
||||
case 1: result<<= 8;
|
||||
case 2: result<<= 8;
|
||||
}
|
||||
return (result << 8) + (ulonglong) byte_result;
|
||||
}
|
||||
|
||||
err:
|
||||
null_value=1;
|
||||
|
|
|
|||
|
|
@ -212,8 +212,8 @@ class Item_func_signed :public Item_int_func
|
|||
{
|
||||
public:
|
||||
Item_func_signed(Item *a) :Item_int_func(a) {}
|
||||
double val() { return args[0]->val(); }
|
||||
longlong val_int() { return args[0]->val_int(); }
|
||||
double val() { null_value=args[0]->null_value; return args[0]->val(); }
|
||||
longlong val_int() { null_value=args[0]->null_value; return args[0]->val_int(); }
|
||||
void fix_length_and_dec()
|
||||
{ max_length=args[0]->max_length; unsigned_flag=0; }
|
||||
void print(String *str);
|
||||
|
|
@ -224,8 +224,8 @@ class Item_func_unsigned :public Item_int_func
|
|||
{
|
||||
public:
|
||||
Item_func_unsigned(Item *a) :Item_int_func(a) {}
|
||||
double val() { return args[0]->val(); }
|
||||
longlong val_int() { return args[0]->val_int(); }
|
||||
double val() { null_value=args[0]->null_value; return args[0]->val(); }
|
||||
longlong val_int() { null_value=args[0]->null_value; return args[0]->val_int(); }
|
||||
void fix_length_and_dec()
|
||||
{ max_length=args[0]->max_length; unsigned_flag=1; }
|
||||
void print(String *str);
|
||||
|
|
|
|||
|
|
@ -975,9 +975,10 @@ String *Item_func_right::val_str(String *str)
|
|||
if (res->length() <= (uint) length)
|
||||
return res; /* purecov: inspected */
|
||||
|
||||
uint start=res->numchars()-(uint) length;
|
||||
if (start<=0) return res;
|
||||
start=res->charpos(start);
|
||||
uint start=res->numchars();
|
||||
if (start <= (uint) length)
|
||||
return res;
|
||||
start=res->charpos(start - (uint) length);
|
||||
tmp_value.set(*res,start,res->length()-start);
|
||||
return &tmp_value;
|
||||
}
|
||||
|
|
@ -2022,9 +2023,8 @@ String *Item_func_lpad::val_str(String *str)
|
|||
{
|
||||
uint32 res_char_length,pad_char_length;
|
||||
ulong count= (long) args[1]->val_int(), byte_count;
|
||||
String a1,a3;
|
||||
String *res= args[0]->val_str(&a1);
|
||||
String *pad= args[2]->val_str(&a3);
|
||||
String *res= args[0]->val_str(&tmp_value);
|
||||
String *pad= args[2]->val_str(&lpad_str);
|
||||
|
||||
if (!res || args[1]->null_value || !pad)
|
||||
goto err;
|
||||
|
|
|
|||
|
|
@ -301,8 +301,6 @@ void Item_singlerow_subselect::fix_length_and_dec()
|
|||
if ((max_columns= engine->cols()) == 1)
|
||||
{
|
||||
engine->fix_length_and_dec(row= &value);
|
||||
if (!(value= Item_cache::get_cache(engine->type())))
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -906,7 +904,8 @@ int subselect_single_select_engine::prepare()
|
|||
{
|
||||
if (prepared)
|
||||
return 0;
|
||||
join= new JOIN(thd, select_lex->item_list, select_lex->options, result);
|
||||
join= new JOIN(thd, select_lex->item_list,
|
||||
select_lex->options | SELECT_NO_UNLOCK, result);
|
||||
if (!join || !result)
|
||||
{
|
||||
thd->fatal_error(); //out of memory
|
||||
|
|
@ -933,7 +932,7 @@ int subselect_single_select_engine::prepare()
|
|||
|
||||
int subselect_union_engine::prepare()
|
||||
{
|
||||
return unit->prepare(thd, result);
|
||||
return unit->prepare(thd, result, SELECT_NO_UNLOCK);
|
||||
}
|
||||
|
||||
int subselect_uniquesubquery_engine::prepare()
|
||||
|
|
@ -955,13 +954,9 @@ static Item_result set_row(List<Item> &item_list, Item *item,
|
|||
res_type= sel_item->result_type();
|
||||
item->decimals= sel_item->decimals;
|
||||
*maybe_null= sel_item->maybe_null;
|
||||
if (row)
|
||||
{
|
||||
if (!(row[i]= Item_cache::get_cache(res_type)))
|
||||
return STRING_RESULT; // we should return something
|
||||
row[i]->set_len_n_dec(sel_item->max_length, sel_item->decimals);
|
||||
row[i]->collation.set(sel_item->collation);
|
||||
}
|
||||
row[i]->setup(sel_item);
|
||||
}
|
||||
if (item_list.elements > 1)
|
||||
res_type= ROW_RESULT;
|
||||
|
|
@ -982,7 +977,10 @@ void subselect_union_engine::fix_length_and_dec(Item_cache **row)
|
|||
DBUG_ASSERT(row || unit->first_select()->item_list.elements==1);
|
||||
|
||||
if (unit->first_select()->item_list.elements == 1)
|
||||
{
|
||||
res_type= set_row(unit->types, item, row, &maybe_null);
|
||||
item->collation.set(row[0]->collation);
|
||||
}
|
||||
else
|
||||
{
|
||||
bool fake= 0;
|
||||
|
|
|
|||
|
|
@ -38,6 +38,7 @@ typedef ulong key_part_map; /* Used for finding key parts */
|
|||
/* useful constants */
|
||||
extern const key_map key_map_empty;
|
||||
extern const key_map key_map_full;
|
||||
extern const char *primary_key_name;
|
||||
|
||||
#include "mysql_com.h"
|
||||
#include <violite.h>
|
||||
|
|
@ -664,7 +665,7 @@ bool get_key_map_from_key_list(key_map *map, TABLE *table,
|
|||
bool insert_fields(THD *thd,TABLE_LIST *tables,
|
||||
const char *db_name, const char *table_name,
|
||||
List_iterator<Item> *it);
|
||||
bool setup_tables(TABLE_LIST *tables);
|
||||
bool setup_tables(TABLE_LIST *tables, my_bool reinit);
|
||||
int setup_wild(THD *thd, TABLE_LIST *tables, List<Item> &fields,
|
||||
List<Item> *sum_func_list, uint wild_num);
|
||||
int setup_fields(THD *thd, Item** ref_pointer_array, TABLE_LIST *tables,
|
||||
|
|
|
|||
|
|
@ -2039,6 +2039,19 @@ int setup_fields(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
|
|||
|
||||
|
||||
/*
|
||||
prepare tables
|
||||
|
||||
SYNOPSIS
|
||||
setup_tables()
|
||||
tables - tables list
|
||||
reinit - true if called for table reinitialization before
|
||||
subquery reexecuting
|
||||
|
||||
RETURN
|
||||
0 ok; In this case *map will includes the choosed index
|
||||
1 error
|
||||
|
||||
NOTE
|
||||
Remap table numbers if INSERT ... SELECT
|
||||
Check also that the 'used keys' and 'ignored keys' exists and set up the
|
||||
table structure accordingly
|
||||
|
|
@ -2047,7 +2060,7 @@ int setup_fields(THD *thd, Item **ref_pointer_array, TABLE_LIST *tables,
|
|||
table->map is not set and all Item_field will be regarded as const items.
|
||||
*/
|
||||
|
||||
bool setup_tables(TABLE_LIST *tables)
|
||||
bool setup_tables(TABLE_LIST *tables, my_bool reinit)
|
||||
{
|
||||
DBUG_ENTER("setup_tables");
|
||||
uint tablenr=0;
|
||||
|
|
@ -2074,7 +2087,7 @@ bool setup_tables(TABLE_LIST *tables)
|
|||
table->keys_in_use_for_query.subtract(map);
|
||||
}
|
||||
table->used_keys.intersect(table->keys_in_use_for_query);
|
||||
if (table_list->shared || table->clear_query_id)
|
||||
if ((table_list->shared || table->clear_query_id) && !reinit)
|
||||
{
|
||||
table->clear_query_id= 0;
|
||||
/* Clear query_id that may have been set by previous select */
|
||||
|
|
|
|||
|
|
@ -695,18 +695,15 @@ select_export::~select_export()
|
|||
thd->sent_row_count=row_count;
|
||||
}
|
||||
|
||||
int
|
||||
select_export::prepare(List<Item> &list, SELECT_LEX_UNIT *u)
|
||||
|
||||
static int create_file(THD *thd, char *path, sql_exchange *exchange,
|
||||
File *file, IO_CACHE *cache)
|
||||
{
|
||||
char path[FN_REFLEN];
|
||||
uint option= 4;
|
||||
bool blob_flag=0;
|
||||
unit= u;
|
||||
|
||||
#ifdef DONT_ALLOW_FULL_LOAD_DATA_PATHS
|
||||
option|= 1; // Force use of db directory
|
||||
#endif
|
||||
if ((uint) strlen(exchange->file_name) + NAME_LEN >= FN_REFLEN)
|
||||
strmake(path,exchange->file_name,FN_REFLEN-1);
|
||||
(void) fn_format(path, exchange->file_name, thd->db ? thd->db : "", "",
|
||||
option);
|
||||
if (!access(path, F_OK))
|
||||
|
|
@ -715,19 +712,36 @@ select_export::prepare(List<Item> &list, SELECT_LEX_UNIT *u)
|
|||
return 1;
|
||||
}
|
||||
/* Create the file world readable */
|
||||
if ((file=my_create(path, 0666, O_WRONLY, MYF(MY_WME))) < 0)
|
||||
if ((*file= my_create(path, 0666, O_WRONLY, MYF(MY_WME))) < 0)
|
||||
return 1;
|
||||
#ifdef HAVE_FCHMOD
|
||||
(void) fchmod(file,0666); // Because of umask()
|
||||
(void) fchmod(*file, 0666); // Because of umask()
|
||||
#else
|
||||
(void) chmod(path, 0666);
|
||||
#endif
|
||||
if (init_io_cache(&cache,file,0L,WRITE_CACHE,0L,1,MYF(MY_WME)))
|
||||
if (init_io_cache(cache, *file, 0L, WRITE_CACHE, 0L, 1, MYF(MY_WME)))
|
||||
{
|
||||
my_close(file,MYF(0));
|
||||
file= -1;
|
||||
my_close(*file, MYF(0));
|
||||
my_delete(path, MYF(0)); // Delete file on error, it was just created
|
||||
*file= -1;
|
||||
end_io_cache(cache);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
select_export::prepare(List<Item> &list, SELECT_LEX_UNIT *u)
|
||||
{
|
||||
char path[FN_REFLEN];
|
||||
bool blob_flag=0;
|
||||
unit= u;
|
||||
if ((uint) strlen(exchange->file_name) + NAME_LEN >= FN_REFLEN)
|
||||
strmake(path,exchange->file_name,FN_REFLEN-1);
|
||||
|
||||
if (create_file(thd, path, exchange, &file, &cache))
|
||||
return 1;
|
||||
/* Check if there is any blobs in data */
|
||||
{
|
||||
List_iterator_fast<Item> li(list);
|
||||
|
|
@ -901,7 +915,6 @@ err:
|
|||
void select_export::send_error(uint errcode, const char *err)
|
||||
{
|
||||
::send_error(thd,errcode,err);
|
||||
(void) end_io_cache(&cache);
|
||||
(void) my_close(file,MYF(0));
|
||||
file= -1;
|
||||
}
|
||||
|
|
@ -938,33 +951,9 @@ int
|
|||
select_dump::prepare(List<Item> &list __attribute__((unused)),
|
||||
SELECT_LEX_UNIT *u)
|
||||
{
|
||||
uint option=4;
|
||||
unit= u;
|
||||
#ifdef DONT_ALLOW_FULL_LOAD_DATA_PATHS
|
||||
option|=1; // Force use of db directory
|
||||
#endif
|
||||
(void) fn_format(path,exchange->file_name, thd->db ? thd->db : "", "",
|
||||
option);
|
||||
if (!access(path,F_OK))
|
||||
{
|
||||
my_error(ER_FILE_EXISTS_ERROR,MYF(0),exchange->file_name);
|
||||
if (create_file(thd, path, exchange, &file, &cache))
|
||||
return 1;
|
||||
}
|
||||
/* Create the file world readable */
|
||||
if ((file=my_create(path, 0666, O_WRONLY, MYF(MY_WME))) < 0)
|
||||
return 1;
|
||||
#ifdef HAVE_FCHMOD
|
||||
(void) fchmod(file,0666); // Because of umask()
|
||||
#else
|
||||
(void) chmod(path,0666);
|
||||
#endif
|
||||
if (init_io_cache(&cache,file,0L,WRITE_CACHE,0L,1,MYF(MY_WME)))
|
||||
{
|
||||
my_close(file,MYF(0));
|
||||
my_delete(path,MYF(0));
|
||||
file= -1;
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -1011,9 +1000,7 @@ err:
|
|||
void select_dump::send_error(uint errcode,const char *err)
|
||||
{
|
||||
::send_error(thd,errcode,err);
|
||||
(void) end_io_cache(&cache);
|
||||
(void) my_close(file,MYF(0));
|
||||
(void) my_delete(path,MYF(0)); // Delete file on error
|
||||
file= -1;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -624,6 +624,19 @@ public:
|
|||
and are still in use by this thread
|
||||
*/
|
||||
TABLE *open_tables,*temporary_tables, *handler_tables, *derived_tables;
|
||||
/*
|
||||
During a MySQL session, one can lock tables in two modes: automatic
|
||||
or manual. In automatic mode all necessary tables are locked just before
|
||||
statement execution, and all acquired locks are stored in 'lock'
|
||||
member. Unlocking takes place automatically as well, when the
|
||||
statement ends.
|
||||
Manual mode comes into play when a user issues a 'LOCK TABLES'
|
||||
statement. In this mode the user can only use the locked tables.
|
||||
Trying to use any other tables will give an error. The locked tables are
|
||||
stored in 'locked_tables' member. Manual locking is described in
|
||||
the 'LOCK_TABLES' chapter of the MySQL manual.
|
||||
See also lock_tables() for details.
|
||||
*/
|
||||
MYSQL_LOCK *lock; /* Current locks */
|
||||
MYSQL_LOCK *locked_tables; /* Tables locked with LOCK */
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -270,11 +270,8 @@ int mysql_alter_db(THD *thd, const char *db, HA_CREATE_INFO *create_info)
|
|||
VOID(pthread_mutex_lock(&LOCK_mysql_create_db));
|
||||
|
||||
// do not alter database if another thread is holding read lock
|
||||
if (wait_if_global_read_lock(thd,0))
|
||||
{
|
||||
error= -1;
|
||||
if ((error=wait_if_global_read_lock(thd,0)))
|
||||
goto exit2;
|
||||
}
|
||||
|
||||
/* Check directory */
|
||||
(void)sprintf(path,"%s/%s/%s", mysql_data_home, db, MY_DB_OPT_FILE);
|
||||
|
|
@ -307,7 +304,7 @@ exit:
|
|||
start_waiting_global_read_lock(thd);
|
||||
exit2:
|
||||
VOID(pthread_mutex_unlock(&LOCK_mysql_create_db));
|
||||
DBUG_RETURN(error);
|
||||
DBUG_RETURN(error ? -1 : 0); /* -1 to delegate send_error() */
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -411,7 +408,7 @@ exit:
|
|||
when the slave is replicating a DROP DATABASE:
|
||||
- garbage characters in the error message:
|
||||
"Error 'Can't drop database 'test2'; database doesn't exist' on query
|
||||
'h4zI¿'"
|
||||
'h4zI<EFBFBD>©'"
|
||||
- segfault
|
||||
- hang in "free(vio)" (yes!) in the I/O or SQL slave threads (so slave
|
||||
server hangs at shutdown etc).
|
||||
|
|
@ -421,6 +418,7 @@ exit:
|
|||
if (!(thd->slave_thread)) /* a slave thread will free it itself */
|
||||
x_free(thd->db);
|
||||
thd->db= 0;
|
||||
thd->db_length= 0;
|
||||
}
|
||||
exit2:
|
||||
VOID(pthread_mutex_unlock(&LOCK_mysql_create_db));
|
||||
|
|
|
|||
|
|
@ -114,7 +114,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit,
|
|||
DBUG_RETURN(1); // out of memory
|
||||
|
||||
// st_select_lex_unit::prepare correctly work for single select
|
||||
if ((res= unit->prepare(thd, derived_result)))
|
||||
if ((res= unit->prepare(thd, derived_result, 0)))
|
||||
goto exit;
|
||||
|
||||
/*
|
||||
|
|
@ -146,6 +146,10 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit,
|
|||
}
|
||||
derived_result->set_table(table);
|
||||
|
||||
if (is_union)
|
||||
res= mysql_union(thd, lex, derived_result, unit);
|
||||
else
|
||||
{
|
||||
unit->offset_limit_cnt= first_select->offset_limit;
|
||||
unit->select_limit_cnt= first_select->select_limit+
|
||||
first_select->offset_limit;
|
||||
|
|
@ -154,9 +158,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit,
|
|||
if (unit->select_limit_cnt == HA_POS_ERROR)
|
||||
first_select->options&= ~OPTION_FOUND_ROWS;
|
||||
|
||||
if (is_union)
|
||||
res= mysql_union(thd, lex, derived_result, unit);
|
||||
else
|
||||
lex->current_select= first_select;
|
||||
res= mysql_select(thd, &first_select->ref_pointer_array,
|
||||
(TABLE_LIST*) first_select->table_list.first,
|
||||
first_select->with_wild,
|
||||
|
|
@ -169,6 +171,7 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit,
|
|||
(first_select->options | thd->options |
|
||||
SELECT_NO_UNLOCK),
|
||||
derived_result, unit, first_select);
|
||||
}
|
||||
|
||||
if (!res)
|
||||
{
|
||||
|
|
@ -198,7 +201,10 @@ int mysql_derived(THD *thd, LEX *lex, SELECT_LEX_UNIT *unit,
|
|||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
unit->exclude_tree();
|
||||
unit->cleanup();
|
||||
}
|
||||
org_table_list->db= (char *)"";
|
||||
// Force read of table stats in the optimizer
|
||||
table->file->info(HA_STATUS_VARIABLE);
|
||||
|
|
|
|||
|
|
@ -274,9 +274,9 @@ int get_topics_for_keyword(THD *thd, TABLE *topics, TABLE *relations,
|
|||
|
||||
DBUG_ENTER("get_topics_for_keyword");
|
||||
|
||||
if ((iindex_topic= find_type((char*) "PRIMARY",
|
||||
if ((iindex_topic= find_type((char*) primary_key_name,
|
||||
&topics->keynames, 1+2)-1)<0 ||
|
||||
(iindex_relations= find_type((char*) "PRIMARY",
|
||||
(iindex_relations= find_type((char*) primary_key_name,
|
||||
&relations->keynames, 1+2)-1)<0)
|
||||
{
|
||||
send_error(thd,ER_CORRUPT_HELP_DB);
|
||||
|
|
@ -686,7 +686,7 @@ int mysqld_help(THD *thd, const char *mask)
|
|||
goto end;
|
||||
}
|
||||
/* Init tables and fields to be usable from items */
|
||||
setup_tables(tables);
|
||||
setup_tables(tables, 0);
|
||||
memcpy((char*) used_fields, (char*) init_used_fields, sizeof(used_fields));
|
||||
if (init_fields(thd, tables, used_fields, array_elements(used_fields)))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -84,7 +84,7 @@ check_insert_fields(THD *thd,TABLE *table,List<Item> &fields,
|
|||
table_list.grant=table->grant;
|
||||
|
||||
thd->dupp_field=0;
|
||||
if (setup_tables(&table_list) ||
|
||||
if (setup_tables(&table_list, 0) ||
|
||||
setup_fields(thd, 0, &table_list,fields,1,0,0))
|
||||
return -1;
|
||||
if (thd->dupp_field)
|
||||
|
|
@ -204,7 +204,7 @@ int mysql_insert(THD *thd,TABLE_LIST *table_list,
|
|||
}
|
||||
|
||||
if (check_insert_fields(thd,table,fields,*values,1) ||
|
||||
setup_tables(insert_table_list) ||
|
||||
setup_tables(insert_table_list, 0) ||
|
||||
setup_fields(thd, 0, insert_table_list, *values, 0, 0, 0) ||
|
||||
(duplic == DUP_UPDATE &&
|
||||
(setup_fields(thd, 0, insert_table_list, update_fields, 0, 0, 0) ||
|
||||
|
|
|
|||
|
|
@ -1222,11 +1222,6 @@ void st_select_lex::mark_as_dependent(SELECT_LEX *last)
|
|||
s->uncacheable|= UNCACHEABLE_DEPENDENT;
|
||||
SELECT_LEX_UNIT *munit= s->master_unit();
|
||||
munit->uncacheable|= UNCACHEABLE_DEPENDENT;
|
||||
//Tables will be reopened many times
|
||||
for (TABLE_LIST *tbl= s->get_table_list();
|
||||
tbl;
|
||||
tbl= tbl->next)
|
||||
tbl->shared= 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -351,7 +351,7 @@ public:
|
|||
void exclude_tree();
|
||||
|
||||
/* UNION methods */
|
||||
int prepare(THD *thd, select_result *result);
|
||||
int prepare(THD *thd, select_result *result, ulong additional_options);
|
||||
int exec();
|
||||
int cleanup();
|
||||
|
||||
|
|
|
|||
|
|
@ -123,7 +123,7 @@ int mysql_load(THD *thd,sql_exchange *ex,TABLE_LIST *table_list,
|
|||
else
|
||||
{ // Part field list
|
||||
thd->dupp_field=0;
|
||||
if (setup_tables(table_list) ||
|
||||
if (setup_tables(table_list, 0) ||
|
||||
setup_fields(thd, 0, table_list, fields, 1, 0, 0))
|
||||
DBUG_RETURN(-1);
|
||||
if (thd->dupp_field)
|
||||
|
|
|
|||
|
|
@ -164,7 +164,7 @@ int handle_olaps(LEX *lex, SELECT_LEX *select_lex)
|
|||
List<Item> all_fields(select_lex->item_list);
|
||||
|
||||
|
||||
if (setup_tables((TABLE_LIST *)select_lex->table_list.first) ||
|
||||
if (setup_tables((TABLE_LIST *)select_lex->table_list.first, 0) ||
|
||||
setup_fields(lex->thd, 0, (TABLE_LIST *)select_lex->table_list.first,
|
||||
select_lex->item_list, 1, &all_fields,1) ||
|
||||
setup_fields(lex->thd, 0, (TABLE_LIST *)select_lex->table_list.first,
|
||||
|
|
|
|||
|
|
@ -1624,9 +1624,11 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||
switch (command) {
|
||||
case MYSQL_OPTION_MULTI_STATEMENTS_ON:
|
||||
thd->client_capabilities|= CLIENT_MULTI_STATEMENTS;
|
||||
send_eof(thd);
|
||||
break;
|
||||
case MYSQL_OPTION_MULTI_STATEMENTS_OFF:
|
||||
thd->client_capabilities&= ~CLIENT_MULTI_STATEMENTS;
|
||||
send_eof(thd);
|
||||
break;
|
||||
default:
|
||||
send_error(thd, ER_UNKNOWN_COM_ERROR);
|
||||
|
|
|
|||
|
|
@ -679,7 +679,7 @@ static bool mysql_test_upd_fields(Prepared_statement *stmt,
|
|||
#endif
|
||||
if (open_and_lock_tables(thd, table_list))
|
||||
DBUG_RETURN(1);
|
||||
if (setup_tables(table_list) ||
|
||||
if (setup_tables(table_list, 0) ||
|
||||
setup_fields(thd, 0, table_list, fields, 1, 0, 0) ||
|
||||
setup_conds(thd, table_list, &conds) || thd->net.report_error)
|
||||
DBUG_RETURN(1);
|
||||
|
|
|
|||
|
|
@ -301,7 +301,7 @@ JOIN::prepare(Item ***rref_pointer_array,
|
|||
|
||||
/* Check that all tables, fields, conds and order are ok */
|
||||
|
||||
if (setup_tables(tables_list) ||
|
||||
if (setup_tables(tables_list, 0) ||
|
||||
setup_wild(thd, tables_list, fields_list, &all_fields, wild_num) ||
|
||||
select_lex->setup_ref_array(thd, og_num) ||
|
||||
setup_fields(thd, (*rref_pointer_array), tables_list, fields_list, 1,
|
||||
|
|
@ -1015,7 +1015,7 @@ JOIN::reinit()
|
|||
if (unit->select_limit_cnt == HA_POS_ERROR)
|
||||
select_lex->options&= ~OPTION_FOUND_ROWS;
|
||||
|
||||
if (setup_tables(tables_list))
|
||||
if (setup_tables(tables_list, 1))
|
||||
DBUG_RETURN(1);
|
||||
|
||||
/* Reset of sum functions */
|
||||
|
|
@ -1586,7 +1586,8 @@ mysql_select(THD *thd, Item ***rref_pointer_array,
|
|||
}
|
||||
else
|
||||
{
|
||||
join= new JOIN(thd, fields, select_options, result);
|
||||
if (!(join= new JOIN(thd, fields, select_options, result)))
|
||||
DBUG_RETURN(-1);
|
||||
thd->proc_info="init";
|
||||
thd->used_tables=0; // Updated by setup_fields
|
||||
if (join->prepare(rref_pointer_array, tables, wild_num,
|
||||
|
|
@ -9143,8 +9144,8 @@ int mysql_explain_union(THD *thd, SELECT_LEX_UNIT *unit, select_result *result)
|
|||
{
|
||||
res= mysql_explain_select(thd, sl,
|
||||
(((&thd->lex->select_lex)==sl)?
|
||||
((thd->lex->all_selects_list != sl)?"PRIMARY":
|
||||
"SIMPLE"):
|
||||
((thd->lex->all_selects_list != sl) ?
|
||||
primary_key_name : "SIMPLE"):
|
||||
((sl == first)?
|
||||
((sl->linkage == DERIVED_TABLE_TYPE) ?
|
||||
"DERIVED":
|
||||
|
|
|
|||
|
|
@ -997,6 +997,19 @@ mysqld_dump_create_info(THD *thd, TABLE *table, int fd)
|
|||
DBUG_RETURN(0);
|
||||
}
|
||||
|
||||
/* possible TODO: call find_keyword() from sql_lex.cc here */
|
||||
static bool require_quotes(const char *name, uint length)
|
||||
{
|
||||
uint i, d, c;
|
||||
for (i=0; i<length; i+=d)
|
||||
{
|
||||
c=((uchar *)name)[i];
|
||||
d=my_mbcharlen(system_charset_info, c);
|
||||
if (d==1 && !system_charset_info->ident_map[c])
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
append_identifier(THD *thd, String *packet, const char *name, uint length)
|
||||
|
|
@ -1007,7 +1020,8 @@ append_identifier(THD *thd, String *packet, const char *name, uint length)
|
|||
else
|
||||
qtype= '`';
|
||||
|
||||
if (thd->options & OPTION_QUOTE_SHOW_CREATE)
|
||||
if ((thd->options & OPTION_QUOTE_SHOW_CREATE) ||
|
||||
require_quotes(name, length))
|
||||
{
|
||||
packet->append(&qtype, 1);
|
||||
packet->append(name, length, system_charset_info);
|
||||
|
|
@ -1167,7 +1181,7 @@ store_create_info(THD *thd, TABLE *table, String *packet)
|
|||
bool found_primary=0;
|
||||
packet->append(",\n ", 4);
|
||||
|
||||
if (i == primary_key && !strcmp(key_info->name,"PRIMARY"))
|
||||
if (i == primary_key && !strcmp(key_info->name, primary_key_name))
|
||||
{
|
||||
found_primary=1;
|
||||
packet->append("PRIMARY ", 8);
|
||||
|
|
|
|||
|
|
@ -228,6 +228,52 @@ bool String::copy(const char *str,uint32 arg_length, CHARSET_INFO *cs)
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
** For real multi-byte, ascii incompatible charactser sets,
|
||||
** like UCS-2, add leading zeros if we have an incomplete character.
|
||||
** Thus,
|
||||
** SELECT _ucs2 0xAA
|
||||
** will automatically be converted into
|
||||
** SELECT _ucs2 0x00AA
|
||||
*/
|
||||
|
||||
bool String::set_or_copy_aligned(const char *str,uint32 arg_length,
|
||||
CHARSET_INFO *cs)
|
||||
{
|
||||
/* How many bytes are in incomplete character */
|
||||
uint32 offs= (arg_length % cs->mbminlen);
|
||||
|
||||
if (!offs) /* All characters are complete, just copy */
|
||||
{
|
||||
set(str, arg_length, cs);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
offs= cs->mbmaxlen - offs; /* How many zeros we should prepend */
|
||||
uint32 aligned_length= arg_length + offs;
|
||||
if (alloc(aligned_length))
|
||||
return TRUE;
|
||||
|
||||
/*
|
||||
Probably this condition is not really necessary
|
||||
because if aligned_length is 0 then offs is 0 too
|
||||
and we'll return after calling set().
|
||||
*/
|
||||
if ((str_length= aligned_length))
|
||||
{
|
||||
/*
|
||||
Note, this is only safe for little-endian UCS-2.
|
||||
If we add big-endian UCS-2 sometimes, this code
|
||||
will be more complicated. But it's OK for now.
|
||||
*/
|
||||
bzero((char*)Ptr, offs);
|
||||
memcpy(Ptr + offs, str, arg_length);
|
||||
}
|
||||
Ptr[aligned_length]=0;
|
||||
str_charset=cs;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/* Copy with charset convertion */
|
||||
|
||||
bool String::copy(const char *str, uint32 arg_length,
|
||||
|
|
|
|||
|
|
@ -183,6 +183,7 @@ public:
|
|||
bool copy(); // Alloc string if not alloced
|
||||
bool copy(const String &s); // Allocate new string
|
||||
bool copy(const char *s,uint32 arg_length, CHARSET_INFO *cs); // Allocate new string
|
||||
bool set_or_copy_aligned(const char *s, uint32 arg_length, CHARSET_INFO *cs);
|
||||
bool copy(const char*s,uint32 arg_length, CHARSET_INFO *csfrom,
|
||||
CHARSET_INFO *csto);
|
||||
bool append(const String &s);
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@
|
|||
#include <io.h>
|
||||
#endif
|
||||
|
||||
static const char *primary_key_name="PRIMARY";
|
||||
const char *primary_key_name= "PRIMARY";
|
||||
|
||||
static bool check_if_keyname_exists(const char *name,KEY *start, KEY *end);
|
||||
static char *make_unique_key_name(const char *field_name,KEY *start,KEY *end);
|
||||
|
|
@ -2242,13 +2242,15 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
|||
KEY *key_info=table->key_info;
|
||||
for (uint i=0 ; i < table->keys ; i++,key_info++)
|
||||
{
|
||||
if (drop_primary && (key_info->flags & HA_NOSAME))
|
||||
char *key_name= key_info->name;
|
||||
|
||||
if (drop_primary && (key_info-> flags & HA_NOSAME) &&
|
||||
!my_strcasecmp(system_charset_info, key_name, primary_key_name))
|
||||
{
|
||||
drop_primary= 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
char *key_name=key_info->name;
|
||||
Alter_drop *drop;
|
||||
drop_it.rewind();
|
||||
while ((drop=drop_it++))
|
||||
|
|
@ -2303,7 +2305,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
|
|||
key_list.push_back(new Key(key_info->flags & HA_SPATIAL ? Key::SPATIAL :
|
||||
(key_info->flags & HA_NOSAME ?
|
||||
(!my_strcasecmp(system_charset_info,
|
||||
key_name, "PRIMARY") ?
|
||||
key_name, primary_key_name) ?
|
||||
Key::PRIMARY : Key::UNIQUE) :
|
||||
(key_info->flags & HA_FULLTEXT ?
|
||||
Key::FULLTEXT : Key::MULTIPLE)),
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ int mysql_union(THD *thd, LEX *lex, select_result *result,
|
|||
{
|
||||
DBUG_ENTER("mysql_union");
|
||||
int res= 0;
|
||||
if (!(res= unit->prepare(thd, result)))
|
||||
if (!(res= unit->prepare(thd, result, SELECT_NO_UNLOCK)))
|
||||
res= unit->exec();
|
||||
res|= unit->cleanup();
|
||||
DBUG_RETURN(res);
|
||||
|
|
@ -106,7 +106,8 @@ bool select_union::flush()
|
|||
}
|
||||
|
||||
|
||||
int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result)
|
||||
int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result,
|
||||
ulong additional_options)
|
||||
{
|
||||
SELECT_LEX *lex_select_save= thd_arg->lex->current_select;
|
||||
SELECT_LEX *sl, *first_select;
|
||||
|
|
@ -146,7 +147,7 @@ int st_select_lex_unit::prepare(THD *thd_arg, select_result *sel_result)
|
|||
for (;sl; sl= sl->next_select())
|
||||
{
|
||||
JOIN *join= new JOIN(thd_arg, sl->item_list,
|
||||
sl->options | thd_arg->options | SELECT_NO_UNLOCK,
|
||||
sl->options | thd_arg->options | additional_options,
|
||||
tmp_result);
|
||||
thd_arg->lex->current_select= sl;
|
||||
offset_limit_cnt= sl->offset_limit;
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ int mysql_update(THD *thd,
|
|||
tables.table= table;
|
||||
tables.alias= table_list->alias;
|
||||
|
||||
if (setup_tables(update_table_list) ||
|
||||
if (setup_tables(update_table_list, 0) ||
|
||||
setup_conds(thd,update_table_list,&conds) ||
|
||||
thd->lex->select_lex.setup_ref_array(thd, order_num) ||
|
||||
setup_order(thd, thd->lex->select_lex.ref_pointer_array,
|
||||
|
|
|
|||
|
|
@ -1077,7 +1077,7 @@ create_table_options:
|
|||
|
||||
create_table_option:
|
||||
ENGINE_SYM opt_equal storage_engines { Lex->create_info.db_type= $3; }
|
||||
| TYPE_SYM opt_equal storage_engines { Lex->create_info.db_type= $3; WARN_DEPRECATED("TYPE=database_engine","ENGINE=database_engine"); }
|
||||
| TYPE_SYM opt_equal storage_engines { Lex->create_info.db_type= $3; WARN_DEPRECATED("TYPE=storage_engine","ENGINE=storage_engine"); }
|
||||
| MAX_ROWS opt_equal ulonglong_num { Lex->create_info.max_rows= $3; Lex->create_info.used_fields|= HA_CREATE_USED_MAX_ROWS;}
|
||||
| MIN_ROWS opt_equal ulonglong_num { Lex->create_info.min_rows= $3; Lex->create_info.used_fields|= HA_CREATE_USED_MIN_ROWS;}
|
||||
| AVG_ROW_LENGTH opt_equal ULONG_NUM { Lex->create_info.avg_row_length=$3; Lex->create_info.used_fields|= HA_CREATE_USED_AVG_ROW_LENGTH;}
|
||||
|
|
|
|||
|
|
@ -481,8 +481,8 @@ int openfrm(const char *name, const char *alias, uint db_stat, uint prgflag,
|
|||
/* Fix key->name and key_part->field */
|
||||
if (key_parts)
|
||||
{
|
||||
uint primary_key=(uint) (find_type((char*) "PRIMARY",&outparam->keynames,
|
||||
3)-1);
|
||||
uint primary_key=(uint) (find_type((char*) primary_key_name,
|
||||
&outparam->keynames, 3) - 1);
|
||||
uint ha_option=outparam->file->table_flags();
|
||||
keyinfo=outparam->key_info;
|
||||
key_part=keyinfo->key_part;
|
||||
|
|
|
|||
|
|
@ -6281,6 +6281,7 @@ CHARSET_INFO my_charset_big5_chinese_ci=
|
|||
"",
|
||||
"",
|
||||
1, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_big5_handler,
|
||||
|
|
@ -6304,6 +6305,7 @@ CHARSET_INFO my_charset_big5_bin=
|
|||
"",
|
||||
"",
|
||||
1, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_big5_handler,
|
||||
|
|
|
|||
|
|
@ -381,6 +381,7 @@ CHARSET_INFO my_charset_bin =
|
|||
NULL, /* tab_from_uni */
|
||||
"","",
|
||||
1, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
1, /* mbmaxlen */
|
||||
(char) 255, /* max_sort_char */
|
||||
&my_charset_handler,
|
||||
|
|
|
|||
|
|
@ -631,6 +631,7 @@ CHARSET_INFO my_charset_latin2_czech_ci =
|
|||
idx_uni_8859_2, /* tab_from_uni */
|
||||
"","",
|
||||
4, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
1, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_8bit_handler,
|
||||
|
|
|
|||
|
|
@ -8689,6 +8689,7 @@ CHARSET_INFO my_charset_euckr_korean_ci=
|
|||
"",
|
||||
"",
|
||||
1, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_handler,
|
||||
|
|
@ -8712,6 +8713,7 @@ CHARSET_INFO my_charset_euckr_bin=
|
|||
"",
|
||||
"",
|
||||
1, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_handler,
|
||||
|
|
|
|||
|
|
@ -34,6 +34,7 @@ CHARSET_INFO compiled_charsets[] = {
|
|||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
NULL,
|
||||
NULL
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5740,6 +5740,7 @@ CHARSET_INFO my_charset_gb2312_chinese_ci=
|
|||
"",
|
||||
"",
|
||||
1, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_handler,
|
||||
|
|
@ -5762,6 +5763,7 @@ CHARSET_INFO my_charset_gb2312_bin=
|
|||
"",
|
||||
"",
|
||||
1, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_handler,
|
||||
|
|
|
|||
|
|
@ -9936,6 +9936,7 @@ CHARSET_INFO my_charset_gbk_chinese_ci=
|
|||
"",
|
||||
"",
|
||||
1, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_handler,
|
||||
|
|
@ -9958,6 +9959,7 @@ CHARSET_INFO my_charset_gbk_bin=
|
|||
"",
|
||||
"",
|
||||
1, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_handler,
|
||||
|
|
|
|||
|
|
@ -215,6 +215,7 @@ CHARSET_INFO my_charset_latin1=
|
|||
NULL, /* tab_from_uni */
|
||||
"","",
|
||||
1, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
1, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_handler,
|
||||
|
|
@ -410,6 +411,7 @@ CHARSET_INFO my_charset_latin1_german2_ci=
|
|||
NULL, /* tab_from_uni */
|
||||
"","",
|
||||
2, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
1, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_handler,
|
||||
|
|
@ -433,6 +435,7 @@ CHARSET_INFO my_charset_latin1_bin=
|
|||
"",
|
||||
"",
|
||||
1, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
1, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_handler,
|
||||
|
|
|
|||
|
|
@ -271,7 +271,7 @@ uint my_charpos_mb(CHARSET_INFO *cs __attribute__((unused)),
|
|||
b+= (mblen= my_ismbchar(cs,b,e)) ? mblen : 1;
|
||||
pos--;
|
||||
}
|
||||
return b-b0;
|
||||
return pos ? e+2-b0 : b-b0;
|
||||
}
|
||||
|
||||
uint my_instr_mb(CHARSET_INFO *cs,
|
||||
|
|
|
|||
|
|
@ -4525,6 +4525,7 @@ CHARSET_INFO my_charset_sjis_japanese_ci=
|
|||
"",
|
||||
"",
|
||||
1, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_handler,
|
||||
|
|
@ -4547,6 +4548,7 @@ CHARSET_INFO my_charset_sjis_bin=
|
|||
"",
|
||||
"",
|
||||
1, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_handler,
|
||||
|
|
|
|||
|
|
@ -956,6 +956,7 @@ CHARSET_INFO my_charset_tis620_thai_ci=
|
|||
"",
|
||||
"",
|
||||
4, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
1, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_handler,
|
||||
|
|
@ -978,6 +979,7 @@ CHARSET_INFO my_charset_tis620_bin=
|
|||
"",
|
||||
"",
|
||||
1, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
1, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_handler,
|
||||
|
|
|
|||
|
|
@ -1322,6 +1322,7 @@ CHARSET_INFO my_charset_ucs2_general_ci=
|
|||
"",
|
||||
"",
|
||||
1, /* strxfrm_multiply */
|
||||
2, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_ucs2_handler,
|
||||
|
|
@ -1345,6 +1346,7 @@ CHARSET_INFO my_charset_ucs2_bin=
|
|||
"",
|
||||
"",
|
||||
1, /* strxfrm_multiply */
|
||||
2, /* mbminlen */
|
||||
2, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_ucs2_handler,
|
||||
|
|
|
|||
|
|
@ -8480,6 +8480,7 @@ CHARSET_INFO my_charset_ujis_japanese_ci=
|
|||
NULL, /* tab_from_uni */
|
||||
"","",
|
||||
1, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
3, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_handler,
|
||||
|
|
@ -8502,6 +8503,7 @@ CHARSET_INFO my_charset_ujis_bin=
|
|||
NULL, /* tab_from_uni */
|
||||
"","",
|
||||
1, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
3, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_handler,
|
||||
|
|
|
|||
|
|
@ -2006,6 +2006,7 @@ CHARSET_INFO my_charset_utf8_general_ci=
|
|||
"",
|
||||
"",
|
||||
1, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
3, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_handler,
|
||||
|
|
@ -2029,6 +2030,7 @@ CHARSET_INFO my_charset_utf8_bin=
|
|||
"",
|
||||
"",
|
||||
1, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
3, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_handler,
|
||||
|
|
|
|||
|
|
@ -671,6 +671,7 @@ CHARSET_INFO my_charset_cp1250_czech_ci =
|
|||
idx_uni_cp1250, /* tab_from_uni */
|
||||
"","",
|
||||
2, /* strxfrm_multiply */
|
||||
1, /* mbminlen */
|
||||
1, /* mbmaxlen */
|
||||
0,
|
||||
&my_charset_8bit_handler,
|
||||
|
|
|
|||
|
|
@ -220,7 +220,8 @@ sh -c "PATH=\"${MYSQL_BUILD_PATH:-$PATH}\" \
|
|||
--includedir=%{_includedir} \
|
||||
--mandir=%{_mandir} \
|
||||
--enable-thread-safe-client \
|
||||
--with-comment=\"Official MySQL RPM\";
|
||||
--with-comment=\"Official MySQL RPM\" \
|
||||
--with-readline ;
|
||||
# Add this for more debugging support
|
||||
# --with-debug
|
||||
# Add this for MyISAM RAID support:
|
||||
|
|
@ -574,6 +575,10 @@ fi
|
|||
# The spec file changelog only includes changes made to the spec file
|
||||
# itself
|
||||
%changelog
|
||||
* Tue Jan 13 2004 Lenz Grimmer <lenz@mysql.com>
|
||||
|
||||
- link the mysql client against libreadline instead of libedit (BUG 2289)
|
||||
|
||||
* Fri Dec 13 2003 Lenz Grimmer <lenz@mysql.com>
|
||||
|
||||
- fixed file permissions (BUG 1672)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue