bit.sql 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  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. INSERT INTO BIT_TABLE VALUES (B'00000000000');
  10. INSERT INTO BIT_TABLE VALUES (B'11011000000');
  11. INSERT INTO BIT_TABLE VALUES (B'01010101010');
  12. INSERT INTO BIT_TABLE VALUES (B'101011111010'); -- too long
  13. --INSERT INTO BIT_TABLE VALUES ('X554');
  14. --INSERT INTO BIT_TABLE VALUES ('X555');
  15. SELECT * FROM BIT_TABLE;
  16. CREATE TABLE VARBIT_TABLE(v BIT VARYING(11));
  17. INSERT INTO VARBIT_TABLE VALUES (B'');
  18. INSERT INTO VARBIT_TABLE VALUES (B'0');
  19. INSERT INTO VARBIT_TABLE VALUES (B'010101');
  20. INSERT INTO VARBIT_TABLE VALUES (B'01010101010');
  21. INSERT INTO VARBIT_TABLE VALUES (B'101011111010'); -- too long
  22. --INSERT INTO VARBIT_TABLE VALUES ('X554');
  23. --INSERT INTO VARBIT_TABLE VALUES ('X555');
  24. SELECT * FROM VARBIT_TABLE;
  25. -- Concatenation
  26. SELECT v, b, (v || b) AS concat
  27. FROM BIT_TABLE, VARBIT_TABLE
  28. ORDER BY 3;
  29. -- Length
  30. SELECT b, length(b) AS lb
  31. FROM BIT_TABLE;
  32. SELECT v, length(v) AS lv
  33. FROM VARBIT_TABLE;
  34. -- Substring
  35. SELECT b,
  36. SUBSTRING(b FROM 2 FOR 4) AS sub_2_4,
  37. SUBSTRING(b FROM 7 FOR 13) AS sub_7_13,
  38. SUBSTRING(b FROM 6) AS sub_6
  39. FROM BIT_TABLE;
  40. SELECT v,
  41. SUBSTRING(v FROM 2 FOR 4) AS sub_2_4,
  42. SUBSTRING(v FROM 7 FOR 13) AS sub_7_13,
  43. SUBSTRING(v FROM 6) AS sub_6
  44. FROM VARBIT_TABLE;
  45. -- test overflow cases
  46. SELECT SUBSTRING('01010101'::bit(8) FROM 2 FOR 2147483646) AS "1010101";
  47. SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR 2147483646) AS "01010101";
  48. SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR -2147483646) AS "error";
  49. SELECT SUBSTRING('01010101'::varbit FROM 2 FOR 2147483646) AS "1010101";
  50. SELECT SUBSTRING('01010101'::varbit FROM -10 FOR 2147483646) AS "01010101";
  51. SELECT SUBSTRING('01010101'::varbit FROM -10 FOR -2147483646) AS "error";
  52. --- Bit operations
  53. DROP TABLE varbit_table;
  54. CREATE TABLE varbit_table (a BIT VARYING(16), b BIT VARYING(16));
  55. COPY varbit_table FROM stdin;
  56. X0F X10
  57. X1F X11
  58. X2F X12
  59. X3F X13
  60. X8F X04
  61. X000F X0010
  62. X0123 XFFFF
  63. X2468 X2468
  64. XFA50 X05AF
  65. X1234 XFFF5
  66. \.
  67. SELECT a, b, ~a AS "~ a", a & b AS "a & b",
  68. a | b AS "a | b", a # b AS "a # b" FROM varbit_table;
  69. SELECT a,b,a<b AS "a<b",a<=b AS "a<=b",a=b AS "a=b",
  70. a>=b AS "a>=b",a>b AS "a>b",a<>b AS "a<>b" FROM varbit_table;
  71. SELECT a,a<<4 AS "a<<4",b,b>>2 AS "b>>2" FROM varbit_table;
  72. DROP TABLE varbit_table;
  73. --- Bit operations
  74. DROP TABLE bit_table;
  75. CREATE TABLE bit_table (a BIT(16), b BIT(16));
  76. COPY bit_table FROM stdin;
  77. X0F00 X1000
  78. X1F00 X1100
  79. X2F00 X1200
  80. X3F00 X1300
  81. X8F00 X0400
  82. X000F X0010
  83. X0123 XFFFF
  84. X2468 X2468
  85. XFA50 X05AF
  86. X1234 XFFF5
  87. \.
  88. SELECT a,b,~a AS "~ a",a & b AS "a & b",
  89. a|b AS "a | b", a # b AS "a # b" FROM bit_table;
  90. SELECT a,b,a<b AS "a<b",a<=b AS "a<=b",a=b AS "a=b",
  91. a>=b AS "a>=b",a>b AS "a>b",a<>b AS "a<>b" FROM bit_table;
  92. SELECT a,a<<4 AS "a<<4",b,b>>2 AS "b>>2" FROM bit_table;
  93. DROP TABLE bit_table;
  94. -- The following should fail
  95. select B'001' & B'10';
  96. select B'0111' | B'011';
  97. select B'0010' # B'011101';
  98. -- More position tests, checking all the boundary cases
  99. SELECT POSITION(B'1010' IN B'0000101'); -- 0
  100. SELECT POSITION(B'1010' IN B'00001010'); -- 5
  101. SELECT POSITION(B'1010' IN B'00000101'); -- 0
  102. SELECT POSITION(B'1010' IN B'000001010'); -- 6
  103. SELECT POSITION(B'' IN B'00001010'); -- 1
  104. SELECT POSITION(B'0' IN B''); -- 0
  105. SELECT POSITION(B'' IN B''); -- 0
  106. SELECT POSITION(B'101101' IN B'001011011011011000'); -- 3
  107. SELECT POSITION(B'10110110' IN B'001011011011010'); -- 3
  108. SELECT POSITION(B'1011011011011' IN B'001011011011011'); -- 3
  109. SELECT POSITION(B'1011011011011' IN B'00001011011011011'); -- 5
  110. SELECT POSITION(B'11101011' IN B'11101011'); -- 1
  111. SELECT POSITION(B'11101011' IN B'011101011'); -- 2
  112. SELECT POSITION(B'11101011' IN B'00011101011'); -- 4
  113. SELECT POSITION(B'11101011' IN B'0000011101011'); -- 6
  114. SELECT POSITION(B'111010110' IN B'111010110'); -- 1
  115. SELECT POSITION(B'111010110' IN B'0111010110'); -- 2
  116. SELECT POSITION(B'111010110' IN B'000111010110'); -- 4
  117. SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6
  118. SELECT POSITION(B'111010110' IN B'11101011'); -- 0
  119. SELECT POSITION(B'111010110' IN B'011101011'); -- 0
  120. SELECT POSITION(B'111010110' IN B'00011101011'); -- 0
  121. SELECT POSITION(B'111010110' IN B'0000011101011'); -- 0
  122. SELECT POSITION(B'111010110' IN B'111010110'); -- 1
  123. SELECT POSITION(B'111010110' IN B'0111010110'); -- 2
  124. SELECT POSITION(B'111010110' IN B'000111010110'); -- 4
  125. SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6
  126. SELECT POSITION(B'111010110' IN B'000001110101111101011'); -- 0
  127. SELECT POSITION(B'111010110' IN B'0000001110101111101011'); -- 0
  128. SELECT POSITION(B'111010110' IN B'000000001110101111101011'); -- 0
  129. SELECT POSITION(B'111010110' IN B'00000000001110101111101011'); -- 0
  130. SELECT POSITION(B'111010110' IN B'0000011101011111010110'); -- 14
  131. SELECT POSITION(B'111010110' IN B'00000011101011111010110'); -- 15
  132. SELECT POSITION(B'111010110' IN B'0000000011101011111010110'); -- 17
  133. SELECT POSITION(B'111010110' IN B'000000000011101011111010110'); -- 19
  134. SELECT POSITION(B'000000000011101011111010110' IN B'000000000011101011111010110'); -- 1
  135. SELECT POSITION(B'00000000011101011111010110' IN B'000000000011101011111010110'); -- 2
  136. SELECT POSITION(B'0000000000011101011111010110' IN B'000000000011101011111010110'); -- 0
  137. -- Shifting
  138. CREATE TABLE BIT_SHIFT_TABLE(b BIT(16));
  139. INSERT INTO BIT_SHIFT_TABLE VALUES (B'1101100000000000');
  140. INSERT INTO BIT_SHIFT_TABLE SELECT b>>1 FROM BIT_SHIFT_TABLE;
  141. INSERT INTO BIT_SHIFT_TABLE SELECT b>>2 FROM BIT_SHIFT_TABLE;
  142. INSERT INTO BIT_SHIFT_TABLE SELECT b>>4 FROM BIT_SHIFT_TABLE;
  143. INSERT INTO BIT_SHIFT_TABLE SELECT b>>8 FROM BIT_SHIFT_TABLE;
  144. SELECT POSITION(B'1101' IN b),
  145. POSITION(B'11011' IN b),
  146. b
  147. FROM BIT_SHIFT_TABLE ;
  148. SELECT b, b >> 1 AS bsr, b << 1 AS bsl
  149. FROM BIT_SHIFT_TABLE ;
  150. SELECT b, b >> 8 AS bsr8, b << 8 AS bsl8
  151. FROM BIT_SHIFT_TABLE ;
  152. SELECT b::bit(15), b::bit(15) >> 1 AS bsr, b::bit(15) << 1 AS bsl
  153. FROM BIT_SHIFT_TABLE ;
  154. SELECT b::bit(15), b::bit(15) >> 8 AS bsr8, b::bit(15) << 8 AS bsl8
  155. FROM BIT_SHIFT_TABLE ;
  156. CREATE TABLE VARBIT_SHIFT_TABLE(v BIT VARYING(20));
  157. INSERT INTO VARBIT_SHIFT_TABLE VALUES (B'11011');
  158. INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0' AS BIT VARYING(6)) >>1 FROM VARBIT_SHIFT_TABLE;
  159. INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00' AS BIT VARYING(8)) >>2 FROM VARBIT_SHIFT_TABLE;
  160. INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0000' AS BIT VARYING(12)) >>4 FROM VARBIT_SHIFT_TABLE;
  161. INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00000000' AS BIT VARYING(20)) >>8 FROM VARBIT_SHIFT_TABLE;
  162. SELECT POSITION(B'1101' IN v),
  163. POSITION(B'11011' IN v),
  164. v
  165. FROM VARBIT_SHIFT_TABLE ;
  166. SELECT v, v >> 1 AS vsr, v << 1 AS vsl
  167. FROM VARBIT_SHIFT_TABLE ;
  168. SELECT v, v >> 8 AS vsr8, v << 8 AS vsl8
  169. FROM VARBIT_SHIFT_TABLE ;
  170. DROP TABLE BIT_SHIFT_TABLE;
  171. DROP TABLE VARBIT_SHIFT_TABLE;
  172. -- Get/Set bit
  173. SELECT get_bit(B'0101011000100', 10);
  174. SELECT set_bit(B'0101011000100100', 15, 1);
  175. SELECT set_bit(B'0101011000100100', 16, 1); -- fail
  176. -- Overlay
  177. SELECT overlay(B'0101011100' placing '001' from 2 for 3);
  178. SELECT overlay(B'0101011100' placing '101' from 6);
  179. SELECT overlay(B'0101011100' placing '001' from 11);
  180. SELECT overlay(B'0101011100' placing '001' from 20);
  181. -- bit_count
  182. SELECT bit_count(B'0101011100'::bit(10));
  183. SELECT bit_count(B'1111111111'::bit(10));
  184. -- This table is intentionally left around to exercise pg_dump/pg_upgrade
  185. CREATE TABLE bit_defaults(
  186. b1 bit(4) DEFAULT '1001',
  187. b2 bit(4) DEFAULT B'0101',
  188. b3 bit varying(5) DEFAULT '1001',
  189. b4 bit varying(5) DEFAULT B'0101'
  190. );
  191. \d bit_defaults
  192. INSERT INTO bit_defaults DEFAULT VALUES;
  193. TABLE bit_defaults;