diff options
| author | Peter Eisentraut <peter_e@gmx.net> | 2016-09-06 12:00:00 -0400 |
|---|---|---|
| committer | Peter Eisentraut <peter_e@gmx.net> | 2016-09-06 12:00:00 -0400 |
| commit | 49eb0fd0972d14014dd3533b1f1bf8c94c899883 (patch) | |
| tree | bcbfa5cf8f49c1b73066a5c4eaf80f33fc4ecc53 /src/backend/tcop/utility.c | |
| parent | 975768f8eae2581b89ceafe8b16a77ff375207fe (diff) | |
| download | postgresql-49eb0fd0972d14014dd3533b1f1bf8c94c899883.tar.gz | |
Add location field to DefElem
Add a location field to the DefElem struct, used to parse many utility
commands. Update various error messages to supply error position
information.
To propogate the error position information in a more systematic way,
create a ParseState in standard_ProcessUtility() and pass that to
interested functions implementing the utility commands. This seems
better than passing the query string and then reassembling a parse state
ad hoc, which violates the encapsulation of the ParseState type.
Reviewed-by: Pavel Stehule <pavel.stehule@gmail.com>
Diffstat (limited to 'src/backend/tcop/utility.c')
| -rw-r--r-- | src/backend/tcop/utility.c | 64 |
1 files changed, 37 insertions, 27 deletions
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index ac64135d5d..f50ce408ae 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -71,7 +71,8 @@ ProcessUtility_hook_type ProcessUtility_hook = NULL; /* local function declarations */ -static void ProcessUtilitySlow(Node *parsetree, +static void ProcessUtilitySlow(ParseState *pstate, + Node *parsetree, const char *queryString, ProcessUtilityContext context, ParamListInfo params, @@ -358,12 +359,16 @@ standard_ProcessUtility(Node *parsetree, char *completionTag) { bool isTopLevel = (context == PROCESS_UTILITY_TOPLEVEL); + ParseState *pstate; check_xact_readonly(parsetree); if (completionTag) completionTag[0] = '\0'; + pstate = make_parsestate(NULL); + pstate->p_sourcetext = queryString; + switch (nodeTag(parsetree)) { /* @@ -540,7 +545,7 @@ standard_ProcessUtility(Node *parsetree, { uint64 processed; - DoCopy((CopyStmt *) parsetree, queryString, &processed); + DoCopy(pstate, (CopyStmt *) parsetree, &processed); if (completionTag) snprintf(completionTag, COMPLETION_TAG_BUFSIZE, "COPY " UINT64_FORMAT, processed); @@ -571,12 +576,12 @@ standard_ProcessUtility(Node *parsetree, case T_CreatedbStmt: /* no event triggers for global objects */ PreventTransactionChain(isTopLevel, "CREATE DATABASE"); - createdb((CreatedbStmt *) parsetree); + createdb(pstate, (CreatedbStmt *) parsetree); break; case T_AlterDatabaseStmt: /* no event triggers for global objects */ - AlterDatabase((AlterDatabaseStmt *) parsetree, isTopLevel); + AlterDatabase(pstate, (AlterDatabaseStmt *) parsetree, isTopLevel); break; case T_AlterDatabaseSetStmt: @@ -657,7 +662,7 @@ standard_ProcessUtility(Node *parsetree, break; case T_ExplainStmt: - ExplainQuery((ExplainStmt *) parsetree, queryString, params, dest); + ExplainQuery(pstate, (ExplainStmt *) parsetree, queryString, params, dest); break; case T_AlterSystemStmt: @@ -698,7 +703,7 @@ standard_ProcessUtility(Node *parsetree, */ case T_CreateRoleStmt: /* no event triggers for global objects */ - CreateRole((CreateRoleStmt *) parsetree); + CreateRole(pstate, (CreateRoleStmt *) parsetree); break; case T_AlterRoleStmt: @@ -803,7 +808,7 @@ standard_ProcessUtility(Node *parsetree, GrantStmt *stmt = (GrantStmt *) parsetree; if (EventTriggerSupportsGrantObjectType(stmt->objtype)) - ProcessUtilitySlow(parsetree, queryString, + ProcessUtilitySlow(pstate, parsetree, queryString, context, params, dest, completionTag); else @@ -816,7 +821,7 @@ standard_ProcessUtility(Node *parsetree, DropStmt *stmt = (DropStmt *) parsetree; if (EventTriggerSupportsObjectType(stmt->removeType)) - ProcessUtilitySlow(parsetree, queryString, + ProcessUtilitySlow(pstate, parsetree, queryString, context, params, dest, completionTag); else @@ -829,7 +834,7 @@ standard_ProcessUtility(Node *parsetree, RenameStmt *stmt = (RenameStmt *) parsetree; if (EventTriggerSupportsObjectType(stmt->renameType)) - ProcessUtilitySlow(parsetree, queryString, + ProcessUtilitySlow(pstate, parsetree, queryString, context, params, dest, completionTag); else @@ -842,7 +847,7 @@ standard_ProcessUtility(Node *parsetree, AlterObjectDependsStmt *stmt = (AlterObjectDependsStmt *) parsetree; if (EventTriggerSupportsObjectType(stmt->objectType)) - ProcessUtilitySlow(parsetree, queryString, + ProcessUtilitySlow(pstate, parsetree, queryString, context, params, dest, completionTag); else @@ -855,7 +860,7 @@ standard_ProcessUtility(Node *parsetree, AlterObjectSchemaStmt *stmt = (AlterObjectSchemaStmt *) parsetree; if (EventTriggerSupportsObjectType(stmt->objectType)) - ProcessUtilitySlow(parsetree, queryString, + ProcessUtilitySlow(pstate, parsetree, queryString, context, params, dest, completionTag); else @@ -868,7 +873,7 @@ standard_ProcessUtility(Node *parsetree, AlterOwnerStmt *stmt = (AlterOwnerStmt *) parsetree; if (EventTriggerSupportsObjectType(stmt->objectType)) - ProcessUtilitySlow(parsetree, queryString, + ProcessUtilitySlow(pstate, parsetree, queryString, context, params, dest, completionTag); else @@ -881,7 +886,7 @@ standard_ProcessUtility(Node *parsetree, CommentStmt *stmt = (CommentStmt *) parsetree; if (EventTriggerSupportsObjectType(stmt->objtype)) - ProcessUtilitySlow(parsetree, queryString, + ProcessUtilitySlow(pstate, parsetree, queryString, context, params, dest, completionTag); else @@ -894,7 +899,7 @@ standard_ProcessUtility(Node *parsetree, SecLabelStmt *stmt = (SecLabelStmt *) parsetree; if (EventTriggerSupportsObjectType(stmt->objtype)) - ProcessUtilitySlow(parsetree, queryString, + ProcessUtilitySlow(pstate, parsetree, queryString, context, params, dest, completionTag); else @@ -904,11 +909,13 @@ standard_ProcessUtility(Node *parsetree, default: /* All other statement types have event trigger support */ - ProcessUtilitySlow(parsetree, queryString, + ProcessUtilitySlow(pstate, parsetree, queryString, context, params, dest, completionTag); break; } + + free_parsestate(pstate); } /* @@ -917,7 +924,8 @@ standard_ProcessUtility(Node *parsetree, * perform the trigger support calls if the context allows it. */ static void -ProcessUtilitySlow(Node *parsetree, +ProcessUtilitySlow(ParseState *pstate, + Node *parsetree, const char *queryString, ProcessUtilityContext context, ParamListInfo params, @@ -1191,9 +1199,9 @@ ProcessUtilitySlow(Node *parsetree, { case OBJECT_AGGREGATE: address = - DefineAggregate(stmt->defnames, stmt->args, + DefineAggregate(pstate, stmt->defnames, stmt->args, stmt->oldstyle, - stmt->definition, queryString); + stmt->definition); break; case OBJECT_OPERATOR: Assert(stmt->args == NIL); @@ -1202,7 +1210,8 @@ ProcessUtilitySlow(Node *parsetree, break; case OBJECT_TYPE: Assert(stmt->args == NIL); - address = DefineType(stmt->defnames, + address = DefineType(pstate, + stmt->defnames, stmt->definition); break; case OBJECT_TSPARSER: @@ -1228,7 +1237,8 @@ ProcessUtilitySlow(Node *parsetree, break; case OBJECT_COLLATION: Assert(stmt->args == NIL); - address = DefineCollation(stmt->defnames, + address = DefineCollation(pstate, + stmt->defnames, stmt->definition); break; default: @@ -1293,11 +1303,11 @@ ProcessUtilitySlow(Node *parsetree, break; case T_CreateExtensionStmt: - address = CreateExtension((CreateExtensionStmt *) parsetree); + address = CreateExtension(pstate, (CreateExtensionStmt *) parsetree); break; case T_AlterExtensionStmt: - address = ExecAlterExtensionStmt((AlterExtensionStmt *) parsetree); + address = ExecAlterExtensionStmt(pstate, (AlterExtensionStmt *) parsetree); break; case T_AlterExtensionContentsStmt: @@ -1373,11 +1383,11 @@ ProcessUtilitySlow(Node *parsetree, break; case T_CreateFunctionStmt: /* CREATE FUNCTION */ - address = CreateFunction((CreateFunctionStmt *) parsetree, queryString); + address = CreateFunction(pstate, (CreateFunctionStmt *) parsetree); break; case T_AlterFunctionStmt: /* ALTER FUNCTION */ - address = AlterFunction((AlterFunctionStmt *) parsetree); + address = AlterFunction(pstate, (AlterFunctionStmt *) parsetree); break; case T_RuleStmt: /* CREATE RULE */ @@ -1385,11 +1395,11 @@ ProcessUtilitySlow(Node *parsetree, break; case T_CreateSeqStmt: - address = DefineSequence((CreateSeqStmt *) parsetree); + address = DefineSequence(pstate, (CreateSeqStmt *) parsetree); break; case T_AlterSeqStmt: - address = AlterSequence((AlterSeqStmt *) parsetree); + address = AlterSequence(pstate, (AlterSeqStmt *) parsetree); break; case T_CreateTableAsStmt: @@ -1523,7 +1533,7 @@ ProcessUtilitySlow(Node *parsetree, break; case T_AlterDefaultPrivilegesStmt: - ExecAlterDefaultPrivilegesStmt((AlterDefaultPrivilegesStmt *) parsetree); + ExecAlterDefaultPrivilegesStmt(pstate, (AlterDefaultPrivilegesStmt *) parsetree); EventTriggerCollectAlterDefPrivs((AlterDefaultPrivilegesStmt *) parsetree); commandCollected = true; break; |
