bit.out 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748
  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)
  24. CREATE TABLE VARBIT_TABLE(v BIT VARYING(11));
  25. INSERT INTO VARBIT_TABLE VALUES (B'');
  26. INSERT INTO VARBIT_TABLE VALUES (B'0');
  27. INSERT INTO VARBIT_TABLE VALUES (B'010101');
  28. INSERT INTO VARBIT_TABLE VALUES (B'01010101010');
  29. INSERT INTO VARBIT_TABLE VALUES (B'101011111010'); -- too long
  30. ERROR: bit string too long for type bit varying(11)
  31. --INSERT INTO VARBIT_TABLE VALUES ('X554');
  32. --INSERT INTO VARBIT_TABLE VALUES ('X555');
  33. SELECT * FROM VARBIT_TABLE;
  34. v
  35. -------------
  36. 0
  37. 010101
  38. 01010101010
  39. (4 rows)
  40. -- Concatenation
  41. SELECT v, b, (v || b) AS concat
  42. FROM BIT_TABLE, VARBIT_TABLE
  43. ORDER BY 3;
  44. v | b | concat
  45. -------------+-------------+------------------------
  46. | 00000000000 | 00000000000
  47. 0 | 00000000000 | 000000000000
  48. 0 | 01010101010 | 001010101010
  49. 010101 | 00000000000 | 01010100000000000
  50. | 01010101010 | 01010101010
  51. 01010101010 | 00000000000 | 0101010101000000000000
  52. 01010101010 | 01010101010 | 0101010101001010101010
  53. 010101 | 01010101010 | 01010101010101010
  54. 01010101010 | 11011000000 | 0101010101011011000000
  55. 010101 | 11011000000 | 01010111011000000
  56. 0 | 11011000000 | 011011000000
  57. | 11011000000 | 11011000000
  58. (12 rows)
  59. -- Length
  60. SELECT b, length(b) AS lb
  61. FROM BIT_TABLE;
  62. b | lb
  63. -------------+----
  64. 00000000000 | 11
  65. 11011000000 | 11
  66. 01010101010 | 11
  67. (3 rows)
  68. SELECT v, length(v) AS lv
  69. FROM VARBIT_TABLE;
  70. v | lv
  71. -------------+----
  72. | 0
  73. 0 | 1
  74. 010101 | 6
  75. 01010101010 | 11
  76. (4 rows)
  77. -- Substring
  78. SELECT b,
  79. SUBSTRING(b FROM 2 FOR 4) AS sub_2_4,
  80. SUBSTRING(b FROM 7 FOR 13) AS sub_7_13,
  81. SUBSTRING(b FROM 6) AS sub_6
  82. FROM BIT_TABLE;
  83. b | sub_2_4 | sub_7_13 | sub_6
  84. -------------+---------+----------+--------
  85. 00000000000 | 0000 | 00000 | 000000
  86. 11011000000 | 1011 | 00000 | 000000
  87. 01010101010 | 1010 | 01010 | 101010
  88. (3 rows)
  89. SELECT v,
  90. SUBSTRING(v FROM 2 FOR 4) AS sub_2_4,
  91. SUBSTRING(v FROM 7 FOR 13) AS sub_7_13,
  92. SUBSTRING(v FROM 6) AS sub_6
  93. FROM VARBIT_TABLE;
  94. v | sub_2_4 | sub_7_13 | sub_6
  95. -------------+---------+----------+--------
  96. | | |
  97. 0 | | |
  98. 010101 | 1010 | | 1
  99. 01010101010 | 1010 | 01010 | 101010
  100. (4 rows)
  101. -- test overflow cases
  102. SELECT SUBSTRING('01010101'::bit(8) FROM 2 FOR 2147483646) AS "1010101";
  103. 1010101
  104. ---------
  105. 1010101
  106. (1 row)
  107. SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR 2147483646) AS "01010101";
  108. 01010101
  109. ----------
  110. 01010101
  111. (1 row)
  112. SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR -2147483646) AS "error";
  113. ERROR: negative substring length not allowed
  114. SELECT SUBSTRING('01010101'::varbit FROM 2 FOR 2147483646) AS "1010101";
  115. 1010101
  116. ---------
  117. 1010101
  118. (1 row)
  119. SELECT SUBSTRING('01010101'::varbit FROM -10 FOR 2147483646) AS "01010101";
  120. 01010101
  121. ----------
  122. 01010101
  123. (1 row)
  124. SELECT SUBSTRING('01010101'::varbit FROM -10 FOR -2147483646) AS "error";
  125. ERROR: negative substring length not allowed
  126. --- Bit operations
  127. DROP TABLE varbit_table;
  128. CREATE TABLE varbit_table (a BIT VARYING(16), b BIT VARYING(16));
  129. COPY varbit_table FROM stdin;
  130. SELECT a, b, ~a AS "~ a", a & b AS "a & b",
  131. a | b AS "a | b", a # b AS "a # b" FROM varbit_table;
  132. a | b | ~ a | a & b | a | b | a # b
  133. ------------------+------------------+------------------+------------------+------------------+------------------
  134. 00001111 | 00010000 | 11110000 | 00000000 | 00011111 | 00011111
  135. 00011111 | 00010001 | 11100000 | 00010001 | 00011111 | 00001110
  136. 00101111 | 00010010 | 11010000 | 00000010 | 00111111 | 00111101
  137. 00111111 | 00010011 | 11000000 | 00010011 | 00111111 | 00101100
  138. 10001111 | 00000100 | 01110000 | 00000100 | 10001111 | 10001011
  139. 0000000000001111 | 0000000000010000 | 1111111111110000 | 0000000000000000 | 0000000000011111 | 0000000000011111
  140. 0000000100100011 | 1111111111111111 | 1111111011011100 | 0000000100100011 | 1111111111111111 | 1111111011011100
  141. 0010010001101000 | 0010010001101000 | 1101101110010111 | 0010010001101000 | 0010010001101000 | 0000000000000000
  142. 1111101001010000 | 0000010110101111 | 0000010110101111 | 0000000000000000 | 1111111111111111 | 1111111111111111
  143. 0001001000110100 | 1111111111110101 | 1110110111001011 | 0001001000110100 | 1111111111110101 | 1110110111000001
  144. (10 rows)
  145. SELECT a,b,a<b AS "a<b",a<=b AS "a<=b",a=b AS "a=b",
  146. a>=b AS "a>=b",a>b AS "a>b",a<>b AS "a<>b" FROM varbit_table;
  147. a | b | a<b | a<=b | a=b | a>=b | a>b | a<>b
  148. ------------------+------------------+-----+------+-----+------+-----+------
  149. 00001111 | 00010000 | t | t | f | f | f | t
  150. 00011111 | 00010001 | f | f | f | t | t | t
  151. 00101111 | 00010010 | f | f | f | t | t | t
  152. 00111111 | 00010011 | f | f | f | t | t | t
  153. 10001111 | 00000100 | f | f | f | t | t | t
  154. 0000000000001111 | 0000000000010000 | t | t | f | f | f | t
  155. 0000000100100011 | 1111111111111111 | t | t | f | f | f | t
  156. 0010010001101000 | 0010010001101000 | f | t | t | t | f | f
  157. 1111101001010000 | 0000010110101111 | f | f | f | t | t | t
  158. 0001001000110100 | 1111111111110101 | t | t | f | f | f | t
  159. (10 rows)
  160. SELECT a,a<<4 AS "a<<4",b,b>>2 AS "b>>2" FROM varbit_table;
  161. a | a<<4 | b | b>>2
  162. ------------------+------------------+------------------+------------------
  163. 00001111 | 11110000 | 00010000 | 00000100
  164. 00011111 | 11110000 | 00010001 | 00000100
  165. 00101111 | 11110000 | 00010010 | 00000100
  166. 00111111 | 11110000 | 00010011 | 00000100
  167. 10001111 | 11110000 | 00000100 | 00000001
  168. 0000000000001111 | 0000000011110000 | 0000000000010000 | 0000000000000100
  169. 0000000100100011 | 0001001000110000 | 1111111111111111 | 0011111111111111
  170. 0010010001101000 | 0100011010000000 | 0010010001101000 | 0000100100011010
  171. 1111101001010000 | 1010010100000000 | 0000010110101111 | 0000000101101011
  172. 0001001000110100 | 0010001101000000 | 1111111111110101 | 0011111111111101
  173. (10 rows)
  174. DROP TABLE varbit_table;
  175. --- Bit operations
  176. DROP TABLE bit_table;
  177. CREATE TABLE bit_table (a BIT(16), b BIT(16));
  178. COPY bit_table FROM stdin;
  179. SELECT a,b,~a AS "~ a",a & b AS "a & b",
  180. a|b AS "a | b", a # b AS "a # b" FROM bit_table;
  181. a | b | ~ a | a & b | a | b | a # b
  182. ------------------+------------------+------------------+------------------+------------------+------------------
  183. 0000111100000000 | 0001000000000000 | 1111000011111111 | 0000000000000000 | 0001111100000000 | 0001111100000000
  184. 0001111100000000 | 0001000100000000 | 1110000011111111 | 0001000100000000 | 0001111100000000 | 0000111000000000
  185. 0010111100000000 | 0001001000000000 | 1101000011111111 | 0000001000000000 | 0011111100000000 | 0011110100000000
  186. 0011111100000000 | 0001001100000000 | 1100000011111111 | 0001001100000000 | 0011111100000000 | 0010110000000000
  187. 1000111100000000 | 0000010000000000 | 0111000011111111 | 0000010000000000 | 1000111100000000 | 1000101100000000
  188. 0000000000001111 | 0000000000010000 | 1111111111110000 | 0000000000000000 | 0000000000011111 | 0000000000011111
  189. 0000000100100011 | 1111111111111111 | 1111111011011100 | 0000000100100011 | 1111111111111111 | 1111111011011100
  190. 0010010001101000 | 0010010001101000 | 1101101110010111 | 0010010001101000 | 0010010001101000 | 0000000000000000
  191. 1111101001010000 | 0000010110101111 | 0000010110101111 | 0000000000000000 | 1111111111111111 | 1111111111111111
  192. 0001001000110100 | 1111111111110101 | 1110110111001011 | 0001001000110100 | 1111111111110101 | 1110110111000001
  193. (10 rows)
  194. SELECT a,b,a<b AS "a<b",a<=b AS "a<=b",a=b AS "a=b",
  195. a>=b AS "a>=b",a>b AS "a>b",a<>b AS "a<>b" FROM bit_table;
  196. a | b | a<b | a<=b | a=b | a>=b | a>b | a<>b
  197. ------------------+------------------+-----+------+-----+------+-----+------
  198. 0000111100000000 | 0001000000000000 | t | t | f | f | f | t
  199. 0001111100000000 | 0001000100000000 | f | f | f | t | t | t
  200. 0010111100000000 | 0001001000000000 | f | f | f | t | t | t
  201. 0011111100000000 | 0001001100000000 | f | f | f | t | t | t
  202. 1000111100000000 | 0000010000000000 | f | f | f | t | t | t
  203. 0000000000001111 | 0000000000010000 | t | t | f | f | f | t
  204. 0000000100100011 | 1111111111111111 | t | t | f | f | f | t
  205. 0010010001101000 | 0010010001101000 | f | t | t | t | f | f
  206. 1111101001010000 | 0000010110101111 | f | f | f | t | t | t
  207. 0001001000110100 | 1111111111110101 | t | t | f | f | f | t
  208. (10 rows)
  209. SELECT a,a<<4 AS "a<<4",b,b>>2 AS "b>>2" FROM bit_table;
  210. a | a<<4 | b | b>>2
  211. ------------------+------------------+------------------+------------------
  212. 0000111100000000 | 1111000000000000 | 0001000000000000 | 0000010000000000
  213. 0001111100000000 | 1111000000000000 | 0001000100000000 | 0000010001000000
  214. 0010111100000000 | 1111000000000000 | 0001001000000000 | 0000010010000000
  215. 0011111100000000 | 1111000000000000 | 0001001100000000 | 0000010011000000
  216. 1000111100000000 | 1111000000000000 | 0000010000000000 | 0000000100000000
  217. 0000000000001111 | 0000000011110000 | 0000000000010000 | 0000000000000100
  218. 0000000100100011 | 0001001000110000 | 1111111111111111 | 0011111111111111
  219. 0010010001101000 | 0100011010000000 | 0010010001101000 | 0000100100011010
  220. 1111101001010000 | 1010010100000000 | 0000010110101111 | 0000000101101011
  221. 0001001000110100 | 0010001101000000 | 1111111111110101 | 0011111111111101
  222. (10 rows)
  223. DROP TABLE bit_table;
  224. -- The following should fail
  225. select B'001' & B'10';
  226. ERROR: cannot AND bit strings of different sizes
  227. select B'0111' | B'011';
  228. ERROR: cannot OR bit strings of different sizes
  229. select B'0010' # B'011101';
  230. ERROR: cannot XOR bit strings of different sizes
  231. -- More position tests, checking all the boundary cases
  232. SELECT POSITION(B'1010' IN B'0000101'); -- 0
  233. position
  234. ----------
  235. 0
  236. (1 row)
  237. SELECT POSITION(B'1010' IN B'00001010'); -- 5
  238. position
  239. ----------
  240. 5
  241. (1 row)
  242. SELECT POSITION(B'1010' IN B'00000101'); -- 0
  243. position
  244. ----------
  245. 0
  246. (1 row)
  247. SELECT POSITION(B'1010' IN B'000001010'); -- 6
  248. position
  249. ----------
  250. 6
  251. (1 row)
  252. SELECT POSITION(B'' IN B'00001010'); -- 1
  253. position
  254. ----------
  255. 1
  256. (1 row)
  257. SELECT POSITION(B'0' IN B''); -- 0
  258. position
  259. ----------
  260. 0
  261. (1 row)
  262. SELECT POSITION(B'' IN B''); -- 0
  263. position
  264. ----------
  265. 0
  266. (1 row)
  267. SELECT POSITION(B'101101' IN B'001011011011011000'); -- 3
  268. position
  269. ----------
  270. 3
  271. (1 row)
  272. SELECT POSITION(B'10110110' IN B'001011011011010'); -- 3
  273. position
  274. ----------
  275. 3
  276. (1 row)
  277. SELECT POSITION(B'1011011011011' IN B'001011011011011'); -- 3
  278. position
  279. ----------
  280. 3
  281. (1 row)
  282. SELECT POSITION(B'1011011011011' IN B'00001011011011011'); -- 5
  283. position
  284. ----------
  285. 5
  286. (1 row)
  287. SELECT POSITION(B'11101011' IN B'11101011'); -- 1
  288. position
  289. ----------
  290. 1
  291. (1 row)
  292. SELECT POSITION(B'11101011' IN B'011101011'); -- 2
  293. position
  294. ----------
  295. 2
  296. (1 row)
  297. SELECT POSITION(B'11101011' IN B'00011101011'); -- 4
  298. position
  299. ----------
  300. 4
  301. (1 row)
  302. SELECT POSITION(B'11101011' IN B'0000011101011'); -- 6
  303. position
  304. ----------
  305. 6
  306. (1 row)
  307. SELECT POSITION(B'111010110' IN B'111010110'); -- 1
  308. position
  309. ----------
  310. 1
  311. (1 row)
  312. SELECT POSITION(B'111010110' IN B'0111010110'); -- 2
  313. position
  314. ----------
  315. 2
  316. (1 row)
  317. SELECT POSITION(B'111010110' IN B'000111010110'); -- 4
  318. position
  319. ----------
  320. 4
  321. (1 row)
  322. SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6
  323. position
  324. ----------
  325. 6
  326. (1 row)
  327. SELECT POSITION(B'111010110' IN B'11101011'); -- 0
  328. position
  329. ----------
  330. 0
  331. (1 row)
  332. SELECT POSITION(B'111010110' IN B'011101011'); -- 0
  333. position
  334. ----------
  335. 0
  336. (1 row)
  337. SELECT POSITION(B'111010110' IN B'00011101011'); -- 0
  338. position
  339. ----------
  340. 0
  341. (1 row)
  342. SELECT POSITION(B'111010110' IN B'0000011101011'); -- 0
  343. position
  344. ----------
  345. 0
  346. (1 row)
  347. SELECT POSITION(B'111010110' IN B'111010110'); -- 1
  348. position
  349. ----------
  350. 1
  351. (1 row)
  352. SELECT POSITION(B'111010110' IN B'0111010110'); -- 2
  353. position
  354. ----------
  355. 2
  356. (1 row)
  357. SELECT POSITION(B'111010110' IN B'000111010110'); -- 4
  358. position
  359. ----------
  360. 4
  361. (1 row)
  362. SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6
  363. position
  364. ----------
  365. 6
  366. (1 row)
  367. SELECT POSITION(B'111010110' IN B'000001110101111101011'); -- 0
  368. position
  369. ----------
  370. 0
  371. (1 row)
  372. SELECT POSITION(B'111010110' IN B'0000001110101111101011'); -- 0
  373. position
  374. ----------
  375. 0
  376. (1 row)
  377. SELECT POSITION(B'111010110' IN B'000000001110101111101011'); -- 0
  378. position
  379. ----------
  380. 0
  381. (1 row)
  382. SELECT POSITION(B'111010110' IN B'00000000001110101111101011'); -- 0
  383. position
  384. ----------
  385. 0
  386. (1 row)
  387. SELECT POSITION(B'111010110' IN B'0000011101011111010110'); -- 14
  388. position
  389. ----------
  390. 14
  391. (1 row)
  392. SELECT POSITION(B'111010110' IN B'00000011101011111010110'); -- 15
  393. position
  394. ----------
  395. 15
  396. (1 row)
  397. SELECT POSITION(B'111010110' IN B'0000000011101011111010110'); -- 17
  398. position
  399. ----------
  400. 17
  401. (1 row)
  402. SELECT POSITION(B'111010110' IN B'000000000011101011111010110'); -- 19
  403. position
  404. ----------
  405. 19
  406. (1 row)
  407. SELECT POSITION(B'000000000011101011111010110' IN B'000000000011101011111010110'); -- 1
  408. position
  409. ----------
  410. 1
  411. (1 row)
  412. SELECT POSITION(B'00000000011101011111010110' IN B'000000000011101011111010110'); -- 2
  413. position
  414. ----------
  415. 2
  416. (1 row)
  417. SELECT POSITION(B'0000000000011101011111010110' IN B'000000000011101011111010110'); -- 0
  418. position
  419. ----------
  420. 0
  421. (1 row)
  422. -- Shifting
  423. CREATE TABLE BIT_SHIFT_TABLE(b BIT(16));
  424. INSERT INTO BIT_SHIFT_TABLE VALUES (B'1101100000000000');
  425. INSERT INTO BIT_SHIFT_TABLE SELECT b>>1 FROM BIT_SHIFT_TABLE;
  426. INSERT INTO BIT_SHIFT_TABLE SELECT b>>2 FROM BIT_SHIFT_TABLE;
  427. INSERT INTO BIT_SHIFT_TABLE SELECT b>>4 FROM BIT_SHIFT_TABLE;
  428. INSERT INTO BIT_SHIFT_TABLE SELECT b>>8 FROM BIT_SHIFT_TABLE;
  429. SELECT POSITION(B'1101' IN b),
  430. POSITION(B'11011' IN b),
  431. b
  432. FROM BIT_SHIFT_TABLE ;
  433. position | position | b
  434. ----------+----------+------------------
  435. 1 | 1 | 1101100000000000
  436. 2 | 2 | 0110110000000000
  437. 3 | 3 | 0011011000000000
  438. 4 | 4 | 0001101100000000
  439. 5 | 5 | 0000110110000000
  440. 6 | 6 | 0000011011000000
  441. 7 | 7 | 0000001101100000
  442. 8 | 8 | 0000000110110000
  443. 9 | 9 | 0000000011011000
  444. 10 | 10 | 0000000001101100
  445. 11 | 11 | 0000000000110110
  446. 12 | 12 | 0000000000011011
  447. 13 | 0 | 0000000000001101
  448. 0 | 0 | 0000000000000110
  449. 0 | 0 | 0000000000000011
  450. 0 | 0 | 0000000000000001
  451. (16 rows)
  452. SELECT b, b >> 1 AS bsr, b << 1 AS bsl
  453. FROM BIT_SHIFT_TABLE ;
  454. b | bsr | bsl
  455. ------------------+------------------+------------------
  456. 1101100000000000 | 0110110000000000 | 1011000000000000
  457. 0110110000000000 | 0011011000000000 | 1101100000000000
  458. 0011011000000000 | 0001101100000000 | 0110110000000000
  459. 0001101100000000 | 0000110110000000 | 0011011000000000
  460. 0000110110000000 | 0000011011000000 | 0001101100000000
  461. 0000011011000000 | 0000001101100000 | 0000110110000000
  462. 0000001101100000 | 0000000110110000 | 0000011011000000
  463. 0000000110110000 | 0000000011011000 | 0000001101100000
  464. 0000000011011000 | 0000000001101100 | 0000000110110000
  465. 0000000001101100 | 0000000000110110 | 0000000011011000
  466. 0000000000110110 | 0000000000011011 | 0000000001101100
  467. 0000000000011011 | 0000000000001101 | 0000000000110110
  468. 0000000000001101 | 0000000000000110 | 0000000000011010
  469. 0000000000000110 | 0000000000000011 | 0000000000001100
  470. 0000000000000011 | 0000000000000001 | 0000000000000110
  471. 0000000000000001 | 0000000000000000 | 0000000000000010
  472. (16 rows)
  473. SELECT b, b >> 8 AS bsr8, b << 8 AS bsl8
  474. FROM BIT_SHIFT_TABLE ;
  475. b | bsr8 | bsl8
  476. ------------------+------------------+------------------
  477. 1101100000000000 | 0000000011011000 | 0000000000000000
  478. 0110110000000000 | 0000000001101100 | 0000000000000000
  479. 0011011000000000 | 0000000000110110 | 0000000000000000
  480. 0001101100000000 | 0000000000011011 | 0000000000000000
  481. 0000110110000000 | 0000000000001101 | 1000000000000000
  482. 0000011011000000 | 0000000000000110 | 1100000000000000
  483. 0000001101100000 | 0000000000000011 | 0110000000000000
  484. 0000000110110000 | 0000000000000001 | 1011000000000000
  485. 0000000011011000 | 0000000000000000 | 1101100000000000
  486. 0000000001101100 | 0000000000000000 | 0110110000000000
  487. 0000000000110110 | 0000000000000000 | 0011011000000000
  488. 0000000000011011 | 0000000000000000 | 0001101100000000
  489. 0000000000001101 | 0000000000000000 | 0000110100000000
  490. 0000000000000110 | 0000000000000000 | 0000011000000000
  491. 0000000000000011 | 0000000000000000 | 0000001100000000
  492. 0000000000000001 | 0000000000000000 | 0000000100000000
  493. (16 rows)
  494. SELECT b::bit(15), b::bit(15) >> 1 AS bsr, b::bit(15) << 1 AS bsl
  495. FROM BIT_SHIFT_TABLE ;
  496. b | bsr | bsl
  497. -----------------+-----------------+-----------------
  498. 110110000000000 | 011011000000000 | 101100000000000
  499. 011011000000000 | 001101100000000 | 110110000000000
  500. 001101100000000 | 000110110000000 | 011011000000000
  501. 000110110000000 | 000011011000000 | 001101100000000
  502. 000011011000000 | 000001101100000 | 000110110000000
  503. 000001101100000 | 000000110110000 | 000011011000000
  504. 000000110110000 | 000000011011000 | 000001101100000
  505. 000000011011000 | 000000001101100 | 000000110110000
  506. 000000001101100 | 000000000110110 | 000000011011000
  507. 000000000110110 | 000000000011011 | 000000001101100
  508. 000000000011011 | 000000000001101 | 000000000110110
  509. 000000000001101 | 000000000000110 | 000000000011010
  510. 000000000000110 | 000000000000011 | 000000000001100
  511. 000000000000011 | 000000000000001 | 000000000000110
  512. 000000000000001 | 000000000000000 | 000000000000010
  513. 000000000000000 | 000000000000000 | 000000000000000
  514. (16 rows)
  515. SELECT b::bit(15), b::bit(15) >> 8 AS bsr8, b::bit(15) << 8 AS bsl8
  516. FROM BIT_SHIFT_TABLE ;
  517. b | bsr8 | bsl8
  518. -----------------+-----------------+-----------------
  519. 110110000000000 | 000000001101100 | 000000000000000
  520. 011011000000000 | 000000000110110 | 000000000000000
  521. 001101100000000 | 000000000011011 | 000000000000000
  522. 000110110000000 | 000000000001101 | 000000000000000
  523. 000011011000000 | 000000000000110 | 100000000000000
  524. 000001101100000 | 000000000000011 | 110000000000000
  525. 000000110110000 | 000000000000001 | 011000000000000
  526. 000000011011000 | 000000000000000 | 101100000000000
  527. 000000001101100 | 000000000000000 | 110110000000000
  528. 000000000110110 | 000000000000000 | 011011000000000
  529. 000000000011011 | 000000000000000 | 001101100000000
  530. 000000000001101 | 000000000000000 | 000110100000000
  531. 000000000000110 | 000000000000000 | 000011000000000
  532. 000000000000011 | 000000000000000 | 000001100000000
  533. 000000000000001 | 000000000000000 | 000000100000000
  534. 000000000000000 | 000000000000000 | 000000000000000
  535. (16 rows)
  536. CREATE TABLE VARBIT_SHIFT_TABLE(v BIT VARYING(20));
  537. INSERT INTO VARBIT_SHIFT_TABLE VALUES (B'11011');
  538. INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0' AS BIT VARYING(6)) >>1 FROM VARBIT_SHIFT_TABLE;
  539. INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00' AS BIT VARYING(8)) >>2 FROM VARBIT_SHIFT_TABLE;
  540. INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0000' AS BIT VARYING(12)) >>4 FROM VARBIT_SHIFT_TABLE;
  541. INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00000000' AS BIT VARYING(20)) >>8 FROM VARBIT_SHIFT_TABLE;
  542. SELECT POSITION(B'1101' IN v),
  543. POSITION(B'11011' IN v),
  544. v
  545. FROM VARBIT_SHIFT_TABLE ;
  546. position | position | v
  547. ----------+----------+----------------------
  548. 1 | 1 | 11011
  549. 2 | 2 | 011011
  550. 3 | 3 | 0011011
  551. 4 | 4 | 00011011
  552. 5 | 5 | 000011011
  553. 6 | 6 | 0000011011
  554. 7 | 7 | 00000011011
  555. 8 | 8 | 000000011011
  556. 9 | 9 | 0000000011011
  557. 10 | 10 | 00000000011011
  558. 11 | 11 | 000000000011011
  559. 12 | 12 | 0000000000011011
  560. 13 | 13 | 00000000000011011
  561. 14 | 14 | 000000000000011011
  562. 15 | 15 | 0000000000000011011
  563. 16 | 16 | 00000000000000011011
  564. (16 rows)
  565. SELECT v, v >> 1 AS vsr, v << 1 AS vsl
  566. FROM VARBIT_SHIFT_TABLE ;
  567. v | vsr | vsl
  568. ----------------------+----------------------+----------------------
  569. 11011 | 01101 | 10110
  570. 011011 | 001101 | 110110
  571. 0011011 | 0001101 | 0110110
  572. 00011011 | 00001101 | 00110110
  573. 000011011 | 000001101 | 000110110
  574. 0000011011 | 0000001101 | 0000110110
  575. 00000011011 | 00000001101 | 00000110110
  576. 000000011011 | 000000001101 | 000000110110
  577. 0000000011011 | 0000000001101 | 0000000110110
  578. 00000000011011 | 00000000001101 | 00000000110110
  579. 000000000011011 | 000000000001101 | 000000000110110
  580. 0000000000011011 | 0000000000001101 | 0000000000110110
  581. 00000000000011011 | 00000000000001101 | 00000000000110110
  582. 000000000000011011 | 000000000000001101 | 000000000000110110
  583. 0000000000000011011 | 0000000000000001101 | 0000000000000110110
  584. 00000000000000011011 | 00000000000000001101 | 00000000000000110110
  585. (16 rows)
  586. SELECT v, v >> 8 AS vsr8, v << 8 AS vsl8
  587. FROM VARBIT_SHIFT_TABLE ;
  588. v | vsr8 | vsl8
  589. ----------------------+----------------------+----------------------
  590. 11011 | 00000 | 00000
  591. 011011 | 000000 | 000000
  592. 0011011 | 0000000 | 0000000
  593. 00011011 | 00000000 | 00000000
  594. 000011011 | 000000000 | 100000000
  595. 0000011011 | 0000000000 | 1100000000
  596. 00000011011 | 00000000000 | 01100000000
  597. 000000011011 | 000000000000 | 101100000000
  598. 0000000011011 | 0000000000000 | 1101100000000
  599. 00000000011011 | 00000000000000 | 01101100000000
  600. 000000000011011 | 000000000000000 | 001101100000000
  601. 0000000000011011 | 0000000000000000 | 0001101100000000
  602. 00000000000011011 | 00000000000000000 | 00001101100000000
  603. 000000000000011011 | 000000000000000000 | 000001101100000000
  604. 0000000000000011011 | 0000000000000000000 | 0000001101100000000
  605. 00000000000000011011 | 00000000000000000000 | 00000001101100000000
  606. (16 rows)
  607. DROP TABLE BIT_SHIFT_TABLE;
  608. DROP TABLE VARBIT_SHIFT_TABLE;
  609. -- Get/Set bit
  610. SELECT get_bit(B'0101011000100', 10);
  611. get_bit
  612. ---------
  613. 1
  614. (1 row)
  615. SELECT set_bit(B'0101011000100100', 15, 1);
  616. set_bit
  617. ------------------
  618. 0101011000100101
  619. (1 row)
  620. SELECT set_bit(B'0101011000100100', 16, 1); -- fail
  621. ERROR: bit index 16 out of valid range (0..15)
  622. -- Overlay
  623. SELECT overlay(B'0101011100' placing '001' from 2 for 3);
  624. overlay
  625. ------------
  626. 0001011100
  627. (1 row)
  628. SELECT overlay(B'0101011100' placing '101' from 6);
  629. overlay
  630. ------------
  631. 0101010100
  632. (1 row)
  633. SELECT overlay(B'0101011100' placing '001' from 11);
  634. overlay
  635. ---------------
  636. 0101011100001
  637. (1 row)
  638. SELECT overlay(B'0101011100' placing '001' from 20);
  639. overlay
  640. ---------------
  641. 0101011100001
  642. (1 row)
  643. -- bit_count
  644. SELECT bit_count(B'0101011100'::bit(10));
  645. bit_count
  646. -----------
  647. 5
  648. (1 row)
  649. SELECT bit_count(B'1111111111'::bit(10));
  650. bit_count
  651. -----------
  652. 10
  653. (1 row)
  654. -- This table is intentionally left around to exercise pg_dump/pg_upgrade
  655. CREATE TABLE bit_defaults(
  656. b1 bit(4) DEFAULT '1001',
  657. b2 bit(4) DEFAULT B'0101',
  658. b3 bit varying(5) DEFAULT '1001',
  659. b4 bit varying(5) DEFAULT B'0101'
  660. );
  661. \d bit_defaults
  662. Table "public.bit_defaults"
  663. Column | Type | Collation | Nullable | Default
  664. --------+----------------+-----------+----------+---------------------
  665. b1 | bit(4) | | | '1001'::"bit"
  666. b2 | bit(4) | | | '0101'::"bit"
  667. b3 | bit varying(5) | | | '1001'::bit varying
  668. b4 | bit varying(5) | | | '0101'::"bit"
  669. INSERT INTO bit_defaults DEFAULT VALUES;
  670. TABLE bit_defaults;
  671. b1 | b2 | b3 | b4
  672. ------+------+------+------
  673. 1001 | 0101 | 1001 | 0101
  674. (1 row)