Add location field to DefElem
authorPeter Eisentraut
Tue, 6 Sep 2016 16:00:00 +0000 (12:00 -0400)
committerPeter Eisentraut
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
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,
                                          ¶meterTypes,
                                          &allParameterTypes,
                                          ¶meterModes,
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 .
  */
 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,
                                      ¶meterTypes,
                                      &allParameterTypes,
                                      ¶meterModes,
@@ -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);