mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
Merge istruewing@bk-internal.mysql.com:/home/bk/mysql-4.1
into mysql.com:/home/mydev/mysql/mysql-4.1 BitKeeper/etc/logging_ok: Logging to logging@openlogging.org accepted
This commit is contained in:
@ -48,6 +48,7 @@ hf@deer.mysql.r18.ru
|
|||||||
hf@genie.(none)
|
hf@genie.(none)
|
||||||
igor@hundin.mysql.fi
|
igor@hundin.mysql.fi
|
||||||
igor@rurik.mysql.com
|
igor@rurik.mysql.com
|
||||||
|
ingo@mysql.com
|
||||||
jani@dsl-jkl1657.dial.inet.fi
|
jani@dsl-jkl1657.dial.inet.fi
|
||||||
jani@dsl-kpogw4gb5.dial.inet.fi
|
jani@dsl-kpogw4gb5.dial.inet.fi
|
||||||
jani@hynda.(none)
|
jani@hynda.(none)
|
||||||
|
@ -192,6 +192,15 @@ length(quote(concat(char(0),"test")))
|
|||||||
select hex(quote(concat(char(224),char(227),char(230),char(231),char(232),char(234),char(235))));
|
select hex(quote(concat(char(224),char(227),char(230),char(231),char(232),char(234),char(235))));
|
||||||
hex(quote(concat(char(224),char(227),char(230),char(231),char(232),char(234),char(235))))
|
hex(quote(concat(char(224),char(227),char(230),char(231),char(232),char(234),char(235))))
|
||||||
27E0E3E6E7E8EAEB27
|
27E0E3E6E7E8EAEB27
|
||||||
|
select unhex(hex("foobar")), hex(unhex("1234567890ABCDEF")), unhex("345678");
|
||||||
|
unhex(hex("foobar")) hex(unhex("1234567890ABCDEF")) unhex("345678")
|
||||||
|
foobar 1234567890ABCDEF 4Vx
|
||||||
|
select hex(unhex("1")), hex(unhex("12")), hex(unhex("123")), hex(unhex("1234")), hex(unhex("12345")), hex(unhex("123456"));
|
||||||
|
hex(unhex("1")) hex(unhex("12")) hex(unhex("123")) hex(unhex("1234")) hex(unhex("12345")) hex(unhex("123456"))
|
||||||
|
01 12 0123 1234 012345 123456
|
||||||
|
select length(unhex(md5("abrakadabra")));
|
||||||
|
length(unhex(md5("abrakadabra")))
|
||||||
|
16
|
||||||
select reverse("");
|
select reverse("");
|
||||||
reverse("")
|
reverse("")
|
||||||
|
|
||||||
|
@ -78,6 +78,9 @@ select quote(concat('abc\'', '\\cba'));
|
|||||||
select quote(1/0), quote('\0\Z');
|
select quote(1/0), quote('\0\Z');
|
||||||
select length(quote(concat(char(0),"test")));
|
select length(quote(concat(char(0),"test")));
|
||||||
select hex(quote(concat(char(224),char(227),char(230),char(231),char(232),char(234),char(235))));
|
select hex(quote(concat(char(224),char(227),char(230),char(231),char(232),char(234),char(235))));
|
||||||
|
select unhex(hex("foobar")), hex(unhex("1234567890ABCDEF")), unhex("345678");
|
||||||
|
select hex(unhex("1")), hex(unhex("12")), hex(unhex("123")), hex(unhex("1234")), hex(unhex("12345")), hex(unhex("123456"));
|
||||||
|
select length(unhex(md5("abrakadabra")));
|
||||||
|
|
||||||
#
|
#
|
||||||
# Wrong usage of functions
|
# Wrong usage of functions
|
||||||
|
@ -18,6 +18,10 @@
|
|||||||
/* thus to get the current time we should use the system function
|
/* thus to get the current time we should use the system function
|
||||||
with the highest possible resolution */
|
with the highest possible resolution */
|
||||||
|
|
||||||
|
#ifdef __NETWARE__
|
||||||
|
#include <nks/time.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
#include "mysys_priv.h"
|
#include "mysys_priv.h"
|
||||||
ulonglong my_getsystime()
|
ulonglong my_getsystime()
|
||||||
{
|
{
|
||||||
@ -31,6 +35,10 @@ ulonglong my_getsystime()
|
|||||||
struct _timeb tb;
|
struct _timeb tb;
|
||||||
_ftime(&tb);
|
_ftime(&tb);
|
||||||
return (ulonglong)tb.time*10000000+(ulonglong)tb.millitm*10000;
|
return (ulonglong)tb.time*10000000+(ulonglong)tb.millitm*10000;
|
||||||
|
#elif defined(__NETWARE__)
|
||||||
|
NXTime_t tm;
|
||||||
|
NXGetTime(NX_SINCE_1970, NX_NSECONDS, &tm);
|
||||||
|
return (ulonglong)tm/100;
|
||||||
#else
|
#else
|
||||||
/* TODO: check for other possibilities for hi-res timestamping */
|
/* TODO: check for other possibilities for hi-res timestamping */
|
||||||
struct timeval tv;
|
struct timeval tv;
|
||||||
|
@ -426,6 +426,11 @@ Item *create_func_ucase(Item* a)
|
|||||||
return new Item_func_ucase(a);
|
return new Item_func_ucase(a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Item *create_func_unhex(Item* a)
|
||||||
|
{
|
||||||
|
return new Item_func_unhex(a);
|
||||||
|
}
|
||||||
|
|
||||||
Item *create_func_uuid(void)
|
Item *create_func_uuid(void)
|
||||||
{
|
{
|
||||||
return new Item_func_uuid();
|
return new Item_func_uuid();
|
||||||
|
@ -92,6 +92,7 @@ Item *create_func_time_format(Item *a, Item *b);
|
|||||||
Item *create_func_time_to_sec(Item* a);
|
Item *create_func_time_to_sec(Item* a);
|
||||||
Item *create_func_to_days(Item* a);
|
Item *create_func_to_days(Item* a);
|
||||||
Item *create_func_ucase(Item* a);
|
Item *create_func_ucase(Item* a);
|
||||||
|
Item *create_func_unhex(Item* a);
|
||||||
Item *create_func_uuid(void);
|
Item *create_func_uuid(void);
|
||||||
Item *create_func_version(void);
|
Item *create_func_version(void);
|
||||||
Item *create_func_weekday(Item* a);
|
Item *create_func_weekday(Item* a);
|
||||||
|
@ -2231,7 +2231,7 @@ String *Item_func_hex::val_str(String *str)
|
|||||||
null_value=0;
|
null_value=0;
|
||||||
tmp_value.length(res->length()*2);
|
tmp_value.length(res->length()*2);
|
||||||
for (from=res->ptr(), end=from+res->length(), to= (char*) tmp_value.ptr();
|
for (from=res->ptr(), end=from+res->length(), to= (char*) tmp_value.ptr();
|
||||||
from != end ;
|
from < end ;
|
||||||
from++, to+=2)
|
from++, to+=2)
|
||||||
{
|
{
|
||||||
uint tmp=(uint) (uchar) *from;
|
uint tmp=(uint) (uchar) *from;
|
||||||
@ -2241,6 +2241,48 @@ String *Item_func_hex::val_str(String *str)
|
|||||||
return &tmp_value;
|
return &tmp_value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int inline hexchar_to_int(char c)
|
||||||
|
{
|
||||||
|
if (c <= '9' && c >= '0')
|
||||||
|
return c-'0';
|
||||||
|
c|=32;
|
||||||
|
if (c <= 'f' && c >= 'a')
|
||||||
|
return c-'a'+10;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
String *Item_func_unhex::val_str(String *str)
|
||||||
|
{
|
||||||
|
/* Convert given hex string to a binary string */
|
||||||
|
String *res= args[0]->val_str(str);
|
||||||
|
const char *from=res->ptr(), *end;
|
||||||
|
char *to;
|
||||||
|
int r;
|
||||||
|
if (!res || tmp_value.alloc((1+res->length())/2))
|
||||||
|
{
|
||||||
|
null_value=1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
null_value=0;
|
||||||
|
tmp_value.length((1+res->length())/2);
|
||||||
|
to= (char*) tmp_value.ptr();
|
||||||
|
if (res->length() % 2)
|
||||||
|
{
|
||||||
|
*to++= r= hexchar_to_int(*from++);
|
||||||
|
if ((null_value= (r == -1)))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
for (end=res->ptr()+res->length(); from < end ; from+=2, to++)
|
||||||
|
{
|
||||||
|
*to= (r= hexchar_to_int(from[0])) << 4;
|
||||||
|
if ((null_value= (r == -1)))
|
||||||
|
return 0;
|
||||||
|
*to|= r= hexchar_to_int(from[1]);
|
||||||
|
if ((null_value= (r == -1)))
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return &tmp_value;
|
||||||
|
}
|
||||||
|
|
||||||
void Item_func_binary::print(String *str)
|
void Item_func_binary::print(String *str)
|
||||||
{
|
{
|
||||||
|
@ -500,10 +500,10 @@ public:
|
|||||||
Item_func_conv(Item *a,Item *b,Item *c) :Item_str_func(a,b,c) {}
|
Item_func_conv(Item *a,Item *b,Item *c) :Item_str_func(a,b,c) {}
|
||||||
const char *func_name() const { return "conv"; }
|
const char *func_name() const { return "conv"; }
|
||||||
String *val_str(String *);
|
String *val_str(String *);
|
||||||
void fix_length_and_dec()
|
void fix_length_and_dec()
|
||||||
{
|
{
|
||||||
collation.set(default_charset());
|
collation.set(default_charset());
|
||||||
decimals=0; max_length=64;
|
decimals=0; max_length=64;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -515,14 +515,29 @@ public:
|
|||||||
Item_func_hex(Item *a) :Item_str_func(a) {}
|
Item_func_hex(Item *a) :Item_str_func(a) {}
|
||||||
const char *func_name() const { return "hex"; }
|
const char *func_name() const { return "hex"; }
|
||||||
String *val_str(String *);
|
String *val_str(String *);
|
||||||
void fix_length_and_dec()
|
void fix_length_and_dec()
|
||||||
{
|
{
|
||||||
collation.set(default_charset());
|
collation.set(default_charset());
|
||||||
decimals=0;
|
decimals=0;
|
||||||
max_length=args[0]->max_length*2*collation.collation->mbmaxlen;
|
max_length=args[0]->max_length*2*collation.collation->mbmaxlen;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class Item_func_unhex :public Item_str_func
|
||||||
|
{
|
||||||
|
String tmp_value;
|
||||||
|
public:
|
||||||
|
Item_func_unhex(Item *a) :Item_str_func(a) {}
|
||||||
|
const char *func_name() const { return "unhex"; }
|
||||||
|
String *val_str(String *);
|
||||||
|
void fix_length_and_dec()
|
||||||
|
{
|
||||||
|
collation.set(&my_charset_bin);
|
||||||
|
decimals=0;
|
||||||
|
max_length=(1+args[0]->max_length)/2;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
class Item_func_binary :public Item_str_func
|
class Item_func_binary :public Item_str_func
|
||||||
{
|
{
|
||||||
@ -536,10 +551,10 @@ public:
|
|||||||
tmp->set_charset(&my_charset_bin);
|
tmp->set_charset(&my_charset_bin);
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
void fix_length_and_dec()
|
void fix_length_and_dec()
|
||||||
{
|
{
|
||||||
collation.set(&my_charset_bin);
|
collation.set(&my_charset_bin);
|
||||||
max_length=args[0]->max_length;
|
max_length=args[0]->max_length;
|
||||||
}
|
}
|
||||||
void print(String *str);
|
void print(String *str);
|
||||||
};
|
};
|
||||||
@ -553,7 +568,7 @@ public:
|
|||||||
String *val_str(String *);
|
String *val_str(String *);
|
||||||
const char *func_name() const { return "load_file"; }
|
const char *func_name() const { return "load_file"; }
|
||||||
void fix_length_and_dec()
|
void fix_length_and_dec()
|
||||||
{
|
{
|
||||||
collation.set(&my_charset_bin, DERIVATION_COERCIBLE);
|
collation.set(&my_charset_bin, DERIVATION_COERCIBLE);
|
||||||
maybe_null=1;
|
maybe_null=1;
|
||||||
max_length=MAX_BLOB_WIDTH;
|
max_length=MAX_BLOB_WIDTH;
|
||||||
|
@ -671,6 +671,7 @@ static SYMBOL sql_functions[] = {
|
|||||||
{ "UCASE", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ucase)},
|
{ "UCASE", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ucase)},
|
||||||
{ "UNCOMPRESS", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_uncompress)},
|
{ "UNCOMPRESS", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_uncompress)},
|
||||||
{ "UNCOMPRESSED_LENGTH", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_uncompressed_length)},
|
{ "UNCOMPRESSED_LENGTH", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_uncompressed_length)},
|
||||||
|
{ "UNHEX", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_unhex)},
|
||||||
{ "UNIQUE_USERS", SYM(UNIQUE_USERS)},
|
{ "UNIQUE_USERS", SYM(UNIQUE_USERS)},
|
||||||
{ "UNIX_TIMESTAMP", SYM(UNIX_TIMESTAMP)},
|
{ "UNIX_TIMESTAMP", SYM(UNIX_TIMESTAMP)},
|
||||||
{ "UPPER", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ucase)},
|
{ "UPPER", F_SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_ucase)},
|
||||||
|
Reference in New Issue
Block a user