diff --git a/src/backend/catalog/aclchk.c b/src/backend/catalog/aclchk.c
index 029ecda..2b2c326 100644
--- a/src/backend/catalog/aclchk.c
+++ b/src/backend/catalog/aclchk.c
@@ -49,6 +49,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"
@@ -636,7 +637,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 ba90b60..4896d0b 100644
--- a/src/backend/commands/alter.c
+++ b/src/backend/commands/alter.c
@@ -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 7bd68d5..9321375 100644
--- a/src/backend/commands/comment.c
+++ b/src/backend/commands/comment.c
@@ -1208,32 +1208,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 4df4770..3f6eeeb 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -365,6 +365,7 @@ static TypeName *TableFuncTypeName(List *columns);
 %type <list>	OptCreateAs CreateAsList
 %type <node>	CreateAsElement ctext_expr
 %type <value>	NumericOnly
+%type <list>	NumericOnly_list
 %type <alias>	alias_clause
 %type <sortby>	sortby
 %type <ielem>	index_elem
@@ -399,7 +400,6 @@ static TypeName *TableFuncTypeName(List *columns);
 %type <boolean> opt_varying opt_timezone
 
 %type <ival>	Iconst SignedIconst
-%type <list>	Iconst_list
 %type <str>		Sconst comment_text notify_payload
 %type <str>		RoleId opt_granted_by opt_boolean ColId_or_Sconst
 %type <list>	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 64f4618..ab0d557 100644
--- a/src/backend/utils/adt/oid.c
+++ b/src/backend/utils/adt/oid.c
@@ -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 e8f38a6..ed64ebc 100644
--- a/src/include/utils/builtins.h
+++ b/src/include/utils/builtins.h
@@ -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);