diff options
author | unknown <serg@sergbook.mysql.com> | 2002-06-29 21:42:21 +0200 |
---|---|---|
committer | unknown <serg@sergbook.mysql.com> | 2002-06-29 21:42:21 +0200 |
commit | 1a8126d84cbdea90bcfd8cdb20a3e5646fb0286e (patch) | |
tree | e6300f5106baae84b786e788f3322ae985fa8338 | |
parent | 7c9ec2d404af6c69ec0e44033ad39d0f70881766 (diff) | |
parent | a88c8630ec426c88cd7eae7acf2985a254d3faba (diff) | |
download | mariadb-git-1a8126d84cbdea90bcfd8cdb20a3e5646fb0286e.tar.gz |
Merge work:/home/bk/mysql-4.0
into sergbook.mysql.com:/usr/home/serg/Abk/mysql-4.0
-rw-r--r-- | BitKeeper/etc/logging_ok | 1 | ||||
-rw-r--r-- | Docs/manual.texi | 40 | ||||
-rw-r--r-- | include/my_global.h | 2 | ||||
-rw-r--r-- | include/my_pthread.h | 6 | ||||
-rw-r--r-- | include/my_sys.h | 7 | ||||
-rw-r--r-- | mysql-test/r/func_test.result | 6 | ||||
-rw-r--r-- | mysql-test/r/rpl_get_lock.result | 3 | ||||
-rw-r--r-- | mysql-test/t/func_test.test | 3 | ||||
-rw-r--r-- | mysql-test/t/rpl_get_lock.test | 1 | ||||
-rw-r--r-- | mysys/thr_rwlock.c | 71 | ||||
-rw-r--r-- | sql/item_cmpfunc.cc | 15 | ||||
-rw-r--r-- | sql/item_cmpfunc.h | 10 | ||||
-rw-r--r-- | sql/item_create.cc | 7 | ||||
-rw-r--r-- | sql/item_create.h | 1 | ||||
-rw-r--r-- | sql/item_func.cc | 55 | ||||
-rw-r--r-- | sql/item_func.h | 22 | ||||
-rw-r--r-- | sql/lex.h | 2 | ||||
-rw-r--r-- | sql/log.cc | 8 | ||||
-rw-r--r-- | sql/log_event.cc | 11 | ||||
-rw-r--r-- | sql/log_event.h | 11 | ||||
-rw-r--r-- | sql/slave.cc | 1 | ||||
-rw-r--r-- | sql/sql_yacc.yy | 9 |
22 files changed, 247 insertions, 45 deletions
diff --git a/BitKeeper/etc/logging_ok b/BitKeeper/etc/logging_ok index 6d26d6294b6..85f42c35327 100644 --- a/BitKeeper/etc/logging_ok +++ b/BitKeeper/etc/logging_ok @@ -67,3 +67,4 @@ venu@work.mysql.com worm@altair.is.lan zak@balfor.local zak@linux.local +salle@geopard.(none) diff --git a/Docs/manual.texi b/Docs/manual.texi index a2a12f6c16f..b908b6cb7ec 100644 --- a/Docs/manual.texi +++ b/Docs/manual.texi @@ -49578,6 +49578,46 @@ 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 : + +@example +SELECT 11 ^ 3; +@end example + +returns 8. + +Based on code contributed by Hartmut Holzgraefe @email{hartmut@@six.de}. +@item + +Added logical XOR. + +The one that with a query like: + +@example +SELECT 1 XOR 1; +@end example + +returns 0; + +Based on code contributed by Hartmut Holzgraefe @email{hartmut@@six.de}. +@item +Add function @code{CHECK_LOCK("lock_name")}. +This function returns a value indicating whether or not the lock with the +given name is available. +It does not attempt to acquire a lock. +It is used like this: + +@example +SELECT CHECK_LOCK("some_lock"); +@end example + +@code{CHECK_LOCK()} returns 1 if the lock is available, +0 if the lock is held by any process (including the current process), +and @code{NULL} if an error occurs. +Based on code contributed by Hartmut Holzgraefe @email{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. diff --git a/include/my_global.h b/include/my_global.h index 6ffe6fe949d..2ad8a870048 100644 --- a/include/my_global.h +++ b/include/my_global.h @@ -313,7 +313,7 @@ typedef unsigned short ushort; #define rint(A) floor((A)+0.5) #endif -/* Define som general constants */ +/* Define some general constants */ #ifndef TRUE #define TRUE (1) /* Logical true */ #define FALSE (0) /* Logical false */ diff --git a/include/my_pthread.h b/include/my_pthread.h index fda31b9d4f2..7e975a8185d 100644 --- a/include/my_pthread.h +++ b/include/my_pthread.h @@ -485,6 +485,8 @@ int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp, #define my_rwlock_init(A,B) pthread_mutex_init((A),(B)) #define rw_rdlock(A) pthread_mutex_lock((A)) #define rw_wrlock(A) pthread_mutex_lock((A)) +#define rw_tryrdlock(A) pthread_mutex_trylock((A)) +#define rw_trywrlock(A) pthread_mutex_trylock((A)) #define rw_unlock(A) pthread_mutex_unlock((A)) #define rwlock_destroy(A) pthread_mutex_destroy((A)) #elif defined(HAVE_PTHREAD_RWLOCK_RDLOCK) @@ -492,6 +494,8 @@ int safe_cond_timedwait(pthread_cond_t *cond, safe_mutex_t *mp, #define my_rwlock_init(A,B) pthread_rwlock_init((A),(B)) #define rw_rdlock(A) pthread_rwlock_rdlock(A) #define rw_wrlock(A) pthread_rwlock_wrlock(A) +#define rw_tryrdlock(A) pthread_mutex_tryrdlock((A)) +#define rw_trywrlock(A) pthread_mutex_trywrlock((A)) #define rw_unlock(A) pthread_rwlock_unlock(A) #define rwlock_destroy(A) pthread_rwlock_destroy(A) #elif defined(HAVE_RWLOCK_INIT) @@ -512,6 +516,8 @@ typedef struct _my_rw_lock_t { #define rw_lock_t my_rw_lock_t #define rw_rdlock(A) my_rw_rdlock((A)) #define rw_wrlock(A) my_rw_wrlock((A)) +#define rw_tryrdlock(A) my_rw_tryrdlock((A)) +#define rw_trywrlock(A) my_rw_trywrlock((A)) #define rw_unlock(A) my_rw_unlock((A)) #define rwlock_destroy(A) my_rwlock_destroy((A)) diff --git a/include/my_sys.h b/include/my_sys.h index 9e64d3159c5..70de1e43a18 100644 --- a/include/my_sys.h +++ b/include/my_sys.h @@ -750,13 +750,6 @@ byte *my_compress_alloc(const byte *packet, ulong *len, ulong *complen); ulong checksum(const byte *mem, uint count); uint my_bit_log2(ulong value); -#if defined(SAFE_MUTEX) && !defined(DBUG_OFF) -#define DBUG_ASSERT_LOCK(lock) DBUG_ASSERT((lock)->count == 1 && \ - (lock)->thread == pthread_self()) -#else -#define DBUG_ASSERT_LOCK(lock) -#endif - #if defined(_MSC_VER) && !defined(__WIN__) extern void sleep(int sec); #endif diff --git a/mysql-test/r/func_test.result b/mysql-test/r/func_test.result index deea5b8bb8b..7d0ef3cff89 100644 --- a/mysql-test/r/func_test.result +++ b/mysql-test/r/func_test.result @@ -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 diff --git a/mysql-test/r/rpl_get_lock.result b/mysql-test/r/rpl_get_lock.result index c86b8f830a5..6201a751961 100644 --- a/mysql-test/r/rpl_get_lock.result +++ b/mysql-test/r/rpl_get_lock.result @@ -17,4 +17,7 @@ get_lock("lock",3) select * from t1; n 1 +select check_lock("lock"); +check_lock("lock") +1 drop table t1; diff --git a/mysql-test/t/func_test.test b/mysql-test/t/func_test.test index ec44009b1a6..844db1a0214 100644 --- a/mysql-test/t/func_test.test +++ b/mysql-test/t/func_test.test @@ -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 # diff --git a/mysql-test/t/rpl_get_lock.test b/mysql-test/t/rpl_get_lock.test index 3fe45eecf46..e197b9911bb 100644 --- a/mysql-test/t/rpl_get_lock.test +++ b/mysql-test/t/rpl_get_lock.test @@ -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; diff --git a/mysys/thr_rwlock.c b/mysys/thr_rwlock.c index 5f561762a3a..f1f70b5c4ac 100644 --- a/mysys/thr_rwlock.c +++ b/mysys/thr_rwlock.c @@ -19,11 +19,13 @@ #include "mysys_priv.h" #include <my_pthread.h> #if defined(THREAD) && !defined(HAVE_PTHREAD_RWLOCK_RDLOCK) && !defined(HAVE_RWLOCK_INIT) +#include <errno.h> /* - * Source base from Sun Microsystems SPILT, simplified - * for MySQL use -- Joshua Chamas - */ + Source base from Sun Microsystems SPILT, simplified for MySQL use + -- Joshua Chamas + Some cleanup and additional code by Monty +*/ /* * Multithreaded Demo Source @@ -71,7 +73,7 @@ int my_rwlock_init(rw_lock_t *rwp, void *arg __attribute__((unused))) rwp->state = 0; rwp->waiters = 0; - return( 0 ); + return(0); } @@ -80,8 +82,7 @@ int my_rwlock_destroy(rw_lock_t *rwp) pthread_mutex_destroy( &rwp->lock ); pthread_cond_destroy( &rwp->readers ); pthread_cond_destroy( &rwp->writers ); - - return( 0 ); + return(0); } @@ -89,54 +90,84 @@ int my_rw_rdlock(rw_lock_t *rwp) { pthread_mutex_lock(&rwp->lock); - /* active or queued writers */ + /* active or queued writers */ while (( rwp->state < 0 ) || rwp->waiters) pthread_cond_wait( &rwp->readers, &rwp->lock); rwp->state++; pthread_mutex_unlock(&rwp->lock); + return(0); +} - return( 0 ); +int my_rw_tryrdlock(rw_lock_t *rwp) +{ + int res; + pthread_mutex_lock(&rwp->lock); + if ((rwp->state < 0 ) || rwp->waiters) + res= EBUSY; /* Can't get lock */ + else + { + res=0; + rwp->state++; + } + pthread_mutex_unlock(&rwp->lock); + return(res); } + int my_rw_wrlock(rw_lock_t *rwp) { pthread_mutex_lock(&rwp->lock); - rwp->waiters++; /* another writer queued */ + rwp->waiters++; /* another writer queued */ - while ( rwp->state ) - pthread_cond_wait( &rwp->writers, &rwp->lock); + while (rwp->state) + pthread_cond_wait(&rwp->writers, &rwp->lock); rwp->state = -1; - --rwp->waiters; - pthread_mutex_unlock( &rwp->lock ); - + rwp->waiters--; + pthread_mutex_unlock(&rwp->lock); return(0); } +int my_rw_trywrlock(rw_lock_t *rwp) +{ + int res; + pthread_mutex_lock(&rwp->lock); + if (rwp->state) + res= EBUSY; /* Can't get lock */ + else + { + res=0; + rwp->state = -1; + } + pthread_mutex_unlock(&rwp->lock); + return(res); +} + + int my_rw_unlock(rw_lock_t *rwp) { DBUG_PRINT("rw_unlock", ("state: %d waiters: %d", rwp->state, rwp->waiters)); pthread_mutex_lock(&rwp->lock); - if ( rwp->state == -1 ) { /* writer releasing */ - rwp->state = 0; /* mark as available */ + if (rwp->state == -1) /* writer releasing */ + { + rwp->state= 0; /* mark as available */ - if ( rwp->waiters ) /* writers queued */ + if ( rwp->waiters ) /* writers queued */ pthread_cond_signal( &rwp->writers ); else pthread_cond_broadcast( &rwp->readers ); } else { - if ( --rwp->state == 0 ) /* no more readers */ + if ( --rwp->state == 0 ) /* no more readers */ pthread_cond_signal( &rwp->writers ); } pthread_mutex_unlock( &rwp->lock ); - - return( 0 ); + return(0); } #endif diff --git a/sql/item_cmpfunc.cc b/sql/item_cmpfunc.cc index fd6e767d620..ca0044b371a 100644 --- a/sql/item_cmpfunc.cc +++ b/sql/item_cmpfunc.cc @@ -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; +} diff --git a/sql/item_cmpfunc.h b/sql/item_cmpfunc.h index 3f674198856..25d0c239647 100644 --- a/sql/item_cmpfunc.h +++ b/sql/item_cmpfunc.h @@ -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"; } +}; diff --git a/sql/item_create.cc b/sql/item_create.cc index 61e82b664ff..f268550d115 100644 --- a/sql/item_create.cc +++ b/sql/item_create.cc @@ -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); +} + diff --git a/sql/item_create.h b/sql/item_create.h index 323e053c261..09d72f9fbb3 100644 --- a/sql/item_create.h +++ b/sql/item_create.h @@ -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); diff --git a/sql/item_func.cc b/sql/item_func.cc index 2d800cddb0d..4dfd9e3585f 100644 --- a/sql/item_func.cc +++ b/sql/item_func.cc @@ -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(¤t_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; +} diff --git a/sql/item_func.h b/sql/item_func.h index 57147b6336f..0e1b5b7c9e0 100644 --- a/sql/item_func.h +++ b/sql/item_func.h @@ -39,7 +39,7 @@ public: 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;} +}; diff --git a/sql/lex.h b/sql/lex.h index df32f84ae43..8b9d2f3a9e0 100644 --- a/sql/lex.h +++ b/sql/lex.h @@ -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}, diff --git a/sql/log.cc b/sql/log.cc index b0483ea4a27..f8bcd05510d 100644 --- a/sql/log.cc +++ b/sql/log.cc @@ -888,15 +888,15 @@ bool MYSQL_LOG::write(THD *thd,enum enum_server_command command, bool MYSQL_LOG::write(Log_event* event_info) { - /* In most cases this is only called if 'is_open()' is true */ bool error=0; - bool should_rotate = 0; if (!inited) // Can't use mutex if not init return 0; VOID(pthread_mutex_lock(&LOCK_log)); + /* In most cases this is only called if 'is_open()' is true */ if (is_open()) { + bool should_rotate = 0; THD *thd=event_info->thd; const char* db = event_info->get_db(); #ifdef USING_TRANSACTIONS @@ -985,9 +985,9 @@ err: } if (file == &log_file) signal_update(); + if (should_rotate) + new_file(1); // inside mutex } - if (should_rotate) - new_file(1); // inside mutex VOID(pthread_mutex_unlock(&LOCK_log)); return error; } diff --git a/sql/log_event.cc b/sql/log_event.cc index 5ff2362e9db..6765ecc5b1f 100644 --- a/sql/log_event.cc +++ b/sql/log_event.cc @@ -1022,16 +1022,19 @@ char* sql_ex_info::init(char* buf,char* buf_end,bool use_new_format) #ifndef MYSQL_CLIENT Load_log_event::Load_log_event(THD* thd, sql_exchange* ex, const char* db_arg, const char* table_name_arg, - List<Item>& fields_arg, enum enum_duplicates handle_dup) + List<Item>& fields_arg, + enum enum_duplicates handle_dup) :Log_event(thd),thread_id(thd->thread_id), num_fields(0),fields(0), - field_lens(0),field_block_len(0), table_name(table_name_arg), + field_lens(0),field_block_len(0), + table_name(table_name_arg ? table_name_arg : ""), db(db_arg), fname(ex->file_name) { time_t end_time; time(&end_time); exec_time = (ulong) (end_time - thd->start_time); - db_len = (db) ? (uint32) strlen(db) : 0; - table_name_len = (table_name) ? (uint32) strlen(table_name) : 0; + /* db can never be a zero pointer in 4.0 */ + db_len = (uint32) strlen(db); + table_name_len = (uint32) strlen(table_name); fname_len = (fname) ? (uint) strlen(fname) : 0; sql_ex.field_term = (char*) ex->field_term->ptr(); sql_ex.field_term_len = (uint8) ex->field_term->length(); diff --git a/sql/log_event.h b/sql/log_event.h index 29cf6287a4f..bcdcc72e0c2 100644 --- a/sql/log_event.h +++ b/sql/log_event.h @@ -407,15 +407,15 @@ public: String fields_buf; Load_log_event(THD* thd, sql_exchange* ex, const char* db_arg, - const char* table_name_arg, + const char* table_name_arg, List<Item>& fields_arg, enum enum_duplicates handle_dup); void set_fields(List<Item> &fields_arg); void pack_info(String* packet); const char* get_db() { return db; } int exec_event(struct st_relay_log_info* rli) - { - return exec_event(thd->slave_net,rli); - } + { + return exec_event(thd->slave_net,rli); + } int exec_event(NET* net, struct st_relay_log_info* rli); #else void print(FILE* file, bool short_form = 0, char* last_db = 0); @@ -423,8 +423,7 @@ public: Load_log_event(const char* buf, int event_len, bool old_format); ~Load_log_event() - { - } + {} Log_event_type get_type_code() { return sql_ex.new_format() ? NEW_LOAD_EVENT: LOAD_EVENT; } int write_data_header(IO_CACHE* file); diff --git a/sql/slave.cc b/sql/slave.cc index 5ca78b6c7a2..4b58816f409 100644 --- a/sql/slave.cc +++ b/sql/slave.cc @@ -405,7 +405,6 @@ int terminate_slave_thread(THD* thd, pthread_mutex_t* term_lock, */ struct timespec abstime; set_timespec(abstime,2); - DBUG_ASSERT_LOCK(cond_lock); pthread_cond_timedwait(term_cond, cond_lock, &abstime); if (*slave_running) { diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index 7b3dc7db52e..635896c2ab2 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -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 |