Add location field to DefElem
authorPeter Eisentraut <peter_e@gmx.net>
Tue, 6 Sep 2016 16:00:00 +0000 (12:00 -0400)
committerPeter Eisentraut <peter_e@gmx.net>
Tue, 6 Sep 2016 16:00:00 +0000 (12:00 -0400)
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>
38 files changed:
contrib/file_fdw/file_fdw.c
src/backend/access/common/reloptions.c
src/backend/catalog/aclchk.c
src/backend/commands/aggregatecmds.c
src/backend/commands/collationcmds.c
src/backend/commands/copy.c
src/backend/commands/dbcommands.c
src/backend/commands/define.c
src/backend/commands/explain.c
src/backend/commands/extension.c
src/backend/commands/functioncmds.c
src/backend/commands/sequence.c
src/backend/commands/tsearchcmds.c
src/backend/commands/typecmds.c
src/backend/commands/user.c
src/backend/commands/view.c
src/backend/nodes/copyfuncs.c
src/backend/nodes/equalfuncs.c
src/backend/nodes/makefuncs.c
src/backend/nodes/outfuncs.c
src/backend/nodes/readfuncs.c
src/backend/parser/gram.y
src/backend/parser/parse_utilcmd.c
src/backend/replication/logical/logicalfuncs.c
src/backend/replication/repl_gram.y
src/backend/tcop/utility.c
src/include/commands/collationcmds.h
src/include/commands/copy.h
src/include/commands/dbcommands.h
src/include/commands/defrem.h
src/include/commands/explain.h
src/include/commands/extension.h
src/include/commands/sequence.h
src/include/commands/typecmds.h
src/include/commands/user.h
src/include/nodes/makefuncs.h
src/include/nodes/parsenodes.h
src/include/utils/acl.h

index b42de873e0f56ced19c15ed15a88431b7202ebb7..b4719913183e16f99d5998a8d2c5e9b994427480 100644 (file)
@@ -293,7 +293,7 @@ file_fdw_validator(PG_FUNCTION_ARGS)
        /*
         * Now apply the core COPY code's validation logic for more checks.
         */
-       ProcessCopyOptions(NULL, true, other_options);
+       ProcessCopyOptions(NULL, NULL, true, other_options);
 
        /*
         * Filename option is required for file_fdw foreign tables.
@@ -455,10 +455,10 @@ get_file_fdw_attribute_options(Oid relid)
         * force_null options set
         */
        if (fnncolumns != NIL)
-               options = lappend(options, makeDefElem("force_not_null", (Node *) fnncolumns));
+               options = lappend(options, makeDefElem("force_not_null", (Node *) fnncolumns, -1));
 
        if (fncolumns != NIL)
-               options = lappend(options, makeDefElem("force_null", (Node *) fncolumns));
+               options = lappend(options, makeDefElem("force_null", (Node *) fncolumns, -1));
 
        return options;
 }
@@ -511,7 +511,7 @@ fileGetForeignPaths(PlannerInfo *root,
                                                                                  foreigntableid,
                                                                                  &columns))
                coptions = list_make1(makeDefElem("convert_selectively",
-                                                                                 (Node *) columns));
+                                                                                 (Node *) columns, -1));
 
        /* Estimate costs */
        estimate_costs(root, baserel, fdw_private,
@@ -632,7 +632,8 @@ fileBeginForeignScan(ForeignScanState *node, int eflags)
         * Create CopyState from FDW options.  We always acquire all columns, so
         * as to match the expected ScanTupleSlot signature.
         */
-       cstate = BeginCopyFrom(node->ss.ss_currentRelation,
+       cstate = BeginCopyFrom(NULL,
+                                                  node->ss.ss_currentRelation,
                                                   filename,
                                                   false,
                                                   NIL,
@@ -705,7 +706,8 @@ fileReScanForeignScan(ForeignScanState *node)
 
        EndCopyFrom(festate->cstate);
 
-       festate->cstate = BeginCopyFrom(node->ss.ss_currentRelation,
+       festate->cstate = BeginCopyFrom(NULL,
+                                                                       node->ss.ss_currentRelation,
                                                                        festate->filename,
                                                                        false,
                                                                        NIL,
@@ -1053,7 +1055,7 @@ file_acquire_sample_rows(Relation onerel, int elevel,
        /*
         * Create CopyState from FDW options.
         */
-       cstate = BeginCopyFrom(onerel, filename, false, NIL, options);
+       cstate = BeginCopyFrom(NULL, onerel, filename, false, NIL, options);
 
        /*
         * Use per-tuple memory context to prevent leak of memory used to read
index ba1f3aafed7fc182fabb5ed127d980d1ec45bef5..83a97b06ab85bdfaa04c82bf2479948a2cc68849 100644 (file)
@@ -888,7 +888,7 @@ untransformRelOptions(Datum options)
                        *p++ = '\0';
                        val = (Node *) makeString(pstrdup(p));
                }
-               result = lappend(result, makeDefElem(pstrdup(s), val));
+               result = lappend(result, makeDefElem(pstrdup(s), val, -1));
        }
 
        return result;
index a585c3ad19a35f783cf9be9958914f20a74f003f..c0df6710d1d110efbf767c82e12f15c793dadff3 100644 (file)
@@ -849,7 +849,7 @@ getRelationsInNamespace(Oid namespaceId, char relkind)
  * ALTER DEFAULT PRIVILEGES statement
  */
 void
-ExecAlterDefaultPrivilegesStmt(AlterDefaultPrivilegesStmt *stmt)
+ExecAlterDefaultPrivilegesStmt(ParseState *pstate, AlterDefaultPrivilegesStmt *stmt)
 {
        GrantStmt  *action = stmt->action;
        InternalDefaultACL iacls;
@@ -871,7 +871,8 @@ ExecAlterDefaultPrivilegesStmt(AlterDefaultPrivilegesStmt *stmt)
                        if (dnspnames)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dnspnames = defel;
                }
                else if (strcmp(defel->defname, "roles") == 0)
@@ -879,7 +880,8 @@ ExecAlterDefaultPrivilegesStmt(AlterDefaultPrivilegesStmt *stmt)
                        if (drolespecs)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        drolespecs = defel;
                }
                else
index d34c82c5baf7134d9f991dc64ff2bd838fc7eb92..b36f09eb7b924400d914c9d66682c309f151a582 100644 (file)
@@ -52,8 +52,7 @@
  * "parameters" is a list of DefElem representing the agg's definition clauses.
  */
 ObjectAddress
-DefineAggregate(List *name, List *args, bool oldstyle, List *parameters,
-                               const char *queryString)
+DefineAggregate(ParseState *pstate, List *name, List *args, bool oldstyle, List *parameters)
 {
        char       *aggName;
        Oid                     aggNamespace;
@@ -287,10 +286,10 @@ DefineAggregate(List *name, List *args, bool oldstyle, List *parameters,
                                         errmsg("basetype is redundant with aggregate input type specification")));
 
                numArgs = list_length(args);
-               interpret_function_parameter_list(args,
+               interpret_function_parameter_list(pstate,
+                                                                                 args,
                                                                                  InvalidOid,
                                                                                  true, /* is an aggregate */
-                                                                                 queryString,
                                                                                  &parameterTypes,
                                                                                  &allParameterTypes,
                                                                                  &parameterModes,
index e4ebb654a6e856b3856e54ecbc7893de01745317..0c75d16f36995ef06b46cce9cdc79a17a510bfe7 100644 (file)
@@ -38,7 +38,7 @@
  * CREATE COLLATION
  */
 ObjectAddress
-DefineCollation(List *names, List *parameters)
+DefineCollation(ParseState *pstate, List *names, List *parameters)
 {
        char       *collName;
        Oid                     collNamespace;
@@ -78,7 +78,8 @@ DefineCollation(List *names, List *parameters)
                        ereport(ERROR,
                                        (errcode(ERRCODE_SYNTAX_ERROR),
                                         errmsg("collation attribute \"%s\" not recognized",
-                                                       defel->defname)));
+                                                       defel->defname),
+                                        parser_errposition(pstate, defel->location)));
                        break;
                }
 
index 5947e7209342aa4e68e6e7802f2bf8310d058b7e..e393c0b39eac804dc36239873e885c15ab8272f8 100644 (file)
@@ -279,12 +279,12 @@ static const char BinarySignature[11] = "PGCOPY\n\377\r\n\0";
 
 
 /* non-export function prototypes */
-static CopyState BeginCopy(bool is_from, Relation rel, Node *raw_query,
-                 const char *queryString, const Oid queryRelId, List *attnamelist,
+static CopyState BeginCopy(ParseState *pstate, bool is_from, Relation rel, Node *raw_query,
+                                                  const Oid queryRelId, List *attnamelist,
                  List *options);
 static void EndCopy(CopyState cstate);
 static void ClosePipeToProgram(CopyState cstate);
-static CopyState BeginCopyTo(Relation rel, Node *query, const char *queryString,
+static CopyState BeginCopyTo(ParseState *pstate, Relation rel, Node *query,
                        const Oid queryRelId, const char *filename, bool is_program,
                        List *attnamelist, List *options);
 static void EndCopyTo(CopyState cstate);
@@ -787,7 +787,7 @@ CopyLoadRawBuf(CopyState cstate)
  * the table or the specifically requested columns.
  */
 Oid
-DoCopy(const CopyStmt *stmt, const char *queryString, uint64 *processed)
+DoCopy(ParseState *pstate, const CopyStmt *stmt, uint64 *processed)
 {
        CopyState       cstate;
        bool            is_from = stmt->is_from;
@@ -936,7 +936,7 @@ DoCopy(const CopyStmt *stmt, const char *queryString, uint64 *processed)
                        PreventCommandIfReadOnly("COPY FROM");
                PreventCommandIfParallelMode("COPY FROM");
 
-               cstate = BeginCopyFrom(rel, stmt->filename, stmt->is_program,
+               cstate = BeginCopyFrom(pstate, rel, stmt->filename, stmt->is_program,
                                                           stmt->attlist, stmt->options);
                cstate->range_table = range_table;
                *processed = CopyFrom(cstate);  /* copy from file to database */
@@ -944,7 +944,7 @@ DoCopy(const CopyStmt *stmt, const char *queryString, uint64 *processed)
        }
        else
        {
-               cstate = BeginCopyTo(rel, query, queryString, relid,
+               cstate = BeginCopyTo(pstate, rel, query, relid,
                                                         stmt->filename, stmt->is_program,
                                                         stmt->attlist, stmt->options);
                *processed = DoCopyTo(cstate);  /* copy from database to file */
@@ -980,7 +980,8 @@ DoCopy(const CopyStmt *stmt, const char *queryString, uint64 *processed)
  * self-consistency of the options list.
  */
 void
-ProcessCopyOptions(CopyState cstate,
+ProcessCopyOptions(ParseState *pstate,
+                                  CopyState cstate,
                                   bool is_from,
                                   List *options)
 {
@@ -1005,7 +1006,8 @@ ProcessCopyOptions(CopyState cstate,
                        if (format_specified)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        format_specified = true;
                        if (strcmp(fmt, "text") == 0)
                                 /* default format */ ;
@@ -1016,14 +1018,16 @@ ProcessCopyOptions(CopyState cstate,
                        else
                                ereport(ERROR,
                                                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-                                                errmsg("COPY format \"%s\" not recognized", fmt)));
+                                                errmsg("COPY format \"%s\" not recognized", fmt),
+                                                parser_errposition(pstate, defel->location)));
                }
                else if (strcmp(defel->defname, "oids") == 0)
                {
                        if (cstate->oids)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        cstate->oids = defGetBoolean(defel);
                }
                else if (strcmp(defel->defname, "freeze") == 0)
@@ -1031,7 +1035,8 @@ ProcessCopyOptions(CopyState cstate,
                        if (cstate->freeze)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        cstate->freeze = defGetBoolean(defel);
                }
                else if (strcmp(defel->defname, "delimiter") == 0)
@@ -1039,7 +1044,8 @@ ProcessCopyOptions(CopyState cstate,
                        if (cstate->delim)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        cstate->delim = defGetString(defel);
                }
                else if (strcmp(defel->defname, "null") == 0)
@@ -1047,7 +1053,8 @@ ProcessCopyOptions(CopyState cstate,
                        if (cstate->null_print)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        cstate->null_print = defGetString(defel);
                }
                else if (strcmp(defel->defname, "header") == 0)
@@ -1055,7 +1062,8 @@ ProcessCopyOptions(CopyState cstate,
                        if (cstate->header_line)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        cstate->header_line = defGetBoolean(defel);
                }
                else if (strcmp(defel->defname, "quote") == 0)
@@ -1063,7 +1071,8 @@ ProcessCopyOptions(CopyState cstate,
                        if (cstate->quote)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        cstate->quote = defGetString(defel);
                }
                else if (strcmp(defel->defname, "escape") == 0)
@@ -1071,7 +1080,8 @@ ProcessCopyOptions(CopyState cstate,
                        if (cstate->escape)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        cstate->escape = defGetString(defel);
                }
                else if (strcmp(defel->defname, "force_quote") == 0)
@@ -1079,7 +1089,8 @@ ProcessCopyOptions(CopyState cstate,
                        if (cstate->force_quote || cstate->force_quote_all)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        if (defel->arg && IsA(defel->arg, A_Star))
                                cstate->force_quote_all = true;
                        else if (defel->arg && IsA(defel->arg, List))
@@ -1088,21 +1099,24 @@ ProcessCopyOptions(CopyState cstate,
                                ereport(ERROR,
                                                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                                 errmsg("argument to option \"%s\" must be a list of column names",
-                                                               defel->defname)));
+                                                               defel->defname),
+                                                parser_errposition(pstate, defel->location)));
                }
                else if (strcmp(defel->defname, "force_not_null") == 0)
                {
                        if (cstate->force_notnull)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        if (defel->arg && IsA(defel->arg, List))
                                cstate->force_notnull = (List *) defel->arg;
                        else
                                ereport(ERROR,
                                                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                                 errmsg("argument to option \"%s\" must be a list of column names",
-                                                               defel->defname)));
+                                                               defel->defname),
+                                                parser_errposition(pstate, defel->location)));
                }
                else if (strcmp(defel->defname, "force_null") == 0)
                {
@@ -1116,7 +1130,8 @@ ProcessCopyOptions(CopyState cstate,
                                ereport(ERROR,
                                                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                                 errmsg("argument to option \"%s\" must be a list of column names",
-                                                               defel->defname)));
+                                                               defel->defname),
+                                                parser_errposition(pstate, defel->location)));
                }
                else if (strcmp(defel->defname, "convert_selectively") == 0)
                {
@@ -1128,7 +1143,8 @@ ProcessCopyOptions(CopyState cstate,
                        if (cstate->convert_selectively)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        cstate->convert_selectively = true;
                        if (defel->arg == NULL || IsA(defel->arg, List))
                                cstate->convert_select = (List *) defel->arg;
@@ -1136,26 +1152,30 @@ ProcessCopyOptions(CopyState cstate,
                                ereport(ERROR,
                                                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                                 errmsg("argument to option \"%s\" must be a list of column names",
-                                                               defel->defname)));
+                                                               defel->defname),
+                                                parser_errposition(pstate, defel->location)));
                }
                else if (strcmp(defel->defname, "encoding") == 0)
                {
                        if (cstate->file_encoding >= 0)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        cstate->file_encoding = pg_char_to_encoding(defGetString(defel));
                        if (cstate->file_encoding < 0)
                                ereport(ERROR,
                                                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                                 errmsg("argument to option \"%s\" must be a valid encoding name",
-                                                               defel->defname)));
+                                                               defel->defname),
+                                                parser_errposition(pstate, defel->location)));
                }
                else
                        ereport(ERROR,
                                        (errcode(ERRCODE_SYNTAX_ERROR),
                                         errmsg("option \"%s\" not recognized",
-                                                       defel->defname)));
+                                                       defel->defname),
+                                                parser_errposition(pstate, defel->location)));
        }
 
        /*
@@ -1318,10 +1338,10 @@ ProcessCopyOptions(CopyState cstate,
  * NULL values as <null_print>.
  */
 static CopyState
-BeginCopy(bool is_from,
+BeginCopy(ParseState *pstate,
+                 bool is_from,
                  Relation rel,
                  Node *raw_query,
-                 const char *queryString,
                  const Oid queryRelId,
                  List *attnamelist,
                  List *options)
@@ -1345,7 +1365,7 @@ BeginCopy(bool is_from,
        oldcontext = MemoryContextSwitchTo(cstate->copycontext);
 
        /* Extract options from the statement node tree */
-       ProcessCopyOptions(cstate, is_from, options);
+       ProcessCopyOptions(pstate, cstate, is_from, options);
 
        /* Process the source/target relation or query */
        if (rel)
@@ -1390,7 +1410,7 @@ BeginCopy(bool is_from,
                 * DECLARE CURSOR and PREPARE.)  XXX FIXME someday.
                 */
                rewritten = pg_analyze_and_rewrite((Node *) copyObject(raw_query),
-                                                                                  queryString, NULL, 0);
+                                                                                  pstate->p_sourcetext, NULL, 0);
 
                /* check that we got back something we can work with */
                if (rewritten == NIL)
@@ -1490,7 +1510,7 @@ BeginCopy(bool is_from,
                ((DR_copy *) dest)->cstate = cstate;
 
                /* Create a QueryDesc requesting no output */
-               cstate->queryDesc = CreateQueryDesc(plan, queryString,
+               cstate->queryDesc = CreateQueryDesc(plan, pstate->p_sourcetext,
                                                                                        GetActiveSnapshot(),
                                                                                        InvalidSnapshot,
                                                                                        dest, NULL, 0);
@@ -1678,9 +1698,9 @@ EndCopy(CopyState cstate)
  * Setup CopyState to read tuples from a table or a query for COPY TO.
  */
 static CopyState
-BeginCopyTo(Relation rel,
+BeginCopyTo(ParseState *pstate,
+                       Relation rel,
                        Node *query,
-                       const char *queryString,
                        const Oid queryRelId,
                        const char *filename,
                        bool is_program,
@@ -1723,7 +1743,7 @@ BeginCopyTo(Relation rel,
                                                        RelationGetRelationName(rel))));
        }
 
-       cstate = BeginCopy(false, rel, query, queryString, queryRelId, attnamelist,
+       cstate = BeginCopy(pstate, false, rel, query, queryRelId, attnamelist,
                                           options);
        oldcontext = MemoryContextSwitchTo(cstate->copycontext);
 
@@ -2645,7 +2665,8 @@ CopyFromInsertBatch(CopyState cstate, EState *estate, CommandId mycid,
  * Returns a CopyState, to be passed to NextCopyFrom and related functions.
  */
 CopyState
-BeginCopyFrom(Relation rel,
+BeginCopyFrom(ParseState *pstate,
+                         Relation rel,
                          const char *filename,
                          bool is_program,
                          List *attnamelist,
@@ -2666,7 +2687,7 @@ BeginCopyFrom(Relation rel,
        MemoryContext oldcontext;
        bool            volatile_defexprs;
 
-       cstate = BeginCopy(true, rel, NULL, NULL, InvalidOid, attnamelist, options);
+       cstate = BeginCopy(pstate, true, rel, NULL, InvalidOid, attnamelist, options);
        oldcontext = MemoryContextSwitchTo(cstate->copycontext);
 
        /* Initialize state variables */
index c1c0223770eb68a2b42f19ea6a405a4fadfbb9d9..ef486593c0034f074feab8d16c7a4a4b55fca9c7 100644 (file)
@@ -96,7 +96,7 @@ static int    errdetail_busy_db(int notherbackends, int npreparedxacts);
  * CREATE DATABASE
  */
 Oid
-createdb(const CreatedbStmt *stmt)
+createdb(ParseState *pstate, const CreatedbStmt *stmt)
 {
        HeapScanDesc scan;
        Relation        rel;
@@ -152,7 +152,8 @@ createdb(const CreatedbStmt *stmt)
                        if (dtablespacename)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dtablespacename = defel;
                }
                else if (strcmp(defel->defname, "owner") == 0)
@@ -160,7 +161,8 @@ createdb(const CreatedbStmt *stmt)
                        if (downer)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        downer = defel;
                }
                else if (strcmp(defel->defname, "template") == 0)
@@ -168,7 +170,8 @@ createdb(const CreatedbStmt *stmt)
                        if (dtemplate)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dtemplate = defel;
                }
                else if (strcmp(defel->defname, "encoding") == 0)
@@ -176,7 +179,8 @@ createdb(const CreatedbStmt *stmt)
                        if (dencoding)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dencoding = defel;
                }
                else if (strcmp(defel->defname, "lc_collate") == 0)
@@ -184,7 +188,8 @@ createdb(const CreatedbStmt *stmt)
                        if (dcollate)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dcollate = defel;
                }
                else if (strcmp(defel->defname, "lc_ctype") == 0)
@@ -192,7 +197,8 @@ createdb(const CreatedbStmt *stmt)
                        if (dctype)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dctype = defel;
                }
                else if (strcmp(defel->defname, "is_template") == 0)
@@ -200,7 +206,8 @@ createdb(const CreatedbStmt *stmt)
                        if (distemplate)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        distemplate = defel;
                }
                else if (strcmp(defel->defname, "allow_connections") == 0)
@@ -208,7 +215,8 @@ createdb(const CreatedbStmt *stmt)
                        if (dallowconnections)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dallowconnections = defel;
                }
                else if (strcmp(defel->defname, "connection_limit") == 0)
@@ -216,7 +224,8 @@ createdb(const CreatedbStmt *stmt)
                        if (dconnlimit)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dconnlimit = defel;
                }
                else if (strcmp(defel->defname, "location") == 0)
@@ -224,12 +233,14 @@ createdb(const CreatedbStmt *stmt)
                        ereport(WARNING,
                                        (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                                         errmsg("LOCATION is not supported anymore"),
-                                        errhint("Consider using tablespaces instead.")));
+                                        errhint("Consider using tablespaces instead."),
+                                        parser_errposition(pstate, defel->location)));
                }
                else
                        ereport(ERROR,
                                        (errcode(ERRCODE_SYNTAX_ERROR),
-                                        errmsg("option \"%s\" not recognized", defel->defname)));
+                                        errmsg("option \"%s\" not recognized", defel->defname),
+                                        parser_errposition(pstate, defel->location)));
        }
 
        if (downer && downer->arg)
@@ -249,7 +260,8 @@ createdb(const CreatedbStmt *stmt)
                                ereport(ERROR,
                                                (errcode(ERRCODE_UNDEFINED_OBJECT),
                                                 errmsg("%d is not a valid encoding code",
-                                                               encoding)));
+                                                               encoding),
+                                                parser_errposition(pstate, dencoding->location)));
                }
                else
                {
@@ -259,7 +271,8 @@ createdb(const CreatedbStmt *stmt)
                                ereport(ERROR,
                                                (errcode(ERRCODE_UNDEFINED_OBJECT),
                                                 errmsg("%s is not a valid encoding name",
-                                                               encoding_name)));
+                                                               encoding_name),
+                                                parser_errposition(pstate, dencoding->location)));
                }
        }
        if (dcollate && dcollate->arg)
@@ -1364,7 +1377,7 @@ movedb_failure_callback(int code, Datum arg)
  * ALTER DATABASE name ...
  */
 Oid
-AlterDatabase(AlterDatabaseStmt *stmt, bool isTopLevel)
+AlterDatabase(ParseState *pstate, AlterDatabaseStmt *stmt, bool isTopLevel)
 {
        Relation        rel;
        Oid                     dboid;
@@ -1394,7 +1407,8 @@ AlterDatabase(AlterDatabaseStmt *stmt, bool isTopLevel)
                        if (distemplate)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        distemplate = defel;
                }
                else if (strcmp(defel->defname, "allow_connections") == 0)
@@ -1402,7 +1416,8 @@ AlterDatabase(AlterDatabaseStmt *stmt, bool isTopLevel)
                        if (dallowconnections)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dallowconnections = defel;
                }
                else if (strcmp(defel->defname, "connection_limit") == 0)
@@ -1410,7 +1425,8 @@ AlterDatabase(AlterDatabaseStmt *stmt, bool isTopLevel)
                        if (dconnlimit)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dconnlimit = defel;
                }
                else if (strcmp(defel->defname, "tablespace") == 0)
@@ -1418,13 +1434,15 @@ AlterDatabase(AlterDatabaseStmt *stmt, bool isTopLevel)
                        if (dtablespace)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dtablespace = defel;
                }
                else
                        ereport(ERROR,
                                        (errcode(ERRCODE_SYNTAX_ERROR),
-                                        errmsg("option \"%s\" not recognized", defel->defname)));
+                                        errmsg("option \"%s\" not recognized", defel->defname),
+                                        parser_errposition(pstate, defel->location)));
        }
 
        if (dtablespace)
@@ -1438,7 +1456,8 @@ AlterDatabase(AlterDatabaseStmt *stmt, bool isTopLevel)
                        ereport(ERROR,
                                        (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                           errmsg("option \"%s\" cannot be specified with other options",
-                                         dtablespace->defname)));
+                                         dtablespace->defname),
+                                        parser_errposition(pstate, dtablespace->location)));
                /* this case isn't allowed within a transaction block */
                PreventTransactionChain(isTopLevel, "ALTER DATABASE SET TABLESPACE");
                movedb(stmt->dbname, defGetString(dtablespace));
index ece803ec4bf831d92af08d8ac160bd9e9ef51831..533926693af8ff3dbbc35c23c9dff6ca0731cccb 100644 (file)
@@ -319,12 +319,3 @@ defGetTypeLength(DefElem *def)
                                        def->defname, defGetString(def))));
        return 0;                                       /* keep compiler quiet */
 }
-
-/*
- * Create a DefElem setting "oids" to the specified value.
- */
-DefElem *
-defWithOids(bool value)
-{
-       return makeDefElem("oids", (Node *) makeInteger(value));
-}
index 82ba58ef713947b3e595279b0fa004fb4578bdef..124743318d891cd23f1f78f044d0f2389c03f89a 100644 (file)
@@ -140,7 +140,7 @@ static void escape_yaml(StringInfo buf, const char *str);
  *       execute an EXPLAIN command
  */
 void
-ExplainQuery(ExplainStmt *stmt, const char *queryString,
+ExplainQuery(ParseState *pstate, ExplainStmt *stmt, const char *queryString,
                         ParamListInfo params, DestReceiver *dest)
 {
        ExplainState *es = NewExplainState();
@@ -183,13 +183,15 @@ ExplainQuery(ExplainStmt *stmt, const char *queryString,
                                ereport(ERROR,
                                                (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                errmsg("unrecognized value for EXPLAIN option \"%s\": \"%s\"",
-                                          opt->defname, p)));
+                                          opt->defname, p),
+                                                parser_errposition(pstate, opt->location)));
                }
                else
                        ereport(ERROR,
                                        (errcode(ERRCODE_SYNTAX_ERROR),
                                         errmsg("unrecognized EXPLAIN option \"%s\"",
-                                                       opt->defname)));
+                                                       opt->defname),
+                                        parser_errposition(pstate, opt->location)));
        }
 
        if (es->buffers && !es->analyze)
index fa861e670b7e85a71f0a9a78142131b0b7745b7f..df49a78e2fa467e4429d32b2599983944cd9d56c 100644 (file)
@@ -1175,7 +1175,7 @@ find_update_path(List *evi_list,
  * installed, allowing us to error out if we recurse to one of those.
  */
 static ObjectAddress
-CreateExtensionInternal(CreateExtensionStmt *stmt, List *parents)
+CreateExtensionInternal(ParseState *pstate, CreateExtensionStmt *stmt, List *parents)
 {
        DefElem    *d_schema = NULL;
        DefElem    *d_new_version = NULL;
@@ -1215,7 +1215,8 @@ CreateExtensionInternal(CreateExtensionStmt *stmt, List *parents)
                        if (d_schema)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        d_schema = defel;
                }
                else if (strcmp(defel->defname, "new_version") == 0)
@@ -1223,7 +1224,8 @@ CreateExtensionInternal(CreateExtensionStmt *stmt, List *parents)
                        if (d_new_version)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        d_new_version = defel;
                }
                else if (strcmp(defel->defname, "old_version") == 0)
@@ -1231,7 +1233,8 @@ CreateExtensionInternal(CreateExtensionStmt *stmt, List *parents)
                        if (d_old_version)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        d_old_version = defel;
                }
                else if (strcmp(defel->defname, "cascade") == 0)
@@ -1239,7 +1242,8 @@ CreateExtensionInternal(CreateExtensionStmt *stmt, List *parents)
                        if (d_cascade)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        d_cascade = defel;
                        cascade = defGetBoolean(d_cascade);
                }
@@ -1458,7 +1462,7 @@ CreateExtensionInternal(CreateExtensionStmt *stmt, List *parents)
                                        lappend(list_copy(parents), stmt->extname);
 
                                /* Create the required extension. */
-                               addr = CreateExtensionInternal(ces, cascade_parents);
+                               addr = CreateExtensionInternal(pstate, ces, cascade_parents);
 
                                /* Get its newly-assigned OID. */
                                reqext = addr.objectId;
@@ -1515,7 +1519,7 @@ CreateExtensionInternal(CreateExtensionStmt *stmt, List *parents)
  * CREATE EXTENSION
  */
 ObjectAddress
-CreateExtension(CreateExtensionStmt *stmt)
+CreateExtension(ParseState *pstate, CreateExtensionStmt *stmt)
 {
        /* Check extension name validity before any filesystem access */
        check_valid_extension_name(stmt->extname);
@@ -1553,7 +1557,7 @@ CreateExtension(CreateExtensionStmt *stmt)
                                 errmsg("nested CREATE EXTENSION is not supported")));
 
        /* Finally create the extension. */
-       return CreateExtensionInternal(stmt, NIL);
+       return CreateExtensionInternal(pstate, stmt, NIL);
 }
 
 /*
@@ -2671,7 +2675,7 @@ AlterExtensionNamespace(List *names, const char *newschema, Oid *oldschema)
  * Execute ALTER EXTENSION UPDATE
  */
 ObjectAddress
-ExecAlterExtensionStmt(AlterExtensionStmt *stmt)
+ExecAlterExtensionStmt(ParseState *pstate, AlterExtensionStmt *stmt)
 {
        DefElem    *d_new_version = NULL;
        char       *versionName;
@@ -2757,7 +2761,8 @@ ExecAlterExtensionStmt(AlterExtensionStmt *stmt)
                        if (d_new_version)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        d_new_version = defel;
                }
                else
index 748c8f75d4824b1dbd2e4a81ceb7bc26a9a84be9..becafc3045a21a6dc989d852669708bdfaf0867c 100644 (file)
@@ -167,7 +167,6 @@ compute_return_type(TypeName *returnType, Oid languageOid,
  * parameters: list of FunctionParameter structs
  * languageOid: OID of function language (InvalidOid if it's CREATE AGGREGATE)
  * is_aggregate: needed only to determine error handling
- * queryString: likewise, needed only for error handling
  *
  * Results are stored into output parameters.  parameterTypes must always
  * be created, but the other arrays are set to NULL if not needed.
@@ -177,10 +176,10 @@ compute_return_type(TypeName *returnType, Oid languageOid,
  * else it is set to the OID of the implied result type.
  */
 void
-interpret_function_parameter_list(List *parameters,
+interpret_function_parameter_list(ParseState *pstate,
+                                                                 List *parameters,
                                                                  Oid languageOid,
                                                                  bool is_aggregate,
-                                                                 const char *queryString,
                                                                  oidvector **parameterTypes,
                                                                  ArrayType **allParameterTypes,
                                                                  ArrayType **parameterModes,
@@ -201,7 +200,6 @@ interpret_function_parameter_list(List *parameters,
        bool            have_defaults = false;
        ListCell   *x;
        int                     i;
-       ParseState *pstate;
 
        *variadicArgType = InvalidOid;          /* default result */
        *requiredResultType = InvalidOid;       /* default result */
@@ -212,10 +210,6 @@ interpret_function_parameter_list(List *parameters,
        paramNames = (Datum *) palloc0(parameterCount * sizeof(Datum));
        *parameterDefaults = NIL;
 
-       /* may need a pstate for parse analysis of default exprs */
-       pstate = make_parsestate(NULL);
-       pstate->p_sourcetext = queryString;
-
        /* Scan the list and extract data into work arrays */
        i = 0;
        foreach(x, parameters)
@@ -413,8 +407,6 @@ interpret_function_parameter_list(List *parameters,
                i++;
        }
 
-       free_parsestate(pstate);
-
        /* Now construct the proper outputs as needed */
        *parameterTypes = buildoidvector(inTypes, inCount);
 
@@ -458,7 +450,8 @@ interpret_function_parameter_list(List *parameters,
  * SET parameters though --- if you're redundant, the last one wins.)
  */
 static bool
-compute_common_attribute(DefElem *defel,
+compute_common_attribute(ParseState *pstate,
+                                                DefElem *defel,
                                                 DefElem **volatility_item,
                                                 DefElem **strict_item,
                                                 DefElem **security_item,
@@ -530,7 +523,8 @@ compute_common_attribute(DefElem *defel,
 duplicate_error:
        ereport(ERROR,
                        (errcode(ERRCODE_SYNTAX_ERROR),
-                        errmsg("conflicting or redundant options")));
+                        errmsg("conflicting or redundant options"),
+                        parser_errposition(pstate, defel->location)));
        return false;                           /* keep compiler quiet */
 }
 
@@ -609,7 +603,8 @@ update_proconfig_value(ArrayType *a, List *set_items)
  * attributes.
  */
 static void
-compute_attributes_sql_style(List *options,
+compute_attributes_sql_style(ParseState *pstate,
+                                                        List *options,
                                                         List **as,
                                                         char **language,
                                                         Node **transform,
@@ -646,7 +641,8 @@ compute_attributes_sql_style(List *options,
                        if (as_item)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        as_item = defel;
                }
                else if (strcmp(defel->defname, "language") == 0)
@@ -654,7 +650,8 @@ compute_attributes_sql_style(List *options,
                        if (language_item)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        language_item = defel;
                }
                else if (strcmp(defel->defname, "transform") == 0)
@@ -662,7 +659,8 @@ compute_attributes_sql_style(List *options,
                        if (transform_item)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        transform_item = defel;
                }
                else if (strcmp(defel->defname, "window") == 0)
@@ -670,10 +668,12 @@ compute_attributes_sql_style(List *options,
                        if (windowfunc_item)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        windowfunc_item = defel;
                }
-               else if (compute_common_attribute(defel,
+               else if (compute_common_attribute(pstate,
+                                                                                 defel,
                                                                                  &volatility_item,
                                                                                  &strict_item,
                                                                                  &security_item,
@@ -763,7 +763,7 @@ compute_attributes_sql_style(List *options,
  *------------
  */
 static void
-compute_attributes_with_style(List *parameters, bool *isStrict_p, char *volatility_p)
+compute_attributes_with_style(ParseState *pstate, List *parameters, bool *isStrict_p, char *volatility_p)
 {
        ListCell   *pl;
 
@@ -783,7 +783,8 @@ compute_attributes_with_style(List *parameters, bool *isStrict_p, char *volatili
                        ereport(WARNING,
                                        (errcode(ERRCODE_SYNTAX_ERROR),
                                         errmsg("unrecognized function attribute \"%s\" ignored",
-                                                       param->defname)));
+                                                       param->defname),
+                                        parser_errposition(pstate, param->location)));
        }
 }
 
@@ -858,7 +859,7 @@ interpret_AS_clause(Oid languageOid, const char *languageName,
  *      Execute a CREATE FUNCTION utility statement.
  */
 ObjectAddress
-CreateFunction(CreateFunctionStmt *stmt, const char *queryString)
+CreateFunction(ParseState *pstate, CreateFunctionStmt *stmt)
 {
        char       *probin_str;
        char       *prosrc_str;
@@ -915,7 +916,8 @@ CreateFunction(CreateFunctionStmt *stmt, const char *queryString)
        parallel = PROPARALLEL_UNSAFE;
 
        /* override attributes from explicit list */
-       compute_attributes_sql_style(stmt->options,
+       compute_attributes_sql_style(pstate,
+                                                                stmt->options,
                                                                 &as_clause, &language, &transformDefElem,
                                                                 &isWindowFunc, &volatility,
                                                                 &isStrict, &security, &isLeakProof,
@@ -987,10 +989,10 @@ CreateFunction(CreateFunctionStmt *stmt, const char *queryString)
         * Convert remaining parameters of CREATE to form wanted by
         * ProcedureCreate.
         */
-       interpret_function_parameter_list(stmt->parameters,
+       interpret_function_parameter_list(pstate,
+                                                                         stmt->parameters,
                                                                          languageOid,
                                                                          false,        /* not an aggregate */
-                                                                         queryString,
                                                                          &parameterTypes,
                                                                          &allParameterTypes,
                                                                          &parameterModes,
@@ -1045,7 +1047,7 @@ CreateFunction(CreateFunctionStmt *stmt, const char *queryString)
                trftypes = NULL;
        }
 
-       compute_attributes_with_style(stmt->withClause, &isStrict, &volatility);
+       compute_attributes_with_style(pstate, stmt->withClause, &isStrict, &volatility);
 
        interpret_AS_clause(languageOid, language, funcname, as_clause,
                                                &prosrc_str, &probin_str);
@@ -1163,7 +1165,7 @@ RemoveFunctionById(Oid funcOid)
  * ALTER framework).
  */
 ObjectAddress
-AlterFunction(AlterFunctionStmt *stmt)
+AlterFunction(ParseState *pstate, AlterFunctionStmt *stmt)
 {
        HeapTuple       tup;
        Oid                     funcOid;
@@ -1208,7 +1210,8 @@ AlterFunction(AlterFunctionStmt *stmt)
        {
                DefElem    *defel = (DefElem *) lfirst(l);
 
-               if (compute_common_attribute(defel,
+               if (compute_common_attribute(pstate,
+                                                                        defel,
                                                                         &volatility_item,
                                                                         &strict_item,
                                                                         &security_def_item,
index c98f9811119e8df366aa7e20e8fff2f88c52e31b..fc3a8eebce3389f155e3e30046433ad451046865 100644 (file)
@@ -94,7 +94,7 @@ static void create_seq_hashtable(void);
 static void init_sequence(Oid relid, SeqTable *p_elm, Relation *p_rel);
 static Form_pg_sequence read_seq_tuple(SeqTable elm, Relation rel,
                           Buffer *buf, HeapTuple seqtuple);
-static void init_params(List *options, bool isInit,
+static void init_params(ParseState *pstate, List *options, bool isInit,
                        Form_pg_sequence new, List **owned_by);
 static void do_setval(Oid relid, int64 next, bool iscalled);
 static void process_owned_by(Relation seqrel, List *owned_by);
@@ -105,7 +105,7 @@ static void process_owned_by(Relation seqrel, List *owned_by);
  *                             Creates a new sequence relation
  */
 ObjectAddress
-DefineSequence(CreateSeqStmt *seq)
+DefineSequence(ParseState *pstate, CreateSeqStmt *seq)
 {
        FormData_pg_sequence new;
        List       *owned_by;
@@ -145,7 +145,7 @@ DefineSequence(CreateSeqStmt *seq)
        }
 
        /* Check and set all option values */
-       init_params(seq->options, true, &new, &owned_by);
+       init_params(pstate, seq->options, true, &new, &owned_by);
 
        /*
         * Create relation (and fill value[] and null[] for the tuple)
@@ -404,7 +404,7 @@ fill_seq_with_data(Relation rel, HeapTuple tuple)
  * Modify the definition of a sequence relation
  */
 ObjectAddress
-AlterSequence(AlterSeqStmt *stmt)
+AlterSequence(ParseState *pstate, AlterSeqStmt *stmt)
 {
        Oid                     relid;
        SeqTable        elm;
@@ -440,7 +440,7 @@ AlterSequence(AlterSeqStmt *stmt)
        memcpy(&new, seq, sizeof(FormData_pg_sequence));
 
        /* Check and set new values */
-       init_params(stmt->options, false, &new, &owned_by);
+       init_params(pstate, stmt->options, false, &new, &owned_by);
 
        /* Clear local cache so that we don't think we have cached numbers */
        /* Note that we do not change the currval() state */
@@ -1163,7 +1163,7 @@ read_seq_tuple(SeqTable elm, Relation rel, Buffer *buf, HeapTuple seqtuple)
  * otherwise, do not change existing options that aren't explicitly overridden.
  */
 static void
-init_params(List *options, bool isInit,
+init_params(ParseState *pstate, List *options, bool isInit,
                        Form_pg_sequence new, List **owned_by)
 {
        DefElem    *start_value = NULL;
@@ -1186,7 +1186,8 @@ init_params(List *options, bool isInit,
                        if (increment_by)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        increment_by = defel;
                }
                else if (strcmp(defel->defname, "start") == 0)
@@ -1194,7 +1195,8 @@ init_params(List *options, bool isInit,
                        if (start_value)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        start_value = defel;
                }
                else if (strcmp(defel->defname, "restart") == 0)
@@ -1202,7 +1204,8 @@ init_params(List *options, bool isInit,
                        if (restart_value)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        restart_value = defel;
                }
                else if (strcmp(defel->defname, "maxvalue") == 0)
@@ -1210,7 +1213,8 @@ init_params(List *options, bool isInit,
                        if (max_value)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        max_value = defel;
                }
                else if (strcmp(defel->defname, "minvalue") == 0)
@@ -1218,7 +1222,8 @@ init_params(List *options, bool isInit,
                        if (min_value)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        min_value = defel;
                }
                else if (strcmp(defel->defname, "cache") == 0)
@@ -1226,7 +1231,8 @@ init_params(List *options, bool isInit,
                        if (cache_value)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        cache_value = defel;
                }
                else if (strcmp(defel->defname, "cycle") == 0)
@@ -1234,7 +1240,8 @@ init_params(List *options, bool isInit,
                        if (is_cycled)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        is_cycled = defel;
                }
                else if (strcmp(defel->defname, "owned_by") == 0)
@@ -1242,7 +1249,8 @@ init_params(List *options, bool isInit,
                        if (*owned_by)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        *owned_by = defGetQualifiedName(defel);
                }
                else
index 69c038c52b15a7f495f04a473b5541e8fd84f185..b24011371c7d03e81df0133c1d847dc756bbb507 100644 (file)
@@ -1700,7 +1700,7 @@ deserialize_deflist(Datum txt)
                                                *wsptr++ = '\0';
                                                result = lappend(result,
                                                                                 makeDefElem(pstrdup(workspace),
-                                                                 (Node *) makeString(pstrdup(startvalue))));
+                                                                                                        (Node *) makeString(pstrdup(startvalue)), -1));
                                                state = CS_WAITKEY;
                                        }
                                }
@@ -1732,7 +1732,7 @@ deserialize_deflist(Datum txt)
                                                *wsptr++ = '\0';
                                                result = lappend(result,
                                                                                 makeDefElem(pstrdup(workspace),
-                                                                 (Node *) makeString(pstrdup(startvalue))));
+                                                                                                        (Node *) makeString(pstrdup(startvalue)), -1));
                                                state = CS_WAITKEY;
                                        }
                                }
@@ -1747,7 +1747,7 @@ deserialize_deflist(Datum txt)
                                        *wsptr++ = '\0';
                                        result = lappend(result,
                                                                         makeDefElem(pstrdup(workspace),
-                                                                 (Node *) makeString(pstrdup(startvalue))));
+                                                                                                (Node *) makeString(pstrdup(startvalue)), -1));
                                        state = CS_WAITKEY;
                                }
                                else
@@ -1766,7 +1766,7 @@ deserialize_deflist(Datum txt)
                *wsptr++ = '\0';
                result = lappend(result,
                                                 makeDefElem(pstrdup(workspace),
-                                                                 (Node *) makeString(pstrdup(startvalue))));
+                                                                        (Node *) makeString(pstrdup(startvalue)), -1));
        }
        else if (state != CS_WAITKEY)
                ereport(ERROR,
index 8e7be78f651576aba444d7f6e19afc3e844ae2aa..6cc7106467da6f48334c25ff0790d675888dd9e2 100644 (file)
@@ -111,7 +111,7 @@ static char *domainAddConstraint(Oid domainOid, Oid domainNamespace,
  *             Registers a new base type.
  */
 ObjectAddress
-DefineType(List *names, List *parameters)
+DefineType(ParseState *pstate, List *names, List *parameters)
 {
        char       *typeName;
        Oid                     typeNamespace;
@@ -286,13 +286,15 @@ DefineType(List *names, List *parameters)
                        ereport(WARNING,
                                        (errcode(ERRCODE_SYNTAX_ERROR),
                                         errmsg("type attribute \"%s\" not recognized",
-                                                       defel->defname)));
+                                                       defel->defname),
+                                        parser_errposition(pstate, defel->location)));
                        continue;
                }
                if (*defelp != NULL)
                        ereport(ERROR,
                                        (errcode(ERRCODE_SYNTAX_ERROR),
-                                        errmsg("conflicting or redundant options")));
+                                        errmsg("conflicting or redundant options"),
+                                        parser_errposition(pstate, defel->location)));
                *defelp = defel;
        }
 
index 821dce3ce7b6b342539626493d66822da79c1b04..4027c89b143056c6dafff8234b7d3f70fb65e673 100644 (file)
@@ -69,7 +69,7 @@ have_createrole_privilege(void)
  * CREATE ROLE
  */
 Oid
-CreateRole(CreateRoleStmt *stmt)
+CreateRole(ParseState *pstate, CreateRoleStmt *stmt)
 {
        Relation        pg_authid_rel;
        TupleDesc       pg_authid_dsc;
@@ -136,7 +136,8 @@ CreateRole(CreateRoleStmt *stmt)
                        if (dpassword)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dpassword = defel;
                        if (strcmp(defel->defname, "encryptedPassword") == 0)
                                encrypt_password = true;
@@ -153,7 +154,8 @@ CreateRole(CreateRoleStmt *stmt)
                        if (dissuper)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dissuper = defel;
                }
                else if (strcmp(defel->defname, "inherit") == 0)
@@ -161,7 +163,8 @@ CreateRole(CreateRoleStmt *stmt)
                        if (dinherit)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dinherit = defel;
                }
                else if (strcmp(defel->defname, "createrole") == 0)
@@ -169,7 +172,8 @@ CreateRole(CreateRoleStmt *stmt)
                        if (dcreaterole)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dcreaterole = defel;
                }
                else if (strcmp(defel->defname, "createdb") == 0)
@@ -177,7 +181,8 @@ CreateRole(CreateRoleStmt *stmt)
                        if (dcreatedb)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dcreatedb = defel;
                }
                else if (strcmp(defel->defname, "canlogin") == 0)
@@ -185,7 +190,8 @@ CreateRole(CreateRoleStmt *stmt)
                        if (dcanlogin)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dcanlogin = defel;
                }
                else if (strcmp(defel->defname, "isreplication") == 0)
@@ -193,7 +199,8 @@ CreateRole(CreateRoleStmt *stmt)
                        if (disreplication)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        disreplication = defel;
                }
                else if (strcmp(defel->defname, "connectionlimit") == 0)
@@ -201,7 +208,8 @@ CreateRole(CreateRoleStmt *stmt)
                        if (dconnlimit)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dconnlimit = defel;
                }
                else if (strcmp(defel->defname, "addroleto") == 0)
@@ -209,7 +217,8 @@ CreateRole(CreateRoleStmt *stmt)
                        if (daddroleto)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        daddroleto = defel;
                }
                else if (strcmp(defel->defname, "rolemembers") == 0)
@@ -217,7 +226,8 @@ CreateRole(CreateRoleStmt *stmt)
                        if (drolemembers)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        drolemembers = defel;
                }
                else if (strcmp(defel->defname, "adminmembers") == 0)
@@ -225,7 +235,8 @@ CreateRole(CreateRoleStmt *stmt)
                        if (dadminmembers)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dadminmembers = defel;
                }
                else if (strcmp(defel->defname, "validUntil") == 0)
@@ -233,7 +244,8 @@ CreateRole(CreateRoleStmt *stmt)
                        if (dvalidUntil)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dvalidUntil = defel;
                }
                else if (strcmp(defel->defname, "bypassrls") == 0)
@@ -241,7 +253,8 @@ CreateRole(CreateRoleStmt *stmt)
                        if (dbypassRLS)
                                ereport(ERROR,
                                                (errcode(ERRCODE_SYNTAX_ERROR),
-                                                errmsg("conflicting or redundant options")));
+                                                errmsg("conflicting or redundant options"),
+                                                parser_errposition(pstate, defel->location)));
                        dbypassRLS = defel;
                }
                else
index 085bf3232054dd240bd1a124eaf7cf649ff09a1f..325a81096fb6da84760434049cb84689d51e2ee5 100644 (file)
@@ -434,11 +434,11 @@ DefineView(ViewStmt *stmt, const char *queryString)
        if (stmt->withCheckOption == LOCAL_CHECK_OPTION)
                stmt->options = lappend(stmt->options,
                                                                makeDefElem("check_option",
-                                                                                       (Node *) makeString("local")));
+                                                                                       (Node *) makeString("local"), -1));
        else if (stmt->withCheckOption == CASCADED_CHECK_OPTION)
                stmt->options = lappend(stmt->options,
                                                                makeDefElem("check_option",
-                                                                                       (Node *) makeString("cascaded")));
+                                                                                       (Node *) makeString("cascaded"), -1));
 
        /*
         * Check that the view is auto-updatable if WITH CHECK OPTION was
index 1877fb45e575f10f1d3e6a6587c1ed9c319ffcaa..be2207e3188fdd03b204ec1f5152e8045f98366e 100644 (file)
@@ -2676,6 +2676,7 @@ _copyDefElem(const DefElem *from)
        COPY_STRING_FIELD(defname);
        COPY_NODE_FIELD(arg);
        COPY_SCALAR_FIELD(defaction);
+       COPY_LOCATION_FIELD(location);
 
        return newnode;
 }
index 448e1a9d55a0420a3f41587b63452a770c421dd3..c4ec4077a60771139ac80f86b00bc4da0a2fbb97 100644 (file)
@@ -2424,6 +2424,7 @@ _equalDefElem(const DefElem *a, const DefElem *b)
        COMPARE_STRING_FIELD(defname);
        COMPARE_NODE_FIELD(arg);
        COMPARE_SCALAR_FIELD(defaction);
+       COMPARE_LOCATION_FIELD(location);
 
        return true;
 }
@@ -2434,6 +2435,7 @@ _equalLockingClause(const LockingClause *a, const LockingClause *b)
        COMPARE_NODE_FIELD(lockedRels);
        COMPARE_SCALAR_FIELD(strength);
        COMPARE_SCALAR_FIELD(waitPolicy);
+       COMPARE_LOCATION_FIELD(location);
 
        return true;
 }
index d72a85ee1b16a48faf9c4f5f6788a9986f271df0..20e2dbda797515c92ddd8f09a93ef1ce7b8317f6 100644 (file)
@@ -540,7 +540,7 @@ makeFuncExpr(Oid funcid, Oid rettype, List *args,
  * and no special action.
  */
 DefElem *
-makeDefElem(char *name, Node *arg)
+makeDefElem(char *name, Node *arg, int location)
 {
        DefElem    *res = makeNode(DefElem);
 
@@ -548,6 +548,7 @@ makeDefElem(char *name, Node *arg)
        res->defname = name;
        res->arg = arg;
        res->defaction = DEFELEM_UNSPEC;
+       res->location = location;
 
        return res;
 }
@@ -558,7 +559,7 @@ makeDefElem(char *name, Node *arg)
  */
 DefElem *
 makeDefElemExtended(char *nameSpace, char *name, Node *arg,
-                                       DefElemAction defaction)
+                                       DefElemAction defaction, int location)
 {
        DefElem    *res = makeNode(DefElem);
 
@@ -566,6 +567,7 @@ makeDefElemExtended(char *nameSpace, char *name, Node *arg,
        res->defname = name;
        res->arg = arg;
        res->defaction = defaction;
+       res->location = location;
 
        return res;
 }
index 29b77125848164afe104c3ffd5fcd186d63713cb..90fecb1338d361a6e7acb3b1c7cf44283fbdb35a 100644 (file)
@@ -2542,6 +2542,7 @@ _outDefElem(StringInfo str, const DefElem *node)
        WRITE_STRING_FIELD(defname);
        WRITE_NODE_FIELD(arg);
        WRITE_ENUM_FIELD(defaction, DefElemAction);
+       WRITE_LOCATION_FIELD(location);
 }
 
 static void
index 6f9a81e3e31fb35d41f5d9e04f1325fccd25bc3b..894a48fb4fcd98086f772b56d60f631b53c3b92c 100644 (file)
@@ -1388,6 +1388,7 @@ _readDefElem(void)
        READ_STRING_FIELD(defname);
        READ_NODE_FIELD(arg);
        READ_ENUM_FIELD(defaction, DefElemAction);
+       READ_LOCATION_FIELD(location);
 
        READ_DONE();
 }
index cb5cfc480cffd77a278dd7d6ce27e4e69d39d999..b69a77a588ffbaf34661925643cafe0329973da5 100644 (file)
@@ -928,38 +928,38 @@ AlterOptRoleElem:
                        PASSWORD Sconst
                                {
                                        $$ = makeDefElem("password",
-                                                                        (Node *)makeString($2));
+                                                                        (Node *)makeString($2), @1);
                                }
                        | PASSWORD NULL_P
                                {
-                                       $$ = makeDefElem("password", NULL);
+                                       $$ = makeDefElem("password", NULL, @1);
                                }
                        | ENCRYPTED PASSWORD Sconst
                                {
                                        $$ = makeDefElem("encryptedPassword",
-                                                                        (Node *)makeString($3));
+                                                                        (Node *)makeString($3), @1);
                                }
                        | UNENCRYPTED PASSWORD Sconst
                                {
                                        $$ = makeDefElem("unencryptedPassword",
-                                                                        (Node *)makeString($3));
+                                                                        (Node *)makeString($3), @1);
                                }
                        | INHERIT
                                {
-                                       $$ = makeDefElem("inherit", (Node *)makeInteger(TRUE));
+                                       $$ = makeDefElem("inherit", (Node *)makeInteger(TRUE), @1);
                                }
                        | CONNECTION LIMIT SignedIconst
                                {
-                                       $$ = makeDefElem("connectionlimit", (Node *)makeInteger($3));
+                                       $$ = makeDefElem("connectionlimit", (Node *)makeInteger($3), @1);
                                }
                        | VALID UNTIL Sconst
                                {
-                                       $$ = makeDefElem("validUntil", (Node *)makeString($3));
+                                       $$ = makeDefElem("validUntil", (Node *)makeString($3), @1);
                                }
                /*      Supported but not documented for roles, for use by ALTER GROUP. */
                        | USER role_list
                                {
-                                       $$ = makeDefElem("rolemembers", (Node *)$2);
+                                       $$ = makeDefElem("rolemembers", (Node *)$2, @1);
                                }
                        | IDENT
                                {
@@ -969,36 +969,36 @@ AlterOptRoleElem:
                                         * size of the main parser.
                                         */
                                        if (strcmp($1, "superuser") == 0)
-                                               $$ = makeDefElem("superuser", (Node *)makeInteger(TRUE));
+                                               $$ = makeDefElem("superuser", (Node *)makeInteger(TRUE), @1);
                                        else if (strcmp($1, "nosuperuser") == 0)
-                                               $$ = makeDefElem("superuser", (Node *)makeInteger(FALSE));
+                                               $$ = makeDefElem("superuser", (Node *)makeInteger(FALSE), @1);
                                        else if (strcmp($1, "createrole") == 0)
-                                               $$ = makeDefElem("createrole", (Node *)makeInteger(TRUE));
+                                               $$ = makeDefElem("createrole", (Node *)makeInteger(TRUE), @1);
                                        else if (strcmp($1, "nocreaterole") == 0)
-                                               $$ = makeDefElem("createrole", (Node *)makeInteger(FALSE));
+                                               $$ = makeDefElem("createrole", (Node *)makeInteger(FALSE), @1);
                                        else if (strcmp($1, "replication") == 0)
-                                               $$ = makeDefElem("isreplication", (Node *)makeInteger(TRUE));
+                                               $$ = makeDefElem("isreplication", (Node *)makeInteger(TRUE), @1);
                                        else if (strcmp($1, "noreplication") == 0)
-                                               $$ = makeDefElem("isreplication", (Node *)makeInteger(FALSE));
+                                               $$ = makeDefElem("isreplication", (Node *)makeInteger(FALSE), @1);
                                        else if (strcmp($1, "createdb") == 0)
-                                               $$ = makeDefElem("createdb", (Node *)makeInteger(TRUE));
+                                               $$ = makeDefElem("createdb", (Node *)makeInteger(TRUE), @1);
                                        else if (strcmp($1, "nocreatedb") == 0)
-                                               $$ = makeDefElem("createdb", (Node *)makeInteger(FALSE));
+                                               $$ = makeDefElem("createdb", (Node *)makeInteger(FALSE), @1);
                                        else if (strcmp($1, "login") == 0)
-                                               $$ = makeDefElem("canlogin", (Node *)makeInteger(TRUE));
+                                               $$ = makeDefElem("canlogin", (Node *)makeInteger(TRUE), @1);
                                        else if (strcmp($1, "nologin") == 0)
-                                               $$ = makeDefElem("canlogin", (Node *)makeInteger(FALSE));
+                                               $$ = makeDefElem("canlogin", (Node *)makeInteger(FALSE), @1);
                                        else if (strcmp($1, "bypassrls") == 0)
-                                               $$ = makeDefElem("bypassrls", (Node *)makeInteger(TRUE));
+                                               $$ = makeDefElem("bypassrls", (Node *)makeInteger(TRUE), @1);
                                        else if (strcmp($1, "nobypassrls") == 0)
-                                               $$ = makeDefElem("bypassrls", (Node *)makeInteger(FALSE));
+                                               $$ = makeDefElem("bypassrls", (Node *)makeInteger(FALSE), @1);
                                        else if (strcmp($1, "noinherit") == 0)
                                        {
                                                /*
                                                 * Note that INHERIT is a keyword, so it's handled by main parser, but
                                                 * NOINHERIT is handled here.
                                                 */
-                                               $$ = makeDefElem("inherit", (Node *)makeInteger(FALSE));
+                                               $$ = makeDefElem("inherit", (Node *)makeInteger(FALSE), @1);
                                        }
                                        else
                                                ereport(ERROR,
@@ -1013,23 +1013,23 @@ CreateOptRoleElem:
                        /* The following are not supported by ALTER ROLE/USER/GROUP */
                        | SYSID Iconst
                                {
-                                       $$ = makeDefElem("sysid", (Node *)makeInteger($2));
+                                       $$ = makeDefElem("sysid", (Node *)makeInteger($2), @1);
                                }
                        | ADMIN role_list
                                {
-                                       $$ = makeDefElem("adminmembers", (Node *)$2);
+                                       $$ = makeDefElem("adminmembers", (Node *)$2, @1);
                                }
                        | ROLE role_list
                                {
-                                       $$ = makeDefElem("rolemembers", (Node *)$2);
+                                       $$ = makeDefElem("rolemembers", (Node *)$2, @1);
                                }
                        | IN_P ROLE role_list
                                {
-                                       $$ = makeDefElem("addroleto", (Node *)$3);
+                                       $$ = makeDefElem("addroleto", (Node *)$3, @1);
                                }
                        | IN_P GROUP_P role_list
                                {
-                                       $$ = makeDefElem("addroleto", (Node *)$3);
+                                       $$ = makeDefElem("addroleto", (Node *)$3, @1);
                                }
                ;
 
@@ -1206,7 +1206,7 @@ AlterGroupStmt:
                                        n->role = $3;
                                        n->action = $4;
                                        n->options = list_make1(makeDefElem("rolemembers",
-                                                                                                               (Node *)$6));
+                                                                                                               (Node *)$6, @6));
                                        $$ = (Node *)n;
                                }
                ;
@@ -2446,20 +2446,20 @@ reloption_list:
 reloption_elem:
                        ColLabel '=' def_arg
                                {
-                                       $$ = makeDefElem($1, (Node *) $3);
+                                       $$ = makeDefElem($1, (Node *) $3, @1);
                                }
                        | ColLabel
                                {
-                                       $$ = makeDefElem($1, NULL);
+                                       $$ = makeDefElem($1, NULL, @1);
                                }
                        | ColLabel '.' ColLabel '=' def_arg
                                {
                                        $$ = makeDefElemExtended($1, $3, (Node *) $5,
-                                                                                        DEFELEM_UNSPEC);
+                                                                                        DEFELEM_UNSPEC, @1);
                                }
                        | ColLabel '.' ColLabel
                                {
-                                       $$ = makeDefElemExtended($1, $3, NULL, DEFELEM_UNSPEC);
+                                       $$ = makeDefElemExtended($1, $3, NULL, DEFELEM_UNSPEC, @1);
                                }
                ;
 
@@ -2669,59 +2669,59 @@ copy_opt_list:
 copy_opt_item:
                        BINARY
                                {
-                                       $$ = makeDefElem("format", (Node *)makeString("binary"));
+                                       $$ = makeDefElem("format", (Node *)makeString("binary"), @1);
                                }
                        | OIDS
                                {
-                                       $$ = makeDefElem("oids", (Node *)makeInteger(TRUE));
+                                       $$ = makeDefElem("oids", (Node *)makeInteger(TRUE), @1);
                                }
                        | FREEZE
                                {
-                                       $$ = makeDefElem("freeze", (Node *)makeInteger(TRUE));
+                                       $$ = makeDefElem("freeze", (Node *)makeInteger(TRUE), @1);
                                }
                        | DELIMITER opt_as Sconst
                                {
-                                       $$ = makeDefElem("delimiter", (Node *)makeString($3));
+                                       $$ = makeDefElem("delimiter", (Node *)makeString($3), @1);
                                }
                        | NULL_P opt_as Sconst
                                {
-                                       $$ = makeDefElem("null", (Node *)makeString($3));
+                                       $$ = makeDefElem("null", (Node *)makeString($3), @1);
                                }
                        | CSV
                                {
-                                       $$ = makeDefElem("format", (Node *)makeString("csv"));
+                                       $$ = makeDefElem("format", (Node *)makeString("csv"), @1);
                                }
                        | HEADER_P
                                {
-                                       $$ = makeDefElem("header", (Node *)makeInteger(TRUE));
+                                       $$ = makeDefElem("header", (Node *)makeInteger(TRUE), @1);
                                }
                        | QUOTE opt_as Sconst
                                {
-                                       $$ = makeDefElem("quote", (Node *)makeString($3));
+                                       $$ = makeDefElem("quote", (Node *)makeString($3), @1);
                                }
                        | ESCAPE opt_as Sconst
                                {
-                                       $$ = makeDefElem("escape", (Node *)makeString($3));
+                                       $$ = makeDefElem("escape", (Node *)makeString($3), @1);
                                }
                        | FORCE QUOTE columnList
                                {
-                                       $$ = makeDefElem("force_quote", (Node *)$3);
+                                       $$ = makeDefElem("force_quote", (Node *)$3, @1);
                                }
                        | FORCE QUOTE '*'
                                {
-                                       $$ = makeDefElem("force_quote", (Node *)makeNode(A_Star));
+                                       $$ = makeDefElem("force_quote", (Node *)makeNode(A_Star), @1);
                                }
                        | FORCE NOT NULL_P columnList
                                {
-                                       $$ = makeDefElem("force_not_null", (Node *)$4);
+                                       $$ = makeDefElem("force_not_null", (Node *)$4, @1);
                                }
                        | FORCE NULL_P columnList
                                {
-                                       $$ = makeDefElem("force_null", (Node *)$3);
+                                       $$ = makeDefElem("force_null", (Node *)$3, @1);
                                }
                        | ENCODING Sconst
                                {
-                                       $$ = makeDefElem("encoding", (Node *)makeString($2));
+                                       $$ = makeDefElem("encoding", (Node *)makeString($2), @1);
                                }
                ;
 
@@ -2730,7 +2730,7 @@ copy_opt_item:
 opt_binary:
                        BINARY
                                {
-                                       $$ = makeDefElem("format", (Node *)makeString("binary"));
+                                       $$ = makeDefElem("format", (Node *)makeString("binary"), @1);
                                }
                        | /*EMPTY*/                                                             { $$ = NULL; }
                ;
@@ -2738,7 +2738,7 @@ opt_binary:
 opt_oids:
                        WITH OIDS
                                {
-                                       $$ = makeDefElem("oids", (Node *)makeInteger(TRUE));
+                                       $$ = makeDefElem("oids", (Node *)makeInteger(TRUE), @1);
                                }
                        | /*EMPTY*/                                                             { $$ = NULL; }
                ;
@@ -2746,7 +2746,7 @@ opt_oids:
 copy_delimiter:
                        opt_using DELIMITERS Sconst
                                {
-                                       $$ = makeDefElem("delimiter", (Node *)makeString($3));
+                                       $$ = makeDefElem("delimiter", (Node *)makeString($3), @2);
                                }
                        | /*EMPTY*/                                                             { $$ = NULL; }
                ;
@@ -2771,7 +2771,7 @@ copy_generic_opt_list:
 copy_generic_opt_elem:
                        ColLabel copy_generic_opt_arg
                                {
-                                       $$ = makeDefElem($1, $2);
+                                       $$ = makeDefElem($1, $2, @1);
                                }
                ;
 
@@ -3418,8 +3418,8 @@ OptInherit: INHERITS '(' qualified_name_list ')'  { $$ = $3; }
 /* WITH (options) is preferred, WITH OIDS and WITHOUT OIDS are legacy forms */
 OptWith:
                        WITH reloptions                         { $$ = $2; }
-                       | WITH OIDS                                     { $$ = list_make1(defWithOids(true)); }
-                       | WITHOUT OIDS                          { $$ = list_make1(defWithOids(false)); }
+                       | WITH OIDS                                     { $$ = list_make1(makeDefElem("oids", (Node *) makeInteger(true), @1)); }
+                       | WITHOUT OIDS                          { $$ = list_make1(makeDefElem("oids", (Node *) makeInteger(false), @1)); }
                        | /*EMPTY*/                                     { $$ = NIL; }
                ;
 
@@ -3636,51 +3636,51 @@ SeqOptList: SeqOptElem                                                          { $$ = list_make1($1); }
 
 SeqOptElem: CACHE NumericOnly
                                {
-                                       $$ = makeDefElem("cache", (Node *)$2);
+                                       $$ = makeDefElem("cache", (Node *)$2, @1);
                                }
                        | CYCLE
                                {
-                                       $$ = makeDefElem("cycle", (Node *)makeInteger(TRUE));
+                                       $$ = makeDefElem("cycle", (Node *)makeInteger(TRUE), @1);
                                }
                        | NO CYCLE
                                {
-                                       $$ = makeDefElem("cycle", (Node *)makeInteger(FALSE));
+                                       $$ = makeDefElem("cycle", (Node *)makeInteger(FALSE), @1);
                                }
                        | INCREMENT opt_by NumericOnly
                                {
-                                       $$ = makeDefElem("increment", (Node *)$3);
+                                       $$ = makeDefElem("increment", (Node *)$3, @1);
                                }
                        | MAXVALUE NumericOnly
                                {
-                                       $$ = makeDefElem("maxvalue", (Node *)$2);
+                                       $$ = makeDefElem("maxvalue", (Node *)$2, @1);
                                }
                        | MINVALUE NumericOnly
                                {
-                                       $$ = makeDefElem("minvalue", (Node *)$2);
+                                       $$ = makeDefElem("minvalue", (Node *)$2, @1);
                                }
                        | NO MAXVALUE
                                {
-                                       $$ = makeDefElem("maxvalue", NULL);
+                                       $$ = makeDefElem("maxvalue", NULL, @1);
                                }
                        | NO MINVALUE
                                {
-                                       $$ = makeDefElem("minvalue", NULL);
+                                       $$ = makeDefElem("minvalue", NULL, @1);
                                }
                        | OWNED BY any_name
                                {
-                                       $$ = makeDefElem("owned_by", (Node *)$3);
+                                       $$ = makeDefElem("owned_by", (Node *)$3, @1);
                                }
                        | START opt_with NumericOnly
                                {
-                                       $$ = makeDefElem("start", (Node *)$3);
+                                       $$ = makeDefElem("start", (Node *)$3, @1);
                                }
                        | RESTART
                                {
-                                       $$ = makeDefElem("restart", NULL);
+                                       $$ = makeDefElem("restart", NULL, @1);
                                }
                        | RESTART opt_with NumericOnly
                                {
-                                       $$ = makeDefElem("restart", (Node *)$3);
+                                       $$ = makeDefElem("restart", (Node *)$3, @1);
                                }
                ;
 
@@ -3879,19 +3879,19 @@ create_extension_opt_list:
 create_extension_opt_item:
                        SCHEMA name
                                {
-                                       $$ = makeDefElem("schema", (Node *)makeString($2));
+                                       $$ = makeDefElem("schema", (Node *)makeString($2), @1);
                                }
                        | VERSION_P NonReservedWord_or_Sconst
                                {
-                                       $$ = makeDefElem("new_version", (Node *)makeString($2));
+                                       $$ = makeDefElem("new_version", (Node *)makeString($2), @1);
                                }
                        | FROM NonReservedWord_or_Sconst
                                {
-                                       $$ = makeDefElem("old_version", (Node *)makeString($2));
+                                       $$ = makeDefElem("old_version", (Node *)makeString($2), @1);
                                }
                        | CASCADE
                                {
-                                       $$ = makeDefElem("cascade", (Node *)makeInteger(TRUE));
+                                       $$ = makeDefElem("cascade", (Node *)makeInteger(TRUE), @1);
                                }
                ;
 
@@ -3920,7 +3920,7 @@ alter_extension_opt_list:
 alter_extension_opt_item:
                        TO NonReservedWord_or_Sconst
                                {
-                                       $$ = makeDefElem("new_version", (Node *)makeString($2));
+                                       $$ = makeDefElem("new_version", (Node *)makeString($2), @1);
                                }
                ;
 
@@ -4181,10 +4181,10 @@ CreateFdwStmt: CREATE FOREIGN DATA_P WRAPPER name opt_fdw_options create_generic
                ;
 
 fdw_option:
-                       HANDLER handler_name                            { $$ = makeDefElem("handler", (Node *)$2); }
-                       | NO HANDLER                                            { $$ = makeDefElem("handler", NULL); }
-                       | VALIDATOR handler_name                        { $$ = makeDefElem("validator", (Node *)$2); }
-                       | NO VALIDATOR                                          { $$ = makeDefElem("validator", NULL); }
+                       HANDLER handler_name                            { $$ = makeDefElem("handler", (Node *)$2, @1); }
+                       | NO HANDLER                                            { $$ = makeDefElem("handler", NULL, @1); }
+                       | VALIDATOR handler_name                        { $$ = makeDefElem("validator", (Node *)$2, @1); }
+                       | NO VALIDATOR                                          { $$ = makeDefElem("validator", NULL, @1); }
                ;
 
 fdw_options:
@@ -4303,14 +4303,14 @@ alter_generic_option_elem:
                                }
                        | DROP generic_option_name
                                {
-                                       $$ = makeDefElemExtended(NULL, $2, NULL, DEFELEM_DROP);
+                                       $$ = makeDefElemExtended(NULL, $2, NULL, DEFELEM_DROP, @2);
                                }
                ;
 
 generic_option_elem:
                        generic_option_name generic_option_arg
                                {
-                                       $$ = makeDefElem($1, $2);
+                                       $$ = makeDefElem($1, $2, @1);
                                }
                ;
 
@@ -4982,7 +4982,7 @@ event_trigger_when_list:
 
 event_trigger_when_item:
                ColId IN_P '(' event_trigger_value_list ')'
-                       { $$ = makeDefElem($1, (Node *) $4); }
+                       { $$ = makeDefElem($1, (Node *) $4, @1); }
                ;
 
 event_trigger_value_list:
@@ -5187,7 +5187,7 @@ DefineStmt:
                                        n->kind = OBJECT_COLLATION;
                                        n->args = NIL;
                                        n->defnames = $3;
-                                       n->definition = list_make1(makeDefElem("from", (Node *) $5));
+                                       n->definition = list_make1(makeDefElem("from", (Node *) $5, @5));
                                        $$ = (Node *)n;
                                }
                ;
@@ -5201,11 +5201,11 @@ def_list:       def_elem                                                                { $$ = list_make1($1); }
 
 def_elem:      ColLabel '=' def_arg
                                {
-                                       $$ = makeDefElem($1, (Node *) $3);
+                                       $$ = makeDefElem($1, (Node *) $3, @1);
                                }
                        | ColLabel
                                {
-                                       $$ = makeDefElem($1, NULL);
+                                       $$ = makeDefElem($1, NULL, @1);
                                }
                ;
 
@@ -5231,7 +5231,7 @@ old_aggr_list: old_aggr_elem                                              { $$ = list_make1($1); }
  */
 old_aggr_elem:  IDENT '=' def_arg
                                {
-                                       $$ = makeDefElem($1, (Node *)$3);
+                                       $$ = makeDefElem($1, (Node *)$3, @1);
                                }
                ;
 
@@ -6552,15 +6552,15 @@ DefACLOptionList:
 DefACLOption:
                        IN_P SCHEMA name_list
                                {
-                                       $$ = makeDefElem("schemas", (Node *)$3);
+                                       $$ = makeDefElem("schemas", (Node *)$3, @1);
                                }
                        | FOR ROLE role_list
                                {
-                                       $$ = makeDefElem("roles", (Node *)$3);
+                                       $$ = makeDefElem("roles", (Node *)$3, @1);
                                }
                        | FOR USER role_list
                                {
-                                       $$ = makeDefElem("roles", (Node *)$3);
+                                       $$ = makeDefElem("roles", (Node *)$3, @1);
                                }
                ;
 
@@ -7044,87 +7044,87 @@ createfunc_opt_list:
 common_func_opt_item:
                        CALLED ON NULL_P INPUT_P
                                {
-                                       $$ = makeDefElem("strict", (Node *)makeInteger(FALSE));
+                                       $$ = makeDefElem("strict", (Node *)makeInteger(FALSE), @1);
                                }
                        | RETURNS NULL_P ON NULL_P INPUT_P
                                {
-                                       $$ = makeDefElem("strict", (Node *)makeInteger(TRUE));
+                                       $$ = makeDefElem("strict", (Node *)makeInteger(TRUE), @1);
                                }
                        | STRICT_P
                                {
-                                       $$ = makeDefElem("strict", (Node *)makeInteger(TRUE));
+                                       $$ = makeDefElem("strict", (Node *)makeInteger(TRUE), @1);
                                }
                        | IMMUTABLE
                                {
-                                       $$ = makeDefElem("volatility", (Node *)makeString("immutable"));
+                                       $$ = makeDefElem("volatility", (Node *)makeString("immutable"), @1);
                                }
                        | STABLE
                                {
-                                       $$ = makeDefElem("volatility", (Node *)makeString("stable"));
+                                       $$ = makeDefElem("volatility", (Node *)makeString("stable"), @1);
                                }
                        | VOLATILE
                                {
-                                       $$ = makeDefElem("volatility", (Node *)makeString("volatile"));
+                                       $$ = makeDefElem("volatility", (Node *)makeString("volatile"), @1);
                                }
                        | EXTERNAL SECURITY DEFINER
                                {
-                                       $$ = makeDefElem("security", (Node *)makeInteger(TRUE));
+                                       $$ = makeDefElem("security", (Node *)makeInteger(TRUE), @1);
                                }
                        | EXTERNAL SECURITY INVOKER
                                {
-                                       $$ = makeDefElem("security", (Node *)makeInteger(FALSE));
+                                       $$ = makeDefElem("security", (Node *)makeInteger(FALSE), @1);
                                }
                        | SECURITY DEFINER
                                {
-                                       $$ = makeDefElem("security", (Node *)makeInteger(TRUE));
+                                       $$ = makeDefElem("security", (Node *)makeInteger(TRUE), @1);
                                }
                        | SECURITY INVOKER
                                {
-                                       $$ = makeDefElem("security", (Node *)makeInteger(FALSE));
+                                       $$ = makeDefElem("security", (Node *)makeInteger(FALSE), @1);
                                }
                        | LEAKPROOF
                                {
-                                       $$ = makeDefElem("leakproof", (Node *)makeInteger(TRUE));
+                                       $$ = makeDefElem("leakproof", (Node *)makeInteger(TRUE), @1);
                                }
                        | NOT LEAKPROOF
                                {
-                                       $$ = makeDefElem("leakproof", (Node *)makeInteger(FALSE));
+                                       $$ = makeDefElem("leakproof", (Node *)makeInteger(FALSE), @1);
                                }
                        | COST NumericOnly
                                {
-                                       $$ = makeDefElem("cost", (Node *)$2);
+                                       $$ = makeDefElem("cost", (Node *)$2, @1);
                                }
                        | ROWS NumericOnly
                                {
-                                       $$ = makeDefElem("rows", (Node *)$2);
+                                       $$ = makeDefElem("rows", (Node *)$2, @1);
                                }
                        | FunctionSetResetClause
                                {
                                        /* we abuse the normal content of a DefElem here */
-                                       $$ = makeDefElem("set", (Node *)$1);
+                                       $$ = makeDefElem("set", (Node *)$1, @1);
                                }
                        | PARALLEL ColId
                                {
-                                       $$ = makeDefElem("parallel", (Node *)makeString($2));
+                                       $$ = makeDefElem("parallel", (Node *)makeString($2), @1);
                                }
                ;
 
 createfunc_opt_item:
                        AS func_as
                                {
-                                       $$ = makeDefElem("as", (Node *)$2);
+                                       $$ = makeDefElem("as", (Node *)$2, @1);
                                }
                        | LANGUAGE NonReservedWord_or_Sconst
                                {
-                                       $$ = makeDefElem("language", (Node *)makeString($2));
+                                       $$ = makeDefElem("language", (Node *)makeString($2), @1);
                                }
                        | TRANSFORM transform_type_list
                                {
-                                       $$ = makeDefElem("transform", (Node *)$2);
+                                       $$ = makeDefElem("transform", (Node *)$2, @1);
                                }
                        | WINDOW
                                {
-                                       $$ = makeDefElem("window", (Node *)makeInteger(TRUE));
+                                       $$ = makeDefElem("window", (Node *)makeInteger(TRUE), @1);
                                }
                        | common_func_opt_item
                                {
@@ -7336,11 +7336,11 @@ dostmt_opt_list:
 dostmt_opt_item:
                        Sconst
                                {
-                                       $$ = makeDefElem("as", (Node *)makeString($1));
+                                       $$ = makeDefElem("as", (Node *)makeString($1), @1);
                                }
                        | LANGUAGE NonReservedWord_or_Sconst
                                {
-                                       $$ = makeDefElem("language", (Node *)makeString($2));
+                                       $$ = makeDefElem("language", (Node *)makeString($2), @1);
                                }
                ;
 
@@ -8329,9 +8329,9 @@ operator_def_list:        operator_def_elem                                                               { $$ = list_make1($1); }
                ;
 
 operator_def_elem: ColLabel '=' NONE
-                                               { $$ = makeDefElem($1, NULL); }
+                                               { $$ = makeDefElem($1, NULL, @1); }
                                   | ColLabel '=' def_arg
-                                               { $$ = makeDefElem($1, (Node *) $3); }
+                                          { $$ = makeDefElem($1, (Node *) $3, @1); }
                ;
 
 /*****************************************************************************
@@ -8697,7 +8697,7 @@ TransactionStmt:
                                        TransactionStmt *n = makeNode(TransactionStmt);
                                        n->kind = TRANS_STMT_SAVEPOINT;
                                        n->options = list_make1(makeDefElem("savepoint_name",
-                                                                                                               (Node *)makeString($2)));
+                                                                                                               (Node *)makeString($2), @1));
                                        $$ = (Node *)n;
                                }
                        | RELEASE SAVEPOINT ColId
@@ -8705,7 +8705,7 @@ TransactionStmt:
                                        TransactionStmt *n = makeNode(TransactionStmt);
                                        n->kind = TRANS_STMT_RELEASE;
                                        n->options = list_make1(makeDefElem("savepoint_name",
-                                                                                                               (Node *)makeString($3)));
+                                                                                                               (Node *)makeString($3), @1));
                                        $$ = (Node *)n;
                                }
                        | RELEASE ColId
@@ -8713,7 +8713,7 @@ TransactionStmt:
                                        TransactionStmt *n = makeNode(TransactionStmt);
                                        n->kind = TRANS_STMT_RELEASE;
                                        n->options = list_make1(makeDefElem("savepoint_name",
-                                                                                                               (Node *)makeString($2)));
+                                                                                                               (Node *)makeString($2), @1));
                                        $$ = (Node *)n;
                                }
                        | ROLLBACK opt_transaction TO SAVEPOINT ColId
@@ -8721,7 +8721,7 @@ TransactionStmt:
                                        TransactionStmt *n = makeNode(TransactionStmt);
                                        n->kind = TRANS_STMT_ROLLBACK_TO;
                                        n->options = list_make1(makeDefElem("savepoint_name",
-                                                                                                               (Node *)makeString($5)));
+                                                                                                               (Node *)makeString($5), @1));
                                        $$ = (Node *)n;
                                }
                        | ROLLBACK opt_transaction TO ColId
@@ -8729,7 +8729,7 @@ TransactionStmt:
                                        TransactionStmt *n = makeNode(TransactionStmt);
                                        n->kind = TRANS_STMT_ROLLBACK_TO;
                                        n->options = list_make1(makeDefElem("savepoint_name",
-                                                                                                               (Node *)makeString($4)));
+                                                                                                               (Node *)makeString($4), @1));
                                        $$ = (Node *)n;
                                }
                        | PREPARE TRANSACTION Sconst
@@ -8763,19 +8763,19 @@ opt_transaction:        WORK                                                    {}
 transaction_mode_item:
                        ISOLATION LEVEL iso_level
                                        { $$ = makeDefElem("transaction_isolation",
-                                                                          makeStringConst($3, @3)); }
+                                                                          makeStringConst($3, @3), @1); }
                        | READ ONLY
                                        { $$ = makeDefElem("transaction_read_only",
-                                                                          makeIntConst(TRUE, @1)); }
+                                                                          makeIntConst(TRUE, @1), @1); }
                        | READ WRITE
                                        { $$ = makeDefElem("transaction_read_only",
-                                                                          makeIntConst(FALSE, @1)); }
+                                                                          makeIntConst(FALSE, @1), @1); }
                        | DEFERRABLE
                                        { $$ = makeDefElem("transaction_deferrable",
-                                                                          makeIntConst(TRUE, @1)); }
+                                                                          makeIntConst(TRUE, @1), @1); }
                        | NOT DEFERRABLE
                                        { $$ = makeDefElem("transaction_deferrable",
-                                                                          makeIntConst(FALSE, @1)); }
+                                                                          makeIntConst(FALSE, @1), @1); }
                ;
 
 /* Syntax with commas is SQL-spec, without commas is Postgres historical */
@@ -8919,15 +8919,15 @@ createdb_opt_items:
 createdb_opt_item:
                        createdb_opt_name opt_equal SignedIconst
                                {
-                                       $$ = makeDefElem($1, (Node *)makeInteger($3));
+                                       $$ = makeDefElem($1, (Node *)makeInteger($3), @1);
                                }
                        | createdb_opt_name opt_equal opt_boolean_or_string
                                {
-                                       $$ = makeDefElem($1, (Node *)makeString($3));
+                                       $$ = makeDefElem($1, (Node *)makeString($3), @1);
                                }
                        | createdb_opt_name opt_equal DEFAULT
                                {
-                                       $$ = makeDefElem($1, NULL);
+                                       $$ = makeDefElem($1, NULL, @1);
                                }
                ;
 
@@ -8987,7 +8987,7 @@ AlterDatabaseStmt:
                                        AlterDatabaseStmt *n = makeNode(AlterDatabaseStmt);
                                        n->dbname = $3;
                                        n->options = list_make1(makeDefElem("tablespace",
-                                                                                                       (Node *)makeString($6)));
+                                                                                                               (Node *)makeString($6), @6));
                                        $$ = (Node *)n;
                                 }
                ;
@@ -9451,17 +9451,17 @@ ExplainStmt:
                                {
                                        ExplainStmt *n = makeNode(ExplainStmt);
                                        n->query = $4;
-                                       n->options = list_make1(makeDefElem("analyze", NULL));
+                                       n->options = list_make1(makeDefElem("analyze", NULL, @2));
                                        if ($3)
                                                n->options = lappend(n->options,
-                                                                                        makeDefElem("verbose", NULL));
+                                                                                        makeDefElem("verbose", NULL, @3));
                                        $$ = (Node *) n;
                                }
                | EXPLAIN VERBOSE ExplainableStmt
                                {
                                        ExplainStmt *n = makeNode(ExplainStmt);
                                        n->query = $3;
-                                       n->options = list_make1(makeDefElem("verbose", NULL));
+                                       n->options = list_make1(makeDefElem("verbose", NULL, @2));
                                        $$ = (Node *) n;
                                }
                | EXPLAIN '(' explain_option_list ')' ExplainableStmt
@@ -9499,7 +9499,7 @@ explain_option_list:
 explain_option_elem:
                        explain_option_name explain_option_arg
                                {
-                                       $$ = makeDefElem($1, $2);
+                                       $$ = makeDefElem($1, $2, @1);
                                }
                ;
 
index e98fad051e4e915679a25e4815c4d385a4c7b159..7a2950e6a92ccd77e141deddc5f17f29317f3f0b 100644 (file)
@@ -294,7 +294,8 @@ transformCreateStmt(CreateStmt *stmt, const char *queryString)
                 * overridden if an inherited table has oids.
                 */
                stmt->options = lcons(makeDefElem("oids",
-                                                 (Node *) makeInteger(cxt.hasoids)), stmt->options);
+                                                                                 (Node *) makeInteger(cxt.hasoids), -1),
+                                                         stmt->options);
        }
 
        foreach(elements, stmt->tableElts)
@@ -482,7 +483,7 @@ transformColumnDefinition(CreateStmtContext *cxt, ColumnDef *column)
                                                                 makeString(cxt->relation->relname),
                                                                 makeString(column->colname));
                altseqstmt->options = list_make1(makeDefElem("owned_by",
-                                                                                                        (Node *) attnamelist));
+                                                                                                        (Node *) attnamelist, -1));
 
                cxt->alist = lappend(cxt->alist, altseqstmt);
 
index 9c7be2dc7b69e068b8b2c66e7625dd7dabf897ef..318726ebf38294fab6c91fe766b20c041110879b 100644 (file)
@@ -225,7 +225,7 @@ pg_logical_slot_get_changes_guts(FunctionCallInfo fcinfo, bool confirm, bool bin
                        char       *name = TextDatumGetCString(datum_opts[i]);
                        char       *opt = TextDatumGetCString(datum_opts[i + 1]);
 
-                       options = lappend(options, makeDefElem(name, (Node *) makeString(opt)));
+                       options = lappend(options, makeDefElem(name, (Node *) makeString(opt), -1));
                }
        }
 
index d93db88d42bb0520edc2ece9f9a651e9ecf4d4ff..fd0fa6dde08631ac92a52ab34ccdf10d898e31c5 100644 (file)
@@ -148,37 +148,37 @@ base_backup_opt:
                        K_LABEL SCONST
                                {
                                  $$ = makeDefElem("label",
-                                                                  (Node *)makeString($2));
+                                                                  (Node *)makeString($2), -1);
                                }
                        | K_PROGRESS
                                {
                                  $$ = makeDefElem("progress",
-                                                                  (Node *)makeInteger(TRUE));
+                                                                  (Node *)makeInteger(TRUE), -1);
                                }
                        | K_FAST
                                {
                                  $$ = makeDefElem("fast",
-                                                                  (Node *)makeInteger(TRUE));
+                                                                  (Node *)makeInteger(TRUE), -1);
                                }
                        | K_WAL
                                {
                                  $$ = makeDefElem("wal",
-                                                                  (Node *)makeInteger(TRUE));
+                                                                  (Node *)makeInteger(TRUE), -1);
                                }
                        | K_NOWAIT
                                {
                                  $$ = makeDefElem("nowait",
-                                                                  (Node *)makeInteger(TRUE));
+                                                                  (Node *)makeInteger(TRUE), -1);
                                }
                        | K_MAX_RATE UCONST
                                {
                                  $$ = makeDefElem("max_rate",
-                                                                  (Node *)makeInteger($2));
+                                                                  (Node *)makeInteger($2), -1);
                                }
                        | K_TABLESPACE_MAP
                                {
                                  $$ = makeDefElem("tablespace_map",
-                                                                  (Node *)makeInteger(TRUE));
+                                                                  (Node *)makeInteger(TRUE), -1);
                                }
                        ;
 
@@ -315,7 +315,7 @@ plugin_opt_list:
 plugin_opt_elem:
                        IDENT plugin_opt_arg
                                {
-                                       $$ = makeDefElem($1, $2);
+                                       $$ = makeDefElem($1, $2, -1);
                                }
                ;
 
index ac64135d5df95dcabf7ebc90b0bb75e4139126f9..f50ce408ae6dc47ec9689fd32c73daa0dafae315 100644 (file)
@@ -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;
index d1e5e0ad84768a50da68cadb00c23f32f02b6993..073314e76d3b393c2dd9096e94e3a980fe42d5b3 100644 (file)
@@ -18,7 +18,7 @@
 #include "catalog/objectaddress.h"
 #include "nodes/parsenodes.h"
 
-extern ObjectAddress DefineCollation(List *names, List *parameters);
+extern ObjectAddress DefineCollation(ParseState *pstate, List *names, List *parameters);
 extern void IsThereCollationInNamespace(const char *collname, Oid nspOid);
 
 #endif   /* COLLATIONCMDS_H */
index 314d1f7e27977aabb2b45364ba2ea3a91aea2ffb..65eb347b3f24f5efbd835b1cbfac716919147adb 100644 (file)
 
 #include "nodes/execnodes.h"
 #include "nodes/parsenodes.h"
+#include "parser/parse_node.h"
 #include "tcop/dest.h"
 
 /* CopyStateData is private in commands/copy.c */
 typedef struct CopyStateData *CopyState;
 
-extern Oid DoCopy(const CopyStmt *stmt, const char *queryString,
+extern Oid DoCopy(ParseState *state, const CopyStmt *stmt,
           uint64 *processed);
 
-extern void ProcessCopyOptions(CopyState cstate, bool is_from, List *options);
-extern CopyState BeginCopyFrom(Relation rel, const char *filename,
+extern void ProcessCopyOptions(ParseState *pstate, CopyState cstate, bool is_from, List *options);
+extern CopyState BeginCopyFrom(ParseState *pstate, Relation rel, const char *filename,
                          bool is_program, List *attnamelist, List *options);
 extern void EndCopyFrom(CopyState cstate);
 extern bool NextCopyFrom(CopyState cstate, ExprContext *econtext,
index b6436f18124f11a5c99326604ec8657dccbd7826..9bea085e1fb263e8150b871c8ff20e83265ce534 100644 (file)
 #include "lib/stringinfo.h"
 #include "nodes/parsenodes.h"
 
-extern Oid     createdb(const CreatedbStmt *stmt);
+extern Oid     createdb(ParseState *pstate, const CreatedbStmt *stmt);
 extern void dropdb(const char *dbname, bool missing_ok);
 extern ObjectAddress RenameDatabase(const char *oldname, const char *newname);
-extern Oid     AlterDatabase(AlterDatabaseStmt *stmt, bool isTopLevel);
+extern Oid     AlterDatabase(ParseState *pstate, AlterDatabaseStmt *stmt, bool isTopLevel);
 extern Oid     AlterDatabaseSet(AlterDatabaseSetStmt *stmt);
 extern ObjectAddress AlterDatabaseOwner(const char *dbname, Oid newOwnerId);
 
index b064eb4836a74b57cd7a07a26738781b09285762..2b894ff262f8d901fee46f5fe7b2a384f1854c6a 100644 (file)
@@ -44,11 +44,11 @@ extern bool CheckIndexCompatible(Oid oldId,
 extern Oid     GetDefaultOpClass(Oid type_id, Oid am_id);
 
 /* commands/functioncmds.c */
-extern ObjectAddress CreateFunction(CreateFunctionStmt *stmt, const char *queryString);
+extern ObjectAddress CreateFunction(ParseState *pstate, CreateFunctionStmt *stmt);
 extern void RemoveFunctionById(Oid funcOid);
 extern void SetFunctionReturnType(Oid funcOid, Oid newRetType);
 extern void SetFunctionArgType(Oid funcOid, int argIndex, Oid newArgType);
-extern ObjectAddress AlterFunction(AlterFunctionStmt *stmt);
+extern ObjectAddress AlterFunction(ParseState *pstate, AlterFunctionStmt *stmt);
 extern ObjectAddress CreateCast(CreateCastStmt *stmt);
 extern void DropCastById(Oid castOid);
 extern ObjectAddress CreateTransform(CreateTransformStmt *stmt);
@@ -58,10 +58,10 @@ extern void IsThereFunctionInNamespace(const char *proname, int pronargs,
 extern void ExecuteDoStmt(DoStmt *stmt);
 extern Oid     get_cast_oid(Oid sourcetypeid, Oid targettypeid, bool missing_ok);
 extern Oid     get_transform_oid(Oid type_id, Oid lang_id, bool missing_ok);
-extern void interpret_function_parameter_list(List *parameters,
+extern void interpret_function_parameter_list(ParseState *pstate,
+                                                                 List *parameters,
                                                                  Oid languageOid,
                                                                  bool is_aggregate,
-                                                                 const char *queryString,
                                                                  oidvector **parameterTypes,
                                                                  ArrayType **allParameterTypes,
                                                                  ArrayType **parameterModes,
@@ -76,8 +76,8 @@ extern void RemoveOperatorById(Oid operOid);
 extern ObjectAddress AlterOperator(AlterOperatorStmt *stmt);
 
 /* commands/aggregatecmds.c */
-extern ObjectAddress DefineAggregate(List *name, List *args, bool oldstyle,
-                               List *parameters, const char *queryString);
+extern ObjectAddress DefineAggregate(ParseState *pstate, List *name, List *args, bool oldstyle,
+                               List *parameters);
 
 /* commands/opclasscmds.c */
 extern ObjectAddress DefineOpClass(CreateOpClassStmt *stmt);
@@ -152,6 +152,5 @@ extern int64 defGetInt64(DefElem *def);
 extern List *defGetQualifiedName(DefElem *def);
 extern TypeName *defGetTypeName(DefElem *def);
 extern int     defGetTypeLength(DefElem *def);
-extern DefElem *defWithOids(bool value);
 
 #endif   /* DEFREM_H */
index 3d0a5abbc2ff5e452668094aadfdc15f1cadf9a1..8b3acab0f25186a3bd60fca0e3cac71b5672c190 100644 (file)
@@ -15,6 +15,7 @@
 
 #include "executor/executor.h"
 #include "lib/stringinfo.h"
+#include "parser/parse_node.h"
 
 typedef enum ExplainFormat
 {
@@ -59,7 +60,7 @@ typedef const char *(*explain_get_index_name_hook_type) (Oid indexId);
 extern PGDLLIMPORT explain_get_index_name_hook_type explain_get_index_name_hook;
 
 
-extern void ExplainQuery(ExplainStmt *stmt, const char *queryString,
+extern void ExplainQuery(ParseState *pstate, ExplainStmt *stmt, const char *queryString,
                         ParamListInfo params, DestReceiver *dest);
 
 extern ExplainState *NewExplainState(void);
index 94354ab04d2062b641de893f3c73a6f88f9c72ce..e98b245ac118e268778b31138f2b01e6a858f363 100644 (file)
@@ -28,7 +28,7 @@ extern PGDLLIMPORT bool creating_extension;
 extern Oid     CurrentExtensionObject;
 
 
-extern ObjectAddress CreateExtension(CreateExtensionStmt *stmt);
+extern ObjectAddress CreateExtension(ParseState *pstate, CreateExtensionStmt *stmt);
 
 extern void RemoveExtensionById(Oid extId);
 
@@ -37,7 +37,7 @@ extern ObjectAddress InsertExtensionTuple(const char *extName, Oid extOwner,
                                         Datum extConfig, Datum extCondition,
                                         List *requiredExtensions);
 
-extern ObjectAddress ExecAlterExtensionStmt(AlterExtensionStmt *stmt);
+extern ObjectAddress ExecAlterExtensionStmt(ParseState *pstate, AlterExtensionStmt *stmt);
 
 extern ObjectAddress ExecAlterExtensionContentsStmt(AlterExtensionContentsStmt *stmt,
                                                           ObjectAddress *objAddress);
index 6af60d893bbd0bb00d83501e77553b9faf163d5d..392a6265082ab36ef636397e3783d1e621796221 100644 (file)
@@ -18,6 +18,7 @@
 #include "fmgr.h"
 #include "lib/stringinfo.h"
 #include "nodes/parsenodes.h"
+#include "parser/parse_node.h"
 #include "storage/relfilenode.h"
 
 
@@ -73,8 +74,8 @@ extern Datum lastval(PG_FUNCTION_ARGS);
 
 extern Datum pg_sequence_parameters(PG_FUNCTION_ARGS);
 
-extern ObjectAddress DefineSequence(CreateSeqStmt *stmt);
-extern ObjectAddress AlterSequence(AlterSeqStmt *stmt);
+extern ObjectAddress DefineSequence(ParseState *pstate, CreateSeqStmt *stmt);
+extern ObjectAddress AlterSequence(ParseState *pstate, AlterSeqStmt *stmt);
 extern void ResetSequence(Oid seq_relid);
 extern void ResetSequenceCaches(void);
 
index 847b770f00c615739efd80cedb032a91b185f173..56b4cecd289edc6bbcd85a43373fb759b234c3fb 100644 (file)
@@ -21,7 +21,7 @@
 
 #define DEFAULT_TYPDELIM               ','
 
-extern ObjectAddress DefineType(List *names, List *parameters);
+extern ObjectAddress DefineType(ParseState *pstate, List *names, List *parameters);
 extern void RemoveTypeById(Oid typeOid);
 extern ObjectAddress DefineDomain(CreateDomainStmt *stmt);
 extern ObjectAddress DefineEnum(CreateEnumStmt *stmt);
index d35cb0c90deff570fc15da57c1ed6f43728deb2b..1f0cfcc86f9512c33d9b30a7117df9a5e67b5b91 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "catalog/objectaddress.h"
 #include "nodes/parsenodes.h"
+#include "parser/parse_node.h"
 
 
 /* Hook to check passwords in CreateRole() and AlterRole() */
@@ -23,7 +24,7 @@ typedef void (*check_password_hook_type) (const char *username, const char *pass
 
 extern PGDLLIMPORT check_password_hook_type check_password_hook;
 
-extern Oid     CreateRole(CreateRoleStmt *stmt);
+extern Oid     CreateRole(ParseState *pstate, CreateRoleStmt *stmt);
 extern Oid     AlterRole(AlterRoleStmt *stmt);
 extern Oid     AlterRoleSet(AlterRoleSetStmt *stmt);
 extern void DropRole(DropRoleStmt *stmt);
index 01c5cb45d531604a6bc6408c12f16ae084390938..47500cb44ba5ee7da4fe7ffbb74da762108642ae 100644 (file)
@@ -80,9 +80,9 @@ extern FuncExpr *makeFuncExpr(Oid funcid, Oid rettype, List *args,
 
 extern FuncCall *makeFuncCall(List *name, List *args, int location);
 
-extern DefElem *makeDefElem(char *name, Node *arg);
+extern DefElem *makeDefElem(char *name, Node *arg, int location);
 extern DefElem *makeDefElemExtended(char *nameSpace, char *name, Node *arg,
-                                       DefElemAction defaction);
+                                                                       DefElemAction defaction, int location);
 
 extern GroupingSet *makeGroupingSet(GroupingSetKind kind, List *content, int location);
 
index 1481fff57de9169b72b9704e8e106e0f8aeb3680..3716c2eef961d668c24fd827a19e2adb522038fb 100644 (file)
@@ -666,6 +666,7 @@ typedef struct DefElem
        char       *defname;
        Node       *arg;                        /* a (Value *) or a (TypeName *) */
        DefElemAction defaction;        /* unspecified action, or SET/ADD/DROP */
+       int                     location;               /* token location, or -1 if unknown */
 } DefElem;
 
 /*
index 4cc49f0c0c257167da99d8cb992d347ab7259c16..fda75bb6180297fa9eee9fdcb51782da6e7e63ee 100644 (file)
@@ -26,6 +26,7 @@
 
 #include "access/htup.h"
 #include "nodes/parsenodes.h"
+#include "parser/parse_node.h"
 #include "utils/array.h"
 #include "utils/snapshot.h"
 
@@ -259,7 +260,7 @@ extern Datum aclexplode(PG_FUNCTION_ARGS);
  * prototypes for functions in aclchk.c
  */
 extern void ExecuteGrantStmt(GrantStmt *stmt);
-extern void ExecAlterDefaultPrivilegesStmt(AlterDefaultPrivilegesStmt *stmt);
+extern void ExecAlterDefaultPrivilegesStmt(ParseState *pstate, AlterDefaultPrivilegesStmt *stmt);
 
 extern void RemoveRoleFromObjectACL(Oid roleid, Oid classid, Oid objid);
 extern void RemoveDefaultACLById(Oid defaclOid);