bit.sql 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  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. SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR 2147483646) AS "01010101";
  19. SELECT SUBSTRING('01010101'::bit(8) FROM -10 FOR -2147483646) AS "error";
  20. SELECT SUBSTRING('01010101'::varbit FROM 2 FOR 2147483646) AS "1010101";
  21. SELECT SUBSTRING('01010101'::varbit FROM -10 FOR 2147483646) AS "01010101";
  22. SELECT SUBSTRING('01010101'::varbit FROM -10 FOR -2147483646) AS "error";
  23. CREATE TABLE varbit_table (a BIT VARYING(16), b BIT VARYING(16));
  24. DROP TABLE varbit_table;
  25. CREATE TABLE bit_table (a BIT(16), b BIT(16));
  26. DROP TABLE bit_table;
  27. -- The following should fail
  28. select B'001' & B'10';
  29. select B'0111' | B'011';
  30. select B'0010' # B'011101';
  31. -- More position tests, checking all the boundary cases
  32. SELECT POSITION(B'1010' IN B'0000101'); -- 0
  33. SELECT POSITION(B'1010' IN B'00001010'); -- 5
  34. SELECT POSITION(B'1010' IN B'00000101'); -- 0
  35. SELECT POSITION(B'1010' IN B'000001010'); -- 6
  36. SELECT POSITION(B'' IN B'00001010'); -- 1
  37. SELECT POSITION(B'0' IN B''); -- 0
  38. SELECT POSITION(B'' IN B''); -- 0
  39. SELECT POSITION(B'101101' IN B'001011011011011000'); -- 3
  40. SELECT POSITION(B'10110110' IN B'001011011011010'); -- 3
  41. SELECT POSITION(B'1011011011011' IN B'001011011011011'); -- 3
  42. SELECT POSITION(B'1011011011011' IN B'00001011011011011'); -- 5
  43. SELECT POSITION(B'11101011' IN B'11101011'); -- 1
  44. SELECT POSITION(B'11101011' IN B'011101011'); -- 2
  45. SELECT POSITION(B'11101011' IN B'00011101011'); -- 4
  46. SELECT POSITION(B'11101011' IN B'0000011101011'); -- 6
  47. SELECT POSITION(B'111010110' IN B'111010110'); -- 1
  48. SELECT POSITION(B'111010110' IN B'0111010110'); -- 2
  49. SELECT POSITION(B'111010110' IN B'000111010110'); -- 4
  50. SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6
  51. SELECT POSITION(B'111010110' IN B'11101011'); -- 0
  52. SELECT POSITION(B'111010110' IN B'011101011'); -- 0
  53. SELECT POSITION(B'111010110' IN B'00011101011'); -- 0
  54. SELECT POSITION(B'111010110' IN B'0000011101011'); -- 0
  55. SELECT POSITION(B'111010110' IN B'111010110'); -- 1
  56. SELECT POSITION(B'111010110' IN B'0111010110'); -- 2
  57. SELECT POSITION(B'111010110' IN B'000111010110'); -- 4
  58. SELECT POSITION(B'111010110' IN B'00000111010110'); -- 6
  59. SELECT POSITION(B'111010110' IN B'000001110101111101011'); -- 0
  60. SELECT POSITION(B'111010110' IN B'0000001110101111101011'); -- 0
  61. SELECT POSITION(B'111010110' IN B'000000001110101111101011'); -- 0
  62. SELECT POSITION(B'111010110' IN B'00000000001110101111101011'); -- 0
  63. SELECT POSITION(B'111010110' IN B'0000011101011111010110'); -- 14
  64. SELECT POSITION(B'111010110' IN B'00000011101011111010110'); -- 15
  65. SELECT POSITION(B'111010110' IN B'0000000011101011111010110'); -- 17
  66. SELECT POSITION(B'111010110' IN B'000000000011101011111010110'); -- 19
  67. SELECT POSITION(B'000000000011101011111010110' IN B'000000000011101011111010110'); -- 1
  68. SELECT POSITION(B'00000000011101011111010110' IN B'000000000011101011111010110'); -- 2
  69. SELECT POSITION(B'0000000000011101011111010110' IN B'000000000011101011111010110'); -- 0
  70. -- Shifting
  71. CREATE TABLE BIT_SHIFT_TABLE(b BIT(16));
  72. INSERT INTO BIT_SHIFT_TABLE VALUES (B'1101100000000000');
  73. INSERT INTO BIT_SHIFT_TABLE SELECT b>>1 FROM BIT_SHIFT_TABLE;
  74. INSERT INTO BIT_SHIFT_TABLE SELECT b>>2 FROM BIT_SHIFT_TABLE;
  75. INSERT INTO BIT_SHIFT_TABLE SELECT b>>4 FROM BIT_SHIFT_TABLE;
  76. INSERT INTO BIT_SHIFT_TABLE SELECT b>>8 FROM BIT_SHIFT_TABLE;
  77. SELECT b, b >> 1 AS bsr, b << 1 AS bsl
  78. FROM BIT_SHIFT_TABLE ;
  79. SELECT b, b >> 8 AS bsr8, b << 8 AS bsl8
  80. FROM BIT_SHIFT_TABLE ;
  81. SELECT b::bit(15), b::bit(15) >> 1 AS bsr, b::bit(15) << 1 AS bsl
  82. FROM BIT_SHIFT_TABLE ;
  83. SELECT b::bit(15), b::bit(15) >> 8 AS bsr8, b::bit(15) << 8 AS bsl8
  84. FROM BIT_SHIFT_TABLE ;
  85. CREATE TABLE VARBIT_SHIFT_TABLE(v BIT VARYING(20));
  86. INSERT INTO VARBIT_SHIFT_TABLE VALUES (B'11011');
  87. INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0' AS BIT VARYING(6)) >>1 FROM VARBIT_SHIFT_TABLE;
  88. INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00' AS BIT VARYING(8)) >>2 FROM VARBIT_SHIFT_TABLE;
  89. INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'0000' AS BIT VARYING(12)) >>4 FROM VARBIT_SHIFT_TABLE;
  90. INSERT INTO VARBIT_SHIFT_TABLE SELECT CAST(v || B'00000000' AS BIT VARYING(20)) >>8 FROM VARBIT_SHIFT_TABLE;
  91. SELECT v, v >> 1 AS vsr, v << 1 AS vsl
  92. FROM VARBIT_SHIFT_TABLE ;
  93. SELECT v, v >> 8 AS vsr8, v << 8 AS vsl8
  94. FROM VARBIT_SHIFT_TABLE ;
  95. DROP TABLE BIT_SHIFT_TABLE;
  96. DROP TABLE VARBIT_SHIFT_TABLE;
  97. -- Get/Set bit
  98. SELECT get_bit(B'0101011000100', 10);
  99. SELECT set_bit(B'0101011000100100', 15, 1);
  100. SELECT set_bit(B'0101011000100100', 16, 1); -- fail
  101. -- Overlay
  102. SELECT overlay(B'0101011100' placing '001' from 2 for 3);
  103. SELECT overlay(B'0101011100' placing '101' from 6);
  104. SELECT overlay(B'0101011100' placing '001' from 11);
  105. SELECT overlay(B'0101011100' placing '001' from 20);
  106. -- bit_count
  107. SELECT bit_count(B'0101011100'::bit(10));
  108. SELECT bit_count(B'1111111111'::bit(10));
  109. -- This table is intentionally left around to exercise pg_dump/pg_upgrade
  110. CREATE TABLE bit_defaults(
  111. b1 bit(4) DEFAULT '1001',
  112. b2 bit(4) DEFAULT B'0101',
  113. b3 bit varying(5) DEFAULT '1001',
  114. b4 bit varying(5) DEFAULT B'0101'
  115. );