From: Robert Haas Date: Sun, 13 Jun 2010 17:43:13 +0000 (+0000) Subject: Fix ALTER LARGE OBJECT and GRANT ... ON LARGE OBJECT for large OIDs. X-Git-Tag: REL9_0_BETA3~121 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=26b7abfa32b657e21911e82b38eeb8fc81c9dc77;p=postgresql Fix ALTER LARGE OBJECT and GRANT ... ON LARGE OBJECT for large OIDs. The previous coding failed for OIDs too large to be represented by a signed integer. --- diff --git a/src/backend/catalog/aclchk.c b/src/backend/catalog/aclchk.c index 025898d1a5..d0168e7dcd 100644 --- a/src/backend/catalog/aclchk.c +++ b/src/backend/catalog/aclchk.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/catalog/aclchk.c,v 1.166 2010/04/05 01:58:03 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/catalog/aclchk.c,v 1.167 2010/06/13 17:43:12 rhaas Exp $ * * NOTES * See acl.h. @@ -47,6 +47,7 @@ #include "miscadmin.h" #include "parser/parse_func.h" #include "utils/acl.h" +#include "utils/builtins.h" #include "utils/fmgroids.h" #include "utils/lsyscache.h" #include "utils/rel.h" @@ -647,7 +648,7 @@ objectNamesToOids(GrantObjectType objtype, List *objnames) case ACL_OBJECT_LARGEOBJECT: foreach(cell, objnames) { - Oid lobjOid = intVal(lfirst(cell)); + Oid lobjOid = oidparse(lfirst(cell)); if (!LargeObjectExists(lobjOid)) ereport(ERROR, diff --git a/src/backend/commands/alter.c b/src/backend/commands/alter.c index 26a28d55a7..cecdfa5c6d 100644 --- a/src/backend/commands/alter.c +++ b/src/backend/commands/alter.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/alter.c,v 1.35 2010/02/26 02:00:37 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/alter.c,v 1.36 2010/06/13 17:43:12 rhaas Exp $ * *------------------------------------------------------------------------- */ @@ -31,6 +31,7 @@ #include "parser/parse_clause.h" #include "tcop/utility.h" #include "utils/acl.h" +#include "utils/builtins.h" #include "utils/lsyscache.h" @@ -235,7 +236,7 @@ ExecAlterOwnerStmt(AlterOwnerStmt *stmt) break; case OBJECT_LARGEOBJECT: - LargeObjectAlterOwner(intVal(linitial(stmt->object)), newowner); + LargeObjectAlterOwner(oidparse(linitial(stmt->object)), newowner); break; case OBJECT_OPERATOR: diff --git a/src/backend/commands/comment.c b/src/backend/commands/comment.c index 2cf8aff6ae..7fa09c8d2a 100644 --- a/src/backend/commands/comment.c +++ b/src/backend/commands/comment.c @@ -7,7 +7,7 @@ * Copyright (c) 1996-2010, PostgreSQL Global Development Group * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/comment.c,v 1.114 2010/02/26 02:00:38 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/comment.c,v 1.115 2010/06/13 17:43:12 rhaas Exp $ * *------------------------------------------------------------------------- */ @@ -1404,32 +1404,9 @@ static void CommentLargeObject(List *qualname, char *comment) { Oid loid; - Node *node; Assert(list_length(qualname) == 1); - node = (Node *) linitial(qualname); - - switch (nodeTag(node)) - { - case T_Integer: - loid = intVal(node); - break; - case T_Float: - - /* - * Values too large for int4 will be represented as Float - * constants by the lexer. Accept these if they are valid OID - * strings. - */ - loid = DatumGetObjectId(DirectFunctionCall1(oidin, - CStringGetDatum(strVal(node)))); - break; - default: - elog(ERROR, "unrecognized node type: %d", - (int) nodeTag(node)); - /* keep compiler quiet */ - loid = InvalidOid; - } + loid = oidparse((Node *) linitial(qualname)); /* check that the large object exists */ if (!LargeObjectExists(loid)) diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index c75bc825a8..122213a134 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -11,7 +11,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.712 2010/05/30 18:10:40 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/parser/gram.y,v 2.713 2010/06/13 17:43:12 rhaas Exp $ * * HISTORY * AUTHOR DATE MAJOR EVENT @@ -365,6 +365,7 @@ static TypeName *TableFuncTypeName(List *columns); %type OptCreateAs CreateAsList %type CreateAsElement ctext_expr %type NumericOnly +%type NumericOnly_list %type alias_clause %type sortby %type index_elem @@ -399,7 +400,6 @@ static TypeName *TableFuncTypeName(List *columns); %type opt_varying opt_timezone %type Iconst SignedIconst -%type Iconst_list %type Sconst comment_text notify_payload %type RoleId opt_granted_by opt_boolean ColId_or_Sconst %type var_list @@ -2879,6 +2879,10 @@ NumericOnly: | SignedIconst { $$ = makeInteger($1); } ; +NumericOnly_list: NumericOnly { $$ = list_make1($1); } + | NumericOnly_list ',' NumericOnly { $$ = lappend($1, $3); } + ; + /***************************************************************************** * * QUERIES : @@ -4634,7 +4638,7 @@ privilege_target: n->objs = $2; $$ = n; } - | LARGE_P OBJECT_P Iconst_list + | LARGE_P OBJECT_P NumericOnly_list { PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget)); n->targtype = ACL_TARGET_OBJECT; @@ -5929,11 +5933,11 @@ AlterOwnerStmt: ALTER AGGREGATE func_name aggr_args OWNER TO RoleId n->newowner = $7; $$ = (Node *)n; } - | ALTER LARGE_P OBJECT_P Iconst OWNER TO RoleId + | ALTER LARGE_P OBJECT_P NumericOnly OWNER TO RoleId { AlterOwnerStmt *n = makeNode(AlterOwnerStmt); n->objectType = OBJECT_LARGEOBJECT; - n->object = list_make1(makeInteger($4)); + n->object = list_make1($4); n->newowner = $7; $$ = (Node *)n; } @@ -10755,10 +10759,6 @@ SignedIconst: Iconst { $$ = $1; } | '-' Iconst { $$ = - $2; } ; -Iconst_list: Iconst { $$ = list_make1(makeInteger($1)); } - | Iconst_list ',' Iconst { $$ = lappend($1, makeInteger($3)); } - ; - /* * Name classification hierarchy. * diff --git a/src/backend/utils/adt/oid.c b/src/backend/utils/adt/oid.c index 6f59fc5be1..ba86625e27 100644 --- a/src/backend/utils/adt/oid.c +++ b/src/backend/utils/adt/oid.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/oid.c,v 1.76 2010/01/02 16:57:54 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/oid.c,v 1.77 2010/06/13 17:43:13 rhaas Exp $ * *------------------------------------------------------------------------- */ @@ -303,6 +303,28 @@ oidvectorsend(PG_FUNCTION_ARGS) return array_send(fcinfo); } +/* + * oidparse - get OID from IConst/FConst node + */ +Oid +oidparse(Node *node) +{ + switch (nodeTag(node)) + { + case T_Integer: + return intVal(node); + case T_Float: + /* + * Values too large for int4 will be represented as Float constants + * by the lexer. Accept these if they are valid OID strings. + */ + return oidin_subr(strVal(node), NULL); + default: + elog(ERROR, "unrecognized node type: %d", (int) nodeTag(node)); + } + return InvalidOid; /* keep compiler quiet */ +} + /***************************************************************************** * PUBLIC ROUTINES * diff --git a/src/include/utils/builtins.h b/src/include/utils/builtins.h index e7edc5717f..1fc36d7406 100644 --- a/src/include/utils/builtins.h +++ b/src/include/utils/builtins.h @@ -7,7 +7,7 @@ * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group * Portions Copyright (c) 1994, Regents of the University of California * - * $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.348 2010/02/26 02:01:28 momjian Exp $ + * $PostgreSQL: pgsql/src/include/utils/builtins.h,v 1.349 2010/06/13 17:43:13 rhaas Exp $ * *------------------------------------------------------------------------- */ @@ -479,6 +479,7 @@ extern Datum oidvectorle(PG_FUNCTION_ARGS); extern Datum oidvectorge(PG_FUNCTION_ARGS); extern Datum oidvectorgt(PG_FUNCTION_ARGS); extern oidvector *buildoidvector(const Oid *oids, int n); +extern Oid oidparse(Node *node); /* pseudotypes.c */ extern Datum cstring_in(PG_FUNCTION_ARGS);