summaryrefslogtreecommitdiff
path: root/sql/ha_federated.cc
diff options
context:
space:
mode:
authorunknown <monty@mysql.com>2005-10-08 03:37:23 +0300
committerunknown <monty@mysql.com>2005-10-08 03:37:23 +0300
commitc2621f3dcb785e5f78734e20dabbd98bff4fd844 (patch)
treeac2ca2aacd05cc4eb1bec0b1f8c909b9d64fa2e6 /sql/ha_federated.cc
parent63e7824fc2cb5fec43cafbc59d17e5cfcc2195b3 (diff)
parentd67485c86c94c689919fd4fdb1990331d07d94c6 (diff)
downloadmariadb-git-c2621f3dcb785e5f78734e20dabbd98bff4fd844.tar.gz
Merge bk-internal.mysql.com:/home/bk/mysql-5.0
into mysql.com:/home/my/mysql-5.0 BUILD/SETUP.sh: Auto merged client/mysql.cc: Auto merged client/mysqldump.c: Auto merged client/mysqltest.c: Auto merged include/my_sys.h: Auto merged mysql-test/r/func_str.result: Auto merged mysql-test/r/information_schema.result: Auto merged mysql-test/r/information_schema_inno.result: Auto merged mysql-test/r/multi_statement.result: Auto merged mysql-test/r/mysqldump.result: Auto merged mysql-test/r/temp_table.result: Auto merged mysql-test/t/func_str.test: Auto merged mysql-test/t/information_schema.test: Auto merged mysql-test/t/information_schema_inno.test: Auto merged mysql-test/t/multi_statement.test: Auto merged mysql-test/t/mysql.test: Auto merged mysql-test/t/temp_table.test: Auto merged sql/ha_federated.cc: Auto merged sql/item.cc: Auto merged sql/item.h: Auto merged sql/item_func.cc: Auto merged sql/opt_range.cc: Auto merged sql/sp_head.cc: Auto merged sql/sql_class.cc: Auto merged sql/sql_table.cc: Auto merged sql/structs.h: Auto merged sql/table.h: Auto merged strings/decimal.c: Auto merged sql/sql_parse.cc: manual merge sql/sql_prepare.cc: manual merge sql/table.cc: manual merge
Diffstat (limited to 'sql/ha_federated.cc')
-rw-r--r--sql/ha_federated.cc79
1 files changed, 26 insertions, 53 deletions
diff --git a/sql/ha_federated.cc b/sql/ha_federated.cc
index 2b2be71cf53..20badb05f09 100644
--- a/sql/ha_federated.cc
+++ b/sql/ha_federated.cc
@@ -480,6 +480,7 @@ static int check_foreign_data_source(
String query(query_buffer, sizeof(query_buffer), &my_charset_bin);
MYSQL *mysql;
DBUG_ENTER("ha_federated::check_foreign_data_source");
+
/* Zero the length, otherwise the string will have misc chars */
query.length(0);
@@ -564,6 +565,7 @@ static int parse_url_error(FEDERATED_SHARE *share, TABLE *table, int error_num)
char buf[FEDERATED_QUERY_BUFFER_SIZE];
int buf_len;
DBUG_ENTER("ha_federated parse_url_error");
+
if (share->scheme)
{
DBUG_PRINT("info",
@@ -572,11 +574,9 @@ static int parse_url_error(FEDERATED_SHARE *share, TABLE *table, int error_num)
my_free((gptr) share->scheme, MYF(0));
share->scheme= 0;
}
- buf_len= (table->s->connect_string.length > (FEDERATED_QUERY_BUFFER_SIZE - 1))
- ? FEDERATED_QUERY_BUFFER_SIZE - 1 : table->s->connect_string.length;
-
- strnmov(buf, table->s->connect_string.str, buf_len);
- buf[buf_len]= '\0';
+ buf_len= min(table->s->connect_string.length,
+ FEDERATED_QUERY_BUFFER_SIZE-1);
+ strmake(buf, table->s->connect_string.str, buf_len);
my_error(error_num, MYF(0), buf);
DBUG_RETURN(error_num);
}
@@ -767,12 +767,9 @@ uint ha_federated::convert_row_to_internal_format(byte *record, MYSQL_ROW row)
{
ulong *lengths;
Field **field;
-
DBUG_ENTER("ha_federated::convert_row_to_internal_format");
- // num_fields= mysql_num_fields(stored_result);
lengths= mysql_fetch_lengths(stored_result);
-
memset(record, 0, table->s->null_bytes);
for (field= table->field; *field; field++)
@@ -1127,8 +1124,8 @@ bool ha_federated::create_where_from_key(String *to,
char tmpbuff[FEDERATED_QUERY_BUFFER_SIZE];
String tmp(tmpbuff, sizeof(tmpbuff), system_charset_info);
const key_range *ranges[2]= { start_key, end_key };
-
DBUG_ENTER("ha_federated::create_where_from_key");
+
tmp.length(0);
if (start_key == NULL && end_key == NULL)
DBUG_RETURN(1);
@@ -1334,7 +1331,6 @@ static FEDERATED_SHARE *get_share(const char *table_name, TABLE *table)
query.append(FEDERATED_FROM);
query.append(FEDERATED_BTICK);
-
if (!(share= (FEDERATED_SHARE *)
my_multi_malloc(MYF(MY_WME),
&share, sizeof(*share),
@@ -1389,8 +1385,8 @@ error:
static int free_share(FEDERATED_SHARE *share)
{
DBUG_ENTER("free_share");
- pthread_mutex_lock(&federated_mutex);
+ pthread_mutex_lock(&federated_mutex);
if (!--share->use_count)
{
hash_delete(&federated_open_tables, (byte*) share);
@@ -1581,7 +1577,6 @@ int ha_federated::write_row(byte *buf)
values_string.length(0);
insert_string.length(0);
insert_field_value_string.length(0);
-
DBUG_ENTER("ha_federated::write_row");
DBUG_PRINT("info",
("table charset name %s csname %s",
@@ -1708,7 +1703,6 @@ int ha_federated::optimize(THD* thd, HA_CHECK_OPT* check_opt)
{
char query_buffer[STRING_BUFFER_USUAL_SIZE];
String query(query_buffer, sizeof(query_buffer), &my_charset_bin);
-
DBUG_ENTER("ha_federated::optimize");
query.length(0);
@@ -1732,7 +1726,6 @@ int ha_federated::repair(THD* thd, HA_CHECK_OPT* check_opt)
{
char query_buffer[STRING_BUFFER_USUAL_SIZE];
String query(query_buffer, sizeof(query_buffer), &my_charset_bin);
-
DBUG_ENTER("ha_federated::repair");
query.length(0);
@@ -1778,14 +1771,16 @@ int ha_federated::repair(THD* thd, HA_CHECK_OPT* check_opt)
int ha_federated::update_row(const byte *old_data, byte *new_data)
{
/*
- This used to control how the query was built. If there was a primary key,
- the query would be built such that there was a where clause with only
- that column as the condition. This is flawed, because if we have a multi-part
- primary key, it would only use the first part! We don't need to do this anyway,
- because read_range_first will retrieve the correct record, which is what is used
- to build the WHERE clause. We can however use this to append a LIMIT to the end
- if there is NOT a primary key. Why do this? Because we only are updating one
- record, and LIMIT enforces this.
+ This used to control how the query was built. If there was a
+ primary key, the query would be built such that there was a where
+ clause with only that column as the condition. This is flawed,
+ because if we have a multi-part primary key, it would only use the
+ first part! We don't need to do this anyway, because
+ read_range_first will retrieve the correct record, which is what
+ is used to build the WHERE clause. We can however use this to
+ append a LIMIT to the end if there is NOT a primary key. Why do
+ this? Because we only are updating one record, and LIMIT enforces
+ this.
*/
bool has_a_primary_key= (table->s->primary_key == 0 ? TRUE : FALSE);
/*
@@ -1812,7 +1807,6 @@ int ha_federated::update_row(const byte *old_data, byte *new_data)
String where_string(where_buffer,
sizeof(where_buffer),
&my_charset_bin);
-
DBUG_ENTER("ha_federated::update_row");
/*
set string lengths to 0 to avoid misc chars in string
@@ -2007,12 +2001,10 @@ int ha_federated::index_read_idx(byte *buf, uint index, const byte *key,
sizeof(sql_query_buffer),
&my_charset_bin);
key_range range;
+ DBUG_ENTER("ha_federated::index_read_idx");
index_string.length(0);
sql_query.length(0);
-
- DBUG_ENTER("ha_federated::index_read_idx");
-
statistic_increment(table->in_use->status_var.ha_read_key_count,
&LOCK_status);
@@ -2101,8 +2093,8 @@ int ha_federated::read_range_first(const key_range *start_key,
String sql_query(sql_query_buffer,
sizeof(sql_query_buffer),
&my_charset_bin);
-
DBUG_ENTER("ha_federated::read_range_first");
+
if (start_key == NULL && end_key == NULL)
DBUG_RETURN(0);
@@ -2417,7 +2409,6 @@ void ha_federated::info(uint flag)
MYSQL_RES *result= 0;
MYSQL_ROW row;
String status_query_string(status_buf, sizeof(status_buf), &my_charset_bin);
-
DBUG_ENTER("ha_federated::info");
error_code= ER_QUERY_ON_FOREIGN_DATA_SOURCE;
@@ -2508,10 +2499,10 @@ error:
int ha_federated::delete_all_rows()
{
- DBUG_ENTER("ha_federated::delete_all_rows");
-
char query_buffer[FEDERATED_QUERY_BUFFER_SIZE];
String query(query_buffer, sizeof(query_buffer), &my_charset_bin);
+ DBUG_ENTER("ha_federated::delete_all_rows");
+
query.length(0);
query.set_charset(system_charset_info);
@@ -2606,32 +2597,14 @@ THR_LOCK_DATA **ha_federated::store_lock(THD *thd,
int ha_federated::create(const char *name, TABLE *table_arg,
HA_CREATE_INFO *create_info)
{
- int retval= 0;
- /*
- only a temporary share, to test the url
- */
- FEDERATED_SHARE tmp_share;
+ int retval;
+ FEDERATED_SHARE tmp_share; // Only a temporary share, to test the url
DBUG_ENTER("ha_federated::create");
- if ((retval= parse_url(&tmp_share, table_arg, 1)))
- goto error;
+ if (!(retval= parse_url(&tmp_share, table_arg, 1)))
+ retval= check_foreign_data_source(&tmp_share, 1);
- if ((retval= check_foreign_data_source(&tmp_share, 1)))
- goto error;
-
- if (tmp_share.scheme)
- {
- my_free((gptr) tmp_share.scheme, MYF(0));
- tmp_share.scheme= 0;
- }
- DBUG_RETURN(retval);
-
-error:
- if (tmp_share.scheme)
- {
- my_free((gptr) tmp_share.scheme, MYF(0));
- tmp_share.scheme= 0;
- }
+ my_free((gptr) tmp_share.scheme, MYF(MY_ALLOW_ZERO_PTR));
DBUG_RETURN(retval);
}