? GNUmakefile
? config.log
? config.status
? configure.lineno
? dump.sql
? output.txt
? contrib/btree_gist/.deps
? contrib/btree_gist/btree_gist.sql
? contrib/btree_gist/libbtree_gist.so.0
? contrib/btree_gist/regression.diffs
? contrib/btree_gist/regression.out
? contrib/btree_gist/results
? contrib/chkpass/.deps
? contrib/chkpass/chkpass.sql
? contrib/chkpass/libchkpass.so.0
? contrib/cube/.deps
? contrib/cube/cube.sql
? contrib/cube/cubeparse.c
? contrib/cube/cubeparse.h
? contrib/cube/cubescan.c
? contrib/cube/libcube.so.0
? contrib/cube/regression.diffs
? contrib/cube/regression.out
? contrib/cube/results
? contrib/dbase/.deps
? contrib/dbase/dbf2pg
? contrib/dblink/.deps
? contrib/dblink/dblink.sql
? contrib/dblink/libdblink.so.0
? contrib/dblink/regression.diffs
? contrib/dblink/regression.out
? contrib/dblink/results
? contrib/dbmirror/.deps
? contrib/dbsize/.deps
? contrib/dbsize/dbsize.sql
? contrib/findoidjoins/.deps
? contrib/findoidjoins/findoidjoins
? contrib/fulltextindex/.deps
? contrib/fulltextindex/fti.sql
? contrib/fuzzystrmatch/.deps
? contrib/fuzzystrmatch/fuzzystrmatch.sql
? contrib/intagg/.deps
? contrib/intagg/int_aggregate.sql
? contrib/intarray/.deps
? contrib/intarray/_int.sql
? contrib/intarray/lib_int.so.0
? contrib/intarray/regression.diffs
? contrib/intarray/regression.out
? contrib/intarray/results
? contrib/isbn_issn/.deps
? contrib/isbn_issn/isbn_issn.sql
? contrib/lo/.deps
? contrib/lo/lo.sql
? contrib/ltree/.deps
? contrib/ltree/libltree.so.0
? contrib/ltree/ltree.sql
? contrib/miscutil/.deps
? contrib/miscutil/misc_utils.sql
? contrib/noupdate/.deps
? contrib/noupdate/noup.sql
? contrib/oid2name/.deps
? contrib/oid2name/oid2name
? contrib/pg_autovacuum/.deps
? contrib/pg_autovacuum/pg_autovacuum
? contrib/pg_dumplo/.deps
? contrib/pg_dumplo/pg_dumplo
? contrib/pg_logger/.deps
? contrib/pg_logger/pg_logger
? contrib/pg_trgm/.deps
? contrib/pg_trgm/libpg_trgm.so.0
? contrib/pg_trgm/pg_trgm.sql
? contrib/pgbench/.deps
? contrib/pgbench/pgbench
? contrib/pgcrypto/.deps
? contrib/pgcrypto/libpgcrypto.so.0
? contrib/pgcrypto/pgcrypto.sql
? contrib/pgstattuple/.deps
? contrib/pgstattuple/libpgstattuple.so.0
? contrib/pgstattuple/pgstattuple.sql
? contrib/rserv/.deps
? contrib/rserv/ApplySnapshot
? contrib/rserv/CleanLog
? contrib/rserv/GetSyncID
? contrib/rserv/InitRservTest
? contrib/rserv/MasterAddTable
? contrib/rserv/MasterInit
? contrib/rserv/MasterSync
? contrib/rserv/PrepareSnapshot
? contrib/rserv/Replicate
? contrib/rserv/RservTest
? contrib/rserv/SlaveAddTable
? contrib/rserv/SlaveInit
? contrib/rserv/master.sql
? contrib/rserv/slave.sql
? contrib/rtree_gist/.deps
? contrib/rtree_gist/rtree_gist.sql
? contrib/seg/.deps
? contrib/seg/libseg.so.0
? contrib/seg/seg.sql
? contrib/seg/segparse.c
? contrib/seg/segparse.h
? contrib/seg/segscan.c
? contrib/spi/.deps
? contrib/string/.deps
? contrib/string/string_io.sql
? contrib/tablefunc/.deps
? contrib/tablefunc/tablefunc.sql
? contrib/tsearch/.deps
? contrib/tsearch/libtsearch.so.0
? contrib/tsearch/parser.c
? contrib/tsearch/tsearch.sql
? contrib/tsearch2/.deps
? contrib/tsearch2/libtsearch2.so.0
? contrib/tsearch2/tsearch2.sql
? contrib/tsearch2/untsearch2.sql
? contrib/tsearch2/ispell/.deps
? contrib/tsearch2/snowball/.deps
? contrib/tsearch2/wordparser/.deps
? contrib/tsearch2/wordparser/parser.c
? contrib/userlock/.deps
? contrib/userlock/user_locks.sql
? contrib/vacuumlo/.deps
? contrib/vacuumlo/vacuumlo
? contrib/xml/pgxml_dom.d
? contrib/xml/pgxml_dom.sql
? contrib/xml2/pgxml.sql
? contrib/xml2/xpath.d
? doc/src/sgml/ref/alter_operator.sgml
? doc/src/sgml/ref/alter_type.sgml
? src/Makefile.global
? src/backend/postgres
? src/backend/access/common/.deps
? src/backend/access/gist/.deps
? src/backend/access/hash/.deps
? src/backend/access/heap/.deps
? src/backend/access/index/.deps
? src/backend/access/nbtree/.deps
? src/backend/access/rtree/.deps
? src/backend/access/transam/.deps
? src/backend/bootstrap/.deps
? src/backend/catalog/.deps
? src/backend/catalog/postgres.bki
? src/backend/catalog/postgres.description
? src/backend/commands/.deps
? src/backend/executor/.deps
? src/backend/lib/.deps
? src/backend/libpq/.deps
? src/backend/main/.deps
? src/backend/nodes/.deps
? src/backend/optimizer/geqo/.deps
? src/backend/optimizer/path/.deps
? src/backend/optimizer/plan/.deps
? src/backend/optimizer/prep/.deps
? src/backend/optimizer/util/.deps
? src/backend/parser/.deps
? src/backend/parser/2
? src/backend/port/.deps
? src/backend/postmaster/.deps
? src/backend/regex/.deps
? src/backend/rewrite/.deps
? src/backend/storage/buffer/.deps
? src/backend/storage/file/.deps
? src/backend/storage/freespace/.deps
? src/backend/storage/ipc/.deps
? src/backend/storage/large_object/.deps
? src/backend/storage/lmgr/.deps
? src/backend/storage/page/.deps
? src/backend/storage/smgr/.deps
? src/backend/tcop/.deps
? src/backend/utils/.deps
? src/backend/utils/adt/.deps
? src/backend/utils/cache/.deps
? src/backend/utils/error/.deps
? src/backend/utils/fmgr/.deps
? src/backend/utils/hash/.deps
? src/backend/utils/init/.deps
? src/backend/utils/mb/.deps
? src/backend/utils/mb/conversion_procs/conversion_create.sql
? src/backend/utils/mb/conversion_procs/ascii_and_mic/.deps
? src/backend/utils/mb/conversion_procs/ascii_and_mic/libascii_and_mic.so.0
? src/backend/utils/mb/conversion_procs/cyrillic_and_mic/.deps
? src/backend/utils/mb/conversion_procs/cyrillic_and_mic/libcyrillic_and_mic.so.0
? src/backend/utils/mb/conversion_procs/euc_cn_and_mic/.deps
? src/backend/utils/mb/conversion_procs/euc_cn_and_mic/libeuc_cn_and_mic.so.0
? src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/.deps
? src/backend/utils/mb/conversion_procs/euc_jp_and_sjis/libeuc_jp_and_sjis.so.0
? src/backend/utils/mb/conversion_procs/euc_kr_and_mic/.deps
? src/backend/utils/mb/conversion_procs/euc_kr_and_mic/libeuc_kr_and_mic.so.0
? src/backend/utils/mb/conversion_procs/euc_tw_and_big5/.deps
? src/backend/utils/mb/conversion_procs/euc_tw_and_big5/libeuc_tw_and_big5.so.0
? src/backend/utils/mb/conversion_procs/latin2_and_win1250/.deps
? src/backend/utils/mb/conversion_procs/latin2_and_win1250/liblatin2_and_win1250.so.0
? src/backend/utils/mb/conversion_procs/latin_and_mic/.deps
? src/backend/utils/mb/conversion_procs/latin_and_mic/liblatin_and_mic.so.0
? src/backend/utils/mb/conversion_procs/utf8_and_ascii/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_ascii/libutf8_and_ascii.so.0
? src/backend/utils/mb/conversion_procs/utf8_and_big5/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_big5/libutf8_and_big5.so.0
? src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_cyrillic/libutf8_and_cyrillic.so.0
? src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_euc_cn/libutf8_and_euc_cn.so.0
? src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_euc_jp/libutf8_and_euc_jp.so.0
? src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_euc_kr/libutf8_and_euc_kr.so.0
? src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_euc_tw/libutf8_and_euc_tw.so.0
? src/backend/utils/mb/conversion_procs/utf8_and_gb18030/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_gb18030/libutf8_and_gb18030.so.0
? src/backend/utils/mb/conversion_procs/utf8_and_gbk/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_gbk/libutf8_and_gbk.so.0
? src/backend/utils/mb/conversion_procs/utf8_and_iso8859/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_iso8859/libutf8_and_iso8859.so.0
? src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_iso8859_1/libutf8_and_iso8859_1.so.0
? src/backend/utils/mb/conversion_procs/utf8_and_johab/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_johab/libutf8_and_johab.so.0
? src/backend/utils/mb/conversion_procs/utf8_and_sjis/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_sjis/libutf8_and_sjis.so.0
? src/backend/utils/mb/conversion_procs/utf8_and_tcvn/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_tcvn/libutf8_and_tcvn.so.0
? src/backend/utils/mb/conversion_procs/utf8_and_uhc/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_uhc/libutf8_and_uhc.so.0
? src/backend/utils/mb/conversion_procs/utf8_and_win1250/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_win1250/libutf8_and_win1250.so.0
? src/backend/utils/mb/conversion_procs/utf8_and_win1256/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_win1256/libutf8_and_win1256.so.0
? src/backend/utils/mb/conversion_procs/utf8_and_win874/.deps
? src/backend/utils/mb/conversion_procs/utf8_and_win874/libutf8_and_win874.so.0
? src/backend/utils/misc/.deps
? src/backend/utils/mmgr/.deps
? src/backend/utils/sort/.deps
? src/backend/utils/time/.deps
? src/bin/initdb/.deps
? src/bin/initdb/initdb
? src/bin/initlocation/initlocation
? src/bin/ipcclean/ipcclean
? src/bin/pg_config/pg_config
? src/bin/pg_controldata/.deps
? src/bin/pg_controldata/pg_controldata
? src/bin/pg_ctl/.deps
? src/bin/pg_ctl/pg_ctl
? src/bin/pg_dump/.deps
? src/bin/pg_dump/common.c.working
? src/bin/pg_dump/pg_dump
? src/bin/pg_dump/pg_dump.c.working
? src/bin/pg_dump/pg_dump.h.working
? src/bin/pg_dump/pg_dumpall
? src/bin/pg_dump/pg_restore
? src/bin/pg_encoding/.deps
? src/bin/pg_encoding/pg_encoding
? src/bin/pg_id/.deps
? src/bin/pg_id/pg_id
? src/bin/pg_resetxlog/.deps
? src/bin/pg_resetxlog/pg_resetxlog
? src/bin/psql/.deps
? src/bin/psql/psql
? src/bin/scripts/.deps
? src/bin/scripts/clusterdb
? src/bin/scripts/createdb
? src/bin/scripts/createlang
? src/bin/scripts/createuser
? src/bin/scripts/dropdb
? src/bin/scripts/droplang
? src/bin/scripts/dropuser
? src/bin/scripts/vacuumdb
? src/include/pg_config.h
? src/include/stamp-h
? src/interfaces/ecpg/compatlib/.deps
? src/interfaces/ecpg/compatlib/libecpg_compat.so.1
? src/interfaces/ecpg/ecpglib/.deps
? src/interfaces/ecpg/ecpglib/libecpg.so.4
? src/interfaces/ecpg/pgtypeslib/.deps
? src/interfaces/ecpg/pgtypeslib/libpgtypes.so.1
? src/interfaces/ecpg/preproc/.deps
? src/interfaces/ecpg/preproc/ecpg
? src/interfaces/libpq/.deps
? src/interfaces/libpq/libpq.so.3
? src/pl/plperl/.deps
? src/pl/plperl/SPI.c
? src/pl/plperl/libplperl.so.0
? src/pl/plpgsql/src/.deps
? src/pl/plpgsql/src/libplpgsql.so.1
? src/port/.deps
? src/port/pg_config_paths.h
? src/test/regress/.deps
? src/test/regress/log
? src/test/regress/pg_regress
? src/test/regress/results
? src/test/regress/tmp_check
? src/test/regress/expected/constraints.out
? src/test/regress/expected/copy.out
? src/test/regress/expected/create_function_1.out
? src/test/regress/expected/create_function_2.out
? src/test/regress/expected/misc.out
? src/test/regress/sql/constraints.sql
? src/test/regress/sql/copy.sql
? src/test/regress/sql/create_function_1.sql
? src/test/regress/sql/create_function_2.sql
? src/test/regress/sql/misc.sql
? src/timezone/.deps
? src/timezone/zic
Index: contrib/Makefile
===================================================================
RCS file: /projects/cvsroot/pgsql-server/contrib/Makefile,v
retrieving revision 1.49
diff -c -r1.49 Makefile
*** contrib/Makefile	1 Jun 2004 05:15:47 -0000	1.49
--- contrib/Makefile	15 Jun 2004 02:21:50 -0000
***************
*** 12,18 ****
  		dblink		\
  		dbmirror	\
  		dbsize		\
- 		earthdistance	\
  		findoidjoins	\
  		fulltextindex	\
  		fuzzystrmatch	\
--- 12,17 ----
Index: doc/src/sgml/reference.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/reference.sgml,v
retrieving revision 1.47
diff -c -r1.47 reference.sgml
*** doc/src/sgml/reference.sgml	20 Apr 2004 01:14:55 -0000	1.47
--- doc/src/sgml/reference.sgml	15 Jun 2004 02:21:51 -0000
***************
*** 45,55 ****
--- 45,57 ----
     &alterFunction;
     &alterGroup;
     &alterLanguage;
+    &alterOperator;
     &alterOperatorClass;
     &alterSchema;
     &alterSequence;
     &alterTable;
     &alterTrigger;
+    &alterType;
     &alterUser;
     &analyze;
     &begin;
Index: doc/src/sgml/ref/allfiles.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/ref/allfiles.sgml,v
retrieving revision 1.56
diff -c -r1.56 allfiles.sgml
*** doc/src/sgml/ref/allfiles.sgml	20 Apr 2004 01:11:49 -0000	1.56
--- doc/src/sgml/ref/allfiles.sgml	15 Jun 2004 02:21:51 -0000
***************
*** 13,23 ****
--- 13,25 ----
  <!entity alterFunction      system "alter_function.sgml">
  <!entity alterGroup         system "alter_group.sgml">
  <!entity alterLanguage      system "alter_language.sgml">
+ <!entity alterOperator      system "alter_operator.sgml">
  <!entity alterOperatorClass system "alter_opclass.sgml">
  <!entity alterSchema        system "alter_schema.sgml">
  <!entity alterSequence      system "alter_sequence.sgml">
  <!entity alterTable         system "alter_table.sgml">
  <!entity alterTrigger       system "alter_trigger.sgml">
+ <!entity alterType          system "alter_type.sgml">
  <!entity alterUser          system "alter_user.sgml">
  <!entity analyze            system "analyze.sgml">
  <!entity begin              system "begin.sgml">
Index: doc/src/sgml/ref/alter_aggregate.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/ref/alter_aggregate.sgml,v
retrieving revision 1.4
diff -c -r1.4 alter_aggregate.sgml
*** doc/src/sgml/ref/alter_aggregate.sgml	29 Nov 2003 19:51:38 -0000	1.4
--- doc/src/sgml/ref/alter_aggregate.sgml	15 Jun 2004 02:21:51 -0000
***************
*** 21,26 ****
--- 21,27 ----
   <refsynopsisdiv>
  <synopsis>
  ALTER AGGREGATE <replaceable>name</replaceable> ( <replaceable>type</replaceable> ) RENAME TO <replaceable>newname</replaceable>
+ ALTER AGGREGATE <replaceable>name</replaceable> ( <replaceable>type</replaceable> ) OWNER TO <replaceable>newowner</replaceable>
  </synopsis>
   </refsynopsisdiv>
    
***************
*** 30,36 ****
    <para>
     <command>ALTER AGGREGATE</command> changes the definition of an
     aggregate function.  The only currently available functionality is to
!    rename the aggregate function.
    </para>
   </refsect1>
    
--- 31,38 ----
    <para>
     <command>ALTER AGGREGATE</command> changes the definition of an
     aggregate function.  The only currently available functionality is to
!    rename the aggregate function and change its owner.  You must be a
!    superuser to change an aggregate's owner.
    </para>
   </refsect1>
    
***************
*** 65,70 ****
--- 67,81 ----
       </para>
      </listitem>
     </varlistentry>
+ 
+    <varlistentry>
+     <term><replaceable class="parameter">newowner</replaceable></term>
+     <listitem>
+      <para>
+       The new owner of the aggregate function.
+      </para>
+     </listitem>
+    </varlistentry>
    </variablelist>
   </refsect1>
  
***************
*** 76,81 ****
--- 87,100 ----
     <type>integer</type> to <literal>my_average</literal>:
  <programlisting>
  ALTER AGGREGATE myavg(integer) RENAME TO my_average;
+ </programlisting>
+   </para>
+ 
+   <para>
+    To change the owner of the aggregate function <literal>myavg</literal> for type
+    <type>integer</type> to <literal>joe</literal>:
+ <programlisting>
+ ALTER AGGREGATE myavg(integer) OWNER TO joe;
  </programlisting>
    </para>
   </refsect1>
Index: doc/src/sgml/ref/alter_conversion.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/ref/alter_conversion.sgml,v
retrieving revision 1.4
diff -c -r1.4 alter_conversion.sgml
*** doc/src/sgml/ref/alter_conversion.sgml	29 Nov 2003 19:51:38 -0000	1.4
--- doc/src/sgml/ref/alter_conversion.sgml	15 Jun 2004 02:21:51 -0000
***************
*** 21,26 ****
--- 21,27 ----
   <refsynopsisdiv>
  <synopsis>
  ALTER CONVERSION <replaceable>name</replaceable> RENAME TO <replaceable>newname</replaceable>
+ ALTER CONVERSION <replaceable>name</replaceable> OWNER TO <replaceable>newowner</replaceable>
  </synopsis>
   </refsynopsisdiv>
    
***************
*** 29,36 ****
  
    <para>
     <command>ALTER CONVERSION</command> changes the definition of a
!    conversion.  The only currently available functionality is to rename the
!    conversion.
    </para>
   </refsect1>
    
--- 30,37 ----
  
    <para>
     <command>ALTER CONVERSION</command> changes the definition of a
!    conversion.  To change the owner of a conversion, you must be a
!    superuser.
    </para>
   </refsect1>
    
***************
*** 55,60 ****
--- 56,70 ----
       </para>
      </listitem>
     </varlistentry>
+ 
+    <varlistentry>
+     <term><replaceable class="parameter">newowner</replaceable></term>
+     <listitem>
+      <para>
+       The new owner of the conversion.
+      </para>
+     </listitem>
+    </varlistentry>
    </variablelist>
   </refsect1>
  
***************
*** 68,73 ****
--- 78,93 ----
  ALTER CONVERSION iso_8859_1_to_utf_8 RENAME TO latin1_to_unicode;
  </programlisting>
    </para>
+ 
+   <para>
+    To change the owner of the conversion <literal>iso_8859_1_to_utf_8</literal> to
+    <literal>joe</literal>:
+ <programlisting>
+ ALTER CONVERSION iso_8859_1_to_utf_8 OWNER TO joe;
+ </programlisting>
+   </para>
+  </refsect1>
+ 
   </refsect1>
  
   <refsect1>
Index: doc/src/sgml/ref/alter_function.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/ref/alter_function.sgml,v
retrieving revision 1.4
diff -c -r1.4 alter_function.sgml
*** doc/src/sgml/ref/alter_function.sgml	29 Nov 2003 19:51:38 -0000	1.4
--- doc/src/sgml/ref/alter_function.sgml	15 Jun 2004 02:21:51 -0000
***************
*** 21,26 ****
--- 21,27 ----
   <refsynopsisdiv>
  <synopsis>
  ALTER FUNCTION <replaceable>name</replaceable> ( [ <replaceable class="parameter">type</replaceable> [, ...] ] ) RENAME TO <replaceable>newname</replaceable>
+ ALTER FUNCTION <replaceable>name</replaceable> ( [ <replaceable class="parameter">type</replaceable> [, ...] ] ) OWNER TO <replaceable>newowner</replaceable>
  </synopsis>
   </refsynopsisdiv>
    
***************
*** 29,35 ****
  
    <para>
     <command>ALTER FUNCTION</command> changes the definition of a
!    function.  The only functionality is to rename the function.
    </para>
   </refsect1>
    
--- 30,37 ----
  
    <para>
     <command>ALTER FUNCTION</command> changes the definition of a
!    function.  To change the owner of a function, you must be a
!    superuser.
    </para>
   </refsect1>
    
***************
*** 63,68 ****
--- 65,81 ----
       </para>
      </listitem>
     </varlistentry>
+ 
+    <varlistentry>
+     <term><replaceable class="parameter">newowner</replaceable></term>
+     <listitem>
+      <para>
+       The new owner of the function.  Note that this will affect the
+       the user that the function will execute as, if it is marked
+       <literal>SECURITY DEFINER</literal>.
+      </para>
+     </listitem>
+    </varlistentry>
    </variablelist>
   </refsect1>
  
***************
*** 76,81 ****
--- 89,102 ----
  ALTER FUNCTION sqrt(integer) RENAME TO square_root;
  </programlisting>
    </para>
+ 
+   <para>
+    To change the owner of the function <literal>sqrt</literal> for type
+    <type>integer</type> to <literal>joe</literal>:
+ <programlisting>
+ ALTER FUNCTION sqrt(integer) OWNER TO joe;
+ </programlisting>
+   </para>
   </refsect1>
  
   <refsect1>
***************
*** 84,90 ****
    <para>
     There is an <command>ALTER FUNCTION</command> statement in the SQL
     standard, but it does not provide the option to rename the
!    function.
    </para>
   </refsect1>
  
--- 105,111 ----
    <para>
     There is an <command>ALTER FUNCTION</command> statement in the SQL
     standard, but it does not provide the option to rename the
!    function or change the owner.
    </para>
   </refsect1>
  
Index: doc/src/sgml/ref/alter_opclass.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/ref/alter_opclass.sgml,v
retrieving revision 1.4
diff -c -r1.4 alter_opclass.sgml
*** doc/src/sgml/ref/alter_opclass.sgml	29 Nov 2003 19:51:38 -0000	1.4
--- doc/src/sgml/ref/alter_opclass.sgml	15 Jun 2004 02:21:51 -0000
***************
*** 21,26 ****
--- 21,27 ----
   <refsynopsisdiv>
  <synopsis>
  ALTER OPERATOR CLASS <replaceable>name</replaceable> USING <replaceable class="parameter">index_method</replaceable> RENAME TO <replaceable>newname</replaceable>
+ ALTER OPERATOR CLASS <replaceable>name</replaceable> USING <replaceable class="parameter">index_method</replaceable> OWNER TO <replaceable>newowner</replaceable>
  </synopsis>
   </refsynopsisdiv>
    
***************
*** 29,36 ****
  
    <para>
     <command>ALTER OPERATOR CLASS</command> changes the definition of
!    an operator class.  The only functionality is to rename the
!    operator class.
    </para>
   </refsect1>
    
--- 30,37 ----
  
    <para>
     <command>ALTER OPERATOR CLASS</command> changes the definition of
!    an operator class.  You must be a superuser to change the owner
!    of an operator class.
    </para>
   </refsect1>
    
***************
*** 65,71 ****
       </para>
      </listitem>
     </varlistentry>
!   </variablelist>
   </refsect1>
  
   <refsect1>
--- 66,81 ----
       </para>
      </listitem>
     </varlistentry>
! 
!    <varlistentry>
!     <term><replaceable class="parameter">newowner</replaceable></term>
!     <listitem>
!      <para>
!       The new owner of the operator class.
!      </para>
!     </listitem>
!    </varlistentry>
!  </variablelist>
   </refsect1>
  
   <refsect1>
Index: doc/src/sgml/ref/alter_schema.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/ref/alter_schema.sgml,v
retrieving revision 1.6
diff -c -r1.6 alter_schema.sgml
*** doc/src/sgml/ref/alter_schema.sgml	29 Nov 2003 19:51:38 -0000	1.6
--- doc/src/sgml/ref/alter_schema.sgml	15 Jun 2004 02:21:51 -0000
***************
*** 21,26 ****
--- 21,27 ----
   <refsynopsisdiv>
  <synopsis>
  ALTER SCHEMA <replaceable>name</replaceable> RENAME TO <replaceable>newname</replaceable>
+ ALTER SCHEMA <replaceable>name</replaceable> OWNER TO <replaceable>newowner</replaceable>
  </synopsis>
   </refsynopsisdiv>
  
***************
*** 29,37 ****
  
    <para>
     <command>ALTER SCHEMA</command> changes the definition of a schema.
!    The only functionality is to rename the schema.  To rename a schema
!    you must own the schema and have the privilege
!    <literal>CREATE</literal> for the database.
    </para>
   </refsect1>
  
--- 30,38 ----
  
    <para>
     <command>ALTER SCHEMA</command> changes the definition of a schema.
!    To rename a schema you must own the schema and have the privilege
!    <literal>CREATE</literal> for the database.  To change the owner
!    of a schema, you must be a superuser.
    </para>
   </refsect1>
  
***************
*** 53,58 ****
--- 54,68 ----
      <listitem>
       <para>
        The new name of the schema
+      </para>
+     </listitem>
+    </varlistentry>
+ 
+    <varlistentry>
+     <term><replaceable class="parameter">newowner</replaceable></term>
+     <listitem>
+      <para>
+       The new owner of the schema.
       </para>
      </listitem>
     </varlistentry>
Index: doc/src/sgml/ref/create_operator.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/ref/create_operator.sgml,v
retrieving revision 1.41
diff -c -r1.41 create_operator.sgml
*** doc/src/sgml/ref/create_operator.sgml	11 Dec 2003 20:13:53 -0000	1.41
--- doc/src/sgml/ref/create_operator.sgml	15 Jun 2004 02:21:51 -0000
***************
*** 263,269 ****
  
    <para>
     Use <command>DROP OPERATOR</command> to delete user-defined
!    operators from a database.
    </para>
   </refsect1>
    
--- 263,270 ----
  
    <para>
     Use <command>DROP OPERATOR</command> to delete user-defined
!    operators from a database.  Use <command>ALTER OPERATOR</command>
!    to modify operators in a database.
    </para>
   </refsect1>
    
Index: doc/src/sgml/ref/create_type.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/ref/create_type.sgml,v
retrieving revision 1.51
diff -c -r1.51 create_type.sgml
*** doc/src/sgml/ref/create_type.sgml	6 Jun 2004 00:41:25 -0000	1.51
--- doc/src/sgml/ref/create_type.sgml	15 Jun 2004 02:21:51 -0000
***************
*** 546,551 ****
--- 546,552 ----
    <simplelist type="inline">
     <member><xref linkend="sql-createfunction" endterm="sql-createfunction-title"></member>
     <member><xref linkend="sql-droptype" endterm="sql-droptype-title"></member>
+    <member><xref linkend="sql-altertype" endterm="sql-altertype-title"></member>
    </simplelist>
   </refsect1>
  
Index: doc/src/sgml/ref/drop_operator.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/ref/drop_operator.sgml,v
retrieving revision 1.24
diff -c -r1.24 drop_operator.sgml
*** doc/src/sgml/ref/drop_operator.sgml	2 Dec 2003 00:26:59 -0000	1.24
--- doc/src/sgml/ref/drop_operator.sgml	15 Jun 2004 02:21:51 -0000
***************
*** 128,133 ****
--- 128,134 ----
  
    <simplelist type="inline">
     <member><xref linkend="sql-createoperator" endterm="sql-createoperator-title"></member>
+    <member><xref linkend="sql-alteroperator" endterm="sql-alteroperator-title"></member>
    </simplelist>
   </refsect1>
  
Index: doc/src/sgml/ref/drop_type.sgml
===================================================================
RCS file: /projects/cvsroot/pgsql-server/doc/src/sgml/ref/drop_type.sgml,v
retrieving revision 1.25
diff -c -r1.25 drop_type.sgml
*** doc/src/sgml/ref/drop_type.sgml	29 Nov 2003 19:51:38 -0000	1.25
--- doc/src/sgml/ref/drop_type.sgml	15 Jun 2004 02:21:51 -0000
***************
*** 95,100 ****
--- 95,101 ----
  
    <simplelist type="inline">
     <member><xref linkend="sql-createtype" endterm="sql-createtype-title"></member>
+    <member><xref linkend="sql-altertype" endterm="sql-altertype-title"></member>
    </simplelist>
   </refsect1>
  
Index: src/backend/commands/aggregatecmds.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/commands/aggregatecmds.c,v
retrieving revision 1.18
diff -c -r1.18 aggregatecmds.c
*** src/backend/commands/aggregatecmds.c	26 May 2004 04:41:09 -0000	1.18
--- src/backend/commands/aggregatecmds.c	15 Jun 2004 02:21:52 -0000
***************
*** 288,290 ****
--- 288,342 ----
  	heap_close(rel, NoLock);
  	heap_freetuple(tup);
  }
+ 
+ /**
+  * Change aggregate owner
+  */
+ void
+ OwnerToAggregate(List *name, TypeName *basetype, AclId newOwnerSysId)
+ {
+ 	Oid			basetypeOid;
+ 	Oid			procOid;
+ 	HeapTuple	tup;
+ 	Form_pg_proc procForm;
+ 	Relation	rel;
+ 
+ 	/*
+ 	 * if a basetype is passed in, then attempt to find an aggregate for
+ 	 * that specific type.
+ 	 *
+ 	 * else attempt to find an aggregate with a basetype of ANYOID. This
+ 	 * means that the aggregate is to apply to all basetypes (eg, COUNT).
+ 	 */
+ 	if (basetype)
+ 		basetypeOid = typenameTypeId(basetype);
+ 	else
+ 		basetypeOid = ANYOID;
+ 
+ 	rel = heap_openr(ProcedureRelationName, RowExclusiveLock);
+ 
+ 	procOid = find_aggregate_func(name, basetypeOid, false);
+ 
+ 	tup = SearchSysCacheCopy(PROCOID,
+ 							 ObjectIdGetDatum(procOid),
+ 							 0, 0, 0);
+ 	if (!HeapTupleIsValid(tup)) /* should not happen */
+ 		elog(ERROR, "cache lookup failed for function %u", procOid);
+ 	procForm = (Form_pg_proc) GETSTRUCT(tup);
+ 
+ 	/* must be superuser to change object ownership */
+ 	if (!superuser())
+ 		ereport(ERROR,
+ 				(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ 				 errmsg("must be superuser to change owner")));
+ 
+ 	/* Modify the owner --- okay to scribble on tup because it's a copy */
+ 	procForm->proowner = newOwnerSysId;
+ 
+ 	simple_heap_update(rel, &tup->t_self, tup);
+ 
+ 	CatalogUpdateIndexes(rel, tup);
+ 
+ 	heap_close(rel, NoLock);
+ 	heap_freetuple(tup);
+ }
Index: src/backend/commands/alter.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/commands/alter.c,v
retrieving revision 1.7
diff -c -r1.7 alter.c
*** src/backend/commands/alter.c	26 May 2004 04:41:09 -0000	1.7
--- src/backend/commands/alter.c	15 Jun 2004 02:21:52 -0000
***************
*** 26,31 ****
--- 26,32 ----
  #include "commands/schemacmds.h"
  #include "commands/tablecmds.h"
  #include "commands/trigger.h"
+ #include "commands/typecmds.h"
  #include "commands/user.h"
  #include "miscadmin.h"
  #include "parser/parse_clause.h"
***************
*** 34,40 ****
  #include "utils/lsyscache.h"
  #include "utils/syscache.h"
  
! 
  void
  ExecRenameStmt(RenameStmt *stmt)
  {
--- 35,44 ----
  #include "utils/lsyscache.h"
  #include "utils/syscache.h"
  
! /**
!  * Executes an ALTER OBJECT / RENAME TO statement.  Based on the object
!  * type, the function appropriate to that type is executed.
!  */
  void
  ExecRenameStmt(RenameStmt *stmt)
  {
***************
*** 131,135 ****
--- 135,184 ----
  		default:
  			elog(ERROR, "unrecognized rename stmt type: %d",
  				 (int) stmt->renameType);
+ 	}
+ }
+ 
+ /**
+  * Executes an ALTER OBJECT / OWNER TO statement.  Based on the object
+  * type, the function appropriate to that type is executed.
+  */
+ void
+ ExecOwnerStmt(OwnerStmt *stmt)
+ {
+ 	switch (stmt->ownerType)
+ 	{
+ 		case OBJECT_AGGREGATE:
+ 			OwnerToAggregate(stmt->object,
+ 							(TypeName *) linitial(stmt->objarg),
+ 							get_usesysid(stmt->newowner));
+ 			break;
+ 
+ 		case OBJECT_CONVERSION:
+ 			OwnerToConversion(stmt->object, get_usesysid(stmt->newowner));
+ 			break;
+ 
+ 		case OBJECT_FUNCTION:
+ 			OwnerToFunction(stmt->object, stmt->objarg, get_usesysid(stmt->newowner));
+ 			break;
+ 
+ 		case OBJECT_OPERATOR:
+ 			OwnerToOperator(stmt->object, (TypeName *) linitial(stmt->objarg), (TypeName *) lsecond(stmt->objarg), get_usesysid(stmt->newowner));
+ 			break;
+ 
+ 		case OBJECT_OPCLASS:
+ 			OwnerToOpClass(stmt->object, stmt->subname, get_usesysid(stmt->newowner));
+ 			break;
+ 
+ 		case OBJECT_SCHEMA:
+ 			OwnerToSchema(stmt->subname, get_usesysid(stmt->newowner));
+ 			break;
+ 
+ 		case OBJECT_TYPE:
+ 			AlterTypeOwner(stmt->object, get_usesysid(stmt->newowner));
+ 			break;
+ 
+ 		default:
+ 			elog(ERROR, "unrecognized owner stmt type: %d",
+ 				 (int) stmt->ownerType);
  	}
  }
Index: src/backend/commands/conversioncmds.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/commands/conversioncmds.c,v
retrieving revision 1.12
diff -c -r1.12 conversioncmds.c
*** src/backend/commands/conversioncmds.c	29 Nov 2003 19:51:47 -0000	1.12
--- src/backend/commands/conversioncmds.c	15 Jun 2004 02:21:52 -0000
***************
*** 171,173 ****
--- 171,218 ----
  	heap_close(rel, NoLock);
  	heap_freetuple(tup);
  }
+ 
+ /*
+  * Change conversion owner
+  */
+ void
+ OwnerToConversion(List *name, AclId newOwnerSysId)
+ {
+ 	Oid			conversionOid;
+ 	HeapTuple	tup;
+ 	Relation	rel;
+ 	Form_pg_conversion	convForm;
+ 
+ 	rel = heap_openr(ConversionRelationName, RowExclusiveLock);
+ 
+ 	conversionOid = FindConversionByName(name);
+ 	if (!OidIsValid(conversionOid))
+ 		ereport(ERROR,
+ 				(errcode(ERRCODE_UNDEFINED_OBJECT),
+ 				 errmsg("conversion \"%s\" does not exist",
+ 						NameListToString(name))));
+ 
+ 	tup = SearchSysCacheCopy(CONOID,
+ 							 ObjectIdGetDatum(conversionOid),
+ 							 0, 0, 0);
+ 	if (!HeapTupleIsValid(tup)) /* should not happen */
+ 		elog(ERROR, "cache lookup failed for conversion %u", conversionOid);
+ 
+ 	convForm = (Form_pg_conversion) GETSTRUCT(tup);
+ 
+ 	/* must be superuser to change object ownership */
+ 	if (!superuser())
+ 		ereport(ERROR,
+ 				(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ 				 errmsg("must be superuser to change owner")));
+ 
+ 	/* Modify the owner --- okay to scribble on tup because it's a copy */
+ 	convForm->conowner = newOwnerSysId;
+ 
+ 	simple_heap_update(rel, &tup->t_self, tup);
+ 
+ 	CatalogUpdateIndexes(rel, tup);
+ 
+ 	heap_close(rel, NoLock);
+ 	heap_freetuple(tup);
+ }
Index: src/backend/commands/functioncmds.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/commands/functioncmds.c,v
retrieving revision 1.47
diff -c -r1.47 functioncmds.c
*** src/backend/commands/functioncmds.c	26 May 2004 04:41:11 -0000	1.47
--- src/backend/commands/functioncmds.c	15 Jun 2004 02:21:52 -0000
***************
*** 723,728 ****
--- 723,775 ----
  	heap_freetuple(tup);
  }
  
+ /*
+  * Change function owner
+  */
+ void
+ OwnerToFunction(List *name, List *argtypes, AclId newOwnerSysId)
+ {
+ 	Oid			procOid;
+ 	HeapTuple	tup;
+ 	Form_pg_proc procForm;
+ 	Relation	rel;
+ 
+ 	rel = heap_openr(ProcedureRelationName, RowExclusiveLock);
+ 
+ 	procOid = LookupFuncNameTypeNames(name, argtypes, false);
+ 
+ 	tup = SearchSysCacheCopy(PROCOID,
+ 							 ObjectIdGetDatum(procOid),
+ 							 0, 0, 0);
+ 	if (!HeapTupleIsValid(tup)) /* should not happen */
+ 		elog(ERROR, "cache lookup failed for function %u", procOid);
+ 	procForm = (Form_pg_proc) GETSTRUCT(tup);
+ 
+ 	if (procForm->proisagg)
+ 		ereport(ERROR,
+ 				(errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ 				 errmsg("\"%s\" is an aggregate function",
+ 						NameListToString(name)),
+ 		 errhint("Use ALTER AGGREGATE to change owner of aggregate functions.")));
+ 
+ 	/* must be superuser to change object ownership */
+ 	if (!superuser())
+ 		ereport(ERROR,
+ 				(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ 				 errmsg("must be superuser to change owner")));
+ 
+ 	/* Modify the owner --- okay to scribble on tup because it's a copy */
+ 	procForm->proowner = newOwnerSysId;
+ 
+ 	simple_heap_update(rel, &tup->t_self, tup);
+ 
+ 	CatalogUpdateIndexes(rel, tup);
+ 
+ 	heap_close(rel, NoLock);
+ 	heap_freetuple(tup);
+ }
+ 
+ 
  
  /*
   * SetFunctionReturnType - change declared return type of a function
Index: src/backend/commands/opclasscmds.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/commands/opclasscmds.c,v
retrieving revision 1.25
diff -c -r1.25 opclasscmds.c
*** src/backend/commands/opclasscmds.c	26 May 2004 04:41:11 -0000	1.25
--- src/backend/commands/opclasscmds.c	15 Jun 2004 02:21:52 -0000
***************
*** 871,873 ****
--- 871,956 ----
  	heap_close(rel, NoLock);
  	heap_freetuple(tup);
  }
+ 
+ /*
+  * Change opclass owner
+  */
+ void
+ OwnerToOpClass(List *name, const char *access_method, AclId newOwnerSysId)
+ {
+ 	Oid			opcOid;
+ 	Oid			amOid;
+ 	Oid			namespaceOid;
+ 	char	   *schemaname;
+ 	char	   *opcname;
+ 	HeapTuple	tup;
+ 	Relation	rel;
+ 	Form_pg_opclass	opcForm;
+ 
+ 	amOid = GetSysCacheOid(AMNAME,
+ 						   CStringGetDatum(access_method),
+ 						   0, 0, 0);
+ 	if (!OidIsValid(amOid))
+ 		ereport(ERROR,
+ 				(errcode(ERRCODE_UNDEFINED_OBJECT),
+ 				 errmsg("access method \"%s\" does not exist",
+ 						access_method)));
+ 
+ 	rel = heap_openr(OperatorClassRelationName, RowExclusiveLock);
+ 
+ 	/*
+ 	 * Look up the opclass
+ 	 */
+ 	DeconstructQualifiedName(name, &schemaname, &opcname);
+ 
+ 	if (schemaname)
+ 	{
+ 		namespaceOid = LookupExplicitNamespace(schemaname);
+ 
+ 		tup = SearchSysCacheCopy(CLAAMNAMENSP,
+ 								 ObjectIdGetDatum(amOid),
+ 								 PointerGetDatum(opcname),
+ 								 ObjectIdGetDatum(namespaceOid),
+ 								 0);
+ 		if (!HeapTupleIsValid(tup))
+ 			ereport(ERROR,
+ 					(errcode(ERRCODE_UNDEFINED_OBJECT),
+ 					 errmsg("operator class \"%s\" does not exist for access method \"%s\"",
+ 							opcname, access_method)));
+ 
+ 	}
+ 	else
+ 	{
+ 		opcOid = OpclassnameGetOpcid(amOid, opcname);
+ 		if (!OidIsValid(opcOid))
+ 			ereport(ERROR,
+ 					(errcode(ERRCODE_UNDEFINED_OBJECT),
+ 					 errmsg("operator class \"%s\" does not exist for access method \"%s\"",
+ 							opcname, access_method)));
+ 
+ 		tup = SearchSysCacheCopy(CLAOID,
+ 								 ObjectIdGetDatum(opcOid),
+ 								 0, 0, 0);
+ 		if (!HeapTupleIsValid(tup))		/* should not happen */
+ 			elog(ERROR, "cache lookup failed for opclass %u", opcOid);
+ 		namespaceOid = ((Form_pg_opclass) GETSTRUCT(tup))->opcnamespace;
+ 	}
+ 	opcForm = (Form_pg_opclass) GETSTRUCT(tup);
+ 
+ 	/* must be superuser to change object ownership */
+ 	if (!superuser())
+ 		ereport(ERROR,
+ 				(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ 				 errmsg("must be superuser to change owner")));
+ 
+ 	/* Modify the owner --- okay to scribble on tup because it's a copy */
+ 	opcForm->opcowner = newOwnerSysId;
+ 
+ 	simple_heap_update(rel, &tup->t_self, tup);
+ 
+ 	CatalogUpdateIndexes(rel, tup);
+ 
+ 
+ 	heap_close(rel, NoLock);
+ 	heap_freetuple(tup);
+ }
Index: src/backend/commands/operatorcmds.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/commands/operatorcmds.c,v
retrieving revision 1.16
diff -c -r1.16 operatorcmds.c
*** src/backend/commands/operatorcmds.c	26 May 2004 04:41:11 -0000	1.16
--- src/backend/commands/operatorcmds.c	15 Jun 2004 02:21:52 -0000
***************
*** 37,42 ****
--- 37,43 ----
  #include "access/heapam.h"
  #include "catalog/catname.h"
  #include "catalog/dependency.h"
+ #include "catalog/indexing.h"
  #include "catalog/namespace.h"
  #include "catalog/pg_operator.h"
  #include "commands/defrem.h"
***************
*** 263,265 ****
--- 264,310 ----
  
  	heap_close(relation, RowExclusiveLock);
  }
+ 
+ /*
+  * change operator owner
+  */
+ void
+ OwnerToOperator(List *name, TypeName *typeName1, TypeName *typeName2, AclId newOwnerSysId)
+ {
+ 	Oid			operOid;
+ 	HeapTuple	tup;
+ 	Relation	rel;
+ 	Form_pg_operator	oprForm;
+ 
+ 	rel = heap_openr(OperatorRelationName, RowExclusiveLock);
+ 
+ 	operOid = LookupOperNameTypeNames(name, typeName1, typeName2,
+ 									  false);
+ 
+ 	tup = SearchSysCacheCopy(OPEROID,
+ 						 ObjectIdGetDatum(operOid),
+ 						 0, 0, 0);
+ 	if (!HeapTupleIsValid(tup)) /* should not happen */
+ 		elog(ERROR, "cache lookup failed for operator %u", operOid);
+ 
+ 	oprForm = (Form_pg_operator) GETSTRUCT(tup);
+ 
+ 	/* must be superuser to change object ownership */
+ 	if (!superuser())
+ 		ereport(ERROR,
+ 				(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ 				 errmsg("must be superuser to change owner")));
+ 
+ 	/* Modify the owner --- okay to scribble on tup because it's a copy */
+ 	oprForm->oprowner = newOwnerSysId;
+ 
+ 	simple_heap_update(rel, &tup->t_self, tup);
+ 
+ 	CatalogUpdateIndexes(rel, tup);
+ 
+ 	heap_close(rel, NoLock);
+ 	heap_freetuple(tup);
+ 
+ }
+ 
+ 
Index: src/backend/commands/schemacmds.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/commands/schemacmds.c,v
retrieving revision 1.18
diff -c -r1.18 schemacmds.c
*** src/backend/commands/schemacmds.c	26 May 2004 04:41:11 -0000	1.18
--- src/backend/commands/schemacmds.c	15 Jun 2004 02:21:52 -0000
***************
*** 280,282 ****
--- 280,321 ----
  	heap_close(rel, NoLock);
  	heap_freetuple(tup);
  }
+ 
+ /*
+  * Change schema owner
+  */
+ void
+ OwnerToSchema(const char *oldname, AclId newOwnerSysId)
+ {
+ 	HeapTuple	tup;
+ 	Relation	rel;
+ 	Form_pg_namespace	nspForm;
+ 
+ 	rel = heap_openr(NamespaceRelationName, RowExclusiveLock);
+ 
+ 	tup = SearchSysCacheCopy(NAMESPACENAME,
+ 							 CStringGetDatum(oldname),
+ 							 0, 0, 0);
+ 	if (!HeapTupleIsValid(tup))
+ 		ereport(ERROR,
+ 				(errcode(ERRCODE_UNDEFINED_SCHEMA),
+ 				 errmsg("schema \"%s\" does not exist", oldname)));
+ 	nspForm = (Form_pg_namespace) GETSTRUCT(tup);
+ 
+ 	/* must be superuser to change object ownership */
+ 	if (!superuser())
+ 		ereport(ERROR,
+ 				(errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
+ 				 errmsg("must be superuser to change owner")));
+ 
+ 	/* Modify the owner --- okay to scribble on tup because it's a copy */
+ 	nspForm->nspowner = newOwnerSysId;
+ 
+ 	simple_heap_update(rel, &tup->t_self, tup);
+ 
+ 	CatalogUpdateIndexes(rel, tup);
+ 
+ 
+ 	heap_close(rel, NoLock);
+ 	heap_freetuple(tup);
+ }
Index: src/backend/commands/typecmds.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/commands/typecmds.c,v
retrieving revision 1.59
diff -c -r1.59 typecmds.c
*** src/backend/commands/typecmds.c	10 Jun 2004 17:55:56 -0000	1.59
--- src/backend/commands/typecmds.c	15 Jun 2004 02:21:53 -0000
***************
*** 2041,2047 ****
  }
  
  /*
!  * ALTER DOMAIN .. OWNER TO
   *
   * Eventually this should allow changing ownership of other kinds of types,
   * but some thought must be given to handling complex types.  (A table's
--- 2041,2047 ----
  }
  
  /*
!  * ALTER TYPE .. OWNER TO
   *
   * Eventually this should allow changing ownership of other kinds of types,
   * but some thought must be given to handling complex types.  (A table's
***************
*** 2083,2094 ****
  		elog(ERROR, "cache lookup failed for type %u", typeOid);
  	typTup = (Form_pg_type) GETSTRUCT(tup);
  
! 	/* Check that this is actually a domain */
! 	if (typTup->typtype != 'd')
  		ereport(ERROR,
  				(errcode(ERRCODE_WRONG_OBJECT_TYPE),
! 				 errmsg("\"%s\" is not a domain",
  						TypeNameToString(typename))));
  
  	/* Modify the owner --- okay to scribble on typTup because it's a copy */
  	typTup->typowner = newOwnerSysId;
--- 2083,2124 ----
  		elog(ERROR, "cache lookup failed for type %u", typeOid);
  	typTup = (Form_pg_type) GETSTRUCT(tup);
  
! 	/* Check that this is actually a domain or composite type */
! 	if (typTup->typtype != 'b' && typTup->typtype != 'd' && typTup->typtype != 'c')
  		ereport(ERROR,
  				(errcode(ERRCODE_WRONG_OBJECT_TYPE),
! 				 errmsg("\"%s\" is not a base, domain or composite type",
  						TypeNameToString(typename))));
+ 
+ 	/* If it's a composite type, we need to check that it really is a 
+  	 * free-standing composite type, and not a table's underlying type */
+ 	if (typTup->typtype == 'c')
+ 	{
+ 		Relation	class_rel;
+ 		HeapTuple	tuple;
+ 		Form_pg_class	tuple_class;
+ 
+ 		/* Get the pg_class tuple referred to by typrelid */
+ 		class_rel = heap_openr(RelationRelationName, RowExclusiveLock);
+ 
+ 		tuple = SearchSysCache(RELOID,
+ 								   ObjectIdGetDatum(typTup->typrelid),
+ 								   0, 0, 0);
+ 		if (!HeapTupleIsValid(tuple))
+ 			elog(ERROR, "cache lookup failed for relation %u", typTup->typrelid);
+ 		tuple_class = (Form_pg_class) GETSTRUCT(tuple);
+ 
+ 		/* Check that the pg_class entry represents a standalon composite type */
+ 		if (tuple_class->relkind != 'c')
+ 			ereport(ERROR,
+ 					(errcode(ERRCODE_WRONG_OBJECT_TYPE),
+ 					 errmsg("\"%s\" is not a base, domain or composite type",
+ 							TypeNameToString(typename))));
+ 
+ 		/* Clean up */
+ 		ReleaseSysCache(tuple);
+ 		heap_close(class_rel, RowExclusiveLock);
+ 	}
  
  	/* Modify the owner --- okay to scribble on typTup because it's a copy */
  	typTup->typowner = newOwnerSysId;
Index: src/backend/nodes/copyfuncs.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/nodes/copyfuncs.c,v
retrieving revision 1.285
diff -c -r1.285 copyfuncs.c
*** src/backend/nodes/copyfuncs.c	9 Jun 2004 19:08:15 -0000	1.285
--- src/backend/nodes/copyfuncs.c	15 Jun 2004 02:21:53 -0000
***************
*** 1935,1940 ****
--- 1935,1955 ----
  	return newnode;
  }
  
+ static OwnerStmt *
+ _copyOwnerStmt(OwnerStmt *from)
+ {
+ 	OwnerStmt *newnode = makeNode(OwnerStmt);
+ 
+ 	COPY_NODE_FIELD(relation);
+ 	COPY_NODE_FIELD(object);
+ 	COPY_NODE_FIELD(objarg);
+ 	COPY_STRING_FIELD(subname);
+ 	COPY_STRING_FIELD(newowner);
+ 	COPY_SCALAR_FIELD(ownerType);
+ 
+ 	return newnode;
+ }
+ 
  static RuleStmt *
  _copyRuleStmt(RuleStmt *from)
  {
***************
*** 2847,2852 ****
--- 2862,2870 ----
  			break;
  		case T_RenameStmt:
  			retval = _copyRenameStmt(from);
+ 			break;
+ 		case T_OwnerStmt:
+ 			retval = _copyOwnerStmt(from);
  			break;
  		case T_RuleStmt:
  			retval = _copyRuleStmt(from);
Index: src/backend/nodes/equalfuncs.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/nodes/equalfuncs.c,v
retrieving revision 1.224
diff -c -r1.224 equalfuncs.c
*** src/backend/nodes/equalfuncs.c	9 Jun 2004 19:08:15 -0000	1.224
--- src/backend/nodes/equalfuncs.c	15 Jun 2004 02:21:53 -0000
***************
*** 990,995 ****
--- 990,1008 ----
  }
  
  static bool
+ _equalOwnerStmt(OwnerStmt *a, OwnerStmt *b)
+ {
+ 	COMPARE_NODE_FIELD(relation);
+ 	COMPARE_NODE_FIELD(object);
+ 	COMPARE_NODE_FIELD(objarg);
+ 	COMPARE_STRING_FIELD(subname);
+ 	COMPARE_STRING_FIELD(newowner);
+ 	COMPARE_SCALAR_FIELD(ownerType);
+ 
+ 	return true;
+ }
+ 
+ static bool
  _equalRuleStmt(RuleStmt *a, RuleStmt *b)
  {
  	COMPARE_NODE_FIELD(relation);
***************
*** 1985,1990 ****
--- 1998,2006 ----
  			break;
  		case T_RenameStmt:
  			retval = _equalRenameStmt(a, b);
+ 			break;
+ 		case T_OwnerStmt:
+ 			retval = _equalOwnerStmt(a, b);
  			break;
  		case T_RuleStmt:
  			retval = _equalRuleStmt(a, b);
Index: src/backend/parser/gram.y
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/parser/gram.y,v
retrieving revision 2.461
diff -c -r2.461 gram.y
*** src/backend/parser/gram.y	9 Jun 2004 19:08:17 -0000	2.461
--- src/backend/parser/gram.y	15 Jun 2004 02:21:55 -0000
***************
*** 152,158 ****
  		VariableResetStmt VariableSetStmt VariableShowStmt
  		ViewStmt CheckPointStmt CreateConversionStmt
  		DeallocateStmt PrepareStmt ExecuteStmt
! 		AlterDbOwnerStmt
  
  %type <node>	select_no_parens select_with_parens select_clause
  				simple_select
--- 152,158 ----
  		VariableResetStmt VariableSetStmt VariableShowStmt
  		ViewStmt CheckPointStmt CreateConversionStmt
  		DeallocateStmt PrepareStmt ExecuteStmt
! 		AlterDbOwnerStmt OwnerStmt
  
  %type <node>	select_no_parens select_with_parens select_clause
  				simple_select
***************
*** 540,545 ****
--- 540,546 ----
  			| LoadStmt
  			| LockStmt
  			| NotifyStmt
+ 			| OwnerStmt
  			| PrepareStmt
  			| ReindexStmt
  			| RemoveAggrStmt
***************
*** 3610,3615 ****
--- 3611,3686 ----
  					$$ = (Node *)n;
  				}
  		;
+ 
+ /*****************************************************************************
+  *
+  * ALTER THING name OWNER TO newname.  
+  * XXX: Need to handle DATABASE, TABLE and DOMAIN
+  *
+  *****************************************************************************/
+ 
+ OwnerStmt: ALTER AGGREGATE func_name '(' aggr_argtype ')' OWNER TO UserId
+ 				{
+ 					OwnerStmt *n = makeNode(OwnerStmt);
+ 					n->ownerType = OBJECT_AGGREGATE;
+ 					n->object = $3;
+ 					n->objarg = list_make1($5);
+ 					n->newowner = $9;
+ 					$$ = (Node *)n;
+ 				}
+ 			| ALTER CONVERSION_P any_name OWNER TO UserId
+ 				{
+ 					OwnerStmt *n = makeNode(OwnerStmt);
+ 					n->ownerType = OBJECT_CONVERSION;
+ 					n->object = $3;
+ 					n->newowner = $6;
+ 					$$ = (Node *)n;
+ 				}
+ 			| ALTER FUNCTION func_name func_args OWNER TO UserId
+ 				{
+ 					OwnerStmt *n = makeNode(OwnerStmt);
+ 					n->ownerType = OBJECT_FUNCTION;
+ 					n->object = $3;
+ 					n->objarg = extractArgTypes($4);
+ 					n->newowner = $7;
+ 					$$ = (Node *)n;
+ 				}
+ 			| ALTER OPERATOR any_operator '(' oper_argtypes ')' OWNER TO UserId
+ 				{
+ 					OwnerStmt *n = makeNode(OwnerStmt);
+ 					n->ownerType = OBJECT_OPERATOR;
+ 					n->object = $3;
+ 					n->objarg = $5;
+ 					n->newowner = $9;
+ 					$$ = (Node *)n;
+ 				}
+ 			| ALTER OPERATOR CLASS any_name USING access_method OWNER TO UserId
+ 				{
+ 					OwnerStmt *n = makeNode(OwnerStmt);
+ 					n->ownerType = OBJECT_OPCLASS;
+ 					n->object = $4;
+ 					n->subname = $6;
+ 					n->newowner = $9;
+ 					$$ = (Node *)n;
+ 				}
+ 			| ALTER SCHEMA name OWNER TO UserId
+ 				{
+ 					OwnerStmt *n = makeNode(OwnerStmt);
+ 					n->ownerType = OBJECT_SCHEMA;
+ 					n->subname = $3;
+ 					n->newowner = $6;
+ 					$$ = (Node *)n;
+ 				}
+ 			| ALTER TYPE_P any_name OWNER TO UserId
+ 				{
+ 					OwnerStmt *n = makeNode(OwnerStmt);
+ 					n->ownerType = OBJECT_TYPE;
+ 					n->object = $3;
+ 					n->newowner = $6;
+ 					$$ = (Node *)n;
+ 				}
+ 		;
+ 
  
  opt_column: COLUMN									{ $$ = COLUMN; }
  			| /*EMPTY*/								{ $$ = 0; }
Index: src/backend/tcop/utility.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/backend/tcop/utility.c,v
retrieving revision 1.218
diff -c -r1.218 utility.c
*** src/backend/tcop/utility.c	29 May 2004 22:48:20 -0000	1.218
--- src/backend/tcop/utility.c	15 Jun 2004 02:21:55 -0000
***************
*** 241,246 ****
--- 241,247 ----
  		case T_AlterSeqStmt:
  		case T_AlterTableStmt:
  		case T_RenameStmt:
+ 		case T_OwnerStmt:
  		case T_AlterUserStmt:
  		case T_AlterUserSetStmt:
  		case T_CommentStmt:
***************
*** 516,521 ****
--- 517,526 ----
  			ExecRenameStmt((RenameStmt *) parsetree);
  			break;
  
+ 		case T_OwnerStmt:
+ 			ExecOwnerStmt((OwnerStmt *) parsetree);
+ 			break;
+ 
  		case T_AlterTableStmt:
  			AlterTable((AlterTableStmt *) parsetree);
  			break;
***************
*** 1229,1234 ****
--- 1234,1265 ----
  					break;
  				case OBJECT_USER:
  					tag = "ALTER USER";
+ 					break;
+ 				default:
+ 					tag = "ALTER TABLE";
+ 			}
+ 			break;
+ 
+ 		case T_OwnerStmt:
+ 			switch (((OwnerStmt *) parsetree)->ownerType)
+ 			{
+ 				case OBJECT_AGGREGATE:
+ 					tag = "ALTER AGGREGATE";
+ 					break;
+ 				case OBJECT_CONVERSION:
+ 					tag = "ALTER CONVERSION";
+ 					break;
+ 				case OBJECT_DATABASE:
+ 					tag = "ALTER DATABASE";
+ 					break;
+ 				case OBJECT_FUNCTION:
+ 					tag = "ALTER FUNCTION";
+ 					break;
+ 				case OBJECT_OPCLASS:
+ 					tag = "ALTER OPERATOR CLASS";
+ 					break;
+ 				case OBJECT_SCHEMA:
+ 					tag = "ALTER SCHEMA";
  					break;
  				default:
  					tag = "ALTER TABLE";
Index: src/bin/pg_dump/pg_backup_archiver.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/bin/pg_dump/pg_backup_archiver.c,v
retrieving revision 1.87
diff -c -r1.87 pg_backup_archiver.c
*** src/bin/pg_dump/pg_backup_archiver.c	19 May 2004 21:21:26 -0000	1.87
--- src/bin/pg_dump/pg_backup_archiver.c	15 Jun 2004 02:21:56 -0000
***************
*** 2231,2237 ****
  	const char	   *pfx;
  
  	/* Select owner and schema as necessary */
! 	_becomeOwner(AH, te);
  	_selectOutputSchema(AH, te->namespace);
  	if (strcmp(te->desc, "TABLE") == 0)
  		_setWithOids(AH, te);
--- 2231,2237 ----
  	const char	   *pfx;
  
  	/* Select owner and schema as necessary */
! 	/*_becomeOwner(AH, te);*/
  	_selectOutputSchema(AH, te->namespace);
  	if (strcmp(te->desc, "TABLE") == 0)
  		_setWithOids(AH, te);
Index: src/bin/pg_dump/pg_dump.c
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/bin/pg_dump/pg_dump.c,v
retrieving revision 1.374
diff -c -r1.374 pg_dump.c
*** src/bin/pg_dump/pg_dump.c	7 Jun 2004 20:35:57 -0000	1.374
--- src/bin/pg_dump/pg_dump.c	15 Jun 2004 02:21:58 -0000
***************
*** 111,116 ****
--- 111,118 ----
  /* flag to turn on/off dollar quoting */
  static int     disable_dollar_quoting = 0;
  
+ /* flag to turn on/off owner commands */
+ static int     outputNoOwner = 0;
  
  static void help(const char *progname);
  static NamespaceInfo *findNamespace(Oid nsoid, Oid objoid);
***************
*** 148,153 ****
--- 150,159 ----
  		const char *tag, const char *nspname, const char *owner,
  		const char *acls);
  
+ static void dumpOwner(Archive *fout, CatalogId objCatId, DumpId objDumpId,
+ 		const char *type, const char *name,
+ 		const char *tag, const char *nspname, const char *owner);
+ 
  static void getDependencies(void);
  static void getDomainConstraints(TypeInfo *tinfo);
  static void getTableData(TableInfo *tblinfo, int numTables, bool oids);
***************
*** 196,202 ****
  	int			outputClean = 0;
  	int			outputCreate = 0;
  	int			outputBlobs = 0;
- 	int			outputNoOwner = 0;
  	static int	use_setsessauth = 0;
  	static int	disable_triggers = 0;
  	char	   *outputSuperuser = NULL;
--- 202,207 ----
***************
*** 333,339 ****
  				oids = true;
  				break;
  
! 			case 'O':			/* Don't reconnect to match owner */
  				outputNoOwner = 1;
  				break;
  
--- 338,344 ----
  				oids = true;
  				break;
  
! 			case 'O':			/* Don't output OWNER TO commands */
  				outputNoOwner = 1;
  				break;
  
***************
*** 4327,4348 ****
  	/*
  	 * If it's the PUBLIC namespace, suppress the CREATE SCHEMA record
  	 * for it, since we expect PUBLIC to exist already in the
! 	 * destination database.  But do emit ACL in case it's not standard,
  	 * likewise comment.
- 	 *
- 	 * Note that ownership is shown in the AUTHORIZATION clause,
- 	 * while the archive entry is listed with empty owner (causing
- 	 * it to be emitted with SET SESSION AUTHORIZATION DEFAULT).
- 	 * This seems the best way of dealing with schemas owned by
- 	 * users without CREATE SCHEMA privilege.  Further hacking has
- 	 * to be applied for --no-owner mode, though!
  	 */
  	if (strcmp(nspinfo->dobj.name, "public") != 0)
  	{
  		appendPQExpBuffer(delq, "DROP SCHEMA %s;\n", qnspname);
  
! 		appendPQExpBuffer(q, "CREATE SCHEMA %s AUTHORIZATION %s;\n",
! 						  qnspname, fmtId(nspinfo->usename));
  
  		ArchiveEntry(fout, nspinfo->dobj.catId, nspinfo->dobj.dumpId,
  					 nspinfo->dobj.name,
--- 4332,4346 ----
  	/*
  	 * If it's the PUBLIC namespace, suppress the CREATE SCHEMA record
  	 * for it, since we expect PUBLIC to exist already in the
! 	 * destination database.  But do emit ACL and owner in case it's not standard,
  	 * likewise comment.
  	 */
  	if (strcmp(nspinfo->dobj.name, "public") != 0)
  	{
  		appendPQExpBuffer(delq, "DROP SCHEMA %s;\n", qnspname);
  
! 		appendPQExpBuffer(q, "CREATE SCHEMA %s;\n",
! 						  qnspname);
  
  		ArchiveEntry(fout, nspinfo->dobj.catId, nspinfo->dobj.dumpId,
  					 nspinfo->dobj.name,
***************
*** 4359,4364 ****
--- 4357,4368 ----
  				NULL, nspinfo->usename,
  				nspinfo->dobj.catId, 0, nspinfo->dobj.dumpId);
  
+ 	/* Dump schema owner */
+ 	dumpOwner(fout, nspinfo->dobj.catId, nspinfo->dobj.dumpId, "SCHEMA",
+ 			q->data, nspinfo->dobj.name, NULL,
+ 			nspinfo->usename);
+ 
+ 	/* Dump schema ACLs */
  	dumpACL(fout, nspinfo->dobj.catId, nspinfo->dobj.dumpId, "SCHEMA",
  			qnspname, nspinfo->dobj.name, NULL,
  			nspinfo->usename, nspinfo->nspacl);
***************
*** 4651,4656 ****
--- 4655,4665 ----
  				tinfo->dobj.namespace->dobj.name, tinfo->usename,
  				tinfo->dobj.catId, 0, tinfo->dobj.dumpId);
  
+ 	/* Dump type owner */
+ 	dumpOwner(fout, tinfo->dobj.catId, tinfo->dobj.dumpId, "TYPE",
+ 			q->data, tinfo->dobj.name, tinfo->dobj.namespace->dobj.name,
+ 			tinfo->usename);
+ 
  	PQclear(res);
  	destroyPQExpBuffer(q);
  	destroyPQExpBuffer(delq);
***************
*** 4757,4762 ****
--- 4766,4776 ----
  				tinfo->dobj.namespace->dobj.name, tinfo->usename,
  				tinfo->dobj.catId, 0, tinfo->dobj.dumpId);
  
+ 	/* Dump domain owner */
+ 	dumpOwner(fout, tinfo->dobj.catId, tinfo->dobj.dumpId, "DOMAIN",
+ 			q->data, tinfo->dobj.name, tinfo->dobj.namespace->dobj.name,
+ 			tinfo->usename);
+ 
  	destroyPQExpBuffer(q);
  	destroyPQExpBuffer(delq);
  	destroyPQExpBuffer(query);
***************
*** 4843,4849 ****
  				 NULL, NULL);
  
  
! 	/* Dump Type Comments */
  	resetPQExpBuffer(q);
  
  	appendPQExpBuffer(q, "TYPE %s", fmtId(tinfo->dobj.name));
--- 4857,4863 ----
  				 NULL, NULL);
  
  
! 	/* Dump Composite Type Comments */
  	resetPQExpBuffer(q);
  
  	appendPQExpBuffer(q, "TYPE %s", fmtId(tinfo->dobj.name));
***************
*** 4851,4856 ****
--- 4865,4875 ----
  				tinfo->dobj.namespace->dobj.name, tinfo->usename,
  				tinfo->dobj.catId, 0, tinfo->dobj.dumpId);
  
+ 	/* Dump composite type owner */
+ 	dumpOwner(fout, tinfo->dobj.catId, tinfo->dobj.dumpId, "TYPE",
+ 			q->data, tinfo->dobj.name, tinfo->dobj.namespace->dobj.name,
+ 			tinfo->usename);
+ 
  	PQclear(res);
  	destroyPQExpBuffer(q);
  	destroyPQExpBuffer(delq);
***************
*** 5214,5219 ****
--- 5233,5245 ----
  				finfo->dobj.namespace->dobj.name, finfo->usename,
  				finfo->dobj.catId, 0, finfo->dobj.dumpId);
  
+ 	/* Dump function owner */
+ 	dumpOwner(fout, finfo->dobj.catId, finfo->dobj.dumpId, "FUNCTION",
+ 			q->data, funcsig_tag,
+ 			finfo->dobj.namespace->dobj.name,
+ 			finfo->usename);
+ 
+ 	/* Dump function ACLs */
  	dumpACL(fout, finfo->dobj.catId, finfo->dobj.dumpId, "FUNCTION",
  			funcsig, funcsig_tag,
  			finfo->dobj.namespace->dobj.name,
***************
*** 5606,5611 ****
--- 5632,5642 ----
  				oprinfo->dobj.namespace->dobj.name, oprinfo->usename,
  				oprinfo->dobj.catId, 0, oprinfo->dobj.dumpId);
  
+ 	/* Dump operator owner */
+ 	dumpOwner(fout, oprinfo->dobj.catId, oprinfo->dobj.dumpId, "OPERATOR",
+ 			q->data, oprinfo->dobj.name, oprinfo->dobj.namespace->dobj.name,
+ 			oprinfo->usename);
+ 
  	PQclear(res);
  
  	destroyPQExpBuffer(query);
***************
*** 5916,5921 ****
--- 5947,5957 ----
  				NULL, opcinfo->usename,
  				opcinfo->dobj.catId, 0, opcinfo->dobj.dumpId);
  
+ 	/* Dump operator class owner */
+ 	dumpOwner(fout, opcinfo->dobj.catId, opcinfo->dobj.dumpId, "OPERATOR CLASS",
+ 			q->data, opcinfo->dobj.name, opcinfo->dobj.namespace->dobj.name,
+ 			opcinfo->usename);
+ 
  	free(amname);
  	destroyPQExpBuffer(query);
  	destroyPQExpBuffer(q);
***************
*** 6023,6028 ****
--- 6059,6069 ----
  				convinfo->dobj.namespace->dobj.name, convinfo->usename,
  				convinfo->dobj.catId, 0, convinfo->dobj.dumpId);
  
+ 	/* Dump conversion owner */
+ 	dumpOwner(fout, convinfo->dobj.catId, convinfo->dobj.dumpId, "CONVERSION",
+ 			q->data, convinfo->dobj.name, convinfo->dobj.namespace->dobj.name,
+ 			convinfo->usename);
+ 
  	PQclear(res);
  
  	destroyPQExpBuffer(query);
***************
*** 6258,6263 ****
--- 6299,6311 ----
  				agginfo->aggfn.dobj.namespace->dobj.name, agginfo->aggfn.usename,
  				agginfo->aggfn.dobj.catId, 0, agginfo->aggfn.dobj.dumpId);
  
+ 	/* Dump aggregate owner */
+ 	dumpOwner(fout, agginfo->aggfn.dobj.catId, agginfo->aggfn.dobj.dumpId,
+ 			"AGGREGATE",
+ 			q->data, aggsig_tag,
+ 			agginfo->aggfn.dobj.namespace->dobj.name,
+ 			agginfo->aggfn.usename);
+ 
  	/*
  	 * Since there is no GRANT ON AGGREGATE syntax, we have to make the
  	 * ACL command look like a function's GRANT; in particular this affects
***************
*** 6269,6274 ****
--- 6317,6323 ----
  	aggsig = format_function_signature(&agginfo->aggfn, NULL, true);
  	aggsig_tag = format_function_signature(&agginfo->aggfn, NULL, false);
  
+ 	/* Dump aggregate ACL */
  	dumpACL(fout, agginfo->aggfn.dobj.catId, agginfo->aggfn.dobj.dumpId,
  			"FUNCTION",
  			aggsig, aggsig_tag,
***************
*** 6333,6338 ****
--- 6382,6426 ----
  	destroyPQExpBuffer(sql);
  }
  
+ /*----------
+  * Write out ownership command
+  *
+  * 'objCatId' is the catalog ID of the underlying object.
+  * 'objDumpId' is the dump ID of the underlying object.
+  * 'type' is the object type
+  * 'name' is the formatted name of the object.	Must be quoted etc. already.
+  * 'tag' is the tag for the archive entry (typ. unquoted name of object).
+  * 'nspname' is the namespace the object is in (NULL if none).
+  * 'owner' is the owner
+  *----------
+  */
+ static void
+ dumpOwner(Archive *fout, CatalogId objCatId, DumpId objDumpId,
+ 		const char *type, const char *name,
+ 		const char *tag, const char *nspname, const char *owner)
+ {
+ 	PQExpBuffer sql;
+ 
+ 	/* Do nothing if it's a data only dump or no owner commands are required */
+ 	if (dataOnly || outputNoOwner)
+ 		return;
+ 
+ 	sql = createPQExpBuffer();
+ 
+ 	appendPQExpBuffer(sql, "ALTER %s OWNER TO %s;\n",
+ 				  name, fmtId(owner));
+ 
+ 	if (sql->len > 0)
+ 		ArchiveEntry(fout, nilCatalogId, createDumpId(),
+ 					 tag, nspname,
+ 					 owner,
+ 					 false, "OWNER", sql->data, "", NULL,
+ 					 &(objDumpId), 1,
+ 					 NULL, NULL);
+ 
+ 	destroyPQExpBuffer(sql);
+ }
+ 
  /*
   * dumpTable
   *	  write out to fout the declarations (not data) of a user-defined table
***************
*** 6341,6346 ****
--- 6429,6435 ----
  dumpTable(Archive *fout, TableInfo *tbinfo)
  {
  	char	   *namecopy;
+ 	PQExpBuffer	q;
  
  	if (tbinfo->dump)
  	{
***************
*** 6349,6356 ****
  		else if (!dataOnly)
  			dumpTableSchema(fout, tbinfo);
  
- 		/* Handle the ACL here */
  		namecopy = strdup(fmtId(tbinfo->dobj.name));
  		dumpACL(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId, "TABLE",
  				namecopy, tbinfo->dobj.name,
  				tbinfo->dobj.namespace->dobj.name, tbinfo->usename,
--- 6438,6454 ----
  		else if (!dataOnly)
  			dumpTableSchema(fout, tbinfo);
  
  		namecopy = strdup(fmtId(tbinfo->dobj.name));
+ 
+ 		/* Dump table owner.  Must be careful about ONLY clause. */
+ 		q = createPQExpBuffer();
+ 		appendPQExpBuffer(q, "TABLE ONLY %s", namecopy);
+ 		dumpOwner(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId, "TABLE",
+ 				q->data, tbinfo->dobj.name,
+ 				tbinfo->dobj.namespace->dobj.name, tbinfo->usename);
+ 		destroyPQExpBuffer(q);
+ 
+ 		/* Dump table ACL */
  		dumpACL(fout, tbinfo->dobj.catId, tbinfo->dobj.dumpId, "TABLE",
  				namecopy, tbinfo->dobj.name,
  				tbinfo->dobj.namespace->dobj.name, tbinfo->usename,
***************
*** 6755,6761 ****
  		/* If the index is clustered, we need to record that. */
  		if (indxinfo->indisclustered)
  		{
! 			appendPQExpBuffer(q, "\nALTER TABLE %s CLUSTER",
  							  fmtId(tbinfo->dobj.name));
  			appendPQExpBuffer(q, " ON %s;\n",
  							  fmtId(indxinfo->dobj.name));
--- 6853,6859 ----
  		/* If the index is clustered, we need to record that. */
  		if (indxinfo->indisclustered)
  		{
! 			appendPQExpBuffer(q, "\nALTER TABLE ONLY %s CLUSTER",
  							  fmtId(tbinfo->dobj.name));
  			appendPQExpBuffer(q, " ON %s;\n",
  							  fmtId(indxinfo->dobj.name));
***************
*** 6851,6857 ****
  		/* If the index is clustered, we need to record that. */
  		if (indxinfo->indisclustered)
  		{
! 			appendPQExpBuffer(q, "\nALTER TABLE %s CLUSTER",
  							  fmtId(tbinfo->dobj.name));
  			appendPQExpBuffer(q, " ON %s;\n",
  							  fmtId(indxinfo->dobj.name));
--- 6949,6955 ----
  		/* If the index is clustered, we need to record that. */
  		if (indxinfo->indisclustered)
  		{
! 			appendPQExpBuffer(q, "\nALTER TABLE ONLY %s CLUSTER",
  							  fmtId(tbinfo->dobj.name));
  			appendPQExpBuffer(q, " ON %s;\n",
  							  fmtId(indxinfo->dobj.name));
Index: src/include/commands/alter.h
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/include/commands/alter.h,v
retrieving revision 1.3
diff -c -r1.3 alter.h
*** src/include/commands/alter.h	29 Nov 2003 22:40:59 -0000	1.3
--- src/include/commands/alter.h	15 Jun 2004 02:21:58 -0000
***************
*** 18,21 ****
--- 18,23 ----
  
  extern void ExecRenameStmt(RenameStmt *stmt);
  
+ extern void ExecOwnerStmt(OwnerStmt *stmt);
+ 
  #endif   /* ALTER_H */
Index: src/include/commands/conversioncmds.h
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/include/commands/conversioncmds.h,v
retrieving revision 1.6
diff -c -r1.6 conversioncmds.h
*** src/include/commands/conversioncmds.h	29 Nov 2003 22:40:59 -0000	1.6
--- src/include/commands/conversioncmds.h	15 Jun 2004 02:21:58 -0000
***************
*** 20,24 ****
--- 20,25 ----
  extern void CreateConversionCommand(CreateConversionStmt *parsetree);
  extern void DropConversionCommand(List *conversion_name, DropBehavior behavior);
  extern void RenameConversion(List *name, const char *newname);
+ extern void OwnerToConversion(List *name, AclId newOwnerSysId);
  
  #endif   /* CONVERSIONCMDS_H */
Index: src/include/commands/defrem.h
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/include/commands/defrem.h,v
retrieving revision 1.57
diff -c -r1.57 defrem.h
*** src/include/commands/defrem.h	10 Jun 2004 17:55:59 -0000	1.57
--- src/include/commands/defrem.h	15 Jun 2004 02:21:58 -0000
***************
*** 47,52 ****
--- 47,53 ----
  extern void SetFunctionReturnType(Oid funcOid, Oid newRetType);
  extern void SetFunctionArgType(Oid funcOid, int argIndex, Oid newArgType);
  extern void RenameFunction(List *name, List *argtypes, const char *newname);
+ extern void OwnerToFunction(List *name, List *argtypes, AclId newOwnerSysId);
  extern void CreateCast(CreateCastStmt *stmt);
  extern void DropCast(DropCastStmt *stmt);
  extern void DropCastById(Oid castOid);
***************
*** 55,71 ****
--- 56,75 ----
  extern void DefineOperator(List *names, List *parameters);
  extern void RemoveOperator(RemoveOperStmt *stmt);
  extern void RemoveOperatorById(Oid operOid);
+ extern void OwnerToOperator(List *name, TypeName *typeName1, TypeName *typename2, AclId newOwnerSysId);
  
  /* commands/aggregatecmds.c */
  extern void DefineAggregate(List *names, List *parameters);
  extern void RemoveAggregate(RemoveAggrStmt *stmt);
  extern void RenameAggregate(List *name, TypeName *basetype, const char *newname);
+ extern void OwnerToAggregate(List *name, TypeName *basetype, AclId newOwnerSysId);
  
  /* commands/opclasscmds.c */
  extern void DefineOpClass(CreateOpClassStmt *stmt);
  extern void RemoveOpClass(RemoveOpClassStmt *stmt);
  extern void RemoveOpClassById(Oid opclassOid);
  extern void RenameOpClass(List *name, const char *access_method, const char *newname);
+ extern void OwnerToOpClass(List *name, const char *access_method, AclId newOwnerSysId); 
  
  /* support routines in commands/define.c */
  
Index: src/include/commands/schemacmds.h
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/include/commands/schemacmds.h,v
retrieving revision 1.6
diff -c -r1.6 schemacmds.h
*** src/include/commands/schemacmds.h	29 Nov 2003 22:40:59 -0000	1.6
--- src/include/commands/schemacmds.h	15 Jun 2004 02:21:58 -0000
***************
*** 23,27 ****
--- 23,28 ----
  extern void RemoveSchemaById(Oid schemaOid);
  
  extern void RenameSchema(const char *oldname, const char *newname);
+ extern void OwnerToSchema(const char *oldname, AclId newOwnerSysId);
  
  #endif   /* SCHEMACMDS_H */
Index: src/include/nodes/nodes.h
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/include/nodes/nodes.h,v
retrieving revision 1.157
diff -c -r1.157 nodes.h
*** src/include/nodes/nodes.h	9 Jun 2004 19:08:18 -0000	1.157
--- src/include/nodes/nodes.h	15 Jun 2004 02:21:58 -0000
***************
*** 225,230 ****
--- 225,231 ----
  	T_RemoveFuncStmt,
  	T_RemoveOperStmt,
  	T_RenameStmt,
+ 	T_OwnerStmt,
  	T_RuleStmt,
  	T_NotifyStmt,
  	T_ListenStmt,
Index: src/include/nodes/parsenodes.h
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/include/nodes/parsenodes.h,v
retrieving revision 1.258
diff -c -r1.258 parsenodes.h
*** src/include/nodes/parsenodes.h	9 Jun 2004 19:08:18 -0000	1.258
--- src/include/nodes/parsenodes.h	15 Jun 2004 02:21:59 -0000
***************
*** 1420,1425 ****
--- 1420,1442 ----
  } RenameStmt;
  
  /* ----------------------
+  *		Alter Object Owner To Statement 
+  * ----------------------
+  */
+ typedef struct OwnerStmt
+ {
+ 	NodeTag		type;
+ 	RangeVar   *relation;		/* in case it's a table */
+ 	List	   *object;			/* in case it's some other object */
+ 	List	   *objarg;			/* argument types, if applicable */
+ 	char	   *subname;		/* name of contained object (column, rule,
+ 								 * trigger, etc) */
+ 	char	   *newowner;		/* the new owner */
+ 	ObjectType	ownerType;		/* OBJECT_TABLE, OBJECT_COLUMN, etc */
+ } OwnerStmt;
+ 
+ 
+ /* ----------------------
   *		Create Rule Statement
   * ----------------------
   */
Index: src/test/regress/expected/create_aggregate.out
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/test/regress/expected/create_aggregate.out,v
retrieving revision 1.4
diff -c -r1.4 create_aggregate.out
*** src/test/regress/expected/create_aggregate.out	21 Nov 2003 22:32:49 -0000	1.4
--- src/test/regress/expected/create_aggregate.out	15 Jun 2004 02:21:59 -0000
***************
*** 26,28 ****
--- 26,36 ----
  ERROR:  aggregate nosuchagg(*) does not exist
  COMMENT ON AGGREGATE newcnt (*) IS 'an any agg comment';
  COMMENT ON AGGREGATE newcnt (*) IS NULL;
+ -- test alter aggregate
+ ALTER AGGREGATE newavg (int4) RENAME TO newavg2;
+ ALTER AGGREGATE newcnt (*) RENAME TO newcnt2;
+ CREATE USER agguser;
+ ALTER AGGREGATE newavg2 (int4) OWNER TO agguser;
+ ALTER AGGREGATE newcnt2 (*) OWNER TO agguser;
+ ALTER AGGREGATE newavg2 (int4) RENAME TO newavg;
+ ALTER AGGREGATE newcnt2 (*) RENAME TO newcnt;
Index: src/test/regress/expected/create_operator.out
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/test/regress/expected/create_operator.out,v
retrieving revision 1.6
diff -c -r1.6 create_operator.out
*** src/test/regress/expected/create_operator.out	1 Dec 2003 21:52:38 -0000	1.6
--- src/test/regress/expected/create_operator.out	15 Jun 2004 02:21:59 -0000
***************
*** 27,31 ****
--- 27,37 ----
     procedure = numeric_fac 
  );
  -- Test comments
+ COMMENT ON OPERATOR ## (path, path) IS 'operator comment';
  COMMENT ON OPERATOR ###### (int4, NONE) IS 'bad right unary';
+ ERROR:  operator does not exist: integer ######
+ -- Test alter operator
+ CREATE USER opruser;
+ ALTER OPERATOR ## (path, path) OWNER TO opruser;
+ ALTER OPERATOR ###### (int4, NONE) OWNER TO opruser;
  ERROR:  operator does not exist: integer ######
Index: src/test/regress/sql/create_aggregate.sql
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/test/regress/sql/create_aggregate.sql,v
retrieving revision 1.5
diff -c -r1.5 create_aggregate.sql
*** src/test/regress/sql/create_aggregate.sql	21 Nov 2003 22:32:49 -0000	1.5
--- src/test/regress/sql/create_aggregate.sql	15 Jun 2004 02:21:59 -0000
***************
*** 29,31 ****
--- 29,40 ----
  COMMENT ON AGGREGATE nosuchagg (*) IS 'should fail';
  COMMENT ON AGGREGATE newcnt (*) IS 'an any agg comment';
  COMMENT ON AGGREGATE newcnt (*) IS NULL;
+ 
+ -- test alter aggregate
+ ALTER AGGREGATE newavg (int4) RENAME TO newavg2;
+ ALTER AGGREGATE newcnt (*) RENAME TO newcnt2;
+ CREATE USER agguser;
+ ALTER AGGREGATE newavg2 (int4) OWNER TO agguser;
+ ALTER AGGREGATE newcnt2 (*) OWNER TO agguser;
+ ALTER AGGREGATE newavg2 (int4) RENAME TO newavg;
+ ALTER AGGREGATE newcnt2 (*) RENAME TO newcnt;
Index: src/test/regress/sql/create_operator.sql
===================================================================
RCS file: /projects/cvsroot/pgsql-server/src/test/regress/sql/create_operator.sql,v
retrieving revision 1.6
diff -c -r1.6 create_operator.sql
*** src/test/regress/sql/create_operator.sql	1 Dec 2003 21:52:38 -0000	1.6
--- src/test/regress/sql/create_operator.sql	15 Jun 2004 02:21:59 -0000
***************
*** 33,38 ****
--- 33,43 ----
  );
  
  -- Test comments
+ COMMENT ON OPERATOR ## (path, path) IS 'operator comment';
  COMMENT ON OPERATOR ###### (int4, NONE) IS 'bad right unary';
  
+ -- Test alter operator
+ CREATE USER opruser;
+ ALTER OPERATOR ## (path, path) OWNER TO opruser;
+ ALTER OPERATOR ###### (int4, NONE) OWNER TO opruser;
  
