diff options
author | monty@donna.mysql.fi <> | 2001-03-03 03:03:12 +0200 |
---|---|---|
committer | monty@donna.mysql.fi <> | 2001-03-03 03:03:12 +0200 |
commit | 5ccbbd83f29b1057cfbe869259c4cb009b89a9d2 (patch) | |
tree | cd2f65141c35a1998982970704a3f854a987c568 /sql | |
parent | f2d31048eb843d0209bfe4f6e2e2e0b3a57cc6f4 (diff) | |
download | mariadb-git-5ccbbd83f29b1057cfbe869259c4cb009b89a9d2.tar.gz |
Fixes for innobase usage
Fixed bug when using TEXT columns with BDB tables
Allow LOAD DATA INFILE to use numbers with ENUM and SET columns
Diffstat (limited to 'sql')
-rw-r--r-- | sql/field.cc | 44 | ||||
-rw-r--r-- | sql/filesort.cc | 3 | ||||
-rw-r--r-- | sql/ha_berkeley.cc | 22 | ||||
-rw-r--r-- | sql/mysqld.cc | 14 | ||||
-rw-r--r-- | sql/share/swedish/errmsg.OLD | 1 | ||||
-rw-r--r-- | sql/share/swedish/errmsg.txt | 2 | ||||
-rw-r--r-- | sql/sql_base.cc | 5 | ||||
-rw-r--r-- | sql/sql_delete.cc | 6 |
8 files changed, 72 insertions, 25 deletions
diff --git a/sql/field.cc b/sql/field.cc index a5eca021695..782b35c5941 100644 --- a/sql/field.cc +++ b/sql/field.cc @@ -4254,15 +4254,30 @@ uint find_enum(TYPELIB *lib,const char *x, uint length) void Field_enum::store(const char *from,uint length) { uint tmp=find_enum(typelib,from,length); + if (!tmp) { - if (!tmp) + if (length < 6) // Can't be more than 99999 enums { - current_thd->cuted_fields++; - Field_enum::store_type((longlong) 0); + /* This is for reading numbers with LOAD DATA INFILE */ + char buff[7], *end; + const char *conv=from; + if (from[length]) + { + strmake(buff, from, length); + conv=buff; + } + my_errno=0; + tmp=strtoul(conv,&end,10); + if (my_errno || end != conv+length || tmp > typelib->count) + { + tmp=0; + current_thd->cuted_fields++; + } } else - store_type((ulonglong) tmp); + current_thd->cuted_fields++; } + store_type((ulonglong) tmp); } @@ -4430,7 +4445,26 @@ ulonglong find_set(TYPELIB *lib,const char *x,uint length) void Field_set::store(const char *from,uint length) { - store_type(find_set(typelib,from,length)); + ulonglong tmp=find_set(typelib,from,length); + if (!tmp && length && length < 22) + { + /* This is for reading numbers with LOAD DATA INFILE */ + char buff[22], *end; + const char *conv=from; + if (from[length]) + { + strmake(buff, from, length); + conv=buff; + } + my_errno=0; + tmp=strtoull(conv,&end,10); + if (my_errno || end != conv+length || + tmp > (ulonglong) (((longlong) 1 << typelib->count) - (longlong) 1)) + tmp=0; + else + current_thd->cuted_fields--; // Remove warning from find_set + } + store_type(tmp); } diff --git a/sql/filesort.cc b/sql/filesort.cc index 4a981040968..e116e2b68e6 100644 --- a/sql/filesort.cc +++ b/sql/filesort.cc @@ -137,7 +137,8 @@ ha_rows filesort(TABLE **table, SORT_FIELD *sortorder, uint s_length, #ifdef CAN_TRUST_RANGE else if (select && select->quick && select->quick->records > 0L) { - VOID(ha_info(&table[0]->form,0)); /* Get record-count */ + /* Get record-count */ + table[0]->file->info(HA_STATUS_VARIABLE | HA_STATUS_NO_LOCK); records=min((ha_rows) (select->quick->records*2+EXTRA_RECORDS*2), table[0]->file->records)+EXTRA_RECORDS; selected_records_file=0; diff --git a/sql/ha_berkeley.cc b/sql/ha_berkeley.cc index 9a6df95193a..ea9f492a9c8 100644 --- a/sql/ha_berkeley.cc +++ b/sql/ha_berkeley.cc @@ -21,7 +21,7 @@ - Don't automaticly pack all string keys (To do this we need to modify CREATE TABLE so that one can use the pack_keys argument per key). - An argument to pack_key that we don't want compression. - - DB_DBT_USERMEN should be used for fixed length tables + - DB_DBT_USERMEM should be used for fixed length tables We will need an updated Berkeley DB version for this. - Killing threads that has got a 'deadlock' - SHOW TABLE STATUS should give more information about the table. @@ -585,6 +585,7 @@ int ha_berkeley::close(void) my_free(rec_buff,MYF(MY_ALLOW_ZERO_PTR)); my_free(alloc_ptr,MYF(MY_ALLOW_ZERO_PTR)); + ha_berkeley::extra(HA_EXTRA_RESET); // current_row buffer DBUG_RETURN(free_share(share,table, hidden_primary_key,0)); } @@ -1587,6 +1588,15 @@ int ha_berkeley::extra(enum ha_extra_function operation) case HA_EXTRA_RESET_STATE: key_read=0; using_ignore=0; + if (current_row.flags & (DB_DBT_MALLOC | DB_DBT_REALLOC)) + { + current_row.flags=0; + if (current_row.data) + { + free(current_row.data); + current_row.data=0; + } + } break; case HA_EXTRA_KEYREAD: key_read=1; // Query satisfied with key @@ -1662,17 +1672,7 @@ int ha_berkeley::external_lock(THD *thd, int lock_type) else { lock.type=TL_UNLOCK; // Unlocked - if (current_row.flags & (DB_DBT_MALLOC | DB_DBT_REALLOC)) - { - current_row.flags=0; - if (current_row.data) - { - free(current_row.data); - current_row.data=0; - } - } thread_safe_add(share->rows, changed_rows, &share->mutex); - current_row.data=0; if (!--thd->transaction.bdb_lock_count) { if (thd->transaction.stmt.bdb_tid) diff --git a/sql/mysqld.cc b/sql/mysqld.cc index a34cebcc9dd..9798783c9f6 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -2458,11 +2458,13 @@ static struct option long_options[] = { {"enable-locking", no_argument, 0, (int) OPT_ENABLE_LOCK}, {"exit-info", optional_argument, 0, 'T'}, {"flush", no_argument, 0, (int) OPT_FLUSH}, + /* We must always support this option to make scripts like mysqltest easier + to do */ + {"innobase_data_file_path", required_argument, 0, + OPT_INNOBASE_DATA_FILE_PATH}, #ifdef HAVE_INNOBASE_DB {"innobase_data_home_dir", required_argument, 0, OPT_INNOBASE_DATA_HOME_DIR}, - {"innobase_data_file_path", required_argument, 0, - OPT_INNOBASE_DATA_FILE_PATH}, {"innobase_log_group_home_dir", required_argument, 0, OPT_INNOBASE_LOG_GROUP_HOME_DIR}, {"innobase_log_arch_dir", required_argument, 0, @@ -3489,13 +3491,15 @@ static void get_options(int argc,char **argv) have_innobase=SHOW_OPTION_DISABLED; #endif break; + case OPT_INNOBASE_DATA_FILE_PATH: +#ifdef HAVE_INNOBASE_DB + innobase_data_file_path=optarg; +#endif + break; #ifdef HAVE_INNOBASE_DB case OPT_INNOBASE_DATA_HOME_DIR: innobase_data_home_dir=optarg; break; - case OPT_INNOBASE_DATA_FILE_PATH: - innobase_data_file_path=optarg; - break; case OPT_INNOBASE_LOG_GROUP_HOME_DIR: innobase_log_group_home_dir=optarg; break; diff --git a/sql/share/swedish/errmsg.OLD b/sql/share/swedish/errmsg.OLD index 132a9fdf4f9..672ce97c575 100644 --- a/sql/share/swedish/errmsg.OLD +++ b/sql/share/swedish/errmsg.OLD @@ -205,3 +205,4 @@ "Kunde inte initializera replications-strukturerna. Kontrollera privilegerna för 'master.info'", "Kunde inte starta en tråd för replikering", "Användare '%-.64s' har redan 'max_user_connections' aktiva inloggningar", +"Du kan endast använda konstant-uttryck med SET", diff --git a/sql/share/swedish/errmsg.txt b/sql/share/swedish/errmsg.txt index 7de54d16319..672ce97c575 100644 --- a/sql/share/swedish/errmsg.txt +++ b/sql/share/swedish/errmsg.txt @@ -205,4 +205,4 @@ "Kunde inte initializera replications-strukturerna. Kontrollera privilegerna för 'master.info'", "Kunde inte starta en tråd för replikering", "Användare '%-.64s' har redan 'max_user_connections' aktiva inloggningar", -"You may only use constant expressions with SET", +"Du kan endast använda konstant-uttryck med SET", diff --git a/sql/sql_base.cc b/sql/sql_base.cc index a293064f71e..6b92580b449 100644 --- a/sql/sql_base.cc +++ b/sql/sql_base.cc @@ -446,6 +446,11 @@ void close_thread_tables(THD *thd, bool locked) table->flush_version=flush_version; table->file->extra(HA_EXTRA_FLUSH); } + else + { + // Free memory and reset for next loop + table->file->extra(HA_EXTRA_RESET); + } table->in_use=0; if (unused_tables) { diff --git a/sql/sql_delete.cc b/sql/sql_delete.cc index 707ff814716..e1196341bef 100644 --- a/sql/sql_delete.cc +++ b/sql/sql_delete.cc @@ -18,6 +18,7 @@ /* Delete of records */ #include "mysql_priv.h" +#include "ha_innobase.h" /* Optimize delete of all rows by doing a full generate of the table @@ -142,9 +143,10 @@ int mysql_delete(THD *thd,TABLE_LIST *table_list,COND *conds,ha_rows limit, (SPECIAL_NO_NEW_FUNC | SPECIAL_SAFE_MODE)) && !(thd->options & (OPTION_NOT_AUTO_COMMIT | OPTION_BEGIN))); - /* We need to add code to not generate table based on the table type */ #ifdef HAVE_INNOBASE_DB - use_generate_table=0; + /* We need to add code to not generate table based on the table type */ + if (!innobase_skip) + use_generate_table=0; // Innobase can't use re-generate table #endif if (use_generate_table && ! thd->open_tables) { |