Commit 5a65b8b2 authored by Sinisa@sinisa.nasamreza.org's avatar Sinisa@sinisa.nasamreza.org

Merge sinisa@work.mysql.com:/home/bk/mysql-4.0

into sinisa.nasamreza.org:/mnt/work/mysql-4.0
parents 66f86faa 816dc4eb
...@@ -49578,6 +49578,39 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}. ...@@ -49578,6 +49578,39 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}.
@itemize @bullet @itemize @bullet
@item @item
Added binary XOR.
The one that with a query like :
select 11 ^ 3;
returns 8.
Based on the code originated by Hartmut Holzgraefe <hartmut@six.de>.
@item
Added logical XOR.
The one that with a query like:
select 1 XOR 1;
returns 0;
Based on the code originated by Hartmut Holzgraefe <hartmut@six.de>.
@item
Add function CHEDK_LOCK("lock_name").
This function checks if the lock of the certain name is available or not.
This function does not attempt to take a look.
It is used like this:
SELECT CHECK_LOCK("some_lock");
it will return 1 if the lock is held by a process (including by
itself), 0 if it is currently not held by anyone and NULL on
errors.
Based on the code originated by Hartmut Holzgraefe <hartmut@six.de>.
@item
Removed @code{mysql_ssl_clear()}, as this was not needed. Removed @code{mysql_ssl_clear()}, as this was not needed.
@item @item
@code{DECIMAL} and @code{NUMERIC} types can now read exponential numbers. @code{DECIMAL} and @code{NUMERIC} types can now read exponential numbers.
...@@ -40,6 +40,12 @@ select 2 in (3,2,5,9,5,1),"monty" in ("david","monty","allan"), 1.2 in (1.4,1.2, ...@@ -40,6 +40,12 @@ select 2 in (3,2,5,9,5,1),"monty" in ("david","monty","allan"), 1.2 in (1.4,1.2,
select -1.49 or -1.49,0.6 or 0.6; select -1.49 or -1.49,0.6 or 0.6;
-1.49 or -1.49 0.6 or 0.6 -1.49 or -1.49 0.6 or 0.6
1 1 1 1
select 3 ^ 11;
3 ^ 11
8
select 1 XOR 0;
1 XOR 0
1
select 5 between 0 and 10 between 0 and 1,(5 between 0 and 10) between 0 and 1; select 5 between 0 and 10 between 0 and 1,(5 between 0 and 10) between 0 and 1;
5 between 0 and 10 between 0 and 1 (5 between 0 and 10) between 0 and 1 5 between 0 and 10 between 0 and 1 (5 between 0 and 10) between 0 and 1
0 1 0 1
......
...@@ -17,4 +17,7 @@ get_lock("lock",3) ...@@ -17,4 +17,7 @@ get_lock("lock",3)
select * from t1; select * from t1;
n n
1 1
select check_lock("lock");
check_lock("lock")
1
drop table t1; drop table t1;
...@@ -15,7 +15,8 @@ select 2 between 1 and 3, "monty" between "max" and "my",2=2 and "monty" between ...@@ -15,7 +15,8 @@ select 2 between 1 and 3, "monty" between "max" and "my",2=2 and "monty" between
select 'b' between 'a' and 'c', 'B' between 'a' and 'c'; select 'b' between 'a' and 'c', 'B' between 'a' and 'c';
select 2 in (3,2,5,9,5,1),"monty" in ("david","monty","allan"), 1.2 in (1.4,1.2,1.0); select 2 in (3,2,5,9,5,1),"monty" in ("david","monty","allan"), 1.2 in (1.4,1.2,1.0);
select -1.49 or -1.49,0.6 or 0.6; select -1.49 or -1.49,0.6 or 0.6;
select 3 ^ 11;
select 1 XOR 0;
# #
# Wrong usage of functions # Wrong usage of functions
# #
......
...@@ -22,6 +22,7 @@ sync_with_master; ...@@ -22,6 +22,7 @@ sync_with_master;
select get_lock("lock",3); select get_lock("lock",3);
select * from t1; select * from t1;
connection master1; connection master1;
select check_lock("lock");
drop table t1; drop table t1;
save_master_pos; save_master_pos;
connection slave; connection slave;
......
...@@ -1624,3 +1624,18 @@ bool Item_func_like::turboBM_matches(const char* text, int text_len) const ...@@ -1624,3 +1624,18 @@ bool Item_func_like::turboBM_matches(const char* text, int text_len) const
return false; return false;
} }
} }
longlong Item_cond_xor::val_int()
{
List_iterator<Item> li(list);
Item *item;
int result=0;
null_value=1;
while ((item=li++))
{
result ^= (item->val_int() != 0);
if (!item->null_value)
null_value=0;
}
return result;
}
...@@ -596,3 +596,13 @@ inline Item *and_conds(Item *a,Item *b) ...@@ -596,3 +596,13 @@ inline Item *and_conds(Item *a,Item *b)
cond->update_used_tables(); cond->update_used_tables();
return cond; return cond;
} }
class Item_cond_xor :public Item_cond
{
public:
Item_cond_xor() :Item_cond() {}
Item_cond_xor(Item *i1,Item *i2) :Item_cond(i1,i2) {}
enum Functype functype() const { return COND_XOR_FUNC; }
longlong val_int();
const char *func_name() const { return "xor"; }
};
...@@ -428,3 +428,10 @@ Item *create_func_cast(Item *a, Item_cast cast_type) ...@@ -428,3 +428,10 @@ Item *create_func_cast(Item *a, Item_cast cast_type)
} }
return res; return res;
} }
Item *create_func_check_lock(Item* a)
{
current_thd->safe_to_cache_query=0;
return new Item_func_check_lock(a);
}
...@@ -91,3 +91,4 @@ Item *create_func_version(void); ...@@ -91,3 +91,4 @@ Item *create_func_version(void);
Item *create_func_weekday(Item* a); Item *create_func_weekday(Item* a);
Item *create_load_file(Item* a); Item *create_load_file(Item* a);
Item *create_wait_for_master_pos(Item* a, Item* b); Item *create_wait_for_master_pos(Item* a, Item* b);
Item *create_func_check_lock(Item* a);
...@@ -2257,6 +2257,24 @@ double Item_func_match::val() ...@@ -2257,6 +2257,24 @@ double Item_func_match::val()
return ft_handler->please->find_relevance(ft_handler, record, 0); return ft_handler->please->find_relevance(ft_handler, record, 0);
} }
longlong Item_func_bit_xor::val_int()
{
ulonglong arg1= (ulonglong) args[0]->val_int();
if (args[0]->null_value)
{
null_value=1;
return 0;
}
ulonglong arg2= (ulonglong) args[1]->val_int();
if (args[1]->null_value)
{
null_value=1;
return 0;
}
null_value=0;
return (longlong) (arg1 ^ arg2);
}
/*************************************************************************** /***************************************************************************
System variables System variables
...@@ -2274,3 +2292,40 @@ Item *get_system_var(LEX_STRING name) ...@@ -2274,3 +2292,40 @@ Item *get_system_var(LEX_STRING name)
net_printf(&current_thd->net, ER_UNKNOWN_SYSTEM_VARIABLE, name.str); net_printf(&current_thd->net, ER_UNKNOWN_SYSTEM_VARIABLE, name.str);
return 0; return 0;
} }
/*
Check a user level lock.
Returns 1: available
Returns 0: already taken
Returns NULL: Error
*/
longlong Item_func_check_lock::val_int()
{
String *res=args[0]->val_str(&value);
struct timespec abstime;
THD *thd=current_thd;
ULL *ull;
int error=0;
null_value=0;
if (/* check_global_access(thd,SUPER_ACL) ||*/ !res || !res->length())
{
null_value=1;
return 0;
}
pthread_mutex_lock(&LOCK_user_locks);
ull= (ULL*) hash_search(&hash_user_locks,(byte*) res->ptr(),
res->length());
pthread_mutex_unlock(&LOCK_user_locks);
if (!ull || !ull->locked)
return 1;
return 0;
}
...@@ -39,7 +39,7 @@ public: ...@@ -39,7 +39,7 @@ public:
enum Functype { UNKNOWN_FUNC,EQ_FUNC,EQUAL_FUNC,NE_FUNC,LT_FUNC,LE_FUNC, enum Functype { UNKNOWN_FUNC,EQ_FUNC,EQUAL_FUNC,NE_FUNC,LT_FUNC,LE_FUNC,
GE_FUNC,GT_FUNC,FT_FUNC, GE_FUNC,GT_FUNC,FT_FUNC,
LIKE_FUNC,NOTLIKE_FUNC,ISNULL_FUNC,ISNOTNULL_FUNC, LIKE_FUNC,NOTLIKE_FUNC,ISNULL_FUNC,ISNOTNULL_FUNC,
COND_AND_FUNC,COND_OR_FUNC,BETWEEN,IN_FUNC,INTERVAL_FUNC}; COND_AND_FUNC,COND_OR_FUNC,COND_XOR_FUNC,BETWEEN,IN_FUNC,INTERVAL_FUNC};
enum optimize_type { OPTIMIZE_NONE,OPTIMIZE_KEY,OPTIMIZE_OP, OPTIMIZE_NULL }; enum optimize_type { OPTIMIZE_NONE,OPTIMIZE_KEY,OPTIMIZE_OP, OPTIMIZE_NULL };
enum Type type() const { return FUNC_ITEM; } enum Type type() const { return FUNC_ITEM; }
virtual enum Functype functype() const { return UNKNOWN_FUNC; } virtual enum Functype functype() const { return UNKNOWN_FUNC; }
...@@ -989,3 +989,23 @@ enum Item_cast ...@@ -989,3 +989,23 @@ enum Item_cast
}; };
Item *create_func_cast(Item *a, Item_cast cast_type); Item *create_func_cast(Item *a, Item_cast cast_type);
class Item_func_bit_xor : public Item_int_func
{
public:
Item_func_bit_xor(Item *a,Item *b) :Item_int_func(a,b) {}
longlong val_int();
const char *func_name() const { return "^"; }
void fix_length_xor_dec() { unsigned_flag=1; }
};
class Item_func_check_lock :public Item_int_func
{
String value;
public:
Item_func_check_lock(Item *a) :Item_int_func(a) {}
longlong val_int();
const char *func_name() const { return "check_lock"; }
void fix_length_and_dec() { decimals=0; max_length=1; maybe_null=1;}
};
...@@ -384,6 +384,7 @@ static SYMBOL symbols[] = { ...@@ -384,6 +384,7 @@ static SYMBOL symbols[] = {
{ "WRITE", SYM(WRITE_SYM),0,0}, { "WRITE", SYM(WRITE_SYM),0,0},
{ "WHEN", SYM(WHEN_SYM),0,0}, { "WHEN", SYM(WHEN_SYM),0,0},
{ "WHERE", SYM(WHERE),0,0}, { "WHERE", SYM(WHERE),0,0},
{ "XOR", SYM(XOR),0,0},
{ "X509", SYM(X509_SYM),0,0}, { "X509", SYM(X509_SYM),0,0},
{ "YEAR", SYM(YEAR_SYM),0,0}, { "YEAR", SYM(YEAR_SYM),0,0},
{ "YEAR_MONTH", SYM(YEAR_MONTH_SYM),0,0}, { "YEAR_MONTH", SYM(YEAR_MONTH_SYM),0,0},
...@@ -412,6 +413,7 @@ static SYMBOL sql_functions[] = { ...@@ -412,6 +413,7 @@ static SYMBOL sql_functions[] = {
{ "BIT_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_bit_length)}, { "BIT_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_bit_length)},
{ "CHAR_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_char_length)}, { "CHAR_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_char_length)},
{ "CHARACTER_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_char_length)}, { "CHARACTER_LENGTH", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_char_length)},
{ "CHECK_LOCK", SYM(FUNC_ARG1),0,CREATE_FUNC(create_func_check_lock)},
{ "COALESCE", SYM(COALESCE),0,0}, { "COALESCE", SYM(COALESCE),0,0},
{ "CONCAT", SYM(CONCAT),0,0}, { "CONCAT", SYM(CONCAT),0,0},
{ "CONCAT_WS", SYM(CONCAT_WS),0,0}, { "CONCAT_WS", SYM(CONCAT_WS),0,0},
......
...@@ -339,6 +339,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); ...@@ -339,6 +339,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%token WITH %token WITH
%token WRITE_SYM %token WRITE_SYM
%token X509_SYM %token X509_SYM
%token XOR
%token COMPRESSED_SYM %token COMPRESSED_SYM
%token BIGINT %token BIGINT
...@@ -496,6 +497,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize); ...@@ -496,6 +497,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%left '-' '+' %left '-' '+'
%left '*' '/' '%' %left '*' '/' '%'
%left NEG '~' %left NEG '~'
%left XOR
%left '^'
%right NOT %right NOT
%right BINARY %right BINARY
...@@ -1524,6 +1527,7 @@ expr_expr: ...@@ -1524,6 +1527,7 @@ expr_expr:
{ $$= new Item_func_not(new Item_func_between($1,$4,$6)); } { $$= new Item_func_not(new Item_func_between($1,$4,$6)); }
| expr OR_OR_CONCAT expr { $$= or_or_concat($1,$3); } | expr OR_OR_CONCAT expr { $$= or_or_concat($1,$3); }
| expr OR expr { $$= new Item_cond_or($1,$3); } | expr OR expr { $$= new Item_cond_or($1,$3); }
| expr XOR expr { $$= new Item_cond_xor($1,$3); }
| expr AND expr { $$= new Item_cond_and($1,$3); } | expr AND expr { $$= new Item_cond_and($1,$3); }
| expr LIKE simple_expr opt_escape { $$= new Item_func_like($1,$3,$4); } | expr LIKE simple_expr opt_escape { $$= new Item_func_like($1,$3,$4); }
| expr NOT LIKE simple_expr opt_escape { $$= new Item_func_not(new Item_func_like($1,$4,$5));} | expr NOT LIKE simple_expr opt_escape { $$= new Item_func_not(new Item_func_like($1,$4,$5));}
...@@ -1545,6 +1549,7 @@ expr_expr: ...@@ -1545,6 +1549,7 @@ expr_expr:
| expr '*' expr { $$= new Item_func_mul($1,$3); } | expr '*' expr { $$= new Item_func_mul($1,$3); }
| expr '/' expr { $$= new Item_func_div($1,$3); } | expr '/' expr { $$= new Item_func_div($1,$3); }
| expr '|' expr { $$= new Item_func_bit_or($1,$3); } | expr '|' expr { $$= new Item_func_bit_or($1,$3); }
| expr '^' expr { $$= new Item_func_bit_xor($1,$3); }
| expr '&' expr { $$= new Item_func_bit_and($1,$3); } | expr '&' expr { $$= new Item_func_bit_and($1,$3); }
| expr '%' expr { $$= new Item_func_mod($1,$3); } | expr '%' expr { $$= new Item_func_mod($1,$3); }
| expr '+' INTERVAL_SYM expr interval | expr '+' INTERVAL_SYM expr interval
...@@ -1560,6 +1565,7 @@ no_in_expr: ...@@ -1560,6 +1565,7 @@ no_in_expr:
{ $$= new Item_func_not(new Item_func_between($1,$4,$6)); } { $$= new Item_func_not(new Item_func_between($1,$4,$6)); }
| no_in_expr OR_OR_CONCAT expr { $$= or_or_concat($1,$3); } | no_in_expr OR_OR_CONCAT expr { $$= or_or_concat($1,$3); }
| no_in_expr OR expr { $$= new Item_cond_or($1,$3); } | no_in_expr OR expr { $$= new Item_cond_or($1,$3); }
| no_in_expr XOR expr { $$= new Item_cond_xor($1,$3); }
| no_in_expr AND expr { $$= new Item_cond_and($1,$3); } | no_in_expr AND expr { $$= new Item_cond_and($1,$3); }
| no_in_expr LIKE simple_expr opt_escape { $$= new Item_func_like($1,$3,$4); } | no_in_expr LIKE simple_expr opt_escape { $$= new Item_func_like($1,$3,$4); }
| no_in_expr NOT LIKE simple_expr opt_escape { $$= new Item_func_not(new Item_func_like($1,$4,$5)); } | no_in_expr NOT LIKE simple_expr opt_escape { $$= new Item_func_not(new Item_func_like($1,$4,$5)); }
...@@ -1581,6 +1587,7 @@ no_in_expr: ...@@ -1581,6 +1587,7 @@ no_in_expr:
| no_in_expr '*' expr { $$= new Item_func_mul($1,$3); } | no_in_expr '*' expr { $$= new Item_func_mul($1,$3); }
| no_in_expr '/' expr { $$= new Item_func_div($1,$3); } | no_in_expr '/' expr { $$= new Item_func_div($1,$3); }
| no_in_expr '|' expr { $$= new Item_func_bit_or($1,$3); } | no_in_expr '|' expr { $$= new Item_func_bit_or($1,$3); }
| no_in_expr '^' expr { $$= new Item_func_bit_xor($1,$3); }
| no_in_expr '&' expr { $$= new Item_func_bit_and($1,$3); } | no_in_expr '&' expr { $$= new Item_func_bit_and($1,$3); }
| no_in_expr '%' expr { $$= new Item_func_mod($1,$3); } | no_in_expr '%' expr { $$= new Item_func_mod($1,$3); }
| no_in_expr '+' INTERVAL_SYM expr interval | no_in_expr '+' INTERVAL_SYM expr interval
...@@ -1601,6 +1608,7 @@ no_and_expr: ...@@ -1601,6 +1608,7 @@ no_and_expr:
{ $$= new Item_func_not(new Item_func_between($1,$4,$6)); } { $$= new Item_func_not(new Item_func_between($1,$4,$6)); }
| no_and_expr OR_OR_CONCAT expr { $$= or_or_concat($1,$3); } | no_and_expr OR_OR_CONCAT expr { $$= or_or_concat($1,$3); }
| no_and_expr OR expr { $$= new Item_cond_or($1,$3); } | no_and_expr OR expr { $$= new Item_cond_or($1,$3); }
| no_and_expr XOR expr { $$= new Item_cond_xor($1,$3); }
| no_and_expr LIKE simple_expr opt_escape { $$= new Item_func_like($1,$3,$4); } | no_and_expr LIKE simple_expr opt_escape { $$= new Item_func_like($1,$3,$4); }
| no_and_expr NOT LIKE simple_expr opt_escape { $$= new Item_func_not(new Item_func_like($1,$4,$5)); } | no_and_expr NOT LIKE simple_expr opt_escape { $$= new Item_func_not(new Item_func_like($1,$4,$5)); }
| no_and_expr REGEXP expr { $$= new Item_func_regex($1,$3); } | no_and_expr REGEXP expr { $$= new Item_func_regex($1,$3); }
...@@ -1621,6 +1629,7 @@ no_and_expr: ...@@ -1621,6 +1629,7 @@ no_and_expr:
| no_and_expr '*' expr { $$= new Item_func_mul($1,$3); } | no_and_expr '*' expr { $$= new Item_func_mul($1,$3); }
| no_and_expr '/' expr { $$= new Item_func_div($1,$3); } | no_and_expr '/' expr { $$= new Item_func_div($1,$3); }
| no_and_expr '|' expr { $$= new Item_func_bit_or($1,$3); } | no_and_expr '|' expr { $$= new Item_func_bit_or($1,$3); }
| no_and_expr '^' expr { $$= new Item_func_bit_xor($1,$3); }
| no_and_expr '&' expr { $$= new Item_func_bit_and($1,$3); } | no_and_expr '&' expr { $$= new Item_func_bit_and($1,$3); }
| no_and_expr '%' expr { $$= new Item_func_mod($1,$3); } | no_and_expr '%' expr { $$= new Item_func_mod($1,$3); }
| no_and_expr '+' INTERVAL_SYM expr interval | no_and_expr '+' INTERVAL_SYM expr interval
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment