diff --git a/contrib/pg_upgrade/option.c b/contrib/pg_upgrade/option.c
new file mode 100644
index bb594dd..cfc88ec
*** a/contrib/pg_upgrade/option.c
--- b/contrib/pg_upgrade/option.c
*************** parseCommandLine(int argc, char *argv[])
*** 137,153 ****
break;
case 'o':
! old_cluster.pgopts = pg_strdup(optarg);
break;
case 'O':
! new_cluster.pgopts = pg_strdup(optarg);
break;
/*
* Someday, the port number option could be removed and passed
* using -o/-O, but that requires postmaster -C to be
! * supported on all old/new versions.
*/
case 'p':
if ((old_cluster.port = atoi(optarg)) <= 0)
--- 137,171 ----
break;
case 'o':
! /* append option? */
! if (!old_cluster.pgopts)
! old_cluster.pgopts = pg_strdup(optarg);
! else
! {
! char *old_pgopts = old_cluster.pgopts;
!
! old_cluster.pgopts = psprintf("%s %s", old_pgopts, optarg);
! free(old_pgopts);
! }
break;
case 'O':
! /* append option? */
! if (!new_cluster.pgopts)
! new_cluster.pgopts = pg_strdup(optarg);
! else
! {
! char *new_pgopts = new_cluster.pgopts;
!
! new_cluster.pgopts = psprintf("%s %s", new_pgopts, optarg);
! free(new_pgopts);
! }
break;
/*
* Someday, the port number option could be removed and passed
* using -o/-O, but that requires postmaster -C to be
! * supported on all old/new versions (added in PG 9.2).
*/
case 'p':
if ((old_cluster.port = atoi(optarg)) <= 0)
diff --git a/doc/src/sgml/pgupgrade.sgml b/doc/src/sgml/pgupgrade.sgml
new file mode 100644
index b79f0db..dd57c5c
*** a/doc/src/sgml/pgupgrade.sgml
--- b/doc/src/sgml/pgupgrade.sgml
***************
*** 130,143 ****
optionsoptionsoptions to be passed directly to the
! old postgres commandoptionsoptionsoptions to be passed directly to the
! new postgres command
--- 130,145 ----
optionsoptionsoptions to be passed directly to the
! old postgres command; multiple
! option invocations are appendedoptionsoptionsoptions to be passed directly to the
! new postgres command; multiple
! option invocations are appended
diff --git a/doc/src/sgml/ref/pg_ctl-ref.sgml b/doc/src/sgml/ref/pg_ctl-ref.sgml
new file mode 100644
index 2368129..29f882b
*** a/doc/src/sgml/ref/pg_ctl-ref.sgml
--- b/doc/src/sgml/ref/pg_ctl-ref.sgml
*************** PostgreSQL documentation
*** 302,308 ****
Specifies options to be passed directly to the
! postgres command.
The options should usually be surrounded by single or double
--- 302,309 ----
Specifies options to be passed directly to the
! postgres command; multiple
! option invocations are appended.
The options should usually be surrounded by single or double
diff --git a/doc/src/sgml/ref/postgres-ref.sgml b/doc/src/sgml/ref/postgres-ref.sgml
new file mode 100644
index cdfdaa0..845d969
*** a/doc/src/sgml/ref/postgres-ref.sgml
--- b/doc/src/sgml/ref/postgres-ref.sgml
*************** PostgreSQL documentation
*** 288,294 ****
class="parameter">extra-options are passed to
all server processes started by this
postgres process. If the option string contains
! any spaces, the entire string must be quoted.
--- 288,295 ----
class="parameter">extra-options are passed to
all server processes started by this
postgres process. If the option string contains
! any spaces, the entire string must be quoted; multiple
! option invocations are appended.
diff --git a/src/bin/pg_ctl/pg_ctl.c b/src/bin/pg_ctl/pg_ctl.c
new file mode 100644
index ad7f36c..a46ca53
*** a/src/bin/pg_ctl/pg_ctl.c
--- b/src/bin/pg_ctl/pg_ctl.c
*************** main(int argc, char **argv)
*** 2184,2190 ****
register_servicename = pg_strdup(optarg);
break;
case 'o':
! post_opts = pg_strdup(optarg);
break;
case 'p':
exec_path = pg_strdup(optarg);
--- 2184,2199 ----
register_servicename = pg_strdup(optarg);
break;
case 'o':
! /* append option? */
! if (!post_opts)
! post_opts = pg_strdup(optarg);
! else
! {
! char *old_post_opts = post_opts;
!
! post_opts = psprintf("%s %s", old_post_opts, optarg);
! free(old_post_opts);
! }
break;
case 'p':
exec_path = pg_strdup(optarg);