Merge mysql.com:/home/jimw/my/mysql-4.1-clean
into mysql.com:/home/jimw/my/mysql-5.0-clean extra/perror.c: Auto merged include/my_global.h: Auto merged mysql-test/r/ps_1general.result: Auto merged mysql-test/r/ps_2myisam.result: Auto merged mysql-test/r/ps_3innodb.result: Auto merged mysql-test/r/ps_4heap.result: Auto merged mysql-test/r/ps_5merge.result: Auto merged mysql-test/r/ps_6bdb.result: Auto merged mysql-test/r/ps_7ndb.result: Auto merged mysql-test/r/select.result: Auto merged ndb/src/mgmsrv/ConfigInfo.cpp: Auto merged ndb/src/mgmsrv/main.cpp: Auto merged sql/des_key_file.cc: Auto merged sql/field_conv.cc: Auto merged sql/item_func.cc: Auto merged sql/item_strfunc.cc: Auto merged sql/item_timefunc.cc: Auto merged sql/sql_prepare.cc: Auto merged sql/sql_select.cc: Auto merged tests/mysql_client_test.c: Auto merged mysql-test/t/select.test: Resolve conflicts scripts/mysqld_safe.sh: Resolve conflict sql/item.cc: Resolve conflict, don't return FIELD_TYPE_BLOB since VARCHAR can be longer in 5.0 than 4.1. sql/log_event.cc: Resolve conflict sql/mysql_priv.h: Resolve conflict sql/mysqld.cc: Remove incorrect fix (merge from 4.1) sql/sql_show.cc: Resolve conflict
This commit is contained in:
commit
e9c64ae296
@ -41,7 +41,7 @@ static struct my_option my_long_options[] =
|
||||
{"info", 'I', "Synonym for --help.", 0, 0, 0, GET_NO_ARG,
|
||||
NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#ifdef HAVE_NDBCLUSTER_DB
|
||||
{"ndb", 0, "Ndbcluster storage engine specific error codes.", (gptr*) &ndb_code,
|
||||
{"ndb", 257, "Ndbcluster storage engine specific error codes.", (gptr*) &ndb_code,
|
||||
(gptr*) &ndb_code, 0, GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0},
|
||||
#endif
|
||||
#ifdef HAVE_SYS_ERRLIST
|
||||
|
@ -1005,7 +1005,8 @@ do { doubleget_union _tmp; \
|
||||
#define float4get(V,M) do { *((long *) &(V)) = *((long*) (M)); } while(0)
|
||||
#define float8get(V,M) doubleget((V),(M))
|
||||
#define float4store(V,M) memcpy((byte*) V,(byte*) (&M),sizeof(float))
|
||||
#define floatstore(T,V) memcpy((byte*)(T), (byte*)(&V), sizeof(float))
|
||||
#define floatstore(T,V) memcpy((byte*)(T), (byte*)(&V),sizeof(float))
|
||||
#define floatget(V,M) memcpy((byte*) &V,(byte*) (M),sizeof(float))
|
||||
#define float8store(V,M) doublestore((V),(M))
|
||||
#endif /* __i386__ */
|
||||
|
||||
@ -1176,7 +1177,8 @@ do { doubleget_union _tmp; \
|
||||
*(((char*)T)+1)=(((A) >> 16));\
|
||||
*(((char*)T)+0)=(((A) >> 24)); } while(0)
|
||||
|
||||
#define floatstore(T,V) memcpy_fixed((byte*)(T), (byte*)(&V), sizeof(float))
|
||||
#define floatget(V,M) memcpy_fixed((byte*) &V,(byte*) (M),sizeof(float))
|
||||
#define floatstore(T,V) memcpy_fixed((byte*) (T),(byte*)(&V),sizeof(float))
|
||||
#define doubleget(V,M) memcpy_fixed((byte*) &V,(byte*) (M),sizeof(double))
|
||||
#define doublestore(T,V) memcpy_fixed((byte*) (T),(byte*) &V,sizeof(double))
|
||||
#define longlongget(V,M) memcpy_fixed((byte*) &V,(byte*) (M),sizeof(ulonglong))
|
||||
@ -1191,7 +1193,8 @@ do { doubleget_union _tmp; \
|
||||
#define shortstore(T,V) int2store(T,V)
|
||||
#define longstore(T,V) int4store(T,V)
|
||||
#ifndef floatstore
|
||||
#define floatstore(T,V) memcpy_fixed((byte*)(T), (byte*)(&V), sizeof(float))
|
||||
#define floatstore(T,V) memcpy_fixed((byte*) (T),(byte*) (&V),sizeof(float))
|
||||
#define floatget(V,M) memcpy_fixed((byte*) &V, (byte*) (M), sizeof(float))
|
||||
#endif
|
||||
#ifndef doubleget
|
||||
#define doubleget(V,M) memcpy_fixed((byte*) &V,(byte*) (M),sizeof(double))
|
||||
|
@ -473,12 +473,12 @@ def id 8 3 1 N 32929 0 63
|
||||
def select_type 253 19 6 N 1 31 8
|
||||
def table 253 64 2 Y 0 31 8
|
||||
def type 253 10 3 Y 0 31 8
|
||||
def possible_keys 253 4096 0 Y 0 31 8
|
||||
def possible_keys 252 4096 0 Y 0 31 8
|
||||
def key 253 64 0 Y 0 31 8
|
||||
def key_len 253 4096 0 Y 128 31 63
|
||||
def ref 253 1024 0 Y 0 31 8
|
||||
def ref 252 1024 0 Y 0 31 8
|
||||
def rows 8 10 1 Y 32928 0 63
|
||||
def Extra 253 255 14 N 1 31 8
|
||||
def Extra 252 255 14 N 1 31 8
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 ALL NULL NULL NULL NULL 4 Using filesort
|
||||
SET @arg00=1 ;
|
||||
@ -489,12 +489,12 @@ def id 8 3 1 N 32929 0 63
|
||||
def select_type 253 19 6 N 1 31 8
|
||||
def table 253 64 2 Y 0 31 8
|
||||
def type 253 10 5 Y 0 31 8
|
||||
def possible_keys 253 4096 7 Y 0 31 8
|
||||
def possible_keys 252 4096 7 Y 0 31 8
|
||||
def key 253 64 7 Y 0 31 8
|
||||
def key_len 253 4096 1 Y 128 31 63
|
||||
def ref 253 1024 0 Y 0 31 8
|
||||
def ref 252 1024 0 Y 0 31 8
|
||||
def rows 8 10 1 Y 32928 0 63
|
||||
def Extra 253 255 27 N 1 31 8
|
||||
def Extra 252 255 27 N 1 31 8
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t1 range PRIMARY PRIMARY 4 NULL 3 Using where; Using filesort
|
||||
drop table if exists t2;
|
||||
|
@ -1154,12 +1154,12 @@ def id 8 3 1 N 32929 0 63
|
||||
def select_type 253 19 6 N 1 31 8
|
||||
def table 253 64 2 Y 0 31 8
|
||||
def type 253 10 3 Y 0 31 8
|
||||
def possible_keys 253 4096 0 Y 0 31 8
|
||||
def possible_keys 252 4096 0 Y 0 31 8
|
||||
def key 253 64 0 Y 0 31 8
|
||||
def key_len 253 4096 0 Y 128 31 63
|
||||
def ref 253 1024 0 Y 0 31 8
|
||||
def ref 252 1024 0 Y 0 31 8
|
||||
def rows 8 10 1 Y 32928 0 63
|
||||
def Extra 253 255 0 N 1 31 8
|
||||
def Extra 252 255 0 N 1 31 8
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t9 ALL NULL NULL NULL NULL 2
|
||||
drop table if exists t2 ;
|
||||
|
@ -1154,12 +1154,12 @@ def id 8 3 1 N 32929 0 63
|
||||
def select_type 253 19 6 N 1 31 8
|
||||
def table 253 64 2 Y 0 31 8
|
||||
def type 253 10 3 Y 0 31 8
|
||||
def possible_keys 253 4096 0 Y 0 31 8
|
||||
def possible_keys 252 4096 0 Y 0 31 8
|
||||
def key 253 64 0 Y 0 31 8
|
||||
def key_len 253 4096 0 Y 128 31 63
|
||||
def ref 253 1024 0 Y 0 31 8
|
||||
def ref 252 1024 0 Y 0 31 8
|
||||
def rows 8 10 1 Y 32928 0 63
|
||||
def Extra 253 255 0 N 1 31 8
|
||||
def Extra 252 255 0 N 1 31 8
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t9 ALL NULL NULL NULL NULL 2
|
||||
test_sequence
|
||||
|
@ -1155,12 +1155,12 @@ def id 8 3 1 N 32929 0 63
|
||||
def select_type 253 19 6 N 1 31 8
|
||||
def table 253 64 2 Y 0 31 8
|
||||
def type 253 10 3 Y 0 31 8
|
||||
def possible_keys 253 4096 0 Y 0 31 8
|
||||
def possible_keys 252 4096 0 Y 0 31 8
|
||||
def key 253 64 0 Y 0 31 8
|
||||
def key_len 253 4096 0 Y 128 31 63
|
||||
def ref 253 1024 0 Y 0 31 8
|
||||
def ref 252 1024 0 Y 0 31 8
|
||||
def rows 8 10 1 Y 32928 0 63
|
||||
def Extra 253 255 0 N 1 31 8
|
||||
def Extra 252 255 0 N 1 31 8
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t9 ALL NULL NULL NULL NULL 2
|
||||
test_sequence
|
||||
|
@ -1197,12 +1197,12 @@ def id 8 3 1 N 32929 0 63
|
||||
def select_type 253 19 6 N 1 31 8
|
||||
def table 253 64 2 Y 0 31 8
|
||||
def type 253 10 3 Y 0 31 8
|
||||
def possible_keys 253 4096 0 Y 0 31 8
|
||||
def possible_keys 252 4096 0 Y 0 31 8
|
||||
def key 253 64 0 Y 0 31 8
|
||||
def key_len 253 4096 0 Y 128 31 63
|
||||
def ref 253 1024 0 Y 0 31 8
|
||||
def ref 252 1024 0 Y 0 31 8
|
||||
def rows 8 10 1 Y 32928 0 63
|
||||
def Extra 253 255 0 N 1 31 8
|
||||
def Extra 252 255 0 N 1 31 8
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t9 ALL NULL NULL NULL NULL 2
|
||||
test_sequence
|
||||
@ -4209,12 +4209,12 @@ def id 8 3 1 N 32929 0 63
|
||||
def select_type 253 19 6 N 1 31 8
|
||||
def table 253 64 2 Y 0 31 8
|
||||
def type 253 10 3 Y 0 31 8
|
||||
def possible_keys 253 4096 0 Y 0 31 8
|
||||
def possible_keys 252 4096 0 Y 0 31 8
|
||||
def key 253 64 0 Y 0 31 8
|
||||
def key_len 253 4096 0 Y 128 31 63
|
||||
def ref 253 1024 0 Y 0 31 8
|
||||
def ref 252 1024 0 Y 0 31 8
|
||||
def rows 8 10 1 Y 32928 0 63
|
||||
def Extra 253 255 0 N 1 31 8
|
||||
def Extra 252 255 0 N 1 31 8
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t9 ALL NULL NULL NULL NULL 2
|
||||
test_sequence
|
||||
|
@ -1154,12 +1154,12 @@ def id 8 3 1 N 32929 0 63
|
||||
def select_type 253 19 6 N 1 31 8
|
||||
def table 253 64 2 Y 0 31 8
|
||||
def type 253 10 3 Y 0 31 8
|
||||
def possible_keys 253 4096 0 Y 0 31 8
|
||||
def possible_keys 252 4096 0 Y 0 31 8
|
||||
def key 253 64 0 Y 0 31 8
|
||||
def key_len 253 4096 0 Y 128 31 63
|
||||
def ref 253 1024 0 Y 0 31 8
|
||||
def ref 252 1024 0 Y 0 31 8
|
||||
def rows 8 10 1 Y 32928 0 63
|
||||
def Extra 253 255 0 N 1 31 8
|
||||
def Extra 252 255 0 N 1 31 8
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t9 ALL NULL NULL NULL NULL 3
|
||||
test_sequence
|
||||
|
@ -1154,12 +1154,12 @@ def id 8 3 1 N 32929 0 63
|
||||
def select_type 253 19 6 N 1 31 8
|
||||
def table 253 64 2 Y 0 31 8
|
||||
def type 253 10 3 Y 0 31 8
|
||||
def possible_keys 253 4096 0 Y 0 31 8
|
||||
def possible_keys 252 4096 0 Y 0 31 8
|
||||
def key 253 64 0 Y 0 31 8
|
||||
def key_len 253 4096 0 Y 128 31 63
|
||||
def ref 253 1024 0 Y 0 31 8
|
||||
def ref 252 1024 0 Y 0 31 8
|
||||
def rows 8 10 1 Y 32928 0 63
|
||||
def Extra 253 255 0 N 1 31 8
|
||||
def Extra 252 255 0 N 1 31 8
|
||||
id select_type table type possible_keys key key_len ref rows Extra
|
||||
1 SIMPLE t9 ALL NULL NULL NULL NULL 2
|
||||
test_sequence
|
||||
|
@ -2781,7 +2781,26 @@ INSERT INTO t1
|
||||
SELECT 50, 3, 3 FROM DUAL
|
||||
WHERE NOT EXISTS
|
||||
(SELECT * FROM t1 WHERE a = 50 AND b = 3);
|
||||
select found_rows();
|
||||
found_rows()
|
||||
0
|
||||
SELECT * FROM t1;
|
||||
a b c
|
||||
50 3 3
|
||||
select count(*) from t1;
|
||||
count(*)
|
||||
1
|
||||
select found_rows();
|
||||
found_rows()
|
||||
1
|
||||
select count(*) from t1 limit 2,3;
|
||||
count(*)
|
||||
select found_rows();
|
||||
found_rows()
|
||||
0
|
||||
select SQL_CALC_FOUND_ROWS count(*) from t1 limit 2,3;
|
||||
count(*)
|
||||
select found_rows();
|
||||
found_rows()
|
||||
1
|
||||
DROP TABLE t1;
|
||||
|
@ -2153,7 +2153,14 @@ SELECT K2C4, K4N4, F2I4 FROM t1
|
||||
WHERE K2C4 = 'WART' AND
|
||||
(F2I4 = 2 AND K2C4 = 'WART' OR (F2I4 = 2 OR K4N4 = '0200'));
|
||||
|
||||
select found_rows();
|
||||
SELECT K2C4, K4N4, F2I4 FROM t1
|
||||
select count(*) from t1;
|
||||
select found_rows();
|
||||
select count(*) from t1 limit 2,3;
|
||||
select found_rows();
|
||||
select SQL_CALC_FOUND_ROWS count(*) from t1 limit 2,3;
|
||||
select found_rows();
|
||||
WHERE K2C4 = 'WART' AND (K2C4 = 'WART' OR K4N4 = '0200');
|
||||
|
||||
DROP TABLE t1;
|
||||
|
@ -62,8 +62,6 @@ ConfigInfo::m_sectionNames[]={
|
||||
DB_TOKEN,
|
||||
MGM_TOKEN,
|
||||
API_TOKEN,
|
||||
"REP",
|
||||
"EXTERNAL REP",
|
||||
|
||||
"TCP",
|
||||
"SCI",
|
||||
@ -100,6 +98,7 @@ static bool saveInConfigValues(InitConfigFileParser::Context & ctx, const char *
|
||||
static bool fixFileSystemPath(InitConfigFileParser::Context & ctx, const char * data);
|
||||
static bool fixBackupDataDir(InitConfigFileParser::Context & ctx, const char * data);
|
||||
static bool fixShmUniqueId(InitConfigFileParser::Context & ctx, const char * data);
|
||||
static bool checkLocalhostHostnameMix(InitConfigFileParser::Context & ctx, const char * data);
|
||||
|
||||
const ConfigInfo::SectionRule
|
||||
ConfigInfo::m_SectionRules[] = {
|
||||
@ -110,8 +109,6 @@ ConfigInfo::m_SectionRules[] = {
|
||||
{ DB_TOKEN, transformNode, 0 },
|
||||
{ API_TOKEN, transformNode, 0 },
|
||||
{ MGM_TOKEN, transformNode, 0 },
|
||||
{ "REP", transformNode, 0 },
|
||||
{ "EXTERNAL REP", transformExtNode, 0 },
|
||||
|
||||
{ MGM_TOKEN, fixShmUniqueId, 0 },
|
||||
|
||||
@ -128,8 +125,6 @@ ConfigInfo::m_SectionRules[] = {
|
||||
{ DB_TOKEN, fixNodeHostname, 0 },
|
||||
{ API_TOKEN, fixNodeHostname, 0 },
|
||||
{ MGM_TOKEN, fixNodeHostname, 0 },
|
||||
{ "REP", fixNodeHostname, 0 },
|
||||
//{ "EXTERNAL REP", fixNodeHostname, 0 },
|
||||
|
||||
{ "TCP", fixNodeId, "NodeId1" },
|
||||
{ "TCP", fixNodeId, "NodeId2" },
|
||||
@ -168,6 +163,10 @@ ConfigInfo::m_SectionRules[] = {
|
||||
{ "*", fixDepricated, 0 },
|
||||
{ "*", applyDefaultValues, "system" },
|
||||
|
||||
{ DB_TOKEN, checkLocalhostHostnameMix, 0 },
|
||||
{ API_TOKEN, checkLocalhostHostnameMix, 0 },
|
||||
{ MGM_TOKEN, checkLocalhostHostnameMix, 0 },
|
||||
|
||||
{ DB_TOKEN, fixFileSystemPath, 0 },
|
||||
{ DB_TOKEN, fixBackupDataDir, 0 },
|
||||
|
||||
@ -193,7 +192,6 @@ ConfigInfo::m_SectionRules[] = {
|
||||
{ DB_TOKEN, saveInConfigValues, 0 },
|
||||
{ API_TOKEN, saveInConfigValues, 0 },
|
||||
{ MGM_TOKEN, saveInConfigValues, 0 },
|
||||
{ "REP", saveInConfigValues, 0 },
|
||||
|
||||
{ "TCP", saveInConfigValues, 0 },
|
||||
{ "SHM", saveInConfigValues, 0 },
|
||||
@ -344,17 +342,6 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
|
||||
MANDATORY,
|
||||
0, 0 },
|
||||
|
||||
{
|
||||
CFG_SYS_REPLICATION_ROLE,
|
||||
"ReplicationRole",
|
||||
"SYSTEM",
|
||||
"Role in Global Replication (None, Primary, or Standby)",
|
||||
ConfigInfo::CI_USED,
|
||||
false,
|
||||
ConfigInfo::CI_STRING,
|
||||
UNDEFINED,
|
||||
0, 0 },
|
||||
|
||||
{
|
||||
CFG_SYS_PRIMARY_MGM_NODE,
|
||||
"PrimaryMGMNode",
|
||||
@ -402,7 +389,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
|
||||
ConfigInfo::CI_INTERNAL,
|
||||
false,
|
||||
ConfigInfo::CI_STRING,
|
||||
UNDEFINED,
|
||||
"localhost",
|
||||
0, 0 },
|
||||
|
||||
{
|
||||
@ -1218,78 +1205,6 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
|
||||
"0",
|
||||
STR_VALUE(MAX_INT_RNIL) },
|
||||
|
||||
/***************************************************************************
|
||||
* REP
|
||||
***************************************************************************/
|
||||
{
|
||||
CFG_SECTION_NODE,
|
||||
"REP",
|
||||
"REP",
|
||||
"Node section",
|
||||
ConfigInfo::CI_USED,
|
||||
false,
|
||||
ConfigInfo::CI_SECTION,
|
||||
(const char *)NODE_TYPE_REP,
|
||||
0, 0
|
||||
},
|
||||
|
||||
{
|
||||
CFG_NODE_HOST,
|
||||
"HostName",
|
||||
"REP",
|
||||
"Name of computer for this node",
|
||||
ConfigInfo::CI_INTERNAL,
|
||||
false,
|
||||
ConfigInfo::CI_STRING,
|
||||
UNDEFINED,
|
||||
0, 0 },
|
||||
|
||||
{
|
||||
CFG_NODE_SYSTEM,
|
||||
"System",
|
||||
"REP",
|
||||
"Name of system for this node",
|
||||
ConfigInfo::CI_INTERNAL,
|
||||
false,
|
||||
ConfigInfo::CI_STRING,
|
||||
UNDEFINED,
|
||||
0, 0 },
|
||||
|
||||
{
|
||||
CFG_NODE_ID,
|
||||
"Id",
|
||||
"REP",
|
||||
"Number identifying replication node (REP)",
|
||||
ConfigInfo::CI_USED,
|
||||
false,
|
||||
ConfigInfo::CI_INT,
|
||||
MANDATORY,
|
||||
"1",
|
||||
STR_VALUE(MAX_NODES) },
|
||||
|
||||
{
|
||||
KEY_INTERNAL,
|
||||
"ExecuteOnComputer",
|
||||
"REP",
|
||||
"String referencing an earlier defined COMPUTER",
|
||||
ConfigInfo::CI_USED,
|
||||
false,
|
||||
ConfigInfo::CI_STRING,
|
||||
MANDATORY,
|
||||
0, 0 },
|
||||
|
||||
{
|
||||
CFG_REP_HEARTBEAT_INTERVAL,
|
||||
"HeartbeatIntervalRepRep",
|
||||
"REP",
|
||||
"Time between REP-REP heartbeats. Connection closed after 3 missed HBs",
|
||||
ConfigInfo::CI_USED,
|
||||
true,
|
||||
ConfigInfo::CI_INT,
|
||||
"3000",
|
||||
"100",
|
||||
STR_VALUE(MAX_INT_RNIL) },
|
||||
|
||||
/***************************************************************************
|
||||
* API
|
||||
***************************************************************************/
|
||||
@ -1313,7 +1228,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
|
||||
ConfigInfo::CI_INTERNAL,
|
||||
false,
|
||||
ConfigInfo::CI_STRING,
|
||||
UNDEFINED,
|
||||
"",
|
||||
0, 0 },
|
||||
|
||||
{
|
||||
@ -1433,7 +1348,7 @@ const ConfigInfo::ParamInfo ConfigInfo::m_ParamInfo[] = {
|
||||
ConfigInfo::CI_INTERNAL,
|
||||
false,
|
||||
ConfigInfo::CI_STRING,
|
||||
UNDEFINED,
|
||||
"",
|
||||
0, 0 },
|
||||
|
||||
{
|
||||
@ -2464,7 +2379,15 @@ ConfigInfo::isSection(const char * section) const {
|
||||
}
|
||||
|
||||
const char*
|
||||
ConfigInfo::getAlias(const char * section) const {
|
||||
ConfigInfo::nameToAlias(const char * name) {
|
||||
for (int i = 0; m_sectionNameAliases[i].name != 0; i++)
|
||||
if(!strcasecmp(name, m_sectionNameAliases[i].name))
|
||||
return m_sectionNameAliases[i].alias;
|
||||
return 0;
|
||||
}
|
||||
|
||||
const char*
|
||||
ConfigInfo::getAlias(const char * section) {
|
||||
for (int i = 0; m_sectionNameAliases[i].name != 0; i++)
|
||||
if(!strcasecmp(section, m_sectionNameAliases[i].alias))
|
||||
return m_sectionNameAliases[i].name;
|
||||
@ -2623,7 +2546,7 @@ transformNode(InitConfigFileParser::Context & ctx, const char * data){
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool checkLocalhostHostnameMix(InitConfigFileParser::Context & ctx)
|
||||
static bool checkLocalhostHostnameMix(InitConfigFileParser::Context & ctx, const char * data)
|
||||
{
|
||||
DBUG_ENTER("checkLocalhostHostnameMix");
|
||||
const char * hostname= 0;
|
||||
@ -2643,7 +2566,7 @@ static bool checkLocalhostHostnameMix(InitConfigFileParser::Context & ctx)
|
||||
}
|
||||
|
||||
if (localhost_used) {
|
||||
ctx.reportError("Mixing of localhost with other hostname(%s) is illegal",
|
||||
ctx.reportError("Mixing of localhost (default for [NDBD]HostName) with other hostname(%s) is illegal",
|
||||
hostname);
|
||||
DBUG_RETURN(false);
|
||||
}
|
||||
@ -2652,21 +2575,17 @@ static bool checkLocalhostHostnameMix(InitConfigFileParser::Context & ctx)
|
||||
}
|
||||
|
||||
bool
|
||||
fixNodeHostname(InitConfigFileParser::Context & ctx, const char * data){
|
||||
|
||||
fixNodeHostname(InitConfigFileParser::Context & ctx, const char * data)
|
||||
{
|
||||
const char * hostname;
|
||||
DBUG_ENTER("fixNodeHostname");
|
||||
|
||||
if (ctx.m_currentSection->get("HostName", &hostname))
|
||||
return checkLocalhostHostnameMix(ctx);
|
||||
DBUG_RETURN(checkLocalhostHostnameMix(ctx,0));
|
||||
|
||||
const char * compId;
|
||||
if(!ctx.m_currentSection->get("ExecuteOnComputer", &compId)){
|
||||
const char * type;
|
||||
if(ctx.m_currentSection->get("Type", &type) && strcmp(type,DB_TOKEN) == 0)
|
||||
require(ctx.m_currentSection->put("HostName", "localhost"));
|
||||
else
|
||||
require(ctx.m_currentSection->put("HostName", ""));
|
||||
return checkLocalhostHostnameMix(ctx);
|
||||
}
|
||||
if(!ctx.m_currentSection->get("ExecuteOnComputer", &compId))
|
||||
DBUG_RETURN(true);
|
||||
|
||||
const Properties * computer;
|
||||
char tmp[255];
|
||||
@ -2675,18 +2594,18 @@ fixNodeHostname(InitConfigFileParser::Context & ctx, const char * data){
|
||||
ctx.reportError("Computer \"%s\" not declared"
|
||||
"- [%s] starting at line: %d",
|
||||
compId, ctx.fname, ctx.m_sectionLineno);
|
||||
return false;
|
||||
DBUG_RETURN(false);
|
||||
}
|
||||
|
||||
if(!computer->get("HostName", &hostname)){
|
||||
ctx.reportError("HostName missing in [COMPUTER] (Id: %d) "
|
||||
" - [%s] starting at line: %d",
|
||||
compId, ctx.fname, ctx.m_sectionLineno);
|
||||
return false;
|
||||
DBUG_RETURN(false);
|
||||
}
|
||||
|
||||
require(ctx.m_currentSection->put("HostName", hostname));
|
||||
return checkLocalhostHostnameMix(ctx);
|
||||
DBUG_RETURN(checkLocalhostHostnameMix(ctx,0));
|
||||
}
|
||||
|
||||
bool
|
||||
@ -2870,7 +2789,7 @@ transformComputer(InitConfigFileParser::Context & ctx, const char * data){
|
||||
return true;
|
||||
}
|
||||
|
||||
return checkLocalhostHostnameMix(ctx);
|
||||
return checkLocalhostHostnameMix(ctx,0);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -2878,7 +2797,9 @@ transformComputer(InitConfigFileParser::Context & ctx, const char * data){
|
||||
*/
|
||||
void
|
||||
applyDefaultValues(InitConfigFileParser::Context & ctx,
|
||||
const Properties * defaults){
|
||||
const Properties * defaults)
|
||||
{
|
||||
DBUG_ENTER("applyDefaultValues");
|
||||
if(defaults != NULL){
|
||||
Properties::Iterator it(defaults);
|
||||
|
||||
@ -2891,26 +2812,58 @@ applyDefaultValues(InitConfigFileParser::Context & ctx,
|
||||
Uint32 val = 0;
|
||||
::require(defaults->get(name, &val));
|
||||
ctx.m_currentSection->put(name, val);
|
||||
DBUG_PRINT("info",("%s=%d #default",name,val));
|
||||
break;
|
||||
}
|
||||
case ConfigInfo::CI_INT64:{
|
||||
Uint64 val = 0;
|
||||
::require(defaults->get(name, &val));
|
||||
ctx.m_currentSection->put64(name, val);
|
||||
DBUG_PRINT("info",("%s=%lld #default",name,val));
|
||||
break;
|
||||
}
|
||||
case ConfigInfo::CI_STRING:{
|
||||
const char * val;
|
||||
::require(defaults->get(name, &val));
|
||||
ctx.m_currentSection->put(name, val);
|
||||
DBUG_PRINT("info",("%s=%s #default",name,val));
|
||||
break;
|
||||
}
|
||||
case ConfigInfo::CI_SECTION:
|
||||
break;
|
||||
}
|
||||
}
|
||||
#ifndef DBUG_OFF
|
||||
else
|
||||
{
|
||||
switch (ctx.m_info->getType(ctx.m_currentInfo, name)){
|
||||
case ConfigInfo::CI_INT:
|
||||
case ConfigInfo::CI_BOOL:{
|
||||
Uint32 val = 0;
|
||||
::require(ctx.m_currentSection->get(name, &val));
|
||||
DBUG_PRINT("info",("%s=%d",name,val));
|
||||
break;
|
||||
}
|
||||
case ConfigInfo::CI_INT64:{
|
||||
Uint64 val = 0;
|
||||
::require(ctx.m_currentSection->get(name, &val));
|
||||
DBUG_PRINT("info",("%s=%lld",name,val));
|
||||
break;
|
||||
}
|
||||
case ConfigInfo::CI_STRING:{
|
||||
const char * val;
|
||||
::require(ctx.m_currentSection->get(name, &val));
|
||||
DBUG_PRINT("info",("%s=%s",name,val));
|
||||
break;
|
||||
}
|
||||
case ConfigInfo::CI_SECTION:
|
||||
break;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
|
||||
bool
|
||||
@ -3482,6 +3435,8 @@ fixDepricated(InitConfigFileParser::Context & ctx, const char * data){
|
||||
return true;
|
||||
}
|
||||
|
||||
extern int g_print_full_config;
|
||||
|
||||
static bool
|
||||
saveInConfigValues(InitConfigFileParser::Context & ctx, const char * data){
|
||||
const Properties * sec;
|
||||
@ -3503,6 +3458,12 @@ saveInConfigValues(InitConfigFileParser::Context & ctx, const char * data){
|
||||
break;
|
||||
}
|
||||
|
||||
if (g_print_full_config)
|
||||
{
|
||||
const char *alias= ConfigInfo::nameToAlias(ctx.fname);
|
||||
printf("[%s]\n", alias ? alias : ctx.fname);
|
||||
}
|
||||
|
||||
Uint32 no = 0;
|
||||
ctx.m_userProperties.get("$Section", id, &no);
|
||||
ctx.m_userProperties.put("$Section", id, no+1, true);
|
||||
@ -3530,18 +3491,24 @@ saveInConfigValues(InitConfigFileParser::Context & ctx, const char * data){
|
||||
Uint32 val;
|
||||
require(ctx.m_currentSection->get(n, &val));
|
||||
ok = ctx.m_configValues.put(id, val);
|
||||
if (g_print_full_config)
|
||||
printf("%s=%u\n", n, val);
|
||||
break;
|
||||
}
|
||||
case PropertiesType_Uint64:{
|
||||
Uint64 val;
|
||||
require(ctx.m_currentSection->get(n, &val));
|
||||
ok = ctx.m_configValues.put64(id, val);
|
||||
if (g_print_full_config)
|
||||
printf("%s=%llu\n", n, val);
|
||||
break;
|
||||
}
|
||||
case PropertiesType_char:{
|
||||
const char * val;
|
||||
require(ctx.m_currentSection->get(n, &val));
|
||||
ok = ctx.m_configValues.put(id, val);
|
||||
if (g_print_full_config)
|
||||
printf("%s=%s\n", n, val);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
|
@ -105,7 +105,8 @@ public:
|
||||
* @note Result is not defined if section/name are wrong!
|
||||
*/
|
||||
bool verify(const Properties* secti, const char* fname, Uint64 value) const;
|
||||
const char* getAlias(const char*) const;
|
||||
static const char* nameToAlias(const char*);
|
||||
static const char* getAlias(const char*);
|
||||
bool isSection(const char*) const;
|
||||
|
||||
const char* getDescription(const Properties * sec, const char* fname) const;
|
||||
|
@ -121,6 +121,7 @@ struct MgmGlobals {
|
||||
};
|
||||
|
||||
int g_no_nodeid_checks= 0;
|
||||
int g_print_full_config;
|
||||
static MgmGlobals *glob= 0;
|
||||
|
||||
/******************************************************************************
|
||||
@ -147,6 +148,9 @@ static struct my_option my_long_options[] =
|
||||
{ "config-file", 'f', "Specify cluster configuration file",
|
||||
(gptr*) &opt_config_filename, (gptr*) &opt_config_filename, 0,
|
||||
GET_STR, REQUIRED_ARG, 0, 0, 0, 0, 0, 0 },
|
||||
{ "print-full-config", 'P', "Print full config and exit",
|
||||
(gptr*) &g_print_full_config, (gptr*) &g_print_full_config, 0,
|
||||
GET_BOOL, NO_ARG, 0, 0, 0, 0, 0, 0 },
|
||||
{ "daemon", 'd', "Run ndb_mgmd in daemon mode (default)",
|
||||
(gptr*) &opt_daemon, (gptr*) &opt_daemon, 0,
|
||||
GET_BOOL, NO_ARG, 1, 0, 0, 0, 0, 0 },
|
||||
@ -208,7 +212,8 @@ int main(int argc, char** argv)
|
||||
exit(ho_error);
|
||||
|
||||
if (opt_interactive ||
|
||||
opt_non_interactive) {
|
||||
opt_non_interactive ||
|
||||
g_print_full_config) {
|
||||
opt_daemon= 0;
|
||||
}
|
||||
|
||||
@ -220,6 +225,9 @@ int main(int argc, char** argv)
|
||||
opt_config_filename,
|
||||
opt_connect_str);
|
||||
|
||||
if (g_print_full_config)
|
||||
goto the_end;
|
||||
|
||||
if (glob->mgmObject->init())
|
||||
goto error_end;
|
||||
|
||||
@ -358,6 +366,7 @@ int main(int argc, char** argv)
|
||||
glob->mgmObject->get_config_retriever()->disconnect();
|
||||
glob->socketServer->stopSessions(true);
|
||||
g_eventLogger.info("Shutdown complete");
|
||||
the_end:
|
||||
delete glob;
|
||||
ndb_end(opt_endinfo ? MY_CHECK_ERROR | MY_GIVE_INFO : 0);
|
||||
return 0;
|
||||
|
@ -106,31 +106,49 @@ parse_arguments() {
|
||||
}
|
||||
|
||||
|
||||
#
|
||||
# First, try to find BASEDIR and ledir (where mysqld is)
|
||||
#
|
||||
|
||||
MY_PWD=`pwd`
|
||||
# Check if we are starting this relative (for the binary release)
|
||||
if test -f ./share/mysql/english/errmsg.sys -a \
|
||||
-x ./bin/mysqld
|
||||
# Check for the directories we would expect from a binary release install
|
||||
if test -f ./share/mysql/english/errmsg.sys -a -x ./bin/mysqld
|
||||
then
|
||||
MY_BASEDIR_VERSION=$MY_PWD # Where bin, share and data are
|
||||
ledir=$MY_BASEDIR_VERSION/bin # Where mysqld is
|
||||
DATADIR=$MY_BASEDIR_VERSION/data
|
||||
if test -z "$defaults" -a -r "$DATADIR/my.cnf"
|
||||
then
|
||||
defaults="--defaults-extra-file=$DATADIR/my.cnf"
|
||||
fi
|
||||
# Check if this is a 'moved install directory'
|
||||
# Check for the directories we would expect from a source install
|
||||
elif test -f ./share/mysql/english/errmsg.sys -a \
|
||||
-x ./libexec/mysqld
|
||||
then
|
||||
MY_BASEDIR_VERSION=$MY_PWD # Where libexec, share and var are
|
||||
ledir=$MY_BASEDIR_VERSION/libexec # Where mysqld is
|
||||
DATADIR=$MY_BASEDIR_VERSION/var
|
||||
# Since we didn't find anything, used the compiled-in defaults
|
||||
else
|
||||
MY_BASEDIR_VERSION=@prefix@
|
||||
DATADIR=@localstatedir@
|
||||
ledir=@libexecdir@
|
||||
fi
|
||||
|
||||
#
|
||||
# Second, try to find the data directory
|
||||
#
|
||||
|
||||
# Try where the binary installs put it
|
||||
if test -d $MY_BASEDIR_VERSION/data/mysql
|
||||
then
|
||||
DATADIR=$MY_BASEDIR_VERSION/data
|
||||
if test -z "$defaults" -a -r "$DATADIR/my.cnf"
|
||||
then
|
||||
defaults="--defaults-extra-file=$DATADIR/my.cnf"
|
||||
fi
|
||||
# Next try where the source installs put it
|
||||
elif test -d $MY_BASEDIR_VERSION/var/mysql
|
||||
then
|
||||
DATADIR=$MY_BASEDIR_VERSION/var
|
||||
# Or just give up and use our compiled-in default
|
||||
else
|
||||
DATADIR=@localstatedir@
|
||||
fi
|
||||
|
||||
if test -z "$MYSQL_HOME"
|
||||
then
|
||||
if test -r "$MY_BASEDIR_VERSION/my.cnf" && test -r "$DATADIR/my.cnf"
|
||||
|
@ -21,18 +21,6 @@
|
||||
|
||||
struct st_des_keyschedule des_keyschedule[10];
|
||||
uint des_default_key;
|
||||
pthread_mutex_t LOCK_des_key_file;
|
||||
static int initialized= 0;
|
||||
|
||||
void
|
||||
init_des_key_file()
|
||||
{
|
||||
if (!initialized)
|
||||
{
|
||||
initialized=1;
|
||||
pthread_mutex_init(&LOCK_des_key_file,MY_MUTEX_INIT_FAST);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
Function which loads DES keys from plaintext file into memory on MySQL
|
||||
@ -55,8 +43,6 @@ load_des_key_file(const char *file_name)
|
||||
DBUG_ENTER("load_des_key_file");
|
||||
DBUG_PRINT("enter",("name: %s",file_name));
|
||||
|
||||
init_des_key_file();
|
||||
|
||||
VOID(pthread_mutex_lock(&LOCK_des_key_file));
|
||||
if ((file=my_open(file_name,O_RDONLY | O_BINARY ,MYF(MY_WME))) < 0 ||
|
||||
init_io_cache(&io, file, IO_SIZE*2, READ_CACHE, 0, 0, MYF(MY_WME)))
|
||||
@ -113,15 +99,4 @@ error:
|
||||
VOID(pthread_mutex_unlock(&LOCK_des_key_file));
|
||||
DBUG_RETURN(result);
|
||||
}
|
||||
|
||||
|
||||
void free_des_key_file()
|
||||
{
|
||||
if (initialized)
|
||||
{
|
||||
initialized= 01;
|
||||
pthread_mutex_destroy(&LOCK_des_key_file);
|
||||
}
|
||||
}
|
||||
|
||||
#endif /* HAVE_OPENSSL */
|
||||
|
@ -322,7 +322,34 @@ static void do_field_real(Copy_field *copy)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
string copy for single byte characters set when to string is shorter than
|
||||
from string
|
||||
*/
|
||||
|
||||
static void do_cut_string(Copy_field *copy)
|
||||
{
|
||||
CHARSET_INFO *cs= copy->from_field->charset();
|
||||
memcpy(copy->to_ptr,copy->from_ptr,copy->to_length);
|
||||
|
||||
/* Check if we loosed any important characters */
|
||||
if (cs->cset->scan(cs,
|
||||
copy->from_ptr + copy->to_length,
|
||||
copy->from_ptr + copy->from_length,
|
||||
MY_SEQ_SPACES) < copy->from_length - copy->to_length)
|
||||
{
|
||||
copy->to_field->set_warning(MYSQL_ERROR::WARN_LEVEL_WARN,
|
||||
ER_WARN_DATA_TRUNCATED, 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
string copy for multi byte characters set when to string is shorter than
|
||||
from string
|
||||
*/
|
||||
|
||||
static void do_cut_string_complex(Copy_field *copy)
|
||||
{ // Shorter string field
|
||||
int well_formed_error;
|
||||
CHARSET_INFO *cs= copy->from_field->charset();
|
||||
@ -349,6 +376,8 @@ static void do_cut_string(Copy_field *copy)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
static void do_expand_string(Copy_field *copy)
|
||||
{
|
||||
CHARSET_INFO *cs= copy->from_field->charset();
|
||||
@ -550,7 +579,8 @@ void (*Copy_field::get_copy_func(Field *to,Field *from))(Copy_field*)
|
||||
do_varstring1 : do_varstring2);
|
||||
}
|
||||
else if (to_length < from_length)
|
||||
return do_cut_string;
|
||||
return (from->charset()->mbmaxlen == 1 ?
|
||||
do_cut_string : do_cut_string_complex);
|
||||
else if (to_length > from_length)
|
||||
return do_expand_string;
|
||||
}
|
||||
|
@ -3323,7 +3323,12 @@ void Item::make_field(Send_field *tmp_field)
|
||||
|
||||
void Item_empty_string::make_field(Send_field *tmp_field)
|
||||
{
|
||||
init_make_field(tmp_field, MYSQL_TYPE_VARCHAR);
|
||||
enum_field_types type= FIELD_TYPE_VAR_STRING;
|
||||
if (max_length >= 16777216)
|
||||
type= FIELD_TYPE_LONG_BLOB;
|
||||
else if (max_length >= 65536)
|
||||
type= FIELD_TYPE_MEDIUM_BLOB;
|
||||
init_make_field(tmp_field, type);
|
||||
}
|
||||
|
||||
|
||||
|
@ -4231,14 +4231,15 @@ Item_func_get_system_var(sys_var *var_arg, enum_var_type var_type_arg,
|
||||
bool
|
||||
Item_func_get_system_var::fix_fields(THD *thd, Item **ref)
|
||||
{
|
||||
Item *item= var->item(thd, var_type, &component);
|
||||
Item *item;
|
||||
DBUG_ENTER("Item_func_get_system_var::fix_fields");
|
||||
|
||||
/*
|
||||
Evaluate the system variable and substitute the result (a basic constant)
|
||||
instead of this item. If the variable can not be evaluated,
|
||||
the error is reported in sys_var::item().
|
||||
*/
|
||||
if (item == 0)
|
||||
if (!(item= var->item(thd, var_type, &component)))
|
||||
DBUG_RETURN(1); // Impossible
|
||||
item->set_name(name, 0, system_charset_info); // don't allocate a new name
|
||||
thd->change_item_tree(ref, item);
|
||||
|
@ -335,19 +335,20 @@ null:
|
||||
|
||||
void Item_func_concat::fix_length_and_dec()
|
||||
{
|
||||
max_length=0;
|
||||
ulonglong max_result_length= 0;
|
||||
|
||||
if (agg_arg_charsets(collation, args, arg_count, MY_COLL_ALLOW_CONV))
|
||||
return;
|
||||
|
||||
for (uint i=0 ; i < arg_count ; i++)
|
||||
max_length+=args[i]->max_length;
|
||||
max_result_length+= args[i]->max_length;
|
||||
|
||||
if (max_length > MAX_BLOB_WIDTH)
|
||||
if (max_result_length >= MAX_BLOB_WIDTH)
|
||||
{
|
||||
max_length=MAX_BLOB_WIDTH;
|
||||
maybe_null=1;
|
||||
max_result_length= MAX_BLOB_WIDTH;
|
||||
maybe_null= 1;
|
||||
}
|
||||
max_length= (ulong) max_result_length;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -378,9 +379,6 @@ String *Item_func_des_encrypt::val_str(String *str)
|
||||
|
||||
if (arg_count == 1)
|
||||
{
|
||||
/* Make sure LOCK_des_key_file was initialized. */
|
||||
init_des_key_file();
|
||||
|
||||
/* Protect against someone doing FLUSH DES_KEY_FILE */
|
||||
VOID(pthread_mutex_lock(&LOCK_des_key_file));
|
||||
keyschedule= des_keyschedule[key_number=des_default_key];
|
||||
@ -391,10 +389,6 @@ String *Item_func_des_encrypt::val_str(String *str)
|
||||
key_number= (uint) args[1]->val_int();
|
||||
if (key_number > 9)
|
||||
goto error;
|
||||
|
||||
/* Make sure LOCK_des_key_file was initialized. */
|
||||
init_des_key_file();
|
||||
|
||||
VOID(pthread_mutex_lock(&LOCK_des_key_file));
|
||||
keyschedule= des_keyschedule[key_number];
|
||||
VOID(pthread_mutex_unlock(&LOCK_des_key_file));
|
||||
@ -482,9 +476,6 @@ String *Item_func_des_decrypt::val_str(String *str)
|
||||
if (!(current_thd->master_access & SUPER_ACL) || key_number > 9)
|
||||
goto error;
|
||||
|
||||
/* Make sure LOCK_des_key_file was initialized. */
|
||||
init_des_key_file();
|
||||
|
||||
VOID(pthread_mutex_lock(&LOCK_des_key_file));
|
||||
keyschedule= des_keyschedule[key_number];
|
||||
VOID(pthread_mutex_unlock(&LOCK_des_key_file));
|
||||
@ -658,7 +649,7 @@ null:
|
||||
|
||||
void Item_func_concat_ws::fix_length_and_dec()
|
||||
{
|
||||
max_length=0;
|
||||
ulonglong max_result_length;
|
||||
|
||||
if (agg_arg_charsets(collation, args, arg_count, MY_COLL_ALLOW_CONV))
|
||||
return;
|
||||
@ -668,15 +659,16 @@ void Item_func_concat_ws::fix_length_and_dec()
|
||||
it is done on parser level in sql_yacc.yy
|
||||
so, (arg_count - 2) is safe here.
|
||||
*/
|
||||
max_length= args[0]->max_length * (arg_count - 2);
|
||||
max_result_length= (ulonglong) args[0]->max_length * (arg_count - 2);
|
||||
for (uint i=1 ; i < arg_count ; i++)
|
||||
max_length+=args[i]->max_length;
|
||||
max_result_length+=args[i]->max_length;
|
||||
|
||||
if (max_length > MAX_BLOB_WIDTH)
|
||||
if (max_result_length >= MAX_BLOB_WIDTH)
|
||||
{
|
||||
max_length=MAX_BLOB_WIDTH;
|
||||
maybe_null=1;
|
||||
max_result_length= MAX_BLOB_WIDTH;
|
||||
maybe_null= 1;
|
||||
}
|
||||
max_length= (ulong) max_result_length;
|
||||
}
|
||||
|
||||
|
||||
@ -855,18 +847,19 @@ null:
|
||||
|
||||
void Item_func_replace::fix_length_and_dec()
|
||||
{
|
||||
max_length=args[0]->max_length;
|
||||
ulonglong max_result_length= args[0]->max_length;
|
||||
int diff=(int) (args[2]->max_length - args[1]->max_length);
|
||||
if (diff > 0 && args[1]->max_length)
|
||||
{ // Calculate of maxreplaces
|
||||
uint max_substrs= max_length/args[1]->max_length;
|
||||
max_length+= max_substrs * (uint) diff;
|
||||
ulonglong max_substrs= max_result_length/args[1]->max_length;
|
||||
max_result_length+= max_substrs * (uint) diff;
|
||||
}
|
||||
if (max_length > MAX_BLOB_WIDTH)
|
||||
if (max_result_length >= MAX_BLOB_WIDTH)
|
||||
{
|
||||
max_length=MAX_BLOB_WIDTH;
|
||||
maybe_null=1;
|
||||
max_result_length= MAX_BLOB_WIDTH;
|
||||
maybe_null= 1;
|
||||
}
|
||||
max_length= (ulong) max_result_length;
|
||||
|
||||
if (agg_arg_charsets(collation, args, 3, MY_COLL_CMP_CONV))
|
||||
return;
|
||||
@ -914,18 +907,22 @@ null:
|
||||
void Item_func_insert::fix_length_and_dec()
|
||||
{
|
||||
Item *cargs[2];
|
||||
ulonglong max_result_length;
|
||||
|
||||
cargs[0]= args[0];
|
||||
cargs[1]= args[3];
|
||||
if (agg_arg_charsets(collation, cargs, 2, MY_COLL_ALLOW_CONV))
|
||||
return;
|
||||
args[0]= cargs[0];
|
||||
args[3]= cargs[1];
|
||||
max_length=args[0]->max_length+args[3]->max_length;
|
||||
if (max_length > MAX_BLOB_WIDTH)
|
||||
max_result_length= ((ulonglong) args[0]->max_length+
|
||||
(ulonglong) args[3]->max_length);
|
||||
if (max_result_length >= MAX_BLOB_WIDTH)
|
||||
{
|
||||
max_length=MAX_BLOB_WIDTH;
|
||||
maybe_null=1;
|
||||
max_result_length= MAX_BLOB_WIDTH;
|
||||
maybe_null= 1;
|
||||
}
|
||||
max_length= (ulong) max_result_length;
|
||||
}
|
||||
|
||||
|
||||
@ -2001,17 +1998,19 @@ void Item_func_repeat::fix_length_and_dec()
|
||||
collation.set(args[0]->collation);
|
||||
if (args[1]->const_item())
|
||||
{
|
||||
max_length=(long) (args[0]->max_length * args[1]->val_int());
|
||||
if (max_length >= MAX_BLOB_WIDTH)
|
||||
ulonglong max_result_length= ((ulonglong) args[0]->max_length *
|
||||
args[1]->val_int());
|
||||
if (max_result_length >= MAX_BLOB_WIDTH)
|
||||
{
|
||||
max_length=MAX_BLOB_WIDTH;
|
||||
maybe_null=1;
|
||||
max_result_length= MAX_BLOB_WIDTH;
|
||||
maybe_null= 1;
|
||||
}
|
||||
max_length= (ulong) max_result_length;
|
||||
}
|
||||
else
|
||||
{
|
||||
max_length=MAX_BLOB_WIDTH;
|
||||
maybe_null=1;
|
||||
max_length= MAX_BLOB_WIDTH;
|
||||
maybe_null= 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2066,6 +2065,7 @@ err:
|
||||
void Item_func_rpad::fix_length_and_dec()
|
||||
{
|
||||
Item *cargs[2];
|
||||
|
||||
cargs[0]= args[0];
|
||||
cargs[1]= args[2];
|
||||
if (agg_arg_charsets(collation, cargs, 2, MY_COLL_ALLOW_CONV))
|
||||
@ -2074,18 +2074,20 @@ void Item_func_rpad::fix_length_and_dec()
|
||||
args[2]= cargs[1];
|
||||
if (args[1]->const_item())
|
||||
{
|
||||
uint32 length= (uint32) args[1]->val_int() * collation.collation->mbmaxlen;
|
||||
max_length=max(args[0]->max_length,length);
|
||||
if (max_length >= MAX_BLOB_WIDTH)
|
||||
ulonglong length= ((ulonglong) args[1]->val_int() *
|
||||
collation.collation->mbmaxlen);
|
||||
length= max((ulonglong) args[0]->max_length, length);
|
||||
if (length >= MAX_BLOB_WIDTH)
|
||||
{
|
||||
max_length=MAX_BLOB_WIDTH;
|
||||
maybe_null=1;
|
||||
length= MAX_BLOB_WIDTH;
|
||||
maybe_null= 1;
|
||||
}
|
||||
max_length= (ulong) length;
|
||||
}
|
||||
else
|
||||
{
|
||||
max_length=MAX_BLOB_WIDTH;
|
||||
maybe_null=1;
|
||||
max_length= MAX_BLOB_WIDTH;
|
||||
maybe_null= 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2160,18 +2162,20 @@ void Item_func_lpad::fix_length_and_dec()
|
||||
|
||||
if (args[1]->const_item())
|
||||
{
|
||||
uint32 length= (uint32) args[1]->val_int() * collation.collation->mbmaxlen;
|
||||
max_length=max(args[0]->max_length,length);
|
||||
if (max_length >= MAX_BLOB_WIDTH)
|
||||
ulonglong length= ((ulonglong) args[1]->val_int() *
|
||||
collation.collation->mbmaxlen);
|
||||
length= max((ulonglong) args[0]->max_length, length);
|
||||
if (length >= MAX_BLOB_WIDTH)
|
||||
{
|
||||
max_length=MAX_BLOB_WIDTH;
|
||||
maybe_null=1;
|
||||
length= MAX_BLOB_WIDTH;
|
||||
maybe_null= 1;
|
||||
}
|
||||
max_length= (ulong) length;
|
||||
}
|
||||
else
|
||||
{
|
||||
max_length=MAX_BLOB_WIDTH;
|
||||
maybe_null=1;
|
||||
max_length= MAX_BLOB_WIDTH;
|
||||
maybe_null= 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1555,7 +1555,7 @@ void Item_func_date_format::fix_length_and_dec()
|
||||
{
|
||||
fixed_length=0;
|
||||
/* The result is a binary string (no reason to use collation->mbmaxlen */
|
||||
max_length=args[1]->max_length*10;
|
||||
max_length=min(args[1]->max_length,MAX_BLOB_WIDTH) * 10;
|
||||
set_if_smaller(max_length,MAX_BLOB_WIDTH);
|
||||
}
|
||||
maybe_null=1; // If wrong date
|
||||
|
@ -1,15 +1,15 @@
|
||||
/* Copyright (C) 2000-2004 MySQL AB
|
||||
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */
|
||||
@ -2774,6 +2774,16 @@ int Load_log_event::exec_event(NET* net, struct st_relay_log_info* rli,
|
||||
*/
|
||||
handle_dup= DUP_ERROR;
|
||||
}
|
||||
/*
|
||||
We need to set thd->lex->sql_command and thd->lex->duplicates
|
||||
since InnoDB tests these variables to decide if this is a LOAD
|
||||
DATA ... REPLACE INTO ... statement even though mysql_parse()
|
||||
is not called. This is not needed in 5.0 since there the LOAD
|
||||
DATA ... statement is replicated using mysql_parse(), which
|
||||
sets the thd->lex fields correctly.
|
||||
*/
|
||||
thd->lex->sql_command= SQLCOM_LOAD;
|
||||
thd->lex->duplicates= handle_dup;
|
||||
|
||||
sql_exchange ex((char*)fname, sql_ex.opt_flags & DUMPFILE_FLAG);
|
||||
String field_term(sql_ex.field_term,sql_ex.field_term_len,log_cs);
|
||||
|
@ -791,9 +791,7 @@ extern char *des_key_file;
|
||||
extern struct st_des_keyschedule des_keyschedule[10];
|
||||
extern uint des_default_key;
|
||||
extern pthread_mutex_t LOCK_des_key_file;
|
||||
void init_des_key_file();
|
||||
bool load_des_key_file(const char *file_name);
|
||||
void free_des_key_file();
|
||||
#endif /* HAVE_OPENSSL */
|
||||
|
||||
/* sql_do.cc */
|
||||
@ -1156,8 +1154,11 @@ extern pthread_mutex_t LOCK_mysql_create_db,LOCK_Acl,LOCK_open,
|
||||
LOCK_error_log, LOCK_delayed_insert, LOCK_uuid_generator,
|
||||
LOCK_delayed_status, LOCK_delayed_create, LOCK_crypt, LOCK_timezone,
|
||||
LOCK_slave_list, LOCK_active_mi, LOCK_manager, LOCK_global_read_lock,
|
||||
LOCK_global_system_variables, LOCK_user_conn,
|
||||
LOCK_global_system_variables, LOCK_user_conn,
|
||||
LOCK_bytes_sent, LOCK_bytes_received;
|
||||
#ifdef HAVE_OPENSSL
|
||||
extern pthread_mutex_t LOCK_des_key_file;
|
||||
#endif
|
||||
extern rw_lock_t LOCK_grant, LOCK_sys_init_connect, LOCK_sys_init_slave;
|
||||
extern pthread_cond_t COND_refresh, COND_thread_count, COND_manager;
|
||||
extern pthread_attr_t connection_attrib;
|
||||
|
@ -447,6 +447,9 @@ pthread_mutex_t LOCK_mysql_create_db, LOCK_Acl, LOCK_open, LOCK_thread_count,
|
||||
LOCK_crypt, LOCK_bytes_sent, LOCK_bytes_received,
|
||||
LOCK_global_system_variables,
|
||||
LOCK_user_conn, LOCK_slave_list, LOCK_active_mi;
|
||||
#ifdef HAVE_OPENSSL
|
||||
pthread_mutex_t LOCK_des_key_file;
|
||||
#endif
|
||||
rw_lock_t LOCK_grant, LOCK_sys_init_connect, LOCK_sys_init_slave;
|
||||
pthread_cond_t COND_refresh,COND_thread_count;
|
||||
pthread_t signal_thread;
|
||||
@ -675,7 +678,11 @@ static void close_connections(void)
|
||||
end_thr_alarm(0); // Abort old alarms.
|
||||
end_slave();
|
||||
|
||||
/* First signal all threads that it's time to die */
|
||||
/*
|
||||
First signal all threads that it's time to die
|
||||
This will give the threads some time to gracefully abort their
|
||||
statements and inform their clients that the server is about to die.
|
||||
*/
|
||||
|
||||
THD *tmp;
|
||||
(void) pthread_mutex_lock(&LOCK_thread_count); // For unlink from list
|
||||
@ -685,13 +692,7 @@ static void close_connections(void)
|
||||
{
|
||||
DBUG_PRINT("quit",("Informing thread %ld that it's time to die",
|
||||
tmp->thread_id));
|
||||
/*
|
||||
Re: bug 7403 - close_connection will be called mulitple times
|
||||
a wholesale clean up of our network code is a very large project.
|
||||
This will wake up the socket on Windows and prevent the printing of
|
||||
the error message that we are force closing a connection.
|
||||
*/
|
||||
close_connection(tmp, 0, 0);
|
||||
tmp->killed= 1;
|
||||
if (tmp->mysys_var)
|
||||
{
|
||||
tmp->mysys_var->abort=1;
|
||||
@ -708,9 +709,13 @@ static void close_connections(void)
|
||||
(void) pthread_mutex_unlock(&LOCK_thread_count); // For unlink from list
|
||||
|
||||
if (thread_count)
|
||||
sleep(1); // Give threads time to die
|
||||
sleep(2); // Give threads time to die
|
||||
|
||||
/* Force remaining threads to die by closing the connection to the client */
|
||||
/*
|
||||
Force remaining threads to die by closing the connection to the client
|
||||
This will ensure that threads that are waiting for a command from the
|
||||
client on a blocking read call are aborted.
|
||||
*/
|
||||
|
||||
for (;;)
|
||||
{
|
||||
@ -725,8 +730,9 @@ static void close_connections(void)
|
||||
#ifndef __bsdi__ // Bug in BSDI kernel
|
||||
if (tmp->vio_ok())
|
||||
{
|
||||
sql_print_error(ER(ER_FORCING_CLOSE),my_progname,
|
||||
tmp->thread_id,tmp->user ? tmp->user : "");
|
||||
if (global_system_variables.log_warnings)
|
||||
sql_print_warning(ER(ER_FORCING_CLOSE),my_progname,
|
||||
tmp->thread_id,tmp->user ? tmp->user : "");
|
||||
close_connection(tmp,0,0);
|
||||
}
|
||||
#endif
|
||||
@ -1042,7 +1048,6 @@ void clean_up(bool print_message)
|
||||
#ifdef HAVE_OPENSSL
|
||||
if (ssl_acceptor_fd)
|
||||
my_free((gptr) ssl_acceptor_fd, MYF(MY_ALLOW_ZERO_PTR));
|
||||
free_des_key_file();
|
||||
#endif /* HAVE_OPENSSL */
|
||||
#ifdef USE_REGEX
|
||||
regex_end();
|
||||
@ -1114,6 +1119,9 @@ static void clean_up_mutexes()
|
||||
(void) pthread_mutex_destroy(&LOCK_bytes_sent);
|
||||
(void) pthread_mutex_destroy(&LOCK_bytes_received);
|
||||
(void) pthread_mutex_destroy(&LOCK_user_conn);
|
||||
#ifdef HAVE_OPENSSL
|
||||
(void) pthread_mutex_destroy(&LOCK_des_key_file);
|
||||
#endif
|
||||
#ifdef HAVE_REPLICATION
|
||||
(void) pthread_mutex_destroy(&LOCK_rpl_status);
|
||||
(void) pthread_cond_destroy(&COND_rpl_status);
|
||||
@ -2617,6 +2625,9 @@ static int init_thread_environment()
|
||||
(void) pthread_mutex_init(&LOCK_global_system_variables, MY_MUTEX_INIT_FAST);
|
||||
(void) pthread_mutex_init(&LOCK_global_read_lock, MY_MUTEX_INIT_FAST);
|
||||
(void) pthread_mutex_init(&LOCK_uuid_generator, MY_MUTEX_INIT_FAST);
|
||||
#ifdef HAVE_OPENSSL
|
||||
(void) pthread_mutex_init(&LOCK_des_key_file,MY_MUTEX_INIT_FAST);
|
||||
#endif
|
||||
(void) my_rwlock_init(&LOCK_sys_init_connect, NULL);
|
||||
(void) my_rwlock_init(&LOCK_sys_init_slave, NULL);
|
||||
(void) my_rwlock_init(&LOCK_grant, NULL);
|
||||
|
@ -319,7 +319,7 @@ static void set_param_float(Item_param *param, uchar **pos, ulong len)
|
||||
return;
|
||||
float4get(data,*pos);
|
||||
#else
|
||||
data= *(float*) *pos;
|
||||
floatget(data, *pos);
|
||||
#endif
|
||||
param->set_double((double) data);
|
||||
*pos+= 4;
|
||||
@ -333,7 +333,7 @@ static void set_param_double(Item_param *param, uchar **pos, ulong len)
|
||||
return;
|
||||
float8get(data,*pos);
|
||||
#else
|
||||
data= *(double*) *pos;
|
||||
doubleget(data, *pos);
|
||||
#endif
|
||||
param->set_double((double) data);
|
||||
*pos+= 8;
|
||||
@ -601,10 +601,8 @@ static bool insert_params_withlog(Prepared_statement *stmt, uchar *null_array,
|
||||
Item_param **begin= stmt->param_array;
|
||||
Item_param **end= begin + stmt->param_count;
|
||||
uint32 length= 0;
|
||||
|
||||
String str;
|
||||
const String *res;
|
||||
|
||||
DBUG_ENTER("insert_params_withlog");
|
||||
|
||||
if (query->copy(stmt->query, stmt->query_length, default_charset_info))
|
||||
|
@ -1207,14 +1207,18 @@ JOIN::exec()
|
||||
else
|
||||
{
|
||||
error= (int) result->send_eof();
|
||||
send_records=1;
|
||||
send_records= ((select_options & OPTION_FOUND_ROWS) ? 1 :
|
||||
thd->sent_row_count);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
error=(int) result->send_eof();
|
||||
send_records= 0;
|
||||
}
|
||||
}
|
||||
/* Single select (without union and limit) always returns 1 row */
|
||||
thd->limit_found_rows= 1;
|
||||
/* Single select (without union) always returns 0 or 1 row */
|
||||
thd->limit_found_rows= send_records;
|
||||
thd->examined_row_count= 0;
|
||||
DBUG_VOID_RETURN;
|
||||
}
|
||||
@ -5182,6 +5186,7 @@ static void add_not_null_conds(JOIN *join)
|
||||
if (tab->ref.null_rejecting & (1 << keypart))
|
||||
{
|
||||
Item *item= tab->ref.items[keypart];
|
||||
Item *notnull;
|
||||
DBUG_ASSERT(item->type() == Item::FIELD_ITEM);
|
||||
Item_field *not_null_item= (Item_field*)item;
|
||||
JOIN_TAB *referred_tab= not_null_item->field->table->reginfo.join_tab;
|
||||
@ -5192,7 +5197,6 @@ static void add_not_null_conds(JOIN *join)
|
||||
*/
|
||||
if (!referred_tab || referred_tab->join != join)
|
||||
continue;
|
||||
Item *notnull;
|
||||
if (!(notnull= new Item_func_isnotnull(not_null_item)))
|
||||
DBUG_VOID_RETURN;
|
||||
/*
|
||||
|
@ -7457,7 +7457,7 @@ static void test_explain_bug()
|
||||
verify_prepare_field(result, 3, "type", "", MYSQL_TYPE_VAR_STRING,
|
||||
"", "", "", 10, 0);
|
||||
|
||||
verify_prepare_field(result, 4, "possible_keys", "", MYSQL_TYPE_VAR_STRING,
|
||||
verify_prepare_field(result, 4, "possible_keys", "", MYSQL_TYPE_BLOB,
|
||||
"", "", "", NAME_LEN*MAX_KEY, 0);
|
||||
|
||||
verify_prepare_field(result, 5, "key", "", MYSQL_TYPE_VAR_STRING,
|
||||
@ -7474,13 +7474,13 @@ static void test_explain_bug()
|
||||
"", "", NAME_LEN*MAX_KEY, 0);
|
||||
}
|
||||
|
||||
verify_prepare_field(result, 7, "ref", "", MYSQL_TYPE_VAR_STRING,
|
||||
verify_prepare_field(result, 7, "ref", "", MYSQL_TYPE_BLOB,
|
||||
"", "", "", NAME_LEN*16, 0);
|
||||
|
||||
verify_prepare_field(result, 8, "rows", "", MYSQL_TYPE_LONGLONG,
|
||||
"", "", "", 10, 0);
|
||||
|
||||
verify_prepare_field(result, 9, "Extra", "", MYSQL_TYPE_VAR_STRING,
|
||||
verify_prepare_field(result, 9, "Extra", "", MYSQL_TYPE_BLOB,
|
||||
"", "", "", 255, 0);
|
||||
|
||||
mysql_free_result(result);
|
||||
|
Loading…
x
Reference in New Issue
Block a user