Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 07eee5a

Browse files
committed
Create a new type category for "internal use" types.
Historically we've put type "char" into the S (String) typcategory, although calling it a string is a stretch considering it can only store one byte. (In our actual usage, it's more like an enum.) This choice now seems wrong in view of the special heuristics that parse_func.c and parse_coerce.c have for TYPCATEGORY_STRING: it's not a great idea for "char" to have those preferential casting behaviors. Worse than that, recent patches inventing special-purpose types like pg_node_tree have assigned typcategory S to those types, meaning they also get preferential casting treatment that's designed on the assumption that they can hold arbitrary text. To fix, invent a new category TYPCATEGORY_INTERNAL for internal-use types, and assign that to all these types. I used code 'Z' for lack of a better idea ('I' was already taken). This change breaks one query in psql/describe.c, which now needs to explicitly cast a catalog "char" column to text before concatenating it with an undecorated literal. Also, a test case in contrib/citext now needs an explicit cast to convert citext to "char". Since the point of this change is to not have "char" be a surprisingly-available cast target, these breakages seem OK. Per report from Ian Campbell. Discussion: https://postgr.es/m/2216388.1638480141@sss.pgh.pa.us
1 parent fe60b67 commit 07eee5a

File tree

8 files changed

+29
-13
lines changed

8 files changed

+29
-13
lines changed

contrib/citext/expected/citext.out

+6-1
Original file line numberDiff line numberDiff line change
@@ -1089,7 +1089,12 @@ INSERT INTO caster (char) VALUES ('f'::citext);
10891089
INSERT INTO caster (citext) VALUES ('f'::char);
10901090
INSERT INTO caster (chr) VALUES ('f'::text);
10911091
INSERT INTO caster (text) VALUES ('f'::"char");
1092-
INSERT INTO caster (chr) VALUES ('f'::citext);
1092+
INSERT INTO caster (chr) VALUES ('f'::citext); -- requires cast
1093+
ERROR: column "chr" is of type "char" but expression is of type citext
1094+
LINE 1: INSERT INTO caster (chr) VALUES ('f'::citext);
1095+
^
1096+
HINT: You will need to rewrite or cast the expression.
1097+
INSERT INTO caster (chr) VALUES ('f'::citext::text);
10931098
INSERT INTO caster (citext) VALUES ('f'::"char");
10941099
INSERT INTO caster (name) VALUES ('foo'::text);
10951100
INSERT INTO caster (text) VALUES ('foo'::name);

contrib/citext/expected/citext_1.out

+6-1
Original file line numberDiff line numberDiff line change
@@ -1089,7 +1089,12 @@ INSERT INTO caster (char) VALUES ('f'::citext);
10891089
INSERT INTO caster (citext) VALUES ('f'::char);
10901090
INSERT INTO caster (chr) VALUES ('f'::text);
10911091
INSERT INTO caster (text) VALUES ('f'::"char");
1092-
INSERT INTO caster (chr) VALUES ('f'::citext);
1092+
INSERT INTO caster (chr) VALUES ('f'::citext); -- requires cast
1093+
ERROR: column "chr" is of type "char" but expression is of type citext
1094+
LINE 1: INSERT INTO caster (chr) VALUES ('f'::citext);
1095+
^
1096+
HINT: You will need to rewrite or cast the expression.
1097+
INSERT INTO caster (chr) VALUES ('f'::citext::text);
10931098
INSERT INTO caster (citext) VALUES ('f'::"char");
10941099
INSERT INTO caster (name) VALUES ('foo'::text);
10951100
INSERT INTO caster (text) VALUES ('foo'::name);

contrib/citext/sql/citext.sql

+2-1
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,8 @@ INSERT INTO caster (citext) VALUES ('f'::char);
361361

362362
INSERT INTO caster (chr) VALUES ('f'::text);
363363
INSERT INTO caster (text) VALUES ('f'::"char");
364-
INSERT INTO caster (chr) VALUES ('f'::citext);
364+
INSERT INTO caster (chr) VALUES ('f'::citext); -- requires cast
365+
INSERT INTO caster (chr) VALUES ('f'::citext::text);
365366
INSERT INTO caster (citext) VALUES ('f'::"char");
366367

367368
INSERT INTO caster (name) VALUES ('foo'::text);

doc/src/sgml/catalogs.sgml

+4
Original file line numberDiff line numberDiff line change
@@ -9317,6 +9317,10 @@ SCRAM-SHA-256$<replaceable>&lt;iteration count&gt;</replaceable>:<replaceable>&l
93179317
<entry><literal>X</literal></entry>
93189318
<entry><type>unknown</type> type</entry>
93199319
</row>
9320+
<row>
9321+
<entry><literal>Z</literal></entry>
9322+
<entry>Internal-use types</entry>
9323+
</row>
93209324
</tbody>
93219325
</tgroup>
93229326
</table>

src/bin/psql/describe.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -1142,7 +1142,7 @@ permissionsList(const char *pattern)
11421142
",\n pg_catalog.array_to_string(ARRAY(\n"
11431143
" SELECT polname\n"
11441144
" || CASE WHEN polcmd != '*' THEN\n"
1145-
" E' (' || polcmd || E'):'\n"
1145+
" E' (' || polcmd::pg_catalog.text || E'):'\n"
11461146
" ELSE E':'\n"
11471147
" END\n"
11481148
" || CASE WHEN polqual IS NOT NULL THEN\n"
@@ -1176,7 +1176,7 @@ permissionsList(const char *pattern)
11761176
" E' (RESTRICTIVE)'\n"
11771177
" ELSE '' END\n"
11781178
" || CASE WHEN polcmd != '*' THEN\n"
1179-
" E' (' || polcmd || E'):'\n"
1179+
" E' (' || polcmd::pg_catalog.text || E'):'\n"
11801180
" ELSE E':'\n"
11811181
" END\n"
11821182
" || CASE WHEN polqual IS NOT NULL THEN\n"

src/include/catalog/catversion.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,6 @@
5353
*/
5454

5555
/* yyyymmddN */
56-
#define CATALOG_VERSION_NO 202112081
56+
#define CATALOG_VERSION_NO 202112111
5757

5858
#endif

src/include/catalog/pg_type.dat

+7-7
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
typinput => 'byteain', typoutput => 'byteaout', typreceive => 'bytearecv',
4343
typsend => 'byteasend', typalign => 'i', typstorage => 'x' },
4444
{ oid => '18', array_type_oid => '1002', descr => 'single character',
45-
typname => 'char', typlen => '1', typbyval => 't', typcategory => 'S',
45+
typname => 'char', typlen => '1', typbyval => 't', typcategory => 'Z',
4646
typinput => 'charin', typoutput => 'charout', typreceive => 'charrecv',
4747
typsend => 'charsend', typalign => 'c' },
4848
{ oid => '19', array_type_oid => '1003',
@@ -145,24 +145,24 @@
145145
typsend => 'xml_send', typalign => 'i', typstorage => 'x' },
146146
{ oid => '194', descr => 'string representing an internal node tree',
147147
typname => 'pg_node_tree', typlen => '-1', typbyval => 'f',
148-
typcategory => 'S', typinput => 'pg_node_tree_in',
148+
typcategory => 'Z', typinput => 'pg_node_tree_in',
149149
typoutput => 'pg_node_tree_out', typreceive => 'pg_node_tree_recv',
150150
typsend => 'pg_node_tree_send', typalign => 'i', typstorage => 'x',
151151
typcollation => 'default' },
152152
{ oid => '3361', descr => 'multivariate ndistinct coefficients',
153153
typname => 'pg_ndistinct', typlen => '-1', typbyval => 'f',
154-
typcategory => 'S', typinput => 'pg_ndistinct_in',
154+
typcategory => 'Z', typinput => 'pg_ndistinct_in',
155155
typoutput => 'pg_ndistinct_out', typreceive => 'pg_ndistinct_recv',
156156
typsend => 'pg_ndistinct_send', typalign => 'i', typstorage => 'x',
157157
typcollation => 'default' },
158158
{ oid => '3402', descr => 'multivariate dependencies',
159159
typname => 'pg_dependencies', typlen => '-1', typbyval => 'f',
160-
typcategory => 'S', typinput => 'pg_dependencies_in',
160+
typcategory => 'Z', typinput => 'pg_dependencies_in',
161161
typoutput => 'pg_dependencies_out', typreceive => 'pg_dependencies_recv',
162162
typsend => 'pg_dependencies_send', typalign => 'i', typstorage => 'x',
163163
typcollation => 'default' },
164164
{ oid => '5017', descr => 'multivariate MCV list',
165-
typname => 'pg_mcv_list', typlen => '-1', typbyval => 'f', typcategory => 'S',
165+
typname => 'pg_mcv_list', typlen => '-1', typbyval => 'f', typcategory => 'Z',
166166
typinput => 'pg_mcv_list_in', typoutput => 'pg_mcv_list_out',
167167
typreceive => 'pg_mcv_list_recv', typsend => 'pg_mcv_list_send',
168168
typalign => 'i', typstorage => 'x', typcollation => 'default' },
@@ -681,13 +681,13 @@
681681
typalign => 'd', typstorage => 'x' },
682682
{ oid => '4600', descr => 'BRIN bloom summary',
683683
typname => 'pg_brin_bloom_summary', typlen => '-1', typbyval => 'f',
684-
typcategory => 'S', typinput => 'brin_bloom_summary_in',
684+
typcategory => 'Z', typinput => 'brin_bloom_summary_in',
685685
typoutput => 'brin_bloom_summary_out',
686686
typreceive => 'brin_bloom_summary_recv', typsend => 'brin_bloom_summary_send',
687687
typalign => 'i', typstorage => 'x', typcollation => 'default' },
688688
{ oid => '4601', descr => 'BRIN minmax-multi summary',
689689
typname => 'pg_brin_minmax_multi_summary', typlen => '-1', typbyval => 'f',
690-
typcategory => 'S', typinput => 'brin_minmax_multi_summary_in',
690+
typcategory => 'Z', typinput => 'brin_minmax_multi_summary_in',
691691
typoutput => 'brin_minmax_multi_summary_out',
692692
typreceive => 'brin_minmax_multi_summary_recv',
693693
typsend => 'brin_minmax_multi_summary_send', typalign => 'i',

src/include/catalog/pg_type.h

+1
Original file line numberDiff line numberDiff line change
@@ -294,6 +294,7 @@ DECLARE_UNIQUE_INDEX(pg_type_typname_nsp_index, 2704, TypeNameNspIndexId, on pg_
294294
#define TYPCATEGORY_USER 'U'
295295
#define TYPCATEGORY_BITSTRING 'V' /* er ... "varbit"? */
296296
#define TYPCATEGORY_UNKNOWN 'X'
297+
#define TYPCATEGORY_INTERNAL 'Z'
297298

298299
#define TYPALIGN_CHAR 'c' /* char alignment (i.e. unaligned) */
299300
#define TYPALIGN_SHORT 's' /* short alignment (typically 2 bytes) */

0 commit comments

Comments
 (0)