summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authormonty@mashka.mysql.fi <>2003-06-27 16:29:10 +0300
committermonty@mashka.mysql.fi <>2003-06-27 16:29:10 +0300
commitdfac0fc90acf8ba544b0ca6724bbd5992e8d1568 (patch)
tree6b5d59568d6e947e831d51f3d5d09a4a0d8328d6 /sql
parentfff60e3a86a7f5a02dbf273464e1ccc2d40c94fe (diff)
downloadmariadb-git-dfac0fc90acf8ba544b0ca6724bbd5992e8d1568.tar.gz
Allow one to use MERGE tables with tables from different databases
Added command 'replace_column' to mysqltest
Diffstat (limited to 'sql')
-rw-r--r--sql/ha_myisammrg.cc91
-rw-r--r--sql/mysql_priv.h2
-rw-r--r--sql/sql_parse.cc6
-rw-r--r--sql/sql_show.cc52
4 files changed, 93 insertions, 58 deletions
diff --git a/sql/ha_myisammrg.cc b/sql/ha_myisammrg.cc
index 5f07bbc4140..a0449e83222 100644
--- a/sql/ha_myisammrg.cc
+++ b/sql/ha_myisammrg.cc
@@ -303,14 +303,40 @@ THR_LOCK_DATA **ha_myisammrg::store_lock(THD *thd,
return to;
}
+
+/* Find out database name and table name from a filename */
+
+static void split_file_name(const char *file_name,
+ LEX_STRING *db, LEX_STRING *name)
+{
+ uint name_length, dir_length, prefix_length;
+ char buff[FN_REFLEN];
+
+ db->length= 0;
+ name_length= (uint) (strmake(buff, file_name, sizeof(buff)-1) - buff);
+ dir_length= dirname_length(buff);
+ if (dir_length > 1)
+ {
+ /* Get database */
+ buff[dir_length-1]= 0; // Remove end '/'
+ prefix_length= dirname_length(buff);
+ db->str= (char*) file_name+ prefix_length;
+ db->length= dir_length - prefix_length -1;
+ }
+ name->str= (char*) file_name+ dir_length;
+ name->length= (uint) (fn_ext(name->str) - name->str);
+}
+
+
void ha_myisammrg::update_create_info(HA_CREATE_INFO *create_info)
{
- // [phi] auto_increment stuff is missing (but currently not needed)
DBUG_ENTER("ha_myisammrg::update_create_info");
+
if (!(create_info->used_fields & HA_CREATE_USED_UNION))
{
MYRG_TABLE *open_table;
THD *thd=current_thd;
+
create_info->merge_list.next= &create_info->merge_list.first;
create_info->merge_list.elements=0;
@@ -318,14 +344,17 @@ void ha_myisammrg::update_create_info(HA_CREATE_INFO *create_info)
open_table != file->end_table ;
open_table++)
{
- char *name=open_table->table->filename;
- char buff[FN_REFLEN];
TABLE_LIST *ptr;
+ LEX_STRING db, name;
+
if (!(ptr = (TABLE_LIST *) thd->calloc(sizeof(TABLE_LIST))))
goto err;
- fn_format(buff,name,"","",3);
- if (!(ptr->real_name=thd->strdup(buff)))
+ split_file_name(open_table->table->filename, &db, &name);
+ if (!(ptr->real_name= thd->strmake(name.str, name.length)))
+ goto err;
+ if (db.length && !(ptr->db= thd->strmake(db.str, db.length)))
goto err;
+
create_info->merge_list.elements++;
(*create_info->merge_list.next) = (byte*) ptr;
create_info->merge_list.next= (byte**) &ptr->next;
@@ -344,37 +373,34 @@ err:
DBUG_VOID_RETURN;
}
+
int ha_myisammrg::create(const char *name, register TABLE *form,
HA_CREATE_INFO *create_info)
{
char buff[FN_REFLEN],**table_names,**pos;
TABLE_LIST *tables= (TABLE_LIST*) create_info->merge_list.first;
+ THD *thd= current_thd;
DBUG_ENTER("ha_myisammrg::create");
- if (!(table_names= (char**) sql_alloc((create_info->merge_list.elements+1)*
- sizeof(char*))))
+ if (!(table_names= (char**) thd->alloc((create_info->merge_list.elements+1)*
+ sizeof(char*))))
DBUG_RETURN(1);
for (pos=table_names ; tables ; tables=tables->next)
{
char *table_name;
+ TABLE **tbl= 0;
if (create_info->options & HA_LEX_CREATE_TMP_TABLE)
+ tbl= find_temporary_table(thd, tables->db, tables->real_name);
+ if (!tbl)
{
- TABLE **tbl=find_temporary_table(current_thd,
- tables->db, tables->real_name);
- if (!tbl)
- {
- table_name=sql_alloc(1+
- my_snprintf(buff,FN_REFLEN,"%s/%s/%s",mysql_real_data_home,
- tables->db, tables->real_name));
- if (!table_name)
- DBUG_RETURN(1);
- strcpy(table_name, buff);
- }
- else
- table_name=(*tbl)->path;
+ uint length= my_snprintf(buff,FN_REFLEN,"%s%s/%s",
+ mysql_real_data_home,
+ tables->db, tables->real_name);
+ if (!(table_name= thd->strmake(buff, length)))
+ DBUG_RETURN(1);
}
else
- table_name=tables->real_name;
+ table_name=(*tbl)->path;
*pos++= table_name;
}
*pos=0;
@@ -384,9 +410,13 @@ int ha_myisammrg::create(const char *name, register TABLE *form,
(my_bool) 0));
}
+
void ha_myisammrg::append_create_info(String *packet)
{
- char buff[FN_REFLEN];
+ const char *current_db;
+ uint db_length;
+ THD *thd= current_thd;
+
if (file->merge_insert_method != MERGE_INSERT_DISABLED)
{
packet->append(" INSERT_METHOD=",15);
@@ -395,15 +425,26 @@ void ha_myisammrg::append_create_info(String *packet)
packet->append(" UNION=(",8);
MYRG_TABLE *open_table,*first;
+ current_db= table->table_cache_key;
+ db_length= strlen(current_db);
+
for (first=open_table=file->open_tables ;
open_table != file->end_table ;
open_table++)
{
- char *name= open_table->table->filename;
- fn_format(buff,name,"","",3);
+ LEX_STRING db, name;
+ split_file_name(open_table->table->filename, &db, &name);
if (open_table != first)
packet->append(',');
- packet->append(buff,(uint) strlen(buff));
+ /* Report database for mapped table if it isn't in current database */
+ if (db.length &&
+ (db_length != db.length ||
+ strncmp(current_db, db.str, db.length)))
+ {
+ append_identifier(thd, packet, db.str, db.length);
+ packet->append('.');
+ }
+ append_identifier(thd, packet, name.str, name.length);
}
packet->append(')');
}
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index aca84f1bcb3..5ad2cc56b8c 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -532,6 +532,8 @@ int mysqld_show_fields(THD *thd,TABLE_LIST *table, const char *wild,
bool verbose);
int mysqld_show_keys(THD *thd, TABLE_LIST *table);
int mysqld_show_logs(THD *thd);
+void append_identifier(THD *thd, String *packet, const char *name,
+ uint length);
void mysqld_list_fields(THD *thd,TABLE_LIST *table, const char *wild);
int mysqld_dump_create_info(THD *thd, TABLE *table, int fd = -1);
int mysqld_show_create(THD *thd, TABLE_LIST *table_list);
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 5070466007e..3428b9805a0 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -3388,11 +3388,6 @@ static bool check_merge_table_access(THD *thd, char *db,
{
if (!tmp->db || !tmp->db[0])
tmp->db=db;
- else if (strcmp(tmp->db,db))
- {
- send_error(thd,ER_UNION_TABLES_IN_DIFFERENT_DIR);
- return 1;
- }
}
error=check_table_access(thd, SELECT_ACL | UPDATE_ACL | DELETE_ACL,
table_list);
@@ -4425,6 +4420,7 @@ static bool append_file_to_dir(THD *thd, char **filename_ptr, char *table_name)
return 0;
}
+
/*
Check if the select is a simple select (not an union)
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index 1c4954e0276..fae01936357 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -27,8 +27,6 @@
#include "ha_berkeley.h" // For berkeley_show_logs
#endif
-/* extern "C" pthread_mutex_t THR_LOCK_keycache; */
-
static const char *grant_names[]={
"select","insert","update","delete","create","drop","reload","shutdown",
"process","file","grant","references","index","alter"};
@@ -43,15 +41,11 @@ static int mysql_find_files(THD *thd,List<char> *files, const char *db,
static int
store_create_info(THD *thd, TABLE *table, String *packet);
-static void
-append_identifier(THD *thd, String *packet, const char *name);
-
-extern struct st_VioSSLAcceptorFd * ssl_acceptor_fd;
-/****************************************************************************
-** Send list of databases
-** A database is a directory in the mysql_data_home directory
-****************************************************************************/
+/*
+ Report list of databases
+ A database is a directory in the mysql_data_home directory
+*/
int
mysqld_show_dbs(THD *thd,const char *wild)
@@ -1002,8 +996,8 @@ mysqld_dump_create_info(THD *thd, TABLE *table, int fd)
}
-static void
-append_identifier(THD *thd, String *packet, const char *name)
+void
+append_identifier(THD *thd, String *packet, const char *name, uint length)
{
char qtype;
if (thd->variables.sql_mode & MODE_ANSI_QUOTES)
@@ -1014,12 +1008,12 @@ append_identifier(THD *thd, String *packet, const char *name)
if (thd->options & OPTION_QUOTE_SHOW_CREATE)
{
packet->append(&qtype, 1);
- packet->append(name, 0, system_charset_info);
+ packet->append(name, length, system_charset_info);
packet->append(&qtype, 1);
}
else
{
- packet->append(name, 0, system_charset_info);
+ packet->append(name, length, system_charset_info);
}
}
@@ -1050,7 +1044,7 @@ store_create_info(THD *thd, TABLE *table, String *packet)
packet->append("CREATE TEMPORARY TABLE ", 23);
else
packet->append("CREATE TABLE ", 13);
- append_identifier(thd,packet,table->real_name);
+ append_identifier(thd,packet, table->real_name, strlen(table->real_name));
packet->append(" (\n", 3);
Field **ptr,*field;
@@ -1061,7 +1055,7 @@ store_create_info(THD *thd, TABLE *table, String *packet)
uint flags = field->flags;
packet->append(" ", 2);
- append_identifier(thd,packet,field->field_name);
+ append_identifier(thd,packet,field->field_name, strlen(field->field_name));
packet->append(' ');
// check for surprises from the previous call to Field::sql_type()
if (type.ptr() != tmp)
@@ -1152,7 +1146,7 @@ store_create_info(THD *thd, TABLE *table, String *packet)
packet->append("KEY ", 4);
if (!found_primary)
- append_identifier(thd, packet, key_info->name);
+ append_identifier(thd, packet, key_info->name, strlen(key_info->name));
if (!(thd->variables.sql_mode & MODE_NO_KEY_OPTIONS) &&
!limited_mysql_mode && !foreign_db_mode)
@@ -1174,7 +1168,8 @@ store_create_info(THD *thd, TABLE *table, String *packet)
packet->append(',');
if (key_part->field)
- append_identifier(thd,packet,key_part->field->field_name);
+ append_identifier(thd,packet,key_part->field->field_name,
+ strlen(key_part->field->field_name));
if (!key_part->field ||
(key_part->length !=
table->field[key_part->fieldnr-1]->key_length() &&
@@ -1190,17 +1185,17 @@ store_create_info(THD *thd, TABLE *table, String *packet)
packet->append(')');
}
+ /*
+ Get possible foreign key definitions stored in InnoDB and append them
+ to the CREATE TABLE statement
+ */
handler *file = table->file;
+ char* for_str= file->get_foreign_key_create_info();
- /* Get possible foreign key definitions stored in InnoDB and append them
- to the CREATE TABLE statement */
-
- char* for_str = file->get_foreign_key_create_info();
-
- if (for_str) {
- packet->append(for_str, strlen(for_str));
-
- file->free_foreign_key_create_info(for_str);
+ if (for_str)
+ {
+ packet->append(for_str, strlen(for_str));
+ file->free_foreign_key_create_info(for_str);
}
packet->append("\n)", 2);
@@ -1267,7 +1262,8 @@ store_create_info(THD *thd, TABLE *table, String *packet)
{
char buff[100];
sprintf(buff," RAID_TYPE=%s RAID_CHUNKS=%d RAID_CHUNKSIZE=%ld",
- my_raid_type(file->raid_type), file->raid_chunks, file->raid_chunksize/RAID_BLOCK_SIZE);
+ my_raid_type(file->raid_type), file->raid_chunks,
+ file->raid_chunksize/RAID_BLOCK_SIZE);
packet->append(buff);
}
}