Merging
BitKeeper/etc/logging_ok: auto-union include/mysql.h: Auto merged sql/field.cc: Auto merged sql/field.h: Auto merged sql/sql_show.cc: Auto merged
This commit is contained in:
commit
d0598c88d0
@ -122,7 +122,8 @@ typedef struct st_mysql_data {
|
|||||||
struct st_mysql_options {
|
struct st_mysql_options {
|
||||||
unsigned int connect_timeout,client_flag;
|
unsigned int connect_timeout,client_flag;
|
||||||
unsigned int port;
|
unsigned int port;
|
||||||
char *host,*init_command,*user,*password,*unix_socket,*db;
|
char *host,*user,*password,*unix_socket,*db;
|
||||||
|
struct st_dynamic_array *init_commands;
|
||||||
char *my_cnf_file,*my_cnf_group, *charset_dir, *charset_name;
|
char *my_cnf_file,*my_cnf_group, *charset_dir, *charset_name;
|
||||||
char *ssl_key; /* PEM key file */
|
char *ssl_key; /* PEM key file */
|
||||||
char *ssl_cert; /* PEM cert file */
|
char *ssl_cert; /* PEM cert file */
|
||||||
|
@ -935,6 +935,27 @@ static const char *default_options[]=
|
|||||||
static TYPELIB option_types={array_elements(default_options)-1,
|
static TYPELIB option_types={array_elements(default_options)-1,
|
||||||
"options",default_options};
|
"options",default_options};
|
||||||
|
|
||||||
|
static int add_init_command(struct st_mysql_options *options, const char *cmd)
|
||||||
|
{
|
||||||
|
char **ptr, *tmp;
|
||||||
|
|
||||||
|
if (!options->init_commands)
|
||||||
|
{
|
||||||
|
options->init_commands= (DYNAMIC_ARRAY*)my_malloc(sizeof(DYNAMIC_ARRAY),
|
||||||
|
MYF(MY_WME));
|
||||||
|
init_dynamic_array(options->init_commands,sizeof(char*),0,5 CALLER_INFO);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(tmp= my_strdup(cmd,MYF(MY_WME))) ||
|
||||||
|
insert_dynamic(options->init_commands, &tmp))
|
||||||
|
{
|
||||||
|
my_free(tmp, MYF(MY_ALLOW_ZERO_PTR));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void mysql_read_default_options(struct st_mysql_options *options,
|
static void mysql_read_default_options(struct st_mysql_options *options,
|
||||||
const char *filename,const char *group)
|
const char *filename,const char *group)
|
||||||
{
|
{
|
||||||
@ -1003,11 +1024,7 @@ static void mysql_read_default_options(struct st_mysql_options *options,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 8: /* init-command */
|
case 8: /* init-command */
|
||||||
if (opt_arg)
|
add_init_command(options,opt_arg);
|
||||||
{
|
|
||||||
my_free(options->init_command,MYF(MY_ALLOW_ZERO_PTR));
|
|
||||||
options->init_command=my_strdup(opt_arg,MYF(MY_WME));
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 9: /* host */
|
case 9: /* host */
|
||||||
if (opt_arg)
|
if (opt_arg)
|
||||||
@ -2328,13 +2345,29 @@ Try also with PIPE or TCP/IP
|
|||||||
net->compress=1;
|
net->compress=1;
|
||||||
if (db && mysql_select_db(mysql,db))
|
if (db && mysql_select_db(mysql,db))
|
||||||
goto error;
|
goto error;
|
||||||
if (mysql->options.init_command)
|
|
||||||
|
if (mysql->options.init_commands)
|
||||||
{
|
{
|
||||||
|
DYNAMIC_ARRAY *init_commands= mysql->options.init_commands;
|
||||||
|
char **ptr= (char**)init_commands->buffer;
|
||||||
|
char **end= ptr + init_commands->elements;
|
||||||
|
|
||||||
my_bool reconnect=mysql->reconnect;
|
my_bool reconnect=mysql->reconnect;
|
||||||
mysql->reconnect=0;
|
mysql->reconnect=0;
|
||||||
if (mysql_query(mysql,mysql->options.init_command))
|
|
||||||
|
for (; ptr<end; ptr++)
|
||||||
|
{
|
||||||
|
MYSQL_RES *res;
|
||||||
|
if (mysql_query(mysql,*ptr))
|
||||||
goto error;
|
goto error;
|
||||||
mysql_free_result(mysql_use_result(mysql));
|
if (mysql->fields)
|
||||||
|
{
|
||||||
|
if (!(res= mysql_use_result(mysql)))
|
||||||
|
goto error;
|
||||||
|
mysql_free_result(res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mysql->reconnect=reconnect;
|
mysql->reconnect=reconnect;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2579,7 +2612,6 @@ mysql_close(MYSQL *mysql)
|
|||||||
my_free(mysql->user,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->user,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
my_free(mysql->passwd,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->passwd,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
my_free(mysql->db,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->db,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
my_free(mysql->options.init_command,MYF(MY_ALLOW_ZERO_PTR));
|
|
||||||
my_free(mysql->options.user,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->options.user,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
my_free(mysql->options.host,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->options.host,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
my_free(mysql->options.password,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->options.password,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
@ -2589,6 +2621,11 @@ mysql_close(MYSQL *mysql)
|
|||||||
my_free(mysql->options.my_cnf_group,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->options.my_cnf_group,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
my_free(mysql->options.charset_dir,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->options.charset_dir,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
my_free(mysql->options.charset_name,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->options.charset_name,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
|
if (mysql->options.init_commands)
|
||||||
|
{
|
||||||
|
delete_dynamic(mysql->options.init_commands);
|
||||||
|
my_free((char*)mysql->options.init_commands,MYF(MY_WME));
|
||||||
|
}
|
||||||
#ifdef HAVE_OPENSSL
|
#ifdef HAVE_OPENSSL
|
||||||
mysql_ssl_free(mysql);
|
mysql_ssl_free(mysql);
|
||||||
#endif /* HAVE_OPENSSL */
|
#endif /* HAVE_OPENSSL */
|
||||||
@ -3334,8 +3371,7 @@ mysql_options(MYSQL *mysql,enum mysql_option option, const char *arg)
|
|||||||
mysql->options.client_flag&= ~CLIENT_LOCAL_FILES;
|
mysql->options.client_flag&= ~CLIENT_LOCAL_FILES;
|
||||||
break;
|
break;
|
||||||
case MYSQL_INIT_COMMAND:
|
case MYSQL_INIT_COMMAND:
|
||||||
my_free(mysql->options.init_command,MYF(MY_ALLOW_ZERO_PTR));
|
add_init_command(&mysql->options,arg);
|
||||||
mysql->options.init_command=my_strdup(arg,MYF(MY_WME));
|
|
||||||
break;
|
break;
|
||||||
case MYSQL_READ_DEFAULT_FILE:
|
case MYSQL_READ_DEFAULT_FILE:
|
||||||
my_free(mysql->options.my_cnf_file,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->options.my_cnf_file,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
|
@ -219,6 +219,27 @@ static const char *default_options[]=
|
|||||||
static TYPELIB option_types={array_elements(default_options)-1,
|
static TYPELIB option_types={array_elements(default_options)-1,
|
||||||
"options",default_options};
|
"options",default_options};
|
||||||
|
|
||||||
|
static int add_init_command(struct st_mysql_options *options, const char *cmd)
|
||||||
|
{
|
||||||
|
char **ptr, *tmp;
|
||||||
|
|
||||||
|
if (!options->init_commands)
|
||||||
|
{
|
||||||
|
options->init_commands= (DYNAMIC_ARRAY*)my_malloc(sizeof(DYNAMIC_ARRAY),
|
||||||
|
MYF(MY_WME));
|
||||||
|
init_dynamic_array(options->init_commands,sizeof(char*),0,5 CALLER_INFO);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(tmp= my_strdup(cmd,MYF(MY_WME))) ||
|
||||||
|
insert_dynamic(options->init_commands, &tmp))
|
||||||
|
{
|
||||||
|
my_free(tmp, MYF(MY_ALLOW_ZERO_PTR));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void mysql_read_default_options(struct st_mysql_options *options,
|
static void mysql_read_default_options(struct st_mysql_options *options,
|
||||||
const char *filename,const char *group)
|
const char *filename,const char *group)
|
||||||
{
|
{
|
||||||
@ -288,11 +309,7 @@ static void mysql_read_default_options(struct st_mysql_options *options,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 8: /* init-command */
|
case 8: /* init-command */
|
||||||
if (opt_arg)
|
add_init_command(options,opt_arg);
|
||||||
{
|
|
||||||
my_free(options->init_command,MYF(MY_ALLOW_ZERO_PTR));
|
|
||||||
options->init_command=my_strdup(opt_arg,MYF(MY_WME));
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case 9: /* host */
|
case 9: /* host */
|
||||||
if (opt_arg)
|
if (opt_arg)
|
||||||
@ -589,7 +606,6 @@ mysql_close(MYSQL *mysql)
|
|||||||
DBUG_ENTER("mysql_close");
|
DBUG_ENTER("mysql_close");
|
||||||
if (mysql) /* Some simple safety */
|
if (mysql) /* Some simple safety */
|
||||||
{
|
{
|
||||||
my_free(mysql->options.init_command,MYF(MY_ALLOW_ZERO_PTR));
|
|
||||||
my_free(mysql->options.user,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->options.user,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
my_free(mysql->options.host,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->options.host,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
my_free(mysql->options.password,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->options.password,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
@ -599,6 +615,11 @@ mysql_close(MYSQL *mysql)
|
|||||||
my_free(mysql->options.my_cnf_group,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->options.my_cnf_group,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
my_free(mysql->options.charset_dir,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->options.charset_dir,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
my_free(mysql->options.charset_name,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->options.charset_name,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
|
if (mysql->options.init_commands)
|
||||||
|
{
|
||||||
|
delete_dynamic(mysql->options.init_commands);
|
||||||
|
my_free((char*)mysql->options.init_commands,MYF(MY_WME));
|
||||||
|
}
|
||||||
/* Clear pointers for better safety */
|
/* Clear pointers for better safety */
|
||||||
bzero((char*) &mysql->options,sizeof(mysql->options));
|
bzero((char*) &mysql->options,sizeof(mysql->options));
|
||||||
#ifdef HAVE_OPENSSL
|
#ifdef HAVE_OPENSSL
|
||||||
@ -1161,8 +1182,7 @@ mysql_options(MYSQL *mysql,enum mysql_option option, const char *arg)
|
|||||||
mysql->options.client_flag&= ~CLIENT_LOCAL_FILES;
|
mysql->options.client_flag&= ~CLIENT_LOCAL_FILES;
|
||||||
break;
|
break;
|
||||||
case MYSQL_INIT_COMMAND:
|
case MYSQL_INIT_COMMAND:
|
||||||
my_free(mysql->options.init_command,MYF(MY_ALLOW_ZERO_PTR));
|
add_init_command(&mysql->options,arg);
|
||||||
mysql->options.init_command=my_strdup(arg,MYF(MY_WME));
|
|
||||||
break;
|
break;
|
||||||
case MYSQL_READ_DEFAULT_FILE:
|
case MYSQL_READ_DEFAULT_FILE:
|
||||||
my_free(mysql->options.my_cnf_file,MYF(MY_ALLOW_ZERO_PTR));
|
my_free(mysql->options.my_cnf_file,MYF(MY_ALLOW_ZERO_PTR));
|
||||||
|
199
sql/field.cc
199
sql/field.cc
@ -199,7 +199,7 @@ void Field::copy_from_tmp(int row_offset)
|
|||||||
bool Field::send_binary(Protocol *protocol)
|
bool Field::send_binary(Protocol *protocol)
|
||||||
{
|
{
|
||||||
char buff[MAX_FIELD_WIDTH];
|
char buff[MAX_FIELD_WIDTH];
|
||||||
String tmp(buff,sizeof(buff),default_charset_info);
|
String tmp(buff,sizeof(buff),charset());
|
||||||
val_str(&tmp,&tmp);
|
val_str(&tmp,&tmp);
|
||||||
return protocol->store(tmp.ptr(), tmp.length());
|
return protocol->store(tmp.ptr(), tmp.length());
|
||||||
}
|
}
|
||||||
@ -207,11 +207,17 @@ bool Field::send_binary(Protocol *protocol)
|
|||||||
|
|
||||||
void Field_num::add_zerofill_and_unsigned(String &res) const
|
void Field_num::add_zerofill_and_unsigned(String &res) const
|
||||||
{
|
{
|
||||||
res.length((uint) strlen(res.ptr())); // Fix length
|
uint oldlen=res.length();
|
||||||
if (unsigned_flag)
|
if (oldlen < res.alloced_length())
|
||||||
res.append(" unsigned");
|
{
|
||||||
if (zerofill)
|
uint len=res.alloced_length()-oldlen;
|
||||||
res.append(" zerofill");
|
char *end=(char*)(res.ptr()+oldlen);
|
||||||
|
CHARSET_INFO *cs=res.charset();
|
||||||
|
len=cs->snprintf(cs,end,len,"%s%s",
|
||||||
|
unsigned_flag ? " unsigned" : "",
|
||||||
|
zerofill ? " zerofill" : "");
|
||||||
|
res.length(len+oldlen);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Field_num::make_field(Send_field *field)
|
void Field_num::make_field(Send_field *field)
|
||||||
@ -241,6 +247,22 @@ void Field_str::make_field(Send_field *field)
|
|||||||
field->decimals=0;
|
field->decimals=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Field_str::add_binary_or_charset(String &res) const
|
||||||
|
{
|
||||||
|
uint oldlen=res.length();
|
||||||
|
if (oldlen < res.alloced_length())
|
||||||
|
{
|
||||||
|
CHARSET_INFO *cs=res.charset();
|
||||||
|
uint len=res.alloced_length() - oldlen;
|
||||||
|
char *end=(char*)(res.ptr()+oldlen);
|
||||||
|
if (binary())
|
||||||
|
len=cs->snprintf(cs,end,len," binary");
|
||||||
|
else
|
||||||
|
len=cs->snprintf(cs,end,len," character set %s",field_charset->name);
|
||||||
|
res.length(oldlen+len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
uint Field::fill_cache_field(CACHE_FIELD *copy)
|
uint Field::fill_cache_field(CACHE_FIELD *copy)
|
||||||
{
|
{
|
||||||
@ -317,6 +339,19 @@ bool Field::optimize_range(uint idx)
|
|||||||
return test(table->file->index_flags(idx) & HA_READ_NEXT);
|
return test(table->file->index_flags(idx) & HA_READ_NEXT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
Functions for the Field_null
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
void Field_null::sql_type(String &res) const
|
||||||
|
{
|
||||||
|
CHARSET_INFO *cs=res.charset();
|
||||||
|
uint len;
|
||||||
|
len=cs->snprintf(cs,(char*)res.ptr(),res.alloced_length(),"null");
|
||||||
|
res.length(len);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
Functions for the Field_decimal class
|
Functions for the Field_decimal class
|
||||||
This is an number stored as a pre-space (or pre-zero) string
|
This is an number stored as a pre-space (or pre-zero) string
|
||||||
@ -889,12 +924,16 @@ void Field_decimal::sort_string(char *to,uint length)
|
|||||||
|
|
||||||
void Field_decimal::sql_type(String &res) const
|
void Field_decimal::sql_type(String &res) const
|
||||||
{
|
{
|
||||||
|
CHARSET_INFO *cs=res.charset();
|
||||||
uint tmp=field_length;
|
uint tmp=field_length;
|
||||||
|
uint len;
|
||||||
if (!unsigned_flag)
|
if (!unsigned_flag)
|
||||||
tmp--;
|
tmp--;
|
||||||
if (dec)
|
if (dec)
|
||||||
tmp--;
|
tmp--;
|
||||||
sprintf((char*) res.ptr(),"decimal(%d,%d)",tmp,dec);
|
len=cs->snprintf(cs,(char*) res.ptr(),res.alloced_length(),
|
||||||
|
"decimal(%d,%d)",tmp,dec);
|
||||||
|
res.length(len);
|
||||||
add_zerofill_and_unsigned(res);
|
add_zerofill_and_unsigned(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1093,7 +1132,10 @@ void Field_tiny::sort_string(char *to,uint length __attribute__((unused)))
|
|||||||
|
|
||||||
void Field_tiny::sql_type(String &res) const
|
void Field_tiny::sql_type(String &res) const
|
||||||
{
|
{
|
||||||
sprintf((char*) res.ptr(),"tinyint(%d)",(int) field_length);
|
CHARSET_INFO *cs=res.charset();
|
||||||
|
uint len=cs->snprintf(cs,(char*) res.ptr(),res.alloced_length(),
|
||||||
|
"tinyint(%d)",(int) field_length);
|
||||||
|
res.length(len);
|
||||||
add_zerofill_and_unsigned(res);
|
add_zerofill_and_unsigned(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1364,7 +1406,10 @@ void Field_short::sort_string(char *to,uint length __attribute__((unused)))
|
|||||||
|
|
||||||
void Field_short::sql_type(String &res) const
|
void Field_short::sql_type(String &res) const
|
||||||
{
|
{
|
||||||
sprintf((char*) res.ptr(),"smallint(%d)",(int) field_length);
|
CHARSET_INFO *cs=res.charset();
|
||||||
|
uint len=cs->snprintf(cs,(char*) res.ptr(),res.alloced_length(),
|
||||||
|
"smallint(%d)",(int) field_length);
|
||||||
|
res.length(len);
|
||||||
add_zerofill_and_unsigned(res);
|
add_zerofill_and_unsigned(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1579,7 +1624,10 @@ void Field_medium::sort_string(char *to,uint length __attribute__((unused)))
|
|||||||
|
|
||||||
void Field_medium::sql_type(String &res) const
|
void Field_medium::sql_type(String &res) const
|
||||||
{
|
{
|
||||||
sprintf((char*) res.ptr(),"mediumint(%d)",(int) field_length);
|
CHARSET_INFO *cs=res.charset();
|
||||||
|
uint len=cs->snprintf(cs,(char*) res.ptr(),res.alloced_length(),
|
||||||
|
"mediumint(%d)",(int) field_length);
|
||||||
|
res.length(len);
|
||||||
add_zerofill_and_unsigned(res);
|
add_zerofill_and_unsigned(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1840,7 +1888,10 @@ void Field_long::sort_string(char *to,uint length __attribute__((unused)))
|
|||||||
|
|
||||||
void Field_long::sql_type(String &res) const
|
void Field_long::sql_type(String &res) const
|
||||||
{
|
{
|
||||||
sprintf((char*) res.ptr(),"int(%d)",(int) field_length);
|
CHARSET_INFO *cs=res.charset();
|
||||||
|
uint len=cs->snprintf(cs,(char*) res.ptr(),res.alloced_length(),
|
||||||
|
"int(%d)",(int) field_length);
|
||||||
|
res.length(len);
|
||||||
add_zerofill_and_unsigned(res);
|
add_zerofill_and_unsigned(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2069,7 +2120,10 @@ void Field_longlong::sort_string(char *to,uint length __attribute__((unused)))
|
|||||||
|
|
||||||
void Field_longlong::sql_type(String &res) const
|
void Field_longlong::sql_type(String &res) const
|
||||||
{
|
{
|
||||||
sprintf((char*) res.ptr(),"bigint(%d)",(int) field_length);
|
CHARSET_INFO *cs=res.charset();
|
||||||
|
uint len=cs->snprintf(cs,(char*) res.ptr(),res.alloced_length(),
|
||||||
|
"bigint(%d)",(int) field_length);
|
||||||
|
res.length(len);
|
||||||
add_zerofill_and_unsigned(res);
|
add_zerofill_and_unsigned(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2333,10 +2387,18 @@ bool Field_float::send_binary(Protocol *protocol)
|
|||||||
|
|
||||||
void Field_float::sql_type(String &res) const
|
void Field_float::sql_type(String &res) const
|
||||||
{
|
{
|
||||||
|
CHARSET_INFO *cs=res.charset();
|
||||||
|
uint len;
|
||||||
if (dec == NOT_FIXED_DEC)
|
if (dec == NOT_FIXED_DEC)
|
||||||
strmov((char*) res.ptr(),"float");
|
{
|
||||||
|
len=cs->snprintf(cs,(char*) res.ptr(),res.alloced_length(),"float");
|
||||||
|
}
|
||||||
else
|
else
|
||||||
sprintf((char*) res.ptr(),"float(%d,%d)",(int) field_length,dec);
|
{
|
||||||
|
len=cs->snprintf(cs,(char*) res.ptr(),res.alloced_length(),
|
||||||
|
"float(%d,%d)",(int) field_length,dec);
|
||||||
|
}
|
||||||
|
res.length(len);
|
||||||
add_zerofill_and_unsigned(res);
|
add_zerofill_and_unsigned(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2585,10 +2647,18 @@ void Field_double::sort_string(char *to,uint length __attribute__((unused)))
|
|||||||
|
|
||||||
void Field_double::sql_type(String &res) const
|
void Field_double::sql_type(String &res) const
|
||||||
{
|
{
|
||||||
|
CHARSET_INFO *cs=res.charset();
|
||||||
|
uint len;
|
||||||
if (dec == NOT_FIXED_DEC)
|
if (dec == NOT_FIXED_DEC)
|
||||||
strmov((char*) res.ptr(),"double");
|
{
|
||||||
|
len=cs->snprintf(cs,(char*) res.ptr(),res.alloced_length(),"double");
|
||||||
|
}
|
||||||
else
|
else
|
||||||
sprintf((char*) res.ptr(),"double(%d,%d)",(int) field_length,dec);
|
{
|
||||||
|
len=cs->snprintf(cs,(char*) res.ptr(),res.alloced_length(),
|
||||||
|
"double(%d,%d)",(int) field_length,dec);
|
||||||
|
}
|
||||||
|
res.length(len);
|
||||||
add_zerofill_and_unsigned(res);
|
add_zerofill_and_unsigned(res);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2919,7 +2989,9 @@ void Field_timestamp::sort_string(char *to,uint length __attribute__((unused)))
|
|||||||
|
|
||||||
void Field_timestamp::sql_type(String &res) const
|
void Field_timestamp::sql_type(String &res) const
|
||||||
{
|
{
|
||||||
res.set("timestamp", 9, default_charset_info);
|
CHARSET_INFO *cs=res.charset();
|
||||||
|
uint len=cs->snprintf(cs,(char*)res.ptr(),res.alloced_length(),"timestamp");
|
||||||
|
res.length(len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3111,7 +3183,9 @@ void Field_time::sort_string(char *to,uint length __attribute__((unused)))
|
|||||||
|
|
||||||
void Field_time::sql_type(String &res) const
|
void Field_time::sql_type(String &res) const
|
||||||
{
|
{
|
||||||
res.set("time",4,default_charset_info);
|
CHARSET_INFO *cs=res.charset();
|
||||||
|
uint len=cs->snprintf(cs,(char*)res.ptr(),res.alloced_length(),"time");
|
||||||
|
res.length(len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -3201,9 +3275,10 @@ String *Field_year::val_str(String *val_buffer,
|
|||||||
|
|
||||||
void Field_year::sql_type(String &res) const
|
void Field_year::sql_type(String &res) const
|
||||||
{
|
{
|
||||||
ulong length=my_sprintf((char*) res.ptr(),
|
CHARSET_INFO *cs=res.charset();
|
||||||
((char*) res.ptr(),"year(%d)",(int) field_length));
|
ulong len=cs->snprintf(cs,(char*)res.ptr(),res.alloced_length(),
|
||||||
res.length(length);
|
"year(%d)",(int) field_length);
|
||||||
|
res.length(len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3373,7 +3448,9 @@ void Field_date::sort_string(char *to,uint length __attribute__((unused)))
|
|||||||
|
|
||||||
void Field_date::sql_type(String &res) const
|
void Field_date::sql_type(String &res) const
|
||||||
{
|
{
|
||||||
res.set("date",4,default_charset_info);
|
CHARSET_INFO *cs=res.charset();
|
||||||
|
uint len=cs->snprintf(cs,(char*)res.ptr(),res.alloced_length(),"date");
|
||||||
|
res.length(len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -3536,7 +3613,9 @@ void Field_newdate::sort_string(char *to,uint length __attribute__((unused)))
|
|||||||
|
|
||||||
void Field_newdate::sql_type(String &res) const
|
void Field_newdate::sql_type(String &res) const
|
||||||
{
|
{
|
||||||
res.set("date",4,default_charset_info);
|
CHARSET_INFO *cs=res.charset();
|
||||||
|
uint len=cs->snprintf(cs,(char*)res.ptr(),res.alloced_length(),"date");
|
||||||
|
res.length(len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3760,7 +3839,9 @@ void Field_datetime::sort_string(char *to,uint length __attribute__((unused)))
|
|||||||
|
|
||||||
void Field_datetime::sql_type(String &res) const
|
void Field_datetime::sql_type(String &res) const
|
||||||
{
|
{
|
||||||
res.set("datetime",8,default_charset_info);
|
CHARSET_INFO *cs=res.charset();
|
||||||
|
uint len=cs->snprintf(cs,(char*)res.ptr(),res.alloced_length(),"datetime");
|
||||||
|
res.length(len);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -3889,21 +3970,16 @@ void Field_string::sort_string(char *to,uint length)
|
|||||||
|
|
||||||
void Field_string::sql_type(String &res) const
|
void Field_string::sql_type(String &res) const
|
||||||
{
|
{
|
||||||
ulong length= my_sprintf((char*) res.ptr(),
|
CHARSET_INFO *cs=res.charset();
|
||||||
((char*) res.ptr(), "%s(%d)",
|
ulong length= cs->snprintf(cs,(char*) res.ptr(),
|
||||||
|
res.alloced_length(), "%s(%d)",
|
||||||
(field_length > 3 &&
|
(field_length > 3 &&
|
||||||
(table->db_options_in_use &
|
(table->db_options_in_use &
|
||||||
HA_OPTION_PACK_RECORD) ?
|
HA_OPTION_PACK_RECORD) ?
|
||||||
"varchar" : "char"),
|
"varchar" : "char"),
|
||||||
(int) field_length));
|
(int) field_length);
|
||||||
res.length((uint) length);
|
res.length(length);
|
||||||
if (binary())
|
add_binary_or_charset(res);
|
||||||
res.append(" binary");
|
|
||||||
else
|
|
||||||
{
|
|
||||||
res.append(" character set ");
|
|
||||||
res.append(field_charset->name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -4091,17 +4167,12 @@ void Field_varstring::sort_string(char *to,uint length)
|
|||||||
|
|
||||||
void Field_varstring::sql_type(String &res) const
|
void Field_varstring::sql_type(String &res) const
|
||||||
{
|
{
|
||||||
ulong length= my_sprintf((char*) res.ptr(),
|
CHARSET_INFO *cs=res.charset();
|
||||||
((char*) res.ptr(),"varchar(%u)",
|
ulong length= cs->snprintf(cs,(char*) res.ptr(),
|
||||||
field_length));
|
res.alloced_length(),"varchar(%u)",
|
||||||
res.length((uint) length);
|
field_length);
|
||||||
if (binary())
|
res.length(length);
|
||||||
res.append(" binary");
|
add_binary_or_charset(res);
|
||||||
else
|
|
||||||
{
|
|
||||||
res.append(" character set ");
|
|
||||||
res.append(field_charset->name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
char *Field_varstring::pack(char *to, const char *from, uint max_length)
|
char *Field_varstring::pack(char *to, const char *from, uint max_length)
|
||||||
@ -4597,20 +4668,22 @@ void Field_blob::sort_string(char *to,uint length)
|
|||||||
|
|
||||||
void Field_blob::sql_type(String &res) const
|
void Field_blob::sql_type(String &res) const
|
||||||
{
|
{
|
||||||
|
CHARSET_INFO *cs=res.charset();
|
||||||
const char *str;
|
const char *str;
|
||||||
|
uint len;
|
||||||
switch (packlength) {
|
switch (packlength) {
|
||||||
default: str="tiny"; break;
|
default: str="tiny"; break;
|
||||||
case 2: str=""; break;
|
case 2: str=""; break;
|
||||||
case 3: str="medium"; break;
|
case 3: str="medium"; break;
|
||||||
case 4: str="long"; break;
|
case 4: str="long"; break;
|
||||||
}
|
}
|
||||||
res.set(str,(uint) strlen(str),my_charset_latin1);
|
|
||||||
res.append(binary() ? "blob" : "text");
|
len=cs->snprintf(cs,(char*)res.ptr(),res.alloced_length(),"%s%s%s%s",
|
||||||
if (!binary())
|
str,
|
||||||
{
|
binary() ? "blob" : "text",
|
||||||
res.append(" character set ");
|
binary() ? "" : " character set ",
|
||||||
res.append(field_charset->name);
|
binary() ? "" : field_charset->name);
|
||||||
}
|
res.length(len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -4982,15 +5055,7 @@ void Field_enum::sql_type(String &res) const
|
|||||||
flag=1;
|
flag=1;
|
||||||
}
|
}
|
||||||
res.append(')');
|
res.append(')');
|
||||||
if (binary())
|
add_binary_or_charset(res);
|
||||||
{
|
|
||||||
res.append(" binary");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
res.append(" character set ");
|
|
||||||
res.append(field_charset->name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -5112,15 +5177,7 @@ void Field_set::sql_type(String &res) const
|
|||||||
flag=1;
|
flag=1;
|
||||||
}
|
}
|
||||||
res.append(')');
|
res.append(')');
|
||||||
if (binary())
|
add_binary_or_charset(res);
|
||||||
{
|
|
||||||
res.append(" binary");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
res.append(" character set ");
|
|
||||||
res.append(field_charset->name);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* returns 1 if the fields are equally defined */
|
/* returns 1 if the fields are equally defined */
|
||||||
|
@ -262,6 +262,7 @@ public:
|
|||||||
unireg_check_arg, field_name_arg, table_arg)
|
unireg_check_arg, field_name_arg, table_arg)
|
||||||
{ field_charset=charset; }
|
{ field_charset=charset; }
|
||||||
Item_result result_type () const { return STRING_RESULT; }
|
Item_result result_type () const { return STRING_RESULT; }
|
||||||
|
void add_binary_or_charset(String &res) const;
|
||||||
uint decimals() const { return NOT_FIXED_DEC; }
|
uint decimals() const { return NOT_FIXED_DEC; }
|
||||||
void make_field(Send_field *);
|
void make_field(Send_field *);
|
||||||
uint size_of() const { return sizeof(*this); }
|
uint size_of() const { return sizeof(*this); }
|
||||||
@ -556,7 +557,7 @@ public:
|
|||||||
int cmp(const char *a, const char *b) { return 0;}
|
int cmp(const char *a, const char *b) { return 0;}
|
||||||
void sort_string(char *buff, uint length) {}
|
void sort_string(char *buff, uint length) {}
|
||||||
uint32 pack_length() const { return 0; }
|
uint32 pack_length() const { return 0; }
|
||||||
void sql_type(String &str) const { str.set("null",4,my_thd_charset); }
|
void sql_type(String &str) const;
|
||||||
uint size_of() const { return sizeof(*this); }
|
uint size_of() const { return sizeof(*this); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -711,7 +711,7 @@ mysqld_show_fields(THD *thd, TABLE_LIST *table_list,const char *wild,
|
|||||||
{
|
{
|
||||||
byte *pos;
|
byte *pos;
|
||||||
uint flags=field->flags;
|
uint flags=field->flags;
|
||||||
String type(tmp,sizeof(tmp),default_charset_info);
|
String type(tmp,sizeof(tmp),current_thd->thd_charset);
|
||||||
uint col_access;
|
uint col_access;
|
||||||
bool null_default_value=0;
|
bool null_default_value=0;
|
||||||
|
|
||||||
|
@ -126,6 +126,8 @@ typedef long long longlong;
|
|||||||
#include <m_ctype.h>
|
#include <m_ctype.h>
|
||||||
#include <m_string.h> // To get strmov()
|
#include <m_string.h> // To get strmov()
|
||||||
|
|
||||||
|
static pthread_mutex_t LOCK_hostname;
|
||||||
|
|
||||||
#ifdef HAVE_DLOPEN
|
#ifdef HAVE_DLOPEN
|
||||||
|
|
||||||
/* These must be right or mysqld will not find the symbol! */
|
/* These must be right or mysqld will not find the symbol! */
|
||||||
@ -282,8 +284,8 @@ char *metaphon(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||||||
|
|
||||||
for (n = ntrans + 1, n_end = ntrans + sizeof(ntrans)-2;
|
for (n = ntrans + 1, n_end = ntrans + sizeof(ntrans)-2;
|
||||||
word != w_end && n < n_end; word++ )
|
word != w_end && n < n_end; word++ )
|
||||||
if ( isalpha ( *word ))
|
if ( my_isalpha ( my_charset_latin1, *word ))
|
||||||
*n++ = toupper ( *word );
|
*n++ = my_toupper ( my_charset_latin1, *word );
|
||||||
|
|
||||||
if ( n == ntrans + 1 ) /* return empty string if 0 bytes */
|
if ( n == ntrans + 1 ) /* return empty string if 0 bytes */
|
||||||
{
|
{
|
||||||
@ -583,6 +585,8 @@ longlong myfunc_int(UDF_INIT *initid, UDF_ARGS *args, char *is_null,
|
|||||||
case REAL_RESULT: // Add numers as longlong
|
case REAL_RESULT: // Add numers as longlong
|
||||||
val += (longlong) *((double*) args->args[i]);
|
val += (longlong) *((double*) args->args[i]);
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return val;
|
return val;
|
||||||
@ -642,8 +646,6 @@ longlong sequence(UDF_INIT *initid, UDF_ARGS *args, char *is_null,
|
|||||||
**
|
**
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#if defined(HAVE_GETHOSTBYADDR_R) && defined(HAVE_SOLARIS_STYLE_GETHOST)
|
|
||||||
|
|
||||||
#include <sys/socket.h>
|
#include <sys/socket.h>
|
||||||
#include <netinet/in.h>
|
#include <netinet/in.h>
|
||||||
#include <arpa/inet.h>
|
#include <arpa/inet.h>
|
||||||
@ -651,9 +653,11 @@ longlong sequence(UDF_INIT *initid, UDF_ARGS *args, char *is_null,
|
|||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
my_bool lookup_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
|
my_bool lookup_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
|
||||||
|
void lookup_deinit(UDF_INIT *initid);
|
||||||
char *lookup(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
char *lookup(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||||
unsigned long *length, char *null_value, char *error);
|
unsigned long *length, char *null_value, char *error);
|
||||||
my_bool reverse_lookup_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
|
my_bool reverse_lookup_init(UDF_INIT *initid, UDF_ARGS *args, char *message);
|
||||||
|
void reverse_lookup_deinit(UDF_INIT *initid);
|
||||||
char *reverse_lookup(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
char *reverse_lookup(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||||
unsigned long *length, char *null_value, char *error);
|
unsigned long *length, char *null_value, char *error);
|
||||||
}
|
}
|
||||||
@ -676,9 +680,19 @@ my_bool lookup_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
|
|||||||
}
|
}
|
||||||
initid->max_length=11;
|
initid->max_length=11;
|
||||||
initid->maybe_null=1;
|
initid->maybe_null=1;
|
||||||
|
#if !defined(HAVE_GETHOSTBYADDR_R) && defined(HAVE_SOLARIS_STYLE_GETHOST)
|
||||||
|
(void) pthread_mutex_init(&LOCK_hostname,MY_MUTEX_INIT_SLOW);
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void lookup_deinit(UDF_INIT *initid)
|
||||||
|
{
|
||||||
|
#if !defined(HAVE_GETHOSTBYADDR_R) && defined(HAVE_SOLARIS_STYLE_GETHOST)
|
||||||
|
(void) pthread_mutex_destroy(&LOCK_hostname);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
char *lookup(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
char *lookup(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||||
unsigned long *res_length, char *null_value, char *error)
|
unsigned long *res_length, char *null_value, char *error)
|
||||||
{
|
{
|
||||||
@ -696,13 +710,23 @@ char *lookup(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||||||
length=sizeof(name_buff)-1;
|
length=sizeof(name_buff)-1;
|
||||||
memcpy(name_buff,args->args[0],length);
|
memcpy(name_buff,args->args[0],length);
|
||||||
name_buff[length]=0;
|
name_buff[length]=0;
|
||||||
|
#if defined(HAVE_GETHOSTBYADDR_R) && defined(HAVE_SOLARIS_STYLE_GETHOST)
|
||||||
if (!(hostent=gethostbyname_r(name_buff,&tmp_hostent,hostname_buff,
|
if (!(hostent=gethostbyname_r(name_buff,&tmp_hostent,hostname_buff,
|
||||||
sizeof(hostname_buff), &tmp_errno)))
|
sizeof(hostname_buff), &tmp_errno)))
|
||||||
{
|
{
|
||||||
*null_value=1;
|
*null_value=1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
VOID(pthread_mutex_lock(&LOCK_hostname));
|
||||||
|
if (!(hostent= gethostbyname((char*) name_buff)))
|
||||||
|
{
|
||||||
|
VOID(pthread_mutex_unlock(&LOCK_hostname));
|
||||||
|
*null_value= 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
VOID(pthread_mutex_unlock(&LOCK_hostname));
|
||||||
|
#endif
|
||||||
struct in_addr in;
|
struct in_addr in;
|
||||||
memcpy_fixed((char*) &in,(char*) *hostent->h_addr_list, sizeof(in.s_addr));
|
memcpy_fixed((char*) &in,(char*) *hostent->h_addr_list, sizeof(in.s_addr));
|
||||||
*res_length= (ulong) (strmov(result, inet_ntoa(in)) - result);
|
*res_length= (ulong) (strmov(result, inet_ntoa(in)) - result);
|
||||||
@ -731,9 +755,18 @@ my_bool reverse_lookup_init(UDF_INIT *initid, UDF_ARGS *args, char *message)
|
|||||||
}
|
}
|
||||||
initid->max_length=32;
|
initid->max_length=32;
|
||||||
initid->maybe_null=1;
|
initid->maybe_null=1;
|
||||||
|
#if !defined(HAVE_GETHOSTBYADDR_R) && defined(HAVE_SOLARIS_STYLE_GETHOST)
|
||||||
|
(void) pthread_mutex_init(&LOCK_hostname,MY_MUTEX_INIT_SLOW);
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void reverse_lookup_deinit(UDF_INIT *initid)
|
||||||
|
{
|
||||||
|
#if !defined(HAVE_GETHOSTBYADDR_R) && defined(HAVE_SOLARIS_STYLE_GETHOST)
|
||||||
|
(void) pthread_mutex_destroy(&LOCK_hostname);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
char *reverse_lookup(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
char *reverse_lookup(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
||||||
unsigned long *res_length, char *null_value, char *error)
|
unsigned long *res_length, char *null_value, char *error)
|
||||||
@ -776,6 +809,7 @@ char *reverse_lookup(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
struct hostent *hp;
|
struct hostent *hp;
|
||||||
|
#if defined(HAVE_GETHOSTBYADDR_R) && defined(HAVE_SOLARIS_STYLE_GETHOST)
|
||||||
int tmp_errno;
|
int tmp_errno;
|
||||||
if (!(hp=gethostbyaddr_r((char*) &taddr,sizeof(taddr), AF_INET,
|
if (!(hp=gethostbyaddr_r((char*) &taddr,sizeof(taddr), AF_INET,
|
||||||
&tmp_hostent, name_buff,sizeof(name_buff),
|
&tmp_hostent, name_buff,sizeof(name_buff),
|
||||||
@ -784,10 +818,19 @@ char *reverse_lookup(UDF_INIT *initid, UDF_ARGS *args, char *result,
|
|||||||
*null_value=1;
|
*null_value=1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
VOID(pthread_mutex_lock(&LOCK_hostname));
|
||||||
|
if (!(hp= gethostbyaddr((char*) &taddr, sizeof(taddr), AF_INET)))
|
||||||
|
{
|
||||||
|
VOID(pthread_mutex_unlock(&LOCK_hostname));
|
||||||
|
*null_value= 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
VOID(pthread_mutex_unlock(&LOCK_hostname));
|
||||||
|
#endif
|
||||||
*res_length=(ulong) (strmov(result,hp->h_name) - result);
|
*res_length=(ulong) (strmov(result,hp->h_name) - result);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
#endif // defined(HAVE_GETHOSTBYADDR_R) && defined(HAVE_SOLARIS_STYLE_GETHOST)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Syntax for the new aggregate commands are:
|
** Syntax for the new aggregate commands are:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user