mirror of
https://github.com/postgres/postgres.git
synced 2025-05-02 11:44:50 +03:00
Improve error reporting in parseTypeString(), motivated by confusing
behavior reported by Martin Marques.
This commit is contained in:
parent
3b72087bf6
commit
17841ddbbf
@ -8,7 +8,7 @@
|
|||||||
*
|
*
|
||||||
*
|
*
|
||||||
* IDENTIFICATION
|
* IDENTIFICATION
|
||||||
* $Header: /cvsroot/pgsql/src/backend/parser/parse_type.c,v 1.62 2003/09/25 06:58:01 petere Exp $
|
* $Header: /cvsroot/pgsql/src/backend/parser/parse_type.c,v 1.63 2003/10/20 17:25:42 tgl Exp $
|
||||||
*
|
*
|
||||||
*-------------------------------------------------------------------------
|
*-------------------------------------------------------------------------
|
||||||
*/
|
*/
|
||||||
@ -430,14 +430,21 @@ typeidTypeRelid(Oid type_id)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* error context callback for parse failure during parseTypeString()
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
pts_error_callback(void *arg)
|
||||||
|
{
|
||||||
|
const char *str = (const char *) arg;
|
||||||
|
|
||||||
|
errcontext("invalid type name \"%s\"", str);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Given a string that is supposed to be a SQL-compatible type declaration,
|
* Given a string that is supposed to be a SQL-compatible type declaration,
|
||||||
* such as "int4" or "integer" or "character varying(32)", parse
|
* such as "int4" or "integer" or "character varying(32)", parse
|
||||||
* the string and convert it to a type OID and type modifier.
|
* the string and convert it to a type OID and type modifier.
|
||||||
*
|
|
||||||
* This routine is not currently used by the main backend, but it is
|
|
||||||
* exported for use by add-on modules such as plpgsql, in hopes of
|
|
||||||
* centralizing parsing knowledge about SQL type declarations.
|
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
parseTypeString(const char *str, Oid *type_id, int32 *typmod)
|
parseTypeString(const char *str, Oid *type_id, int32 *typmod)
|
||||||
@ -448,12 +455,27 @@ parseTypeString(const char *str, Oid *type_id, int32 *typmod)
|
|||||||
ResTarget *restarget;
|
ResTarget *restarget;
|
||||||
TypeCast *typecast;
|
TypeCast *typecast;
|
||||||
TypeName *typename;
|
TypeName *typename;
|
||||||
|
ErrorContextCallback ptserrcontext;
|
||||||
|
|
||||||
|
/* make sure we give useful error for empty input */
|
||||||
|
if (strspn(str, " \t\n\r\f") == strlen(str))
|
||||||
|
goto fail;
|
||||||
|
|
||||||
initStringInfo(&buf);
|
initStringInfo(&buf);
|
||||||
appendStringInfo(&buf, "SELECT (NULL::%s)", str);
|
appendStringInfo(&buf, "SELECT NULL::%s", str);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Setup error traceback support in case of ereport() during parse
|
||||||
|
*/
|
||||||
|
ptserrcontext.callback = pts_error_callback;
|
||||||
|
ptserrcontext.arg = (void *) str;
|
||||||
|
ptserrcontext.previous = error_context_stack;
|
||||||
|
error_context_stack = &ptserrcontext;
|
||||||
|
|
||||||
raw_parsetree_list = raw_parser(buf.data);
|
raw_parsetree_list = raw_parser(buf.data);
|
||||||
|
|
||||||
|
error_context_stack = ptserrcontext.previous;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Make sure we got back exactly what we expected and no more;
|
* Make sure we got back exactly what we expected and no more;
|
||||||
* paranoia is justified since the string might contain anything.
|
* paranoia is justified since the string might contain anything.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user