summaryrefslogtreecommitdiff
path: root/sql/ha_ndbcluster.cc
diff options
context:
space:
mode:
authorunknown <magnus@neptunus.(none)>2004-05-13 11:56:45 +0200
committerunknown <magnus@neptunus.(none)>2004-05-13 11:56:45 +0200
commitd4399619bde4b03b433f312a7a220b4b9d543bf5 (patch)
treece8310eb64adcdac83e99a34e4fc79bee0fbe200 /sql/ha_ndbcluster.cc
parent3cf87a5b5703a0fbc3566b7f0e530e6fb1523f47 (diff)
downloadmariadb-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.cc74
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);
}