Fix obsolete comment regarding FSM truncation.
[PostgreSQL.git] / src / test / regress / expected / bit.out
blob3563d2366d14c988dae073a6f2ba0d725011b56b
1 --
2 -- BIT types
3 --
4 --
5 -- Build tables for testing
6 --
7 CREATE TABLE BIT_TABLE(b BIT(11));
8 INSERT INTO BIT_TABLE VALUES (B'10'); -- too short
9 ERROR:  bit string length 2 does not match type bit(11)
10 INSERT INTO BIT_TABLE VALUES (B'00000000000');
11 INSERT INTO BIT_TABLE VALUES (B'11011000000');
12 INSERT INTO BIT_TABLE VALUES (B'01010101010');
13 INSERT INTO BIT_TABLE VALUES (B'101011111010'); -- too long
14 ERROR:  bit string length 12 does not match type bit(11)
15 --INSERT INTO BIT_TABLE VALUES ('X554');
16 --INSERT INTO BIT_TABLE VALUES ('X555');
17 SELECT * FROM BIT_TABLE; 
18       b      
19 -------------
20  00000000000
21  11011000000
22  01010101010
23 (3 rows)
25 CREATE TABLE VARBIT_TABLE(v BIT VARYING(11));
26 INSERT INTO VARBIT_TABLE VALUES (B'');
27 INSERT INTO VARBIT_TABLE VALUES (B'0');
28 INSERT INTO VARBIT_TABLE VALUES (B'010101');
29 INSERT INTO VARBIT_TABLE VALUES (B'01010101010');
30 INSERT INTO VARBIT_TABLE VALUES (B'101011111010'); -- too long
31 ERROR:  bit string too long for type bit varying(11)
32 --INSERT INTO VARBIT_TABLE VALUES ('X554');
33 --INSERT INTO VARBIT_TABLE VALUES ('X555');
34 SELECT * FROM VARBIT_TABLE; 
35       v      
36 -------------
38  0
39  010101
40  01010101010
41 (4 rows)
43 -- Concatenation
44 SELECT v, b, (v || b) AS concat
45        FROM BIT_TABLE, VARBIT_TABLE 
46        ORDER BY 3;
47       v      |      b      |         concat         
48 -------------+-------------+------------------------
49              | 00000000000 | 00000000000
50  0           | 00000000000 | 000000000000
51  0           | 01010101010 | 001010101010
52  010101      | 00000000000 | 01010100000000000
53              | 01010101010 | 01010101010
54  01010101010 | 00000000000 | 0101010101000000000000
55  01010101010 | 01010101010 | 0101010101001010101010
56  010101      | 01010101010 | 01010101010101010
57  01010101010 | 11011000000 | 0101010101011011000000
58  010101      | 11011000000 | 01010111011000000
59  0           | 11011000000 | 011011000000
60              | 11011000000 | 11011000000
61 (12 rows)
63 -- Length
64 SELECT b, length(b) AS lb
65        FROM BIT_TABLE;
66       b      | lb 
67 -------------+----
68  00000000000 | 11
69  11011000000 | 11
70  01010101010 | 11
71 (3 rows)
73 SELECT v, length(v) AS lv
74        FROM VARBIT_TABLE;
75       v      | lv 
76 -------------+----
77              |  0
78  0           |  1
79  010101      |  6
80  01010101010 | 11
81 (4 rows)
83 -- Substring
84 SELECT b,
85        SUBSTRING(b FROM 2 FOR 4) AS sub_2_4,
86        SUBSTRING(b FROM 7 FOR 13) AS sub_7_13,
87        SUBSTRING(b FROM 6) AS sub_6
88        FROM BIT_TABLE;
89       b      | sub_2_4 | sub_7_13 | sub_6  
90 -------------+---------+----------+--------
91  00000000000 | 0000    | 00000    | 000000
92  11011000000 | 1011    | 00000    | 000000
93  01010101010 | 1010    | 01010    | 101010
94 (3 rows)
96 SELECT v,
97        SUBSTRING(v FROM 2 FOR 4) AS sub_2_4,
98        SUBSTRING(v FROM 7 FOR 13) AS sub_7_13,
99        SUBSTRING(v FROM 6) AS sub_6
100        FROM VARBIT_TABLE;
101       v      | sub_2_4 | sub_7_13 | sub_6  
102 -------------+---------+----------+--------
103              |         |          | 
104  0           |         |          | 
105  010101      | 1010    |          | 1
106  01010101010 | 1010    | 01010    | 101010
107 (4 rows)
109 --- Bit operations
110 DROP TABLE varbit_table;
111 CREATE TABLE varbit_table (a BIT VARYING(16), b BIT VARYING(16));
112 COPY varbit_table FROM stdin;
113 SELECT a, b, ~a AS "~ a", a & b AS "a & b", 
114        a | b AS "a | b", a # b AS "a # b" FROM varbit_table;
115         a         |        b         |       ~ a        |      a & b       |      a | b       |      a # b       
116 ------------------+------------------+------------------+------------------+------------------+------------------
117  00001111         | 00010000         | 11110000         | 00000000         | 00011111         | 00011111
118  00011111         | 00010001         | 11100000         | 00010001         | 00011111         | 00001110
119  00101111         | 00010010         | 11010000         | 00000010         | 00111111         | 00111101
120  00111111         | 00010011         | 11000000         | 00010011         | 00111111         | 00101100
121  10001111         | 00000100         | 01110000         | 00000100         | 10001111         | 10001011
122  0000000000001111 | 0000000000010000 | 1111111111110000 | 0000000000000000 | 0000000000011111 | 0000000000011111
123  0000000100100011 | 1111111111111111 | 1111111011011100 | 0000000100100011 | 1111111111111111 | 1111111011011100
124  0010010001101000 | 0010010001101000 | 1101101110010111 | 0010010001101000 | 0010010001101000 | 0000000000000000
125  1111101001010000 | 0000010110101111 | 0000010110101111 | 0000000000000000 | 1111111111111111 | 1111111111111111
126  0001001000110100 | 1111111111110101 | 1110110111001011 | 0001001000110100 | 1111111111110101 | 1110110111000001
127 (10 rows)
129 SELECT a,b,a<b AS "a<b",a<=b AS "a<=b",a=b AS "a=b",
130         a>=b AS "a>=b",a>b AS "a>b",a<>b AS "a<>b" FROM varbit_table;
131         a         |        b         | a<b | a<=b | a=b | a>=b | a>b | a<>b 
132 ------------------+------------------+-----+------+-----+------+-----+------
133  00001111         | 00010000         | t   | t    | f   | f    | f   | t
134  00011111         | 00010001         | f   | f    | f   | t    | t   | t
135  00101111         | 00010010         | f   | f    | f   | t    | t   | t
136  00111111         | 00010011         | f   | f    | f   | t    | t   | t
137  10001111         | 00000100         | f   | f    | f   | t    | t   | t
138  0000000000001111 | 0000000000010000 | t   | t    | f   | f    | f   | t
139  0000000100100011 | 1111111111111111 | t   | t    | f   | f    | f   | t
140  0010010001101000 | 0010010001101000 | f   | t    | t   | t    | f   | f
141  1111101001010000 | 0000010110101111 | f   | f    | f   | t    | t   | t
142  0001001000110100 | 1111111111110101 | t   | t    | f   | f    | f   | t
143 (10 rows)
145 SELECT a,a<<4 AS "a<<4",b,b>>2 AS "b>>2" FROM varbit_table;
146         a         |       a<<4       |        b         |       b>>2       
147 ------------------+------------------+------------------+------------------
148  00001111         | 11110000         | 00010000         | 00000100
149  00011111         | 11110000         | 00010001         | 00000100
150  00101111         | 11110000         | 00010010         | 00000100
151  00111111         | 11110000         | 00010011         | 00000100
152  10001111         | 11110000         | 00000100         | 00000001
153  0000000000001111 | 0000000011110000 | 0000000000010000 | 0000000000000100
154  0000000100100011 | 0001001000110000 | 1111111111111111 | 0011111111111111
155  0010010001101000 | 0100011010000000 | 0010010001101000 | 0000100100011010
156  1111101001010000 | 1010010100000000 | 0000010110101111 | 0000000101101011
157  0001001000110100 | 0010001101000000 | 1111111111110101 | 0011111111111101
158 (10 rows)
160 DROP TABLE varbit_table;
161 --- Bit operations
162 DROP TABLE bit_table;
163 CREATE TABLE bit_table (a BIT(16), b BIT(16));
164 COPY bit_table FROM stdin;
165 SELECT a,b,~a AS "~ a",a & b AS "a & b", 
166         a|b AS "a | b", a # b AS "a # b" FROM bit_table;
167         a         |        b         |       ~ a        |      a & b       |      a | b       |      a # b       
168 ------------------+------------------+------------------+------------------+------------------+------------------
169  0000111100000000 | 0001000000000000 | 1111000011111111 | 0000000000000000 | 0001111100000000 | 0001111100000000
170  0001111100000000 | 0001000100000000 | 1110000011111111 | 0001000100000000 | 0001111100000000 | 0000111000000000
171  0010111100000000 | 0001001000000000 | 1101000011111111 | 0000001000000000 | 0011111100000000 | 0011110100000000
172  0011111100000000 | 0001001100000000 | 1100000011111111 | 0001001100000000 | 0011111100000000 | 0010110000000000
173  1000111100000000 | 0000010000000000 | 0111000011111111 | 0000010000000000 | 1000111100000000 | 1000101100000000
174  0000000000001111 | 0000000000010000 | 1111111111110000 | 0000000000000000 | 0000000000011111 | 0000000000011111
175  0000000100100011 | 1111111111111111 | 1111111011011100 | 0000000100100011 | 1111111111111111 | 1111111011011100
176  0010010001101000 | 0010010001101000 | 1101101110010111 | 0010010001101000 | 0010010001101000 | 0000000000000000
177  1111101001010000 | 0000010110101111 | 0000010110101111 | 0000000000000000 | 1111111111111111 | 1111111111111111
178  0001001000110100 | 1111111111110101 | 1110110111001011 | 0001001000110100 | 1111111111110101 | 1110110111000001
179 (10 rows)
181 SELECT a,b,a<b AS "a<b",a<=b AS "a<=b",a=b AS "a=b",
182         a>=b AS "a>=b",a>b AS "a>b",a<>b AS "a<>b" FROM bit_table;
183         a         |        b         | a<b | a<=b | a=b | a>=b | a>b | a<>b 
184 ------------------+------------------+-----+------+-----+------+-----+------
185  0000111100000000 | 0001000000000000 | t   | t    | f   | f    | f   | t
186  0001111100000000 | 0001000100000000 | f   | f    | f   | t    | t   | t
187  0010111100000000 | 0001001000000000 | f   | f    | f   | t    | t   | t
188  0011111100000000 | 0001001100000000 | f   | f    | f   | t    | t   | t
189  1000111100000000 | 0000010000000000 | f   | f    | f   | t    | t   | t
190  0000000000001111 | 0000000000010000 | t   | t    | f   | f    | f   | t
191  0000000100100011 | 1111111111111111 | t   | t    | f   | f    | f   | t
192  0010010001101000 | 0010010001101000 | f   | t    | t   | t    | f   | f
193  1111101001010000 | 0000010110101111 | f   | f    | f   | t    | t   | t
194  0001001000110100 | 1111111111110101 | t   | t    | f   | f    | f   | t
195 (10 rows)
197 SELECT a,a<<4 AS "a<<4",b,b>>2 AS "b>>2" FROM bit_table;
198         a         |       a<<4       |        b         |       b>>2       
199 ------------------+------------------+------------------+------------------
200  0000111100000000 | 1111000000000000 | 0001000000000000 | 0000010000000000
201  0001111100000000 | 1111000000000000 | 0001000100000000 | 0000010001000000
202  0010111100000000 | 1111000000000000 | 0001001000000000 | 0000010010000000
203  0011111100000000 | 1111000000000000 | 0001001100000000 | 0000010011000000
204  1000111100000000 | 1111000000000000 | 0000010000000000 | 0000000100000000
205  0000000000001111 | 0000000011110000 | 0000000000010000 | 0000000000000100
206  0000000100100011 | 0001001000110000 | 1111111111111111 | 0011111111111111
207  0010010001101000 | 0100011010000000 | 0010010001101000 | 0000100100011010
208  1111101001010000 | 1010010100000000 | 0000010110101111 | 0000000101101011
209  0001001000110100 | 0010001101000000 | 1111111111110101 | 0011111111111101
210 (10 rows)
212 DROP TABLE bit_table;
213 -- The following should fail
214 select B'001' & B'10';
215 ERROR:  cannot AND bit strings of different sizes
216 select B'0111' | B'011';
217 ERROR:  cannot OR bit strings of different sizes
218 select B'0010' # B'011101';
219 ERROR:  cannot XOR bit strings of different sizes
220 -- More position tests, checking all the boundary cases
221 SELECT POSITION(B'1010' IN B'0000101');   -- 0
222  position 
223 ----------
224         0
225 (1 row)
227 SELECT POSITION(B'1010' IN B'00001010');  -- 5
228  position 
229 ----------
230         5
231 (1 row)
233 SELECT POSITION(B'1010' IN B'00000101');  -- 0
234  position 
235 ----------
236         0
237 (1 row)
239 SELECT POSITION(B'1010' IN B'000001010');  -- 6
240  position 
241 ----------
242         6
243 (1 row)
245 SELECT POSITION(B'' IN B'00001010');  -- 1
246  position 
247 ----------
248         1
249 (1 row)
251 SELECT POSITION(B'0' IN B'');  -- 0
252  position 
253 ----------
254         0
255 (1 row)
257 SELECT POSITION(B'' IN B'');  -- 0
258  position 
259 ----------
260         0
261 (1 row)
263 SELECT POSITION(B'101101' IN B'001011011011011000');  -- 3
264  position 
265 ----------
266         3
267 (1 row)
269 SELECT POSITION(B'10110110' IN B'001011011011010');  -- 3
270  position 
271 ----------
272         3
273 (1 row)
275 SELECT POSITION(B'1011011011011' IN B'001011011011011');  -- 3
276  position 
277 ----------
278         3
279 (1 row)
281 SELECT POSITION(B'1011011011011' IN B'00001011011011011');  -- 5
282  position 
283 ----------
284         5
285 (1 row)
287 SELECT POSITION(B'11101011' IN B'11101011'); -- 1
288  position 
289 ----------
290         1
291 (1 row)
293 SELECT POSITION(B'11101011' IN B'011101011'); -- 2
294  position 
295 ----------
296         2
297 (1 row)
299 SELECT POSITION(B'11101011' IN B'00011101011'); -- 4
300  position 
301 ----------
302         4
303 (1 row)
305 SELECT POSITION(B'11101011' IN B'0000011101011'); -- 6
306  position 
307 ----------
308         6
309 (1 row)
311 SELECT POSITION(B'111010110' IN B'111010110'); -- 1
312  position 
313 ----------
314         1
315 (1 row)
317 SELECT POSITION(B'111010110' IN B'0111010110'); -- 2
318  position 
319 ----------
320         2
321 (1 row)
323 SELECT POSITION(B'111010110' IN B'000111010110'); -- 4
324  position 
325 ----------
326         4
327 (1 row)
329 SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6
330  position 
331 ----------
332         6
333 (1 row)
335 SELECT POSITION(B'111010110' IN B'11101011'); -- 0
336  position 
337 ----------
338         0
339 (1 row)
341 SELECT POSITION(B'111010110' IN B'011101011'); -- 0
342  position 
343 ----------
344         0
345 (1 row)
347 SELECT POSITION(B'111010110' IN B'00011101011'); -- 0
348  position 
349 ----------
350         0
351 (1 row)
353 SELECT POSITION(B'111010110' IN B'0000011101011'); -- 0
354  position 
355 ----------
356         0
357 (1 row)
359 SELECT POSITION(B'111010110' IN B'111010110'); -- 1
360  position 
361 ----------
362         1
363 (1 row)
365 SELECT POSITION(B'111010110' IN B'0111010110'); -- 2
366  position 
367 ----------
368         2
369 (1 row)
371 SELECT POSITION(B'111010110' IN B'000111010110'); -- 4
372  position 
373 ----------
374         4
375 (1 row)
377 SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6
378  position 
379 ----------
380         6
381 (1 row)
383 SELECT POSITION(B'111010110' IN B'000001110101111101011'); -- 0
384  position 
385 ----------
386         0
387 (1 row)
389 SELECT POSITION(B'111010110' IN B'0000001110101111101011'); -- 0
390  position 
391 ----------
392         0
393 (1 row)
395 SELECT POSITION(B'111010110' IN B'000000001110101111101011'); -- 0
396  position 
397 ----------
398         0
399 (1 row)
401 SELECT POSITION(B'111010110' IN B'00000000001110101111101011'); -- 0
402  position 
403 ----------
404         0
405 (1 row)
407 SELECT POSITION(B'111010110' IN B'0000011101011111010110'); -- 14
408  position 
409 ----------
410        14
411 (1 row)
413 SELECT POSITION(B'111010110' IN B'00000011101011111010110'); -- 15
414  position 
415 ----------
416        15
417 (1 row)
419 SELECT POSITION(B'111010110' IN B'0000000011101011111010110'); -- 17
420  position 
421 ----------
422        17
423 (1 row)
425 SELECT POSITION(B'111010110' IN B'000000000011101011111010110'); -- 19
426  position 
427 ----------
428        19
429 (1 row)
431 SELECT POSITION(B'000000000011101011111010110' IN B'000000000011101011111010110'); -- 1
432  position 
433 ----------
434         1
435 (1 row)
437 SELECT POSITION(B'00000000011101011111010110' IN B'000000000011101011111010110'); -- 2
438  position 
439 ----------
440         2
441 (1 row)
443 SELECT POSITION(B'0000000000011101011111010110' IN B'000000000011101011111010110'); -- 0
444  position 
445 ----------
446         0
447 (1 row)
449 -- Shifting
450 CREATE TABLE BIT_SHIFT_TABLE(b BIT(16));
451 INSERT INTO BIT_SHIFT_TABLE VALUES (B'1101100000000000');
452 INSERT INTO BIT_SHIFT_TABLE SELECT b>>1 FROM BIT_SHIFT_TABLE;
453 INSERT INTO BIT_SHIFT_TABLE SELECT b>>2 FROM BIT_SHIFT_TABLE;
454 INSERT INTO BIT_SHIFT_TABLE SELECT b>>4 FROM BIT_SHIFT_TABLE;
455 INSERT INTO BIT_SHIFT_TABLE SELECT b>>8 FROM BIT_SHIFT_TABLE;
456 SELECT POSITION(B'1101' IN b),
457        POSITION(B'11011' IN b),
458        b 
459        FROM BIT_SHIFT_TABLE ;
460  position | position |        b         
461 ----------+----------+------------------
462         1 |        1 | 1101100000000000
463         2 |        2 | 0110110000000000
464         3 |        3 | 0011011000000000
465         4 |        4 | 0001101100000000
466         5 |        5 | 0000110110000000
467         6 |        6 | 0000011011000000
468         7 |        7 | 0000001101100000
469         8 |        8 | 0000000110110000
470         9 |        9 | 0000000011011000
471        10 |       10 | 0000000001101100
472        11 |       11 | 0000000000110110
473        12 |       12 | 0000000000011011
474        13 |        0 | 0000000000001101
475         0 |        0 | 0000000000000110
476         0 |        0 | 0000000000000011
477         0 |        0 | 0000000000000001
478 (16 rows)
480 CREATE TABLE VARBIT_SHIFT_TABLE(v BIT VARYING(20));
481 INSERT INTO VARBIT_SHIFT_TABLE VALUES (B'11011');
482 INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0' AS BIT VARYING(6)) >>1 FROM VARBIT_SHIFT_TABLE;
483 INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00' AS BIT VARYING(8)) >>2 FROM VARBIT_SHIFT_TABLE;
484 INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0000' AS BIT VARYING(12)) >>4 FROM VARBIT_SHIFT_TABLE;
485 INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00000000' AS BIT VARYING(20)) >>8 FROM VARBIT_SHIFT_TABLE;
486 SELECT POSITION(B'1101' IN v),
487        POSITION(B'11011' IN v),
488        v 
489        FROM VARBIT_SHIFT_TABLE ;
490  position | position |          v           
491 ----------+----------+----------------------
492         1 |        1 | 11011
493         2 |        2 | 011011
494         3 |        3 | 0011011
495         4 |        4 | 00011011
496         5 |        5 | 000011011
497         6 |        6 | 0000011011
498         7 |        7 | 00000011011
499         8 |        8 | 000000011011
500         9 |        9 | 0000000011011
501        10 |       10 | 00000000011011
502        11 |       11 | 000000000011011
503        12 |       12 | 0000000000011011
504        13 |       13 | 00000000000011011
505        14 |       14 | 000000000000011011
506        15 |       15 | 0000000000000011011
507        16 |       16 | 00000000000000011011
508 (16 rows)
510 DROP TABLE BIT_SHIFT_TABLE;
511 DROP TABLE VARBIT_SHIFT_TABLE;