Commit efdfda46 authored by unknown's avatar unknown

Merge mskold@bk-internal.mysql.com:/home/bk/mysql-5.0-ndb

into mysql.com:/usr/local/home/marty/MySQL/test/mysql-5.0-ndb


sql/handler.h:
  Auto merged
parents b744f5fb a0f6d69b
...@@ -811,7 +811,7 @@ sub find ...@@ -811,7 +811,7 @@ sub find
sub rm_all sub rm_all
{ {
my(@rm_files)=@_; my(@rm_files)=@_;
my($dir,$current_dir,@files,@dirs); my($dir,$current_dir,@files,@dirs,$removed);
$current_dir = `pwd`; chomp($current_dir); $current_dir = `pwd`; chomp($current_dir);
foreach $dir (@rm_files) foreach $dir (@rm_files)
...@@ -835,7 +835,9 @@ sub rm_all ...@@ -835,7 +835,9 @@ sub rm_all
} }
if ($#files >= 0) if ($#files >= 0)
{ {
system("rm -f " . join(" ",@files)) && abort("Can't remove files from $dir"); $removed= unlink @files;
print "rm_all : removed $removed files in $current_dir/$dir\n" if ($opt_debug);
abort("Can't remove all $#files+1 from $current_dir/$dir, just $removed") if $removed != $#files+1;
} }
foreach $dir (@dirs) foreach $dir (@dirs)
{ {
......
...@@ -637,7 +637,7 @@ extern int pthread_dummy(int); ...@@ -637,7 +637,7 @@ extern int pthread_dummy(int);
MySQL can survive with 32K, but some glibc libraries require > 128K stack MySQL can survive with 32K, but some glibc libraries require > 128K stack
To resolve hostnames To resolve hostnames
*/ */
#define DEFAULT_THREAD_STACK (192*1024L) #define DEFAULT_THREAD_STACK (256*1024L)
#else #else
#define DEFAULT_THREAD_STACK (192*1024) #define DEFAULT_THREAD_STACK (192*1024)
#endif #endif
......
...@@ -2388,3 +2388,16 @@ WART 0100 1 ...@@ -2388,3 +2388,16 @@ WART 0100 1
WART 0200 1 WART 0200 1
WART 0300 3 WART 0300 3
DROP TABLE t1; DROP TABLE t1;
CREATE TABLE t1 ( a BLOB, INDEX (a(20)) );
CREATE TABLE t2 ( a BLOB, INDEX (a(20)) );
INSERT INTO t1 VALUES ('one'),('two'),('three'),('four'),('five');
INSERT INTO t2 VALUES ('one'),('two'),('three'),('four'),('five');
EXPLAIN SELECT * FROM t1 LEFT JOIN t2 USE INDEX (a) ON t1.a=t2.a;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 5
1 SIMPLE t2 ref a a 23 test.t1.a 2
EXPLAIN SELECT * FROM t1 LEFT JOIN t2 FORCE INDEX (a) ON t1.a=t2.a;
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE t1 ALL NULL NULL NULL NULL 5
1 SIMPLE t2 ref a a 23 test.t1.a 2
DROP TABLE t1, t2;
...@@ -1970,3 +1970,18 @@ SELECT K2C4, K4N4, F2I4 FROM t1 ...@@ -1970,3 +1970,18 @@ SELECT K2C4, K4N4, F2I4 FROM t1
WHERE K2C4 = 'WART' AND (K2C4 = 'WART' OR K4N4 = '0200'); WHERE K2C4 = 'WART' AND (K2C4 = 'WART' OR K4N4 = '0200');
DROP TABLE t1; DROP TABLE t1;
#
# Test case for bug 7520: a wrong cost of the index for a BLOB field
#
CREATE TABLE t1 ( a BLOB, INDEX (a(20)) );
CREATE TABLE t2 ( a BLOB, INDEX (a(20)) );
INSERT INTO t1 VALUES ('one'),('two'),('three'),('four'),('five');
INSERT INTO t2 VALUES ('one'),('two'),('three'),('four'),('five');
EXPLAIN SELECT * FROM t1 LEFT JOIN t2 USE INDEX (a) ON t1.a=t2.a;
EXPLAIN SELECT * FROM t1 LEFT JOIN t2 FORCE INDEX (a) ON t1.a=t2.a;
DROP TABLE t1, t2;
...@@ -31,14 +31,14 @@ Transporter::Transporter(TransporterRegistry &t_reg, ...@@ -31,14 +31,14 @@ Transporter::Transporter(TransporterRegistry &t_reg,
TransporterType _type, TransporterType _type,
const char *lHostName, const char *lHostName,
const char *rHostName, const char *rHostName,
int r_port, int s_port,
bool _isMgmConnection, bool _isMgmConnection,
NodeId lNodeId, NodeId lNodeId,
NodeId rNodeId, NodeId rNodeId,
NodeId serverNodeId, NodeId serverNodeId,
int _byteorder, int _byteorder,
bool _compression, bool _checksum, bool _signalId) bool _compression, bool _checksum, bool _signalId)
: m_r_port(r_port), remoteNodeId(rNodeId), localNodeId(lNodeId), : m_s_port(s_port), remoteNodeId(rNodeId), localNodeId(lNodeId),
isServer(lNodeId==serverNodeId), isMgmConnection(_isMgmConnection), isServer(lNodeId==serverNodeId), isMgmConnection(_isMgmConnection),
m_packer(_signalId, _checksum), m_packer(_signalId, _checksum),
m_type(_type), m_type(_type),
...@@ -63,10 +63,10 @@ Transporter::Transporter(TransporterRegistry &t_reg, ...@@ -63,10 +63,10 @@ Transporter::Transporter(TransporterRegistry &t_reg,
if (strlen(lHostName) > 0) if (strlen(lHostName) > 0)
Ndb_getInAddr(&localHostAddress, lHostName); Ndb_getInAddr(&localHostAddress, lHostName);
DBUG_PRINT("info",("rId=%d lId=%d isServer=%d rHost=%s lHost=%s r_port=%d", DBUG_PRINT("info",("rId=%d lId=%d isServer=%d rHost=%s lHost=%s s_port=%d",
remoteNodeId, localNodeId, isServer, remoteNodeId, localNodeId, isServer,
remoteHostName, localHostName, remoteHostName, localHostName,
r_port)); s_port));
byteOrder = _byteorder; byteOrder = _byteorder;
compressionUsed = _compression; compressionUsed = _compression;
...@@ -76,10 +76,13 @@ Transporter::Transporter(TransporterRegistry &t_reg, ...@@ -76,10 +76,13 @@ Transporter::Transporter(TransporterRegistry &t_reg,
m_connected = false; m_connected = false;
m_timeOutMillis = 1000; m_timeOutMillis = 1000;
if(s_port<0)
s_port= -s_port; // was dynamic
if (isServer) if (isServer)
m_socket_client= 0; m_socket_client= 0;
else else
m_socket_client= new SocketClient(remoteHostName, r_port, m_socket_client= new SocketClient(remoteHostName, s_port,
new SocketAuthSimple("ndbd", new SocketAuthSimple("ndbd",
"ndbd passwd")); "ndbd passwd"));
DBUG_VOID_RETURN; DBUG_VOID_RETURN;
...@@ -126,7 +129,7 @@ Transporter::connect_client() { ...@@ -126,7 +129,7 @@ Transporter::connect_client() {
DBUG_ENTER("Transporter::connect_client"); DBUG_ENTER("Transporter::connect_client");
DBUG_PRINT("info",("port %d isMgmConnection=%d",m_r_port,isMgmConnection)); DBUG_PRINT("info",("port %d isMgmConnection=%d",m_s_port,isMgmConnection));
SocketOutputStream s_output(sockfd); SocketOutputStream s_output(sockfd);
SocketInputStream s_input(sockfd); SocketInputStream s_input(sockfd);
......
...@@ -70,15 +70,17 @@ public: ...@@ -70,15 +70,17 @@ public:
NodeId getLocalNodeId() const; NodeId getLocalNodeId() const;
/** /**
* Get r_port we're connecting to * Get port we're connecting to (signed)
*/ */
unsigned int get_r_port() { return m_r_port; }; int get_s_port() { return m_s_port; };
/** /**
* Set r_port to connect to * Set port to connect to (signed)
*/ */
void set_r_port(unsigned int port) { void set_s_port(int port) {
m_r_port = port; m_s_port = port;
if(port<0)
port= -port;
if(m_socket_client) if(m_socket_client)
m_socket_client->set_port(port); m_socket_client->set_port(port);
}; };
...@@ -88,7 +90,7 @@ protected: ...@@ -88,7 +90,7 @@ protected:
TransporterType, TransporterType,
const char *lHostName, const char *lHostName,
const char *rHostName, const char *rHostName,
int r_port, int s_port,
bool isMgmConnection, bool isMgmConnection,
NodeId lNodeId, NodeId lNodeId,
NodeId rNodeId, NodeId rNodeId,
...@@ -118,7 +120,7 @@ protected: ...@@ -118,7 +120,7 @@ protected:
struct in_addr remoteHostAddress; struct in_addr remoteHostAddress;
struct in_addr localHostAddress; struct in_addr localHostAddress;
unsigned int m_r_port; int m_s_port;
const NodeId remoteNodeId; const NodeId remoteNodeId;
const NodeId localNodeId; const NodeId localNodeId;
......
...@@ -1211,7 +1211,7 @@ TransporterRegistry::start_clients_thread() ...@@ -1211,7 +1211,7 @@ TransporterRegistry::start_clients_thread()
switch(performStates[nodeId]){ switch(performStates[nodeId]){
case CONNECTING: case CONNECTING:
if(!t->isConnected() && !t->isServer) { if(!t->isConnected() && !t->isServer) {
if(t->get_r_port() <= 0) { // Port is dynamic if(t->get_s_port() <= 0) { // Port is dynamic
int server_port= 0; int server_port= 0;
struct ndb_mgm_reply mgm_reply; struct ndb_mgm_reply mgm_reply;
int res; int res;
...@@ -1222,27 +1222,24 @@ TransporterRegistry::start_clients_thread() ...@@ -1222,27 +1222,24 @@ TransporterRegistry::start_clients_thread()
CFG_CONNECTION_SERVER_PORT, CFG_CONNECTION_SERVER_PORT,
&server_port, &server_port,
&mgm_reply); &mgm_reply);
DBUG_PRINT("info",("Got %s port %u for %d -> %d (ret: %d)", DBUG_PRINT("info",("Got dynamic port %d for %d -> %d (ret: %d)",
(server_port<=0)?"dynamic":"static",
server_port,t->getRemoteNodeId(), server_port,t->getRemoteNodeId(),
t->getLocalNodeId(),res)); t->getLocalNodeId(),res));
if(server_port<0)
server_port = -server_port; // was a dynamic port
if(res>=0) if(res>=0 && server_port)
t->set_r_port(server_port); t->set_s_port(server_port);
else else
ndbout_c("Failed to get dynamic port to connect to: %d", res); ndbout_c("Failed to get dynamic port to connect to: %d", res);
} }
if (theTransporterTypes[nodeId] != tt_TCP_TRANSPORTER if (theTransporterTypes[nodeId] != tt_TCP_TRANSPORTER
|| t->get_r_port() > 0) { || t->get_s_port() > 0) {
int result = t->connect_client(); int result = t->connect_client();
if (result<0) if (result<0)
ndbout_c("Error while trying to make connection (Node %u to" ndbout_c("Error while trying to make connection (Node %u to"
" %u via port %u) error: %d. Retrying...", " %u via port %u) error: %d. Retrying...",
t->getRemoteNodeId(), t->getRemoteNodeId(),
t->getLocalNodeId(), t->getLocalNodeId(),
t->get_r_port()); t->get_s_port());
} else } else
NdbSleep_MilliSleep(400); // wait before retrying NdbSleep_MilliSleep(400); // wait before retrying
} }
...@@ -1486,44 +1483,56 @@ TransporterRegistry::get_transporter(NodeId nodeId) { ...@@ -1486,44 +1483,56 @@ TransporterRegistry::get_transporter(NodeId nodeId) {
NDB_SOCKET_TYPE TransporterRegistry::connect_ndb_mgmd(SocketClient *sc) NDB_SOCKET_TYPE TransporterRegistry::connect_ndb_mgmd(SocketClient *sc)
{ {
NdbMgmHandle h; NdbMgmHandle h= ndb_mgm_create_handle();
struct ndb_mgm_reply mgm_reply; struct ndb_mgm_reply mgm_reply;
char *cs, c[100];
bool d=false;
h= ndb_mgm_create_handle(); if ( h == NULL )
if(strlen(sc->get_server_name())>80)
{ {
/* return NDB_INVALID_SOCKET;
* server name is long. malloc enough for it and the port number
*/
cs= (char*)malloc((strlen(sc->get_server_name())+20)*sizeof(char));
if(!cs)
return NDB_INVALID_SOCKET;
d= true;
} }
else
cs = &c[0];
snprintf(cs,(d)?strlen(sc->get_server_name()+20):sizeof(c),
"%s:%u",sc->get_server_name(),sc->get_port());
ndb_mgm_set_connectstring(h, cs); /**
* Set connectstring
*/
{
char c[100];
char *cs= &c[0];
int len= strlen(sc->get_server_name())+20;
if( len > sizeof(c) )
{
/*
* server name is long. malloc enough for it and the port number
*/
cs= (char*)malloc(len*sizeof(char));
if(!cs)
{
ndb_mgm_destroy_handle(&h);
return NDB_INVALID_SOCKET;
}
}
snprintf(cs,len,"%s:%u",sc->get_server_name(),sc->get_port());
ndb_mgm_set_connectstring(h, cs);
if(cs != &c[0])
free(cs);
}
if(ndb_mgm_connect(h, 0, 0, 0)<0) if(ndb_mgm_connect(h, 0, 0, 0)<0)
{
ndb_mgm_destroy_handle(&h);
return NDB_INVALID_SOCKET; return NDB_INVALID_SOCKET;
}
for(unsigned int i=0;i < m_transporter_interface.size();i++) for(unsigned int i=0;i < m_transporter_interface.size();i++)
ndb_mgm_set_connection_int_parameter(h, if (ndb_mgm_set_connection_int_parameter(h,
get_localNodeId(), get_localNodeId(),
m_transporter_interface[i].m_remote_nodeId, m_transporter_interface[i].m_remote_nodeId,
CFG_CONNECTION_SERVER_PORT, CFG_CONNECTION_SERVER_PORT,
m_transporter_interface[i].m_s_service_port, m_transporter_interface[i].m_s_service_port,
&mgm_reply); &mgm_reply) < 0)
if(d) {
free(cs); ndb_mgm_destroy_handle(&h);
return NDB_INVALID_SOCKET;
}
return ndb_mgm_convert_to_transporter(h); return ndb_mgm_convert_to_transporter(h);
} }
......
...@@ -154,9 +154,13 @@ do ...@@ -154,9 +154,13 @@ do
ts=`time_spec $time` ts=`time_spec $time`
res_txt="" res_txt=""
case $res in case $res in
0) pass; res_txt="PASSED"; res_dir="&nbsp;";; 0) pass; res_txt="PASSED";;
*) fail; res_txt="FAILED";; *) fail; res_txt="FAILED";;
esac esac
if [ ! -d "result.$no" ]; then res_dir="&nbsp;"; fi
total=`expr $total + $time` total=`expr $total + $time`
( (
......
...@@ -1714,6 +1714,26 @@ innobase_close_connection( ...@@ -1714,6 +1714,26 @@ innobase_close_connection(
** InnoDB database tables ** InnoDB database tables
*****************************************************************************/ *****************************************************************************/
/********************************************************************
Get the record format from the data dictionary. */
enum row_type
ha_innobase::get_row_type() const
/*=============================*/
/* out: ROW_TYPE_REDUNDANT or ROW_TYPE_COMPACT */
{
row_prebuilt_t* prebuilt = (row_prebuilt_t*) innobase_prebuilt;
if (prebuilt && prebuilt->table) {
if (prebuilt->table->comp) {
return(ROW_TYPE_COMPACT);
} else {
return(ROW_TYPE_REDUNDANT);
}
}
ut_ad(0);
return(ROW_TYPE_NOT_USED);
}
/******************************************************************** /********************************************************************
Gives the file extension of an InnoDB single-table tablespace. */ Gives the file extension of an InnoDB single-table tablespace. */
......
...@@ -96,6 +96,11 @@ class ha_innobase: public handler ...@@ -96,6 +96,11 @@ class ha_innobase: public handler
{ {
} }
~ha_innobase() {} ~ha_innobase() {}
/*
Get the row type from the storage engine. If this method returns
ROW_TYPE_NOT_USED, the information in HA_CREATE_INFO should be used.
*/
enum row_type get_row_type() const;
const char* table_type() const { return("InnoDB");} const char* table_type() const { return("InnoDB");}
const char *index_type(uint key_number) { return "BTREE"; } const char *index_type(uint key_number) { return "BTREE"; }
......
...@@ -388,6 +388,12 @@ class handler :public Sql_alloc ...@@ -388,6 +388,12 @@ class handler :public Sql_alloc
virtual ha_rows estimate_rows_upper_bound() virtual ha_rows estimate_rows_upper_bound()
{ return records+EXTRA_RECORDS; } { return records+EXTRA_RECORDS; }
/*
Get the row type from the storage engine. If this method returns
ROW_TYPE_NOT_USED, the information in HA_CREATE_INFO should be used.
*/
virtual enum row_type get_row_type() const { return ROW_TYPE_NOT_USED; }
virtual const char *index_type(uint key_number) { DBUG_ASSERT(0); return "";} virtual const char *index_type(uint key_number) { DBUG_ASSERT(0); return "";}
int ha_index_init(uint idx) int ha_index_init(uint idx)
......
...@@ -2048,10 +2048,31 @@ static int get_schema_tables_record(THD *thd, struct st_table_list *tables, ...@@ -2048,10 +2048,31 @@ static int get_schema_tables_record(THD *thd, struct st_table_list *tables,
tmp_buff= file->table_type(); tmp_buff= file->table_type();
table->field[4]->store(tmp_buff, strlen(tmp_buff), cs); table->field[4]->store(tmp_buff, strlen(tmp_buff), cs);
table->field[5]->store((longlong) share->frm_version); table->field[5]->store((longlong) share->frm_version);
tmp_buff= ((share->db_options_in_use & enum row_type row_type = file->get_row_type();
HA_OPTION_COMPRESS_RECORD) ? "Compressed" : switch (row_type) {
(share->db_options_in_use & HA_OPTION_PACK_RECORD) ? case ROW_TYPE_NOT_USED:
"Dynamic" : "Fixed"); case ROW_TYPE_DEFAULT:
tmp_buff= ((share->db_options_in_use &
HA_OPTION_COMPRESS_RECORD) ? "Compressed" :
(share->db_options_in_use & HA_OPTION_PACK_RECORD) ?
"Dynamic" : "Fixed");
break;
case ROW_TYPE_FIXED:
tmp_buff= "Fixed";
break;
case ROW_TYPE_DYNAMIC:
tmp_buff= "Dynamic";
break;
case ROW_TYPE_COMPRESSED:
tmp_buff= "Compressed";
break;
case ROW_TYPE_REDUNDANT:
tmp_buff= "Redundant";
break;
case ROW_TYPE_COMPACT:
tmp_buff= "Compact";
break;
}
table->field[6]->store(tmp_buff, strlen(tmp_buff), cs); table->field[6]->store(tmp_buff, strlen(tmp_buff), cs);
if (!tables->schema_table) if (!tables->schema_table)
{ {
......
...@@ -661,6 +661,7 @@ int openfrm(THD *thd, const char *name, const char *alias, uint db_stat, ...@@ -661,6 +661,7 @@ int openfrm(THD *thd, const char *name, const char *alias, uint db_stat,
if (!(field->flags & BINARY_FLAG)) if (!(field->flags & BINARY_FLAG))
keyinfo->flags|= HA_END_SPACE_KEY; keyinfo->flags|= HA_END_SPACE_KEY;
} }
set_if_bigger(share->max_key_length, keyinfo->key_length);
if (field->type() == MYSQL_TYPE_BIT) if (field->type() == MYSQL_TYPE_BIT)
key_part->key_part_flag|= HA_BIT_PART; key_part->key_part_flag|= HA_BIT_PART;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment