summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <konstantin@mysql.com>2003-12-10 17:30:37 +0300
committerunknown <konstantin@mysql.com>2003-12-10 17:30:37 +0300
commitf195cf9d1455f05bd6e6b1e0225f1062dc28d9f7 (patch)
tree0902a94e5ddab6700bd2269d5af63e9a7875179b
parent4c00978b43921525d59f52da1ad13b516da16f1e (diff)
downloadmariadb-git-f195cf9d1455f05bd6e6b1e0225f1062dc28d9f7.tar.gz
fix for bug #1993 'bit functions do not return unsigned values'
introduced base class Item_func_bit for bit functions mysql-test/r/func_op.result: test results for bug #1993 'bit functions do not return unsigned values' mysql-test/t/func_op.test: added tests for bug #1993 'bit functions do not return unsigned values'
-rw-r--r--mysql-test/r/func_op.result18
-rw-r--r--mysql-test/t/func_op.test9
-rw-r--r--sql/item_func.h38
3 files changed, 48 insertions, 17 deletions
diff --git a/mysql-test/r/func_op.result b/mysql-test/r/func_op.result
index 9f49b5809df..d009a66353e 100644
--- a/mysql-test/r/func_op.result
+++ b/mysql-test/r/func_op.result
@@ -7,3 +7,21 @@ select 1 | (1+1),5 & 3,bit_count(7) ;
select 1 << 32,1 << 63, 1 << 64, 4 >> 2, 4 >> 63, 1<< 63 >> 60;
1 << 32 1 << 63 1 << 64 4 >> 2 4 >> 63 1<< 63 >> 60
4294967296 9223372036854775808 0 1 0 8
+select -1 | 0, -1 ^ 0, -1 & 0;
+-1 | 0 -1 ^ 0 -1 & 0
+18446744073709551615 18446744073709551615 0
+select -1 | 1, -1 ^ 1, -1 & 1;
+-1 | 1 -1 ^ 1 -1 & 1
+18446744073709551615 18446744073709551614 1
+select 1 | -1, 1 ^ -1, 1 & -1;
+1 | -1 1 ^ -1 1 & -1
+18446744073709551615 18446744073709551614 1
+select 0 | -1, 0 ^ -1, 0 & -1;
+0 | -1 0 ^ -1 0 & -1
+18446744073709551615 18446744073709551615 0
+select -1 >> 0, -1 << 0;
+-1 >> 0 -1 << 0
+18446744073709551615 18446744073709551615
+select -1 >> 1, -1 << 1;
+-1 >> 1 -1 << 1
+9223372036854775807 18446744073709551614
diff --git a/mysql-test/t/func_op.test b/mysql-test/t/func_op.test
index 778c8406b8d..a312d6ac8c0 100644
--- a/mysql-test/t/func_op.test
+++ b/mysql-test/t/func_op.test
@@ -5,3 +5,12 @@
select 1+1,1-1,1+1*2,8/5,8%5,mod(8,5),mod(8,5)|0,-(1+1)*-2;
select 1 | (1+1),5 & 3,bit_count(7) ;
select 1 << 32,1 << 63, 1 << 64, 4 >> 2, 4 >> 63, 1<< 63 >> 60;
+#
+# bug #1993: bit functions must be unsigned
+#
+select -1 | 0, -1 ^ 0, -1 & 0;
+select -1 | 1, -1 ^ 1, -1 & 1;
+select 1 | -1, 1 ^ -1, 1 & -1;
+select 0 | -1, 0 ^ -1, 0 & -1;
+select -1 >> 0, -1 << 0;
+select -1 >> 1, -1 << 1;
diff --git a/sql/item_func.h b/sql/item_func.h
index 09aba9694dd..4d171cda490 100644
--- a/sql/item_func.h
+++ b/sql/item_func.h
@@ -642,23 +642,30 @@ public:
unsigned int size_of() { return sizeof(*this);}
};
+/* Base class for all bit functions: '~', '|', '^', '&', '>>', '<<' */
-class Item_func_bit_or :public Item_int_func
+class Item_func_bit: public Item_int_func
{
public:
- Item_func_bit_or(Item *a,Item *b) :Item_int_func(a,b) {}
+ Item_func_bit(Item *a, Item *b) :Item_int_func(a, b) {}
+ Item_func_bit(Item *a) :Item_int_func(a) {}
+ void fix_length_and_dec() { unsigned_flag= 1; }
+};
+
+class Item_func_bit_or :public Item_func_bit
+{
+public:
+ Item_func_bit_or(Item *a, Item *b) :Item_func_bit(a, b) {}
longlong val_int();
const char *func_name() const { return "|"; }
- void fix_length_and_dec() { unsigned_flag=1; }
};
-class Item_func_bit_and :public Item_int_func
+class Item_func_bit_and :public Item_func_bit
{
public:
- Item_func_bit_and(Item *a,Item *b) :Item_int_func(a,b) {}
+ Item_func_bit_and(Item *a, Item *b) :Item_func_bit(a, b) {}
longlong val_int();
const char *func_name() const { return "&"; }
- void fix_length_and_dec() { unsigned_flag=1; }
};
class Item_func_bit_count :public Item_int_func
@@ -670,30 +677,28 @@ public:
void fix_length_and_dec() { max_length=2; }
};
-class Item_func_shift_left :public Item_int_func
+class Item_func_shift_left :public Item_func_bit
{
public:
- Item_func_shift_left(Item *a,Item *b) :Item_int_func(a,b) {}
+ Item_func_shift_left(Item *a, Item *b) :Item_func_bit(a, b) {}
longlong val_int();
const char *func_name() const { return "<<"; }
- void fix_length_and_dec() { unsigned_flag=1; }
};
-class Item_func_shift_right :public Item_int_func
+class Item_func_shift_right :public Item_func_bit
{
public:
- Item_func_shift_right(Item *a,Item *b) :Item_int_func(a,b) {}
+ Item_func_shift_right(Item *a, Item *b) :Item_func_bit(a, b) {}
longlong val_int();
const char *func_name() const { return ">>"; }
};
-class Item_func_bit_neg :public Item_int_func
+class Item_func_bit_neg :public Item_func_bit
{
public:
- Item_func_bit_neg(Item *a) :Item_int_func(a) {}
+ Item_func_bit_neg(Item *a) :Item_func_bit(a) {}
longlong val_int();
const char *func_name() const { return "~"; }
- void fix_length_and_dec() { unsigned_flag=1; }
};
class Item_func_set_last_insert_id :public Item_int_func
@@ -1018,13 +1023,12 @@ enum Item_cast
Item *create_func_cast(Item *a, Item_cast cast_type);
-class Item_func_bit_xor : public Item_int_func
+class Item_func_bit_xor : public Item_func_bit
{
public:
- Item_func_bit_xor(Item *a,Item *b) :Item_int_func(a,b) {}
+ Item_func_bit_xor(Item *a, Item *b) :Item_func_bit(a, b) {}
longlong val_int();
const char *func_name() const { return "^"; }
- void fix_length_xor_dec() { unsigned_flag=1; }
};
class Item_func_is_free_lock :public Item_int_func