Commit 4b1836ee authored by monty@hundin.mysql.fi's avatar monty@hundin.mysql.fi

Enable LOAD DATA LOCAL INFILE in mysql_test

Added syntax for column comments (for compability with 4.1)
Fix of ALTER TABLE RENAME
parent 544f95c4
...@@ -49340,6 +49340,9 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. ...@@ -49340,6 +49340,9 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}.
@itemize @bullet @itemize @bullet
@item @item
Fixed that @code{ALTER TABLE table_name RENAME new_table_name} is as fast
as @code{RENAME TABLE}.
@item
Fixed bug in @code{GROUP BY} with two or more fields, where at least one Fixed bug in @code{GROUP BY} with two or more fields, where at least one
field can contain @code{NULL} values. field can contain @code{NULL} values.
@item @item
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
**********************************************************************/ **********************************************************************/
#define MTEST_VERSION "1.23" #define MTEST_VERSION "1.24"
#include <my_global.h> #include <my_global.h>
#include <mysql_embed.h> #include <mysql_embed.h>
...@@ -1446,6 +1446,8 @@ int do_connect(struct st_query* q) ...@@ -1446,6 +1446,8 @@ int do_connect(struct st_query* q)
die("Failed on mysql_init()"); die("Failed on mysql_init()");
if (opt_compress) if (opt_compress)
mysql_options(&next_con->mysql,MYSQL_OPT_COMPRESS,NullS); mysql_options(&next_con->mysql,MYSQL_OPT_COMPRESS,NullS);
mysql_options(&next_con->mysql, MYSQL_OPT_LOCAL_INFILE, 0);
if (con_sock && !free_con_sock && *con_sock && *con_sock != FN_LIBCHAR) if (con_sock && !free_con_sock && *con_sock && *con_sock != FN_LIBCHAR)
con_sock=fn_format(buff, con_sock, TMPDIR, "",0); con_sock=fn_format(buff, con_sock, TMPDIR, "",0);
if (!con_db[0]) if (!con_db[0])
...@@ -2355,6 +2357,8 @@ int main(int argc, char** argv) ...@@ -2355,6 +2357,8 @@ int main(int argc, char** argv)
die("Failed in mysql_init()"); die("Failed in mysql_init()");
if (opt_compress) if (opt_compress)
mysql_options(&cur_con->mysql,MYSQL_OPT_COMPRESS,NullS); mysql_options(&cur_con->mysql,MYSQL_OPT_COMPRESS,NullS);
mysql_options(&cur_con->mysql, MYSQL_OPT_LOCAL_INFILE, 0);
cur_con->name = my_strdup("default", MYF(MY_WME)); cur_con->name = my_strdup("default", MYF(MY_WME));
if (!cur_con->name) if (!cur_con->name)
die("Out of memory"); die("Out of memory");
......
...@@ -114,3 +114,11 @@ i ...@@ -114,3 +114,11 @@ i
3 3
4 4
drop table t1; drop table t1;
create table t1 (i int unsigned not null auto_increment primary key);
alter table t1 rename t2;
alter table t2 rename t1, add c char(10) comment "no comment";
show columns from t1;
Field Type Null Key Default Extra
i int(10) unsigned PRI NULL auto_increment
c char(10) YES NULL
drop table t1;
...@@ -4,8 +4,10 @@ floor(5.5) floor(-5.5) ...@@ -4,8 +4,10 @@ floor(5.5) floor(-5.5)
select ceiling(5.5),ceiling(-5.5); select ceiling(5.5),ceiling(-5.5);
ceiling(5.5) ceiling(-5.5) ceiling(5.5) ceiling(-5.5)
6 -5 6 -5
select truncate(52.64,1),truncate(52.64,2),truncate(52.64,-1),truncate(52.64,-2), truncate(-52.64,1),truncate(-52.64,-1);
truncate(52.64,1) truncate(52.64,2) truncate(52.64,-1) truncate(52.64,-2) truncate(-52.64,1) truncate(-52.64,-1) truncate(52.64,1) truncate(52.64,2) truncate(52.64,-1) truncate(52.64,-2) truncate(-52.64,1) truncate(-52.64,-1)
52.6 52.64 50 0 -52.6 -50 52.6 52.64 50 0 -52.6 -50
select round(5.5),round(-5.5);
round(5.5) round(-5.5) round(5.5) round(-5.5)
6 -6 6 -6
select round(5.64,1),round(5.64,2),round(5.64,-1),round(5.64,-2); select round(5.64,1),round(5.64,2),round(5.64,-1),round(5.64,-2);
......
...@@ -105,3 +105,13 @@ insert into t1 values (null),(null),(null),(null); ...@@ -105,3 +105,13 @@ insert into t1 values (null),(null),(null),(null);
alter table t1 drop i,add i int unsigned not null auto_increment, drop primary key, add primary key (i); alter table t1 drop i,add i int unsigned not null auto_increment, drop primary key, add primary key (i);
select * from t1; select * from t1;
drop table t1; drop table t1;
#
# Alter table and rename
#
create table t1 (i int unsigned not null auto_increment primary key);
alter table t1 rename t2;
alter table t2 rename t1, add c char(10) comment "no comment";
show columns from t1;
drop table t1;
...@@ -18,7 +18,9 @@ ...@@ -18,7 +18,9 @@
/* Thread safe version of gethostbyname_r() */ /* Thread safe version of gethostbyname_r() */
#include "mysys_priv.h" #include "mysys_priv.h"
#ifdef THREAD
#include "my_pthread.h" #include "my_pthread.h"
#endif
#include <assert.h> #include <assert.h>
#if !defined(MSDOS) && !defined(__WIN__) #if !defined(MSDOS) && !defined(__WIN__)
#include <netdb.h> #include <netdb.h>
...@@ -28,11 +30,6 @@ ...@@ -28,11 +30,6 @@
/* This file is not needed if my_gethostbyname_r is a macro */ /* This file is not needed if my_gethostbyname_r is a macro */
#if !defined(my_gethostbyname_r) #if !defined(my_gethostbyname_r)
#ifndef THREAD
#define pthread_mutex_lock(A)
#define pthread_mutex_unlock(A)
#endif
/* /*
Emulate SOLARIS style calls, not because it's better, but just to make the Emulate SOLARIS style calls, not because it's better, but just to make the
usage of getbostbyname_r simpler. usage of getbostbyname_r simpler.
......
...@@ -58,7 +58,7 @@ void hostname_cache_refresh() ...@@ -58,7 +58,7 @@ void hostname_cache_refresh()
bool hostname_cache_init() bool hostname_cache_init()
{ {
host_entry *tmp; host_entry *tmp;
uint offset= (uint) ((char*) (&tmp->ip) - (char*) &tmp); uint offset= (uint) ((char*) (&tmp->ip) - (char*) tmp);
(void) pthread_mutex_init(&LOCK_hostname,MY_MUTEX_INIT_SLOW); (void) pthread_mutex_init(&LOCK_hostname,MY_MUTEX_INIT_SLOW);
if (!(hostname_cache=new hash_filo(HOST_CACHE_SIZE, offset, if (!(hostname_cache=new hash_filo(HOST_CACHE_SIZE, offset,
......
...@@ -1304,13 +1304,14 @@ bool Item_func_like::fix_fields(THD *thd,struct st_table_list *tlist) ...@@ -1304,13 +1304,14 @@ bool Item_func_like::fix_fields(THD *thd,struct st_table_list *tlist)
{ {
pattern = first + 1; pattern = first + 1;
pattern_len = len - 2; pattern_len = len - 2;
DBUG_PRINT("TurboBM", ("Initializing pattern: '%s'...", first)); DBUG_PRINT("info", ("Initializing pattern: '%s'", first));
int* suff = (int*)thd->alloc(sizeof(int[pattern_len + 1])); int *suff = (int*) thd->alloc(sizeof(int)*((pattern_len + 1)*2+
bmGs = (int*)thd->alloc(sizeof(int[pattern_len + 1])); alphabet_size));
bmBc = (int*)thd->alloc(sizeof(int[alphabet_size])); bmGs = suff + pattern_len + 1;
bmBc = bmGs + pattern_len + 1;
turboBM_compute_good_suffix_shifts(suff); turboBM_compute_good_suffix_shifts(suff);
turboBM_compute_bad_character_shifts(); turboBM_compute_bad_character_shifts();
DBUG_PRINT("turboBM",("done")); DBUG_PRINT("info",("done"));
} }
} }
return 0; return 0;
......
...@@ -495,16 +495,10 @@ class Item_func_like :public Item_bool_func2 ...@@ -495,16 +495,10 @@ class Item_func_like :public Item_bool_func2
enum { alphabet_size = 256 }; enum { alphabet_size = 256 };
public: public:
Item_func_like::Item_func_like(Item *a,Item *b, char* escape_arg) : Item_func_like(Item *a,Item *b, char* escape_arg)
Item_bool_func2(a,b), :Item_bool_func2(a,b), escape(*escape_arg), canDoTurboBM(false),
escape(*escape_arg), pattern(0), pattern_len(0), bmGs(0), bmBc(0)
canDoTurboBM(false),
pattern(0),
pattern_len(0),
bmGs(0),
bmBc(0)
{} {}
longlong val_int(); longlong val_int();
enum Functype functype() const { return LIKE_FUNC; } enum Functype functype() const { return LIKE_FUNC; }
optimize_type select_optimize() const; optimize_type select_optimize() const;
......
...@@ -4004,6 +4004,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), ...@@ -4004,6 +4004,7 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
exit(0); exit(0);
case 'T': case 'T':
test_flags= argument ? (uint) atoi(argument) : 0; test_flags= argument ? (uint) atoi(argument) : 0;
test_flags&= ~TEST_NO_THREADS;
opt_endinfo=1; opt_endinfo=1;
break; break;
case (int) OPT_BIG_TABLES: case (int) OPT_BIG_TABLES:
...@@ -4192,8 +4193,10 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)), ...@@ -4192,8 +4193,10 @@ get_one_option(int optid, const struct my_option *opt __attribute__((unused)),
opt_specialflag|=SPECIAL_SKIP_SHOW_DB; opt_specialflag|=SPECIAL_SKIP_SHOW_DB;
mysql_port=0; mysql_port=0;
break; break;
#ifdef ONE_THREAD
case (int) OPT_ONE_THREAD: case (int) OPT_ONE_THREAD:
test_flags |= TEST_NO_THREADS; test_flags |= TEST_NO_THREADS;
#endif
break; break;
case (int) OPT_WANT_CORE: case (int) OPT_WANT_CORE:
test_flags |= TEST_CORE_ON_SIGNAL; test_flags |= TEST_CORE_ON_SIGNAL;
......
...@@ -90,21 +90,21 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result, ...@@ -90,21 +90,21 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result,
(*param->item)->val() < 0) (*param->item)->val() < 0)
{ {
net_printf(&thd->net, ER_WRONG_PARAMETERS_TO_PROCEDURE, proc_name); net_printf(&thd->net, ER_WRONG_PARAMETERS_TO_PROCEDURE, proc_name);
return 0; DBUG_RETURN(0);
} }
pc->max_tree_elements = (uint) (*param->item)->val_int(); pc->max_tree_elements = (uint) (*param->item)->val_int();
param = param->next; param = param->next;
if (param->next) // no third parameter possible if (param->next) // no third parameter possible
{ {
net_printf(&thd->net, ER_WRONG_PARAMCOUNT_TO_PROCEDURE, proc_name); net_printf(&thd->net, ER_WRONG_PARAMCOUNT_TO_PROCEDURE, proc_name);
return 0; DBUG_RETURN(0);
} }
// second parameter // second parameter
if ((*param->item)->type() != Item::INT_ITEM || if ((*param->item)->type() != Item::INT_ITEM ||
(*param->item)->val() < 0) (*param->item)->val() < 0)
{ {
net_printf(&thd->net, ER_WRONG_PARAMETERS_TO_PROCEDURE, proc_name); net_printf(&thd->net, ER_WRONG_PARAMETERS_TO_PROCEDURE, proc_name);
return 0; DBUG_RETURN(0);
} }
pc->max_treemem = (uint) (*param->item)->val_int(); pc->max_treemem = (uint) (*param->item)->val_int();
} }
...@@ -112,7 +112,7 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result, ...@@ -112,7 +112,7 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result,
(*param->item)->val() < 0) (*param->item)->val() < 0)
{ {
net_printf(&thd->net, ER_WRONG_PARAMETERS_TO_PROCEDURE, proc_name); net_printf(&thd->net, ER_WRONG_PARAMETERS_TO_PROCEDURE, proc_name);
return 0; DBUG_RETURN(0);
} }
// if only one parameter was given, it will be the value of max_tree_elements // if only one parameter was given, it will be the value of max_tree_elements
else else
...@@ -148,21 +148,26 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result, ...@@ -148,21 +148,26 @@ proc_analyse_init(THD *thd, ORDER *param, select_result *result,
if (item->result_type() == STRING_RESULT) if (item->result_type() == STRING_RESULT)
*f_info++ = new field_str(item, pc); *f_info++ = new field_str(item, pc);
} }
return pc; DBUG_RETURN(pc);
} // proc_analyse_init }
// return 1 if number, else return 0 /*
// store info about found number in info Return 1 if number, else return 0
// NOTE:It is expected, that elements of 'info' are all zero! store info about found number in info
NOTE:It is expected, that elements of 'info' are all zero!
*/
bool test_if_number(NUM_INFO *info, const char *str, uint str_len) bool test_if_number(NUM_INFO *info, const char *str, uint str_len)
{ {
const char *begin, *end = str + str_len; const char *begin, *end = str + str_len;
DBUG_ENTER("test_if_number"); DBUG_ENTER("test_if_number");
// MySQL removes any endspaces of a string, so we must take care only of /*
// spaces in front of a string MySQL removes any endspaces of a string, so we must take care only of
spaces in front of a string
*/
for (; str != end && isspace(*str); str++) ; for (; str != end && isspace(*str); str++) ;
if (str == end) if (str == end)
return 0; return 0;
......
...@@ -589,7 +589,7 @@ pthread_handler_decl(handle_one_connection,arg) ...@@ -589,7 +589,7 @@ pthread_handler_decl(handle_one_connection,arg)
#if !defined( __WIN__) && !defined(OS2) // Win32 calls this in pthread_create #if !defined( __WIN__) && !defined(OS2) // Win32 calls this in pthread_create
// The following calls needs to be done before we call DBUG_ macros // The following calls needs to be done before we call DBUG_ macros
if (my_thread_init()) if (!(test_flags & TEST_NO_THREADS) & my_thread_init())
{ {
close_connection(&thd->net,ER_OUT_OF_RESOURCES); close_connection(&thd->net,ER_OUT_OF_RESOURCES);
statistic_increment(aborted_connects,&LOCK_thread_count); statistic_increment(aborted_connects,&LOCK_thread_count);
......
...@@ -1235,7 +1235,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, ...@@ -1235,7 +1235,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
thd->proc_info="init"; thd->proc_info="init";
table_name=table_list->real_name; table_name=table_list->real_name;
db=table_list->db; db=table_list->db;
if (!new_db) if (!new_db || !strcmp(new_db,db))
new_db=db; new_db=db;
used_fields=create_info->used_fields; used_fields=create_info->used_fields;
...@@ -1289,10 +1289,10 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, ...@@ -1289,10 +1289,10 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
/* In some simple cases we need not to recreate the table */ /* In some simple cases we need not to recreate the table */
thd->proc_info="setup"; thd->proc_info="setup";
if (simple_alter) if (simple_alter && !table->tmp_table)
{ {
error=0; error=0;
if (new_name != table_name) if (new_name != table_name || new_db != db)
{ {
thd->proc_info="rename"; thd->proc_info="rename";
VOID(pthread_mutex_lock(&LOCK_open)); VOID(pthread_mutex_lock(&LOCK_open));
...@@ -1315,15 +1315,15 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, ...@@ -1315,15 +1315,15 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
} }
if (!error) if (!error)
{ {
switch (keys_onoff) switch (keys_onoff) {
{ case LEAVE_AS_IS:
case LEAVE_AS_IS: break; break;
case ENABLE: case ENABLE:
error=table->file->activate_all_index(thd); error=table->file->activate_all_index(thd);
break; break;
case DISABLE: case DISABLE:
table->file->deactivate_non_unique_index(HA_POS_ERROR); table->file->deactivate_non_unique_index(HA_POS_ERROR);
break; break;
} }
} }
if (!error) if (!error)
...@@ -1720,7 +1720,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, ...@@ -1720,7 +1720,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
thd->proc_info="rename result table"; thd->proc_info="rename result table";
sprintf(old_name,"%s2-%lx-%lx", tmp_file_prefix, current_pid, sprintf(old_name,"%s2-%lx-%lx", tmp_file_prefix, current_pid,
thd->thread_id); thd->thread_id);
if (new_name != table_name) if (new_name != table_name || new_db != db)
{ {
if (!access(new_name_buff,F_OK)) if (!access(new_name_buff,F_OK))
{ {
...@@ -1738,7 +1738,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name, ...@@ -1738,7 +1738,7 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
{ {
/* /*
Win32 and InnoDB can't drop a table that is in use, so we must Win32 and InnoDB can't drop a table that is in use, so we must
close all the original table at before doing the rename close the original table at before doing the rename
*/ */
table_name=thd->strdup(table_name); // must be saved table_name=thd->strdup(table_name); // must be saved
if (close_cached_table(thd,table)) if (close_cached_table(thd,table))
......
...@@ -1069,7 +1069,8 @@ attribute: ...@@ -1069,7 +1069,8 @@ attribute:
| AUTO_INC { Lex->type|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG; } | AUTO_INC { Lex->type|= AUTO_INCREMENT_FLAG | NOT_NULL_FLAG; }
| PRIMARY_SYM KEY_SYM { Lex->type|= PRI_KEY_FLAG | NOT_NULL_FLAG; } | PRIMARY_SYM KEY_SYM { Lex->type|= PRI_KEY_FLAG | NOT_NULL_FLAG; }
| UNIQUE_SYM { Lex->type|= UNIQUE_FLAG; } | UNIQUE_SYM { Lex->type|= UNIQUE_FLAG; }
| UNIQUE_SYM KEY_SYM { Lex->type|= UNIQUE_KEY_FLAG; }; | UNIQUE_SYM KEY_SYM { Lex->type|= UNIQUE_KEY_FLAG; }
| COMMENT_SYM text_literal {};
opt_binary: opt_binary:
/* empty */ {} /* empty */ {}
...@@ -1203,8 +1204,7 @@ alter_list_item: ...@@ -1203,8 +1204,7 @@ alter_list_item:
lex->length,lex->dec,lex->type, lex->length,lex->dec,lex->type,
lex->default_value, $3.str, lex->default_value, $3.str,
lex->interval)) lex->interval))
YYABORT; YYABORT;
lex->simple_alter=0;
} }
opt_place opt_place
| DROP opt_column field_ident opt_restrict | DROP opt_column field_ident opt_restrict
...@@ -1245,7 +1245,6 @@ alter_list_item: ...@@ -1245,7 +1245,6 @@ alter_list_item:
LEX *lex=Lex; LEX *lex=Lex;
lex->select->db=$3->db.str; lex->select->db=$3->db.str;
lex->name= $3->table.str; lex->name= $3->table.str;
lex->simple_alter=0;
} }
| create_table_options { Lex->simple_alter=0; } | create_table_options { Lex->simple_alter=0; }
| order_clause { Lex->simple_alter=0; }; | order_clause { Lex->simple_alter=0; };
......
...@@ -36,12 +36,14 @@ const char *VER="0.2"; ...@@ -36,12 +36,14 @@ const char *VER="0.2";
const char *default_dbug_option="d:t:O,-"; const char *default_dbug_option="d:t:O,-";
#endif #endif
#if 0
static void static void
fatal_error( const char* r) fatal_error( const char* r)
{ {
perror(r); perror(r);
exit(0); exit(0);
} }
#endif
typedef struct { typedef struct {
int sd; int sd;
...@@ -70,13 +72,13 @@ do_ssl_stuff( TH_ARGS* args) ...@@ -70,13 +72,13 @@ do_ssl_stuff( TH_ARGS* args)
static void* static void*
client_thread( void* arg) client_thread( void* arg)
{ {
my_thread_init(); my_thread_init();
do_ssl_stuff((TH_ARGS*)arg); do_ssl_stuff((TH_ARGS*)arg);
return 0;
} }
int int
main( int argc __attribute__((unused)), main(int argc __attribute__((unused)), char** argv)
char** argv)
{ {
char server_key[] = "../SSL/server-key.pem", char server_key[] = "../SSL/server-key.pem",
server_cert[] = "../SSL/server-cert.pem"; server_cert[] = "../SSL/server-cert.pem";
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment