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/20150317171836.gc10...@momjian.us -- 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 (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers