Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit1185c78

Browse files
committed
Add new flag to format_type_extended() to get NULL for undefined type
If a type scanned is undefined, type format routines have two behaviorsdepending on if FORMAT_TYPE_ALLOW_INVALID is used by the caller or not:- Issue a cache lookup error- Return an undefined type name "???", "???[]" or "-"The current interface is not really helpful for callers willing toformat properly a type name, but still make sure that the type isdefined as there could be types matching the strings generated whenlooking for an undefined type, even if that should not be a problem inpractice. In order to counter that, add a new flag calledFORMAT_TYPE_INVALID_AS_NULL that returns a NULL result instead of "???or "-" which does not generate an error. This flag will be used in afollow-up patch improving the set of SQL functions showing informationfor object addresses when it comes to undefined objects.Author: Michael PaquierReviewed-by: Aleksander Alekseev, Dmitry Dolgov, Daniel Gustafsson,Álvaro HerreraDiscussion:https://postgr.es/m/CAB7nPqSZxrSmdHK-rny7z8mi=EAFXJ5J-0RbzDw6aus=wB5azQ@mail.gmail.com
1 parent231ef5b commit1185c78

File tree

2 files changed

+18
-5
lines changed

2 files changed

+18
-5
lines changed

‎src/backend/utils/adt/format_type.c

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -96,13 +96,16 @@ format_type(PG_FUNCTION_ARGS)
9696
* - FORMAT_TYPE_ALLOW_INVALID
9797
*if the type OID is invalid or unknown, return ??? or such instead
9898
*of failing
99+
* - FORMAT_TYPE_INVALID_AS_NULL
100+
*if the type OID is invalid or unknown, return NULL instead of ???
101+
*or such
99102
* - FORMAT_TYPE_FORCE_QUALIFY
100103
*always schema-qualify type names, regardless of search_path
101104
*
102105
* Note that TYPEMOD_GIVEN is not interchangeable with "typemod == -1";
103106
* see the comments above for format_type().
104107
*
105-
* Returns a palloc'd string.
108+
* Returns a palloc'd string, or NULL.
106109
*/
107110
char*
108111
format_type_extended(Oidtype_oid,int32typemod,bits16flags)
@@ -114,13 +117,20 @@ format_type_extended(Oid type_oid, int32 typemod, bits16 flags)
114117
char*buf;
115118
boolwith_typemod;
116119

117-
if (type_oid==InvalidOid&& (flags&FORMAT_TYPE_ALLOW_INVALID)!=0)
118-
returnpstrdup("-");
120+
if (type_oid==InvalidOid)
121+
{
122+
if ((flags&FORMAT_TYPE_INVALID_AS_NULL)!=0)
123+
returnNULL;
124+
elseif ((flags&FORMAT_TYPE_ALLOW_INVALID)!=0)
125+
returnpstrdup("-");
126+
}
119127

120128
tuple=SearchSysCache1(TYPEOID,ObjectIdGetDatum(type_oid));
121129
if (!HeapTupleIsValid(tuple))
122130
{
123-
if ((flags&FORMAT_TYPE_ALLOW_INVALID)!=0)
131+
if ((flags&FORMAT_TYPE_INVALID_AS_NULL)!=0)
132+
returnNULL;
133+
elseif ((flags&FORMAT_TYPE_ALLOW_INVALID)!=0)
124134
returnpstrdup("???");
125135
else
126136
elog(ERROR,"cache lookup failed for type %u",type_oid);
@@ -144,7 +154,9 @@ format_type_extended(Oid type_oid, int32 typemod, bits16 flags)
144154
tuple=SearchSysCache1(TYPEOID,ObjectIdGetDatum(array_base_type));
145155
if (!HeapTupleIsValid(tuple))
146156
{
147-
if ((flags&FORMAT_TYPE_ALLOW_INVALID)!=0)
157+
if ((flags&FORMAT_TYPE_INVALID_AS_NULL)!=0)
158+
returnNULL;
159+
elseif ((flags&FORMAT_TYPE_ALLOW_INVALID)!=0)
148160
returnpstrdup("???[]");
149161
else
150162
elog(ERROR,"cache lookup failed for type %u",type_oid);

‎src/include/utils/builtins.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ extern Datum numeric_float8_no_overflow(PG_FUNCTION_ARGS);
113113
#defineFORMAT_TYPE_TYPEMOD_GIVEN0x01/* typemod defined by caller */
114114
#defineFORMAT_TYPE_ALLOW_INVALID0x02/* allow invalid types */
115115
#defineFORMAT_TYPE_FORCE_QUALIFY0x04/* force qualification of type */
116+
#defineFORMAT_TYPE_INVALID_AS_NULL0x08/* NULL if undefined */
116117
externchar*format_type_extended(Oidtype_oid,int32typemod,bits16flags);
117118

118119
externchar*format_type_be(Oidtype_oid);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp