postgresql/src/test/regress/expected/bit.out
Peter Eisentraut efcecd9eca Make bit and bit varying types reject too long input. (They already tried
to do that, but inconsistently.)  Make bit type reject too short input,
too, per SQL.  Since it no longer zero pads, 'zpbit*' has been renamed to
'bit*' in the source, hence initdb.
2001-05-22 16:37:17 +00:00

512 lines
16 KiB
Plaintext

--
-- BIT types
--
--
-- Build tables for testing
--
CREATE TABLE BIT_TABLE(b BIT(11));
INSERT INTO BIT_TABLE VALUES (B'10'); -- too short
ERROR: bit string length does not match type bit(11)
INSERT INTO BIT_TABLE VALUES (B'00000000000');
INSERT INTO BIT_TABLE VALUES (B'11011000000');
INSERT INTO BIT_TABLE VALUES (B'01010101010');
INSERT INTO BIT_TABLE VALUES (B'101011111010'); -- too long
ERROR: bit string length does not match type bit(11)
--INSERT INTO BIT_TABLE VALUES ('X554');
--INSERT INTO BIT_TABLE VALUES ('X555');
SELECT * FROM BIT_TABLE;
b
-------------
00000000000
11011000000
01010101010
(3 rows)
CREATE TABLE VARBIT_TABLE(v BIT VARYING(11));
INSERT INTO VARBIT_TABLE VALUES (B'');
INSERT INTO VARBIT_TABLE VALUES (B'0');
INSERT INTO VARBIT_TABLE VALUES (B'010101');
INSERT INTO VARBIT_TABLE VALUES (B'01010101010');
INSERT INTO VARBIT_TABLE VALUES (B'101011111010'); -- too long
ERROR: bit string too long for type bit varying(11)
--INSERT INTO VARBIT_TABLE VALUES ('X554');
--INSERT INTO VARBIT_TABLE VALUES ('X555');
SELECT * FROM VARBIT_TABLE;
v
-------------
0
010101
01010101010
(4 rows)
-- Concatenation
SELECT v, b, (v || b) AS concat
FROM BIT_TABLE, VARBIT_TABLE
ORDER BY 3;
v | b | concat
-------------+-------------+------------------------
| 00000000000 | 00000000000
0 | 00000000000 | 000000000000
0 | 01010101010 | 001010101010
010101 | 00000000000 | 01010100000000000
| 01010101010 | 01010101010
01010101010 | 00000000000 | 0101010101000000000000
01010101010 | 01010101010 | 0101010101001010101010
010101 | 01010101010 | 01010101010101010
01010101010 | 11011000000 | 0101010101011011000000
010101 | 11011000000 | 01010111011000000
0 | 11011000000 | 011011000000
| 11011000000 | 11011000000
(12 rows)
-- Length
SELECT b, length(b) AS lb
FROM BIT_TABLE;
b | lb
-------------+----
00000000000 | 11
11011000000 | 11
01010101010 | 11
(3 rows)
SELECT v, length(v) AS lv
FROM VARBIT_TABLE;
v | lv
-------------+----
| 0
0 | 1
010101 | 6
01010101010 | 11
(4 rows)
-- Substring
SELECT b,
SUBSTRING(b FROM 2 FOR 4) AS sub_2_4,
SUBSTRING(b FROM 7 FOR 13) AS sub_7_13,
SUBSTRING(b FROM 6) AS sub_6
FROM BIT_TABLE;
b | sub_2_4 | sub_7_13 | sub_6
-------------+---------+----------+--------
00000000000 | 0000 | 00000 | 000000
11011000000 | 1011 | 00000 | 000000
01010101010 | 1010 | 01010 | 101010
(3 rows)
SELECT v,
SUBSTRING(v FROM 2 FOR 4) AS sub_2_4,
SUBSTRING(v FROM 7 FOR 13) AS sub_7_13,
SUBSTRING(v FROM 6) AS sub_6
FROM VARBIT_TABLE;
v | sub_2_4 | sub_7_13 | sub_6
-------------+---------+----------+--------
| | |
0 | | |
010101 | 1010 | | 1
01010101010 | 1010 | 01010 | 101010
(4 rows)
--- Bit operations
DROP TABLE varbit_table;
CREATE TABLE varbit_table (a BIT VARYING(16), b BIT VARYING(16));
COPY varbit_table FROM stdin;
SELECT a, b, ~a AS "~ a", a & b AS "a & b",
a | b AS "a | b", a # b AS "a # b" FROM varbit_table;
a | b | ~ a | a & b | a | b | a # b
------------------+------------------+------------------+------------------+------------------+------------------
00001111 | 00010000 | 11110000 | 00000000 | 00011111 | 00011111
00011111 | 00010001 | 11100000 | 00010001 | 00011111 | 00001110
00101111 | 00010010 | 11010000 | 00000010 | 00111111 | 00111101
00111111 | 00010011 | 11000000 | 00010011 | 00111111 | 00101100
10001111 | 00000100 | 01110000 | 00000100 | 10001111 | 10001011
0000000000001111 | 0000000000010000 | 1111111111110000 | 0000000000000000 | 0000000000011111 | 0000000000011111
0000000100100011 | 1111111111111111 | 1111111011011100 | 0000000100100011 | 1111111111111111 | 1111111011011100
0010010001101000 | 0010010001101000 | 1101101110010111 | 0010010001101000 | 0010010001101000 | 0000000000000000
1111101001010000 | 0000010110101111 | 0000010110101111 | 0000000000000000 | 1111111111111111 | 1111111111111111
0001001000110100 | 1111111111110101 | 1110110111001011 | 0001001000110100 | 1111111111110101 | 1110110111000001
(10 rows)
SELECT a,b,a<b AS "a<b",a<=b AS "a<=b",a=b AS "a=b",
a>=b AS "a>=b",a>b AS "a>b",a<>b AS "a<>b" FROM varbit_table;
a | b | a<b | a<=b | a=b | a>=b | a>b | a<>b
------------------+------------------+-----+------+-----+------+-----+------
00001111 | 00010000 | t | t | f | f | f | t
00011111 | 00010001 | f | f | f | t | t | t
00101111 | 00010010 | f | f | f | t | t | t
00111111 | 00010011 | f | f | f | t | t | t
10001111 | 00000100 | f | f | f | t | t | t
0000000000001111 | 0000000000010000 | t | t | f | f | f | t
0000000100100011 | 1111111111111111 | t | t | f | f | f | t
0010010001101000 | 0010010001101000 | f | t | t | t | f | f
1111101001010000 | 0000010110101111 | f | f | f | t | t | t
0001001000110100 | 1111111111110101 | t | t | f | f | f | t
(10 rows)
SELECT a,a<<4 AS "a<<4",b,b>>2 AS "b>>2" FROM varbit_table;
a | a<<4 | b | b>>2
------------------+------------------+------------------+------------------
00001111 | 11110000 | 00010000 | 00000100
00011111 | 11110000 | 00010001 | 00000100
00101111 | 11110000 | 00010010 | 00000100
00111111 | 11110000 | 00010011 | 00000100
10001111 | 11110000 | 00000100 | 00000001
0000000000001111 | 0000000011110000 | 0000000000010000 | 0000000000000100
0000000100100011 | 0001001000110000 | 1111111111111111 | 0011111111111111
0010010001101000 | 0100011010000000 | 0010010001101000 | 0000100100011010
1111101001010000 | 1010010100000000 | 0000010110101111 | 0000000101101011
0001001000110100 | 0010001101000000 | 1111111111110101 | 0011111111111101
(10 rows)
DROP TABLE varbit_table;
--- Bit operations
DROP TABLE bit_table;
CREATE TABLE bit_table (a BIT(16), b BIT(16));
COPY bit_table FROM stdin;
SELECT a,b,~a AS "~ a",a & b AS "a & b",
a|b AS "a | b", a # b AS "a # b" FROM bit_table;
a | b | ~ a | a & b | a | b | a # b
------------------+------------------+------------------+------------------+------------------+------------------
0000111100000000 | 0001000000000000 | 1111000011111111 | 0000000000000000 | 0001111100000000 | 0001111100000000
0001111100000000 | 0001000100000000 | 1110000011111111 | 0001000100000000 | 0001111100000000 | 0000111000000000
0010111100000000 | 0001001000000000 | 1101000011111111 | 0000001000000000 | 0011111100000000 | 0011110100000000
0011111100000000 | 0001001100000000 | 1100000011111111 | 0001001100000000 | 0011111100000000 | 0010110000000000
1000111100000000 | 0000010000000000 | 0111000011111111 | 0000010000000000 | 1000111100000000 | 1000101100000000
0000000000001111 | 0000000000010000 | 1111111111110000 | 0000000000000000 | 0000000000011111 | 0000000000011111
0000000100100011 | 1111111111111111 | 1111111011011100 | 0000000100100011 | 1111111111111111 | 1111111011011100
0010010001101000 | 0010010001101000 | 1101101110010111 | 0010010001101000 | 0010010001101000 | 0000000000000000
1111101001010000 | 0000010110101111 | 0000010110101111 | 0000000000000000 | 1111111111111111 | 1111111111111111
0001001000110100 | 1111111111110101 | 1110110111001011 | 0001001000110100 | 1111111111110101 | 1110110111000001
(10 rows)
SELECT a,b,a<b AS "a<b",a<=b AS "a<=b",a=b AS "a=b",
a>=b AS "a>=b",a>b AS "a>b",a<>b AS "a<>b" FROM bit_table;
a | b | a<b | a<=b | a=b | a>=b | a>b | a<>b
------------------+------------------+-----+------+-----+------+-----+------
0000111100000000 | 0001000000000000 | t | t | f | f | f | t
0001111100000000 | 0001000100000000 | f | f | f | t | t | t
0010111100000000 | 0001001000000000 | f | f | f | t | t | t
0011111100000000 | 0001001100000000 | f | f | f | t | t | t
1000111100000000 | 0000010000000000 | f | f | f | t | t | t
0000000000001111 | 0000000000010000 | t | t | f | f | f | t
0000000100100011 | 1111111111111111 | t | t | f | f | f | t
0010010001101000 | 0010010001101000 | f | t | t | t | f | f
1111101001010000 | 0000010110101111 | f | f | f | t | t | t
0001001000110100 | 1111111111110101 | t | t | f | f | f | t
(10 rows)
SELECT a,a<<4 AS "a<<4",b,b>>2 AS "b>>2" FROM bit_table;
a | a<<4 | b | b>>2
------------------+------------------+------------------+------------------
0000111100000000 | 1111000000000000 | 0001000000000000 | 0000010000000000
0001111100000000 | 1111000000000000 | 0001000100000000 | 0000010001000000
0010111100000000 | 1111000000000000 | 0001001000000000 | 0000010010000000
0011111100000000 | 1111000000000000 | 0001001100000000 | 0000010011000000
1000111100000000 | 1111000000000000 | 0000010000000000 | 0000000100000000
0000000000001111 | 0000000011110000 | 0000000000010000 | 0000000000000100
0000000100100011 | 0001001000110000 | 1111111111111111 | 0011111111111111
0010010001101000 | 0100011010000000 | 0010010001101000 | 0000100100011010
1111101001010000 | 1010010100000000 | 0000010110101111 | 0000000101101011
0001001000110100 | 0010001101000000 | 1111111111110101 | 0011111111111101
(10 rows)
DROP TABLE bit_table;
-- The following should fail
select B'001' & B'10';
ERROR: cannot AND bit strings of different sizes
select B'0111' | B'011';
ERROR: cannot OR bit strings of different sizes
select B'0010' # B'011101';
ERROR: cannot XOR bit strings of different sizes
-- More position tests, checking all the boundary cases
SELECT POSITION(B'1010' IN B'0000101'); -- 0
position
----------
0
(1 row)
SELECT POSITION(B'1010' IN B'00001010'); -- 5
position
----------
5
(1 row)
SELECT POSITION(B'1010' IN B'00000101'); -- 0
position
----------
0
(1 row)
SELECT POSITION(B'1010' IN B'000001010'); -- 6
position
----------
6
(1 row)
SELECT POSITION(B'' IN B'00001010'); -- 1
position
----------
1
(1 row)
SELECT POSITION(B'0' IN B''); -- 0
position
----------
0
(1 row)
SELECT POSITION(B'' IN B''); -- 0
position
----------
0
(1 row)
SELECT POSITION(B'101101' IN B'001011011011011000'); -- 3
position
----------
3
(1 row)
SELECT POSITION(B'10110110' IN B'001011011011010'); -- 3
position
----------
3
(1 row)
SELECT POSITION(B'1011011011011' IN B'001011011011011'); -- 3
position
----------
3
(1 row)
SELECT POSITION(B'1011011011011' IN B'00001011011011011'); -- 5
position
----------
5
(1 row)
SELECT POSITION(B'11101011' IN B'11101011'); -- 1
position
----------
1
(1 row)
SELECT POSITION(B'11101011' IN B'011101011'); -- 2
position
----------
2
(1 row)
SELECT POSITION(B'11101011' IN B'00011101011'); -- 4
position
----------
4
(1 row)
SELECT POSITION(B'11101011' IN B'0000011101011'); -- 6
position
----------
6
(1 row)
SELECT POSITION(B'111010110' IN B'111010110'); -- 1
position
----------
1
(1 row)
SELECT POSITION(B'111010110' IN B'0111010110'); -- 2
position
----------
2
(1 row)
SELECT POSITION(B'111010110' IN B'000111010110'); -- 4
position
----------
4
(1 row)
SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6
position
----------
6
(1 row)
SELECT POSITION(B'111010110' IN B'11101011'); -- 0
position
----------
0
(1 row)
SELECT POSITION(B'111010110' IN B'011101011'); -- 0
position
----------
0
(1 row)
SELECT POSITION(B'111010110' IN B'00011101011'); -- 0
position
----------
0
(1 row)
SELECT POSITION(B'111010110' IN B'0000011101011'); -- 0
position
----------
0
(1 row)
SELECT POSITION(B'111010110' IN B'111010110'); -- 1
position
----------
1
(1 row)
SELECT POSITION(B'111010110' IN B'0111010110'); -- 2
position
----------
2
(1 row)
SELECT POSITION(B'111010110' IN B'000111010110'); -- 4
position
----------
4
(1 row)
SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6
position
----------
6
(1 row)
SELECT POSITION(B'111010110' IN B'000001110101111101011'); -- 0
position
----------
0
(1 row)
SELECT POSITION(B'111010110' IN B'0000001110101111101011'); -- 0
position
----------
0
(1 row)
SELECT POSITION(B'111010110' IN B'000000001110101111101011'); -- 0
position
----------
0
(1 row)
SELECT POSITION(B'111010110' IN B'00000000001110101111101011'); -- 0
position
----------
0
(1 row)
SELECT POSITION(B'111010110' IN B'0000011101011111010110'); -- 14
position
----------
14
(1 row)
SELECT POSITION(B'111010110' IN B'00000011101011111010110'); -- 15
position
----------
15
(1 row)
SELECT POSITION(B'111010110' IN B'0000000011101011111010110'); -- 17
position
----------
17
(1 row)
SELECT POSITION(B'111010110' IN B'000000000011101011111010110'); -- 19
position
----------
19
(1 row)
SELECT POSITION(B'000000000011101011111010110' IN B'000000000011101011111010110'); -- 1
position
----------
1
(1 row)
SELECT POSITION(B'00000000011101011111010110' IN B'000000000011101011111010110'); -- 2
position
----------
2
(1 row)
SELECT POSITION(B'0000000000011101011111010110' IN B'000000000011101011111010110'); -- 0
position
----------
0
(1 row)
-- Shifting
CREATE TABLE BIT_SHIFT_TABLE(b BIT(16));
INSERT INTO BIT_SHIFT_TABLE VALUES (B'1101100000000000');
INSERT INTO BIT_SHIFT_TABLE SELECT b>>1 FROM BIT_SHIFT_TABLE;
INSERT INTO BIT_SHIFT_TABLE SELECT b>>2 FROM BIT_SHIFT_TABLE;
INSERT INTO BIT_SHIFT_TABLE SELECT b>>4 FROM BIT_SHIFT_TABLE;
INSERT INTO BIT_SHIFT_TABLE SELECT b>>8 FROM BIT_SHIFT_TABLE;
SELECT POSITION(B'1101' IN b),
POSITION(B'11011' IN b),
b
FROM BIT_SHIFT_TABLE ;
position | position | b
----------+----------+------------------
1 | 1 | 1101100000000000
2 | 2 | 0110110000000000
3 | 3 | 0011011000000000
4 | 4 | 0001101100000000
5 | 5 | 0000110110000000
6 | 6 | 0000011011000000
7 | 7 | 0000001101100000
8 | 8 | 0000000110110000
9 | 9 | 0000000011011000
10 | 10 | 0000000001101100
11 | 11 | 0000000000110110
12 | 12 | 0000000000011011
13 | 0 | 0000000000001101
0 | 0 | 0000000000000110
0 | 0 | 0000000000000011
0 | 0 | 0000000000000001
(16 rows)
CREATE TABLE VARBIT_SHIFT_TABLE(v BIT VARYING(20));
INSERT INTO VARBIT_SHIFT_TABLE VALUES (B'11011');
INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0' AS BIT VARYING(6)) >>1 FROM VARBIT_SHIFT_TABLE;
INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00' AS BIT VARYING(8)) >>2 FROM VARBIT_SHIFT_TABLE;
INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0000' AS BIT VARYING(12)) >>4 FROM VARBIT_SHIFT_TABLE;
INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00000000' AS BIT VARYING(20)) >>8 FROM VARBIT_SHIFT_TABLE;
SELECT POSITION(B'1101' IN v),
POSITION(B'11011' IN v),
v
FROM VARBIT_SHIFT_TABLE ;
position | position | v
----------+----------+----------------------
1 | 1 | 11011
2 | 2 | 011011
3 | 3 | 0011011
4 | 4 | 00011011
5 | 5 | 000011011
6 | 6 | 0000011011
7 | 7 | 00000011011
8 | 8 | 000000011011
9 | 9 | 0000000011011
10 | 10 | 00000000011011
11 | 11 | 000000000011011
12 | 12 | 0000000000011011
13 | 13 | 00000000000011011
14 | 14 | 000000000000011011
15 | 15 | 0000000000000011011
16 | 16 | 00000000000000011011
(16 rows)
DROP TABLE BIT_SHIFT_TABLE;
DROP TABLE VARBIT_SHIFT_TABLE;