summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorunknown <sasha@mysql.sashanet.com>2001-08-11 17:28:41 -0600
committerunknown <sasha@mysql.sashanet.com>2001-08-11 17:28:41 -0600
commitc9dbb4b72640ecfc063f06f9373ac42ef3d9775f (patch)
tree68a7e089d65a9c4434527dfc1e58ba2f98a15a88 /sql
parentd7c5327db62886135dcb14ba1d9d117eaeaf6100 (diff)
parent23d5f3f96546ce146c0986c53b114761b56a8650 (diff)
downloadmariadb-git-c9dbb4b72640ecfc063f06f9373ac42ef3d9775f.tar.gz
merged
BitKeeper/etc/logging_ok: auto-union BitKeeper/etc/ignore: auto-union acinclude.m4: Auto merged BitKeeper/deleted/.del-rpc_server_ext.h~952741fb85de2b80: Auto merged client/mysqlbinlog.cc: Auto merged mysql-test/r/innodb.result: Auto merged sql-bench/Makefile.am: Auto merged sql/ha_myisam.cc: Auto merged sql/ha_myisammrg.cc: Auto merged sql/sql_list.h: Auto merged sql/sql_parse.cc: Auto merged sql/sql_select.cc: Auto merged sql/sql_show.cc: Auto merged Docs/manual.texi: merge include/mysql_com.h: merge include/mysqld_error.h: merge mysql-test/install_test_db.sh: merge sql/mysql_priv.h: merge sql/mysqld.cc: merge sql/share/czech/errmsg.txt: merge sql/share/danish/errmsg.txt: merge sql/share/dutch/errmsg.txt: merge sql/share/english/errmsg.txt: merge sql/share/estonian/errmsg.txt: merge sql/share/french/errmsg.txt: merge sql/share/german/errmsg.txt: merge sql/share/greek/errmsg.txt: merge sql/share/hungarian/errmsg.txt: merge sql/share/italian/errmsg.txt: merge sql/share/japanese/errmsg.txt: merge sql/share/korean/errmsg.txt: merge sql/share/norwegian-ny/errmsg.txt: merge sql/share/norwegian/errmsg.txt: merge sql/share/polish/errmsg.txt: merge sql/share/portuguese/errmsg.txt: merge sql/share/romanian/errmsg.txt: merge sql/share/russian/errmsg.txt: merge sql/share/slovak/errmsg.txt: merge sql/share/spanish/errmsg.txt: merge sql/share/swedish/errmsg.txt: merge sql/sql_base.cc: merge sql/sql_table.cc: merge
Diffstat (limited to 'sql')
-rw-r--r--sql/ha_myisammrg.cc2
-rw-r--r--sql/mysqld.cc44
-rw-r--r--sql/records.cc4
-rw-r--r--sql/sql_acl.cc103
-rw-r--r--sql/sql_acl.h2
-rw-r--r--sql/sql_list.h11
-rw-r--r--sql/sql_parse.cc2
-rw-r--r--sql/sql_select.cc44
-rw-r--r--sql/sql_show.cc2
-rw-r--r--sql/sql_table.cc10
10 files changed, 158 insertions, 66 deletions
diff --git a/sql/ha_myisammrg.cc b/sql/ha_myisammrg.cc
index e3e1d959438..ddfd48a0e71 100644
--- a/sql/ha_myisammrg.cc
+++ b/sql/ha_myisammrg.cc
@@ -229,6 +229,7 @@ void ha_myisammrg::update_create_info(HA_CREATE_INFO *create_info)
MYRG_TABLE *table;
THD *thd=current_thd;
create_info->merge_list.next= &create_info->merge_list.first;
+ create_info->merge_list.elements=0;
for (table=file->open_tables ; table != file->end_table ; table++)
{
@@ -240,6 +241,7 @@ void ha_myisammrg::update_create_info(HA_CREATE_INFO *create_info)
fn_format(buff,name,"","",3);
if (!(ptr->real_name=thd->strdup(buff)))
goto err;
+ create_info->merge_list.elements++;
(*create_info->merge_list.next) = (byte*) ptr;
create_info->merge_list.next= (byte**) &ptr->next;
}
diff --git a/sql/mysqld.cc b/sql/mysqld.cc
index d368050feaf..4d5ea1d1354 100644
--- a/sql/mysqld.cc
+++ b/sql/mysqld.cc
@@ -1532,9 +1532,13 @@ static void open_log(MYSQL_LOG *log, const char *hostname,
// get rid of extention if the log is binary to avoid problems
if (type == LOG_BIN)
{
- char* p = strrchr((char*) opt_name, FN_EXTCHAR);
+ char *p = fn_ext(opt_name);
if (p)
- *p = 0;
+ {
+ uint length=(uint) (p-opt_name);
+ strmake(tmp,opt_name,min(length,FN_REFLEN));
+ opt_name=tmp;
+ }
}
log->open(opt_name,type);
}
@@ -2818,6 +2822,8 @@ CHANGEABLE_VAR changeable_vars[] = {
0, MALLOC_OVERHEAD, (long) ~0, MALLOC_OVERHEAD, IO_SIZE },
{ "record_buffer", (long*) &my_default_record_cache_size,
128*1024L, IO_SIZE*2+MALLOC_OVERHEAD, ~0L, MALLOC_OVERHEAD, IO_SIZE },
+ { "record_rnd_buffer", (long*) &record_rnd_cache_size,
+ 0, IO_SIZE*2+MALLOC_OVERHEAD, ~0L, MALLOC_OVERHEAD, IO_SIZE },
{ "slave_net_timeout", (long*) &slave_net_timeout,
SLAVE_NET_TIMEOUT, 1, 65535, 0, 1 },
{ "slow_launch_time", (long*) &slow_launch_time,
@@ -2907,6 +2913,7 @@ struct show_var_st init_vars[]= {
{"log_update", (char*) &opt_update_log, SHOW_BOOL},
{"log_bin", (char*) &opt_bin_log, SHOW_BOOL},
{"log_slave_updates", (char*) &opt_log_slave_updates, SHOW_BOOL},
+ {"log_long_queries", (char*) &opt_slow_log, SHOW_BOOL},
{"long_query_time", (char*) &long_query_time, SHOW_LONG},
{"low_priority_updates", (char*) &low_priority_updates, SHOW_BOOL},
{"lower_case_table_names", (char*) &lower_case_table_names, SHOW_LONG},
@@ -2937,6 +2944,7 @@ struct show_var_st init_vars[]= {
{"port", (char*) &mysql_port, SHOW_INT},
{"protocol_version", (char*) &protocol_version, SHOW_INT},
{"record_buffer", (char*) &my_default_record_cache_size,SHOW_LONG},
+ {"record_rnd_buffer", (char*) &record_rnd_cache_size, SHOW_LONG},
{"query_buffer_size", (char*) &query_buff_size, SHOW_LONG},
{"safe_show_database", (char*) &opt_safe_show_db, SHOW_BOOL},
{"server_id", (char*) &server_id, SHOW_LONG},
@@ -2947,7 +2955,7 @@ struct show_var_st init_vars[]= {
{"slow_launch_time", (char*) &slow_launch_time, SHOW_LONG},
{"socket", (char*) &mysql_unix_port, SHOW_CHAR_PTR},
{"sort_buffer", (char*) &sortbuff_size, SHOW_LONG},
- {"sql_mode", (char*) &sql_mode_str, SHOW_CHAR_PTR},
+ {"sql_mode", (char*) &opt_sql_mode, SHOW_LONG},
{"table_cache", (char*) &table_cache_size, SHOW_LONG},
{"table_type", (char*) &default_table_type_name, SHOW_CHAR_PTR},
{"thread_cache_size", (char*) &thread_cache_size, SHOW_LONG},
@@ -3109,6 +3117,8 @@ static void usage(void)
--safe-mode Skip some optimize stages (for testing)\n\
--safe-show-database Don't show databases for which the user has no\n\
privileges\n\
+ --safe-user-create Don't new users cretaion without privileges to the\n\
+ mysql.user table\n\
--skip-concurrent-insert\n\
Don't use concurrent insert with MyISAM\n\
--skip-delay-key-write\n\
@@ -3817,6 +3827,20 @@ static void get_options(int argc,char **argv)
ha_open_options|=HA_OPEN_ABORT_IF_CRASHED;
break;
}
+ case OPT_SQL_MODE:
+ {
+ sql_mode_str = optarg;
+ if ((opt_sql_mode =
+ find_bit_type(optarg, &sql_mode_typelib)) == ~(ulong) 0)
+ {
+ fprintf(stderr, "Unknown option to sql-mode: %s\n", optarg);
+ exit(1);
+ }
+ default_tx_isolation= ((opt_sql_mode & MODE_SERIALIZABLE) ?
+ ISO_SERIALIZABLE :
+ ISO_READ_COMMITTED);
+ break;
+ }
case OPT_MASTER_HOST:
master_host=optarg;
break;
@@ -3850,6 +3874,9 @@ static void get_options(int argc,char **argv)
case OPT_SAFE_SHOW_DB:
opt_safe_show_db=1;
break;
+ case OPT_SAFE_USER_CREATE:
+ opt_safe_user_create=1;
+ break;
case OPT_SKIP_SAFEMALLOC:
#ifdef SAFEMALLOC
sf_malloc_quick=1;
@@ -3874,6 +3901,9 @@ static void get_options(int argc,char **argv)
fix_paths();
default_table_type_name=ha_table_typelib.type_names[default_table_type-1];
default_tx_isolation_name=tx_isolation_typelib.type_names[default_tx_isolation];
+ /* To be deleted in MySQL 4.0 */
+ if (!record_rnd_cache_size)
+ record_rnd_cache_size=my_default_record_cache_size;
}
@@ -4149,7 +4179,7 @@ static int get_service_parameters()
}
else if ( lstrcmp(szKeyValueName, TEXT("KeyBufferSize")) == 0 )
{
- SET_CHANGEABLE_VARVAL( "key_buffer_size" );
+ SET_CHANGEABLE_VARVAL( "key_buffer" );
}
else if ( lstrcmp(szKeyValueName, TEXT("LongQueryTime")) == 0 )
{
@@ -4463,7 +4493,9 @@ static ulong find_bit_type(const char *x, TYPELIB *bit_lib)
found=0;
found_end= 0;
pos=(my_string) x;
- do
+ while (*pos == ' ') pos++;
+ found_end= *pos == 0;
+ while (!found_end)
{
if (!*(end=strcend(pos,','))) /* Let end point at fieldend */
{
@@ -4496,7 +4528,7 @@ skipp: ;
DBUG_RETURN(~(ulong) 0); // No unique value
found|=found_int;
pos=end+1;
- } while (! found_end);
+ }
DBUG_PRINT("exit",("bit-field: %ld",(ulong) found));
DBUG_RETURN(found);
diff --git a/sql/records.cc b/sql/records.cc
index 3187aa424d7..0f49b3fa45e 100644
--- a/sql/records.cc
+++ b/sql/records.cc
@@ -66,7 +66,7 @@ void init_read_record(READ_RECORD *info,THD *thd, TABLE *table,
table->file->rnd_init(0);
if (! (specialflag & SPECIAL_SAFE_MODE) &&
- my_default_record_cache_size &&
+ record_rnd_cache_size &&
!table->file->fast_key_read() &&
(table->db_stat & HA_READ_ONLY ||
table->reginfo.lock_type <= TL_READ_NO_INSERT) &&
@@ -216,7 +216,7 @@ static int init_rr_cache(READ_RECORD *info)
info->reclength=ALIGN_SIZE(info->struct_length);
info->error_offset=info->table->reclength;
- info->cache_records=my_default_record_cache_size/
+ info->cache_records=record_rnd_cache_size/
(info->reclength+info->struct_length);
rec_cache_size=info->cache_records*info->reclength;
info->rec_cache_size=info->cache_records*info->ref_length;
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index 0cca3df0b16..86d3f61776c 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -943,16 +943,41 @@ end:
DBUG_RETURN(error);
}
+
+/* Return 1 if we are allowed to create new users */
+
+static bool test_if_create_new_users(THD *thd)
+{
+ bool create_new_users=1; // Assume that we are allowed to create new users
+ if (opt_safe_user_create && !(thd->master_access & INSERT_ACL))
+ {
+ TABLE_LIST tl;
+ uint db_access;
+ bzero((char*) &tl,sizeof(tl));
+ tl.db= (char*) "mysql";
+ tl.real_name= (char*) "user";
+ db_access=acl_get(thd->host, thd->ip, (char*) &thd->remote.sin_addr,
+ thd->priv_user, tl.db);
+ if (!(db_access & INSERT_ACL))
+ {
+ if (check_grant(thd,INSERT_ACL,&tl,0,1))
+ create_new_users=0;
+ }
+ }
+ return create_new_users;
+}
+
+
/****************************************************************************
** Handle GRANT commands
****************************************************************************/
static int replace_user_table(TABLE *table, const LEX_USER &combo,
- uint rights, char what)
+ uint rights, char what, bool create_user)
{
int error = -1;
uint i,j;
- bool ima=0;
+ bool old_row_exists=0;
char *password,empty_string[1];
DBUG_ENTER("replace_user_table");
@@ -971,14 +996,21 @@ static int replace_user_table(TABLE *table, const LEX_USER &combo,
(byte*) table->field[0]->ptr,0,
HA_READ_KEY_EXACT))
{
- if (what == 'N')
+ if (!create_user)
{
- my_printf_error(ER_NONEXISTING_GRANT,ER(ER_NONEXISTING_GRANT),
- MYF(0),combo.user.str,combo.host.str);
+ THD *thd=current_thd;
+ if (what == 'N')
+ my_printf_error(ER_NONEXISTING_GRANT,ER(ER_NONEXISTING_GRANT),
+ MYF(0),combo.user.str,combo.host.str);
+ else
+ my_printf_error(ER_NO_PERMISSON_TO_CREATE_USER,
+ ER(ER_NO_PERMISSON_TO_CREATE_USER),
+ MYF(0),thd->user,
+ thd->host ? thd->host : thd->ip ? thd->ip: "");
error= -1;
goto end;
}
- ima = 0; // no row; ima on Serbian means 'there is something'
+ old_row_exists = 0;
restore_record(table,2); // cp empty row from record[2]
table->field[0]->store(combo.host.str,combo.host.length);
table->field[1]->store(combo.user.str,combo.user.length);
@@ -986,7 +1018,7 @@ static int replace_user_table(TABLE *table, const LEX_USER &combo,
}
else
{
- ima = 1;
+ old_row_exists = 1;
store_record(table,1); // Save copy for update
if (combo.password.str) // If password given
table->field[2]->store(password,(uint) strlen(password));
@@ -1001,7 +1033,7 @@ static int replace_user_table(TABLE *table, const LEX_USER &combo,
}
rights=get_access(table,3);
- if (ima) // there is a row, therefore go to update, instead of insert
+ if (old_row_exists)
{
/*
We should NEVER delete from the user table, as a uses can still
@@ -1033,7 +1065,7 @@ static int replace_user_table(TABLE *table, const LEX_USER &combo,
acl_cache->clear(1); // Clear privilege cache
if (!combo.password.str)
password=0; // No password given on command
- if (ima)
+ if (old_row_exists)
acl_update_user(combo.user.str,combo.host.str,password,rights);
else
acl_insert_user(combo.user.str,combo.host.str,password,rights);
@@ -1052,7 +1084,7 @@ static int replace_db_table(TABLE *table, const char *db,
uint rights, char what)
{
uint i,j,store_rights;
- bool ima=0;
+ bool old_row_exists=0;
int error;
DBUG_ENTER("replace_db_table");
@@ -1076,7 +1108,7 @@ static int replace_db_table(TABLE *table, const char *db,
combo.user.str,combo.host.str);
goto abort;
}
- ima = 0; // no row
+ old_row_exists = 0;
restore_record(table,2); // cp empty row from record[2]
table->field[0]->store(combo.host.str,combo.host.length);
table->field[1]->store(db,(uint) strlen(db));
@@ -1084,7 +1116,7 @@ static int replace_db_table(TABLE *table, const char *db,
}
else
{
- ima = 1;
+ old_row_exists = 1;
store_record(table,1);
}
@@ -1097,8 +1129,9 @@ static int replace_db_table(TABLE *table, const char *db,
rights=get_access(table,3);
rights=fix_rights_for_db(rights);
- if (ima) // there is a row, therefore go update, else insert
+ if (old_row_exists)
{
+ // update old existing row
if (rights)
{
if ((error=table->file->update_row(table->record[1],table->record[0])))
@@ -1117,7 +1150,7 @@ static int replace_db_table(TABLE *table, const char *db,
}
acl_cache->clear(1); // Clear privilege cache
- if (ima)
+ if (old_row_exists)
acl_update_db(combo.user.str,combo.host.str,db,rights);
else
acl_insert_db(combo.user.str,combo.host.str,db,rights);
@@ -1324,7 +1357,7 @@ static int replace_column_table(GRANT_TABLE *g_t,
while ((xx=iter++))
{
uint privileges = xx->rights;
- bool ima=0;
+ bool old_row_exists=0;
key_restore(table,key,0,key_length);
table->field[4]->store(xx->column.ptr(),xx->column.length());
@@ -1339,7 +1372,7 @@ static int replace_column_table(GRANT_TABLE *g_t,
result= -1; /* purecov: inspected */
continue; /* purecov: inspected */
}
- ima = 0;
+ old_row_exists = 0;
restore_record(table,2); // Get empty record
key_restore(table,key,0,key_length);
table->field[4]->store(xx->column.ptr(),xx->column.length());
@@ -1353,13 +1386,13 @@ static int replace_column_table(GRANT_TABLE *g_t,
privileges = tmp & ~(privileges | rights);
else
privileges |= tmp;
- ima = 1;
+ old_row_exists = 1;
store_record(table,1); // copy original row
}
table->field[6]->store((longlong) get_rights_for_column(privileges));
- if (ima) // there is a row, therefore go update, else insert
+ if (old_row_exists)
{
if (privileges)
error=table->file->update_row(table->record[1],table->record[0]);
@@ -1465,7 +1498,7 @@ static int replace_table_table(THD *thd, GRANT_TABLE *grant_table,
uint rights, uint kolone, bool revoke_grant)
{
char grantor[HOSTNAME_LENGTH+1+USERNAME_LENGTH];
- int ima = 1;
+ int old_row_exists = 1;
int error=0;
uint store_table_rights,store_col_rights;
DBUG_ENTER("replace_table_table");
@@ -1505,13 +1538,13 @@ static int replace_table_table(THD *thd, GRANT_TABLE *grant_table,
table_name); /* purecov: deadcode */
DBUG_RETURN(-1); /* purecov: deadcode */
}
- ima = 0; // no row
+ old_row_exists = 0;
restore_record(table,1); // Get saved record
}
store_table_rights=get_rights_for_table(rights);
store_col_rights=get_rights_for_column(kolone);
- if (ima)
+ if (old_row_exists)
{
uint j,k;
store_record(table,1);
@@ -1536,7 +1569,7 @@ static int replace_table_table(THD *thd, GRANT_TABLE *grant_table,
rights=fix_rights_for_table(store_table_rights);
kolone=fix_rights_for_column(store_col_rights);
- if (ima) // there is a row, therefore go update, else insert
+ if (old_row_exists)
{
if (store_table_rights || store_col_rights)
{
@@ -1668,10 +1701,12 @@ int mysql_table_grant (THD *thd, TABLE_LIST *table_list,
continue;
}
/* Create user if needed */
- if ((replace_user_table(tables[0].table,
+ if (replace_user_table(tables[0].table,
*Str,
0,
- revoke_grant ? 'N' : 'Y')))
+ revoke_grant ? 'N' : 'Y',
+ (revoke_grant ? 0 :
+ test_if_create_new_users(thd))))
{
result= -1; // Remember error
continue; // Add next user
@@ -1773,6 +1808,7 @@ int mysql_grant (THD *thd, const char *db, List <LEX_USER> &list, uint rights,
List_iterator <LEX_USER> str_list (list);
LEX_USER *Str;
char what;
+ bool create_new_users=0;
TABLE_LIST tables[2];
DBUG_ENTER("mysql_grant");
@@ -1799,8 +1835,10 @@ int mysql_grant (THD *thd, const char *db, List <LEX_USER> &list, uint rights,
DBUG_RETURN(-1); /* purecov: deadcode */
}
- // go through users in user_list
+ if (!revoke_grant)
+ create_new_users= test_if_create_new_users(thd);
+ // go through users in user_list
pthread_mutex_lock(&LOCK_grant);
VOID(pthread_mutex_lock(&acl_cache->lock));
grant_version++;
@@ -1822,11 +1860,14 @@ int mysql_grant (THD *thd, const char *db, List <LEX_USER> &list, uint rights,
}
if ((replace_user_table(tables[0].table,
*Str,
- (!db ? rights : 0), what)))
- result= -1;
- if (db && replace_db_table(tables[1].table, db, *Str, rights & DB_ACLS,
- what))
+ (!db ? rights : 0), what, create_new_users)))
result= -1;
+ else
+ {
+ if (db && replace_db_table(tables[1].table, db, *Str, rights & DB_ACLS,
+ what))
+ result= -1;
+ }
}
VOID(pthread_mutex_unlock(&acl_cache->lock));
pthread_mutex_unlock(&LOCK_grant);
@@ -1978,7 +2019,7 @@ void grant_reload(void)
****************************************************************************/
bool check_grant(THD *thd, uint want_access, TABLE_LIST *tables,
- uint show_table)
+ uint show_table, bool no_errors)
{
TABLE_LIST *table;
char *user = thd->priv_user;
@@ -2026,7 +2067,7 @@ bool check_grant(THD *thd, uint want_access, TABLE_LIST *tables,
err:
pthread_mutex_unlock(&LOCK_grant);
- if (show_table != 1) // Not a silent skip of table
+ if (!no_errors) // Not a silent skip of table
{
const char *command="";
if (want_access & SELECT_ACL)
diff --git a/sql/sql_acl.h b/sql/sql_acl.h
index ff9a105d76b..cf9696d51e7 100644
--- a/sql/sql_acl.h
+++ b/sql/sql_acl.h
@@ -74,7 +74,7 @@ int grant_init(void);
void grant_free(void);
void grant_reload(void);
bool check_grant(THD *thd, uint want_access, TABLE_LIST *tables,
- uint show_command=0);
+ uint show_command=0, bool dont_print_error=0);
bool check_grant_column (THD *thd,TABLE *table, const char *name,uint length,
uint show_command=0);
bool check_grant_all_columns(THD *thd, uint want_access, TABLE *table);
diff --git a/sql/sql_list.h b/sql/sql_list.h
index 1486502148f..1e1b3a612e6 100644
--- a/sql/sql_list.h
+++ b/sql/sql_list.h
@@ -27,8 +27,15 @@ class Sql_alloc
public:
static void *operator new(size_t size) {return (void*) sql_alloc((uint) size); }
static void operator delete(void *ptr, size_t size) {} /*lint -e715 */
- inline Sql_alloc() {};
- inline ~Sql_alloc() {};
+#ifdef HAVE_purify
+ bool dummy;
+ inline Sql_alloc() :dummy(0) {}
+ inline ~Sql_alloc() {}
+#else
+ inline Sql_alloc() {}
+ inline ~Sql_alloc() {}
+#endif
+
};
/*
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 1655d54e9fc..00e0bdefc0c 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -2116,7 +2116,7 @@ mysql_execute_command(void)
else
res = mysql_grant(thd, select_lex->db, lex->users_list, lex->grant,
lex->sql_command == SQLCOM_REVOKE);
- if(!res)
+ if (!res)
{
mysql_update_log.write(thd, thd->query,thd->query_length);
if (mysql_bin_log.is_open())
diff --git a/sql/sql_select.cc b/sql/sql_select.cc
index 3a1d36796b2..0f87eaccd51 100644
--- a/sql/sql_select.cc
+++ b/sql/sql_select.cc
@@ -1413,24 +1413,27 @@ add_ft_keys(DYNAMIC_ARRAY *keyuse_array,
if (cond->type() == Item::FUNC_ITEM)
{
- Item_func *func=(Item_func *)cond,
- *arg0=(Item_func *)(func->arguments()[0]),
- *arg1=(Item_func *)(func->arguments()[1]);
-
- if (func->functype() == Item_func::FT_FUNC)
+ Item_func *func=(Item_func *)cond;
+ Item_func::Functype functype= func->functype();
+ if (functype == Item_func::FT_FUNC)
cond_func=(Item_func_match *)cond;
- else if ((func->functype() == Item_func::GE_FUNC ||
- func->functype() == Item_func::GT_FUNC) &&
- arg0->type() == Item::FUNC_ITEM &&
- arg0->functype() == Item_func::FT_FUNC &&
- arg1->const_item() && arg1->val()>=0)
- cond_func=(Item_func_match *)arg0;
- else if ((func->functype() == Item_func::LE_FUNC ||
- func->functype() == Item_func::LT_FUNC) &&
- arg1->type() == Item::FUNC_ITEM &&
- arg1->functype() == Item_func::FT_FUNC &&
- arg0->const_item() && arg0->val()>=0)
- cond_func=(Item_func_match *)arg1;
+ else if (func->arg_count == 2)
+ {
+ Item_func *arg0=(Item_func *)(func->arguments()[0]),
+ *arg1=(Item_func *)(func->arguments()[1]);
+ if ((functype == Item_func::GE_FUNC ||
+ functype == Item_func::GT_FUNC) &&
+ arg0->type() == Item::FUNC_ITEM &&
+ arg0->functype() == Item_func::FT_FUNC &&
+ arg1->const_item() && arg1->val()>=0)
+ cond_func=(Item_func_match *) arg0;
+ else if ((functype == Item_func::LE_FUNC ||
+ functype == Item_func::LT_FUNC) &&
+ arg1->type() == Item::FUNC_ITEM &&
+ arg1->functype() == Item_func::FT_FUNC &&
+ arg0->const_item() && arg0->val()>=0)
+ cond_func=(Item_func_match *) arg1;
+ }
}
else if (cond->type() == Item::COND_ITEM)
{
@@ -1439,18 +1442,21 @@ add_ft_keys(DYNAMIC_ARRAY *keyuse_array,
if (((Item_cond*) cond)->functype() == Item_func::COND_AND_FUNC)
{
Item *item;
- /* I'm too lazy to implement proper recursive descent here,
+ /*
+ I', (Sergei) too lazy to implement proper recursive descent here,
and anyway, nobody will use such a stupid queries
that will require it :-)
May be later...
- */
+ */
while ((item=li++))
+ {
if (item->type() == Item::FUNC_ITEM &&
((Item_func *)item)->functype() == Item_func::FT_FUNC)
{
cond_func=(Item_func_match *)item;
break;
}
+ }
}
}
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 2bd6e383eac..1409897a7f2 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -217,7 +217,7 @@ mysql_find_files(THD *thd,List<char> *files, const char *db,const char *path,
table_list.db= (char*) db;
table_list.real_name=file->name;
table_list.grant.privilege=col_access;
- if (check_grant(thd,TABLE_ACLS,&table_list,1))
+ if (check_grant(thd,TABLE_ACLS,&table_list,1,1))
continue;
}
if (files->push_back(thd->strdup(file->name)))
diff --git a/sql/sql_table.cc b/sql/sql_table.cc
index 8dbb9710cda..f8c3aa59d65 100644
--- a/sql/sql_table.cc
+++ b/sql/sql_table.cc
@@ -1128,11 +1128,15 @@ int mysql_alter_table(THD *thd,char *new_db, char *new_name,
{
strmov(new_name_buff,new_name);
fn_same(new_name_buff,table_name,3);
- // Check if name changed
#ifdef FN_LOWER_CASE
- if (!strcmp(db,new_db) && !my_strcasecmp(new_name_buff,table_name))
+ if (lower_case_table_names)
+ casedn_str(new_name);
+ if ((lower_case_table_names &&
+ !my_strcasecmp(new_name_buff,table_name)) ||
+ (!lower_case_table_names &&
+ !strcmp(new_name_buff,table_name)))
#else
- if (!strcmp(db,new_db) && !strcmp(new_name_buff,table_name))
+ if (!strcmp(new_name_buff,table_name)) // Check if name changed
#endif
new_name=table_name; // No. Make later check easier
else