Hi all,
The attached patch is reworked from a previous one [1] to better deal with
get_object_address and pg_get_object_address.
Regards,
[1] https://www.postgresql.org/message-id/[email protected]
--
Fabrízio de Royes Mello
Consultoria/Coaching PostgreSQL
>> Timbira: http://www.timbira.com.br
>> Blog: http://fabriziomello.github.io
>> Linkedin: http://br.linkedin.com/in/fabriziomello
>> Twitter: http://twitter.com/fabriziomello
>> Github: http://github.com/fabriziomello
diff --git a/doc/src/sgml/ref/comment.sgml b/doc/src/sgml/ref/comment.sgml
index c1cf587..51b39ab 100644
--- a/doc/src/sgml/ref/comment.sgml
+++ b/doc/src/sgml/ref/comment.sgml
@@ -31,6 +31,7 @@ COMMENT ON
CONSTRAINT <replaceable class="PARAMETER">constraint_name</replaceable> ON <replaceable class="PARAMETER">table_name</replaceable> |
CONSTRAINT <replaceable class="PARAMETER">constraint_name</replaceable> ON DOMAIN <replaceable class="PARAMETER">domain_name</replaceable> |
CONVERSION <replaceable class="PARAMETER">object_name</replaceable> |
+ CURRENT DATABASE |
DATABASE <replaceable class="PARAMETER">object_name</replaceable> |
DOMAIN <replaceable class="PARAMETER">object_name</replaceable> |
EXTENSION <replaceable class="PARAMETER">object_name</replaceable> |
@@ -96,6 +97,11 @@ COMMENT ON
</para>
<para>
+ The CURRENT DATABASE means the comment will be applied to the database
+ where the command is executed.
+ </para>
+
+ <para>
Comments can be viewed using <application>psql</application>'s
<command>\d</command> family of commands.
Other user interfaces to retrieve comments can be built atop
@@ -307,6 +313,7 @@ COMMENT ON COLUMN my_table.my_column IS 'Employee ID number';
COMMENT ON CONVERSION my_conv IS 'Conversion to UTF8';
COMMENT ON CONSTRAINT bar_col_cons ON bar IS 'Constrains column col';
COMMENT ON CONSTRAINT dom_col_constr ON DOMAIN dom IS 'Constrains col of domain';
+COMMENT ON CURRENT DATABASE IS 'Current Database Comment';
COMMENT ON DATABASE my_database IS 'Development Database';
COMMENT ON DOMAIN my_domain IS 'Email Address Domain';
COMMENT ON EXTENSION hstore IS 'implements the hstore data type';
diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c
index bb4b080..71bffae 100644
--- a/src/backend/catalog/objectaddress.c
+++ b/src/backend/catalog/objectaddress.c
@@ -621,6 +621,9 @@ static const struct object_type_map
{
"database", OBJECT_DATABASE
},
+ {
+ "current database", OBJECT_DATABASE
+ },
/* OCLASS_TBLSPACE */
{
"tablespace", OBJECT_TABLESPACE
@@ -1053,9 +1056,12 @@ get_object_address_unqualified(ObjectType objtype,
/*
* The types of names handled by this function are not permitted to be
- * schema-qualified or catalog-qualified.
+ * schema-qualified or catalog-qualified.
+ *
+ * If "CURRENT DATABASE" is used the target object name is NIL so we
+ * don't need to do this check.
*/
- if (list_length(qualname) != 1)
+ if (list_length(qualname) > 1)
{
const char *msg;
@@ -1101,7 +1107,10 @@ get_object_address_unqualified(ObjectType objtype,
}
/* Format is valid, extract the actual name. */
- name = strVal(linitial(qualname));
+ if (list_length(qualname) > 0)
+ name = strVal(linitial(qualname));
+ else
+ name = NULL;
/* Translate name to OID. */
switch (objtype)
@@ -1113,7 +1122,10 @@ get_object_address_unqualified(ObjectType objtype,
break;
case OBJECT_DATABASE:
address.classId = DatabaseRelationId;
- address.objectId = get_database_oid(name, missing_ok);
+ if (name != NULL)
+ address.objectId = get_database_oid(name, missing_ok);
+ else
+ address.objectId = MyDatabaseId;
address.objectSubId = 0;
break;
case OBJECT_EXTENSION:
@@ -1951,7 +1963,7 @@ pg_get_object_address(PG_FUNCTION_ARGS)
else
{
name = textarray_to_strvaluelist(namearr);
- if (list_length(name) < 1)
+ if (list_length(name) < 1 && type != OBJECT_DATABASE)
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("name list length must be at least %d", 1)));
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 08cf5b7..b87aa5a 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -6101,7 +6101,7 @@ opt_restart_seqs:
* the object associated with the comment. The form of the statement is:
*
* COMMENT ON [ [ ACCESS METHOD | CONVERSION | COLLATION |
- * DATABASE | DOMAIN |
+ * DATABASE | CURRENT DATABASE | DOMAIN |
* EXTENSION | EVENT TRIGGER | FOREIGN DATA WRAPPER |
* FOREIGN TABLE | INDEX | [PROCEDURAL] LANGUAGE |
* MATERIALIZED VIEW | POLICY | ROLE | SCHEMA | SEQUENCE |
@@ -6135,6 +6135,15 @@ CommentStmt:
n->comment = $6;
$$ = (Node *) n;
}
+ | COMMENT ON CURRENT_P DATABASE IS comment_text
+ {
+ CommentStmt *n = makeNode(CommentStmt);
+ n->objtype = OBJECT_DATABASE;
+ n->objname = NIL;
+ n->objargs = NIL;
+ n->comment = $6;
+ $$ = (Node *) n;
+ }
| COMMENT ON TYPE_P Typename IS comment_text
{
CommentStmt *n = makeNode(CommentStmt);
diff --git a/src/bin/pg_dump/pg_dump.c b/src/bin/pg_dump/pg_dump.c
index e5545b3..2e4746a 100644
--- a/src/bin/pg_dump/pg_dump.c
+++ b/src/bin/pg_dump/pg_dump.c
@@ -2679,10 +2679,20 @@ dumpDatabase(Archive *fout)
resetPQExpBuffer(dbQry);
/*
+ * Use the new form (COMMENT ON CURRENT DATABASE) for new version
+ */
+ if (fout->remoteVersion >= 100000)
+ {
+ appendPQExpBuffer(dbQry, "COMMENT ON CURRENT DATABASE IS ");
+ }
+ /*
* Generates warning when loaded into a differently-named
* database.
*/
- appendPQExpBuffer(dbQry, "COMMENT ON DATABASE %s IS ", fmtId(datname));
+ else
+ {
+ appendPQExpBuffer(dbQry, "COMMENT ON DATABASE %s IS ", fmtId(datname));
+ }
appendStringLiteralAH(dbQry, comment, fout);
appendPQExpBufferStr(dbQry, ";\n");
diff --git a/src/bin/pg_dump/t/002_pg_dump.pl b/src/bin/pg_dump/t/002_pg_dump.pl
index 59191cc..1189d82 100644
--- a/src/bin/pg_dump/t/002_pg_dump.pl
+++ b/src/bin/pg_dump/t/002_pg_dump.pl
@@ -721,10 +721,10 @@ my %tests = (
},
},
- 'COMMENT ON DATABASE postgres' => {
+ 'COMMENT ON CURRENT DATABASE' => {
all_runs => 1,
catch_all => 'COMMENT commands',
- regexp => qr/^COMMENT ON DATABASE postgres IS .*;/m,
+ regexp => qr/^COMMENT ON CURRENT DATABASE IS .*;/m,
like => {
binary_upgrade => 1,
clean => 1,
diff --git a/src/bin/psql/tab-complete.c b/src/bin/psql/tab-complete.c
index 02c8d60..a53496d 100644
--- a/src/bin/psql/tab-complete.c
+++ b/src/bin/psql/tab-complete.c
@@ -2004,7 +2004,7 @@ psql_completion(const char *text, int start, int end)
else if (Matches2("COMMENT", "ON"))
{
static const char *const list_COMMENT[] =
- {"ACCESS METHOD", "CAST", "COLLATION", "CONVERSION", "DATABASE",
+ {"ACCESS METHOD", "CAST", "COLLATION", "CONVERSION", "CURRENT DATABASE", "DATABASE",
"EVENT TRIGGER", "EXTENSION",
"FOREIGN DATA WRAPPER", "FOREIGN TABLE",
"SERVER", "INDEX", "LANGUAGE", "POLICY", "RULE", "SCHEMA", "SEQUENCE",
--
Sent via pgsql-hackers mailing list ([email protected])
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-hackers