summaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authormonty@donna.mysql.fi <>2001-03-03 03:03:12 +0200
committermonty@donna.mysql.fi <>2001-03-03 03:03:12 +0200
commit5ccbbd83f29b1057cfbe869259c4cb009b89a9d2 (patch)
treecd2f65141c35a1998982970704a3f854a987c568 /sql
parentf2d31048eb843d0209bfe4f6e2e2e0b3a57cc6f4 (diff)
downloadmariadb-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.cc44
-rw-r--r--sql/filesort.cc3
-rw-r--r--sql/ha_berkeley.cc22
-rw-r--r--sql/mysqld.cc14
-rw-r--r--sql/share/swedish/errmsg.OLD1
-rw-r--r--sql/share/swedish/errmsg.txt2
-rw-r--r--sql/sql_base.cc5
-rw-r--r--sql/sql_delete.cc6
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)
{