diff options
author | Peter Eisentraut | 2009-07-07 18:23:15 +0000 |
---|---|---|
committer | Peter Eisentraut | 2009-07-07 18:23:15 +0000 |
commit | c0445f1e2ce2f4f0a47fd641a5b7221da836fe72 (patch) | |
tree | 527d57fb701c05b89e0c85e8f51b3b652a0ac09b | |
parent | 8e9a7f3439f2a1eb0355e657198ca12b369bb22b (diff) |
More sensible character_octet_length
For character types with typmod, character_octet_length columns in the
information schema now show the maximum character length times the
maximum length of a character in the server encoding, instead of some
huge value as before.
-rw-r--r-- | doc/src/sgml/information_schema.sgml | 21 | ||||
-rw-r--r-- | src/backend/catalog/information_schema.sql | 5 | ||||
-rw-r--r-- | src/backend/utils/mb/mbutils.c | 11 | ||||
-rw-r--r-- | src/include/catalog/catversion.h | 2 | ||||
-rw-r--r-- | src/include/catalog/pg_proc.h | 3 | ||||
-rw-r--r-- | src/include/utils/builtins.h | 1 |
6 files changed, 31 insertions, 12 deletions
diff --git a/doc/src/sgml/information_schema.sgml b/doc/src/sgml/information_schema.sgml index 8e145d7ef1..6460862cfb 100644 --- a/doc/src/sgml/information_schema.sgml +++ b/doc/src/sgml/information_schema.sgml @@ -343,10 +343,10 @@ <entry><type>cardinal_number</type></entry> <entry> If <literal>data_type</literal> identifies a character type, - the maximum possible length in octets (bytes) of a datum (this - should not be of concern to - <productname>PostgreSQL</productname> users); null for all - other data types. + the maximum possible length in octets (bytes) of a datum; null + for all other data types. The maximum octet length depends on + the declared character maximum length (see above) and the + server encoding. </entry> </row> @@ -947,9 +947,10 @@ <entry><type>cardinal_number</type></entry> <entry> If <literal>data_type</literal> identifies a character type, - the maximum possible length in octets (bytes) of a datum (this - should not be of concern to <productname>PostgreSQL</productname> users); null for all - other data types. + the maximum possible length in octets (bytes) of a datum; null + for all other data types. The maximum octet length depends on + the declared character maximum length (see above) and the + server encoding. </entry> </row> @@ -1688,9 +1689,9 @@ <entry><type>cardinal_number</type></entry> <entry> If the domain has a character type, the maximum possible length - in octets (bytes) of a datum (this should not be of concern to - <productname>PostgreSQL</productname> users); null for all - other data types. + in octets (bytes) of a datum; null for all other data types. + The maximum octet length depends on the declared character + maximum length (see above) and the server encoding. </entry> </row> diff --git a/src/backend/catalog/information_schema.sql b/src/backend/catalog/information_schema.sql index fe753221c6..27a15c9c97 100644 --- a/src/backend/catalog/information_schema.sql +++ b/src/backend/catalog/information_schema.sql @@ -104,7 +104,10 @@ CREATE FUNCTION _pg_char_octet_length(typid oid, typmod int4) RETURNS integer AS $$SELECT CASE WHEN $1 IN (25, 1042, 1043) /* text, char, varchar */ - THEN CAST(2^30 AS integer) + THEN CASE WHEN $2 = -1 /* default typmod */ + THEN CAST(2^30 AS integer) + ELSE information_schema._pg_char_max_length($1, $2) * pg_catalog.pg_encoding_max_length((SELECT encoding FROM pg_database WHERE datname = current_database())) + END ELSE null END$$; diff --git a/src/backend/utils/mb/mbutils.c b/src/backend/utils/mb/mbutils.c index 753c927df3..058493ca37 100644 --- a/src/backend/utils/mb/mbutils.c +++ b/src/backend/utils/mb/mbutils.c @@ -482,6 +482,17 @@ length_in_encoding(PG_FUNCTION_ARGS) } +Datum +pg_encoding_max_length_sql(PG_FUNCTION_ARGS) +{ + int encoding = PG_GETARG_INT32(0); + + if (PG_VALID_ENCODING(encoding)) + return pg_wchar_table[encoding].maxmblen; + else + PG_RETURN_NULL(); +} + /* * convert client encoding to server encoding. */ diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 1e742511e4..98eba9b699 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -53,6 +53,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 200904091 +#define CATALOG_VERSION_NO 200907071 #endif diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index 0285acd154..e194d6a91d 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -2278,6 +2278,9 @@ DESCR("convert encoding name to encoding id"); DATA(insert OID = 1597 ( pg_encoding_to_char PGNSP PGUID 12 1 0 0 f f f t f s 1 0 19 "23" _null_ _null_ _null_ _null_ PG_encoding_to_char _null_ _null_ _null_ )); DESCR("convert encoding id to encoding name"); +DATA(insert OID = 2319 ( pg_encoding_max_length PGNSP PGUID 12 1 0 0 f f f t f i 1 0 23 "23" _null_ _null_ _null_ _null_ pg_encoding_max_length_sql _null_ _null_ _null_ )); +DESCR("maximum octet length of a character in an eocidng"); + DATA(insert OID = 1638 ( oidgt PGNSP PGUID 12 1 0 0 f f f t f i 2 0 16 "26 26" _null_ _null_ _null_ _null_ oidgt _null_ _null_ _null_ )); DESCR("greater-than"); DATA(insert OID = 1639 ( oidge PGNSP PGUID 12 1 0 0 f f f t f i 2 0 16 "26 26" _null_ _null_ _null_ _null_ oidge _null_ _null_ _null_ )); diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index c1b93932ee..13fd41a9bc 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -948,6 +948,7 @@ extern Datum pg_convert(PG_FUNCTION_ARGS); extern Datum pg_convert_to(PG_FUNCTION_ARGS); extern Datum pg_convert_from(PG_FUNCTION_ARGS); extern Datum length_in_encoding(PG_FUNCTION_ARGS); +extern Datum pg_encoding_max_length_sql(PG_FUNCTION_ARGS); /* format_type.c */ extern Datum format_type(PG_FUNCTION_ARGS); |