bit.out 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491
  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'00000000000');
  9. INSERT INTO BIT_TABLE VALUES (B'11011000000');
  10. INSERT INTO BIT_TABLE VALUES (B'01010101010');
  11. CREATE TABLE VARBIT_TABLE(v BIT VARYING(11));
  12. INSERT INTO VARBIT_TABLE VALUES (B'');
  13. INSERT INTO VARBIT_TABLE VALUES (B'0');
  14. INSERT INTO VARBIT_TABLE VALUES (B'010101');
  15. INSERT INTO VARBIT_TABLE VALUES (B'01010101010');
  16. -- test overflow cases
  17. SELECT SUBSTRING('01010101'::bit(8) FROM 2 FOR 2147483646) AS "1010101";
  18. 1010101
  19. ---------
  20. 1010101
  21. (1 row)
  22. SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR 2147483646) AS "01010101";
  23. 01010101
  24. ----------
  25. 01010101
  26. (1 row)
  27. SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR -2147483646) AS "error";
  28. ERROR: negative substring length not allowed
  29. SELECT SUBSTRING('01010101'::varbit FROM 2 FOR 2147483646) AS "1010101";
  30. 1010101
  31. ---------
  32. 1010101
  33. (1 row)
  34. SELECT SUBSTRING('01010101'::varbit FROM -10 FOR 2147483646) AS "01010101";
  35. 01010101
  36. ----------
  37. 01010101
  38. (1 row)
  39. SELECT SUBSTRING('01010101'::varbit FROM -10 FOR -2147483646) AS "error";
  40. ERROR: negative substring length not allowed
  41. CREATE TABLE varbit_table (a BIT VARYING(16), b BIT VARYING(16));
  42. DROP TABLE varbit_table;
  43. CREATE TABLE bit_table (a BIT(16), b BIT(16));
  44. DROP TABLE bit_table;
  45. -- The following should fail
  46. select B'001' & B'10';
  47. ERROR: cannot AND bit strings of different sizes
  48. select B'0111' | B'011';
  49. ERROR: cannot OR bit strings of different sizes
  50. select B'0010' # B'011101';
  51. ERROR: cannot XOR bit strings of different sizes
  52. -- More position tests, checking all the boundary cases
  53. SELECT POSITION(B'1010' IN B'0000101'); -- 0
  54. position
  55. ----------
  56. 0
  57. (1 row)
  58. SELECT POSITION(B'1010' IN B'00001010'); -- 5
  59. position
  60. ----------
  61. 5
  62. (1 row)
  63. SELECT POSITION(B'1010' IN B'00000101'); -- 0
  64. position
  65. ----------
  66. 0
  67. (1 row)
  68. SELECT POSITION(B'1010' IN B'000001010'); -- 6
  69. position
  70. ----------
  71. 6
  72. (1 row)
  73. SELECT POSITION(B'' IN B'00001010'); -- 1
  74. position
  75. ----------
  76. 1
  77. (1 row)
  78. SELECT POSITION(B'0' IN B''); -- 0
  79. position
  80. ----------
  81. 0
  82. (1 row)
  83. SELECT POSITION(B'' IN B''); -- 0
  84. position
  85. ----------
  86. 0
  87. (1 row)
  88. SELECT POSITION(B'101101' IN B'001011011011011000'); -- 3
  89. position
  90. ----------
  91. 3
  92. (1 row)
  93. SELECT POSITION(B'10110110' IN B'001011011011010'); -- 3
  94. position
  95. ----------
  96. 3
  97. (1 row)
  98. SELECT POSITION(B'1011011011011' IN B'001011011011011'); -- 3
  99. position
  100. ----------
  101. 3
  102. (1 row)
  103. SELECT POSITION(B'1011011011011' IN B'00001011011011011'); -- 5
  104. position
  105. ----------
  106. 5
  107. (1 row)
  108. SELECT POSITION(B'11101011' IN B'11101011'); -- 1
  109. position
  110. ----------
  111. 1
  112. (1 row)
  113. SELECT POSITION(B'11101011' IN B'011101011'); -- 2
  114. position
  115. ----------
  116. 2
  117. (1 row)
  118. SELECT POSITION(B'11101011' IN B'00011101011'); -- 4
  119. position
  120. ----------
  121. 4
  122. (1 row)
  123. SELECT POSITION(B'11101011' IN B'0000011101011'); -- 6
  124. position
  125. ----------
  126. 6
  127. (1 row)
  128. SELECT POSITION(B'111010110' IN B'111010110'); -- 1
  129. position
  130. ----------
  131. 1
  132. (1 row)
  133. SELECT POSITION(B'111010110' IN B'0111010110'); -- 2
  134. position
  135. ----------
  136. 2
  137. (1 row)
  138. SELECT POSITION(B'111010110' IN B'000111010110'); -- 4
  139. position
  140. ----------
  141. 4
  142. (1 row)
  143. SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6
  144. position
  145. ----------
  146. 6
  147. (1 row)
  148. SELECT POSITION(B'111010110' IN B'11101011'); -- 0
  149. position
  150. ----------
  151. 0
  152. (1 row)
  153. SELECT POSITION(B'111010110' IN B'011101011'); -- 0
  154. position
  155. ----------
  156. 0
  157. (1 row)
  158. SELECT POSITION(B'111010110' IN B'00011101011'); -- 0
  159. position
  160. ----------
  161. 0
  162. (1 row)
  163. SELECT POSITION(B'111010110' IN B'0000011101011'); -- 0
  164. position
  165. ----------
  166. 0
  167. (1 row)
  168. SELECT POSITION(B'111010110' IN B'111010110'); -- 1
  169. position
  170. ----------
  171. 1
  172. (1 row)
  173. SELECT POSITION(B'111010110' IN B'0111010110'); -- 2
  174. position
  175. ----------
  176. 2
  177. (1 row)
  178. SELECT POSITION(B'111010110' IN B'000111010110'); -- 4
  179. position
  180. ----------
  181. 4
  182. (1 row)
  183. SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6
  184. position
  185. ----------
  186. 6
  187. (1 row)
  188. SELECT POSITION(B'111010110' IN B'000001110101111101011'); -- 0
  189. position
  190. ----------
  191. 0
  192. (1 row)
  193. SELECT POSITION(B'111010110' IN B'0000001110101111101011'); -- 0
  194. position
  195. ----------
  196. 0
  197. (1 row)
  198. SELECT POSITION(B'111010110' IN B'000000001110101111101011'); -- 0
  199. position
  200. ----------
  201. 0
  202. (1 row)
  203. SELECT POSITION(B'111010110' IN B'00000000001110101111101011'); -- 0
  204. position
  205. ----------
  206. 0
  207. (1 row)
  208. SELECT POSITION(B'111010110' IN B'0000011101011111010110'); -- 14
  209. position
  210. ----------
  211. 14
  212. (1 row)
  213. SELECT POSITION(B'111010110' IN B'00000011101011111010110'); -- 15
  214. position
  215. ----------
  216. 15
  217. (1 row)
  218. SELECT POSITION(B'111010110' IN B'0000000011101011111010110'); -- 17
  219. position
  220. ----------
  221. 17
  222. (1 row)
  223. SELECT POSITION(B'111010110' IN B'000000000011101011111010110'); -- 19
  224. position
  225. ----------
  226. 19
  227. (1 row)
  228. SELECT POSITION(B'000000000011101011111010110' IN B'000000000011101011111010110'); -- 1
  229. position
  230. ----------
  231. 1
  232. (1 row)
  233. SELECT POSITION(B'00000000011101011111010110' IN B'000000000011101011111010110'); -- 2
  234. position
  235. ----------
  236. 2
  237. (1 row)
  238. SELECT POSITION(B'0000000000011101011111010110' IN B'000000000011101011111010110'); -- 0
  239. position
  240. ----------
  241. 0
  242. (1 row)
  243. -- Shifting
  244. CREATE TABLE BIT_SHIFT_TABLE(b BIT(16));
  245. INSERT INTO BIT_SHIFT_TABLE VALUES (B'1101100000000000');
  246. INSERT INTO BIT_SHIFT_TABLE SELECT b>>1 FROM BIT_SHIFT_TABLE;
  247. INSERT INTO BIT_SHIFT_TABLE SELECT b>>2 FROM BIT_SHIFT_TABLE;
  248. INSERT INTO BIT_SHIFT_TABLE SELECT b>>4 FROM BIT_SHIFT_TABLE;
  249. INSERT INTO BIT_SHIFT_TABLE SELECT b>>8 FROM BIT_SHIFT_TABLE;
  250. SELECT b, b >> 1 AS bsr, b << 1 AS bsl
  251. FROM BIT_SHIFT_TABLE ;
  252. b | bsr | bsl
  253. ------------------+------------------+------------------
  254. 1101100000000000 | 0110110000000000 | 1011000000000000
  255. 0110110000000000 | 0011011000000000 | 1101100000000000
  256. 0011011000000000 | 0001101100000000 | 0110110000000000
  257. 0001101100000000 | 0000110110000000 | 0011011000000000
  258. 0000110110000000 | 0000011011000000 | 0001101100000000
  259. 0000011011000000 | 0000001101100000 | 0000110110000000
  260. 0000001101100000 | 0000000110110000 | 0000011011000000
  261. 0000000110110000 | 0000000011011000 | 0000001101100000
  262. 0000000011011000 | 0000000001101100 | 0000000110110000
  263. 0000000001101100 | 0000000000110110 | 0000000011011000
  264. 0000000000110110 | 0000000000011011 | 0000000001101100
  265. 0000000000011011 | 0000000000001101 | 0000000000110110
  266. 0000000000001101 | 0000000000000110 | 0000000000011010
  267. 0000000000000110 | 0000000000000011 | 0000000000001100
  268. 0000000000000011 | 0000000000000001 | 0000000000000110
  269. 0000000000000001 | 0000000000000000 | 0000000000000010
  270. (16 rows)
  271. SELECT b, b >> 8 AS bsr8, b << 8 AS bsl8
  272. FROM BIT_SHIFT_TABLE ;
  273. b | bsr8 | bsl8
  274. ------------------+------------------+------------------
  275. 1101100000000000 | 0000000011011000 | 0000000000000000
  276. 0110110000000000 | 0000000001101100 | 0000000000000000
  277. 0011011000000000 | 0000000000110110 | 0000000000000000
  278. 0001101100000000 | 0000000000011011 | 0000000000000000
  279. 0000110110000000 | 0000000000001101 | 1000000000000000
  280. 0000011011000000 | 0000000000000110 | 1100000000000000
  281. 0000001101100000 | 0000000000000011 | 0110000000000000
  282. 0000000110110000 | 0000000000000001 | 1011000000000000
  283. 0000000011011000 | 0000000000000000 | 1101100000000000
  284. 0000000001101100 | 0000000000000000 | 0110110000000000
  285. 0000000000110110 | 0000000000000000 | 0011011000000000
  286. 0000000000011011 | 0000000000000000 | 0001101100000000
  287. 0000000000001101 | 0000000000000000 | 0000110100000000
  288. 0000000000000110 | 0000000000000000 | 0000011000000000
  289. 0000000000000011 | 0000000000000000 | 0000001100000000
  290. 0000000000000001 | 0000000000000000 | 0000000100000000
  291. (16 rows)
  292. SELECT b::bit(15), b::bit(15) >> 1 AS bsr, b::bit(15) << 1 AS bsl
  293. FROM BIT_SHIFT_TABLE ;
  294. b | bsr | bsl
  295. -----------------+-----------------+-----------------
  296. 110110000000000 | 011011000000000 | 101100000000000
  297. 011011000000000 | 001101100000000 | 110110000000000
  298. 001101100000000 | 000110110000000 | 011011000000000
  299. 000110110000000 | 000011011000000 | 001101100000000
  300. 000011011000000 | 000001101100000 | 000110110000000
  301. 000001101100000 | 000000110110000 | 000011011000000
  302. 000000110110000 | 000000011011000 | 000001101100000
  303. 000000011011000 | 000000001101100 | 000000110110000
  304. 000000001101100 | 000000000110110 | 000000011011000
  305. 000000000110110 | 000000000011011 | 000000001101100
  306. 000000000011011 | 000000000001101 | 000000000110110
  307. 000000000001101 | 000000000000110 | 000000000011010
  308. 000000000000110 | 000000000000011 | 000000000001100
  309. 000000000000011 | 000000000000001 | 000000000000110
  310. 000000000000001 | 000000000000000 | 000000000000010
  311. 000000000000000 | 000000000000000 | 000000000000000
  312. (16 rows)
  313. SELECT b::bit(15), b::bit(15) >> 8 AS bsr8, b::bit(15) << 8 AS bsl8
  314. FROM BIT_SHIFT_TABLE ;
  315. b | bsr8 | bsl8
  316. -----------------+-----------------+-----------------
  317. 110110000000000 | 000000001101100 | 000000000000000
  318. 011011000000000 | 000000000110110 | 000000000000000
  319. 001101100000000 | 000000000011011 | 000000000000000
  320. 000110110000000 | 000000000001101 | 000000000000000
  321. 000011011000000 | 000000000000110 | 100000000000000
  322. 000001101100000 | 000000000000011 | 110000000000000
  323. 000000110110000 | 000000000000001 | 011000000000000
  324. 000000011011000 | 000000000000000 | 101100000000000
  325. 000000001101100 | 000000000000000 | 110110000000000
  326. 000000000110110 | 000000000000000 | 011011000000000
  327. 000000000011011 | 000000000000000 | 001101100000000
  328. 000000000001101 | 000000000000000 | 000110100000000
  329. 000000000000110 | 000000000000000 | 000011000000000
  330. 000000000000011 | 000000000000000 | 000001100000000
  331. 000000000000001 | 000000000000000 | 000000100000000
  332. 000000000000000 | 000000000000000 | 000000000000000
  333. (16 rows)
  334. CREATE TABLE VARBIT_SHIFT_TABLE(v BIT VARYING(20));
  335. INSERT INTO VARBIT_SHIFT_TABLE VALUES (B'11011');
  336. INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0' AS BIT VARYING(6)) >>1 FROM VARBIT_SHIFT_TABLE;
  337. INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00' AS BIT VARYING(8)) >>2 FROM VARBIT_SHIFT_TABLE;
  338. INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0000' AS BIT VARYING(12)) >>4 FROM VARBIT_SHIFT_TABLE;
  339. INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00000000' AS BIT VARYING(20)) >>8 FROM VARBIT_SHIFT_TABLE;
  340. SELECT v, v >> 1 AS vsr, v << 1 AS vsl
  341. FROM VARBIT_SHIFT_TABLE ;
  342. v | vsr | vsl
  343. ----------------------+----------------------+----------------------
  344. 11011 | 01101 | 10110
  345. 011011 | 001101 | 110110
  346. 0011011 | 0001101 | 0110110
  347. 00011011 | 00001101 | 00110110
  348. 000011011 | 000001101 | 000110110
  349. 0000011011 | 0000001101 | 0000110110
  350. 00000011011 | 00000001101 | 00000110110
  351. 000000011011 | 000000001101 | 000000110110
  352. 0000000011011 | 0000000001101 | 0000000110110
  353. 00000000011011 | 00000000001101 | 00000000110110
  354. 000000000011011 | 000000000001101 | 000000000110110
  355. 0000000000011011 | 0000000000001101 | 0000000000110110
  356. 00000000000011011 | 00000000000001101 | 00000000000110110
  357. 000000000000011011 | 000000000000001101 | 000000000000110110
  358. 0000000000000011011 | 0000000000000001101 | 0000000000000110110
  359. 00000000000000011011 | 00000000000000001101 | 00000000000000110110
  360. (16 rows)
  361. SELECT v, v >> 8 AS vsr8, v << 8 AS vsl8
  362. FROM VARBIT_SHIFT_TABLE ;
  363. v | vsr8 | vsl8
  364. ----------------------+----------------------+----------------------
  365. 11011 | 00000 | 00000
  366. 011011 | 000000 | 000000
  367. 0011011 | 0000000 | 0000000
  368. 00011011 | 00000000 | 00000000
  369. 000011011 | 000000000 | 100000000
  370. 0000011011 | 0000000000 | 1100000000
  371. 00000011011 | 00000000000 | 01100000000
  372. 000000011011 | 000000000000 | 101100000000
  373. 0000000011011 | 0000000000000 | 1101100000000
  374. 00000000011011 | 00000000000000 | 01101100000000
  375. 000000000011011 | 000000000000000 | 001101100000000
  376. 0000000000011011 | 0000000000000000 | 0001101100000000
  377. 00000000000011011 | 00000000000000000 | 00001101100000000
  378. 000000000000011011 | 000000000000000000 | 000001101100000000
  379. 0000000000000011011 | 0000000000000000000 | 0000001101100000000
  380. 00000000000000011011 | 00000000000000000000 | 00000001101100000000
  381. (16 rows)
  382. DROP TABLE BIT_SHIFT_TABLE;
  383. DROP TABLE VARBIT_SHIFT_TABLE;
  384. -- Get/Set bit
  385. SELECT get_bit(B'0101011000100', 10);
  386. get_bit
  387. ---------
  388. 1
  389. (1 row)
  390. SELECT set_bit(B'0101011000100100', 15, 1);
  391. set_bit
  392. ------------------
  393. 0101011000100101
  394. (1 row)
  395. SELECT set_bit(B'0101011000100100', 16, 1); -- fail
  396. ERROR: bit index 16 out of valid range (0..15)
  397. -- Overlay
  398. SELECT overlay(B'0101011100' placing '001' from 2 for 3);
  399. overlay
  400. ------------
  401. 0001011100
  402. (1 row)
  403. SELECT overlay(B'0101011100' placing '101' from 6);
  404. overlay
  405. ------------
  406. 0101010100
  407. (1 row)
  408. SELECT overlay(B'0101011100' placing '001' from 11);
  409. overlay
  410. ---------------
  411. 0101011100001
  412. (1 row)
  413. SELECT overlay(B'0101011100' placing '001' from 20);
  414. overlay
  415. ---------------
  416. 0101011100001
  417. (1 row)
  418. -- bit_count
  419. SELECT bit_count(B'0101011100'::bit(10));
  420. bit_count
  421. -----------
  422. 5
  423. (1 row)
  424. SELECT bit_count(B'1111111111'::bit(10));
  425. bit_count
  426. -----------
  427. 10
  428. (1 row)
  429. -- This table is intentionally left around to exercise pg_dump/pg_upgrade
  430. CREATE TABLE bit_defaults(
  431. b1 bit(4) DEFAULT '1001',
  432. b2 bit(4) DEFAULT B'0101',
  433. b3 bit varying(5) DEFAULT '1001',
  434. b4 bit varying(5) DEFAULT B'0101'
  435. );