-- -- CHAR -- -- Per SQL standard, CHAR means character(1), that is a varlena type -- with a constraint restricting it to one character (not byte) SELECT char 'c' = char 'c' AS true; true ------ t (1 row) -- -- Build a table for testing -- (This temporarily hides the table created in test_setup.sql) -- CREATE TEMP TABLE CHAR_TBL(f1 char); INSERT INTO CHAR_TBL (f1) VALUES ('a'); INSERT INTO CHAR_TBL (f1) VALUES ('A'); -- any of the following three input formats are acceptable INSERT INTO CHAR_TBL (f1) VALUES ('1'); INSERT INTO CHAR_TBL (f1) VALUES (2); INSERT INTO CHAR_TBL (f1) VALUES ('3'); -- zero-length char INSERT INTO CHAR_TBL (f1) VALUES (''); -- try char's of greater than 1 length INSERT INTO CHAR_TBL (f1) VALUES ('cd'); ERROR: value too long for type character(1) INSERT INTO CHAR_TBL (f1) VALUES ('c '); SELECT * FROM CHAR_TBL; f1 ---- a A 1 2 3 c (7 rows) SELECT c.* FROM CHAR_TBL c WHERE c.f1 <> 'a'; f1 ---- A 1 2 3 c (6 rows) SELECT c.* FROM CHAR_TBL c WHERE c.f1 = 'a'; f1 ---- a (1 row) SELECT c.* FROM CHAR_TBL c WHERE c.f1 < 'a'; f1 ---- 1 2 3 (4 rows) SELECT c.* FROM CHAR_TBL c WHERE c.f1 <= 'a'; f1 ---- a 1 2 3 (5 rows) SELECT c.* FROM CHAR_TBL c WHERE c.f1 > 'a'; f1 ---- A c (2 rows) SELECT c.* FROM CHAR_TBL c WHERE c.f1 >= 'a'; f1 ---- a A c (3 rows) DROP TABLE CHAR_TBL; -- -- Now test longer arrays of char -- -- This char_tbl was already created and filled in test_setup.sql. -- Here we just try to insert bad values. -- INSERT INTO CHAR_TBL (f1) VALUES ('abcde'); ERROR: value too long for type character(4) SELECT * FROM CHAR_TBL; f1 ------ a ab abcd abcd (4 rows) -- Also try it with non-error-throwing API SELECT pg_input_is_valid('abcd ', 'char(4)'); pg_input_is_valid ------------------- t (1 row) SELECT pg_input_is_valid('abcde', 'char(4)'); pg_input_is_valid ------------------- f (1 row) SELECT * FROM pg_input_error_info('abcde', 'char(4)'); message | detail | hint | sql_error_code --------------------------------------+--------+------+---------------- value too long for type character(4) | | | 22001 (1 row) -- -- Also test "char", which is an ad-hoc one-byte type. It can only -- really store ASCII characters, but we allow high-bit-set characters -- to be accessed via bytea-like escapes. -- SELECT 'a'::"char"; char ------ a (1 row) SELECT '\101'::"char"; char ------ A (1 row) SELECT '\377'::"char"; char ------ \377 (1 row) SELECT 'a'::"char"::text; text ------ a (1 row) SELECT '\377'::"char"::text; text ------ \377 (1 row) SELECT '\000'::"char"::text; text ------ (1 row) SELECT 'a'::text::"char"; char ------ a (1 row) SELECT '\377'::text::"char"; char ------ \377 (1 row) SELECT ''::text::"char"; char ------ (1 row)