Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
MariaDB
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
nexedi
MariaDB
Commits
816dc4eb
Commit
816dc4eb
authored
Jun 29, 2002
by
Sinisa@sinisa.nasamreza.org
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Added functions :
* binary XOR * logical XOR * CHECK_LOCK("lock_name")
parent
ade20c5b
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
165 additions
and
2 deletions
+165
-2
Docs/manual.texi
Docs/manual.texi
+33
-0
mysql-test/r/func_test.result
mysql-test/r/func_test.result
+6
-0
mysql-test/r/rpl_get_lock.result
mysql-test/r/rpl_get_lock.result
+3
-0
mysql-test/t/func_test.test
mysql-test/t/func_test.test
+2
-1
mysql-test/t/rpl_get_lock.test
mysql-test/t/rpl_get_lock.test
+1
-0
sql/item_cmpfunc.cc
sql/item_cmpfunc.cc
+15
-0
sql/item_cmpfunc.h
sql/item_cmpfunc.h
+10
-0
sql/item_create.cc
sql/item_create.cc
+7
-0
sql/item_create.h
sql/item_create.h
+1
-0
sql/item_func.cc
sql/item_func.cc
+55
-0
sql/item_func.h
sql/item_func.h
+21
-1
sql/lex.h
sql/lex.h
+2
-0
sql/sql_yacc.yy
sql/sql_yacc.yy
+9
-0
No files found.
Docs/manual.texi
View file @
816dc4eb
...
...
@@ -49578,6 +49578,39 @@ Our TODO section contains what we plan to have in 4.0. @xref{TODO MySQL 4.0}.
@itemize @bullet
@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.
@item
@code{DECIMAL} and @code{NUMERIC} types can now read exponential numbers.
mysql-test/r/func_test.result
View file @
816dc4eb
...
...
@@ -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;
-1.49 or -1.49 0.6 or 0.6
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;
5 between 0 and 10 between 0 and 1 (5 between 0 and 10) between 0 and 1
0 1
...
...
mysql-test/r/rpl_get_lock.result
View file @
816dc4eb
...
...
@@ -17,4 +17,7 @@ get_lock("lock",3)
select * from t1;
n
1
select check_lock("lock");
check_lock("lock")
1
drop table t1;
mysql-test/t/func_test.test
View file @
816dc4eb
...
...
@@ -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
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
3
^
11
;
select
1
XOR
0
;
#
# Wrong usage of functions
#
...
...
mysql-test/t/rpl_get_lock.test
View file @
816dc4eb
...
...
@@ -22,6 +22,7 @@ sync_with_master;
select
get_lock
(
"lock"
,
3
);
select
*
from
t1
;
connection
master1
;
select
check_lock
(
"lock"
);
drop
table
t1
;
save_master_pos
;
connection
slave
;
...
...
sql/item_cmpfunc.cc
View file @
816dc4eb
...
...
@@ -1624,3 +1624,18 @@ bool Item_func_like::turboBM_matches(const char* text, int text_len) const
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
;
}
sql/item_cmpfunc.h
View file @
816dc4eb
...
...
@@ -596,3 +596,13 @@ inline Item *and_conds(Item *a,Item *b)
cond
->
update_used_tables
();
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"
;
}
};
sql/item_create.cc
View file @
816dc4eb
...
...
@@ -428,3 +428,10 @@ Item *create_func_cast(Item *a, Item_cast cast_type)
}
return
res
;
}
Item
*
create_func_check_lock
(
Item
*
a
)
{
current_thd
->
safe_to_cache_query
=
0
;
return
new
Item_func_check_lock
(
a
);
}
sql/item_create.h
View file @
816dc4eb
...
...
@@ -91,3 +91,4 @@ Item *create_func_version(void);
Item
*
create_func_weekday
(
Item
*
a
);
Item
*
create_load_file
(
Item
*
a
);
Item
*
create_wait_for_master_pos
(
Item
*
a
,
Item
*
b
);
Item
*
create_func_check_lock
(
Item
*
a
);
sql/item_func.cc
View file @
816dc4eb
...
...
@@ -2257,6 +2257,24 @@ double Item_func_match::val()
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
...
...
@@ -2274,3 +2292,40 @@ Item *get_system_var(LEX_STRING name)
net_printf
(
&
current_thd
->
net
,
ER_UNKNOWN_SYSTEM_VARIABLE
,
name
.
str
);
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
;
}
sql/item_func.h
View file @
816dc4eb
...
...
@@ -39,7 +39,7 @@ class Item_func :public Item_result_field
enum
Functype
{
UNKNOWN_FUNC
,
EQ_FUNC
,
EQUAL_FUNC
,
NE_FUNC
,
LT_FUNC
,
LE_FUNC
,
GE_FUNC
,
GT_FUNC
,
FT_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
Type
type
()
const
{
return
FUNC_ITEM
;
}
virtual
enum
Functype
functype
()
const
{
return
UNKNOWN_FUNC
;
}
...
...
@@ -989,3 +989,23 @@ enum Item_cast
};
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
;}
};
sql/lex.h
View file @
816dc4eb
...
...
@@ -384,6 +384,7 @@ static SYMBOL symbols[] = {
{
"WRITE"
,
SYM
(
WRITE_SYM
),
0
,
0
},
{
"WHEN"
,
SYM
(
WHEN_SYM
),
0
,
0
},
{
"WHERE"
,
SYM
(
WHERE
),
0
,
0
},
{
"XOR"
,
SYM
(
XOR
),
0
,
0
},
{
"X509"
,
SYM
(
X509_SYM
),
0
,
0
},
{
"YEAR"
,
SYM
(
YEAR_SYM
),
0
,
0
},
{
"YEAR_MONTH"
,
SYM
(
YEAR_MONTH_SYM
),
0
,
0
},
...
...
@@ -412,6 +413,7 @@ static SYMBOL sql_functions[] = {
{
"BIT_LENGTH"
,
SYM
(
FUNC_ARG1
),
0
,
CREATE_FUNC
(
create_func_bit_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
)},
{
"CHECK_LOCK"
,
SYM
(
FUNC_ARG1
),
0
,
CREATE_FUNC
(
create_func_check_lock
)},
{
"COALESCE"
,
SYM
(
COALESCE
),
0
,
0
},
{
"CONCAT"
,
SYM
(
CONCAT
),
0
,
0
},
{
"CONCAT_WS"
,
SYM
(
CONCAT_WS
),
0
,
0
},
...
...
sql/sql_yacc.yy
View file @
816dc4eb
...
...
@@ -339,6 +339,7 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%token WITH
%token WRITE_SYM
%token X509_SYM
%token XOR
%token COMPRESSED_SYM
%token BIGINT
...
...
@@ -496,6 +497,8 @@ bool my_yyoverflow(short **a, YYSTYPE **b,int *yystacksize);
%left '-' '+'
%left '*' '/' '%'
%left NEG '~'
%left XOR
%left '^'
%right NOT
%right BINARY
...
...
@@ -1524,6 +1527,7 @@ expr_expr:
{ $$= new Item_func_not(new Item_func_between($1,$4,$6)); }
| expr OR_OR_CONCAT expr { $$= or_or_concat($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 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));}
...
...
@@ -1545,6 +1549,7 @@ expr_expr:
| expr '*' expr { $$= new Item_func_mul($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_xor($1,$3); }
| expr '&' expr { $$= new Item_func_bit_and($1,$3); }
| expr '%' expr { $$= new Item_func_mod($1,$3); }
| expr '+' INTERVAL_SYM expr interval
...
...
@@ -1560,6 +1565,7 @@ no_in_expr:
{ $$= 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 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 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)); }
...
...
@@ -1581,6 +1587,7 @@ no_in_expr:
| 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_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_mod($1,$3); }
| no_in_expr '+' INTERVAL_SYM expr interval
...
...
@@ -1601,6 +1608,7 @@ no_and_expr:
{ $$= 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 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 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); }
...
...
@@ -1621,6 +1629,7 @@ no_and_expr:
| 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_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_mod($1,$3); }
| no_and_expr '+' INTERVAL_SYM expr interval
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment