diff options
author | unknown <magnus@neptunus.(none)> | 2004-05-13 11:56:45 +0200 |
---|---|---|
committer | unknown <magnus@neptunus.(none)> | 2004-05-13 11:56:45 +0200 |
commit | d4399619bde4b03b433f312a7a220b4b9d543bf5 (patch) | |
tree | ce8310eb64adcdac83e99a34e4fc79bee0fbe200 /sql/ha_ndbcluster.cc | |
parent | 3cf87a5b5703a0fbc3566b7f0e530e6fb1523f47 (diff) | |
download | mariadb-git-d4399619bde4b03b433f312a7a220b4b9d543bf5.tar.gz |
WL #1729 Handler: error text for NDB errors
- New solution after discussions with Sergei, no handler specific code or error messages should be in sql layer.
next_result, only check for error if check is -1
Improved index_read
include/mysqld_error.h:
New error codes ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG, update number to 298.
Removed prevoius ER_NDB_ERROR, handler specific error should not be here.
sql/ha_ndbcluster.cc:
Removed print_error from ha_ndbcluster, added code to handler::print_error to ask handler::get_error_message for message for an error.
Fix bug in next_result, only check for error if -1 is returned.
Make index_read easier, special case where pk_read or unique_index_read is detected and as default do ordered_index_scan
sql/ha_ndbcluster.h:
Remplace print_error with get_error_message
sql/handler.cc:
Add new function get_error_message usedc to ask handler for a message for an error.
Call get_error_message from print_error if error code is not known.
sql/handler.h:
Add new function get_error_message
sql/share/czech/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/danish/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/dutch/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/english/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/estonian/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/french/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/german/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/greek/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/hungarian/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/italian/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/korean/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/norwegian-ny/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/norwegian/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/polish/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/portuguese/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/romanian/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/russian/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/serbian/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/slovak/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/spanish/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/swedish/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
sql/share/ukrainian/errmsg.txt:
Error message for ER_GET_ERRMSG and ER_GET_TEMPORARY_ERRMSG
Diffstat (limited to 'sql/ha_ndbcluster.cc')
-rw-r--r-- | sql/ha_ndbcluster.cc | 74 |
1 files changed, 43 insertions, 31 deletions
diff --git a/sql/ha_ndbcluster.cc b/sql/ha_ndbcluster.cc index 5ef47e084c1..903e04754de 100644 --- a/sql/ha_ndbcluster.cc +++ b/sql/ha_ndbcluster.cc @@ -41,6 +41,14 @@ static const int parallelism= 240; #define NDB_HIDDEN_PRIMARY_KEY_LENGTH 8 + +/* + All error messages returned from ha_ndbcluster that are + not mapped to the corresponding handler(HA_ERR_*) error code + have NDB_ERR_CODE_OFFSET added to it so that it does not clash with + the handler error codes. The error number is then "restored" + to the original error number when get_error_message is called. +*/ #define NDB_ERR_CODE_OFFSET 30000 #define ERR_PRINT(err) \ @@ -161,27 +169,28 @@ int ha_ndbcluster::ndb_err(NdbConnection *trans) /* - Override the default print_error in order to add the + Override the default get_error_message in order to add the error message of NDB */ -void ha_ndbcluster::print_error(int error, myf errflag) +const char* ha_ndbcluster::get_error_message(int *org_error, + bool *temporary) { - DBUG_ENTER("ha_ndbcluster::print_error"); - DBUG_PRINT("enter", ("error: %d, errflag: %d", error, errflag)); + DBUG_ENTER("ha_ndbcluster::get_error_message"); + DBUG_PRINT("enter", ("error: %d", *org_error)); - if (error >= NDB_ERR_CODE_OFFSET) - { - error-= NDB_ERR_CODE_OFFSET; - const NdbError err= g_ndb->getNdbError(error); - int textno= (err.status==NdbError::TemporaryError) ? - ER_NDB_TEMPORARY_ERROR : ER_NDB_ERROR; - my_error(textno,MYF(0),error,err.message); - DBUG_VOID_RETURN; - } - - handler::print_error(error, errflag); - DBUG_VOID_RETURN; + int error= *org_error; + if (error < NDB_ERR_CODE_OFFSET) + DBUG_RETURN(NULL); + + error-= NDB_ERR_CODE_OFFSET; + DBUG_ASSERT(m_ndb); // What should be done if not m_ndb is available? + const NdbError err= m_ndb->getNdbError(error); + *temporary= (err.status==NdbError::TemporaryError); + + *org_error= error; + DBUG_PRINT("exit", ("error: %d, msg: %s", error, err.message)); + DBUG_RETURN(err.message); } @@ -756,8 +765,8 @@ inline int ha_ndbcluster::next_result(byte *buf) } while (check == 2); table->status= STATUS_NOT_FOUND; - if (ndb_err(trans)) - ERR_RETURN(trans->getNdbError()); + if (check == -1) + DBUG_RETURN(ndb_err(trans)); // No more records DBUG_PRINT("info", ("No more records")); @@ -1499,28 +1508,26 @@ int ha_ndbcluster::index_read(byte *buf, switch (get_index_type(active_index)){ case PRIMARY_KEY_INDEX: -#ifdef USE_EXTRA_ORDERED_INDEX key_info= table->key_info + active_index; - if (key_len < key_info->key_length || - find_flag != HA_READ_KEY_EXACT) + if (key_len == key_info->key_length && + find_flag == HA_READ_KEY_EXACT) + error= pk_read(key, key_len, buf); + else { key_range start_key; start_key.key= key; start_key.length= key_len; start_key.flag= find_flag; - error= ordered_index_scan(&start_key, 0, false, buf); - break; - + error= ordered_index_scan(&start_key, 0, false, buf); } -#endif - error= pk_read(key, key_len, buf); break; case UNIQUE_INDEX: -#ifdef USE_EXTRA_ORDERED_INDEX key_info= table->key_info + active_index; - if (key_len < key_info->key_length || - find_flag != HA_READ_KEY_EXACT) + if (key_len == key_info->key_length && + find_flag == HA_READ_KEY_EXACT) + error= unique_index_read(key, key_len, buf); + else { key_range start_key; start_key.key= key; @@ -1529,8 +1536,6 @@ int ha_ndbcluster::index_read(byte *buf, error= ordered_index_scan(&start_key, 0, false, buf); break; } -#endif - error= unique_index_read(key, key_len, buf); break; case ORDERED_INDEX: @@ -3105,6 +3110,13 @@ ha_ndbcluster::records_in_range(int inx, I.e. the ordered index are used instead of the hash indexes for these queries. */ + NDB_INDEX_TYPE idx_type= get_index_type(inx); + if ((idx_type == UNIQUE_INDEX || idx_type == PRIMARY_KEY_INDEX) && + start_key_len == key_length) + { + // this is a "const" table which returns only one record! + records= 1; + } #endif DBUG_RETURN(records); } |